Changes in / [2cb6571:1dd264b] in mainline
- Location:
- uspace/lib/usb
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usb/include/usb/hcdhubd.h
r2cb6571 r1dd264b 116 116 } usb_hcd_transfer_ops_t; 117 117 118 /**119 * @brief structure holding information about free and used addresses120 *121 * This structure should not be used outside usb hcd driver.122 * You better consider it to be 'private'.123 */124 typedef struct {125 /** lower bound included in the interval */126 usb_address_t lower_bound;127 128 /** upper bound, excluded from the interval */129 usb_address_t upper_bound;130 131 /** */132 link_t link;133 }usb_address_list_t;134 135 118 struct usb_hc_device { 136 119 /** Transfer operations. */ … … 149 132 link_t hubs; 150 133 151 /** Structure with free and used addresses */152 link_t addresses;153 154 134 /** Link to other driven HCs. */ 155 135 link_t link; … … 167 147 int usb_hcd_main(usb_hc_driver_t *); 168 148 int usb_hcd_add_root_hub(usb_hc_device_t *dev); 169 170 /**171 * find first not yet used address on this host controller and use it172 * @param this_hcd173 * @return number in the range of allowed usb addresses or174 * a negative number if not succesful175 */176 usb_address_t usb_use_free_address(usb_hc_device_t * this_hcd);177 178 /**179 * @brief free the address in the address space of this hcd.180 *181 * if address is not used, nothing happens182 * @param this_hcd183 * @param addr184 */185 void usb_free_used_address(usb_hc_device_t * this_hcd, usb_address_t addr );186 149 187 150 -
uspace/lib/usb/src/hcdhubd.c
r2cb6571 r1dd264b 105 105 * @return Error code. 106 106 */ 107 int usb_hcd_add_root_hub(usb_hc_device_t *dev) { 107 int usb_hcd_add_root_hub(usb_hc_device_t *dev) 108 { 108 109 char *id; 109 110 int rc = asprintf(&id, "usb&hc=%s&hub", hc_driver->name); … … 128 129 129 130 /** Adds a child device fibril worker. */ 130 static int fibril_add_child_device(void *arg) { 131 static int fibril_add_child_device(void *arg) 132 { 131 133 struct child_device_info *child_info 132 134 = (struct child_device_info *) arg; 133 135 int rc; 134 136 … … 154 156 155 157 printf("%s: adding child device `%s' with match \"%s\"\n", 156 158 hc_driver->name, child->name, match_id->id); 157 159 rc = child_device_register(child, child_info->parent); 158 160 printf("%s: child device `%s' registration: %s\n", 159 161 hc_driver->name, child->name, str_error(rc)); 160 162 161 163 if (rc != EOK) { … … 195 197 */ 196 198 int usb_hc_add_child_device(device_t *parent, const char *name, 197 const char *match_id, bool create_fibril) { 199 const char *match_id, bool create_fibril) 200 { 198 201 printf("%s: about to add child device `%s' (%s)\n", hc_driver->name, 199 202 name, match_id); 200 203 201 204 /* … … 206 209 207 210 struct child_device_info *child_info 208 = malloc(sizeof(struct child_device_info));211 = malloc(sizeof(struct child_device_info)); 209 212 210 213 child_info->parent = parent; … … 230 233 * @return USB device address or error code. 231 234 */ 232 usb_address_t usb_get_address_by_handle(devman_handle_t handle) { 235 usb_address_t usb_get_address_by_handle(devman_handle_t handle) 236 { 233 237 /* TODO: search list of attached devices. */ 234 238 return ENOENT; 235 239 } 236 240 237 usb_address_t usb_use_free_address(usb_hc_device_t * this_hcd) {238 //is there free address?239 link_t * addresses = &this_hcd->addresses;240 if (list_empty(addresses)) return -1;241 link_t * link_addr = addresses;242 bool found = false;243 usb_address_list_t * range = NULL;244 while (!found) {245 link_addr = link_addr->next;246 if (link_addr == addresses) return -2;247 range = list_get_instance(link_addr,248 usb_address_list_t, link);249 if (range->upper_bound - range->lower_bound > 0) {250 found = true;251 }252 }253 //now we have interval254 int result = range->lower_bound;255 ++(range->lower_bound);256 if (range->upper_bound - range->lower_bound == 0) {257 list_remove(&range->link);258 free(range);259 }260 return result;261 }262 263 void usb_free_used_address(usb_hc_device_t * this_hcd, usb_address_t addr) {264 //check range265 if (addr < usb_lowest_address || addr > usb_highest_address)266 return;267 link_t * addresses = &this_hcd->addresses;268 link_t * link_addr = addresses;269 //find 'good' interval270 usb_address_list_t * found_range = NULL;271 bool found = false;272 while (!found) {273 link_addr = link_addr->next;274 if (link_addr == addresses) {275 found = true;276 } else {277 usb_address_list_t * range = list_get_instance(link_addr,278 usb_address_list_t, link);279 if ( (range->lower_bound - 1 == addr) ||280 (range->upper_bound == addr)) {281 found = true;282 found_range = range;283 }284 if (range->lower_bound - 1 > addr) {285 found = true;286 }287 288 }289 }290 if (found_range == NULL) {291 //no suitable range found292 usb_address_list_t * result_range =293 (usb_address_list_t*) malloc(sizeof (usb_address_list_t));294 result_range->lower_bound = addr;295 result_range->upper_bound = addr + 1;296 list_insert_before(&result_range->link, link_addr);297 } else {298 //we have good range299 if (found_range->lower_bound - 1 == addr) {300 --found_range->lower_bound;301 } else {302 //only one possible case303 ++found_range->upper_bound;304 if (found_range->link.next != addresses) {305 usb_address_list_t * next_range =306 list_get_instance( &found_range->link.next,307 usb_address_list_t, link);308 //check neighbour range309 if (next_range->lower_bound == addr + 1) {310 //join ranges311 found_range->upper_bound = next_range->upper_bound;312 list_remove(&next_range->link);313 free(next_range);314 }315 }316 }317 }318 319 }320 321 241 /** 322 242 * @} -
uspace/lib/usb/src/hcdhubd_private.h
r2cb6571 r1dd264b 48 48 int usb_add_hub_device(device_t *); 49 49 50 /** lowest allowed usb address */51 extern int usb_lowest_address;52 53 /** highest allowed usb address */54 extern int usb_highest_address;55 56 /**57 * @brief initialize address list of given hcd58 *59 * This function should be used only for hcd initialization.60 * It creates interval list of free addresses, thus it is initialized as61 * list with one interval with whole address space. Using an address shrinks62 * the interval, freeing an address extends an interval or creates a63 * new one.64 *65 * @param hcd66 * @return67 */68 void usb_create_address_list(usb_hc_device_t * hcd);69 70 71 72 73 74 75 50 #endif 76 51 /** -
uspace/lib/usb/src/hcdrv.c
r2cb6571 r1dd264b 50 50 usb_hc_driver_t *hc_driver = NULL; 51 51 52 int usb_lowest_address = 1;53 54 int usb_highest_address = 255;55 56 52 static device_ops_t usb_device_ops = { 57 53 .interfaces[USBHC_DEV_IFACE] = &usbhc_interface 58 54 }; 59 60 61 void usb_create_address_list(usb_hc_device_t * hcd){62 list_initialize(&hcd->addresses);63 usb_address_list_t * range =64 (usb_address_list_t*)malloc(sizeof(usb_address_list_t));65 range->lower_bound = usb_lowest_address;66 range->upper_bound = usb_highest_address + 1;67 list_append(&range->link, &hcd->addresses);68 }69 55 70 56 static usb_hc_device_t *usb_hc_device_create(device_t *dev) { … … 73 59 list_initialize(&hc_dev->link); 74 60 list_initialize(&hc_dev->hubs); 75 usb_create_address_list(hc_dev);76 61 list_initialize(&hc_dev->attached_devices); 77 62 hc_dev->transfer_ops = NULL; -
uspace/lib/usb/src/hubdrv.c
r2cb6571 r1dd264b 113 113 usb_hcd_hub_info_t* result = (usb_hcd_hub_info_t*) malloc(sizeof (usb_hcd_hub_info_t)); 114 114 //get parent device 115 /// @TODO this code is not correct 115 116 device_t * my_hcd = device; 116 117 while (my_hcd->parent) 117 118 my_hcd = my_hcd->parent; 118 119 //dev-> 119 printf(" [hcdhubd]%s: owner hcd found: %s\n", hc_driver->name, my_hcd->name);120 printf("%s: owner hcd found: %s\n", hc_driver->name, my_hcd->name); 120 121 //we add the hub into the first hc 121 122 //link_t *link_hc = hc_list.next; … … 134 135 */ 135 136 int usb_add_hub_device(device_t *dev) { 136 //usb_hc_device_t *hc = list_get_instance(hc_list.next, usb_hc_device_t, link); 137 assert(dev->parent); 138 usb_hc_device_t *hc = (usb_hc_device_t*)dev->parent->driver_data; 139 usb_address_t addr =usb_use_free_address(hc); 140 if(addr<0){ 141 printf("[hcdhubd] ERROR: cannot find an address \n"); 142 } 143 set_hub_address(hc, addr); 137 usb_hc_device_t *hc = list_get_instance(hc_list.next, usb_hc_device_t, link); 138 set_hub_address(hc, 5); 144 139 145 140 check_hub_changes(); … … 156 151 my_hcd = my_hcd->parent; 157 152 //dev-> 158 printf(" [hcdhubd]%s: owner hcd found: %s\n", hc_driver->name, my_hcd->name);153 printf("%s: owner hcd found: %s\n", hc_driver->name, my_hcd->name); 159 154 my_hcd = dev; 160 155 while (my_hcd->parent) … … 162 157 //dev-> 163 158 164 printf(" [hcdhubd]%s: owner hcd found: %s\n", hc_driver->name, my_hcd->name);159 printf("%s: owner hcd found: %s\n", hc_driver->name, my_hcd->name); 165 160 166 161 //create the hub structure … … 188 183 */ 189 184 static void set_hub_address(usb_hc_device_t *hc, usb_address_t address) { 190 printf(" [hcdhubd]%s: setting hub address to %d\n", hc->generic->name, address);185 printf("%s: setting hub address to %d\n", hc->generic->name, address); 191 186 usb_target_t target = {0, 0}; 192 187 usb_handle_t handle; … … 222 217 } 223 218 224 printf("[hcdhubd]%s: hub address changed successfully to %d\n", 225 hc->generic->name, address); 219 printf("%s: hub address changed\n", hc->generic->name); 226 220 } 227 221
Note:
See TracChangeset
for help on using the changeset viewer.