Changeset 6a1211c in mainline
- Timestamp:
- 2017-12-18T13:50:39Z (7 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 1ea0bbf
- Parents:
- 7faf0f0
- Location:
- uspace/drv/bus/usb/usbdiag
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/bus/usb/usbdiag/device.c
r7faf0f0 r6a1211c 35 35 */ 36 36 #include <errno.h> 37 #include <str_error.h> 38 #include <macros.h> 37 39 #include <usb/debug.h> 38 40 #include <usbdiag_iface.h> … … 42 44 #define NAME "usbdiag" 43 45 46 static const usb_endpoint_description_t bulk_in_ep = { 47 .transfer_type = USB_TRANSFER_BULK, 48 .direction = USB_DIRECTION_IN, 49 .interface_class = 0xDC, 50 .interface_subclass = 0x00, 51 .interface_protocol = 0x01, 52 .flags = 0 53 }; 54 55 static const usb_endpoint_description_t bulk_out_ep = { 56 .transfer_type = USB_TRANSFER_BULK, 57 .direction = USB_DIRECTION_OUT, 58 .interface_class = 0xDC, 59 .interface_subclass = 0x00, 60 .interface_protocol = 0x01, 61 .flags = 0 62 }; 63 44 64 static int some_test(ddf_fun_t *fun, int x, int *y) 45 65 { 66 int rc = EOK; 67 usb_diag_dev_t *dev = ddf_fun_to_usb_diag_dev(fun); 68 69 const size_t size = min(dev->bulk_in->desc.max_packet_size, dev->bulk_out->desc.max_packet_size); 70 char *buffer = (char *) malloc(size); 71 memset(buffer, 42, sizeof(buffer)); 72 73 // Write buffer to device. 74 if ((rc = usb_pipe_write(dev->bulk_out, buffer, size))) { 75 usb_log_error("Bulk OUT write failed. %s\n", str_error(rc)); 76 } 77 78 // Read device's response. 79 size_t remaining = size; 80 size_t transferred; 81 while (remaining > 0) { 82 if ((rc = usb_pipe_read(dev->bulk_in, buffer + size - remaining, remaining, &transferred))) { 83 usb_log_error("Bulk IN read failed. %s\n", str_error(rc)); 84 break; 85 } 86 87 if (transferred > remaining) { 88 usb_log_error("Bulk IN read more than expected.\n"); 89 rc = EINVAL; 90 break; 91 } 92 93 remaining -= transferred; 94 } 95 96 // TODO: Check output? 97 98 free(buffer); 99 46 100 *y = x + 42; 47 return EOK;101 return rc; 48 102 } 49 103 … … 58 112 static int device_init(usb_diag_dev_t *dev) 59 113 { 114 int rc; 60 115 ddf_fun_t *fun = usb_device_ddf_fun_create(dev->usb_dev, fun_exposed, "tmon"); 61 if (!fun) 62 return ENOMEM; 116 if (!fun) { 117 rc = ENOMEM; 118 goto err; 119 } 63 120 64 121 ddf_fun_set_ops(fun, &diag_ops); 122 dev->fun = fun; 65 123 66 dev->fun = fun; 124 usb_endpoint_mapping_t *epm_out = usb_device_get_mapped_ep_desc(dev->usb_dev, &bulk_out_ep); 125 usb_endpoint_mapping_t *epm_in = usb_device_get_mapped_ep_desc(dev->usb_dev, &bulk_in_ep); 126 127 if (!epm_in || !epm_out || !epm_in->present || !epm_out->present) { 128 usb_log_error("Required EPs were not mapped.\n"); 129 rc = ENOENT; 130 goto err_fun; 131 } 132 133 dev->bulk_out = &epm_out->pipe; 134 dev->bulk_in = &epm_in->pipe; 135 67 136 return EOK; 137 138 err_fun: 139 ddf_fun_destroy(fun); 140 err: 141 return rc; 68 142 } 69 143 -
uspace/drv/bus/usb/usbdiag/device.h
r7faf0f0 r6a1211c 45 45 usb_device_t *usb_dev; 46 46 ddf_fun_t *fun; 47 usb_pipe_t *bulk_in; 48 usb_pipe_t *bulk_out; 47 49 } usb_diag_dev_t; 48 50 … … 50 52 void usb_diag_dev_destroy(usb_diag_dev_t *); 51 53 52 static inline usb_diag_dev_t * usb_d iag_dev_get(usb_device_t *usb_dev)54 static inline usb_diag_dev_t * usb_device_to_usb_diag_dev(usb_device_t *usb_dev) 53 55 { 54 56 assert(usb_dev); 55 57 return usb_device_data_get(usb_dev); 58 } 59 60 static inline usb_diag_dev_t * ddf_dev_to_usb_diag_dev(ddf_dev_t *ddf_dev) 61 { 62 assert(ddf_dev); 63 return usb_device_to_usb_diag_dev(usb_device_get(ddf_dev)); 64 } 65 66 static inline usb_diag_dev_t * ddf_fun_to_usb_diag_dev(ddf_fun_t *ddf_fun) 67 { 68 assert(ddf_fun); 69 return ddf_dev_to_usb_diag_dev(ddf_fun_get_dev(ddf_fun)); 56 70 } 57 71 -
uspace/drv/bus/usb/usbdiag/main.c
r7faf0f0 r6a1211c 82 82 usb_log_info("Removing device '%s'", usb_device_get_name(dev)); 83 83 84 usb_diag_dev_t *diag_dev = usb_d iag_dev_get(dev);84 usb_diag_dev_t *diag_dev = usb_device_to_usb_diag_dev(dev); 85 85 86 86 /* TODO: Make sure nothing is going on with the device. */ … … 103 103 usb_log_info("Device '%s' gone.", usb_device_get_name(dev)); 104 104 105 usb_diag_dev_t *diag_dev = usb_d iag_dev_get(dev);105 usb_diag_dev_t *diag_dev = usb_device_to_usb_diag_dev(dev); 106 106 107 107 /* TODO: Make sure nothing is going on with the device. */
Note:
See TracChangeset
for help on using the changeset viewer.