Changes in / [41ef5b9:fd9f6e4c] in mainline
- Files:
-
- 7 added
- 13 deleted
- 56 edited
Legend:
- Unmodified
- Added
- Removed
-
.bzrignore
r41ef5b9 rfd9f6e4c 88 88 ./uspace/drv/uhci-hcd/uhci-hcd 89 89 ./uspace/drv/uhci-rhd/uhci-rhd 90 ./uspace/drv/usbflbk/usbflbk91 90 ./uspace/drv/usbhub/usbhub 92 91 ./uspace/drv/usbhid/usbhid -
boot/arch/amd64/Makefile.inc
r41ef5b9 rfd9f6e4c 47 47 uhci-hcd \ 48 48 uhci-rhd \ 49 usbflbk \50 49 usbhub \ 51 50 usbhid \ -
kernel/tools/genmap.py
r41ef5b9 rfd9f6e4c 100 100 for addr, symbol in symbols: 101 101 value = fname + ':' + symbol 102 value_bytes = value.encode('ascii') 103 data = struct.pack(symtabfmt, addr + offset, value_bytes[:MAXSTRING]) 102 data = struct.pack(symtabfmt, addr + offset, value[:MAXSTRING]) 104 103 out.write(data) 105 104 106 out.write(struct.pack(symtabfmt, 0, b''))105 out.write(struct.pack(symtabfmt, 0, '')) 107 106 108 107 def main(): -
tools/mkfat.py
r41ef5b9 rfd9f6e4c 211 211 dir_entry = xstruct.create(DIR_ENTRY) 212 212 213 dir_entry.name = mangle_fname(name) .encode('ascii')214 dir_entry.ext = mangle_ext(name) .encode('ascii')213 dir_entry.name = mangle_fname(name) 214 dir_entry.ext = mangle_ext(name) 215 215 216 216 if (directory): … … 239 239 240 240 dir_entry.signature = 0x2e 241 dir_entry.name = b' '242 dir_entry.ext = b' '241 dir_entry.name = ' ' 242 dir_entry.ext = ' ' 243 243 dir_entry.attr = 0x10 244 244 … … 258 258 259 259 dir_entry.signature = [0x2e, 0x2e] 260 dir_entry.name = b' '261 dir_entry.ext = b' '260 dir_entry.name = ' ' 261 dir_entry.ext = ' ' 262 262 dir_entry.attr = 0x10 263 263 -
tools/mkhord.py
r41ef5b9 rfd9f6e4c 84 84 payload_size_aligned = align_up(payload_size, align) 85 85 86 header.tag = b"HORD"86 header.tag = "HORD" 87 87 header.version = 1 88 88 header.encoding = HORD_LSB -
tools/mktmpfs.py
r41ef5b9 rfd9f6e4c 80 80 dentry.kind = TMPFS_FILE 81 81 dentry.fname_len = len(name) 82 dentry.fname = name .encode('ascii')82 dentry.fname = name 83 83 dentry.flen = size 84 84 … … 97 97 dentry.kind = TMPFS_DIRECTORY 98 98 dentry.fname_len = len(name) 99 dentry.fname = name .encode('ascii')99 dentry.fname = name 100 100 101 101 outf.write(dentry.pack()) … … 122 122 123 123 header = xstruct.create(HEADER) 124 header.tag = b"TMPFS"124 header.tag = "TMPFS" 125 125 126 126 outf.write(header.pack()) -
uspace/Makefile
r41ef5b9 rfd9f6e4c 121 121 drv/uhci-hcd \ 122 122 drv/uhci-rhd \ 123 drv/usbflbk \124 123 drv/usbhid \ 125 124 drv/usbhub \ … … 141 140 drv/uhci-hcd \ 142 141 drv/uhci-rhd \ 143 drv/usbflbk \144 142 drv/usbhid \ 145 143 drv/usbhub \ -
uspace/app/bdsh/cmds/modules/bdd/bdd.c
r41ef5b9 rfd9f6e4c 70 70 unsigned int i, j; 71 71 devmap_handle_t handle; 72 aoff64_t offset;73 72 uint8_t *blk; 74 73 size_t size, bytes, rows; … … 121 120 } 122 121 123 offset = ba * block_size;124 125 122 while (size > 0) { 126 123 rc = block_read_direct(handle, ba, 1, blk); … … 136 133 137 134 for (j = 0; j < rows; j++) { 138 printf("[%06" PRIxOFF64 "] ", offset);139 135 for (i = 0; i < BPR; i++) { 140 136 if (j * BPR + i < bytes) … … 156 152 } 157 153 } 158 offset += BPR;159 154 putchar('\n'); 160 155 } -
uspace/app/usbinfo/dev.c
r41ef5b9 rfd9f6e4c 59 59 } 60 60 61 rc = usb_ pipe_initialize_default_control(&dev->ctrl_pipe,61 rc = usb_endpoint_pipe_initialize_default_control(&dev->ctrl_pipe, 62 62 &dev->wire); 63 63 if (rc != EOK) { … … 68 68 } 69 69 70 rc = usb_ pipe_probe_default_control(&dev->ctrl_pipe);70 rc = usb_endpoint_pipe_probe_default_control(&dev->ctrl_pipe); 71 71 if (rc != EOK) { 72 72 fprintf(stderr, … … 76 76 } 77 77 78 rc = usb_ pipe_start_session(&dev->ctrl_pipe);78 rc = usb_endpoint_pipe_start_session(&dev->ctrl_pipe); 79 79 if (rc != EOK) { 80 80 fprintf(stderr, … … 107 107 108 108 leave: 109 if (usb_ pipe_is_session_started(&dev->ctrl_pipe)) {110 usb_ pipe_end_session(&dev->ctrl_pipe);109 if (usb_endpoint_pipe_is_session_started(&dev->ctrl_pipe)) { 110 usb_endpoint_pipe_end_session(&dev->ctrl_pipe); 111 111 } 112 112 … … 118 118 void destroy_device(usbinfo_device_t *dev) 119 119 { 120 usb_ pipe_end_session(&dev->ctrl_pipe);120 usb_endpoint_pipe_end_session(&dev->ctrl_pipe); 121 121 free(dev); 122 122 } -
uspace/app/usbinfo/info.c
r41ef5b9 rfd9f6e4c 42 42 #include <usb/classes/classes.h> 43 43 #include <usb/classes/hid.h> 44 #include <usb/classes/hub.h>45 44 #include "usbinfo.h" 46 45 … … 110 109 usb_standard_device_descriptor_t *descriptor) 111 110 { 112 printf("%sDevice (0x%04x by 0x%04x, %s , %zu configurations)\n", prefix,111 printf("%sDevice (0x%04x by 0x%04x, %s)\n", prefix, 113 112 (int) descriptor->product_id, 114 113 (int) descriptor->vendor_id, 115 usb_str_class(descriptor->device_class), 116 (size_t) descriptor->configuration_count); 114 usb_str_class(descriptor->device_class)); 117 115 } 118 116 … … 120 118 usb_standard_configuration_descriptor_t *descriptor) 121 119 { 122 printf("%sConfiguration #%d (%zu interfaces, total %zuB)\n", prefix, 123 (int) descriptor->configuration_number, 124 (size_t) descriptor->interface_count, 125 (size_t) descriptor->total_length); 120 printf("%sConfiguration #%d\n", prefix, 121 (int) descriptor->configuration_number); 126 122 } 127 123 … … 129 125 usb_standard_interface_descriptor_t *descriptor) 130 126 { 131 printf("%sInterface #%d (%s, 0x%02x, 0x%02x) , alternate %d\n", prefix,127 printf("%sInterface #%d (%s, 0x%02x, 0x%02x)\n", prefix, 132 128 (int) descriptor->interface_number, 133 129 usb_str_class(descriptor->interface_class), 134 130 (int) descriptor->interface_subclass, 135 (int) descriptor->interface_protocol, 136 (int) descriptor->alternate_setting); 131 (int) descriptor->interface_protocol); 137 132 } 138 133 … … 158 153 } 159 154 160 static void dump_descriptor_tree_brief_hub(const char *prefix, 161 usb_hub_descriptor_header_t *descriptor) 162 { 163 printf("%shub (%d ports)\n", prefix, 164 (int) descriptor->port_count); 165 } 166 167 168 static void dump_descriptor_tree_callback(uint8_t *descriptor, 155 156 static void dump_descriptor_tree_brief_callback(uint8_t *descriptor, 169 157 size_t depth, void *arg) 170 158 { … … 183 171 if (descr_size >= sizeof(descriptor_type)) { \ 184 172 callback(indent, (descriptor_type *) descriptor); \ 185 if (arg != NULL) { \186 usb_dump_standard_descriptor(stdout, \187 get_indent(depth +2), "\n", \188 descriptor, descr_size); \189 } \190 173 } else { \ 191 174 descr_type = -1; \ … … 208 191 usb_standard_hid_descriptor_t, 209 192 dump_descriptor_tree_brief_hid); 210 /*211 * Probably useless, hub descriptor shall not be part of212 * configuration descriptor.213 */214 _BRANCH(USB_DESCTYPE_HUB,215 usb_hub_descriptor_header_t,216 dump_descriptor_tree_brief_hub);217 193 218 194 default: … … 227 203 void dump_descriptor_tree_brief(usbinfo_device_t *dev) 228 204 { 229 dump_descriptor_tree_ callback((uint8_t *)&dev->device_descriptor,205 dump_descriptor_tree_brief_callback((uint8_t *)&dev->device_descriptor, 230 206 (size_t) -1, NULL); 231 207 usb_dp_walk_simple(dev->full_configuration_descriptor, 232 208 dev->full_configuration_descriptor_size, 233 209 usb_dp_standard_descriptor_nesting, 234 dump_descriptor_tree_ callback,210 dump_descriptor_tree_brief_callback, 235 211 NULL); 236 212 } 237 238 void dump_descriptor_tree_full(usbinfo_device_t *dev)239 {240 dump_descriptor_tree_callback((uint8_t *)&dev->device_descriptor,241 (size_t) -1, dev);242 usb_dp_walk_simple(dev->full_configuration_descriptor,243 dev->full_configuration_descriptor_size,244 usb_dp_standard_descriptor_nesting,245 dump_descriptor_tree_callback,246 dev);247 }248 249 213 250 214 void dump_strings(usbinfo_device_t *dev) -
uspace/app/usbinfo/main.c
r41ef5b9 rfd9f6e4c 134 134 _OPTION("-m --match-ids", "Print match ids generated for the device."); 135 135 _OPTION("-t --descriptor-tree", "Print descriptor tree."); 136 _OPTION("-T --descriptor-tree-full", "Print detailed descriptor tree");137 136 _OPTION("-s --strings", "Try to print all string descriptors."); 138 137 … … 150 149 {"match-ids", no_argument, NULL, 'm'}, 151 150 {"descriptor-tree", no_argument, NULL, 't'}, 152 {"descriptor-tree-full", no_argument, NULL, 'T'},153 151 {"strings", no_argument, NULL, 's'}, 154 152 {0, 0, NULL, 0} 155 153 }; 156 static const char *short_options = "himt Ts";154 static const char *short_options = "himts"; 157 155 158 156 static usbinfo_action_t actions[] = { … … 170 168 .opt = 't', 171 169 .action = dump_descriptor_tree_brief, 172 .active = false173 },174 {175 .opt = 'T',176 .action = dump_descriptor_tree_full,177 170 .active = false 178 171 }, -
uspace/app/usbinfo/usbinfo.h
r41ef5b9 rfd9f6e4c 44 44 45 45 typedef struct { 46 usb_ pipe_t ctrl_pipe;46 usb_endpoint_pipe_t ctrl_pipe; 47 47 usb_device_connection_t wire; 48 48 usb_standard_device_descriptor_t device_descriptor; … … 82 82 void dump_device_match_ids(usbinfo_device_t *); 83 83 void dump_descriptor_tree_brief(usbinfo_device_t *); 84 void dump_descriptor_tree_full(usbinfo_device_t *);85 84 void dump_strings(usbinfo_device_t *); 86 85 -
uspace/doc/doxygroups.h
r41ef5b9 rfd9f6e4c 274 274 */ 275 275 276 /** 277 * @defgroup drvusbfallback USB fallback driver. 278 * @ingroup usb 279 * @brief Fallback driver for any USB device. 280 * @details 281 * The purpose of this driver is to simplify querying of unknown 282 * devices from within HelenOS (without a driver, no node at all 283 * may appear under /dev/devices). 284 */ 285 286 276 -
uspace/drv/ohci/Makefile
r41ef5b9 rfd9f6e4c 33 33 34 34 SOURCES = \ 35 iface.c \35 hc_iface.c \ 36 36 batch.c \ 37 37 main.c \ 38 hc.c \39 root_hub.c \38 ohci_hc.c \ 39 ohci_rh.c \ 40 40 pci.c 41 41 -
uspace/drv/ohci/batch.c
r41ef5b9 rfd9f6e4c 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 /** @addtogroup drvusbohci 28 /** @addtogroup drvusbohcihc 29 29 * @{ 30 30 */ … … 39 39 40 40 #include "batch.h" 41 #include "utils/malloc32.h" 42 43 static void batch_call_in_and_dispose(usb_transfer_batch_t *instance); 44 static void batch_call_out_and_dispose(usb_transfer_batch_t *instance); 45 46 #define DEFAULT_ERROR_COUNT 3 47 usb_transfer_batch_t * batch_get( 48 ddf_fun_t *fun, 49 usb_target_t target, 50 usb_transfer_type_t transfer_type, 51 size_t max_packet_size, 52 usb_speed_t speed, 53 char *buffer, 54 size_t buffer_size, 55 char *setup_buffer, 56 size_t setup_size, 41 42 static void batch_call_in(batch_t *instance); 43 static void batch_call_out(batch_t *instance); 44 static void batch_call_in_and_dispose(batch_t *instance); 45 static void batch_call_out_and_dispose(batch_t *instance); 46 47 /** Allocate memory and initialize internal data structure. 48 * 49 * @param[in] fun DDF function to pass to callback. 50 * @param[in] target Device and endpoint target of the transaction. 51 * @param[in] transfer_type Interrupt, Control or Bulk. 52 * @param[in] max_packet_size maximum allowed size of data packets. 53 * @param[in] speed Speed of the transaction. 54 * @param[in] buffer Data source/destination. 55 * @param[in] size Size of the buffer. 56 * @param[in] setup_buffer Setup data source (if not NULL) 57 * @param[in] setup_size Size of setup_buffer (should be always 8) 58 * @param[in] func_in function to call on inbound transaction completion 59 * @param[in] func_out function to call on outbound transaction completion 60 * @param[in] arg additional parameter to func_in or func_out 61 * @param[in] manager Pointer to toggle management structure. 62 * @return Valid pointer if all substructures were successfully created, 63 * NULL otherwise. 64 * 65 * Determines the number of needed packets (TDs). Prepares a transport buffer 66 * (that is accessible by the hardware). Initializes parameters needed for the 67 * transaction and callback. 68 */ 69 batch_t * batch_get(ddf_fun_t *fun, usb_target_t target, 70 usb_transfer_type_t transfer_type, size_t max_packet_size, 71 usb_speed_t speed, char *buffer, size_t size, 72 char* setup_buffer, size_t setup_size, 57 73 usbhc_iface_transfer_in_callback_t func_in, 58 usbhc_iface_transfer_out_callback_t func_out, 59 void *arg, 60 usb_device_keeper_t *manager 61 ) 62 { 74 usbhc_iface_transfer_out_callback_t func_out, void *arg 75 ) 76 { 77 assert(func_in == NULL || func_out == NULL); 78 assert(func_in != NULL || func_out != NULL); 79 63 80 #define CHECK_NULL_DISPOSE_RETURN(ptr, message...) \ 64 65 66 67 68 69 70 71 72 usb_transfer_batch_t *instance = malloc(sizeof(usb_transfer_batch_t));81 if (ptr == NULL) { \ 82 usb_log_error(message); \ 83 if (instance) { \ 84 batch_dispose(instance); \ 85 } \ 86 return NULL; \ 87 } else (void)0 88 89 batch_t *instance = malloc(sizeof(batch_t)); 73 90 CHECK_NULL_DISPOSE_RETURN(instance, 74 91 "Failed to allocate batch instance.\n"); 75 usb_transfer_batch_init(instance, target, transfer_type, speed, max_packet_size, 76 buffer, NULL, buffer_size, NULL, setup_size, func_in, 77 func_out, arg, fun, NULL); 78 79 if (buffer_size > 0) { 80 instance->transport_buffer = malloc32(buffer_size); 81 CHECK_NULL_DISPOSE_RETURN(instance->transport_buffer, 82 "Failed to allocate device accessible buffer.\n"); 83 } 84 85 if (setup_size > 0) { 86 instance->setup_buffer = malloc32(setup_size); 87 CHECK_NULL_DISPOSE_RETURN(instance->setup_buffer, 88 "Failed to allocate device accessible setup buffer.\n"); 89 memcpy(instance->setup_buffer, setup_buffer, setup_size); 90 } 91 92 92 bzero(instance, sizeof(batch_t)); 93 94 if (size > 0) { 95 /* TODO: use device accessible malloc here */ 96 instance->transport_buffer = malloc(size); 97 CHECK_NULL_DISPOSE_RETURN(instance->transport_buffer, 98 "Failed to allocate device accessible buffer.\n"); 99 } 100 101 if (setup_size > 0) { 102 /* TODO: use device accessible malloc here */ 103 instance->setup_buffer = malloc(setup_size); 104 CHECK_NULL_DISPOSE_RETURN(instance->setup_buffer, 105 "Failed to allocate device accessible setup buffer.\n"); 106 memcpy(instance->setup_buffer, setup_buffer, setup_size); 107 } 108 109 link_initialize(&instance->link); 110 111 instance->max_packet_size = max_packet_size; 112 instance->target = target; 113 instance->transfer_type = transfer_type; 114 instance->buffer = buffer; 115 instance->buffer_size = size; 116 instance->setup_size = setup_size; 117 instance->fun = fun; 118 instance->arg = arg; 119 instance->speed = speed; 120 instance->callback_out = func_out; 121 instance->callback_in = func_in; 122 123 usb_log_debug("Batch(%p) %d:%d memory structures ready.\n", 124 instance, target.address, target.endpoint); 93 125 return instance; 94 126 } 95 127 /*----------------------------------------------------------------------------*/ 96 void batch_dispose(usb_transfer_batch_t *instance) 97 { 98 assert(instance); 99 free32(instance->transport_buffer); 100 free32(instance->setup_buffer); 101 free(instance); 102 } 103 /*----------------------------------------------------------------------------*/ 104 void batch_control_write(usb_transfer_batch_t *instance) 128 /** Mark batch as finished and continue with next step. 129 * 130 * @param[in] instance Batch structure to use. 131 * 132 */ 133 void batch_finish(batch_t *instance, int error) 134 { 135 assert(instance); 136 instance->error = error; 137 instance->next_step(instance); 138 } 139 /*----------------------------------------------------------------------------*/ 140 /** Check batch TDs for activity. 141 * 142 * @param[in] instance Batch structure to use. 143 * @return False, if there is an active TD, true otherwise. 144 * 145 * Walk all TDs. Stop with false if there is an active one (it is to be 146 * processed). Stop with true if an error is found. Return true if the last TS 147 * is reached. 148 */ 149 bool batch_is_complete(batch_t *instance) 150 { 151 assert(instance); 152 /* TODO: implement */ 153 return true; 154 } 155 /*----------------------------------------------------------------------------*/ 156 /** Prepares control write transaction. 157 * 158 * @param[in] instance Batch structure to use. 159 * 160 * Uses genercir control function with pids OUT and IN. 161 */ 162 void batch_control_write(batch_t *instance) 105 163 { 106 164 assert(instance); … … 113 171 } 114 172 /*----------------------------------------------------------------------------*/ 115 void batch_control_read(usb_transfer_batch_t *instance) 173 /** Prepares control read transaction. 174 * 175 * @param[in] instance Batch structure to use. 176 * 177 * Uses generic control with pids IN and OUT. 178 */ 179 void batch_control_read(batch_t *instance) 116 180 { 117 181 assert(instance); 118 182 instance->next_step = batch_call_in_and_dispose; 119 183 /* TODO: implement */ 120 usb_log_debug("Batch(%p) CONTROL WRITE initialized.\n", instance); 121 } 122 /*----------------------------------------------------------------------------*/ 123 void batch_interrupt_in(usb_transfer_batch_t *instance) 124 { 125 assert(instance); 126 instance->direction = USB_DIRECTION_IN; 184 usb_log_debug("Batch(%p) CONTROL READ initialized.\n", instance); 185 } 186 /*----------------------------------------------------------------------------*/ 187 /** Prepare interrupt in transaction. 188 * 189 * @param[in] instance Batch structure to use. 190 * 191 * Data transaction with PID_IN. 192 */ 193 void batch_interrupt_in(batch_t *instance) 194 { 195 assert(instance); 196 /* TODO: implement */ 127 197 instance->next_step = batch_call_in_and_dispose; 128 /* TODO: implement */129 198 usb_log_debug("Batch(%p) INTERRUPT IN initialized.\n", instance); 130 199 } 131 200 /*----------------------------------------------------------------------------*/ 132 void batch_interrupt_out(usb_transfer_batch_t *instance) 133 { 134 assert(instance); 135 instance->direction = USB_DIRECTION_OUT; 201 /** Prepare interrupt out transaction. 202 * 203 * @param[in] instance Batch structure to use. 204 * 205 * Data transaction with PID_OUT. 206 */ 207 void batch_interrupt_out(batch_t *instance) 208 { 209 assert(instance); 136 210 /* We are data out, we are supposed to provide data */ 137 211 memcpy(instance->transport_buffer, instance->buffer, … … 142 216 } 143 217 /*----------------------------------------------------------------------------*/ 144 void batch_bulk_in(usb_transfer_batch_t *instance) 145 { 146 assert(instance); 147 instance->direction = USB_DIRECTION_IN; 218 /** Prepare bulk in transaction. 219 * 220 * @param[in] instance Batch structure to use. 221 * 222 * Data transaction with PID_IN. 223 */ 224 void batch_bulk_in(batch_t *instance) 225 { 226 assert(instance); 148 227 instance->next_step = batch_call_in_and_dispose; 149 228 /* TODO: implement */ … … 151 230 } 152 231 /*----------------------------------------------------------------------------*/ 153 void batch_bulk_out(usb_transfer_batch_t *instance) 154 { 155 assert(instance); 156 instance->direction = USB_DIRECTION_IN; 157 instance->next_step = batch_call_in_and_dispose; 158 /* TODO: implement */ 159 usb_log_debug("Batch(%p) BULK IN initialized.\n", instance); 232 /** Prepare bulk out transaction. 233 * 234 * @param[in] instance Batch structure to use. 235 * 236 * Data transaction with PID_OUT. 237 */ 238 void batch_bulk_out(batch_t *instance) 239 { 240 assert(instance); 241 /* We are data out, we are supposed to provide data */ 242 memcpy(instance->transport_buffer, instance->buffer, 243 instance->buffer_size); 244 instance->next_step = batch_call_out_and_dispose; 245 /* TODO: implement */ 246 usb_log_debug("Batch(%p) BULK OUT initialized.\n", instance); 247 } 248 /*----------------------------------------------------------------------------*/ 249 /** Prepare data, get error status and call callback in. 250 * 251 * @param[in] instance Batch structure to use. 252 * Copies data from transport buffer, and calls callback with appropriate 253 * parameters. 254 */ 255 void batch_call_in(batch_t *instance) 256 { 257 assert(instance); 258 assert(instance->callback_in); 259 260 /* We are data in, we need data */ 261 memcpy(instance->buffer, instance->transport_buffer, 262 instance->buffer_size); 263 264 int err = instance->error; 265 usb_log_debug("Batch(%p) callback IN(type:%d): %s(%d), %zu.\n", 266 instance, instance->transfer_type, str_error(err), err, 267 instance->transfered_size); 268 269 instance->callback_in( 270 instance->fun, err, instance->transfered_size, instance->arg); 271 } 272 /*----------------------------------------------------------------------------*/ 273 /** Get error status and call callback out. 274 * 275 * @param[in] instance Batch structure to use. 276 */ 277 void batch_call_out(batch_t *instance) 278 { 279 assert(instance); 280 assert(instance->callback_out); 281 282 int err = instance->error; 283 usb_log_debug("Batch(%p) callback OUT(type:%d): %s(%d).\n", 284 instance, instance->transfer_type, str_error(err), err); 285 instance->callback_out(instance->fun, 286 err, instance->arg); 160 287 } 161 288 /*----------------------------------------------------------------------------*/ … … 164 291 * @param[in] instance Batch structure to use. 165 292 */ 166 void batch_call_in_and_dispose( usb_transfer_batch_t *instance)167 { 168 assert(instance); 169 usb_transfer_batch_call_in(instance);293 void batch_call_in_and_dispose(batch_t *instance) 294 { 295 assert(instance); 296 batch_call_in(instance); 170 297 batch_dispose(instance); 171 298 } … … 175 302 * @param[in] instance Batch structure to use. 176 303 */ 177 void batch_call_out_and_dispose( usb_transfer_batch_t *instance)178 { 179 assert(instance); 180 usb_transfer_batch_call_out(instance);304 void batch_call_out_and_dispose(batch_t *instance) 305 { 306 assert(instance); 307 batch_call_out(instance); 181 308 batch_dispose(instance); 309 } 310 /*----------------------------------------------------------------------------*/ 311 /** Correctly dispose all used data structures. 312 * 313 * @param[in] instance Batch structure to use. 314 */ 315 void batch_dispose(batch_t *instance) 316 { 317 assert(instance); 318 usb_log_debug("Batch(%p) disposing.\n", instance); 319 if (instance->setup_buffer) 320 free(instance->setup_buffer); 321 if (instance->transport_buffer) 322 free(instance->transport_buffer); 323 free(instance); 182 324 } 183 325 /** -
uspace/drv/ohci/batch.h
r41ef5b9 rfd9f6e4c 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 /** @addtogroup drvusb ohci28 /** @addtogroup drvusbuhcihc 29 29 * @{ 30 30 */ 31 31 /** @file 32 * @brief OHCI driver USB transaction structure32 * @brief UHCI driver USB transaction structure 33 33 */ 34 #ifndef DRV_ OHCI_BATCH_H35 #define DRV_ OHCI_BATCH_H34 #ifndef DRV_UHCI_BATCH_H 35 #define DRV_UHCI_BATCH_H 36 36 37 #include <adt/list.h> 37 38 38 39 #include <usbhc_iface.h> 39 40 #include <usb/usb.h> 40 #include <usb/host/device_keeper.h>41 #include <usb/host/batch.h>42 41 43 usb_transfer_batch_t * batch_get( 42 typedef struct batch 43 { 44 link_t link; 45 usb_speed_t speed; 46 usb_target_t target; 47 usb_transfer_type_t transfer_type; 48 usbhc_iface_transfer_in_callback_t callback_in; 49 usbhc_iface_transfer_out_callback_t callback_out; 50 void *arg; 51 char *transport_buffer; 52 char *setup_buffer; 53 size_t setup_size; 54 char *buffer; 55 size_t buffer_size; 56 size_t max_packet_size; 57 size_t packets; 58 size_t transfered_size; 59 int error; 60 ddf_fun_t *fun; 61 void (*next_step)(struct batch*); 62 } batch_t; 63 64 batch_t * batch_get( 44 65 ddf_fun_t *fun, 45 66 usb_target_t target, … … 53 74 usbhc_iface_transfer_in_callback_t func_in, 54 75 usbhc_iface_transfer_out_callback_t func_out, 55 void *arg, 56 usb_device_keeper_t *manager 76 void *arg 57 77 ); 58 78 59 void batch_dispose( usb_transfer_batch_t *instance);79 void batch_dispose(batch_t *instance); 60 80 61 void batch_ control_write(usb_transfer_batch_t *instance);81 void batch_finish(batch_t *instance, int error); 62 82 63 void batch_control_read(usb_transfer_batch_t *instance);83 bool batch_is_complete(batch_t *instance); 64 84 65 void batch_ interrupt_in(usb_transfer_batch_t *instance);85 void batch_control_write(batch_t *instance); 66 86 67 void batch_ interrupt_out(usb_transfer_batch_t *instance);87 void batch_control_read(batch_t *instance); 68 88 69 void batch_ bulk_in(usb_transfer_batch_t *instance);89 void batch_interrupt_in(batch_t *instance); 70 90 71 void batch_bulk_out(usb_transfer_batch_t *instance); 91 void batch_interrupt_out(batch_t *instance); 92 93 void batch_bulk_in(batch_t *instance); 94 95 void batch_bulk_out(batch_t *instance); 72 96 #endif 73 97 /** -
uspace/drv/ohci/iface.h
r41ef5b9 rfd9f6e4c 40 40 #define NAME "ohci" 41 41 42 extern usbhc_iface_t hc_iface;42 extern usbhc_iface_t ohci_hc_iface; 43 43 44 44 #endif -
uspace/drv/ohci/main.c
r41ef5b9 rfd9f6e4c 45 45 #include "pci.h" 46 46 #include "iface.h" 47 #include " hc.h"47 #include "ohci_hc.h" 48 48 49 49 static int ohci_add_device(ddf_dev_t *device); 50 static int get_hc_handle(ddf_fun_t *fun, devman_handle_t *handle)51 {52 assert(handle);53 assert(fun != NULL);54 55 *handle = fun->handle;56 return EOK;57 }58 /*----------------------------------------------------------------------------*/59 static int get_address(60 ddf_fun_t *fun, devman_handle_t handle, usb_address_t *address)61 {62 assert(fun);63 usb_device_keeper_t *manager = &fun_to_hc(fun)->manager;64 usb_address_t addr = usb_device_keeper_find(manager, handle);65 if (addr < 0) {66 return addr;67 }68 69 if (address != NULL) {70 *address = addr;71 }72 73 return EOK;74 }75 50 /*----------------------------------------------------------------------------*/ 76 51 /** IRQ handling callback, identifies device … … 83 58 { 84 59 assert(dev); 85 hc_t *hc = (hc_t*)dev->driver_data;60 ohci_hc_t *hc = (ohci_hc_t*)dev->driver_data; 86 61 assert(hc); 87 hc_interrupt(hc, 0);62 ohci_hc_interrupt(hc, 0); 88 63 } 89 64 /*----------------------------------------------------------------------------*/ … … 96 71 .driver_ops = &ohci_driver_ops 97 72 }; 98 /*----------------------------------------------------------------------------*/ 99 static usb_iface_t hc_usb_iface = { 100 .get_address = get_address, 101 .get_hc_handle = get_hc_handle, 73 static ddf_dev_ops_t hc_ops = { 74 .interfaces[USBHC_DEV_IFACE] = &ohci_hc_iface, 102 75 }; 103 /*----------------------------------------------------------------------------*/ 104 static ddf_dev_ops_t hc_ops = { 105 .interfaces[USB_DEV_IFACE] = &hc_usb_iface, 106 .interfaces[USBHC_DEV_IFACE] = &hc_iface, 107 }; 76 108 77 /*----------------------------------------------------------------------------*/ 109 78 /** Initializes a new ddf driver instance of OHCI hcd. … … 136 105 "Failed(%d) disable legacy USB: %s.\n", ret, str_error(ret)); 137 106 138 hc_t *hcd = malloc(sizeof(hc_t));107 ohci_hc_t *hcd = malloc(sizeof(ohci_hc_t)); 139 108 if (hcd == NULL) { 140 109 usb_log_error("Failed to allocate OHCI driver.\n"); … … 160 129 } 161 130 162 ret = hc_init(hcd, hc_fun, device, mem_reg_base, mem_reg_size, interrupts);131 ret = ohci_hc_init(hcd, hc_fun, mem_reg_base, mem_reg_size, interrupts); 163 132 if (ret != EOK) { 164 133 usb_log_error("Failed to initialize OHCI driver.\n"); … … 179 148 hc_fun->driver_data = hcd; 180 149 181 fid_t later = fibril_create((int(*)(void*))hc_register_hub, hcd); 182 fibril_add_ready(later); 150 /* TODO: register interrupt handler */ 183 151 184 152 usb_log_info("Controlling new OHCI device `%s' (handle %llu).\n", -
uspace/drv/ohci/ohci_regs.h
r41ef5b9 rfd9f6e4c 43 43 volatile uint32_t command_status; 44 44 volatile uint32_t interrupt_status; 45 #define IS_SO (1 << 0)46 #define IS_WDH (1 << 1)47 #define IS_SF (1 << 2)48 #define IS_RD (1 << 3)49 #define IS_UE (1 << 4)50 #define IS_FNO (1 << 5)51 #define IS_RHSC (1 << 6)52 #define IS_OC (1 << 30)53 45 volatile uint32_t interupt_enable; 54 46 #define IE_SO (1 << 0) -
uspace/drv/uhci-hcd/Makefile
r41ef5b9 rfd9f6e4c 40 40 uhci_rh.c \ 41 41 uhci_struct/transfer_descriptor.c \ 42 utils/device_keeper.c \ 42 43 pci.c \ 43 44 batch.c -
uspace/drv/uhci-hcd/batch.c
r41ef5b9 rfd9f6e4c 42 42 #include "uhci_hc.h" 43 43 #include "utils/malloc32.h" 44 #include "uhci_struct/transfer_descriptor.h"45 44 46 45 #define DEFAULT_ERROR_COUNT 3 47 46 48 typedef struct uhci_batch { 49 qh_t *qh; 50 td_t *tds; 51 size_t packets; 52 usb_device_keeper_t *manager; 53 } uhci_batch_t; 54 55 static void batch_control(usb_transfer_batch_t *instance, 47 static void batch_control(batch_t *instance, 56 48 usb_packet_id data_stage, usb_packet_id status_stage); 57 static void batch_data(usb_transfer_batch_t *instance, usb_packet_id pid); 58 static void batch_call_in_and_dispose(usb_transfer_batch_t *instance); 59 static void batch_call_out_and_dispose(usb_transfer_batch_t *instance); 49 static void batch_data(batch_t *instance, usb_packet_id pid); 50 static void batch_call_in(batch_t *instance); 51 static void batch_call_out(batch_t *instance); 52 static void batch_call_in_and_dispose(batch_t *instance); 53 static void batch_call_out_and_dispose(batch_t *instance); 60 54 61 55 … … 82 76 * transaction and callback. 83 77 */ 84 usb_transfer_batch_t * batch_get(ddf_fun_t *fun, usb_target_t target,78 batch_t * batch_get(ddf_fun_t *fun, usb_target_t target, 85 79 usb_transfer_type_t transfer_type, size_t max_packet_size, 86 usb_speed_t speed, char *buffer, size_t buffer_size,80 usb_speed_t speed, char *buffer, size_t size, 87 81 char* setup_buffer, size_t setup_size, 88 82 usbhc_iface_transfer_in_callback_t func_in, 89 83 usbhc_iface_transfer_out_callback_t func_out, void *arg, 90 usb_device_keeper_t *manager84 device_keeper_t *manager 91 85 ) 92 86 { … … 103 97 } else (void)0 104 98 105 usb_transfer_batch_t *instance = malloc(sizeof(usb_transfer_batch_t));99 batch_t *instance = malloc(sizeof(batch_t)); 106 100 CHECK_NULL_DISPOSE_RETURN(instance, 107 101 "Failed to allocate batch instance.\n"); 108 usb_transfer_batch_init(instance, target, transfer_type, speed, max_packet_size, 109 buffer, NULL, buffer_size, NULL, setup_size, func_in, 110 func_out, arg, fun, NULL); 111 112 113 uhci_batch_t *data = malloc(sizeof(uhci_batch_t)); 114 CHECK_NULL_DISPOSE_RETURN(instance, 115 "Failed to allocate batch instance.\n"); 116 bzero(data, sizeof(uhci_batch_t)); 117 data->manager = manager; 118 instance->private_data = data; 119 120 data->packets = (buffer_size + max_packet_size - 1) / max_packet_size; 102 bzero(instance, sizeof(batch_t)); 103 104 instance->qh = malloc32(sizeof(qh_t)); 105 CHECK_NULL_DISPOSE_RETURN(instance->qh, 106 "Failed to allocate batch queue head.\n"); 107 qh_init(instance->qh); 108 109 instance->packets = (size + max_packet_size - 1) / max_packet_size; 121 110 if (transfer_type == USB_TRANSFER_CONTROL) { 122 data->packets += 2;123 } 124 125 data->tds = malloc32(sizeof(td_t) * data->packets);111 instance->packets += 2; 112 } 113 114 instance->tds = malloc32(sizeof(td_t) * instance->packets); 126 115 CHECK_NULL_DISPOSE_RETURN( 127 data->tds, "Failed to allocate transfer descriptors.\n"); 128 bzero(data->tds, sizeof(td_t) * data->packets); 129 130 data->qh = malloc32(sizeof(qh_t)); 131 CHECK_NULL_DISPOSE_RETURN(data->qh, 132 "Failed to allocate batch queue head.\n"); 133 qh_init(data->qh); 134 qh_set_element_td(data->qh, addr_to_phys(data->tds)); 135 136 if (buffer_size > 0) { 137 instance->transport_buffer = malloc32(buffer_size); 116 instance->tds, "Failed to allocate transfer descriptors.\n"); 117 bzero(instance->tds, sizeof(td_t) * instance->packets); 118 119 if (size > 0) { 120 instance->transport_buffer = malloc32(size); 138 121 CHECK_NULL_DISPOSE_RETURN(instance->transport_buffer, 139 122 "Failed to allocate device accessible buffer.\n"); … … 147 130 } 148 131 132 133 link_initialize(&instance->link); 134 135 instance->max_packet_size = max_packet_size; 136 instance->target = target; 137 instance->transfer_type = transfer_type; 138 instance->buffer = buffer; 139 instance->buffer_size = size; 140 instance->setup_size = setup_size; 141 instance->fun = fun; 142 instance->arg = arg; 143 instance->speed = speed; 144 instance->manager = manager; 145 instance->callback_out = func_out; 146 instance->callback_in = func_in; 147 148 qh_set_element_td(instance->qh, addr_to_phys(instance->tds)); 149 149 150 usb_log_debug("Batch(%p) %d:%d memory structures ready.\n", 150 151 instance, target.address, target.endpoint); … … 152 153 } 153 154 /*----------------------------------------------------------------------------*/ 155 /** Mark batch as failed and continue with next step. 156 * 157 * @param[in] instance Batch structure to use. 158 * 159 */ 160 void batch_abort(batch_t *instance) 161 { 162 assert(instance); 163 instance->error = EIO; 164 instance->next_step(instance); 165 } 166 /*----------------------------------------------------------------------------*/ 154 167 /** Check batch TDs for activity. 155 168 * … … 161 174 * is reached. 162 175 */ 163 bool batch_is_complete(usb_transfer_batch_t *instance) 164 { 165 assert(instance); 166 uhci_batch_t *data = instance->private_data; 167 assert(data); 168 176 bool batch_is_complete(batch_t *instance) 177 { 178 assert(instance); 169 179 usb_log_debug2("Batch(%p) checking %d packet(s) for completion.\n", 170 instance, data->packets);180 instance, instance->packets); 171 181 instance->transfered_size = 0; 172 182 size_t i = 0; 173 for (;i < data->packets; ++i) {174 if (td_is_active(& data->tds[i])) {183 for (;i < instance->packets; ++i) { 184 if (td_is_active(&instance->tds[i])) { 175 185 return false; 176 186 } 177 187 178 instance->error = td_status(& data->tds[i]);188 instance->error = td_status(&instance->tds[i]); 179 189 if (instance->error != EOK) { 180 190 usb_log_debug("Batch(%p) found error TD(%d):%x.\n", 181 instance, i, data->tds[i].status); 182 td_print_status(&data->tds[i]); 183 184 usb_device_keeper_set_toggle(data->manager, 185 instance->target, instance->direction, 186 td_toggle(&data->tds[i])); 191 instance, i, instance->tds[i].status); 192 td_print_status(&instance->tds[i]); 193 194 device_keeper_set_toggle(instance->manager, 195 instance->target, td_toggle(&instance->tds[i])); 187 196 if (i > 0) 188 197 goto substract_ret; … … 190 199 } 191 200 192 instance->transfered_size += td_act_size(& data->tds[i]);193 if (td_is_short(& data->tds[i]))201 instance->transfered_size += td_act_size(&instance->tds[i]); 202 if (td_is_short(&instance->tds[i])) 194 203 goto substract_ret; 195 204 } … … 205 214 * Uses genercir control function with pids OUT and IN. 206 215 */ 207 void batch_control_write( usb_transfer_batch_t *instance)216 void batch_control_write(batch_t *instance) 208 217 { 209 218 assert(instance); … … 222 231 * Uses generic control with pids IN and OUT. 223 232 */ 224 void batch_control_read( usb_transfer_batch_t *instance)233 void batch_control_read(batch_t *instance) 225 234 { 226 235 assert(instance); … … 236 245 * Data transaction with PID_IN. 237 246 */ 238 void batch_interrupt_in(usb_transfer_batch_t *instance) 239 { 240 assert(instance); 241 instance->direction = USB_DIRECTION_IN; 247 void batch_interrupt_in(batch_t *instance) 248 { 249 assert(instance); 242 250 batch_data(instance, USB_PID_IN); 243 251 instance->next_step = batch_call_in_and_dispose; … … 251 259 * Data transaction with PID_OUT. 252 260 */ 253 void batch_interrupt_out(usb_transfer_batch_t *instance) 254 { 255 assert(instance); 256 instance->direction = USB_DIRECTION_OUT; 261 void batch_interrupt_out(batch_t *instance) 262 { 263 assert(instance); 257 264 /* We are data out, we are supposed to provide data */ 258 265 memcpy(instance->transport_buffer, instance->buffer, … … 269 276 * Data transaction with PID_IN. 270 277 */ 271 void batch_bulk_in( usb_transfer_batch_t *instance)278 void batch_bulk_in(batch_t *instance) 272 279 { 273 280 assert(instance); 274 281 batch_data(instance, USB_PID_IN); 275 instance->direction = USB_DIRECTION_IN;276 282 instance->next_step = batch_call_in_and_dispose; 277 283 usb_log_debug("Batch(%p) BULK IN initialized.\n", instance); … … 284 290 * Data transaction with PID_OUT. 285 291 */ 286 void batch_bulk_out(usb_transfer_batch_t *instance) 287 { 288 assert(instance); 289 instance->direction = USB_DIRECTION_OUT; 292 void batch_bulk_out(batch_t *instance) 293 { 294 assert(instance); 290 295 /* We are data out, we are supposed to provide data */ 291 296 memcpy(instance->transport_buffer, instance->buffer, … … 304 309 * The last packet is marked with IOC flag. 305 310 */ 306 void batch_data(usb_transfer_batch_t *instance, usb_packet_id pid) 307 { 308 assert(instance); 309 uhci_batch_t *data = instance->private_data; 310 assert(data); 311 311 void batch_data(batch_t *instance, usb_packet_id pid) 312 { 313 assert(instance); 312 314 const bool low_speed = instance->speed == USB_SPEED_LOW; 313 int toggle = usb_device_keeper_get_toggle(314 d ata->manager, instance->target, instance->direction);315 int toggle = 316 device_keeper_get_toggle(instance->manager, instance->target); 315 317 assert(toggle == 0 || toggle == 1); 316 318 … … 318 320 size_t remain_size = instance->buffer_size; 319 321 while (remain_size > 0) { 320 char * trans_data =322 char *data = 321 323 instance->transport_buffer + instance->buffer_size 322 324 - remain_size; … … 326 328 remain_size : instance->max_packet_size; 327 329 328 td_t *next_packet = (packet + 1 < data->packets)329 ? & data->tds[packet + 1] : NULL;330 331 assert(packet < data->packets);330 td_t *next_packet = (packet + 1 < instance->packets) 331 ? &instance->tds[packet + 1] : NULL; 332 333 assert(packet < instance->packets); 332 334 assert(packet_size <= remain_size); 333 335 334 336 td_init( 335 & data->tds[packet], DEFAULT_ERROR_COUNT, packet_size,336 toggle, false, low_speed, instance->target, pid, trans_data,337 &instance->tds[packet], DEFAULT_ERROR_COUNT, packet_size, 338 toggle, false, low_speed, instance->target, pid, data, 337 339 next_packet); 338 340 … … 342 344 ++packet; 343 345 } 344 td_set_ioc(&data->tds[packet - 1]); 345 usb_device_keeper_set_toggle(data->manager, instance->target, 346 instance->direction, toggle); 346 td_set_ioc(&instance->tds[packet - 1]); 347 device_keeper_set_toggle(instance->manager, instance->target, toggle); 347 348 } 348 349 /*----------------------------------------------------------------------------*/ … … 358 359 * The last packet is marked with IOC. 359 360 */ 360 void batch_control( usb_transfer_batch_t *instance,361 void batch_control(batch_t *instance, 361 362 usb_packet_id data_stage, usb_packet_id status_stage) 362 363 { 363 364 assert(instance); 364 uhci_batch_t *data = instance->private_data;365 assert(data);366 assert(data->packets >= 2);367 365 368 366 const bool low_speed = instance->speed == USB_SPEED_LOW; 369 367 int toggle = 0; 370 368 /* setup stage */ 371 td_init( 372 data->tds, DEFAULT_ERROR_COUNT, instance->setup_size, toggle, false, 373 low_speed, instance->target, USB_PID_SETUP, instance->setup_buffer, 374 &data->tds[1]); 369 td_init(instance->tds, DEFAULT_ERROR_COUNT, 370 instance->setup_size, toggle, false, low_speed, instance->target, 371 USB_PID_SETUP, instance->setup_buffer, &instance->tds[1]); 375 372 376 373 /* data stage */ … … 378 375 size_t remain_size = instance->buffer_size; 379 376 while (remain_size > 0) { 380 char * control_data =377 char *data = 381 378 instance->transport_buffer + instance->buffer_size 382 379 - remain_size; … … 389 386 390 387 td_init( 391 & data->tds[packet], DEFAULT_ERROR_COUNT, packet_size,388 &instance->tds[packet], DEFAULT_ERROR_COUNT, packet_size, 392 389 toggle, false, low_speed, instance->target, data_stage, 393 control_data, &data->tds[packet + 1]);390 data, &instance->tds[packet + 1]); 394 391 395 392 ++packet; 396 assert(packet < data->packets);393 assert(packet < instance->packets); 397 394 assert(packet_size <= remain_size); 398 395 remain_size -= packet_size; … … 400 397 401 398 /* status stage */ 402 assert(packet == data->packets - 1); 403 404 td_init( 405 &data->tds[packet], DEFAULT_ERROR_COUNT, 0, 1, false, low_speed, 406 instance->target, status_stage, NULL, NULL); 407 td_set_ioc(&data->tds[packet]); 408 399 assert(packet == instance->packets - 1); 400 td_init(&instance->tds[packet], DEFAULT_ERROR_COUNT, 401 0, 1, false, low_speed, instance->target, status_stage, NULL, NULL); 402 403 td_set_ioc(&instance->tds[packet]); 409 404 usb_log_debug2("Control last TD status: %x.\n", 410 data->tds[packet].status); 411 } 412 /*----------------------------------------------------------------------------*/ 413 qh_t * batch_qh(usb_transfer_batch_t *instance) 414 { 415 assert(instance); 416 uhci_batch_t *data = instance->private_data; 417 assert(data); 418 return data->qh; 405 instance->tds[packet].status); 406 } 407 /*----------------------------------------------------------------------------*/ 408 /** Prepare data, get error status and call callback in. 409 * 410 * @param[in] instance Batch structure to use. 411 * Copies data from transport buffer, and calls callback with appropriate 412 * parameters. 413 */ 414 void batch_call_in(batch_t *instance) 415 { 416 assert(instance); 417 assert(instance->callback_in); 418 419 /* We are data in, we need data */ 420 memcpy(instance->buffer, instance->transport_buffer, 421 instance->buffer_size); 422 423 int err = instance->error; 424 usb_log_debug("Batch(%p) callback IN(type:%d): %s(%d), %zu.\n", 425 instance, instance->transfer_type, str_error(err), err, 426 instance->transfered_size); 427 428 instance->callback_in( 429 instance->fun, err, instance->transfered_size, instance->arg); 430 } 431 /*----------------------------------------------------------------------------*/ 432 /** Get error status and call callback out. 433 * 434 * @param[in] instance Batch structure to use. 435 */ 436 void batch_call_out(batch_t *instance) 437 { 438 assert(instance); 439 assert(instance->callback_out); 440 441 int err = instance->error; 442 usb_log_debug("Batch(%p) callback OUT(type:%d): %s(%d).\n", 443 instance, instance->transfer_type, str_error(err), err); 444 instance->callback_out(instance->fun, 445 err, instance->arg); 419 446 } 420 447 /*----------------------------------------------------------------------------*/ … … 423 450 * @param[in] instance Batch structure to use. 424 451 */ 425 void batch_call_in_and_dispose( usb_transfer_batch_t *instance)426 { 427 assert(instance); 428 usb_transfer_batch_call_in(instance);452 void batch_call_in_and_dispose(batch_t *instance) 453 { 454 assert(instance); 455 batch_call_in(instance); 429 456 batch_dispose(instance); 430 457 } … … 434 461 * @param[in] instance Batch structure to use. 435 462 */ 436 void batch_call_out_and_dispose( usb_transfer_batch_t *instance)437 { 438 assert(instance); 439 usb_transfer_batch_call_out(instance);463 void batch_call_out_and_dispose(batch_t *instance) 464 { 465 assert(instance); 466 batch_call_out(instance); 440 467 batch_dispose(instance); 441 468 } … … 445 472 * @param[in] instance Batch structure to use. 446 473 */ 447 void batch_dispose(usb_transfer_batch_t *instance) 448 { 449 assert(instance); 450 uhci_batch_t *data = instance->private_data; 451 assert(data); 474 void batch_dispose(batch_t *instance) 475 { 476 assert(instance); 452 477 usb_log_debug("Batch(%p) disposing.\n", instance); 453 478 /* free32 is NULL safe */ 454 free32( data->tds);455 free32( data->qh);479 free32(instance->tds); 480 free32(instance->qh); 456 481 free32(instance->setup_buffer); 457 482 free32(instance->transport_buffer); 458 free(data);459 483 free(instance); 460 484 } -
uspace/drv/uhci-hcd/batch.h
r41ef5b9 rfd9f6e4c 39 39 #include <usbhc_iface.h> 40 40 #include <usb/usb.h> 41 #include <usb/host/device_keeper.h>42 #include <usb/host/batch.h>43 41 42 #include "uhci_struct/transfer_descriptor.h" 44 43 #include "uhci_struct/queue_head.h" 44 #include "utils/device_keeper.h" 45 45 46 usb_transfer_batch_t * batch_get( 46 typedef struct batch 47 { 48 link_t link; 49 usb_speed_t speed; 50 usb_target_t target; 51 usb_transfer_type_t transfer_type; 52 usbhc_iface_transfer_in_callback_t callback_in; 53 usbhc_iface_transfer_out_callback_t callback_out; 54 void *arg; 55 char *transport_buffer; 56 char *setup_buffer; 57 size_t setup_size; 58 char *buffer; 59 size_t buffer_size; 60 size_t max_packet_size; 61 size_t packets; 62 size_t transfered_size; 63 int error; 64 ddf_fun_t *fun; 65 qh_t *qh; 66 td_t *tds; 67 void (*next_step)(struct batch*); 68 device_keeper_t *manager; 69 } batch_t; 70 71 batch_t * batch_get( 47 72 ddf_fun_t *fun, 48 73 usb_target_t target, … … 57 82 usbhc_iface_transfer_out_callback_t func_out, 58 83 void *arg, 59 usb_device_keeper_t *manager84 device_keeper_t *manager 60 85 ); 61 86 62 void batch_dispose( usb_transfer_batch_t *instance);87 void batch_dispose(batch_t *instance); 63 88 64 bool batch_is_complete(usb_transfer_batch_t *instance);89 void batch_abort(batch_t *instance); 65 90 66 void batch_control_write(usb_transfer_batch_t *instance);91 bool batch_is_complete(batch_t *instance); 67 92 68 void batch_control_ read(usb_transfer_batch_t *instance);93 void batch_control_write(batch_t *instance); 69 94 70 void batch_ interrupt_in(usb_transfer_batch_t *instance);95 void batch_control_read(batch_t *instance); 71 96 72 void batch_interrupt_ out(usb_transfer_batch_t *instance);97 void batch_interrupt_in(batch_t *instance); 73 98 74 void batch_ bulk_in(usb_transfer_batch_t *instance);99 void batch_interrupt_out(batch_t *instance); 75 100 76 void batch_bulk_ out(usb_transfer_batch_t *instance);101 void batch_bulk_in(batch_t *instance); 77 102 78 qh_t * batch_qh(usb_transfer_batch_t *instance);103 void batch_bulk_out(batch_t *instance); 79 104 #endif 80 105 /** -
uspace/drv/uhci-hcd/iface.c
r41ef5b9 rfd9f6e4c 41 41 #include "iface.h" 42 42 #include "uhci_hc.h" 43 #include "utils/device_keeper.h" 43 44 44 45 /** Reserve default address interface function … … 55 56 assert(hc); 56 57 usb_log_debug("Default address request with speed %d.\n", speed); 57 usb_device_keeper_reserve_default_address(&hc->device_manager, speed);58 device_keeper_reserve_default(&hc->device_manager, speed); 58 59 return EOK; 59 60 } … … 70 71 assert(hc); 71 72 usb_log_debug("Default address release.\n"); 72 usb_device_keeper_release_default_address(&hc->device_manager);73 device_keeper_release_default(&hc->device_manager); 73 74 return EOK; 74 75 } … … 90 91 91 92 usb_log_debug("Address request with speed %d.\n", speed); 92 *address = device_keeper_ get_free_address(&hc->device_manager, speed);93 *address = device_keeper_request(&hc->device_manager, speed); 93 94 usb_log_debug("Address request with result: %d.\n", *address); 94 95 if (*address <= 0) … … 111 112 assert(hc); 112 113 usb_log_debug("Address bind %d-%d.\n", address, handle); 113 usb_device_keeper_bind(&hc->device_manager, address, handle);114 device_keeper_bind(&hc->device_manager, address, handle); 114 115 return EOK; 115 116 } … … 127 128 assert(hc); 128 129 usb_log_debug("Address release %d.\n", address); 129 usb_device_keeper_release(&hc->device_manager, address);130 device_keeper_release(&hc->device_manager, address); 130 131 return EOK; 131 132 } … … 149 150 uhci_hc_t *hc = fun_to_uhci_hc(fun); 150 151 assert(hc); 151 usb_speed_t speed = usb_device_keeper_get_speed(&hc->device_manager, target.address);152 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address); 152 153 153 154 usb_log_debug("Interrupt OUT %d:%d %zu(%zu).\n", 154 155 target.address, target.endpoint, size, max_packet_size); 155 156 156 usb_transfer_batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT,157 batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT, 157 158 max_packet_size, speed, data, size, NULL, 0, NULL, callback, arg, 158 159 &hc->device_manager); … … 186 187 uhci_hc_t *hc = fun_to_uhci_hc(fun); 187 188 assert(hc); 188 usb_speed_t speed = usb_device_keeper_get_speed(&hc->device_manager, target.address);189 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address); 189 190 usb_log_debug("Interrupt IN %d:%d %zu(%zu).\n", 190 191 target.address, target.endpoint, size, max_packet_size); 191 192 192 usb_transfer_batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT,193 batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT, 193 194 max_packet_size, speed, data, size, NULL, 0, callback, NULL, arg, 194 195 &hc->device_manager); … … 222 223 uhci_hc_t *hc = fun_to_uhci_hc(fun); 223 224 assert(hc); 224 usb_speed_t speed = usb_device_keeper_get_speed(&hc->device_manager, target.address);225 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address); 225 226 226 227 usb_log_debug("Bulk OUT %d:%d %zu(%zu).\n", 227 228 target.address, target.endpoint, size, max_packet_size); 228 229 229 usb_transfer_batch_t *batch = batch_get(fun, target, USB_TRANSFER_BULK,230 batch_t *batch = batch_get(fun, target, USB_TRANSFER_BULK, 230 231 max_packet_size, speed, data, size, NULL, 0, NULL, callback, arg, 231 232 &hc->device_manager); … … 259 260 uhci_hc_t *hc = fun_to_uhci_hc(fun); 260 261 assert(hc); 261 usb_speed_t speed = usb_device_keeper_get_speed(&hc->device_manager, target.address);262 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address); 262 263 usb_log_debug("Bulk IN %d:%d %zu(%zu).\n", 263 264 target.address, target.endpoint, size, max_packet_size); 264 265 265 usb_transfer_batch_t *batch = batch_get(fun, target, USB_TRANSFER_BULK,266 batch_t *batch = batch_get(fun, target, USB_TRANSFER_BULK, 266 267 max_packet_size, speed, data, size, NULL, 0, callback, NULL, arg, 267 268 &hc->device_manager); … … 298 299 uhci_hc_t *hc = fun_to_uhci_hc(fun); 299 300 assert(hc); 300 usb_speed_t speed = usb_device_keeper_get_speed(&hc->device_manager, target.address);301 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address); 301 302 usb_log_debug("Control WRITE (%d) %d:%d %zu(%zu).\n", 302 303 speed, target.address, target.endpoint, size, max_packet_size); … … 305 306 return EINVAL; 306 307 307 usb_transfer_batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL,308 batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL, 308 309 max_packet_size, speed, data, size, setup_data, setup_size, 309 310 NULL, callback, arg, &hc->device_manager); 310 311 if (!batch) 311 312 return ENOMEM; 312 usb_device_keeper_reset_if_need(&hc->device_manager, target, setup_data);313 device_keeper_reset_if_need(&hc->device_manager, target, setup_data); 313 314 batch_control_write(batch); 314 315 const int ret = uhci_hc_schedule(hc, batch); … … 341 342 uhci_hc_t *hc = fun_to_uhci_hc(fun); 342 343 assert(hc); 343 usb_speed_t speed = usb_device_keeper_get_speed(&hc->device_manager, target.address);344 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address); 344 345 345 346 usb_log_debug("Control READ(%d) %d:%d %zu(%zu).\n", 346 347 speed, target.address, target.endpoint, size, max_packet_size); 347 usb_transfer_batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL,348 batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL, 348 349 max_packet_size, speed, data, size, setup_data, setup_size, callback, 349 350 NULL, arg, &hc->device_manager); -
uspace/drv/uhci-hcd/transfer_list.c
r41ef5b9 rfd9f6e4c 38 38 39 39 static void transfer_list_remove_batch( 40 transfer_list_t *instance, usb_transfer_batch_t *batch);40 transfer_list_t *instance, batch_t *batch); 41 41 /*----------------------------------------------------------------------------*/ 42 42 /** Initialize transfer list structures. … … 92 92 * The batch is added to the end of the list and queue. 93 93 */ 94 void transfer_list_add_batch(transfer_list_t *instance, usb_transfer_batch_t *batch)94 void transfer_list_add_batch(transfer_list_t *instance, batch_t *batch) 95 95 { 96 96 assert(instance); … … 98 98 usb_log_debug2("Queue %s: Adding batch(%p).\n", instance->name, batch); 99 99 100 const uint32_t pa = addr_to_phys(batch _qh(batch));100 const uint32_t pa = addr_to_phys(batch->qh); 101 101 assert((pa & LINK_POINTER_ADDRESS_MASK) == pa); 102 102 103 103 /* New batch will be added to the end of the current list 104 104 * so set the link accordingly */ 105 qh_set_next_qh(batch _qh(batch), instance->queue_head->next);105 qh_set_next_qh(batch->qh, instance->queue_head->next); 106 106 107 107 fibril_mutex_lock(&instance->guard); … … 115 115 } else { 116 116 /* There is something scheduled */ 117 usb_transfer_batch_t *last = list_get_instance(118 instance->batch_list.prev, usb_transfer_batch_t, link);119 qh_set_next_qh( batch_qh(last), pa);117 batch_t *last = list_get_instance( 118 instance->batch_list.prev, batch_t, link); 119 qh_set_next_qh(last->qh, pa); 120 120 } 121 121 /* Add to the driver list */ 122 122 list_append(&batch->link, &instance->batch_list); 123 123 124 usb_transfer_batch_t *first = list_get_instance(125 instance->batch_list.next, usb_transfer_batch_t, link);124 batch_t *first = list_get_instance( 125 instance->batch_list.next, batch_t, link); 126 126 usb_log_debug("Batch(%p) added to queue %s, first is %p.\n", 127 127 batch, instance->name, first); … … 148 148 while (current != &instance->batch_list) { 149 149 link_t *next = current->next; 150 usb_transfer_batch_t *batch = list_get_instance(current, usb_transfer_batch_t, link);150 batch_t *batch = list_get_instance(current, batch_t, link); 151 151 152 152 if (batch_is_complete(batch)) { … … 162 162 link_t *item = done.next; 163 163 list_remove(item); 164 usb_transfer_batch_t *batch = list_get_instance(item, usb_transfer_batch_t, link);164 batch_t *batch = list_get_instance(item, batch_t, link); 165 165 batch->next_step(batch); 166 166 } … … 176 176 while (list_empty(&instance->batch_list)) { 177 177 link_t *current = instance->batch_list.next; 178 usb_transfer_batch_t *batch = list_get_instance(current, usb_transfer_batch_t, link);178 batch_t *batch = list_get_instance(current, batch_t, link); 179 179 transfer_list_remove_batch(instance, batch); 180 usb_transfer_batch_finish(batch, EIO);180 batch_abort(batch); 181 181 } 182 182 fibril_mutex_unlock(&instance->guard); … … 191 191 * Does not lock the transfer list, caller is responsible for that. 192 192 */ 193 void transfer_list_remove_batch(transfer_list_t *instance, usb_transfer_batch_t *batch) 194 { 195 assert(instance); 193 void transfer_list_remove_batch(transfer_list_t *instance, batch_t *batch) 194 { 195 assert(instance); 196 assert(batch); 196 197 assert(instance->queue_head); 197 assert(batch); 198 assert(batch_qh(batch)); 198 assert(batch->qh); 199 199 usb_log_debug2( 200 200 "Queue %s: removing batch(%p).\n", instance->name, batch); … … 204 204 if (batch->link.prev == &instance->batch_list) { 205 205 /* I'm the first one here */ 206 qh_set_element_qh(instance->queue_head, batch _qh(batch)->next);206 qh_set_element_qh(instance->queue_head, batch->qh->next); 207 207 pos = "FIRST"; 208 208 } else { 209 usb_transfer_batch_t *prev =210 list_get_instance(batch->link.prev, usb_transfer_batch_t, link);211 qh_set_next_qh( batch_qh(prev), batch_qh(batch)->next);209 batch_t *prev = 210 list_get_instance(batch->link.prev, batch_t, link); 211 qh_set_next_qh(prev->qh, batch->qh->next); 212 212 pos = "NOT FIRST"; 213 213 } … … 215 215 list_remove(&batch->link); 216 216 usb_log_debug("Batch(%p) removed (%s) from %s, next element %x.\n", 217 batch, pos, instance->name, batch _qh(batch)->next);217 batch, pos, instance->name, batch->qh->next); 218 218 } 219 219 /** -
uspace/drv/uhci-hcd/transfer_list.h
r41ef5b9 rfd9f6e4c 66 66 void transfer_list_set_next(transfer_list_t *instance, transfer_list_t *next); 67 67 68 void transfer_list_add_batch(transfer_list_t *instance, usb_transfer_batch_t *batch);68 void transfer_list_add_batch(transfer_list_t *instance, batch_t *batch); 69 69 70 70 void transfer_list_remove_finished(transfer_list_t *instance); -
uspace/drv/uhci-hcd/uhci.c
r41ef5b9 rfd9f6e4c 70 70 { 71 71 assert(fun); 72 usb_device_keeper_t *manager = &((uhci_t*)fun->dev->driver_data)->hc.device_manager;73 74 usb_address_t addr = usb_device_keeper_find(manager, handle);72 device_keeper_t *manager = &((uhci_t*)fun->dev->driver_data)->hc.device_manager; 73 74 usb_address_t addr = device_keeper_find(manager, handle); 75 75 if (addr < 0) { 76 76 return addr; -
uspace/drv/uhci-hcd/uhci_hc.c
r41ef5b9 rfd9f6e4c 121 121 fibril_create(uhci_hc_interrupt_emulator, instance); 122 122 fibril_add_ready(instance->cleaner); 123 } else {124 /* TODO: enable interrupts here */125 123 } 126 124 … … 236 234 237 235 /* Init device keeper*/ 238 usb_device_keeper_init(&instance->device_manager);236 device_keeper_init(&instance->device_manager); 239 237 usb_log_debug("Initialized device manager.\n"); 240 238 … … 318 316 * Checks for bandwidth availability and appends the batch to the proper queue. 319 317 */ 320 int uhci_hc_schedule(uhci_hc_t *instance, usb_transfer_batch_t *batch)318 int uhci_hc_schedule(uhci_hc_t *instance, batch_t *batch) 321 319 { 322 320 assert(instance); -
uspace/drv/uhci-hcd/uhci_hc.h
r41ef5b9 rfd9f6e4c 42 42 43 43 #include <usbhc_iface.h> 44 #include <usb/host/device_keeper.h>45 44 46 45 #include "batch.h" 47 46 #include "transfer_list.h" 47 #include "utils/device_keeper.h" 48 48 49 49 typedef struct uhci_regs { … … 83 83 84 84 typedef struct uhci_hc { 85 usb_device_keeper_t device_manager;85 device_keeper_t device_manager; 86 86 87 87 regs_t *registers; … … 109 109 void *regs, size_t reg_size, bool interupts); 110 110 111 int uhci_hc_schedule(uhci_hc_t *instance, usb_transfer_batch_t *batch);111 int uhci_hc_schedule(uhci_hc_t *instance, batch_t *batch); 112 112 113 113 void uhci_hc_interrupt(uhci_hc_t *instance, uint16_t status); -
uspace/drv/usbhid/hiddev.c
r41ef5b9 rfd9f6e4c 184 184 * successfuly initialize the structure. 185 185 * 186 * @sa usb_ pipe_initialize_from_configuration(),186 * @sa usb_endpoint_pipe_initialize_from_configuration(), 187 187 * usbhid_dev_get_report_descriptor() 188 188 */ … … 218 218 }; 219 219 220 rc = usb_ pipe_initialize_from_configuration(220 rc = usb_endpoint_pipe_initialize_from_configuration( 221 221 endpoint_mapping, 1, descriptors, descriptors_size, 222 222 &hid_dev->wire); … … 359 359 * @return Other value inherited from one of functions 360 360 * usb_device_connection_initialize_from_device(), 361 * usb_ pipe_initialize_default_control(),362 * usb_ pipe_start_session(), usb_pipe_end_session(),361 * usb_endpoint_pipe_initialize_default_control(), 362 * usb_endpoint_pipe_start_session(), usb_endpoint_pipe_end_session(), 363 363 * usbhid_dev_process_descriptors(). 364 364 * … … 404 404 * Initialize device pipes. 405 405 */ 406 rc = usb_ pipe_initialize_default_control(&hid_dev->ctrl_pipe,406 rc = usb_endpoint_pipe_initialize_default_control(&hid_dev->ctrl_pipe, 407 407 &hid_dev->wire); 408 408 if (rc != EOK) { … … 411 411 return rc; 412 412 } 413 rc = usb_ pipe_probe_default_control(&hid_dev->ctrl_pipe);413 rc = usb_endpoint_pipe_probe_default_control(&hid_dev->ctrl_pipe); 414 414 if (rc != EOK) { 415 415 usb_log_error("Probing default control pipe failed: %s.\n", … … 430 430 * Get descriptors, parse descriptors and save endpoints. 431 431 */ 432 rc = usb_ pipe_start_session(&hid_dev->ctrl_pipe);432 rc = usb_endpoint_pipe_start_session(&hid_dev->ctrl_pipe); 433 433 if (rc != EOK) { 434 434 usb_log_error("Failed to start session on the control pipe: %s" … … 440 440 if (rc != EOK) { 441 441 /* TODO: end session?? */ 442 usb_ pipe_end_session(&hid_dev->ctrl_pipe);442 usb_endpoint_pipe_end_session(&hid_dev->ctrl_pipe); 443 443 usb_log_error("Failed to process descriptors: %s.\n", 444 444 str_error(rc)); … … 446 446 } 447 447 448 rc = usb_ pipe_end_session(&hid_dev->ctrl_pipe);448 rc = usb_endpoint_pipe_end_session(&hid_dev->ctrl_pipe); 449 449 if (rc != EOK) { 450 450 usb_log_warning("Failed to start session on the control pipe: " -
uspace/drv/usbhid/hiddev.h
r41ef5b9 rfd9f6e4c 68 68 usb_device_connection_t wire; 69 69 /** USB pipe corresponding to the default Control endpoint. */ 70 usb_ pipe_t ctrl_pipe;70 usb_endpoint_pipe_t ctrl_pipe; 71 71 /** USB pipe corresponding to the Interrupt In (polling) pipe. */ 72 usb_ pipe_t poll_pipe;72 usb_endpoint_pipe_t poll_pipe; 73 73 74 74 /** Polling interval retreived from the Interface descriptor. */ -
uspace/drv/usbhid/hidreq.c
r41ef5b9 rfd9f6e4c 57 57 * @retval EINVAL if no HID device is given. 58 58 * @return Other value inherited from one of functions 59 * usb_ pipe_start_session(), usb_pipe_end_session(),59 * usb_endpoint_pipe_start_session(), usb_endpoint_pipe_end_session(), 60 60 * usb_control_request_set(). 61 61 */ … … 76 76 int rc, sess_rc; 77 77 78 sess_rc = usb_ pipe_start_session(&hid_dev->ctrl_pipe);78 sess_rc = usb_endpoint_pipe_start_session(&hid_dev->ctrl_pipe); 79 79 if (sess_rc != EOK) { 80 80 usb_log_warning("Failed to start a session: %s.\n", … … 92 92 USB_HIDREQ_SET_REPORT, value, hid_dev->iface, buffer, buf_size); 93 93 94 sess_rc = usb_ pipe_end_session(&hid_dev->ctrl_pipe);94 sess_rc = usb_endpoint_pipe_end_session(&hid_dev->ctrl_pipe); 95 95 96 96 if (rc != EOK) { … … 119 119 * @retval EINVAL if no HID device is given. 120 120 * @return Other value inherited from one of functions 121 * usb_ pipe_start_session(), usb_pipe_end_session(),121 * usb_endpoint_pipe_start_session(), usb_endpoint_pipe_end_session(), 122 122 * usb_control_request_set(). 123 123 */ … … 137 137 int rc, sess_rc; 138 138 139 sess_rc = usb_ pipe_start_session(&hid_dev->ctrl_pipe);139 sess_rc = usb_endpoint_pipe_start_session(&hid_dev->ctrl_pipe); 140 140 if (sess_rc != EOK) { 141 141 usb_log_warning("Failed to start a session: %s.\n", … … 151 151 USB_HIDREQ_SET_PROTOCOL, protocol, hid_dev->iface, NULL, 0); 152 152 153 sess_rc = usb_ pipe_end_session(&hid_dev->ctrl_pipe);153 sess_rc = usb_endpoint_pipe_end_session(&hid_dev->ctrl_pipe); 154 154 155 155 if (rc != EOK) { … … 179 179 * @retval EINVAL if no HID device is given. 180 180 * @return Other value inherited from one of functions 181 * usb_ pipe_start_session(), usb_pipe_end_session(),181 * usb_endpoint_pipe_start_session(), usb_endpoint_pipe_end_session(), 182 182 * usb_control_request_set(). 183 183 */ … … 197 197 int rc, sess_rc; 198 198 199 sess_rc = usb_ pipe_start_session(&hid_dev->ctrl_pipe);199 sess_rc = usb_endpoint_pipe_start_session(&hid_dev->ctrl_pipe); 200 200 if (sess_rc != EOK) { 201 201 usb_log_warning("Failed to start a session: %s.\n", … … 213 213 USB_HIDREQ_SET_IDLE, value, hid_dev->iface, NULL, 0); 214 214 215 sess_rc = usb_ pipe_end_session(&hid_dev->ctrl_pipe);215 sess_rc = usb_endpoint_pipe_end_session(&hid_dev->ctrl_pipe); 216 216 217 217 if (rc != EOK) { … … 244 244 * @retval EINVAL if no HID device is given. 245 245 * @return Other value inherited from one of functions 246 * usb_ pipe_start_session(), usb_pipe_end_session(),246 * usb_endpoint_pipe_start_session(), usb_endpoint_pipe_end_session(), 247 247 * usb_control_request_set(). 248 248 */ … … 263 263 int rc, sess_rc; 264 264 265 sess_rc = usb_ pipe_start_session(&hid_dev->ctrl_pipe);265 sess_rc = usb_endpoint_pipe_start_session(&hid_dev->ctrl_pipe); 266 266 if (sess_rc != EOK) { 267 267 usb_log_warning("Failed to start a session: %s.\n", … … 280 280 actual_size); 281 281 282 sess_rc = usb_ pipe_end_session(&hid_dev->ctrl_pipe);282 sess_rc = usb_endpoint_pipe_end_session(&hid_dev->ctrl_pipe); 283 283 284 284 if (rc != EOK) { … … 307 307 * @retval EINVAL if no HID device is given. 308 308 * @return Other value inherited from one of functions 309 * usb_ pipe_start_session(), usb_pipe_end_session(),309 * usb_endpoint_pipe_start_session(), usb_endpoint_pipe_end_session(), 310 310 * usb_control_request_set(). 311 311 */ … … 325 325 int rc, sess_rc; 326 326 327 sess_rc = usb_ pipe_start_session(&hid_dev->ctrl_pipe);327 sess_rc = usb_endpoint_pipe_start_session(&hid_dev->ctrl_pipe); 328 328 if (sess_rc != EOK) { 329 329 usb_log_warning("Failed to start a session: %s.\n", … … 342 342 USB_HIDREQ_GET_PROTOCOL, 0, hid_dev->iface, buffer, 1, &actual_size); 343 343 344 sess_rc = usb_ pipe_end_session(&hid_dev->ctrl_pipe);344 sess_rc = usb_endpoint_pipe_end_session(&hid_dev->ctrl_pipe); 345 345 346 346 if (rc != EOK) { … … 378 378 * @retval EINVAL if no HID device is given. 379 379 * @return Other value inherited from one of functions 380 * usb_ pipe_start_session(), usb_pipe_end_session(),380 * usb_endpoint_pipe_start_session(), usb_endpoint_pipe_end_session(), 381 381 * usb_control_request_set(). 382 382 */ … … 396 396 int rc, sess_rc; 397 397 398 sess_rc = usb_ pipe_start_session(&hid_dev->ctrl_pipe);398 sess_rc = usb_endpoint_pipe_start_session(&hid_dev->ctrl_pipe); 399 399 if (sess_rc != EOK) { 400 400 usb_log_warning("Failed to start a session: %s.\n", … … 415 415 &actual_size); 416 416 417 sess_rc = usb_ pipe_end_session(&hid_dev->ctrl_pipe);417 sess_rc = usb_endpoint_pipe_end_session(&hid_dev->ctrl_pipe); 418 418 419 419 if (rc != EOK) { -
uspace/drv/usbhid/kbddev.c
r41ef5b9 rfd9f6e4c 780 780 781 781 while (true) { 782 sess_rc = usb_ pipe_start_session(782 sess_rc = usb_endpoint_pipe_start_session( 783 783 &kbd_dev->hid_dev->poll_pipe); 784 784 if (sess_rc != EOK) { … … 788 788 } 789 789 790 rc = usb_ pipe_read(&kbd_dev->hid_dev->poll_pipe,790 rc = usb_endpoint_pipe_read(&kbd_dev->hid_dev->poll_pipe, 791 791 buffer, BOOTP_BUFFER_SIZE, &actual_size); 792 792 793 sess_rc = usb_ pipe_end_session(793 sess_rc = usb_endpoint_pipe_end_session( 794 794 &kbd_dev->hid_dev->poll_pipe); 795 795 -
uspace/drv/usbhub/main.c
r41ef5b9 rfd9f6e4c 42 42 #include "usbhub_private.h" 43 43 44 /** Hub status-change endpoint description. 45 * 46 * For more information see section 11.15.1 of USB 1.1 specification. 47 */ 48 static usb_endpoint_description_t hub_status_change_endpoint_description = { 44 45 usb_endpoint_description_t hub_status_change_endpoint_description = { 49 46 .transfer_type = USB_TRANSFER_INTERRUPT, 50 47 .direction = USB_DIRECTION_IN, … … 60 57 }; 61 58 62 static usb_endpoint_description_t *usb_hub_endpoints[] = {63 &hub_status_change_endpoint_description,64 NULL65 };66 67 59 static usb_driver_t usb_hub_driver = { 68 .name = NAME, 69 .ops = &usb_hub_driver_ops, 70 .endpoints = usb_hub_endpoints 60 .name = "usbhub", 61 .ops = &usb_hub_driver_ops 71 62 }; 72 63 … … 74 65 int main(int argc, char *argv[]) 75 66 { 76 printf(NAME ": HelenOS USB hub driver.\n"); 67 usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME); 68 usb_log_info("starting hub driver\n"); 77 69 78 usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME);79 70 71 usb_hub_driver.endpoints = (usb_endpoint_description_t**) 72 malloc(2 * sizeof(usb_endpoint_description_t*)); 73 usb_hub_driver.endpoints[0] = &hub_status_change_endpoint_description; 74 usb_hub_driver.endpoints[1] = NULL; 75 80 76 return usb_driver_main(&usb_hub_driver); 81 77 } -
uspace/drv/usbhub/usbhub.c
r41ef5b9 rfd9f6e4c 157 157 static int usb_hub_set_configuration(usb_hub_info_t * hub_info){ 158 158 //device descriptor 159 usb_standard_device_descriptor_t *std_descriptor 160 = &hub_info->usb_device->descriptors.device; 159 usb_standard_device_descriptor_t std_descriptor; 160 int opResult = usb_request_get_device_descriptor( 161 &hub_info->usb_device->ctrl_pipe, 162 &std_descriptor); 163 if(opResult!=EOK){ 164 usb_log_error("could not get device descriptor, %d\n",opResult); 165 return opResult; 166 } 161 167 usb_log_info("hub has %d configurations\n", 162 std_descriptor->configuration_count);163 if(std_descriptor ->configuration_count<1){168 std_descriptor.configuration_count); 169 if(std_descriptor.configuration_count<1){ 164 170 usb_log_error("THERE ARE NO CONFIGURATIONS AVAILABLE\n"); 165 171 //shouldn`t I return? 166 //definitely 167 return EINVAL; 168 } 169 172 } 173 174 /* Retrieve full configuration descriptor. */ 175 uint8_t *descriptors = NULL; 176 size_t descriptors_size = 0; 177 opResult = usb_request_get_full_configuration_descriptor_alloc( 178 &hub_info->usb_device->ctrl_pipe, 0, 179 (void **) &descriptors, &descriptors_size); 180 if (opResult != EOK) { 181 usb_log_error("Could not get configuration descriptor: %s.\n", 182 str_error(opResult)); 183 return opResult; 184 } 170 185 usb_standard_configuration_descriptor_t *config_descriptor 171 = (usb_standard_configuration_descriptor_t *) 172 hub_info->usb_device->descriptors.configuration; 186 = (usb_standard_configuration_descriptor_t *) descriptors; 173 187 174 188 /* Set configuration. */ 175 int opResult = usb_request_set_configuration( 176 &hub_info->usb_device->ctrl_pipe, 189 opResult = usb_request_set_configuration(&hub_info->usb_device->ctrl_pipe, 177 190 config_descriptor->configuration_number); 178 191 … … 184 197 usb_log_debug("\tused configuration %d\n", 185 198 config_descriptor->configuration_number); 186 199 free(descriptors); 187 200 return EOK; 188 201 } … … 211 224 } 212 225 213 usb_ pipe_start_session(hub_info->control_pipe);226 usb_endpoint_pipe_start_session(hub_info->control_pipe); 214 227 //set hub configuration 215 228 opResult = usb_hub_set_configuration(hub_info); … … 226 239 return opResult; 227 240 } 228 usb_ pipe_end_session(hub_info->control_pipe);241 usb_endpoint_pipe_end_session(hub_info->control_pipe); 229 242 230 243 231 244 /// \TODO what is this? 232 usb_log_debug(" Creating `hub' function.\n");245 usb_log_debug("adding to ddf"); 233 246 ddf_fun_t *hub_fun = ddf_fun_create(hub_info->usb_device->ddf_dev, 234 247 fun_exposed, "hub"); … … 244 257 fid_t fid = fibril_create(usb_hub_control_loop, hub_info); 245 258 if (fid == 0) { 246 usb_log_error("failed to start monitoring fibril for new hub .\n");259 usb_log_error("failed to start monitoring fibril for new hub"); 247 260 return ENOMEM; 248 261 } 249 262 fibril_add_ready(fid); 250 usb_log_debug("Hub fibril created.\n"); 251 252 usb_log_info("Controlling hub `%s' (%d ports).\n", 253 hub_info->usb_device->ddf_dev->name, hub_info->port_count); 263 usb_log_debug("hub fibril created"); 264 usb_log_debug("has %d ports ",hub_info->port_count); 254 265 return EOK; 255 266 } … … 310 321 //reset port 311 322 usb_hub_set_reset_port_request(&request, port); 312 opResult = usb_ pipe_control_write(323 opResult = usb_endpoint_pipe_control_write( 313 324 hub->control_pipe, 314 325 &request,sizeof(usb_device_request_setup_packet_t), … … 343 354 } 344 355 //create connection to device 345 usb_ pipe_t new_device_pipe;356 usb_endpoint_pipe_t new_device_pipe; 346 357 usb_device_connection_t new_device_connection; 347 358 usb_device_connection_initialize_on_default_address( … … 349 360 &hub->connection 350 361 ); 351 usb_ pipe_initialize_default_control(362 usb_endpoint_pipe_initialize_default_control( 352 363 &new_device_pipe, 353 364 &new_device_connection); 354 usb_ pipe_probe_default_control(&new_device_pipe);365 usb_endpoint_pipe_probe_default_control(&new_device_pipe); 355 366 356 367 /* Request address from host controller. */ … … 368 379 //opResult = usb_drv_req_set_address(hc, USB_ADDRESS_DEFAULT, 369 380 // new_device_address); 370 usb_ pipe_start_session(&new_device_pipe);381 usb_endpoint_pipe_start_session(&new_device_pipe); 371 382 opResult = usb_request_set_address(&new_device_pipe,new_device_address); 372 usb_ pipe_end_session(&new_device_pipe);383 usb_endpoint_pipe_end_session(&new_device_pipe); 373 384 if (opResult != EOK) { 374 385 usb_log_error("could not set address for new device %d\n",opResult); … … 477 488 usb_log_debug("interrupt at port %d\n", port); 478 489 //determine type of change 479 usb_ pipe_t *pipe = hub->control_pipe;490 usb_endpoint_pipe_t *pipe = hub->control_pipe; 480 491 481 492 int opResult; … … 488 499 //endpoint 0 489 500 490 opResult = usb_ pipe_control_read(501 opResult = usb_endpoint_pipe_control_read( 491 502 pipe, 492 503 &request, sizeof(usb_device_request_setup_packet_t), … … 522 533 //port reset 523 534 if (usb_port_reset_completed(&status)) { 524 usb_log_info("port reset complete \n");535 usb_log_info("port reset complete"); 525 536 if (usb_port_enabled(&status)) { 526 537 usb_hub_finalize_add_device(hub, port, usb_port_speed(&status)); … … 549 560 int usb_hub_check_hub_changes(usb_hub_info_t * hub_info){ 550 561 int opResult; 551 opResult = usb_ pipe_start_session(562 opResult = usb_endpoint_pipe_start_session( 552 563 hub_info->status_change_pipe); 553 564 if(opResult != EOK){ … … 567 578 * Send the request. 568 579 */ 569 opResult = usb_ pipe_read(580 opResult = usb_endpoint_pipe_read( 570 581 hub_info->status_change_pipe, 571 582 change_bitmap, byte_length, &actual_size … … 575 586 free(change_bitmap); 576 587 usb_log_warning("something went wrong while getting status of hub\n"); 577 usb_ pipe_end_session(hub_info->status_change_pipe);588 usb_endpoint_pipe_end_session(hub_info->status_change_pipe); 578 589 return opResult; 579 590 } 580 591 unsigned int port; 581 opResult = usb_ pipe_start_session(hub_info->control_pipe);592 opResult = usb_endpoint_pipe_start_session(hub_info->control_pipe); 582 593 if(opResult!=EOK){ 583 594 usb_log_error("could not start control pipe session %d\n", opResult); 584 usb_ pipe_end_session(hub_info->status_change_pipe);595 usb_endpoint_pipe_end_session(hub_info->status_change_pipe); 585 596 return opResult; 586 597 } … … 589 600 usb_log_error("could not start host controller session %d\n", 590 601 opResult); 591 usb_ pipe_end_session(hub_info->control_pipe);592 usb_ pipe_end_session(hub_info->status_change_pipe);602 usb_endpoint_pipe_end_session(hub_info->control_pipe); 603 usb_endpoint_pipe_end_session(hub_info->status_change_pipe); 593 604 return opResult; 594 605 } … … 604 615 } 605 616 usb_hc_connection_close(&hub_info->connection); 606 usb_ pipe_end_session(hub_info->control_pipe);607 usb_ pipe_end_session(hub_info->status_change_pipe);617 usb_endpoint_pipe_end_session(hub_info->control_pipe); 618 usb_endpoint_pipe_end_session(hub_info->status_change_pipe); 608 619 free(change_bitmap); 609 620 return EOK; -
uspace/drv/usbhub/usbhub.h
r41ef5b9 rfd9f6e4c 48 48 49 49 50 /** Hub status-change endpoint description 51 * 52 * For more see usb hub specification in 11.15.1 of 53 */ 54 extern usb_endpoint_description_t hub_status_change_endpoint_description; 55 56 57 58 /* Hub endpoints. */ 59 /*typedef struct { 60 usb_endpoint_pipe_t control; 61 usb_endpoint_pipe_t status_change; 62 } usb_hub_endpoints_t; 63 */ 64 65 50 66 /** Information about attached hub. */ 51 67 typedef struct { … … 72 88 * searched again and again for the 'right pipe'. 73 89 */ 74 usb_ pipe_t * status_change_pipe;90 usb_endpoint_pipe_t * status_change_pipe; 75 91 76 92 /** convenience pointer to control pipe … … 80 96 * searched again and again for the 'right pipe'. 81 97 */ 82 usb_ pipe_t * control_pipe;98 usb_endpoint_pipe_t * control_pipe; 83 99 84 100 /** generic usb device data*/ -
uspace/drv/usbhub/usbhub_private.h
r41ef5b9 rfd9f6e4c 95 95 * @return Operation result 96 96 */ 97 static inline int usb_hub_clear_port_feature(usb_ pipe_t *pipe,97 static inline int usb_hub_clear_port_feature(usb_endpoint_pipe_t *pipe, 98 98 int port_index, 99 99 usb_hub_class_feature_t feature) { … … 106 106 }; 107 107 clear_request.value = feature; 108 return usb_ pipe_control_write(pipe, &clear_request,108 return usb_endpoint_pipe_control_write(pipe, &clear_request, 109 109 sizeof(clear_request), NULL, 0); 110 110 } -
uspace/drv/usbmid/main.c
r41ef5b9 rfd9f6e4c 61 61 int rc; 62 62 63 rc = usb_ pipe_start_session(&dev->ctrl_pipe);63 rc = usb_endpoint_pipe_start_session(&dev->ctrl_pipe); 64 64 if (rc != EOK) { 65 65 usb_log_error("Failed to start session on control pipe: %s.\n", … … 70 70 bool accept = usbmid_explore_device(dev); 71 71 72 rc = usb_ pipe_end_session(&dev->ctrl_pipe);72 rc = usb_endpoint_pipe_end_session(&dev->ctrl_pipe); 73 73 if (rc != EOK) { 74 74 usb_log_warning("Failed to end session on control pipe: %s.\n", -
uspace/drv/usbmid/usbmid.c
r41ef5b9 rfd9f6e4c 108 108 } 109 109 110 rc = usb_ pipe_initialize_default_control(&mid->ctrl_pipe,110 rc = usb_endpoint_pipe_initialize_default_control(&mid->ctrl_pipe, 111 111 &mid->wire); 112 112 if (rc != EOK) { … … 116 116 return NULL; 117 117 } 118 rc = usb_ pipe_probe_default_control(&mid->ctrl_pipe);118 rc = usb_endpoint_pipe_probe_default_control(&mid->ctrl_pipe); 119 119 if (rc != EOK) { 120 120 usb_log_error("Probing default control pipe failed: %s.\n", -
uspace/drv/usbmid/usbmid.h
r41ef5b9 rfd9f6e4c 52 52 usb_device_connection_t wire; 53 53 /** Default control pipe. */ 54 usb_ pipe_t ctrl_pipe;54 usb_endpoint_pipe_t ctrl_pipe; 55 55 } usbmid_device_t; 56 56 -
uspace/drv/usbmouse/init.c
r41ef5b9 rfd9f6e4c 126 126 127 127 /* Open the control pipe. */ 128 rc = usb_ pipe_start_session(&dev->ctrl_pipe);128 rc = usb_endpoint_pipe_start_session(&dev->ctrl_pipe); 129 129 if (rc != EOK) { 130 130 goto leave; … … 141 141 142 142 /* Close the control pipe (ignore errors). */ 143 usb_ pipe_end_session(&dev->ctrl_pipe);143 usb_endpoint_pipe_end_session(&dev->ctrl_pipe); 144 144 145 145 -
uspace/lib/usb/Makefile
r41ef5b9 rfd9f6e4c 49 49 src/request.c \ 50 50 src/usb.c \ 51 src/usbdevice.c \ 52 src/host/device_keeper.c \ 53 src/host/batch.c 51 src/usbdevice.c 54 52 55 53 include $(USPACE_PREFIX)/Makefile.common -
uspace/lib/usb/include/usb/classes/hub.h
r41ef5b9 rfd9f6e4c 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;77 62 78 63 /** -
uspace/lib/usb/include/usb/devdrv.h
r41ef5b9 rfd9f6e4c 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 49 40 /** USB device structure. */ 50 41 typedef struct { 51 42 /** The default control pipe. */ 52 usb_ pipe_t ctrl_pipe;43 usb_endpoint_pipe_t ctrl_pipe; 53 44 /** Other endpoint pipes. 54 45 * This is an array of other endpoint pipes in the same order as … … 61 52 */ 62 53 int interface_no; 63 64 /** Some useful descriptors. */65 usb_device_descriptors_t descriptors;66 67 54 /** Generic DDF device backing this one. */ 68 55 ddf_dev_t *ddf_dev; -
uspace/lib/usb/include/usb/pipes.h
r41ef5b9 rfd9f6e4c 80 80 */ 81 81 int hc_phone; 82 } usb_ pipe_t;82 } usb_endpoint_pipe_t; 83 83 84 84 … … 102 102 typedef struct { 103 103 /** Endpoint pipe. */ 104 usb_ pipe_t *pipe;104 usb_endpoint_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_pipe_initialize(usb_pipe_t *, usb_device_connection_t *, 127 int usb_endpoint_pipe_initialize(usb_endpoint_pipe_t *, 128 usb_device_connection_t *, 128 129 usb_endpoint_t, usb_transfer_type_t, size_t, usb_direction_t); 129 int usb_ pipe_initialize_default_control(usb_pipe_t *,130 int usb_endpoint_pipe_initialize_default_control(usb_endpoint_pipe_t *, 130 131 usb_device_connection_t *); 131 int usb_ pipe_probe_default_control(usb_pipe_t *);132 int usb_ pipe_initialize_from_configuration(usb_endpoint_mapping_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 *, 133 134 size_t, uint8_t *, size_t, usb_device_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 *); 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 *); 136 138 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 *);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 *); 140 142 141 int usb_ pipe_read(usb_pipe_t *, void *, size_t, size_t *);142 int usb_ pipe_write(usb_pipe_t *, void *, size_t);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); 143 145 144 int usb_ pipe_control_read(usb_pipe_t *, void *, size_t,146 int usb_endpoint_pipe_control_read(usb_endpoint_pipe_t *, void *, size_t, 145 147 void *, size_t, size_t *); 146 int usb_ pipe_control_write(usb_pipe_t *, void *, size_t,148 int usb_endpoint_pipe_control_write(usb_endpoint_pipe_t *, void *, size_t, 147 149 void *, size_t); 148 150 -
uspace/lib/usb/include/usb/recognise.h
r41ef5b9 rfd9f6e4c 48 48 const usb_standard_interface_descriptor_t *, match_id_list_t *); 49 49 50 int usb_device_create_match_ids(usb_ pipe_t *, match_id_list_t *);50 int usb_device_create_match_ids(usb_endpoint_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
r41ef5b9 rfd9f6e4c 86 86 } __attribute__ ((packed)) usb_device_request_setup_packet_t; 87 87 88 int usb_control_request_set(usb_ pipe_t *,88 int usb_control_request_set(usb_endpoint_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_ pipe_t *,92 int usb_control_request_get(usb_endpoint_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_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, 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, 104 98 usb_request_recipient_t, uint8_t, uint8_t, uint16_t, void *, size_t, 105 99 size_t *); 106 int usb_request_get_descriptor_alloc(usb_ pipe_t *, usb_request_type_t,100 int usb_request_get_descriptor_alloc(usb_endpoint_pipe_t *, usb_request_type_t, 107 101 usb_request_recipient_t, uint8_t, uint8_t, uint16_t, void **, size_t *); 108 int usb_request_get_device_descriptor(usb_ pipe_t *,102 int usb_request_get_device_descriptor(usb_endpoint_pipe_t *, 109 103 usb_standard_device_descriptor_t *); 110 int usb_request_get_bare_configuration_descriptor(usb_ pipe_t *, int,104 int usb_request_get_bare_configuration_descriptor(usb_endpoint_pipe_t *, int, 111 105 usb_standard_configuration_descriptor_t *); 112 int usb_request_get_full_configuration_descriptor(usb_ pipe_t *, int,106 int usb_request_get_full_configuration_descriptor(usb_endpoint_pipe_t *, int, 113 107 void *, size_t, size_t *); 114 int usb_request_get_full_configuration_descriptor_alloc(usb_ pipe_t *,108 int usb_request_get_full_configuration_descriptor_alloc(usb_endpoint_pipe_t *, 115 109 int, void **, size_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); 110 int usb_request_set_configuration(usb_endpoint_pipe_t *, uint8_t); 122 111 123 int usb_request_get_supported_languages(usb_ pipe_t *,112 int usb_request_get_supported_languages(usb_endpoint_pipe_t *, 124 113 l18_win_locales_t **, size_t *); 125 int usb_request_get_string(usb_ pipe_t *, size_t, l18_win_locales_t,114 int usb_request_get_string(usb_endpoint_pipe_t *, size_t, l18_win_locales_t, 126 115 char **); 127 116 -
uspace/lib/usb/include/usb/usb.h
r41ef5b9 rfd9f6e4c 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);64 63 65 64 /** USB data transfer direction. */ … … 79 78 USB_SPEED_HIGH 80 79 } usb_speed_t; 81 82 const char *usb_str_speed(usb_speed_t);83 84 80 85 81 /** USB request type target. */ -
uspace/lib/usb/src/devdrv.c
r41ef5b9 rfd9f6e4c 126 126 127 127 for (i = 0; i < pipe_count; i++) { 128 dev->pipes[i].pipe = malloc(sizeof(usb_ pipe_t));128 dev->pipes[i].pipe = malloc(sizeof(usb_endpoint_pipe_t)); 129 129 if (dev->pipes[i].pipe == NULL) { 130 130 usb_log_oom(dev->ddf_dev); … … 137 137 } 138 138 139 rc = usb_pipe_initialize_from_configuration(dev->pipes, pipe_count, 140 dev->descriptors.configuration, dev->descriptors.configuration_size, 141 &dev->wire); 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); 142 151 if (rc != EOK) { 143 152 usb_log_error("Failed initializing USB endpoints: %s.\n", … … 163 172 for (i = 0; i < pipe_count; i++) { 164 173 if (dev->pipes[i].present) { 165 rc = usb_ pipe_register(dev->pipes[i].pipe,174 rc = usb_endpoint_pipe_register(dev->pipes[i].pipe, 166 175 dev->pipes[i].descriptor->poll_interval, 167 176 &hc_conn); … … 210 219 } 211 220 212 rc = usb_ pipe_initialize_default_control(&dev->ctrl_pipe,221 rc = usb_endpoint_pipe_initialize_default_control(&dev->ctrl_pipe, 213 222 &dev->wire); 214 223 if (rc != EOK) { … … 219 228 } 220 229 221 rc = usb_ pipe_probe_default_control(&dev->ctrl_pipe);230 rc = usb_endpoint_pipe_probe_default_control(&dev->ctrl_pipe); 222 231 if (rc != EOK) { 223 232 usb_log_error( … … 228 237 229 238 /* 230 * For further actions, we need open session on default control pipe. 239 * Initialization of other pipes requires open session on 240 * default control pipe. 231 241 */ 232 rc = usb_ pipe_start_session(&dev->ctrl_pipe);242 rc = usb_endpoint_pipe_start_session(&dev->ctrl_pipe); 233 243 if (rc != EOK) { 234 244 usb_log_error("Failed to start an IPC session: %s.\n", 235 245 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));255 246 return rc; 256 247 } … … 261 252 262 253 /* No checking here. */ 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 } 254 usb_endpoint_pipe_end_session(&dev->ctrl_pipe); 271 255 272 256 return rc; … … 299 283 dev->ddf_dev->driver_data = dev; 300 284 dev->driver_data = NULL; 301 dev->descriptors.configuration = NULL;302 285 303 286 rc = initialize_pipes(dev); -
uspace/lib/usb/src/devpoll.c
r41ef5b9 rfd9f6e4c 64 64 assert(polling_data); 65 65 66 usb_ pipe_t *pipe66 usb_endpoint_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_ pipe_start_session(pipe);73 rc = usb_endpoint_pipe_start_session(pipe); 74 74 if (rc != EOK) { 75 75 failed_attempts++; … … 78 78 79 79 size_t actual_size; 80 rc = usb_ pipe_read(pipe, polling_data->buffer,80 rc = usb_endpoint_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_ pipe_end_session(pipe);84 usb_endpoint_pipe_end_session(pipe); 85 85 86 86 if (rc != EOK) { -
uspace/lib/usb/src/hub.c
r41ef5b9 rfd9f6e4c 228 228 } 229 229 230 usb_ pipe_t ctrl_pipe;231 rc = usb_ pipe_initialize_default_control(&ctrl_pipe,230 usb_endpoint_pipe_t ctrl_pipe; 231 rc = usb_endpoint_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_ pipe_probe_default_control(&ctrl_pipe);237 rc = usb_endpoint_pipe_probe_default_control(&ctrl_pipe); 238 238 if (rc != EOK) { 239 239 rc = ENOTCONN; … … 241 241 } 242 242 243 rc = usb_ pipe_start_session(&ctrl_pipe);243 rc = usb_endpoint_pipe_start_session(&ctrl_pipe); 244 244 if (rc != EOK) { 245 245 rc = ENOTCONN; … … 253 253 } 254 254 255 usb_ pipe_end_session(&ctrl_pipe);255 usb_endpoint_pipe_end_session(&ctrl_pipe); 256 256 257 257 /* … … 306 306 307 307 leave_stop_session: 308 usb_ pipe_end_session(&ctrl_pipe);308 usb_endpoint_pipe_end_session(&ctrl_pipe); 309 309 310 310 leave_release_default_address: -
uspace/lib/usb/src/pipes.c
r41ef5b9 rfd9f6e4c 42 42 #include <assert.h> 43 43 44 #define IPC_AGAIN_DELAY (1000 * 2) /* 2ms */45 46 44 /** Tell USB address assigned to given device. 47 45 * … … 152 150 } 153 151 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); 152 my_address = get_my_address(parent_phone, dev); 153 if (my_address < 0) { 154 rc = my_address; 155 goto leave; 156 } 178 157 179 158 rc = usb_device_connection_initialize(connection, … … 233 212 * A session is something inside what any communication occurs. 234 213 * It is expected that sessions would be started right before the transfer 235 * and ended - see usb_ pipe_end_session() - after the last214 * and ended - see usb_endpoint_pipe_end_session() - after the last 236 215 * transfer. 237 216 * The reason for this is that session actually opens some communication … … 244 223 * @return Error code. 245 224 */ 246 int usb_ pipe_start_session(usb_pipe_t *pipe)225 int usb_endpoint_pipe_start_session(usb_endpoint_pipe_t *pipe) 247 226 { 248 227 assert(pipe); 249 228 250 if (usb_ pipe_is_session_started(pipe)) {229 if (usb_endpoint_pipe_is_session_started(pipe)) { 251 230 return EBUSY; 252 231 } … … 265 244 /** Ends a session on the endpoint pipe. 266 245 * 267 * @see usb_ pipe_start_session246 * @see usb_endpoint_pipe_start_session 268 247 * 269 248 * @param pipe Endpoint pipe to end the session on. 270 249 * @return Error code. 271 250 */ 272 int usb_ pipe_end_session(usb_pipe_t *pipe)251 int usb_endpoint_pipe_end_session(usb_endpoint_pipe_t *pipe) 273 252 { 274 253 assert(pipe); 275 254 276 if (!usb_ pipe_is_session_started(pipe)) {255 if (!usb_endpoint_pipe_is_session_started(pipe)) { 277 256 return ENOENT; 278 257 } … … 296 275 * @return Whether @p pipe has opened a session. 297 276 */ 298 bool usb_ pipe_is_session_started(usb_pipe_t *pipe)277 bool usb_endpoint_pipe_is_session_started(usb_endpoint_pipe_t *pipe) 299 278 { 300 279 return (pipe->hc_phone >= 0); -
uspace/lib/usb/src/pipesinit.c
r41ef5b9 rfd9f6e4c 193 193 } 194 194 195 int rc = usb_ pipe_initialize(ep_mapping->pipe, wire,195 int rc = usb_endpoint_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_ pipe_initialize_from_configuration(278 int usb_endpoint_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_ pipe_initialize(usb_pipe_t *pipe,344 int usb_endpoint_pipe_initialize(usb_endpoint_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_ pipe_initialize_default_control(usb_pipe_t *pipe,369 int usb_endpoint_pipe_initialize_default_control(usb_endpoint_pipe_t *pipe, 370 370 usb_device_connection_t *connection) 371 371 { … … 373 373 assert(connection); 374 374 375 int rc = usb_ pipe_initialize(pipe, connection,375 int rc = usb_endpoint_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_ pipe_probe_default_control(usb_pipe_t *pipe)392 int usb_endpoint_pipe_probe_default_control(usb_endpoint_pipe_t *pipe) 393 393 { 394 394 assert(pipe); … … 408 408 409 409 TRY_LOOP(failed_attempts) { 410 rc = usb_ pipe_start_session(pipe);410 rc = usb_endpoint_pipe_start_session(pipe); 411 411 if (rc == EOK) { 412 412 break; … … 433 433 } 434 434 } 435 usb_ pipe_end_session(pipe);435 usb_endpoint_pipe_end_session(pipe); 436 436 if (rc != EOK) { 437 437 return rc; … … 451 451 * @return Error code. 452 452 */ 453 int usb_ pipe_register(usb_pipe_t *pipe,453 int usb_endpoint_pipe_register(usb_endpoint_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_ pipe_unregister(usb_pipe_t *pipe,481 int usb_endpoint_pipe_unregister(usb_endpoint_pipe_t *pipe, 482 482 usb_hc_connection_t *hc_connection) 483 483 { -
uspace/lib/usb/src/pipesio.c
r41ef5b9 rfd9f6e4c 58 58 * @return Error code. 59 59 */ 60 static int usb_ pipe_read_no_checks(usb_pipe_t *pipe,60 static int usb_endpoint_pipe_read_no_checks(usb_endpoint_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_ pipe_read(usb_pipe_t *pipe,142 int usb_endpoint_pipe_read(usb_endpoint_pipe_t *pipe, 143 143 void *buffer, size_t size, size_t *size_transfered) 144 144 { … … 153 153 } 154 154 155 if (!usb_ pipe_is_session_started(pipe)) {155 if (!usb_endpoint_pipe_is_session_started(pipe)) { 156 156 return EBADF; 157 157 } … … 168 168 int rc; 169 169 170 rc = usb_ pipe_read_no_checks(pipe, buffer, size, &act_size);170 rc = usb_endpoint_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_ pipe_write_no_check(usb_pipe_t *pipe,192 static int usb_endpoint_pipe_write_no_check(usb_endpoint_pipe_t *pipe, 193 193 void *buffer, size_t size) 194 194 { … … 247 247 * @return Error code. 248 248 */ 249 int usb_ pipe_write(usb_pipe_t *pipe,249 int usb_endpoint_pipe_write(usb_endpoint_pipe_t *pipe, 250 250 void *buffer, size_t size) 251 251 { … … 260 260 } 261 261 262 if (!usb_ pipe_is_session_started(pipe)) {262 if (!usb_endpoint_pipe_is_session_started(pipe)) { 263 263 return EBADF; 264 264 } … … 272 272 } 273 273 274 int rc = usb_ pipe_write_no_check(pipe, buffer, size);274 int rc = usb_endpoint_pipe_write_no_check(pipe, buffer, size); 275 275 276 276 return rc; … … 289 289 * @return Error code. 290 290 */ 291 static int usb_ pipe_control_read_no_check(usb_pipe_t *pipe,291 static int usb_endpoint_pipe_control_read_no_check(usb_endpoint_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_ pipe_control_read(usb_pipe_t *pipe,367 int usb_endpoint_pipe_control_read(usb_endpoint_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_ pipe_is_session_started(pipe)) {381 if (!usb_endpoint_pipe_is_session_started(pipe)) { 382 382 return EBADF; 383 383 } … … 389 389 390 390 size_t act_size = 0; 391 int rc = usb_ pipe_control_read_no_check(pipe,391 int rc = usb_endpoint_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_ pipe_control_write_no_check(usb_pipe_t *pipe,416 static int usb_endpoint_pipe_control_write_no_check(usb_endpoint_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_ pipe_control_write(usb_pipe_t *pipe,475 int usb_endpoint_pipe_control_write(usb_endpoint_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_ pipe_is_session_started(pipe)) {493 if (!usb_endpoint_pipe_is_session_started(pipe)) { 494 494 return EBADF; 495 495 } … … 500 500 } 501 501 502 int rc = usb_ pipe_control_write_no_check(pipe,502 int rc = usb_endpoint_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
r41ef5b9 rfd9f6e4c 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");252 249 253 250 return EOK; … … 294 291 } 295 292 296 /* As a last resort, try fallback driver. */297 ADD_MATCHID_OR_RETURN(matches, 10, "usb&fallback");298 299 293 return EOK; 300 294 } … … 311 305 * @return Error code. 312 306 */ 313 int usb_device_create_match_ids(usb_ pipe_t *ctrl_pipe,307 int usb_device_create_match_ids(usb_endpoint_pipe_t *ctrl_pipe, 314 308 match_id_list_t *matches) 315 309 { … … 363 357 int rc; 364 358 usb_device_connection_t dev_connection; 365 usb_ pipe_t ctrl_pipe;359 usb_endpoint_pipe_t ctrl_pipe; 366 360 367 361 rc = usb_device_connection_initialize(&dev_connection, hc_handle, address); … … 370 364 } 371 365 372 rc = usb_ pipe_initialize_default_control(&ctrl_pipe,366 rc = usb_endpoint_pipe_initialize_default_control(&ctrl_pipe, 373 367 &dev_connection); 374 368 if (rc != EOK) { 375 369 goto failure; 376 370 } 377 rc = usb_ pipe_probe_default_control(&ctrl_pipe);371 rc = usb_endpoint_pipe_probe_default_control(&ctrl_pipe); 378 372 if (rc != EOK) { 379 373 goto failure; … … 404 398 child->driver_data = dev_data; 405 399 406 rc = usb_ pipe_start_session(&ctrl_pipe);400 rc = usb_endpoint_pipe_start_session(&ctrl_pipe); 407 401 if (rc != EOK) { 408 402 goto failure; … … 414 408 } 415 409 416 rc = usb_ pipe_end_session(&ctrl_pipe);410 rc = usb_endpoint_pipe_end_session(&ctrl_pipe); 417 411 if (rc != EOK) { 418 412 goto failure; -
uspace/lib/usb/src/request.c
r41ef5b9 rfd9f6e4c 42 42 /** Generic wrapper for SET requests using standard control request format. 43 43 * 44 * @see usb_ pipe_control_write44 * @see usb_endpoint_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_ pipe_t *pipe,62 int usb_control_request_set(usb_endpoint_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_ pipe_control_write(pipe,92 int rc = usb_endpoint_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_ pipe_control_read101 * @see usb_endpoint_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_ pipe_t *pipe,122 int usb_control_request_get(usb_endpoint_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_ pipe_control_read(pipe,152 int rc = usb_endpoint_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);248 155 249 156 return rc; … … 258 165 * @return Error code. 259 166 */ 260 int usb_request_set_address(usb_ pipe_t *pipe,167 int usb_request_set_address(usb_endpoint_pipe_t *pipe, 261 168 usb_address_t new_address) 262 169 { … … 297 204 * @return Error code. 298 205 */ 299 int usb_request_get_descriptor(usb_ pipe_t *pipe,206 int usb_request_get_descriptor(usb_endpoint_pipe_t *pipe, 300 207 usb_request_type_t request_type, usb_request_recipient_t recipient, 301 208 uint8_t descriptor_type, uint8_t descriptor_index, … … 331 238 * @return 332 239 */ 333 int usb_request_get_descriptor_alloc(usb_ pipe_t * pipe,240 int usb_request_get_descriptor_alloc(usb_endpoint_pipe_t * pipe, 334 241 usb_request_type_t request_type, usb_request_recipient_t recipient, 335 242 uint8_t descriptor_type, uint8_t descriptor_index, … … 400 307 * @return Error code. 401 308 */ 402 int usb_request_get_device_descriptor(usb_ pipe_t *pipe,309 int usb_request_get_device_descriptor(usb_endpoint_pipe_t *pipe, 403 310 usb_standard_device_descriptor_t *descriptor) 404 311 { … … 442 349 * @return Error code. 443 350 */ 444 int usb_request_get_bare_configuration_descriptor(usb_ pipe_t *pipe,351 int usb_request_get_bare_configuration_descriptor(usb_endpoint_pipe_t *pipe, 445 352 int index, usb_standard_configuration_descriptor_t *descriptor) 446 353 { … … 488 395 * @return Error code. 489 396 */ 490 int usb_request_get_full_configuration_descriptor(usb_ pipe_t *pipe,397 int usb_request_get_full_configuration_descriptor(usb_endpoint_pipe_t *pipe, 491 398 int index, void *descriptor, size_t descriptor_size, size_t *actual_size) 492 399 { … … 514 421 */ 515 422 int usb_request_get_full_configuration_descriptor_alloc( 516 usb_ pipe_t *pipe, int index,423 usb_endpoint_pipe_t *pipe, int index, 517 424 void **descriptor_ptr, size_t *descriptor_size) 518 425 { … … 566 473 } 567 474 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 635 475 /** Set configuration of USB device. 636 476 * … … 639 479 * @return Error code. 640 480 */ 641 int usb_request_set_configuration(usb_ pipe_t *pipe,481 int usb_request_set_configuration(usb_endpoint_pipe_t *pipe, 642 482 uint8_t configuration_value) 643 483 { … … 651 491 } 652 492 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 704 493 /** Get list of supported languages by USB device. 705 494 * … … 710 499 * @return Error code. 711 500 */ 712 int usb_request_get_supported_languages(usb_ pipe_t *pipe,501 int usb_request_get_supported_languages(usb_endpoint_pipe_t *pipe, 713 502 l18_win_locales_t **languages_ptr, size_t *languages_count) 714 503 { … … 782 571 * @return Error code. 783 572 */ 784 int usb_request_get_string(usb_ pipe_t *pipe,573 int usb_request_get_string(usb_endpoint_pipe_t *pipe, 785 574 size_t index, l18_win_locales_t lang, char **string_ptr) 786 575 { -
uspace/lib/usb/src/usb.c
r41ef5b9 rfd9f6e4c 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 };59 38 60 39 /** String representation for USB transfer type. … … 63 42 * @return Transfer type as a string (in English). 64 43 */ 65 const char * usb_str_transfer_type(usb_transfer_type_t t)44 const char * usb_str_transfer_type(usb_transfer_type_t t) 66 45 { 67 if (t >= ARR_SIZE(str_transfer_type)) { 68 return "invalid"; 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"; 69 57 } 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];97 58 } 98 59
Note:
See TracChangeset
for help on using the changeset viewer.