wok diff hardinfo/stuff/usb.patch @ rev 5142

Up: tazpkg (3.3) GUI improvment and bug fixes
author Christophe Lincoln <pankso@slitaz.org>
date Tue Mar 23 21:11:07 2010 +0100 (2010-03-23)
parents
children
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/hardinfo/stuff/usb.patch	Tue Mar 23 21:11:07 2010 +0100
     1.3 @@ -0,0 +1,316 @@
     1.4 +--- util.c
     1.5 ++++ util.c
     1.6 +@@ -1048,3 +1048,55 @@
     1.7 + 				h_hash_table_remove_all_true,
     1.8 + 				NULL);
     1.9 + }
    1.10 ++
    1.11 ++gfloat
    1.12 ++h_sysfs_read_float(gchar *endpoint, gchar *entry)
    1.13 ++{
    1.14 ++	gchar *tmp, *buffer;
    1.15 ++	gfloat return_value = 0.0f;
    1.16 ++	
    1.17 ++	tmp = g_build_filename(endpoint, entry, NULL);
    1.18 ++	if (g_file_get_contents(tmp, &buffer, NULL, NULL))
    1.19 ++		return_value = atof(buffer);
    1.20 ++	
    1.21 ++	g_free(tmp);
    1.22 ++	g_free(buffer);
    1.23 ++	
    1.24 ++	return return_value;
    1.25 ++}
    1.26 ++
    1.27 ++gint
    1.28 ++h_sysfs_read_int(gchar *endpoint, gchar *entry)
    1.29 ++{
    1.30 ++	gchar *tmp, *buffer;
    1.31 ++	gint return_value = 0.0f;
    1.32 ++	
    1.33 ++	tmp = g_build_filename(endpoint, entry, NULL);
    1.34 ++	if (g_file_get_contents(tmp, &buffer, NULL, NULL))
    1.35 ++		return_value = atoi(buffer);
    1.36 ++	
    1.37 ++	g_free(tmp);
    1.38 ++	g_free(buffer);
    1.39 ++	
    1.40 ++	return return_value;
    1.41 ++}
    1.42 ++
    1.43 ++gchar *
    1.44 ++h_sysfs_read_string(gchar *endpoint, gchar *entry)
    1.45 ++{
    1.46 ++	gchar *tmp, *return_value;
    1.47 ++	
    1.48 ++	tmp = g_build_filename(endpoint, entry, NULL);
    1.49 ++	if (!g_file_get_contents(tmp, &return_value, NULL, NULL)) {
    1.50 ++		g_free(return_value);
    1.51 ++		
    1.52 ++		return_value = NULL;
    1.53 ++	} else {
    1.54 ++		return_value = g_strstrip(return_value);
    1.55 ++	}
    1.56 ++	
    1.57 ++	g_free(tmp);
    1.58 ++	
    1.59 ++	return return_value;
    1.60 ++}
    1.61 ++
    1.62 +
    1.63 +--- arch/linux/common/usb.h
    1.64 ++++ arch/linux/common/usb.h
    1.65 +@@ -15,7 +15,6 @@
    1.66 +  *    along with this program; if not, write to the Free Software
    1.67 +  *    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
    1.68 +  */
    1.69 +-
    1.70 + static gboolean
    1.71 + remove_usb_devices(gpointer key, gpointer value, gpointer data)
    1.72 + {
    1.73 +@@ -23,8 +22,113 @@
    1.74 + }
    1.75 + 
    1.76 + static gchar *usb_list = NULL;
    1.77 +-void
    1.78 +-__scan_usb(void)
    1.79 ++
    1.80 ++void __scan_usb_sysfs_add_device(gchar * endpoint, int n)
    1.81 ++{
    1.82 ++    gchar *manufacturer, *product, *mxpwr, *tmp, *strhash;
    1.83 ++    gint bus, classid, vendor, prodid;
    1.84 ++    gchar *version, *speed;
    1.85 ++
    1.86 ++    classid = h_sysfs_read_int(endpoint, "bDeviceClass");
    1.87 ++    vendor = h_sysfs_read_int(endpoint, "idVendor");
    1.88 ++    prodid = h_sysfs_read_int(endpoint, "idProduct");
    1.89 ++    bus = h_sysfs_read_int(endpoint, "busnum");
    1.90 ++    if (!(speed = h_sysfs_read_string(endpoint, "speed"))) {
    1.91 ++	speed = g_strdup("12");
    1.92 ++    }
    1.93 ++
    1.94 ++    if (!(version = h_sysfs_read_string(endpoint, "version"))) {
    1.95 ++	version = g_strdup(" 1.0 ");
    1.96 ++    }
    1.97 ++    
    1.98 ++    if (!(mxpwr = h_sysfs_read_string(endpoint, "bMaxPower"))) {
    1.99 ++    	mxpwr = g_strdup("0 mA");
   1.100 ++    }
   1.101 ++
   1.102 ++    if (!(manufacturer = h_sysfs_read_string(endpoint, "manufacturer"))) {
   1.103 ++    	manufacturer = g_strdup("Unknown");
   1.104 ++    }
   1.105 ++
   1.106 ++    if (!(product = h_sysfs_read_string(endpoint, "product"))) {
   1.107 ++	if (classid == 9) {
   1.108 ++	    product = g_strdup_printf("USB %.2f Hub", version);
   1.109 ++	} else {
   1.110 ++	    product = g_strdup_printf("Unknown USB %.2f Device (class %d)", version, classid);
   1.111 ++	}
   1.112 ++    }
   1.113 ++
   1.114 ++    const gchar *url = vendor_get_url(manufacturer);
   1.115 ++    if (url) {
   1.116 ++	tmp = g_strdup_printf("%s (%s)", vendor_get_name(manufacturer), url);
   1.117 ++	
   1.118 ++	g_free(manufacturer);
   1.119 ++	manufacturer = tmp;	    
   1.120 ++    }
   1.121 ++
   1.122 ++    tmp = g_strdup_printf("USB%d", n);
   1.123 ++    usb_list = h_strdup_cprintf("$%s$%s=\n", usb_list, tmp, product);
   1.124 ++
   1.125 ++    strhash = g_strdup_printf("[Device Information]\n"
   1.126 ++			      "Product=%s\n"
   1.127 ++			      "Manufacturer=%s\n"
   1.128 ++			      "Speed=%sMbit/s\n"
   1.129 ++			      "Max Current=%s\n"
   1.130 ++			      "[Misc]\n"
   1.131 ++			      "USB Version=%s\n"
   1.132 ++			      "Class=0x%x\n"
   1.133 ++			      "Vendor=0x%x\n"
   1.134 ++			      "Product ID=0x%x\n"
   1.135 ++			      "Bus=%d\n",
   1.136 ++			      product,
   1.137 ++			      manufacturer,
   1.138 ++			      speed,
   1.139 ++			      mxpwr,
   1.140 ++			      version, classid, vendor, prodid, bus);
   1.141 ++
   1.142 ++    g_hash_table_insert(moreinfo, tmp, strhash);
   1.143 ++    
   1.144 ++    g_free(manufacturer);
   1.145 ++    g_free(product);
   1.146 ++    g_free(mxpwr);
   1.147 ++    g_free(speed);
   1.148 ++    g_free(version);
   1.149 ++}
   1.150 ++
   1.151 ++void __scan_usb_sysfs(void)
   1.152 ++{
   1.153 ++    GDir *sysfs;
   1.154 ++    gchar *filename;
   1.155 ++    const gchar *sysfs_path = "/sys/class/usb_endpoint";
   1.156 ++    gint usb_device_number = 0;
   1.157 ++
   1.158 ++    if (!(sysfs = g_dir_open(sysfs_path, 0, NULL))) {
   1.159 ++	return;
   1.160 ++    }
   1.161 ++
   1.162 ++    if (usb_list) {
   1.163 ++	g_hash_table_foreach_remove(moreinfo, remove_usb_devices, NULL);
   1.164 ++	g_free(usb_list);
   1.165 ++    }
   1.166 ++    usb_list = g_strdup("[USB Devices]\n");
   1.167 ++
   1.168 ++    while ((filename = (gchar *) g_dir_read_name(sysfs))) {
   1.169 ++	gchar *endpoint =
   1.170 ++	    g_build_filename(sysfs_path, filename, "device", NULL);
   1.171 ++	gchar *temp;
   1.172 ++
   1.173 ++	temp = g_build_filename(endpoint, "idVendor", NULL);
   1.174 ++	if (g_file_test(temp, G_FILE_TEST_EXISTS)) {
   1.175 ++	    __scan_usb_sysfs_add_device(endpoint, ++usb_device_number);
   1.176 ++	}
   1.177 ++
   1.178 ++	g_free(temp);
   1.179 ++	g_free(endpoint);
   1.180 ++    }
   1.181 ++
   1.182 ++    g_dir_close(sysfs);
   1.183 ++}
   1.184 ++
   1.185 ++int __scan_usb_procfs(void)
   1.186 + {
   1.187 +     FILE *dev;
   1.188 +     gchar buffer[128];
   1.189 +@@ -36,13 +140,13 @@
   1.190 + 
   1.191 +     dev = fopen("/proc/bus/usb/devices", "r");
   1.192 +     if (!dev)
   1.193 +-	return;
   1.194 ++	return 0;
   1.195 + 
   1.196 +     if (usb_list) {
   1.197 + 	g_hash_table_foreach_remove(moreinfo, remove_usb_devices, NULL);
   1.198 + 	g_free(usb_list);
   1.199 +     }
   1.200 +-    usb_list = g_strdup("");
   1.201 ++    usb_list = g_strdup("[USB Devices]\n");
   1.202 + 
   1.203 +     while (fgets(buffer, 128, dev)) {
   1.204 + 	tmp = buffer;
   1.205 +@@ -73,52 +177,60 @@
   1.206 + 	    mxpwr = strstr(buffer, "MxPwr=") + 6;
   1.207 + 
   1.208 + 	    tmp = g_strdup_printf("USB%d", ++n);
   1.209 +-	    
   1.210 ++
   1.211 + 	    if (*product == '\0') {
   1.212 +-	        g_free(product);
   1.213 +-	        if (classid == 9) {
   1.214 +-                    product = g_strdup_printf("USB %.2f Hub", ver);
   1.215 +-                } else {
   1.216 +-  	            product = g_strdup_printf("Unknown USB %.2f Device (class %d)",
   1.217 +-                                              ver, classid);
   1.218 +-                }
   1.219 ++		g_free(product);
   1.220 ++		if (classid == 9) {
   1.221 ++		    product = g_strdup_printf("USB %.2f Hub", ver);
   1.222 ++		} else {
   1.223 ++		    product =
   1.224 ++			g_strdup_printf
   1.225 ++			("Unknown USB %.2f Device (class %d)", ver,
   1.226 ++			 classid);
   1.227 ++		}
   1.228 + 	    }
   1.229 +-	    
   1.230 ++
   1.231 + 
   1.232 + 	    if (classid == 9) {	/* hub */
   1.233 +-    	        usb_list = h_strdup_cprintf("[%s#%d]\n",
   1.234 +-		      		           usb_list, product, n);
   1.235 +-            } else { /* everything else */
   1.236 +-    	        usb_list = h_strdup_cprintf("$%s$%s=\n",
   1.237 +-		      		           usb_list, tmp, product);
   1.238 +-
   1.239 +-                const gchar *url = vendor_get_url(manuf);
   1.240 +-                if (url) {
   1.241 +-                    gchar *tmp = g_strdup_printf("%s (%s)", manuf, url);
   1.242 +-                    g_free(manuf);
   1.243 +-                    manuf = tmp;
   1.244 +-                }
   1.245 +-
   1.246 +-                gchar *strhash = g_strdup_printf("[Device Information]\n"
   1.247 +-                                                 "Product=%s\n"
   1.248 +-                                                 "Manufacturer=%s\n"
   1.249 +-                                                 "[Port #%d]\n"
   1.250 +-                                                 "Speed=%.2fMbit/s\n"
   1.251 +-                                                 "Max Current=%s\n"
   1.252 +-                                                 "[Misc]\n"
   1.253 +-                                                 "USB Version=%.2f\n"
   1.254 +-                                                 "Revision=%.2f\n"
   1.255 +-                                                 "Class=0x%x\n"
   1.256 +-                                                 "Vendor=0x%x\n"
   1.257 +-                                                 "Product ID=0x%x\n"
   1.258 +-                                                 "Bus=%d\n" "Level=%d\n",
   1.259 +-                                                 product, manuf,
   1.260 +-                                                 port, speed, mxpwr,
   1.261 +-                                                 ver, rev, classid,
   1.262 +-                                                 vendor, prodid, bus, level);
   1.263 ++		usb_list = h_strdup_cprintf("[%s#%d]\n",
   1.264 ++					    usb_list, product, n);
   1.265 ++	    } else {		/* everything else */
   1.266 ++		usb_list = h_strdup_cprintf("$%s$%s=\n",
   1.267 ++					    usb_list, tmp, product);
   1.268 ++
   1.269 ++		const gchar *url = vendor_get_url(manuf);
   1.270 ++		if (url) {
   1.271 ++		    gchar *tmp =
   1.272 ++			g_strdup_printf("%s (%s)", vendor_get_name(manuf),
   1.273 ++					url);
   1.274 ++		    g_free(manuf);
   1.275 ++		    manuf = tmp;
   1.276 ++		}
   1.277 ++
   1.278 ++		gchar *strhash = g_strdup_printf("[Device Information]\n"
   1.279 ++						 "Product=%s\n",
   1.280 ++						 product);
   1.281 ++		if (manuf && strlen(manuf))
   1.282 ++		    strhash = h_strdup_cprintf("Manufacturer=%s\n",
   1.283 ++					       strhash, manuf);
   1.284 ++
   1.285 ++		strhash = h_strdup_cprintf("[Port #%d]\n"
   1.286 ++					   "Speed=%.2fMbit/s\n"
   1.287 ++					   "Max Current=%s\n"
   1.288 ++					   "[Misc]\n"
   1.289 ++					   "USB Version=%.2f\n"
   1.290 ++					   "Revision=%.2f\n"
   1.291 ++					   "Class=0x%x\n"
   1.292 ++					   "Vendor=0x%x\n"
   1.293 ++					   "Product ID=0x%x\n"
   1.294 ++					   "Bus=%d\n" "Level=%d\n",
   1.295 ++					   strhash,
   1.296 ++					   port, speed, mxpwr,
   1.297 ++					   ver, rev, classid,
   1.298 ++					   vendor, prodid, bus, level);
   1.299 + 
   1.300 +-                g_hash_table_insert(moreinfo, tmp, strhash);
   1.301 +-            }
   1.302 ++		g_hash_table_insert(moreinfo, tmp, strhash);
   1.303 ++	    }
   1.304 + 
   1.305 + 	    g_free(manuf);
   1.306 + 	    g_free(product);
   1.307 +@@ -128,4 +240,12 @@
   1.308 +     }
   1.309 + 
   1.310 +     fclose(dev);
   1.311 ++
   1.312 ++    return n;
   1.313 ++}
   1.314 ++
   1.315 ++void __scan_usb(void)
   1.316 ++{
   1.317 ++    if (!__scan_usb_procfs())
   1.318 ++	__scan_usb_sysfs();
   1.319 + }