Changes in uspace/lib/usb/src/hcdhubd.c [8f62b0f:0ee648a] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usb/src/hcdhubd.c
r8f62b0f r0ee648a 34 34 */ 35 35 #include <usb/hcdhubd.h> 36 #include <usb/devreq.h>37 36 #include <usbhc_iface.h> 38 37 #include <driver.h> … … 56 55 .interfaces[USBHC_DEV_IFACE] = &usb_interface 57 56 }; 58 59 static void set_hub_address(usb_hc_device_t *hc, usb_address_t address);60 57 61 58 /** Callback when new device is detected and must be handled by this driver. … … 101 98 return EOK; 102 99 } else { 103 usb_hc_device_t *hc = list_get_instance(hc_list.next, usb_hc_device_t, link); 104 set_hub_address(hc, 5); 105 100 printf("%s: hub added, hurrah!\n", hc_driver->name); 106 101 /* 107 102 * We are some (probably deeply nested) hub. … … 109 104 * connected devices. 110 105 */ 111 112 106 return ENOTSUP; 113 107 } 114 }115 116 /** Sample usage of usb_hc_async functions.117 * This function sets hub address using standard SET_ADDRESS request.118 *119 * @warning This function shall be removed once you are familiar with120 * the usb_hc_ API.121 *122 * @param hc Host controller the hub belongs to.123 * @param address New hub address.124 */125 static void set_hub_address(usb_hc_device_t *hc, usb_address_t address)126 {127 printf("%s: setting hub address to %d\n", hc->generic->name, address);128 usb_target_t target = {0, 0};129 usb_handle_t handle;130 int rc;131 132 usb_device_request_setup_packet_t setup_packet = {133 .request_type = 0,134 .request = USB_DEVREQ_SET_ADDRESS,135 .index = 0,136 .length = 0,137 };138 setup_packet.value = address;139 140 rc = usb_hc_async_control_write_setup(hc, target,141 &setup_packet, sizeof(setup_packet), &handle);142 if (rc != EOK) {143 return;144 }145 146 rc = usb_hc_async_wait_for(handle);147 if (rc != EOK) {148 return;149 }150 151 rc = usb_hc_async_control_write_status(hc, target, &handle);152 if (rc != EOK) {153 return;154 }155 156 rc = usb_hc_async_wait_for(handle);157 if (rc != EOK) {158 return;159 }160 161 printf("%s: hub address changed\n", hc->generic->name);162 108 } 163 109 … … 266 212 267 213 /* 214 * For testing/debugging purposes only. 215 * Try to send some data to default USB address. 216 */ 217 usb_target_t target = {0, 0}; 218 usb_handle_t handle = 0; 219 char *data = (char *) "Hello, World!"; 220 221 222 (void)usb_hc_async_interrupt_out(dev, target, data, str_length(data), &handle); 223 (void)usb_hc_async_wait_for(handle); 224 225 /* 268 226 * Announce presence of child device. 269 227 */ … … 314 272 } 315 273 274 /** Issue interrupt OUT transfer to HC driven by current task. 275 * 276 * @param hc Host controller to handle the transfer. 277 * @param target Target device address. 278 * @param buffer Data buffer. 279 * @param size Buffer size. 280 * @param handle Transfer handle. 281 * @return Error code. 282 */ 283 int usb_hc_async_interrupt_out(usb_hc_device_t *hc, usb_target_t target, 284 void *buffer, size_t size, 285 usb_handle_t *handle) 286 { 287 if ((hc->transfer_ops == NULL) 288 || (hc->transfer_ops->transfer_out == NULL)) { 289 return ENOTSUP; 290 } 291 292 /* 293 * For debugging purposes only. 294 * We need to find appropriate device in list of managed device 295 * and pass it to the transfer callback function. 296 */ 297 usb_hcd_attached_device_info_t dev = { 298 .address = target.address, 299 .endpoint_count = 0, 300 .endpoints = NULL, 301 }; 302 usb_hc_endpoint_info_t endpoint = { 303 .endpoint = target.endpoint, 304 .transfer_type = USB_TRANSFER_INTERRUPT, 305 .direction = USB_DIRECTION_OUT, 306 .data_toggle = 0 307 }; 308 309 hc->transfer_ops->transfer_out(hc, &dev, &endpoint, buffer, size, NULL, NULL); 310 311 *handle = (usb_handle_t)NULL; 312 313 return EOK; 314 } 315 316 317 /** Issue interrupt IN transfer to HC driven by current task. 318 * 319 * @warning The @p buffer and @p actual_size parameters shall not be 320 * touched until this transfer is waited for by usb_hc_async_wait_for(). 321 * 322 * @param hc Host controller to handle the transfer. 323 * @param target Target device address. 324 * @param buffer Data buffer. 325 * @param size Buffer size. 326 * @param actual_size Size of actually transferred data. 327 * @param handle Transfer handle. 328 * @return Error code. 329 */ 330 int usb_hc_async_interrupt_in(usb_hc_device_t *hc, usb_target_t target, 331 void *buffer, size_t size, size_t *actual_size, 332 usb_handle_t *handle) 333 { 334 /* 335 * TODO: verify that given endpoint is of interrupt type and 336 * call hc->transfer_ops->transfer_in() 337 */ 338 return ENOTSUP; 339 } 340 341 /** Wait for transfer to complete. 342 * 343 * @param handle Transfer handle. 344 * @return Error code. 345 */ 346 int usb_hc_async_wait_for(usb_handle_t handle) 347 { 348 return ENOTSUP; 349 } 350 316 351 /** 317 352 * @}
Note:
See TracChangeset
for help on using the changeset viewer.