Changeset 2cb6571 in mainline
- Timestamp:
- 2010-12-03T15:49:30Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 36c410e, 54b141a
- Parents:
- 1dd264b (diff), 4144630 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- uspace/lib/usb
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usb/include/usb/hcdhubd.h
r1dd264b r2cb6571 116 116 } usb_hcd_transfer_ops_t; 117 117 118 /** 119 * @brief structure holding information about free and used addresses 120 * 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 118 135 struct usb_hc_device { 119 136 /** Transfer operations. */ … … 131 148 /** List of hubs operating from this HC. */ 132 149 link_t hubs; 150 151 /** Structure with free and used addresses */ 152 link_t addresses; 133 153 134 154 /** Link to other driven HCs. */ … … 148 168 int usb_hcd_add_root_hub(usb_hc_device_t *dev); 149 169 170 /** 171 * find first not yet used address on this host controller and use it 172 * @param this_hcd 173 * @return number in the range of allowed usb addresses or 174 * a negative number if not succesful 175 */ 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 happens 182 * @param this_hcd 183 * @param addr 184 */ 185 void usb_free_used_address(usb_hc_device_t * this_hcd, usb_address_t addr ); 186 150 187 151 188 /* -
uspace/lib/usb/src/hcdhubd.c
r1dd264b r2cb6571 105 105 * @return Error code. 106 106 */ 107 int usb_hcd_add_root_hub(usb_hc_device_t *dev) 108 { 107 int usb_hcd_add_root_hub(usb_hc_device_t *dev) { 109 108 char *id; 110 109 int rc = asprintf(&id, "usb&hc=%s&hub", hc_driver->name); … … 129 128 130 129 /** Adds a child device fibril worker. */ 131 static int fibril_add_child_device(void *arg) 132 { 130 static int fibril_add_child_device(void *arg) { 133 131 struct child_device_info *child_info 134 132 = (struct child_device_info *) arg; 135 133 int rc; 136 134 … … 156 154 157 155 printf("%s: adding child device `%s' with match \"%s\"\n", 158 156 hc_driver->name, child->name, match_id->id); 159 157 rc = child_device_register(child, child_info->parent); 160 158 printf("%s: child device `%s' registration: %s\n", 161 159 hc_driver->name, child->name, str_error(rc)); 162 160 163 161 if (rc != EOK) { … … 197 195 */ 198 196 int usb_hc_add_child_device(device_t *parent, const char *name, 199 const char *match_id, bool create_fibril) 200 { 197 const char *match_id, bool create_fibril) { 201 198 printf("%s: about to add child device `%s' (%s)\n", hc_driver->name, 202 199 name, match_id); 203 200 204 201 /* … … 209 206 210 207 struct child_device_info *child_info 211 = malloc(sizeof(struct child_device_info));208 = malloc(sizeof (struct child_device_info)); 212 209 213 210 child_info->parent = parent; … … 233 230 * @return USB device address or error code. 234 231 */ 235 usb_address_t usb_get_address_by_handle(devman_handle_t handle) 236 { 232 usb_address_t usb_get_address_by_handle(devman_handle_t handle) { 237 233 /* TODO: search list of attached devices. */ 238 234 return ENOENT; 239 235 } 240 236 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 interval 254 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 range 265 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' interval 270 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 found 292 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 range 299 if (found_range->lower_bound - 1 == addr) { 300 --found_range->lower_bound; 301 } else { 302 //only one possible case 303 ++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 range 309 if (next_range->lower_bound == addr + 1) { 310 //join ranges 311 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 241 321 /** 242 322 * @} -
uspace/lib/usb/src/hcdhubd_private.h
r1dd264b r2cb6571 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 hcd 58 * 59 * This function should be used only for hcd initialization. 60 * It creates interval list of free addresses, thus it is initialized as 61 * list with one interval with whole address space. Using an address shrinks 62 * the interval, freeing an address extends an interval or creates a 63 * new one. 64 * 65 * @param hcd 66 * @return 67 */ 68 void usb_create_address_list(usb_hc_device_t * hcd); 69 70 71 72 73 74 50 75 #endif 51 76 /** -
uspace/lib/usb/src/hcdrv.c
r1dd264b r2cb6571 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 52 56 static device_ops_t usb_device_ops = { 53 57 .interfaces[USBHC_DEV_IFACE] = &usbhc_interface 54 58 }; 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 } 55 69 56 70 static usb_hc_device_t *usb_hc_device_create(device_t *dev) { … … 59 73 list_initialize(&hc_dev->link); 60 74 list_initialize(&hc_dev->hubs); 75 usb_create_address_list(hc_dev); 61 76 list_initialize(&hc_dev->attached_devices); 62 77 hc_dev->transfer_ops = NULL; -
uspace/lib/usb/src/hubdrv.c
r1dd264b r2cb6571 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 correct116 115 device_t * my_hcd = device; 117 116 while (my_hcd->parent) 118 117 my_hcd = my_hcd->parent; 119 118 //dev-> 120 printf(" %s: owner hcd found: %s\n", hc_driver->name, my_hcd->name);119 printf("[hcdhubd]%s: owner hcd found: %s\n", hc_driver->name, my_hcd->name); 121 120 //we add the hub into the first hc 122 121 //link_t *link_hc = hc_list.next; … … 135 134 */ 136 135 int usb_add_hub_device(device_t *dev) { 137 usb_hc_device_t *hc = list_get_instance(hc_list.next, usb_hc_device_t, link); 138 set_hub_address(hc, 5); 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); 139 144 140 145 check_hub_changes(); … … 151 156 my_hcd = my_hcd->parent; 152 157 //dev-> 153 printf(" %s: owner hcd found: %s\n", hc_driver->name, my_hcd->name);158 printf("[hcdhubd]%s: owner hcd found: %s\n", hc_driver->name, my_hcd->name); 154 159 my_hcd = dev; 155 160 while (my_hcd->parent) … … 157 162 //dev-> 158 163 159 printf(" %s: owner hcd found: %s\n", hc_driver->name, my_hcd->name);164 printf("[hcdhubd]%s: owner hcd found: %s\n", hc_driver->name, my_hcd->name); 160 165 161 166 //create the hub structure … … 183 188 */ 184 189 static void set_hub_address(usb_hc_device_t *hc, usb_address_t address) { 185 printf(" %s: setting hub address to %d\n", hc->generic->name, address);190 printf("[hcdhubd]%s: setting hub address to %d\n", hc->generic->name, address); 186 191 usb_target_t target = {0, 0}; 187 192 usb_handle_t handle; … … 217 222 } 218 223 219 printf("%s: hub address changed\n", hc->generic->name); 224 printf("[hcdhubd]%s: hub address changed successfully to %d\n", 225 hc->generic->name, address); 220 226 } 221 227
Note:
See TracChangeset
for help on using the changeset viewer.