Changeset 9efad54 in mainline for uspace/lib/usbhost
- Timestamp:
- 2018-01-06T21:15:48Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 56257ba
- Parents:
- c901632
- Location:
- uspace/lib/usbhost
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usbhost/include/usb/host/bus.h
rc901632 r9efad54 109 109 int (*device_offline)(device_t *); /**< Optional */ 110 110 endpoint_t *(*device_find_endpoint)(device_t*, usb_target_t, usb_direction_t); 111 endpoint_t *(*endpoint_create)(device_t *, const usb_endpoint_desc _t *);111 endpoint_t *(*endpoint_create)(device_t *, const usb_endpoint_descriptors_t *); 112 112 113 113 /* Operations on endpoint */ … … 163 163 const char *); 164 164 165 int bus_endpoint_add(device_t *, const usb_endpoint_desc _t *, endpoint_t **);165 int bus_endpoint_add(device_t *, const usb_endpoint_descriptors_t *, endpoint_t **); 166 166 endpoint_t *bus_find_endpoint(device_t *, usb_target_t, usb_direction_t); 167 167 int bus_endpoint_remove(endpoint_t *); -
uspace/lib/usbhost/include/usb/host/endpoint.h
rc901632 r9efad54 46 46 #include <usb/usb.h> 47 47 #include <usb/host/bus.h> 48 #include <usbhc_iface.h> 48 49 49 50 typedef struct bus bus_t; … … 59 60 /** Reference count. */ 60 61 atomic_t refcnt; 61 /** Enpoint number */62 usb_endpoint_t endpoint;63 /** Communication direction. */64 usb_direction_t direction;65 /** USB transfer type. */66 usb_transfer_type_t transfer_type;67 /** Maximum size of data packets. */68 size_t max_packet_size;69 /** Additional opportunities per uframe */70 unsigned packets;71 62 /** Reserved bandwidth. */ 72 63 size_t bandwidth; … … 80 71 fibril_condvar_t avail; 81 72 73 /** Enpoint number */ 74 usb_endpoint_t endpoint; 75 /** Communication direction. */ 76 usb_direction_t direction; 77 /** USB transfer type. */ 78 usb_transfer_type_t transfer_type; 79 /** Maximum size of one packet */ 80 size_t max_packet_size; 81 82 /** Maximum size of one transfer */ 83 size_t max_transfer_size; 84 /** Number of packats that can be sent in one service interval (not necessarily uframe) */ 85 unsigned packets_per_uframe; 86 82 87 /* This structure is meant to be extended by overriding. */ 83 88 } endpoint_t; 84 89 85 extern void endpoint_init(endpoint_t *, device_t *, const usb_endpoint_desc _t *);90 extern void endpoint_init(endpoint_t *, device_t *, const usb_endpoint_descriptors_t *); 86 91 87 92 extern void endpoint_add_ref(endpoint_t *); -
uspace/lib/usbhost/src/bus.c
rc901632 r9efad54 128 128 } 129 129 130 int bus_endpoint_add(device_t *device, const usb_endpoint_desc _t *desc, endpoint_t **out_ep)130 int bus_endpoint_add(device_t *device, const usb_endpoint_descriptors_t *desc, endpoint_t **out_ep) 131 131 { 132 132 int err; … … 134 134 135 135 bus_t *bus = device->bus; 136 137 if (desc->max_packet_size == 0 || desc->packets == 0) {138 usb_log_warning("Invalid endpoint description (mps %zu, %u packets)", desc->max_packet_size, desc->packets);139 return EINVAL;140 }141 136 142 137 const bus_ops_t *create_ops = BUS_OPS_LOOKUP(bus->ops, endpoint_create); … … 149 144 return ENOMEM; 150 145 151 /* Temporaryreference */146 /* Bus reference */ 152 147 endpoint_add_ref(ep); 148 149 if (ep->max_transfer_size == 0) { 150 usb_log_warning("Invalid endpoint description (mps %zu, " 151 "%u packets)", ep->max_packet_size, ep->packets_per_uframe); 152 /* Bus reference */ 153 endpoint_del_ref(ep); 154 return EINVAL; 155 } 156 157 usb_log_debug("Register endpoint %d:%d %s-%s %zuB.\n", 158 device->address, ep->endpoint, 159 usb_str_transfer_type(ep->transfer_type), 160 usb_str_direction(ep->direction), 161 ep->max_transfer_size); 153 162 154 163 fibril_mutex_lock(&bus->guard); … … 162 171 } 163 172 164 /* Temporary reference */165 endpoint_del_ref(ep);166 173 return err; 167 174 } … … 193 200 { 194 201 assert(ep); 202 assert(ep->device); 203 assert(ep->device->bus); 204 assert(ep->device->bus->ops); 195 205 196 206 bus_t *bus = endpoint_get_bus(ep); 197 207 198 const bus_ops_t *ops = BUS_OPS_LOOKUP(ep->device->bus->ops, endpoint_unregister); 199 if (!ops) 200 return ENOTSUP; 208 const bus_ops_t *ops = BUS_OPS_LOOKUP(bus->ops, endpoint_unregister); 209 if (!ops) 210 return ENOTSUP; 211 212 usb_log_debug("Unregister endpoint %d:%d %s-%s %zuB.\n", 213 ep->device->address, ep->endpoint, 214 usb_str_transfer_type(ep->transfer_type), 215 usb_str_direction(ep->direction), 216 ep->max_transfer_size); 201 217 202 218 fibril_mutex_lock(&bus->guard); -
uspace/lib/usbhost/src/ddf_helpers.c
rc901632 r9efad54 50 50 51 51 #include "bus.h" 52 #include "endpoint.h" 52 53 53 54 #include "ddf_helpers.h" … … 65 66 * @return Error code. 66 67 */ 67 static int register_endpoint( 68 ddf_fun_t *fun, usb_endpoint_desc_t *endpoint_desc)68 static int register_endpoint(ddf_fun_t *fun, usb_pipe_desc_t *pipe_desc, 69 const usb_endpoint_descriptors_t *ep_desc) 69 70 { 70 71 assert(fun); … … 75 76 assert(dev); 76 77 77 usb_log_debug("Register endpoint %d:%d %s-%s %zuB %ums.\n", 78 dev->address, endpoint_desc->endpoint_no, 79 usb_str_transfer_type(endpoint_desc->transfer_type), 80 usb_str_direction(endpoint_desc->direction), 81 endpoint_desc->max_packet_size, endpoint_desc->interval); 82 83 return bus_endpoint_add(dev, endpoint_desc, NULL); 78 endpoint_t *ep; 79 const int err = bus_endpoint_add(dev, ep_desc, &ep); 80 if (err) 81 return err; 82 83 if (pipe_desc) { 84 pipe_desc->endpoint_no = ep->endpoint; 85 pipe_desc->direction = ep->direction; 86 pipe_desc->transfer_type = ep->transfer_type; 87 pipe_desc->max_transfer_size = ep->max_transfer_size; 88 } 89 endpoint_del_ref(ep); 90 91 return EOK; 84 92 } 85 93 … … 89 97 * @return Error code. 90 98 */ 91 static int unregister_endpoint( 92 ddf_fun_t *fun, usb_endpoint_desc_t *endpoint_desc) 99 static int unregister_endpoint(ddf_fun_t *fun, const usb_pipe_desc_t *endpoint_desc) 93 100 { 94 101 assert(fun); … … 103 110 .endpoint = endpoint_desc->endpoint_no 104 111 }}; 105 106 usb_log_debug("Unregister endpoint %d:%d %s.\n",107 dev->address, endpoint_desc->endpoint_no,108 usb_str_direction(endpoint_desc->direction));109 112 110 113 endpoint_t *ep = bus_find_endpoint(dev, target, endpoint_desc->direction); -
uspace/lib/usbhost/src/endpoint.c
rc901632 r9efad54 41 41 #include <str_error.h> 42 42 #include <usb/debug.h> 43 #include <usb/descriptor.h> 43 44 #include <usb/host/hcd.h> 44 45 … … 50 51 /** Initialize provided endpoint structure. 51 52 */ 52 void endpoint_init(endpoint_t *ep, device_t *dev, const usb_endpoint_desc _t *desc)53 void endpoint_init(endpoint_t *ep, device_t *dev, const usb_endpoint_descriptors_t *desc) 53 54 { 54 55 memset(ep, 0, sizeof(endpoint_t)); … … 62 63 fibril_condvar_initialize(&ep->avail); 63 64 64 ep->endpoint = desc->endpoint_no; 65 ep->direction = desc->direction; 66 ep->transfer_type = desc->transfer_type; 67 ep->max_packet_size = desc->max_packet_size; 68 ep->packets = desc->packets; 69 70 ep->bandwidth = endpoint_count_bw(ep, desc->max_packet_size); 65 ep->endpoint = USB_ED_GET_EP(desc->endpoint); 66 ep->direction = USB_ED_GET_DIR(desc->endpoint); 67 ep->transfer_type = USB_ED_GET_TRANSFER_TYPE(desc->endpoint); 68 ep->max_packet_size = USB_ED_GET_MPS(desc->endpoint); 69 ep->packets_per_uframe = USB_ED_GET_ADD_OPPS(desc->endpoint) + 1; 70 71 /** Direction both is our construct never present in descriptors */ 72 if (ep->transfer_type == USB_TRANSFER_CONTROL) 73 ep->direction = USB_DIRECTION_BOTH; 74 75 ep->max_transfer_size = ep->max_packet_size * ep->packets_per_uframe; 76 77 ep->bandwidth = endpoint_count_bw(ep, ep->max_transfer_size); 71 78 } 72 79 -
uspace/lib/usbhost/src/usb2_bus.c
rc901632 r9efad54 186 186 } 187 187 188 static const usb_endpoint_desc_t usb2_default_control_ep = {189 .endpoint_no = 0,190 .transfer_type = USB_TRANSFER_CONTROL,191 .direction = USB_DIRECTION_BOTH,192 .max_packet_size = CTRL_PIPE_MIN_PACKET_SIZE,193 .packets = 1,194 };195 196 197 188 static const usb_target_t usb2_default_target = {{ 198 189 .address = USB_ADDRESS_DEFAULT, … … 221 212 usb_log_debug("Device(%d): Adding default target (0:0)", address); 222 213 214 usb_endpoint_descriptors_t ep0_desc = { 215 .endpoint.max_packet_size = CTRL_PIPE_MIN_PACKET_SIZE, 216 }; 223 217 endpoint_t *default_ep; 224 err = bus_endpoint_add(dev, & usb2_default_control_ep, &default_ep);218 err = bus_endpoint_add(dev, &ep0_desc, &default_ep); 225 219 if (err != EOK) { 226 220 usb_log_error("Device(%d): Failed to add default target: %s.", … … 229 223 } 230 224 231 uint16_t max_packet_size; 232 if ((err = hcd_get_ep0_max_packet_size(&max_packet_size, &bus->base, dev))) 225 if ((err = hcd_get_ep0_max_packet_size(&ep0_desc.endpoint.max_packet_size, &bus->base, dev))) 233 226 goto err_address; 234 227 … … 254 247 dev->address = address; 255 248 256 const usb_endpoint_desc_t control_ep = {257 .endpoint_no = 0,258 .transfer_type = USB_TRANSFER_CONTROL,259 .direction = USB_DIRECTION_BOTH,260 .max_packet_size = max_packet_size,261 .packets = 1,262 };263 264 249 /* Register EP on the new address */ 265 250 usb_log_debug("Device(%d): Registering control EP.", address); 266 err = bus_endpoint_add(dev, & control_ep, NULL);251 err = bus_endpoint_add(dev, &ep0_desc, NULL); 267 252 if (err != EOK) { 268 253 usb_log_error("Device(%d): Failed to register EP0: %s", … … 352 337 } 353 338 354 static endpoint_t *usb2_bus_create_ep(device_t *dev, const usb_endpoint_desc _t *desc)339 static endpoint_t *usb2_bus_create_ep(device_t *dev, const usb_endpoint_descriptors_t *desc) 355 340 { 356 341 endpoint_t *ep = malloc(sizeof(endpoint_t));
Note:
See TracChangeset
for help on using the changeset viewer.