Changeset e099f26 in mainline for uspace/lib/usb
- Timestamp:
- 2011-03-21T20:22:50Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- c56c5b5b
- Parents:
- 4fb6d9ee (diff), 31b568e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- uspace/lib/usb
- Files:
-
- 3 added
- 17 edited
- 1 moved
-
Makefile (modified) (1 diff)
-
include/usb/classes/hub.h (modified) (1 diff)
-
include/usb/debug.h (modified) (1 diff)
-
include/usb/devdrv.h (modified) (3 diffs)
-
include/usb/host/batch.h (added)
-
include/usb/host/device_keeper.h (added)
-
include/usb/pipes.h (modified) (3 diffs)
-
include/usb/recognise.h (modified) (1 diff)
-
include/usb/request.h (modified) (1 diff)
-
include/usb/usb.h (modified) (2 diffs)
-
src/devdrv.c (modified) (9 diffs)
-
src/devpoll.c (modified) (3 diffs)
-
src/host/batch.c (added)
-
src/host/device_keeper.c (moved) (moved from uspace/drv/uhci-hcd/utils/device_keeper.c ) (19 diffs)
-
src/hub.c (modified) (5 diffs)
-
src/pipes.c (modified) (6 diffs)
-
src/pipesinit.c (modified) (10 diffs)
-
src/pipesio.c (modified) (16 diffs)
-
src/recognise.c (modified) (7 diffs)
-
src/request.c (modified) (18 diffs)
-
src/usb.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usb/Makefile
r4fb6d9ee re099f26 49 49 src/request.c \ 50 50 src/usb.c \ 51 src/usbdevice.c 51 src/usbdevice.c \ 52 src/host/device_keeper.c \ 53 src/host/batch.c 52 54 53 55 include $(USPACE_PREFIX)/Makefile.common -
uspace/lib/usb/include/usb/classes/hub.h
r4fb6d9ee re099f26 60 60 } usb_hub_class_feature_t; 61 61 62 /** Header of standard hub descriptor without the "variadic" part. */ 63 typedef struct { 64 /** Descriptor length. */ 65 uint8_t length; 66 /** Descriptor type (0x29). */ 67 uint8_t descriptor_type; 68 /** Number of downstream ports. */ 69 uint8_t port_count; 70 /** Characteristics bitmask. */ 71 uint16_t characteristics; 72 /** Time from power-on to stabilization of current on the port. */ 73 uint8_t power_good_time; 74 /** Maximum current requirements in mA. */ 75 uint8_t max_current; 76 } __attribute__ ((packed)) usb_hub_descriptor_header_t; 62 77 63 78 /** -
uspace/lib/usb/include/usb/debug.h
r4fb6d9ee re099f26 79 79 } usb_log_level_t; 80 80 81 /** Default log level. */ 82 #define USB_LOG_LEVEL_DEFAULT USB_LOG_LEVEL_DEBUG 83 81 84 82 85 void usb_log_enable(usb_log_level_t, const char *); -
uspace/lib/usb/include/usb/devdrv.h
r4fb6d9ee re099f26 38 38 #include <usb/pipes.h> 39 39 40 /** Descriptors for USB device. */ 41 typedef struct { 42 /** Standard device descriptor. */ 43 usb_standard_device_descriptor_t device; 44 /** Full configuration descriptor of current configuration. */ 45 uint8_t *configuration; 46 size_t configuration_size; 47 } usb_device_descriptors_t; 48 40 49 /** USB device structure. */ 41 50 typedef struct { 42 51 /** The default control pipe. */ 43 usb_ endpoint_pipe_t ctrl_pipe;52 usb_pipe_t ctrl_pipe; 44 53 /** Other endpoint pipes. 45 54 * This is an array of other endpoint pipes in the same order as … … 52 61 */ 53 62 int interface_no; 63 64 /** Some useful descriptors. */ 65 usb_device_descriptors_t descriptors; 66 54 67 /** Generic DDF device backing this one. */ 55 68 ddf_dev_t *ddf_dev; … … 79 92 */ 80 93 const char *name; 81 /** Expected endpoints description. */ 94 /** Expected endpoints description, excluding default control endpoint. 95 * 96 * It MUST be of size expected_enpoints_count(excluding default ctrl) + 1 97 * where the last record MUST BE NULL, otherwise catastrophic things may 98 * happen. 99 */ 82 100 usb_endpoint_description_t **endpoints; 83 101 /** Driver ops. */ -
uspace/lib/usb/include/usb/pipes.h
r4fb6d9ee re099f26 80 80 */ 81 81 int hc_phone; 82 } usb_ endpoint_pipe_t;82 } usb_pipe_t; 83 83 84 84 … … 102 102 typedef struct { 103 103 /** Endpoint pipe. */ 104 usb_ endpoint_pipe_t *pipe;104 usb_pipe_t *pipe; 105 105 /** Endpoint description. */ 106 106 const usb_endpoint_description_t *description; … … 125 125 usb_address_t usb_device_get_assigned_address(devman_handle_t); 126 126 127 int usb_endpoint_pipe_initialize(usb_endpoint_pipe_t *, 128 usb_device_connection_t *, 127 int usb_pipe_initialize(usb_pipe_t *, usb_device_connection_t *, 129 128 usb_endpoint_t, usb_transfer_type_t, size_t, usb_direction_t); 130 int usb_ endpoint_pipe_initialize_default_control(usb_endpoint_pipe_t *,129 int usb_pipe_initialize_default_control(usb_pipe_t *, 131 130 usb_device_connection_t *); 132 int usb_ endpoint_pipe_probe_default_control(usb_endpoint_pipe_t *);133 int usb_ endpoint_pipe_initialize_from_configuration(usb_endpoint_mapping_t *,131 int usb_pipe_probe_default_control(usb_pipe_t *); 132 int usb_pipe_initialize_from_configuration(usb_endpoint_mapping_t *, 134 133 size_t, uint8_t *, size_t, usb_device_connection_t *); 135 int usb_endpoint_pipe_register(usb_endpoint_pipe_t *, unsigned int, 136 usb_hc_connection_t *); 137 int usb_endpoint_pipe_unregister(usb_endpoint_pipe_t *, usb_hc_connection_t *); 134 int usb_pipe_register(usb_pipe_t *, unsigned int, usb_hc_connection_t *); 135 int usb_pipe_unregister(usb_pipe_t *, usb_hc_connection_t *); 138 136 139 int usb_ endpoint_pipe_start_session(usb_endpoint_pipe_t *);140 int usb_ endpoint_pipe_end_session(usb_endpoint_pipe_t *);141 bool usb_ endpoint_pipe_is_session_started(usb_endpoint_pipe_t *);137 int usb_pipe_start_session(usb_pipe_t *); 138 int usb_pipe_end_session(usb_pipe_t *); 139 bool usb_pipe_is_session_started(usb_pipe_t *); 142 140 143 int usb_ endpoint_pipe_read(usb_endpoint_pipe_t *, void *, size_t, size_t *);144 int usb_ endpoint_pipe_write(usb_endpoint_pipe_t *, void *, size_t);141 int usb_pipe_read(usb_pipe_t *, void *, size_t, size_t *); 142 int usb_pipe_write(usb_pipe_t *, void *, size_t); 145 143 146 int usb_ endpoint_pipe_control_read(usb_endpoint_pipe_t *, void *, size_t,144 int usb_pipe_control_read(usb_pipe_t *, void *, size_t, 147 145 void *, size_t, size_t *); 148 int usb_ endpoint_pipe_control_write(usb_endpoint_pipe_t *, void *, size_t,146 int usb_pipe_control_write(usb_pipe_t *, void *, size_t, 149 147 void *, size_t); 150 148 -
uspace/lib/usb/include/usb/recognise.h
r4fb6d9ee re099f26 48 48 const usb_standard_interface_descriptor_t *, match_id_list_t *); 49 49 50 int usb_device_create_match_ids(usb_ endpoint_pipe_t *, match_id_list_t *);50 int usb_device_create_match_ids(usb_pipe_t *, match_id_list_t *); 51 51 52 52 int usb_device_register_child_in_devman(usb_address_t, devman_handle_t, -
uspace/lib/usb/include/usb/request.h
r4fb6d9ee re099f26 86 86 } __attribute__ ((packed)) usb_device_request_setup_packet_t; 87 87 88 int usb_control_request_set(usb_ endpoint_pipe_t *,88 int usb_control_request_set(usb_pipe_t *, 89 89 usb_request_type_t, usb_request_recipient_t, uint8_t, 90 90 uint16_t, uint16_t, void *, size_t); 91 91 92 int usb_control_request_get(usb_ endpoint_pipe_t *,92 int usb_control_request_get(usb_pipe_t *, 93 93 usb_request_type_t, usb_request_recipient_t, uint8_t, 94 94 uint16_t, uint16_t, void *, size_t, size_t *); 95 95 96 int usb_request_set_address(usb_endpoint_pipe_t *, usb_address_t); 97 int usb_request_get_descriptor(usb_endpoint_pipe_t *, usb_request_type_t, 96 int usb_request_get_status(usb_pipe_t *, usb_request_recipient_t, 97 uint16_t, uint16_t *); 98 int usb_request_clear_feature(usb_pipe_t *, usb_request_type_t, 99 usb_request_recipient_t, uint16_t, uint16_t); 100 int usb_request_set_feature(usb_pipe_t *, usb_request_type_t, 101 usb_request_recipient_t, uint16_t, uint16_t); 102 int usb_request_set_address(usb_pipe_t *, usb_address_t); 103 int usb_request_get_descriptor(usb_pipe_t *, usb_request_type_t, 98 104 usb_request_recipient_t, uint8_t, uint8_t, uint16_t, void *, size_t, 99 105 size_t *); 100 int usb_request_get_descriptor_alloc(usb_ endpoint_pipe_t *, usb_request_type_t,106 int usb_request_get_descriptor_alloc(usb_pipe_t *, usb_request_type_t, 101 107 usb_request_recipient_t, uint8_t, uint8_t, uint16_t, void **, size_t *); 102 int usb_request_get_device_descriptor(usb_ endpoint_pipe_t *,108 int usb_request_get_device_descriptor(usb_pipe_t *, 103 109 usb_standard_device_descriptor_t *); 104 int usb_request_get_bare_configuration_descriptor(usb_ endpoint_pipe_t *, int,110 int usb_request_get_bare_configuration_descriptor(usb_pipe_t *, int, 105 111 usb_standard_configuration_descriptor_t *); 106 int usb_request_get_full_configuration_descriptor(usb_ endpoint_pipe_t *, int,112 int usb_request_get_full_configuration_descriptor(usb_pipe_t *, int, 107 113 void *, size_t, size_t *); 108 int usb_request_get_full_configuration_descriptor_alloc(usb_ endpoint_pipe_t *,114 int usb_request_get_full_configuration_descriptor_alloc(usb_pipe_t *, 109 115 int, void **, size_t *); 110 int usb_request_set_configuration(usb_endpoint_pipe_t *, uint8_t); 116 int usb_request_set_descriptor(usb_pipe_t *, usb_request_type_t, 117 usb_request_recipient_t, uint8_t, uint8_t, uint16_t, void *, size_t); 118 int usb_request_get_configuration(usb_pipe_t *, uint8_t *); 119 int usb_request_set_configuration(usb_pipe_t *, uint8_t); 120 int usb_request_get_interface(usb_pipe_t *, uint8_t, uint8_t *); 121 int usb_request_set_interface(usb_pipe_t *, uint8_t, uint8_t); 111 122 112 int usb_request_get_supported_languages(usb_ endpoint_pipe_t *,123 int usb_request_get_supported_languages(usb_pipe_t *, 113 124 l18_win_locales_t **, size_t *); 114 int usb_request_get_string(usb_ endpoint_pipe_t *, size_t, l18_win_locales_t,125 int usb_request_get_string(usb_pipe_t *, size_t, l18_win_locales_t, 115 126 char **); 116 127 -
uspace/lib/usb/include/usb/usb.h
r4fb6d9ee re099f26 61 61 62 62 const char * usb_str_transfer_type(usb_transfer_type_t t); 63 const char * usb_str_transfer_type_short(usb_transfer_type_t t); 63 64 64 65 /** USB data transfer direction. */ … … 78 79 USB_SPEED_HIGH 79 80 } usb_speed_t; 81 82 const char *usb_str_speed(usb_speed_t); 83 80 84 81 85 /** USB request type target. */ -
uspace/lib/usb/src/devdrv.c
r4fb6d9ee re099f26 126 126 127 127 for (i = 0; i < pipe_count; i++) { 128 dev->pipes[i].pipe = malloc(sizeof(usb_ endpoint_pipe_t));128 dev->pipes[i].pipe = malloc(sizeof(usb_pipe_t)); 129 129 if (dev->pipes[i].pipe == NULL) { 130 130 usb_log_oom(dev->ddf_dev); … … 137 137 } 138 138 139 void *config_descriptor; 140 size_t config_descriptor_size; 141 rc = usb_request_get_full_configuration_descriptor_alloc( 142 &dev->ctrl_pipe, 0, &config_descriptor, &config_descriptor_size); 143 if (rc != EOK) { 144 usb_log_error("Failed retrieving configuration of `%s': %s.\n", 145 dev->ddf_dev->name, str_error(rc)); 146 goto rollback; 147 } 148 149 rc = usb_endpoint_pipe_initialize_from_configuration(dev->pipes, 150 pipe_count, config_descriptor, config_descriptor_size, &dev->wire); 139 rc = usb_pipe_initialize_from_configuration(dev->pipes, pipe_count, 140 dev->descriptors.configuration, dev->descriptors.configuration_size, 141 &dev->wire); 151 142 if (rc != EOK) { 152 143 usb_log_error("Failed initializing USB endpoints: %s.\n", … … 172 163 for (i = 0; i < pipe_count; i++) { 173 164 if (dev->pipes[i].present) { 174 rc = usb_ endpoint_pipe_register(dev->pipes[i].pipe,165 rc = usb_pipe_register(dev->pipes[i].pipe, 175 166 dev->pipes[i].descriptor->poll_interval, 176 167 &hc_conn); … … 206 197 * @return Error code. 207 198 */ 208 static int initialize_pipes(usb_d river_t *drv, usb_device_t *dev)199 static int initialize_pipes(usb_device_t *dev) 209 200 { 210 201 int rc; … … 219 210 } 220 211 221 rc = usb_ endpoint_pipe_initialize_default_control(&dev->ctrl_pipe,212 rc = usb_pipe_initialize_default_control(&dev->ctrl_pipe, 222 213 &dev->wire); 223 214 if (rc != EOK) { … … 228 219 } 229 220 230 rc = usb_ endpoint_pipe_probe_default_control(&dev->ctrl_pipe);221 rc = usb_pipe_probe_default_control(&dev->ctrl_pipe); 231 222 if (rc != EOK) { 232 223 usb_log_error( … … 237 228 238 229 /* 239 * Initialization of other pipes requires open session on 240 * default control pipe. 230 * For further actions, we need open session on default control pipe. 241 231 */ 242 rc = usb_ endpoint_pipe_start_session(&dev->ctrl_pipe);232 rc = usb_pipe_start_session(&dev->ctrl_pipe); 243 233 if (rc != EOK) { 244 234 usb_log_error("Failed to start an IPC session: %s.\n", 245 235 str_error(rc)); 236 return rc; 237 } 238 239 /* Get the device descriptor. */ 240 rc = usb_request_get_device_descriptor(&dev->ctrl_pipe, 241 &dev->descriptors.device); 242 if (rc != EOK) { 243 usb_log_error("Failed to retrieve device descriptor: %s.\n", 244 str_error(rc)); 245 return rc; 246 } 247 248 /* Get the full configuration descriptor. */ 249 rc = usb_request_get_full_configuration_descriptor_alloc( 250 &dev->ctrl_pipe, 0, (void **) &dev->descriptors.configuration, 251 &dev->descriptors.configuration_size); 252 if (rc != EOK) { 253 usb_log_error("Failed retrieving configuration descriptor: %s.\n", 254 dev->ddf_dev->name, str_error(rc)); 246 255 return rc; 247 256 } … … 252 261 253 262 /* No checking here. */ 254 usb_endpoint_pipe_end_session(&dev->ctrl_pipe); 263 usb_pipe_end_session(&dev->ctrl_pipe); 264 265 /* Rollback actions. */ 266 if (rc != EOK) { 267 if (dev->descriptors.configuration != NULL) { 268 free(dev->descriptors.configuration); 269 } 270 } 255 271 256 272 return rc; … … 283 299 dev->ddf_dev->driver_data = dev; 284 300 dev->driver_data = NULL; 285 286 rc = initialize_pipes(driver, dev); 301 dev->descriptors.configuration = NULL; 302 303 rc = initialize_pipes(dev); 287 304 if (rc != EOK) { 288 305 free(dev); -
uspace/lib/usb/src/devpoll.c
r4fb6d9ee re099f26 64 64 assert(polling_data); 65 65 66 usb_ endpoint_pipe_t *pipe66 usb_pipe_t *pipe 67 67 = polling_data->dev->pipes[polling_data->pipe_index].pipe; 68 68 … … 71 71 int rc; 72 72 73 rc = usb_ endpoint_pipe_start_session(pipe);73 rc = usb_pipe_start_session(pipe); 74 74 if (rc != EOK) { 75 75 failed_attempts++; … … 78 78 79 79 size_t actual_size; 80 rc = usb_ endpoint_pipe_read(pipe, polling_data->buffer,80 rc = usb_pipe_read(pipe, polling_data->buffer, 81 81 polling_data->request_size, &actual_size); 82 82 83 83 /* Quit the session regardless of errors. */ 84 usb_ endpoint_pipe_end_session(pipe);84 usb_pipe_end_session(pipe); 85 85 86 86 if (rc != EOK) { -
uspace/lib/usb/src/host/device_keeper.c
r4fb6d9ee re099f26 27 27 */ 28 28 29 /** @addtogroup drvusbuhcihc29 /** @addtogroup libusb 30 30 * @{ 31 31 */ 32 32 /** @file 33 * @brief UHCI driver33 * Device keeper structure and functions (implementation). 34 34 */ 35 35 #include <assert.h> 36 36 #include <errno.h> 37 37 #include <usb/debug.h> 38 39 #include "device_keeper.h" 38 #include <usb/host/device_keeper.h> 40 39 41 40 /*----------------------------------------------------------------------------*/ … … 46 45 * Set all values to false/0. 47 46 */ 48 void device_keeper_init(device_keeper_t *instance)47 void usb_device_keeper_init(usb_device_keeper_t *instance) 49 48 { 50 49 assert(instance); … … 56 55 instance->devices[i].occupied = false; 57 56 instance->devices[i].handle = 0; 58 instance->devices[i].toggle_status = 0; 57 instance->devices[i].toggle_status[0] = 0; 58 instance->devices[i].toggle_status[1] = 0; 59 59 } 60 60 } … … 65 65 * @param[in] speed Speed of the device requesting default address. 66 66 */ 67 void device_keeper_reserve_default(device_keeper_t *instance, usb_speed_t speed) 67 void usb_device_keeper_reserve_default_address(usb_device_keeper_t *instance, 68 usb_speed_t speed) 68 69 { 69 70 assert(instance); … … 83 84 * @param[in] speed Speed of the device requesting default address. 84 85 */ 85 void device_keeper_release_default(device_keeper_t *instance)86 void usb_device_keeper_release_default_address(usb_device_keeper_t *instance) 86 87 { 87 88 assert(instance); … … 100 101 * Really ugly one. 101 102 */ 102 void device_keeper_reset_if_need(103 device_keeper_t *instance, usb_target_t target, const unsigned char*data)103 void usb_device_keeper_reset_if_need(usb_device_keeper_t *instance, 104 usb_target_t target, const uint8_t *data) 104 105 { 105 106 assert(instance); … … 119 120 if (((data[0] & 0xf) == 1) && ((data[2] | data[3]) == 0)) { 120 121 /* endpoint number is < 16, thus first byte is enough */ 121 instance->devices[target.address].toggle_status &= 122 instance->devices[target.address].toggle_status[0] &= 123 ~(1 << data[4]); 124 instance->devices[target.address].toggle_status[1] &= 122 125 ~(1 << data[4]); 123 126 } … … 128 131 /* target must be device */ 129 132 if ((data[0] & 0xf) == 0) { 130 instance->devices[target.address].toggle_status = 0; 133 instance->devices[target.address].toggle_status[0] = 0; 134 instance->devices[target.address].toggle_status[1] = 0; 131 135 } 132 136 break; … … 141 145 * @return Error code 142 146 */ 143 int device_keeper_get_toggle(device_keeper_t *instance, usb_target_t target) 144 { 145 assert(instance); 147 int usb_device_keeper_get_toggle(usb_device_keeper_t *instance, 148 usb_target_t target, usb_direction_t direction) 149 { 150 assert(instance); 151 /* only control pipes are bi-directional and those do not need toggle */ 152 if (direction == USB_DIRECTION_BOTH) 153 return ENOENT; 146 154 int ret; 147 155 fibril_mutex_lock(&instance->guard); … … 152 160 ret = EINVAL; 153 161 } else { 154 ret = (instance->devices[target.address].toggle_status 162 ret = (instance->devices[target.address].toggle_status[direction] 155 163 >> target.endpoint) & 1; 156 164 } … … 166 174 * @return Error code. 167 175 */ 168 int device_keeper_set_toggle( 169 device_keeper_t *instance, usb_target_t target, bool toggle) 170 { 171 assert(instance); 176 int usb_device_keeper_set_toggle(usb_device_keeper_t *instance, 177 usb_target_t target, usb_direction_t direction, bool toggle) 178 { 179 assert(instance); 180 /* only control pipes are bi-directional and those do not need toggle */ 181 if (direction == USB_DIRECTION_BOTH) 182 return ENOENT; 172 183 int ret; 173 184 fibril_mutex_lock(&instance->guard); … … 179 190 } else { 180 191 if (toggle) { 181 instance->devices[target.address].toggle_status |=182 (1 << target.endpoint);192 instance->devices[target.address].toggle_status[direction] 193 |= (1 << target.endpoint); 183 194 } else { 184 instance->devices[target.address].toggle_status &=185 ~(1 << target.endpoint);195 instance->devices[target.address].toggle_status[direction] 196 &= ~(1 << target.endpoint); 186 197 } 187 198 ret = EOK; … … 197 208 * @return Free address, or error code. 198 209 */ 199 usb_address_t device_keeper_ request(200 device_keeper_t *instance,usb_speed_t speed)210 usb_address_t device_keeper_get_free_address(usb_device_keeper_t *instance, 211 usb_speed_t speed) 201 212 { 202 213 assert(instance); … … 218 229 instance->devices[new_address].occupied = true; 219 230 instance->devices[new_address].speed = speed; 220 instance->devices[new_address].toggle_status = 0; 231 instance->devices[new_address].toggle_status[0] = 0; 232 instance->devices[new_address].toggle_status[1] = 0; 221 233 instance->last_address = new_address; 222 234 fibril_mutex_unlock(&instance->guard); … … 230 242 * @param[in] handle Devman handle of the device. 231 243 */ 232 void device_keeper_bind(233 device_keeper_t *instance,usb_address_t address, devman_handle_t handle)244 void usb_device_keeper_bind(usb_device_keeper_t *instance, 245 usb_address_t address, devman_handle_t handle) 234 246 { 235 247 assert(instance); … … 247 259 * @param[in] address Device address 248 260 */ 249 void device_keeper_release(device_keeper_t *instance, usb_address_t address) 261 void usb_device_keeper_release(usb_device_keeper_t *instance, 262 usb_address_t address) 250 263 { 251 264 assert(instance); … … 265 278 * @return USB Address, or error code. 266 279 */ 267 usb_address_t device_keeper_find(268 dev ice_keeper_t *instance, devman_handle_t handle)280 usb_address_t usb_device_keeper_find(usb_device_keeper_t *instance, 281 devman_handle_t handle) 269 282 { 270 283 assert(instance); … … 288 301 * @return USB speed. 289 302 */ 290 usb_speed_t device_keeper_speed(291 device_keeper_t *instance,usb_address_t address)303 usb_speed_t usb_device_keeper_get_speed(usb_device_keeper_t *instance, 304 usb_address_t address) 292 305 { 293 306 assert(instance); … … 296 309 return instance->devices[address].speed; 297 310 } 311 298 312 /** 299 313 * @} -
uspace/lib/usb/src/hub.c
r4fb6d9ee re099f26 228 228 } 229 229 230 usb_ endpoint_pipe_t ctrl_pipe;231 rc = usb_ endpoint_pipe_initialize_default_control(&ctrl_pipe,230 usb_pipe_t ctrl_pipe; 231 rc = usb_pipe_initialize_default_control(&ctrl_pipe, 232 232 &dev_conn); 233 233 if (rc != EOK) { … … 235 235 goto leave_release_default_address; 236 236 } 237 rc = usb_ endpoint_pipe_probe_default_control(&ctrl_pipe);237 rc = usb_pipe_probe_default_control(&ctrl_pipe); 238 238 if (rc != EOK) { 239 239 rc = ENOTCONN; … … 241 241 } 242 242 243 rc = usb_ endpoint_pipe_start_session(&ctrl_pipe);243 rc = usb_pipe_start_session(&ctrl_pipe); 244 244 if (rc != EOK) { 245 245 rc = ENOTCONN; … … 253 253 } 254 254 255 usb_ endpoint_pipe_end_session(&ctrl_pipe);255 usb_pipe_end_session(&ctrl_pipe); 256 256 257 257 /* … … 306 306 307 307 leave_stop_session: 308 usb_ endpoint_pipe_end_session(&ctrl_pipe);308 usb_pipe_end_session(&ctrl_pipe); 309 309 310 310 leave_release_default_address: -
uspace/lib/usb/src/pipes.c
r4fb6d9ee re099f26 42 42 #include <assert.h> 43 43 44 #define IPC_AGAIN_DELAY (1000 * 2) /* 2ms */ 45 44 46 /** Tell USB address assigned to given device. 45 47 * … … 150 152 } 151 153 152 my_address = get_my_address(parent_phone, dev); 153 if (my_address < 0) { 154 rc = my_address; 155 goto leave; 156 } 154 /* 155 * Asking for "my" address may require several attempts. 156 * That is because following scenario may happen: 157 * - parent driver (i.e. driver of parent device) announces new device 158 * and devman launches current driver 159 * - parent driver is preempted and thus does not send address-handle 160 * binding to HC driver 161 * - this driver gets here and wants the binding 162 * - the HC does not know the binding yet and thus it answers ENOENT 163 * So, we need to wait for the HC to learn the binding. 164 */ 165 do { 166 my_address = get_my_address(parent_phone, dev); 167 168 if (my_address == ENOENT) { 169 /* Be nice, let other fibrils run and try again. */ 170 async_usleep(IPC_AGAIN_DELAY); 171 } else if (my_address < 0) { 172 /* Some other problem, no sense trying again. */ 173 rc = my_address; 174 goto leave; 175 } 176 177 } while (my_address < 0); 157 178 158 179 rc = usb_device_connection_initialize(connection, … … 212 233 * A session is something inside what any communication occurs. 213 234 * It is expected that sessions would be started right before the transfer 214 * and ended - see usb_ endpoint_pipe_end_session() - after the last235 * and ended - see usb_pipe_end_session() - after the last 215 236 * transfer. 216 237 * The reason for this is that session actually opens some communication … … 223 244 * @return Error code. 224 245 */ 225 int usb_ endpoint_pipe_start_session(usb_endpoint_pipe_t *pipe)246 int usb_pipe_start_session(usb_pipe_t *pipe) 226 247 { 227 248 assert(pipe); 228 249 229 if (usb_ endpoint_pipe_is_session_started(pipe)) {250 if (usb_pipe_is_session_started(pipe)) { 230 251 return EBUSY; 231 252 } … … 244 265 /** Ends a session on the endpoint pipe. 245 266 * 246 * @see usb_ endpoint_pipe_start_session267 * @see usb_pipe_start_session 247 268 * 248 269 * @param pipe Endpoint pipe to end the session on. 249 270 * @return Error code. 250 271 */ 251 int usb_ endpoint_pipe_end_session(usb_endpoint_pipe_t *pipe)272 int usb_pipe_end_session(usb_pipe_t *pipe) 252 273 { 253 274 assert(pipe); 254 275 255 if (!usb_ endpoint_pipe_is_session_started(pipe)) {276 if (!usb_pipe_is_session_started(pipe)) { 256 277 return ENOENT; 257 278 } … … 275 296 * @return Whether @p pipe has opened a session. 276 297 */ 277 bool usb_ endpoint_pipe_is_session_started(usb_endpoint_pipe_t *pipe)298 bool usb_pipe_is_session_started(usb_pipe_t *pipe) 278 299 { 279 300 return (pipe->hc_phone >= 0); -
uspace/lib/usb/src/pipesinit.c
r4fb6d9ee re099f26 193 193 } 194 194 195 int rc = usb_ endpoint_pipe_initialize(ep_mapping->pipe, wire,195 int rc = usb_pipe_initialize(ep_mapping->pipe, wire, 196 196 ep_no, description.transfer_type, endpoint->max_packet_size, 197 197 description.direction); … … 276 276 * @return Error code. 277 277 */ 278 int usb_ endpoint_pipe_initialize_from_configuration(278 int usb_pipe_initialize_from_configuration( 279 279 usb_endpoint_mapping_t *mapping, size_t mapping_count, 280 280 uint8_t *configuration_descriptor, size_t configuration_descriptor_size, … … 342 342 * @return Error code. 343 343 */ 344 int usb_ endpoint_pipe_initialize(usb_endpoint_pipe_t *pipe,344 int usb_pipe_initialize(usb_pipe_t *pipe, 345 345 usb_device_connection_t *connection, usb_endpoint_t endpoint_no, 346 346 usb_transfer_type_t transfer_type, size_t max_packet_size, … … 367 367 * @return Error code. 368 368 */ 369 int usb_ endpoint_pipe_initialize_default_control(usb_endpoint_pipe_t *pipe,369 int usb_pipe_initialize_default_control(usb_pipe_t *pipe, 370 370 usb_device_connection_t *connection) 371 371 { … … 373 373 assert(connection); 374 374 375 int rc = usb_ endpoint_pipe_initialize(pipe, connection,375 int rc = usb_pipe_initialize(pipe, connection, 376 376 0, USB_TRANSFER_CONTROL, CTRL_PIPE_MIN_PACKET_SIZE, 377 377 USB_DIRECTION_BOTH); … … 390 390 * @return Error code. 391 391 */ 392 int usb_ endpoint_pipe_probe_default_control(usb_endpoint_pipe_t *pipe)392 int usb_pipe_probe_default_control(usb_pipe_t *pipe) 393 393 { 394 394 assert(pipe); … … 408 408 409 409 TRY_LOOP(failed_attempts) { 410 rc = usb_ endpoint_pipe_start_session(pipe);410 rc = usb_pipe_start_session(pipe); 411 411 if (rc == EOK) { 412 412 break; … … 433 433 } 434 434 } 435 usb_ endpoint_pipe_end_session(pipe);435 usb_pipe_end_session(pipe); 436 436 if (rc != EOK) { 437 437 return rc; … … 451 451 * @return Error code. 452 452 */ 453 int usb_ endpoint_pipe_register(usb_endpoint_pipe_t *pipe,453 int usb_pipe_register(usb_pipe_t *pipe, 454 454 unsigned int interval, 455 455 usb_hc_connection_t *hc_connection) … … 479 479 * @return Error code. 480 480 */ 481 int usb_ endpoint_pipe_unregister(usb_endpoint_pipe_t *pipe,481 int usb_pipe_unregister(usb_pipe_t *pipe, 482 482 usb_hc_connection_t *hc_connection) 483 483 { -
uspace/lib/usb/src/pipesio.c
r4fb6d9ee re099f26 58 58 * @return Error code. 59 59 */ 60 static int usb_ endpoint_pipe_read_no_checks(usb_endpoint_pipe_t *pipe,60 static int usb_pipe_read_no_checks(usb_pipe_t *pipe, 61 61 void *buffer, size_t size, size_t *size_transfered) 62 62 { … … 140 140 * @return Error code. 141 141 */ 142 int usb_ endpoint_pipe_read(usb_endpoint_pipe_t *pipe,142 int usb_pipe_read(usb_pipe_t *pipe, 143 143 void *buffer, size_t size, size_t *size_transfered) 144 144 { … … 153 153 } 154 154 155 if (!usb_ endpoint_pipe_is_session_started(pipe)) {155 if (!usb_pipe_is_session_started(pipe)) { 156 156 return EBADF; 157 157 } … … 168 168 int rc; 169 169 170 rc = usb_ endpoint_pipe_read_no_checks(pipe, buffer, size, &act_size);170 rc = usb_pipe_read_no_checks(pipe, buffer, size, &act_size); 171 171 if (rc != EOK) { 172 172 return rc; … … 190 190 * @return Error code. 191 191 */ 192 static int usb_ endpoint_pipe_write_no_check(usb_endpoint_pipe_t *pipe,192 static int usb_pipe_write_no_check(usb_pipe_t *pipe, 193 193 void *buffer, size_t size) 194 194 { … … 247 247 * @return Error code. 248 248 */ 249 int usb_ endpoint_pipe_write(usb_endpoint_pipe_t *pipe,249 int usb_pipe_write(usb_pipe_t *pipe, 250 250 void *buffer, size_t size) 251 251 { … … 260 260 } 261 261 262 if (!usb_ endpoint_pipe_is_session_started(pipe)) {262 if (!usb_pipe_is_session_started(pipe)) { 263 263 return EBADF; 264 264 } … … 272 272 } 273 273 274 int rc = usb_ endpoint_pipe_write_no_check(pipe, buffer, size);274 int rc = usb_pipe_write_no_check(pipe, buffer, size); 275 275 276 276 return rc; … … 289 289 * @return Error code. 290 290 */ 291 static int usb_ endpoint_pipe_control_read_no_check(usb_endpoint_pipe_t *pipe,291 static int usb_pipe_control_read_no_check(usb_pipe_t *pipe, 292 292 void *setup_buffer, size_t setup_buffer_size, 293 293 void *data_buffer, size_t data_buffer_size, size_t *data_transfered_size) … … 365 365 * @return Error code. 366 366 */ 367 int usb_ endpoint_pipe_control_read(usb_endpoint_pipe_t *pipe,367 int usb_pipe_control_read(usb_pipe_t *pipe, 368 368 void *setup_buffer, size_t setup_buffer_size, 369 369 void *data_buffer, size_t data_buffer_size, size_t *data_transfered_size) … … 379 379 } 380 380 381 if (!usb_ endpoint_pipe_is_session_started(pipe)) {381 if (!usb_pipe_is_session_started(pipe)) { 382 382 return EBADF; 383 383 } … … 389 389 390 390 size_t act_size = 0; 391 int rc = usb_ endpoint_pipe_control_read_no_check(pipe,391 int rc = usb_pipe_control_read_no_check(pipe, 392 392 setup_buffer, setup_buffer_size, 393 393 data_buffer, data_buffer_size, &act_size); … … 414 414 * @return Error code. 415 415 */ 416 static int usb_ endpoint_pipe_control_write_no_check(usb_endpoint_pipe_t *pipe,416 static int usb_pipe_control_write_no_check(usb_pipe_t *pipe, 417 417 void *setup_buffer, size_t setup_buffer_size, 418 418 void *data_buffer, size_t data_buffer_size) … … 473 473 * @return Error code. 474 474 */ 475 int usb_ endpoint_pipe_control_write(usb_endpoint_pipe_t *pipe,475 int usb_pipe_control_write(usb_pipe_t *pipe, 476 476 void *setup_buffer, size_t setup_buffer_size, 477 477 void *data_buffer, size_t data_buffer_size) … … 491 491 } 492 492 493 if (!usb_ endpoint_pipe_is_session_started(pipe)) {493 if (!usb_pipe_is_session_started(pipe)) { 494 494 return EBADF; 495 495 } … … 500 500 } 501 501 502 int rc = usb_ endpoint_pipe_control_write_no_check(pipe,502 int rc = usb_pipe_control_write_no_check(pipe, 503 503 setup_buffer, setup_buffer_size, data_buffer, data_buffer_size); 504 504 -
uspace/lib/usb/src/recognise.c
r4fb6d9ee re099f26 247 247 #undef VENDOR_ONLY_FMT 248 248 #undef VENDOR_ONLY_ARGS 249 250 /* As a last resort, try fallback driver. */ 251 ADD_MATCHID_OR_RETURN(matches, 10, "usb&interface&fallback"); 249 252 250 253 return EOK; … … 291 294 } 292 295 296 /* As a last resort, try fallback driver. */ 297 ADD_MATCHID_OR_RETURN(matches, 10, "usb&fallback"); 298 293 299 return EOK; 294 300 } … … 305 311 * @return Error code. 306 312 */ 307 int usb_device_create_match_ids(usb_ endpoint_pipe_t *ctrl_pipe,313 int usb_device_create_match_ids(usb_pipe_t *ctrl_pipe, 308 314 match_id_list_t *matches) 309 315 { … … 357 363 int rc; 358 364 usb_device_connection_t dev_connection; 359 usb_ endpoint_pipe_t ctrl_pipe;365 usb_pipe_t ctrl_pipe; 360 366 361 367 rc = usb_device_connection_initialize(&dev_connection, hc_handle, address); … … 364 370 } 365 371 366 rc = usb_ endpoint_pipe_initialize_default_control(&ctrl_pipe,372 rc = usb_pipe_initialize_default_control(&ctrl_pipe, 367 373 &dev_connection); 368 374 if (rc != EOK) { 369 375 goto failure; 370 376 } 371 rc = usb_ endpoint_pipe_probe_default_control(&ctrl_pipe);377 rc = usb_pipe_probe_default_control(&ctrl_pipe); 372 378 if (rc != EOK) { 373 379 goto failure; … … 398 404 child->driver_data = dev_data; 399 405 400 rc = usb_ endpoint_pipe_start_session(&ctrl_pipe);406 rc = usb_pipe_start_session(&ctrl_pipe); 401 407 if (rc != EOK) { 402 408 goto failure; … … 408 414 } 409 415 410 rc = usb_ endpoint_pipe_end_session(&ctrl_pipe);416 rc = usb_pipe_end_session(&ctrl_pipe); 411 417 if (rc != EOK) { 412 418 goto failure; -
uspace/lib/usb/src/request.c
r4fb6d9ee re099f26 42 42 /** Generic wrapper for SET requests using standard control request format. 43 43 * 44 * @see usb_ endpoint_pipe_control_write44 * @see usb_pipe_control_write 45 45 * 46 46 * @param pipe Pipe used for the communication. … … 60 60 * @retval ERANGE Data buffer too large. 61 61 */ 62 int usb_control_request_set(usb_ endpoint_pipe_t *pipe,62 int usb_control_request_set(usb_pipe_t *pipe, 63 63 usb_request_type_t request_type, usb_request_recipient_t recipient, 64 64 uint8_t request, … … 90 90 setup_packet.length = (uint16_t) data_size; 91 91 92 int rc = usb_ endpoint_pipe_control_write(pipe,92 int rc = usb_pipe_control_write(pipe, 93 93 &setup_packet, sizeof(setup_packet), 94 94 data, data_size); … … 99 99 /** Generic wrapper for GET requests using standard control request format. 100 100 * 101 * @see usb_ endpoint_pipe_control_read101 * @see usb_pipe_control_read 102 102 * 103 103 * @param pipe Pipe used for the communication. … … 120 120 * @retval ERANGE Data buffer too large. 121 121 */ 122 int usb_control_request_get(usb_ endpoint_pipe_t *pipe,122 int usb_control_request_get(usb_pipe_t *pipe, 123 123 usb_request_type_t request_type, usb_request_recipient_t recipient, 124 124 uint8_t request, … … 150 150 setup_packet.length = (uint16_t) data_size; 151 151 152 int rc = usb_ endpoint_pipe_control_read(pipe,152 int rc = usb_pipe_control_read(pipe, 153 153 &setup_packet, sizeof(setup_packet), 154 154 data, data_size, actual_data_size); 155 156 return rc; 157 } 158 159 /** Retrieve status of a USB device. 160 * 161 * @param[in] pipe Control endpoint pipe (session must be already started). 162 * @param[in] index Recipient index (in native endianness). 163 * @param[in] recipient Recipient of the GET_STATUS request. 164 * @param[out] status Recipient status (in native endianness). 165 * @return Error code. 166 */ 167 int usb_request_get_status(usb_pipe_t *pipe, 168 usb_request_recipient_t recipient, uint16_t index, 169 uint16_t *status) 170 { 171 if ((recipient == USB_REQUEST_RECIPIENT_DEVICE) && (index != 0)) { 172 return EINVAL; 173 } 174 175 if (status == NULL) { 176 return EBADMEM; 177 } 178 179 uint16_t status_usb_endianess; 180 size_t data_transfered_size; 181 int rc = usb_control_request_get(pipe, USB_REQUEST_TYPE_STANDARD, 182 recipient, USB_DEVREQ_GET_STATUS, 0, uint16_host2usb(index), 183 &status_usb_endianess, 2, &data_transfered_size); 184 if (rc != EOK) { 185 return rc; 186 } 187 if (data_transfered_size != 2) { 188 return ELIMIT; 189 } 190 191 *status = uint16_usb2host(status_usb_endianess); 192 193 return EOK; 194 } 195 196 /** Clear or disable specific device feature. 197 * 198 * @param[in] pipe Control endpoint pipe (session must be already started). 199 * @param[in] request_type Request type (standard/class/vendor). 200 * @param[in] recipient Recipient of the CLEAR_FEATURE request. 201 * @param[in] feature_selector Feature selector (in native endianness). 202 * @param[in] index Recipient index (in native endianness). 203 * @return Error code. 204 */ 205 int usb_request_clear_feature(usb_pipe_t *pipe, 206 usb_request_type_t request_type, usb_request_recipient_t recipient, 207 uint16_t feature_selector, uint16_t index) 208 { 209 if (request_type == USB_REQUEST_TYPE_STANDARD) { 210 if ((recipient == USB_REQUEST_RECIPIENT_DEVICE) 211 && (index != 0)) { 212 return EINVAL; 213 } 214 } 215 216 int rc = usb_control_request_set(pipe, request_type, recipient, 217 USB_DEVREQ_CLEAR_FEATURE, 218 uint16_host2usb(feature_selector), uint16_host2usb(index), 219 NULL, 0); 220 221 return rc; 222 } 223 224 /** Set or enable specific device feature. 225 * 226 * @param[in] pipe Control endpoint pipe (session must be already started). 227 * @param[in] request_type Request type (standard/class/vendor). 228 * @param[in] recipient Recipient of the SET_FEATURE request. 229 * @param[in] feature_selector Feature selector (in native endianness). 230 * @param[in] index Recipient index (in native endianness). 231 * @return Error code. 232 */ 233 int usb_request_set_feature(usb_pipe_t *pipe, 234 usb_request_type_t request_type, usb_request_recipient_t recipient, 235 uint16_t feature_selector, uint16_t index) 236 { 237 if (request_type == USB_REQUEST_TYPE_STANDARD) { 238 if ((recipient == USB_REQUEST_RECIPIENT_DEVICE) 239 && (index != 0)) { 240 return EINVAL; 241 } 242 } 243 244 int rc = usb_control_request_set(pipe, request_type, recipient, 245 USB_DEVREQ_SET_FEATURE, 246 uint16_host2usb(feature_selector), uint16_host2usb(index), 247 NULL, 0); 155 248 156 249 return rc; … … 165 258 * @return Error code. 166 259 */ 167 int usb_request_set_address(usb_ endpoint_pipe_t *pipe,260 int usb_request_set_address(usb_pipe_t *pipe, 168 261 usb_address_t new_address) 169 262 { … … 204 297 * @return Error code. 205 298 */ 206 int usb_request_get_descriptor(usb_ endpoint_pipe_t *pipe,299 int usb_request_get_descriptor(usb_pipe_t *pipe, 207 300 usb_request_type_t request_type, usb_request_recipient_t recipient, 208 301 uint8_t descriptor_type, uint8_t descriptor_index, … … 238 331 * @return 239 332 */ 240 int usb_request_get_descriptor_alloc(usb_ endpoint_pipe_t * pipe,333 int usb_request_get_descriptor_alloc(usb_pipe_t * pipe, 241 334 usb_request_type_t request_type, usb_request_recipient_t recipient, 242 335 uint8_t descriptor_type, uint8_t descriptor_index, … … 307 400 * @return Error code. 308 401 */ 309 int usb_request_get_device_descriptor(usb_ endpoint_pipe_t *pipe,402 int usb_request_get_device_descriptor(usb_pipe_t *pipe, 310 403 usb_standard_device_descriptor_t *descriptor) 311 404 { … … 349 442 * @return Error code. 350 443 */ 351 int usb_request_get_bare_configuration_descriptor(usb_ endpoint_pipe_t *pipe,444 int usb_request_get_bare_configuration_descriptor(usb_pipe_t *pipe, 352 445 int index, usb_standard_configuration_descriptor_t *descriptor) 353 446 { … … 395 488 * @return Error code. 396 489 */ 397 int usb_request_get_full_configuration_descriptor(usb_ endpoint_pipe_t *pipe,490 int usb_request_get_full_configuration_descriptor(usb_pipe_t *pipe, 398 491 int index, void *descriptor, size_t descriptor_size, size_t *actual_size) 399 492 { … … 421 514 */ 422 515 int usb_request_get_full_configuration_descriptor_alloc( 423 usb_ endpoint_pipe_t *pipe, int index,516 usb_pipe_t *pipe, int index, 424 517 void **descriptor_ptr, size_t *descriptor_size) 425 518 { … … 473 566 } 474 567 568 /** Update existing or add new USB descriptor to a USB device. 569 * 570 * @param[in] pipe Control endpoint pipe (session must be already started). 571 * @param[in] request_type Request type (standard/class/vendor). 572 * @param[in] recipient Request recipient (device/interface/endpoint). 573 * @param[in] descriptor_type Descriptor type (device/configuration/HID/...). 574 * @param[in] descriptor_index Descriptor index. 575 * @param[in] language Language index (in native endianness). 576 * @param[in] buffer Buffer with the new descriptor (in USB endianness). 577 * @param[in] size Size of the @p buffer in bytes (in native endianness). 578 * @return Error code. 579 */ 580 int usb_request_set_descriptor(usb_pipe_t *pipe, 581 usb_request_type_t request_type, usb_request_recipient_t recipient, 582 uint8_t descriptor_type, uint8_t descriptor_index, 583 uint16_t language, 584 void *buffer, size_t size) 585 { 586 if (buffer == NULL) { 587 return EBADMEM; 588 } 589 if (size == 0) { 590 return EINVAL; 591 } 592 593 /* FIXME: proper endianness. */ 594 uint16_t wValue = descriptor_index | (descriptor_type << 8); 595 596 return usb_control_request_set(pipe, 597 request_type, recipient, 598 USB_DEVREQ_SET_DESCRIPTOR, 599 wValue, language, 600 buffer, size); 601 } 602 603 /** Get current configuration value of USB device. 604 * 605 * @param[in] pipe Control endpoint pipe (session must be already started). 606 * @param[out] configuration_value Current configuration value. 607 * @return Error code. 608 */ 609 int usb_request_get_configuration(usb_pipe_t *pipe, 610 uint8_t *configuration_value) 611 { 612 uint8_t value; 613 size_t actual_size; 614 615 int rc = usb_control_request_get(pipe, 616 USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE, 617 USB_DEVREQ_GET_CONFIGURATION, 618 0, 0, 619 &value, 1, &actual_size); 620 621 if (rc != EOK) { 622 return rc; 623 } 624 if (actual_size != 1) { 625 return ELIMIT; 626 } 627 628 if (configuration_value != NULL) { 629 *configuration_value = value; 630 } 631 632 return EOK; 633 } 634 475 635 /** Set configuration of USB device. 476 636 * … … 479 639 * @return Error code. 480 640 */ 481 int usb_request_set_configuration(usb_ endpoint_pipe_t *pipe,641 int usb_request_set_configuration(usb_pipe_t *pipe, 482 642 uint8_t configuration_value) 483 643 { … … 491 651 } 492 652 653 /** Get selected alternate setting for USB interface. 654 * 655 * @param[in] pipe Control endpoint pipe (session must be already started). 656 * @param[in] interface_index Interface index. 657 * @param[out] alternate_setting Alternate setting for the interface. 658 * @return Error code. 659 */ 660 int usb_request_get_interface(usb_pipe_t *pipe, 661 uint8_t interface_index, uint8_t *alternate_setting) 662 { 663 uint8_t value; 664 size_t actual_size; 665 666 int rc = usb_control_request_get(pipe, 667 USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_INTERFACE, 668 USB_DEVREQ_GET_INTERFACE, 669 0, uint16_host2usb((uint16_t) interface_index), 670 &value, 1, &actual_size); 671 672 if (rc != EOK) { 673 return rc; 674 } 675 if (actual_size != 1) { 676 return ELIMIT; 677 } 678 679 if (alternate_setting != NULL) { 680 *alternate_setting = value; 681 } 682 683 return EOK; 684 } 685 686 /** Select alternate setting for USB interface. 687 * 688 * @param[in] pipe Control endpoint pipe (session must be already started). 689 * @param[in] interface_index Interface index. 690 * @param[in] alternate_setting Alternate setting to select. 691 * @return Error code. 692 */ 693 int usb_request_set_interface(usb_pipe_t *pipe, 694 uint8_t interface_index, uint8_t alternate_setting) 695 { 696 return usb_control_request_set(pipe, 697 USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_INTERFACE, 698 USB_DEVREQ_SET_INTERFACE, 699 uint16_host2usb((uint16_t) alternate_setting), 700 uint16_host2usb((uint16_t) interface_index), 701 NULL, 0); 702 } 703 493 704 /** Get list of supported languages by USB device. 494 705 * … … 499 710 * @return Error code. 500 711 */ 501 int usb_request_get_supported_languages(usb_ endpoint_pipe_t *pipe,712 int usb_request_get_supported_languages(usb_pipe_t *pipe, 502 713 l18_win_locales_t **languages_ptr, size_t *languages_count) 503 714 { … … 571 782 * @return Error code. 572 783 */ 573 int usb_request_get_string(usb_ endpoint_pipe_t *pipe,784 int usb_request_get_string(usb_pipe_t *pipe, 574 785 size_t index, l18_win_locales_t lang, char **string_ptr) 575 786 { -
uspace/lib/usb/src/usb.c
r4fb6d9ee re099f26 36 36 #include <errno.h> 37 37 38 #define ARR_SIZE(arr) (sizeof(arr)/sizeof(arr[0])) 39 40 static const char *str_speed[] = { 41 "low", 42 "full", 43 "high" 44 }; 45 46 static const char *str_transfer_type[] = { 47 "control", 48 "isochronous", 49 "bulk", 50 "interrupt" 51 }; 52 53 static const char *str_transfer_type_short[] = { 54 "ctrl", 55 "iso", 56 "bulk", 57 "intr" 58 }; 38 59 39 60 /** String representation for USB transfer type. … … 42 63 * @return Transfer type as a string (in English). 43 64 */ 44 const char * usb_str_transfer_type(usb_transfer_type_t t)65 const char *usb_str_transfer_type(usb_transfer_type_t t) 45 66 { 46 switch (t) { 47 case USB_TRANSFER_ISOCHRONOUS: 48 return "isochronous"; 49 case USB_TRANSFER_INTERRUPT: 50 return "interrupt"; 51 case USB_TRANSFER_CONTROL: 52 return "control"; 53 case USB_TRANSFER_BULK: 54 return "bulk"; 55 default: 56 return "unknown"; 67 if (t >= ARR_SIZE(str_transfer_type)) { 68 return "invalid"; 57 69 } 70 return str_transfer_type[t]; 71 } 72 73 /** String representation for USB transfer type (short version). 74 * 75 * @param t Transfer type. 76 * @return Transfer type as a short string for debugging messages. 77 */ 78 const char *usb_str_transfer_type_short(usb_transfer_type_t t) 79 { 80 if (t >= ARR_SIZE(str_transfer_type_short)) { 81 return "invl"; 82 } 83 return str_transfer_type_short[t]; 84 } 85 86 /** String representation of USB speed. 87 * 88 * @param s The speed. 89 * @return USB speed as a string (in English). 90 */ 91 const char *usb_str_speed(usb_speed_t s) 92 { 93 if (s >= ARR_SIZE(str_speed)) { 94 return "invalid"; 95 } 96 return str_speed[s]; 58 97 } 59 98
Note:
See TracChangeset
for help on using the changeset viewer.
