Changeset c280d7e in mainline
- Timestamp:
- 2018-01-20T03:02:36Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 60d3f35
- Parents:
- 3cdaa7f
- git-author:
- Ondřej Hlavatý <aearsis@…> (2018-01-20 03:02:32)
- git-committer:
- Ondřej Hlavatý <aearsis@…> (2018-01-20 03:02:36)
- Location:
- uspace
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbmid/usbmid.c
r3cdaa7f rc280d7e 45 45 #include "usbmid.h" 46 46 47 /** Get USB device handle by calling the parent usb_device_t. 47 /** 48 * Get USB device description by calling HC and altering the interface field. 48 49 * 49 50 * @param[in] fun Device function the operation is running on. 50 * @param[out] handle Device handle.51 * @param[out] desc Device descriptor. 51 52 * @return Error code. 52 53 */ 53 static int usb_iface_device_handle(ddf_fun_t *fun, devman_handle_t *handle) 54 { 55 assert(fun); 56 assert(handle); 57 usb_device_t *usb_dev = usb_device_get(ddf_fun_get_dev(fun)); 58 *handle = usb_device_get_devman_handle(usb_dev); 59 return EOK; 60 } 61 62 /** Callback for DDF USB get interface. */ 63 static int usb_iface_iface_no(ddf_fun_t *fun, int *iface_no) 54 static int usb_iface_description(ddf_fun_t *fun, usb_device_desc_t *desc) 64 55 { 65 56 usbmid_interface_t *iface = ddf_fun_data_get(fun); 66 57 assert(iface); 58 usb_device_t *usb_dev = ddf_dev_data_get(ddf_fun_get_dev(fun)); 59 assert(usb_dev); 67 60 68 if (iface_no) 69 *iface_no = iface->interface_no; 61 async_exch_t *exch = usb_device_bus_exchange_begin(usb_dev); 62 if (!exch) 63 return EPARTY; 64 65 usb_device_desc_t tmp_desc; 66 const int ret = usb_get_my_description(exch, &tmp_desc); 67 68 if (ret == EOK && desc) { 69 *desc = tmp_desc; 70 desc->iface = iface->interface_no; 71 } 70 72 71 73 return EOK; … … 74 76 /** DDF interface of the child - USB functions. */ 75 77 static usb_iface_t child_usb_iface = { 76 .get_my_device_handle = usb_iface_device_handle, 77 .get_my_interface = usb_iface_iface_no, 78 .get_my_description = usb_iface_description, 78 79 }; 79 80 -
uspace/lib/drv/generic/remote_usb.c
r3cdaa7f rc280d7e 61 61 62 62 typedef enum { 63 IPC_M_USB_GET_MY_INTERFACE, 64 IPC_M_USB_GET_MY_DEVICE_HANDLE, 63 IPC_M_USB_GET_MY_DESCRIPTION, 65 64 } usb_iface_funcs_t; 66 65 … … 71 70 * @return Error code. 72 71 */ 73 int usb_get_my_ interface(async_exch_t *exch, int *usb_iface)72 int usb_get_my_description(async_exch_t *exch, usb_device_desc_t *desc) 74 73 { 75 74 if (!exch) 76 75 return EBADMEM; 77 sysarg_t iface_no; 78 const int ret = async_req_1_1(exch, DEV_IFACE_ID(USB_DEV_IFACE), 79 IPC_M_USB_GET_MY_INTERFACE, &iface_no); 80 if (ret == EOK && usb_iface) 81 *usb_iface = (int)iface_no; 76 77 usb_device_desc_t tmp_desc; 78 79 const int ret = async_req_1_4(exch, DEV_IFACE_ID(USB_DEV_IFACE), 80 IPC_M_USB_GET_MY_DESCRIPTION, 81 (sysarg_t *) &tmp_desc.address, 82 (sysarg_t *) &tmp_desc.speed, 83 &tmp_desc.handle, 84 (sysarg_t *) &tmp_desc.iface); 85 if (ret == EOK && desc) 86 *desc = tmp_desc; 82 87 return ret; 83 88 } 84 89 85 /** Tell devman handle of the usb device function. 86 * 87 * @param[in] exch IPC communication exchange 88 * @param[out] handle devman handle of the HC used by the target device. 89 * 90 * @return Error code. 91 * 92 */ 93 int usb_get_my_device_handle(async_exch_t *exch, devman_handle_t *handle) 94 { 95 devman_handle_t h = 0; 96 const int ret = async_req_1_1(exch, DEV_IFACE_ID(USB_DEV_IFACE), 97 IPC_M_USB_GET_MY_DEVICE_HANDLE, &h); 98 if (ret == EOK && handle) 99 *handle = (devman_handle_t)h; 100 return ret; 101 } 102 103 static void remote_usb_get_my_interface(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 104 static void remote_usb_get_my_device_handle(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 90 static void remote_usb_get_my_description(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 105 91 106 92 /** Remote USB interface operations. */ 107 93 static const remote_iface_func_ptr_t remote_usb_iface_ops [] = { 108 [IPC_M_USB_GET_MY_INTERFACE] = remote_usb_get_my_interface, 109 [IPC_M_USB_GET_MY_DEVICE_HANDLE] = remote_usb_get_my_device_handle, 94 [IPC_M_USB_GET_MY_DESCRIPTION] = remote_usb_get_my_description, 110 95 }; 111 96 … … 117 102 }; 118 103 119 void remote_usb_get_my_ interface(ddf_fun_t *fun, void *iface,104 void remote_usb_get_my_description(ddf_fun_t *fun, void *iface, 120 105 ipc_callid_t callid, ipc_call_t *call) 121 106 { 122 107 const usb_iface_t *usb_iface = (usb_iface_t *) iface; 123 108 124 if (usb_iface->get_my_ interface== NULL) {109 if (usb_iface->get_my_description == NULL) { 125 110 async_answer_0(callid, ENOTSUP); 126 111 return; 127 112 } 128 113 129 int iface_no;130 const int ret = usb_iface->get_my_ interface(fun, &iface_no);114 usb_device_desc_t desc; 115 const int ret = usb_iface->get_my_description(fun, &desc); 131 116 if (ret != EOK) { 132 117 async_answer_0(callid, ret); 133 118 } else { 134 async_answer_1(callid, EOK, iface_no); 119 async_answer_4(callid, EOK, 120 (sysarg_t) desc.address, 121 (sysarg_t) desc.speed, 122 desc.handle, 123 desc.iface); 135 124 } 136 }137 138 void remote_usb_get_my_device_handle(ddf_fun_t *fun, void *iface,139 ipc_callid_t callid, ipc_call_t *call)140 {141 const usb_iface_t *usb_iface = (usb_iface_t *) iface;142 143 if (usb_iface->get_my_device_handle == NULL) {144 async_answer_0(callid, ENOTSUP);145 return;146 }147 148 devman_handle_t handle;149 const int ret = usb_iface->get_my_device_handle(fun, &handle);150 if (ret != EOK) {151 async_answer_0(callid, ret);152 }153 154 async_answer_1(callid, EOK, (sysarg_t) handle);155 125 } 156 126 -
uspace/lib/drv/include/usb_iface.h
r3cdaa7f rc280d7e 40 40 #include "ddf/driver.h" 41 41 #include <async.h> 42 #include <usbhc_iface.h> 42 43 43 44 typedef async_sess_t usb_dev_session_t; 45 46 typedef struct { 47 usb_address_t address; 48 usb_speed_t speed; 49 devman_handle_t handle; 50 int iface; 51 } usb_device_desc_t; 44 52 45 53 extern usb_dev_session_t *usb_dev_connect(devman_handle_t); … … 47 55 extern void usb_dev_disconnect(usb_dev_session_t *); 48 56 49 extern int usb_get_my_interface(async_exch_t *, int *); 50 extern int usb_get_my_device_handle(async_exch_t *, devman_handle_t *); 57 extern int usb_get_my_description(async_exch_t *, usb_device_desc_t *); 51 58 52 59 /** USB device communication interface. */ 53 60 typedef struct { 54 int (*get_my_interface)(ddf_fun_t *, int *); 55 int (*get_my_device_handle)(ddf_fun_t *, devman_handle_t *); 61 int (*get_my_description)(ddf_fun_t *, usb_device_desc_t *); 56 62 } usb_iface_t; 57 63 -
uspace/lib/usbdev/src/devdrv.c
r3cdaa7f rc280d7e 73 73 /** Number of other endpoint pipes. */ 74 74 size_t pipes_count; 75 76 /** USB address of this device */ 77 usb_address_t address; 78 79 /** USB speed of this device */ 80 usb_speed_t speed; 75 81 76 82 /** Current interface. … … 414 420 */ 415 421 static int usb_device_init(usb_device_t *usb_dev, ddf_dev_t *ddf_dev, 416 const usb_endpoint_description_t **endpoints, const char **errstr_ptr, 417 devman_handle_t handle, int interface_no) 422 const usb_endpoint_description_t **endpoints, const char **errstr_ptr) 418 423 { 419 424 assert(usb_dev != NULL); … … 423 428 424 429 usb_dev->ddf_dev = ddf_dev; 425 usb_dev->handle = handle;426 usb_dev->interface_no = interface_no;427 430 usb_dev->driver_data = NULL; 428 431 usb_dev->descriptors.full_config = NULL; … … 431 434 usb_dev->pipes = NULL; 432 435 433 usb_dev->bus_session = usb_dev_connect( handle);436 usb_dev->bus_session = usb_dev_connect(usb_dev->handle); 434 437 435 438 if (!usb_dev->bus_session) { … … 476 479 } 477 480 478 static int usb_device_get_info(async_sess_t *sess, devman_handle_t *handle, 479 int *iface_no) 480 { 481 assert(handle); 482 assert(iface_no); 481 static int usb_device_get_info(async_sess_t *sess, usb_device_t *dev) 482 { 483 assert(dev); 483 484 484 485 async_exch_t *exch = async_exchange_begin(sess); … … 486 487 return EPARTY; 487 488 488 int ret = usb_get_my_device_handle(exch, handle); 489 usb_device_desc_t dev_desc; 490 const int ret = usb_get_my_description(exch, &dev_desc); 491 489 492 if (ret == EOK) { 490 ret = usb_get_my_interface(exch, iface_no); 491 if (ret == ENOTSUP) { 492 *iface_no = -1; 493 ret = EOK; 494 } 493 dev->address = dev_desc.address; 494 dev->speed = dev_desc.speed; 495 dev->handle = dev_desc.handle; 496 dev->interface_no = dev_desc.iface; 495 497 } 496 498 … … 504 506 assert(ddf_dev); 505 507 assert(err); 506 507 devman_handle_t h = 0;508 int iface_no = -1;509 508 510 509 async_sess_t *sess = ddf_dev_parent_sess_get(ddf_dev); 511 510 if (sess == NULL) 512 511 return ENOMEM; 513 const int ret = usb_device_get_info(sess, &h, &iface_no);514 if (ret != EOK)515 return ret;516 512 517 513 usb_device_t *usb_dev = … … 522 518 } 523 519 524 return usb_device_init(usb_dev, ddf_dev, desc, err, h, iface_no); 520 const int ret = usb_device_get_info(sess, usb_dev); 521 if (ret != EOK) 522 return ret; 523 524 return usb_device_init(usb_dev, ddf_dev, desc, err); 525 525 } 526 526 … … 536 536 usb_device_t * usb_device_create(devman_handle_t handle) 537 537 { 538 devman_handle_t h = 0; 539 int iface_no = -1; 538 usb_device_t *usb_dev = malloc(sizeof(usb_device_t)); 539 if (!usb_dev) 540 return NULL; 540 541 541 542 async_sess_t *sess = devman_device_connect(handle, IPC_FLAG_BLOCKING); 542 int ret = usb_device_get_info(sess, &h, &iface_no);543 int ret = usb_device_get_info(sess, usb_dev); 543 544 if (sess) 544 545 async_hangup(sess); … … 546 547 return NULL; 547 548 548 usb_device_t *usb_dev = malloc(sizeof(usb_device_t));549 if (!usb_dev)550 return NULL;551 552 549 const char* dummy = NULL; 553 ret = usb_device_init(usb_dev, NULL, NULL, &dummy , handle, iface_no);550 ret = usb_device_init(usb_dev, NULL, NULL, &dummy); 554 551 if (ret != EOK) { 555 552 free(usb_dev); -
uspace/lib/usbdev/src/pipes.c
r3cdaa7f rc280d7e 248 248 */ 249 249 static int usb_isoch_session_initialize(usb_pipe_t *pipe) { 250 devman_handle_t handle; 251 252 async_exch_t *exch = async_exchange_begin(pipe->bus_session); 253 if (!exch) 254 return EPARTY; 255 256 int ret = usb_get_my_device_handle(exch, &handle); 257 258 async_exchange_end(exch); 259 if (ret != EOK) 260 return ret; 261 262 pipe->isoch_session = usb_dev_connect(handle); 263 if (!pipe->isoch_session) 264 return ENAK; 265 250 251 /* 252 * XXX: As parallel exhanges are implemented by using parallel sessions, 253 * it is safe to just take the same session. Once this won't be true, 254 * just use session cloning to clone the bus session. 255 */ 256 pipe->isoch_session = pipe->bus_session; 266 257 return EOK; 267 258 } -
uspace/lib/usbhost/src/ddf_helpers.c
r3cdaa7f rc280d7e 224 224 } 225 225 226 /** Gets handle of the respective device. 226 /** 227 * Gets description of the device that is calling. 227 228 * 228 229 * @param[in] fun Device function. 229 * @param[out] handle Place to write the handle.230 * @param[out] desc Device descriptor to be filled. 230 231 * @return Error code. 231 232 */ 232 static int get_my_device_handle(ddf_fun_t *fun, devman_handle_t *handle) 233 { 234 assert(fun); 235 if (handle) 236 *handle = ddf_fun_get_handle(fun); 233 static int get_device_description(ddf_fun_t *fun, usb_device_desc_t *desc) 234 { 235 assert(fun); 236 device_t *dev = ddf_fun_data_get(fun); 237 assert(dev); 238 239 if (!desc) 240 return EOK; 241 242 *desc = (usb_device_desc_t) { 243 .address = dev->address, 244 .speed = dev->speed, 245 .handle = ddf_fun_get_handle(fun), 246 .iface = -1, 247 }; 237 248 return EOK; 238 249 } … … 290 301 /** USB device interface */ 291 302 static usb_iface_t usb_iface = { 292 .get_my_de vice_handle = get_my_device_handle,303 .get_my_description = get_device_description, 293 304 }; 294 305
Note:
See TracChangeset
for help on using the changeset viewer.