Changeset 8e9becf6 in mainline for uspace/lib/usb/src
- Timestamp:
- 2011-03-08T20:00:47Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 021351c
- Parents:
- 0588062e (diff), d2fc1c2 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Location:
- uspace/lib/usb/src
- Files:
-
- 1 deleted
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/usb/src/ddfiface.c
r0588062e r8e9becf6 56 56 /** Get host controller handle, interface implementation for hub driver. 57 57 * 58 * @param[in] device Devicethe operation is running on.58 * @param[in] fun Device function the operation is running on. 59 59 * @param[out] handle Storage for the host controller handle. 60 60 * @return Error code. … … 69 69 * a hub driver. 70 70 * 71 * @param[in] device Devicethe operation is running on.71 * @param[in] fun Device function the operation is running on. 72 72 * @param[out] handle Storage for the host controller handle. 73 73 * @return Error code. … … 88 88 IPC_M_USB_GET_HOST_CONTROLLER_HANDLE, &hc_handle); 89 89 90 async_hangup(parent_phone); 91 90 92 if (rc != EOK) { 91 93 return rc; … … 99 101 /** Get host controller handle, interface implementation for HC driver. 100 102 * 101 * @param[in] device Devicethe operation is running on.103 * @param[in] fun Device function the operation is running on. 102 104 * @param[out] handle Storage for the host controller handle. 103 105 * @return Always EOK. … … 116 118 /** Get USB device address, interface implementation for hub driver. 117 119 * 118 * @param[in] device Devicethe operation is running on.120 * @param[in] fun Device function the operation is running on. 119 121 * @param[in] handle Devman handle of USB device we want address of. 120 122 * @param[out] address Storage for USB address of device with handle @p handle. … … 151 153 * a hub driver. 152 154 * 153 * @param[in] device Devicethe operation is running on.155 * @param[in] fun Device function the operation is running on. 154 156 * @param[in] handle Devman handle of USB device we want address of. 155 157 * @param[out] address Storage for USB address of device with handle @p handle. -
uspace/lib/usb/src/debug.c
r0588062e r8e9becf6 31 31 */ 32 32 /** @file 33 * @brief Debugging support.33 * Debugging and logging support. 34 34 */ 35 35 #include <adt/list.h> … … 40 40 #include <usb/debug.h> 41 41 42 /** Debugging tag. */43 typedef struct {44 /** Linked list member. */45 link_t link;46 /** Tag name.47 * We always have a private copy of the name.48 */49 char *tag;50 /** Enabled level of debugging. */51 int level;52 } usb_debug_tag_t;53 54 /** Get instance of usb_debug_tag_t from link_t. */55 #define USB_DEBUG_TAG_INSTANCE(iterator) \56 list_get_instance(iterator, usb_debug_tag_t, link)57 58 /** List of all known tags. */59 static LIST_INITIALIZE(tag_list);60 /** Mutex guard for the list of all tags. */61 static FIBRIL_MUTEX_INITIALIZE(tag_list_guard);62 63 42 /** Level of logging messages. */ 64 43 static usb_log_level_t log_level = USB_LOG_LEVEL_WARNING; 44 65 45 /** Prefix for logging messages. */ 66 46 static const char *log_prefix = "usb"; 47 67 48 /** Serialization mutex for logging functions. */ 68 49 static FIBRIL_MUTEX_INITIALIZE(log_serializer); 50 51 /** File where to store the log. */ 69 52 static FILE *log_stream = NULL; 70 53 71 /** Find or create new tag with given name.72 *73 * @param tagname Tag name.74 * @return Debug tag structure.75 * @retval NULL Out of memory.76 */77 static usb_debug_tag_t *get_tag(const char *tagname)78 {79 link_t *link;80 for (link = tag_list.next; \81 link != &tag_list; \82 link = link->next) {83 usb_debug_tag_t *tag = USB_DEBUG_TAG_INSTANCE(link);84 if (str_cmp(tag->tag, tagname) == 0) {85 return tag;86 }87 }88 89 /*90 * Tag not found, we will create a new one.91 */92 usb_debug_tag_t *new_tag = malloc(sizeof(usb_debug_tag_t));93 int rc = asprintf(&new_tag->tag, "%s", tagname);94 if (rc < 0) {95 free(new_tag);96 return NULL;97 }98 list_initialize(&new_tag->link);99 new_tag->level = 1;100 101 /*102 * Append it to the end of known tags.103 */104 list_append(&new_tag->link, &tag_list);105 106 return new_tag;107 }108 109 /** Print debugging information.110 * If the tag is used for the first time, its structures are automatically111 * created and initial verbosity level is set to 1.112 *113 * @param tagname Tag name.114 * @param level Level (verbosity) of the message.115 * @param format Formatting string for printf().116 */117 void usb_dprintf(const char *tagname, int level, const char *format, ...)118 {119 fibril_mutex_lock(&tag_list_guard);120 usb_debug_tag_t *tag = get_tag(tagname);121 if (tag == NULL) {122 printf("USB debug: FATAL ERROR - failed to create tag.\n");123 goto leave;124 }125 126 if (tag->level < level) {127 goto leave;128 }129 130 va_list args;131 va_start(args, format);132 133 printf("[%s:%d]: ", tagname, level);134 vprintf(format, args);135 136 va_end(args);137 138 leave:139 fibril_mutex_unlock(&tag_list_guard);140 }141 142 /** Enable debugging prints for given tag.143 *144 * Setting level to <i>n</i> will cause that only printing messages145 * with level lower or equal to <i>n</i> will be printed.146 *147 * @param tagname Tag name.148 * @param level Enabled level.149 */150 void usb_dprintf_enable(const char *tagname, int level)151 {152 fibril_mutex_lock(&tag_list_guard);153 usb_debug_tag_t *tag = get_tag(tagname);154 if (tag == NULL) {155 printf("USB debug: FATAL ERROR - failed to create tag.\n");156 goto leave;157 }158 159 tag->level = level;160 161 leave:162 fibril_mutex_unlock(&tag_list_guard);163 }164 54 165 55 /** Enable logging. … … 182 72 } 183 73 184 74 /** Get log level name prefix. 75 * 76 * @param level Log level. 77 * @return String prefix for the message. 78 */ 185 79 static const char *log_level_name(usb_log_level_t level) 186 80 { … … 252 146 } 253 147 148 149 #define REMAINDER_STR_FMT " (%zu)..." 150 /* string + terminator + number width (enough for 4GB)*/ 151 #define REMAINDER_STR_LEN (5 + 1 + 10) 152 153 /** How many bytes to group together. */ 154 #define BUFFER_DUMP_GROUP_SIZE 4 155 156 /** Size of the string for buffer dumps. */ 157 #define BUFFER_DUMP_LEN 240 /* Ought to be enough for everybody ;-). */ 158 159 /** Fibril local storage for the dumped buffer. */ 160 static fibril_local char buffer_dump[BUFFER_DUMP_LEN]; 161 162 /** Dump buffer into string. 163 * 164 * The function dumps given buffer into hexadecimal format and stores it 165 * in a static fibril local string. 166 * That means that you do not have to deallocate the string (actually, you 167 * can not do that) and you do not have to guard it against concurrent 168 * calls to it. 169 * The only limitation is that each call rewrites the buffer again. 170 * Thus, it is necessary to copy the buffer elsewhere (that includes printing 171 * to screen or writing to file). 172 * Since this function is expected to be used for debugging prints only, 173 * that is not a big limitation. 174 * 175 * @warning You cannot use this function twice in the same printf 176 * (see detailed explanation). 177 * 178 * @param buffer Buffer to be printed (can be NULL). 179 * @param size Size of the buffer in bytes (can be zero). 180 * @param dumped_size How many bytes to actually dump (zero means all). 181 * @return Dumped buffer as a static (but fibril local) string. 182 */ 183 const char *usb_debug_str_buffer(const uint8_t *buffer, size_t size, 184 size_t dumped_size) 185 { 186 /* 187 * Remove previous string (that might also reveal double usage of 188 * this function). 189 */ 190 bzero(buffer_dump, BUFFER_DUMP_LEN); 191 192 if (buffer == NULL) { 193 return "(null)"; 194 } 195 if (size == 0) { 196 return "(empty)"; 197 } 198 if ((dumped_size == 0) || (dumped_size > size)) { 199 dumped_size = size; 200 } 201 202 /* How many bytes are available in the output buffer. */ 203 size_t buffer_remaining_size = BUFFER_DUMP_LEN - 1 - REMAINDER_STR_LEN; 204 char *it = buffer_dump; 205 206 size_t index = 0; 207 208 while (index < size) { 209 /* Determine space before the number. */ 210 const char *space_before; 211 if (index == 0) { 212 space_before = ""; 213 } else if ((index % BUFFER_DUMP_GROUP_SIZE) == 0) { 214 space_before = " "; 215 } else { 216 space_before = " "; 217 } 218 219 /* 220 * Add the byte as a hexadecimal number plus the space. 221 * We do it into temporary buffer to ensure that always 222 * the whole byte is printed. 223 */ 224 int val = buffer[index]; 225 char current_byte[16]; 226 int printed = snprintf(current_byte, 16, 227 "%s%02x", space_before, val); 228 if (printed < 0) { 229 break; 230 } 231 232 if ((size_t) printed > buffer_remaining_size) { 233 break; 234 } 235 236 /* We can safely add 1, because space for end 0 is reserved. */ 237 str_append(it, buffer_remaining_size + 1, current_byte); 238 239 buffer_remaining_size -= printed; 240 /* Point at the terminator 0. */ 241 it += printed; 242 index++; 243 244 if (index >= dumped_size) { 245 break; 246 } 247 } 248 249 /* Add how many bytes were not printed. */ 250 if (index < size) { 251 snprintf(it, REMAINDER_STR_LEN, 252 REMAINDER_STR_FMT, size - index); 253 } 254 255 return buffer_dump; 256 } 257 258 254 259 /** 255 260 * @} -
uspace/lib/usb/src/dp.c
r0588062e r8e9becf6 32 32 /** 33 33 * @file 34 * @brief USB descriptor parser (implementation). 34 * USB descriptor parser (implementation). 35 * 36 * The descriptor parser is a generic parser for structure, where individual 37 * items are stored in single buffer and each item begins with length followed 38 * by type. These types are organized into tree hierarchy. 39 * 40 * The parser is able of only two actions: find first child and find next 41 * sibling. 35 42 */ 36 43 #include <stdio.h> -
uspace/lib/usb/src/dump.c
r0588062e r8e9becf6 31 31 */ 32 32 /** @file 33 * @briefDescriptor dumping.33 * Descriptor dumping. 34 34 */ 35 35 #include <adt/list.h> … … 43 43 #include <usb/classes/hid.h> 44 44 45 /** Mapping between descriptor id and dumping function. */ 45 46 typedef struct { 47 /** Descriptor id. */ 46 48 int id; 49 /** Dumping function. */ 47 50 void (*dump)(FILE *, const char *, const char *, 48 51 const uint8_t *, size_t); … … 66 69 const uint8_t *, size_t); 67 70 71 /** Descriptor dumpers mapping. */ 68 72 static descriptor_dump_t descriptor_dumpers[] = { 69 73 { USB_DESCTYPE_DEVICE, usb_dump_descriptor_device }, … … 273 277 const uint8_t *descriptor, size_t descriptor_length) 274 278 { 279 /* TODO */ 275 280 } 276 281 … … 279 284 const uint8_t *descriptor, size_t descriptor_length) 280 285 { 286 /* TODO */ 281 287 } 282 288 -
uspace/lib/usb/src/hub.c
r0588062e r8e9becf6 57 57 * 58 58 * @param connection Opened connection to host controller. 59 * @param speed Speed of the device that will respond on the default address. 59 60 * @return Error code. 60 61 */ … … 86 87 * 87 88 * @param connection Opened connection to host controller. 89 * @param speed Speed of the new device (device that will be assigned 90 * the returned address). 88 91 * @return Assigned USB address or negative error code. 89 92 */ … … 144 147 /** Wrapper for registering attached device to the hub. 145 148 * 146 * The @p enable_port function is expected to enable si ngalling on given149 * The @p enable_port function is expected to enable signaling on given 147 150 * port. 148 151 * The two arguments to it can have arbitrary meaning … … 152 155 * 153 156 * If the @p enable_port fails (i.e. does not return EOK), the device 154 * addition is cancel led.157 * addition is canceled. 155 158 * The return value is then returned (it is good idea to use different 156 159 * error codes than those listed as return codes by this function itself). 157 160 * 158 * @param parent Parent device (i.e. the hub device).159 * @param connection Opened connection to host controller.160 * @param dev_speed New device speed.161 * @param enable_port Function for enabling signalling through the port the161 * @param[in] parent Parent device (i.e. the hub device). 162 * @param[in] connection Opened connection to host controller. 163 * @param[in] dev_speed New device speed. 164 * @param[in] enable_port Function for enabling signaling through the port the 162 165 * device is attached to. 163 * @param port_no Port number (passed through to @p enable_port).164 * @param arg Any data argument to @p enable_port.166 * @param[in] port_no Port number (passed through to @p enable_port). 167 * @param[in] arg Any data argument to @p enable_port. 165 168 * @param[out] assigned_address USB address of the device. 166 169 * @param[out] assigned_handle Devman handle of the new device. 170 * @param[in] dev_ops Child device ops. 171 * @param[in] new_dev_data Arbitrary pointer to be stored in the child 172 * as @c driver_data. 173 * @param[out] new_fun Storage where pointer to allocated child function 174 * will be written. 167 175 * @return Error code. 168 176 * @retval ENOENT Connection to HC not opened. … … 201 209 202 210 /* 203 * Enable the port (i.e. allow signal ling through this port).211 * Enable the port (i.e. allow signaling through this port). 204 212 */ 205 213 rc = enable_port(port_no, arg); -
uspace/lib/usb/src/pipes.c
r0588062e r8e9becf6 99 99 * 100 100 * @param connection Connection structure to be initialized. 101 * @param dev iceGeneric device backing the USB device.101 * @param dev Generic device backing the USB device. 102 102 * @return Error code. 103 103 */ -
uspace/lib/usb/src/pipesio.c
r0588062e r8e9becf6 115 115 116 116 if (data_request_rc != EOK) { 117 return (int) data_request_rc; 117 /* Prefer the return code of the opening request. */ 118 if (opening_request_rc != EOK) { 119 return (int) opening_request_rc; 120 } else { 121 return (int) data_request_rc; 122 } 118 123 } 119 124 if (opening_request_rc != EOK) { … … 331 336 332 337 if (data_request_rc != EOK) { 333 return (int) data_request_rc; 338 /* Prefer the return code of the opening request. */ 339 if (opening_request_rc != EOK) { 340 return (int) opening_request_rc; 341 } else { 342 return (int) data_request_rc; 343 } 334 344 } 335 345 if (opening_request_rc != EOK) { -
uspace/lib/usb/src/recognise.c
r0588062e r8e9becf6 31 31 */ 32 32 /** @file 33 * @brief Functions for recognising kindof attached devices.33 * Functions for recognition of attached devices. 34 34 */ 35 35 #include <sys/types.h> … … 44 44 #include <assert.h> 45 45 46 /** Index to append after device name for uniqueness. */ 46 47 static size_t device_name_index = 0; 48 /** Mutex guard for device_name_index. */ 47 49 static FIBRIL_MUTEX_INITIALIZE(device_name_index_mutex); 48 50 51 /** DDF operations of child devices. */ 49 52 ddf_dev_ops_t child_ops = { 50 53 .interfaces[USB_DEV_IFACE] = &usb_iface_hub_child_impl 51 54 }; 52 55 56 /** Get integer part from BCD coded number. */ 53 57 #define BCD_INT(a) (((unsigned int)(a)) / 256) 58 /** Get fraction part from BCD coded number (as an integer, no less). */ 54 59 #define BCD_FRAC(a) (((unsigned int)(a)) % 256) 55 60 61 /** Format for BCD coded number to be used in printf. */ 56 62 #define BCD_FMT "%x.%x" 63 /** Arguments to printf for BCD coded number. */ 57 64 #define BCD_ARGS(a) BCD_INT((a)), BCD_FRAC((a)) 58 65 … … 113 120 } 114 121 122 /** Add match id to list or return with error code. 123 * 124 * @param match_ids List of match ids. 125 * @param score Match id score. 126 * @param format Format of the matching string 127 * @param ... Arguments for the format. 128 */ 115 129 #define ADD_MATCHID_OR_RETURN(match_ids, score, format, ...) \ 116 130 do { \ … … 124 138 /** Create device match ids based on its interface. 125 139 * 126 * @param[in] descriptor Interface descriptor. 140 * @param[in] desc_device Device descriptor. 141 * @param[in] desc_interface Interface descriptor. 127 142 * @param[out] matches Initialized list of match ids. 128 143 * @return Error code (the two mentioned are not the only ones). 129 144 * @retval EINVAL Invalid input parameters (expects non NULL pointers). 130 * @retval ENOENT Interface does not specify class.145 * @retval ENOENT Device class is not "use interface". 131 146 */ 132 147 int usb_device_create_match_ids_from_interface( … … 319 334 * @param[in] parent Parent device. 320 335 * @param[out] child_handle Handle of the child device. 336 * @param[in] dev_ops Child device ops. 337 * @param[in] dev_data Arbitrary pointer to be stored in the child 338 * as @c driver_data. 339 * @param[out] child_fun Storage where pointer to allocated child function 340 * will be written. 321 341 * @return Error code. 322 342 */ -
uspace/lib/usb/src/request.c
r0588062e r8e9becf6 110 110 * (must be in USB endianness). 111 111 * @param data Buffer where to store data accepted during the DATA stage. 112 * (they will come in USB endian ess).112 * (they will come in USB endianness). 113 113 * @param data_size Size of the @p data buffer 114 114 * (in native endianness). … … 161 161 * the new address. 162 162 * 163 * @see usb_drv_reserve_default_address164 * @see usb_drv_release_default_address165 * @see usb_drv_request_address166 * @see usb_drv_release_address167 * @see usb_drv_bind_address168 *169 163 * @param pipe Control endpoint pipe (session must be already started). 170 164 * @param new_address New USB address to be set (in native endianness). … … 201 195 * @param[in] pipe Control endpoint pipe (session must be already started). 202 196 * @param[in] request_type Request type (standard/class/vendor). 197 * @param[in] recipient Request recipient (device/interface/endpoint). 203 198 * @param[in] descriptor_type Descriptor type (device/configuration/HID/...). 204 199 * @param[in] descriptor_index Descriptor index. … … 235 230 * @param[in] pipe Control endpoint pipe (session must be already started). 236 231 * @param[in] request_type Request type (standard/class/vendor). 232 * @param[in] recipient Request recipient (device/interface/endpoint). 237 233 * @param[in] descriptor_type Descriptor type (device/configuration/HID/...). 238 234 * @param[in] descriptor_index Descriptor index. … … 528 524 return EEMPTY; 529 525 } 530 /* Sub stract first 2 bytes (length and descriptor type). */526 /* Subtract first 2 bytes (length and descriptor type). */ 531 527 string_descriptor_size -= 2; 532 528 … … 548 544 size_t i; 549 545 for (i = 0; i < langs_count; i++) { 550 /* Language code from the descriptor is in USB endian ess. */546 /* Language code from the descriptor is in USB endianness. */ 551 547 /* FIXME: is this really correct? */ 552 548 uint16_t lang_code = (string_descriptor[2 + 2 * i + 1] << 8) … … 569 565 * 570 566 * @param[in] pipe Control endpoint pipe (session must be already started). 571 * @param[in] index String index (in native endian ess),567 * @param[in] index String index (in native endianness), 572 568 * first index has number 1 (index from descriptors can be used directly). 573 * @param[in] lang String language (in native endian ess).569 * @param[in] lang String language (in native endianness). 574 570 * @param[out] string_ptr Where to store allocated string in native encoding. 575 571 * @return Error code. … … 613 609 goto leave; 614 610 } 615 /* Sub stract first 2 bytes (length and descriptor type). */611 /* Subtract first 2 bytes (length and descriptor type). */ 616 612 string_size -= 2; 617 613 -
uspace/lib/usb/src/usb.c
r0588062e r8e9becf6 31 31 */ 32 32 /** @file 33 * @brief Base USB types.33 * Common USB functions. 34 34 */ 35 35 #include <usb/usb.h> … … 37 37 38 38 39 /** String representation for USB transfer type. */ 39 /** String representation for USB transfer type. 40 * 41 * @param t Transfer type. 42 * @return Transfer type as a string (in English). 43 */ 40 44 const char * usb_str_transfer_type(usb_transfer_type_t t) 41 45 {
Note:
See TracChangeset
for help on using the changeset viewer.