/* * Add driver data, if it is missing. * * Interface function, don't use internally. */ void hd_add_driver_data(hd_data_t *hd_data, hd_t *hd) { char *s; if(hd->drivers) return; hd_sysfs_driver_list(hd_data); s = hd_sysfs_find_driver(hd_data, hd->sysfs_id, 1); if(s) add_str_list(&hd->drivers, s); int_update_driver_data(hd_data, hd); }
void get_usb_devs(hd_data_t *hd_data) { uint64_t ul0; unsigned u1, u2, u3; hd_t *hd, *hd1; usb_t *usb; str_list_t *sl, *usb_devs = NULL; char *s, *s1, *t; hd_res_t *res; size_t l; str_list_t *sf_bus, *sf_bus_e; char *sf_dev, *sf_dev_2; sf_bus = read_dir("/sys/bus/usb/devices", 'l'); if(!sf_bus) { ADD2LOG("sysfs: no such bus: usb\n"); return; } for(sf_bus_e = sf_bus; sf_bus_e; sf_bus_e = sf_bus_e->next) { sf_dev = hd_read_sysfs_link("/sys/bus/usb/devices", sf_bus_e->str); if(hd_attr_uint(get_sysfs_attr_by_path(sf_dev, "bNumInterfaces"), &ul0, 0)) { add_str_list(&usb_devs, sf_dev); ADD2LOG(" usb dev: %s\n", hd_sysfs_id(sf_dev)); } } for(sf_bus_e = sf_bus; sf_bus_e; sf_bus_e = sf_bus_e->next) { sf_dev = new_str(hd_read_sysfs_link("/sys/bus/usb/devices", sf_bus_e->str)); ADD2LOG( " usb device: name = %s\n path = %s\n", sf_bus_e->str, hd_sysfs_id(sf_dev) ); if( hd_attr_uint(get_sysfs_attr_by_path(sf_dev, "bInterfaceNumber"), &ul0, 16) ) { hd = add_hd_entry(hd_data, __LINE__, 0); hd->detail = new_mem(sizeof *hd->detail); hd->detail->type = hd_detail_usb; hd->detail->usb.data = usb = new_mem(sizeof *usb); hd->sysfs_id = new_str(hd_sysfs_id(sf_dev)); hd->sysfs_bus_id = new_str(sf_bus_e->str); hd->bus.id = bus_usb; hd->func = ul0; usb->ifdescr = ul0; if((s = get_sysfs_attr_by_path(sf_dev, "modalias"))) { s = canon_str(s, strlen(s)); ADD2LOG(" modalias = \"%s\"\n", s); if(s && *s) { hd->modalias = s; s = NULL; } s = free_mem(s); } ADD2LOG(" bInterfaceNumber = %u\n", hd->func); if(hd_attr_uint(get_sysfs_attr_by_path(sf_dev, "bInterfaceClass"), &ul0, 16)) { usb->i_cls = ul0; ADD2LOG(" bInterfaceClass = %u\n", usb->i_cls); } if(hd_attr_uint(get_sysfs_attr_by_path(sf_dev, "bInterfaceSubClass"), &ul0, 16)) { usb->i_sub = ul0; ADD2LOG(" bInterfaceSubClass = %u\n", usb->i_sub); } if(hd_attr_uint(get_sysfs_attr_by_path(sf_dev, "bInterfaceProtocol"), &ul0, 16)) { usb->i_prot = ul0; ADD2LOG(" bInterfaceProtocol = %u\n", usb->i_prot); } /* device has longest matching sysfs id */ u2 = strlen(sf_dev); s = NULL; for(u3 = 0, sl = usb_devs; sl; sl = sl->next) { u1 = strlen(sl->str); if(u1 > u3 && u1 <= u2 && !strncmp(sf_dev, sl->str, u1)) { u3 = u1; s = sl->str; } } if(s) { ADD2LOG(" if: %s @ %s\n", hd->sysfs_bus_id, hd_sysfs_id(s)); sf_dev_2 = new_str(s); if(sf_dev_2) { if(hd_attr_uint(get_sysfs_attr_by_path(sf_dev_2, "bDeviceClass"), &ul0, 16)) { usb->d_cls = ul0; ADD2LOG(" bDeviceClass = %u\n", usb->d_cls); } if(hd_attr_uint(get_sysfs_attr_by_path(sf_dev_2, "bDeviceSubClass"), &ul0, 16)) { usb->d_sub = ul0; ADD2LOG(" bDeviceSubClass = %u\n", usb->d_sub); } if(hd_attr_uint(get_sysfs_attr_by_path(sf_dev_2, "bDeviceProtocol"), &ul0, 16)) { usb->d_prot = ul0; ADD2LOG(" bDeviceProtocol = %u\n", usb->d_prot); } if(hd_attr_uint(get_sysfs_attr_by_path(sf_dev_2, "idVendor"), &ul0, 16)) { usb->vendor = ul0; ADD2LOG(" idVendor = 0x%04x\n", usb->vendor); } if(hd_attr_uint(get_sysfs_attr_by_path(sf_dev_2, "idProduct"), &ul0, 16)) { usb->device = ul0; ADD2LOG(" idProduct = 0x%04x\n", usb->device); } if((s = get_sysfs_attr_by_path(sf_dev_2, "manufacturer"))) { usb->manufact = canon_str(s, strlen(s)); ADD2LOG(" manufacturer = \"%s\"\n", usb->manufact); } if((s = get_sysfs_attr_by_path(sf_dev_2, "product"))) { usb->product = canon_str(s, strlen(s)); ADD2LOG(" product = \"%s\"\n", usb->product); } if((s = get_sysfs_attr_by_path(sf_dev_2, "serial"))) { usb->serial = canon_str(s, strlen(s)); ADD2LOG(" serial = \"%s\"\n", usb->serial); } if(hd_attr_uint(get_sysfs_attr_by_path(sf_dev_2, "bcdDevice"), &ul0, 16)) { usb->rev = ul0; ADD2LOG(" bcdDevice = %04x\n", usb->rev); } if((s = get_sysfs_attr_by_path(sf_dev_2, "speed"))) { s = canon_str(s, strlen(s)); if(!strcmp(s, "1.5")) usb->speed = 15*100000; else if(!strcmp(s, "12")) usb->speed = 12*1000000; else if(!strcmp(s, "480")) usb->speed = 480*1000000; ADD2LOG(" speed = \"%s\"\n", s); s = free_mem(s); } sf_dev_2 = free_mem(sf_dev_2); } } if(usb->vendor || usb->device) { hd->vendor.id = MAKE_ID(TAG_USB, usb->vendor); hd->device.id = MAKE_ID(TAG_USB, usb->device); } if(usb->manufact) hd->vendor.name = new_str(usb->manufact); if(usb->product) hd->device.name = new_str(usb->product); if(usb->serial) hd->serial = new_str(usb->serial); if(usb->rev) str_printf(&hd->revision.name, 0, "%x.%02x", usb->rev >> 8, usb->rev & 0xff); if(usb->speed) { res = add_res_entry(&hd->res, new_mem(sizeof *res)); res->baud.type = res_baud; res->baud.speed = usb->speed; } s = hd_sysfs_find_driver(hd_data, hd->sysfs_id, 1); if(s) add_str_list(&hd->drivers, s); set_class_entries(hd_data, hd, usb); if(!hd_data->scanner_db) { hd_data->scanner_db = hd_module_list(hd_data, 1); } if( hd->drivers && search_str_list(hd_data->scanner_db, hd->drivers->str) ) { hd->base_class.id = bc_scanner; } // ###### FIXME if(hd->base_class.id == bc_modem) { hd->unix_dev_name = new_str("/dev/ttyACM0"); } } sf_dev = free_mem(sf_dev); }
void pcmcia_read_data(hd_data_t *hd_data) { hd_t *hd, *hd2; unsigned u0, u1, func_id; uint64_t ul0; char *s, *t; char *prod1, *prod2, *prod3, *prod4; str_list_t *sl; str_list_t *sf_bus, *sf_bus_e; char *sf_dev; sf_bus = reverse_str_list(read_dir("/sys/bus/pcmcia/devices", 'l')); if(!sf_bus) { ADD2LOG("sysfs: no such bus: pcmcia\n"); return; } for(sf_bus_e = sf_bus; sf_bus_e; sf_bus_e = sf_bus_e->next) { sf_dev = new_str(hd_read_sysfs_link("/sys/bus/pcmcia/devices", sf_bus_e->str)); ADD2LOG( " pcmcia device: name = %s\n path = %s\n", sf_bus_e->str, hd_sysfs_id(sf_dev) ); if(sscanf(sf_bus_e->str, "%x.%x", &u0, &u1) != 2) continue; hd = add_hd_entry(hd_data, __LINE__, 0); hd->sysfs_id = new_str(hd_sysfs_id(sf_dev)); hd->sysfs_bus_id = new_str(sf_bus_e->str); hd->bus.id = bus_pcmcia; hd->slot = u0; hd->func = u1; hd->hotplug_slot = u0 + 1; hd->hotplug = hp_pcmcia; s = hd_sysfs_find_driver(hd_data, hd->sysfs_id, 1); if(s) add_str_list(&hd->drivers, s); if((s = get_sysfs_attr_by_path(sf_dev, "modalias"))) { hd->modalias = canon_str(s, strlen(s)); ADD2LOG(" modalias = \"%s\"\n", s); } if(hd_attr_uint(get_sysfs_attr_by_path(sf_dev, "manf_id"), &ul0, 0)) { ADD2LOG(" manf_id = 0x%04x\n", (unsigned) ul0); hd->vendor.id = MAKE_ID(TAG_PCMCIA, ul0); } if(hd_attr_uint(get_sysfs_attr_by_path(sf_dev, "card_id"), &ul0, 0)) { ADD2LOG(" card_id = 0x%04x\n", (unsigned) ul0); hd->device.id = MAKE_ID(TAG_PCMCIA, ul0); } /* * "multifunction", "memory", "serial", "parallel", * "fixed disk", "video", "network", "AIMS", * "SCSI" */ func_id = 0; if(hd_attr_uint(get_sysfs_attr_by_path(sf_dev, "func_id"), &ul0, 0)) { func_id = ul0; ADD2LOG(" func_id = 0x%04x\n", func_id); } prod1 = NULL; if((s = get_sysfs_attr_by_path(sf_dev, "prod_id1"))) { prod1 = canon_str(s, strlen(s)); ADD2LOG(" prod_id1 = \"%s\"\n", prod1); } prod2 = NULL; if((s = get_sysfs_attr_by_path(sf_dev, "prod_id2"))) { prod2 = canon_str(s, strlen(s)); ADD2LOG(" prod_id2 = \"%s\"\n", prod2); } prod3 = NULL; if((s = get_sysfs_attr_by_path(sf_dev, "prod_id3"))) { prod3 = canon_str(s, strlen(s)); ADD2LOG(" prod_id3 = \"%s\"\n", prod3); } prod4 = NULL; if((s = get_sysfs_attr_by_path(sf_dev, "prod_id4"))) { prod4 = canon_str(s, strlen(s)); ADD2LOG(" prod_id4 = \"%s\"\n", prod4); } if(func_id == 6) { hd->base_class.id = bc_network; hd->sub_class.id = 0x80; /* other */ } if(prod1 && *prod1) { add_str_list(&hd->extra_info, prod1); hd->vendor.name = prod1; prod1 = NULL; } if(prod2 && *prod2) { add_str_list(&hd->extra_info, prod2); hd->device.name = prod2; prod2 = NULL; } if(prod3 && *prod3) add_str_list(&hd->extra_info, prod3); if(prod4 && *prod4) add_str_list(&hd->extra_info, prod4); for(sl = hd->extra_info; sl ; sl = sl->next) { if(strstr(sl->str, "Ethernet")) hd->sub_class.id = 0; /* ethernet */ if( !hd->revision.name && !sl->next && ( !strncasecmp(sl->str, "rev.", sizeof "rev." - 1) || ( (sl->str[0] == 'V' || sl->str[0] == 'v') && (sl->str[1] >= '0' && sl->str[1] <= '9') ) ) ) { hd->revision.name = new_str(sl->str); } } prod1 = free_mem(prod1); prod2 = free_mem(prod2); prod3 = free_mem(prod3); prod4 = free_mem(prod4); s = new_str(hd->sysfs_id); if((t = strrchr(s, '/'))) { *t = 0; if((hd2 = hd_find_sysfs_id(hd_data, s))) { hd->attached_to = hd2->idx; } } free_mem(s); free_mem(sf_dev); } free_str_list(sf_bus); }