Changeset 1e647c7d in mainline
- Timestamp:
- 2011-09-13T14:24:16Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5d915b7
- Parents:
- e3f6304
- Location:
- uspace/lib
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/drv/generic/remote_usbhc.c
re3f6304 r1e647c7d 42 42 #define USB_MAX_PAYLOAD_SIZE 1020 43 43 44 static void remote_usbhc_interrupt_out(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);45 static void remote_usbhc_interrupt_in(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);46 static void remote_usbhc_bulk_out(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);47 static void remote_usbhc_bulk_in(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);48 static void remote_usbhc_control_write(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);49 static void remote_usbhc_control_read(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);50 44 static void remote_usbhc_request_address(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 51 45 static void remote_usbhc_bind_address(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); … … 54 48 static void remote_usbhc_register_endpoint(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 55 49 static void remote_usbhc_unregister_endpoint(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 50 static void remote_usbhc_control_write(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 51 static void remote_usbhc_control_read(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 56 52 static void remote_usbhc_data_read(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 57 53 static void remote_usbhc_data_write(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); … … 65 61 [IPC_M_USBHC_RELEASE_ADDRESS] = remote_usbhc_release_address, 66 62 67 [IPC_M_USBHC_INTERRUPT_OUT] = remote_usbhc_interrupt_out, 68 [IPC_M_USBHC_INTERRUPT_IN] = remote_usbhc_interrupt_in, 69 70 [IPC_M_USBHC_BULK_OUT] = remote_usbhc_bulk_out, 71 [IPC_M_USBHC_BULK_IN] = remote_usbhc_bulk_in, 63 [IPC_M_USBHC_REGISTER_ENDPOINT] = remote_usbhc_register_endpoint, 64 [IPC_M_USBHC_UNREGISTER_ENDPOINT] = remote_usbhc_unregister_endpoint, 72 65 73 66 [IPC_M_USBHC_CONTROL_WRITE] = remote_usbhc_control_write, 74 67 [IPC_M_USBHC_CONTROL_READ] = remote_usbhc_control_read, 75 76 [IPC_M_USBHC_REGISTER_ENDPOINT] = remote_usbhc_register_endpoint,77 [IPC_M_USBHC_UNREGISTER_ENDPOINT] = remote_usbhc_unregister_endpoint,78 68 79 69 [IPC_M_USBHC_DATA_READ] = remote_usbhc_data_read, … … 93 83 ipc_callid_t data_caller; 94 84 void *buffer; 95 void *setup_packet;96 85 size_t size; 97 86 } async_transaction_t; … … 101 90 if (trans == NULL) { 102 91 return; 103 }104 105 if (trans->setup_packet != NULL) {106 free(trans->setup_packet);107 92 } 108 93 if (trans->buffer != NULL) { … … 123 108 trans->data_caller = 0; 124 109 trans->buffer = NULL; 125 trans->setup_packet = NULL;126 110 trans->size = 0; 127 111 … … 241 225 242 226 async_transaction_destroy(trans); 243 }244 245 /** Process an outgoing transfer (both OUT and SETUP).246 *247 * @param device Target device.248 * @param callid Initiating caller.249 * @param call Initiating call.250 * @param transfer_func Transfer function (might be NULL).251 */252 static void remote_usbhc_out_transfer(ddf_fun_t *fun,253 ipc_callid_t callid, ipc_call_t *call,254 usbhc_iface_transfer_out_t transfer_func)255 {256 if (!transfer_func) {257 async_answer_0(callid, ENOTSUP);258 return;259 }260 261 usb_target_t target = {262 .address = DEV_IPC_GET_ARG1(*call),263 .endpoint = DEV_IPC_GET_ARG2(*call)264 };265 266 size_t len = 0;267 void *buffer = NULL;268 269 int rc = async_data_write_accept(&buffer, false,270 1, USB_MAX_PAYLOAD_SIZE,271 0, &len);272 273 if (rc != EOK) {274 async_answer_0(callid, rc);275 return;276 }277 278 async_transaction_t *trans = async_transaction_create(callid);279 if (trans == NULL) {280 if (buffer != NULL) {281 free(buffer);282 }283 async_answer_0(callid, ENOMEM);284 return;285 }286 287 trans->buffer = buffer;288 trans->size = len;289 290 rc = transfer_func(fun, target,291 buffer, len,292 callback_out, trans);293 294 if (rc != EOK) {295 async_answer_0(callid, rc);296 async_transaction_destroy(trans);297 }298 }299 300 /** Process an incoming transfer.301 *302 * @param device Target device.303 * @param callid Initiating caller.304 * @param call Initiating call.305 * @param transfer_func Transfer function (might be NULL).306 */307 static void remote_usbhc_in_transfer(ddf_fun_t *fun,308 ipc_callid_t callid, ipc_call_t *call,309 usbhc_iface_transfer_in_t transfer_func)310 {311 if (!transfer_func) {312 async_answer_0(callid, ENOTSUP);313 return;314 }315 316 usb_target_t target = {317 .address = DEV_IPC_GET_ARG1(*call),318 .endpoint = DEV_IPC_GET_ARG2(*call)319 };320 321 size_t len;322 ipc_callid_t data_callid;323 if (!async_data_read_receive(&data_callid, &len)) {324 async_answer_0(callid, EPARTY);325 return;326 }327 328 async_transaction_t *trans = async_transaction_create(callid);329 if (trans == NULL) {330 async_answer_0(data_callid, ENOMEM);331 async_answer_0(callid, ENOMEM);332 return;333 }334 trans->data_caller = data_callid;335 trans->buffer = malloc(len);336 trans->size = len;337 338 int rc = transfer_func(fun, target,339 trans->buffer, len,340 callback_in, trans);341 342 if (rc != EOK) {343 async_answer_0(data_callid, rc);344 async_answer_0(callid, rc);345 async_transaction_destroy(trans);346 }347 }348 349 void remote_usbhc_interrupt_out(ddf_fun_t *fun, void *iface,350 ipc_callid_t callid, ipc_call_t *call)351 {352 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface;353 assert(usb_iface != NULL);354 355 return remote_usbhc_out_transfer(fun, callid, call,356 usb_iface->interrupt_out);357 }358 359 void remote_usbhc_interrupt_in(ddf_fun_t *fun, void *iface,360 ipc_callid_t callid, ipc_call_t *call)361 {362 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface;363 assert(usb_iface != NULL);364 365 return remote_usbhc_in_transfer(fun, callid, call,366 usb_iface->interrupt_in);367 }368 369 void remote_usbhc_bulk_out(ddf_fun_t *fun, void *iface,370 ipc_callid_t callid, ipc_call_t *call)371 {372 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface;373 assert(usb_iface != NULL);374 375 return remote_usbhc_out_transfer(fun, callid, call,376 usb_iface->bulk_out);377 }378 379 void remote_usbhc_bulk_in(ddf_fun_t *fun, void *iface,380 ipc_callid_t callid, ipc_call_t *call)381 {382 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface;383 assert(usb_iface != NULL);384 385 return remote_usbhc_in_transfer(fun, callid, call,386 usb_iface->bulk_in);387 227 } 388 228 -
uspace/lib/drv/include/usbhc_iface.h
re3f6304 r1e647c7d 123 123 IPC_M_USBHC_RELEASE_ADDRESS, 124 124 125 126 /** Send interrupt data to device.127 * See explanation at usb_iface_funcs_t (OUT transaction).128 */129 IPC_M_USBHC_INTERRUPT_OUT,130 131 /** Get interrupt data from device.132 * See explanation at usb_iface_funcs_t (IN transaction).133 */134 IPC_M_USBHC_INTERRUPT_IN,135 136 /** Send bulk data to device.137 * See explanation at usb_iface_funcs_t (OUT transaction).138 */139 IPC_M_USBHC_BULK_OUT,140 141 /** Get bulk data from device.142 * See explanation at usb_iface_funcs_t (IN transaction).143 */144 IPC_M_USBHC_BULK_IN,145 146 /** Issue control WRITE transfer.147 * See explanation at usb_iface_funcs_t (OUT transaction) for148 * call parameters.149 * This call is immediately followed by two IPC data writes150 * from the caller (setup packet and actual data).151 */152 IPC_M_USBHC_CONTROL_WRITE,153 154 /** Issue control READ transfer.155 * See explanation at usb_iface_funcs_t (IN transaction) for156 * call parameters.157 * This call is immediately followed by IPC data write from the caller158 * (setup packet) and IPC data read (buffer that was read).159 */160 IPC_M_USBHC_CONTROL_READ,161 162 125 /** Register endpoint attributes at host controller. 163 126 * This is used to reserve portion of USB bandwidth. … … 187 150 IPC_M_USBHC_UNREGISTER_ENDPOINT, 188 151 152 /** Issue control WRITE transfer. 153 * See explanation at usb_iface_funcs_t (OUT transaction) for 154 * call parameters. 155 * This call is immediately followed by two IPC data writes 156 * from the caller (setup packet and actual data). 157 */ 158 IPC_M_USBHC_CONTROL_WRITE, 159 160 /** Issue control READ transfer. 161 * See explanation at usb_iface_funcs_t (IN transaction) for 162 * call parameters. 163 * This call is immediately followed by IPC data write from the caller 164 * (setup packet) and IPC data read (buffer that was read). 165 */ 166 IPC_M_USBHC_CONTROL_READ, 167 168 /** Get data from device. 169 * See explanation at usb_iface_funcs_t (IN transaction). 170 */ 189 171 IPC_M_USBHC_DATA_READ, 190 172 173 /** Send data to device. 174 * See explanation at usb_iface_funcs_t (OUT transaction). 175 */ 191 176 IPC_M_USBHC_DATA_WRITE, 192 177 } usbhc_iface_funcs_t; … … 199 184 typedef void (*usbhc_iface_transfer_in_callback_t)(ddf_fun_t *, 200 185 int, size_t, void *); 201 202 203 /** Out transfer processing function prototype. */204 typedef int (*usbhc_iface_transfer_out_t)(ddf_fun_t *, usb_target_t,205 void *, size_t,206 usbhc_iface_transfer_out_callback_t, void *);207 208 /** Setup transfer processing function prototype. @deprecated */209 typedef usbhc_iface_transfer_out_t usbhc_iface_transfer_setup_t;210 211 /** In transfer processing function prototype. */212 typedef int (*usbhc_iface_transfer_in_t)(ddf_fun_t *, usb_target_t,213 void *, size_t,214 usbhc_iface_transfer_in_callback_t, void *);215 186 216 187 /** USB host controller communication interface. */ … … 227 198 usb_direction_t); 228 199 229 usbhc_iface_transfer_out_t interrupt_out;230 usbhc_iface_transfer_in_t interrupt_in;231 232 usbhc_iface_transfer_out_t bulk_out;233 usbhc_iface_transfer_in_t bulk_in;234 235 int (*control_write)(ddf_fun_t *, usb_target_t,236 void *, size_t, void *, size_t,237 usbhc_iface_transfer_out_callback_t, void *);238 239 int (*control_read)(ddf_fun_t *, usb_target_t,240 void *, size_t, void *, size_t,241 usbhc_iface_transfer_in_callback_t, void *);242 243 200 int (*read)(ddf_fun_t *, usb_target_t, uint64_t, uint8_t *, size_t, 244 201 usbhc_iface_transfer_in_callback_t, void *); -
uspace/lib/usbhost/src/iface.c
re3f6304 r1e647c7d 221 221 } 222 222 /*----------------------------------------------------------------------------*/ 223 /** Interrupt out transaction interface function224 *225 * @param[in] fun DDF function that was called.226 * @param[in] target USB device to write to.227 * @param[in] data Source of data.228 * @param[in] size Size of data source.229 * @param[in] callback Function to call on transaction completion230 * @param[in] arg Additional for callback function.231 * @return Error code.232 */233 static int interrupt_out(234 ddf_fun_t *fun, usb_target_t target, void *data,235 size_t size, usbhc_iface_transfer_out_callback_t callback, void *arg)236 {237 return send_batch(fun, target, USB_DIRECTION_OUT, data, size,238 0, NULL, callback, arg, "Interrupt OUT");239 }240 /*----------------------------------------------------------------------------*/241 /** Interrupt in transaction interface function242 *243 * @param[in] fun DDF function that was called.244 * @param[in] target USB device to write to.245 * @param[out] data Data destination.246 * @param[in] size Size of data source.247 * @param[in] callback Function to call on transaction completion248 * @param[in] arg Additional for callback function.249 * @return Error code.250 */251 static int interrupt_in(252 ddf_fun_t *fun, usb_target_t target, void *data,253 size_t size, usbhc_iface_transfer_in_callback_t callback, void *arg)254 {255 return send_batch(fun, target, USB_DIRECTION_IN, data, size,256 0, callback, NULL, arg, "Interrupt IN");257 }258 /*----------------------------------------------------------------------------*/259 /** Bulk out transaction interface function260 *261 * @param[in] fun DDF function that was called.262 * @param[in] target USB device to write to.263 * @param[in] data Source of data.264 * @param[in] size Size of data source.265 * @param[in] callback Function to call on transaction completion266 * @param[in] arg Additional for callback function.267 * @return Error code.268 */269 static int bulk_out(270 ddf_fun_t *fun, usb_target_t target, void *data,271 size_t size, usbhc_iface_transfer_out_callback_t callback, void *arg)272 {273 return send_batch(fun, target, USB_DIRECTION_OUT, data, size,274 0, NULL, callback, arg, "Bulk OUT");275 }276 /*----------------------------------------------------------------------------*/277 /** Bulk in transaction interface function278 *279 * @param[in] fun DDF function that was called.280 * @param[in] target USB device to write to.281 * @param[out] data Data destination.282 * @param[in] size Size of data source.283 * @param[in] callback Function to call on transaction completion284 * @param[in] arg Additional for callback function.285 * @return Error code.286 */287 static int bulk_in(288 ddf_fun_t *fun, usb_target_t target, void *data,289 size_t size, usbhc_iface_transfer_in_callback_t callback, void *arg)290 {291 return send_batch(fun, target, USB_DIRECTION_IN, data, size,292 0, callback, NULL, arg, "Bulk IN");293 }294 /*----------------------------------------------------------------------------*/295 /** Control write transaction interface function296 *297 * @param[in] fun DDF function that was called.298 * @param[in] target USB device to write to.299 * @param[in] setup_data Data to send with SETUP transfer.300 * @param[in] setup_size Size of data to send with SETUP transfer (always 8B).301 * @param[in] data Source of data.302 * @param[in] size Size of data source.303 * @param[in] callback Function to call on transaction completion.304 * @param[in] arg Additional for callback function.305 * @return Error code.306 */307 static int control_write(308 ddf_fun_t *fun, usb_target_t target,309 void *setup_data, size_t setup_size, void *data, size_t size,310 usbhc_iface_transfer_out_callback_t callback, void *arg)311 {312 uint64_t setup_buffer;313 memcpy(&setup_buffer, setup_data, 8);314 return send_batch(fun, target, USB_DIRECTION_BOTH, data, size,315 setup_buffer, NULL, callback, arg, "Control WRITE");316 }317 /*----------------------------------------------------------------------------*/318 /** Control read transaction interface function319 *320 * @param[in] fun DDF function that was called.321 * @param[in] target USB device to write to.322 * @param[in] setup_data Data to send with SETUP packet.323 * @param[in] setup_size Size of data to send with SETUP packet (should be 8B).324 * @param[out] data Source of data.325 * @param[in] size Size of data source.326 * @param[in] callback Function to call on transaction completion.327 * @param[in] arg Additional for callback function.328 * @return Error code.329 */330 static int control_read(331 ddf_fun_t *fun, usb_target_t target,332 void *setup_data, size_t setup_size, void *data, size_t size,333 usbhc_iface_transfer_in_callback_t callback, void *arg)334 {335 uint64_t setup_buffer;336 memcpy(&setup_buffer, setup_data, 8);337 return send_batch(fun, target, USB_DIRECTION_BOTH, data, size,338 setup_buffer, callback, NULL, arg, "Control READ");339 }340 /*----------------------------------------------------------------------------*/341 223 static int usb_read(ddf_fun_t *fun, usb_target_t target, uint64_t setup_data, 342 224 uint8_t *data, size_t size, usbhc_iface_transfer_in_callback_t callback, … … 364 246 .unregister_endpoint = unregister_endpoint, 365 247 366 .interrupt_out = interrupt_out,367 .interrupt_in = interrupt_in,368 369 .bulk_out = bulk_out,370 .bulk_in = bulk_in,371 372 .control_write = control_write,373 .control_read = control_read,374 375 248 .read = usb_read, 376 249 .write = usb_write,
Note:
See TracChangeset
for help on using the changeset viewer.