Changes in / [cbdb6457:11d2e96a] in mainline
- Location:
- uspace/drv/usbhid
- Files:
-
- 2 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhid/Makefile
rcbdb6457 r11d2e96a 46 46 generic/hiddev.c \ 47 47 mouse/mousedev.c \ 48 lgtch-ultrax/lgtch-ultrax.c \ 48 49 $(STOLEN_LAYOUT_SOURCES) 49 50 -
uspace/drv/usbhid/kbd/kbddev.c
rcbdb6457 r11d2e96a 176 176 177 177 /*----------------------------------------------------------------------------*/ 178 179 static void usb_kbd_process_keycodes(const uint8_t *key_codes, size_t count, 180 uint8_t report_id, void *arg); 181 182 static const usb_hid_report_in_callbacks_t usb_kbd_parser_callbacks = { 183 .keyboard = usb_kbd_process_keycodes 184 }; 185 186 /*----------------------------------------------------------------------------*/ 178 187 /* Keyboard layouts */ 179 188 /*----------------------------------------------------------------------------*/ … … 630 639 { 631 640 assert(hid_dev->parser != NULL); 632 633 usb_hid_report_in_callbacks_t *callbacks =634 (usb_hid_report_in_callbacks_t *)malloc(635 sizeof(usb_hid_report_in_callbacks_t));636 637 callbacks->keyboard = usb_kbd_process_keycodes;638 641 639 642 usb_log_debug("Calling usb_hid_parse_report() with " … … 644 647 usb_hid_report_path_t *path = usb_hid_report_path(); 645 648 usb_hid_report_path_append_item(path, USB_HIDUT_PAGE_KEYBOARD, 0); 646 usb_hid_report_path_set_report_id(path, 0);649 //usb_hid_report_path_set_report_id(path, 0); 647 650 648 651 int rc = usb_hid_parse_report(hid_dev->parser, buffer, 649 652 actual_size, path, 650 653 USB_HID_PATH_COMPARE_END | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 651 callbacks, hid_dev);654 &usb_kbd_parser_callbacks, hid_dev); 652 655 653 656 usb_hid_report_path_free(path); -
uspace/drv/usbhid/main.c
rcbdb6457 r11d2e96a 75 75 static int usb_hid_try_add_device(usb_device_t *dev) 76 76 { 77 assert(dev != NULL); 78 77 79 /* 78 80 * Initialize device (get and process descriptors, get address, etc.) … … 178 180 usb_log_debug("usb_hid_add_device()\n"); 179 181 182 if (dev == NULL) { 183 usb_log_warning("Wrong parameter given for add_device().\n"); 184 return EINVAL; 185 } 186 180 187 if (dev->interface_no < 0) { 181 188 usb_log_warning("Device is not a supported HID device.\n"); -
uspace/drv/usbhid/mouse/mousedev.c
rcbdb6457 r11d2e96a 157 157 static void usb_mouse_free(usb_mouse_t **mouse_dev) 158 158 { 159 if (mouse_dev == NULL || *mouse_dev == NULL) { 160 return; 161 } 159 assert(mouse_dev != NULL && *mouse_dev != NULL); 162 160 163 161 // hangup phone to the console 164 async_hangup((*mouse_dev)->console_phone); 162 if ((*mouse_dev)->console_phone >= 0) { 163 async_hangup((*mouse_dev)->console_phone); 164 } 165 165 166 166 free(*mouse_dev); -
uspace/drv/usbhid/subdrivers.c
rcbdb6457 r11d2e96a 37 37 #include "usb/classes/hidut.h" 38 38 39 static usb_hid_subdriver_usage_t path_kbd[] = {{USB_HIDUT_PAGE_KEYBOARD, 0}}; 39 #include "lgtch-ultrax/lgtch-ultrax.h" 40 41 static usb_hid_subdriver_usage_t path_kbd[] = { 42 {USB_HIDUT_PAGE_KEYBOARD, 0}, 43 {0, 0} 44 }; 45 46 static usb_hid_subdriver_usage_t lgtch_path[] = { 47 {0xc, 0}, 48 {0, 0} 49 }; 40 50 41 51 const usb_hid_subdriver_mapping_t usb_hid_subdrivers[] = { 42 52 { 43 53 path_kbd, 54 -1, 55 USB_HID_PATH_COMPARE_END 56 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 57 0, 58 0, 59 { 60 .init = usb_kbd_init, 61 .deinit = usb_kbd_deinit, 62 .poll = usb_kbd_polling_callback, 63 .poll_end = NULL 64 }, 65 66 }, 67 { 68 lgtch_path, 44 69 1, 45 70 USB_HID_PATH_COMPARE_END 46 71 | USB_HID_PATH_COMPARE_USAGE_PAGE_ONLY, 47 NULL,48 NULL,72 0x046d, 73 0xc30e, 49 74 { 50 usb_kbd_init, 51 usb_kbd_deinit, 52 usb_kbd_polling_callback, 53 NULL 54 }, 55 75 .init = NULL, 76 .deinit = NULL, 77 .poll = usb_lgtch_polling_callback, 78 .poll_end = NULL 79 } 56 80 }, 57 {NULL, 0, 0, NULL, NULL, {NULL, NULL, NULL, NULL}}81 {NULL, -1, 0, 0, 0, {NULL, NULL, NULL, NULL}} 58 82 }; 59 83 -
uspace/drv/usbhid/subdrivers.h
rcbdb6457 r11d2e96a 54 54 typedef struct usb_hid_subdriver_mapping { 55 55 const usb_hid_subdriver_usage_t *usage_path; 56 int path_size;56 int report_id; 57 57 int compare; 58 const char *vendor_id;59 const char *product_id;58 uint16_t vendor_id; 59 uint16_t product_id; 60 60 usb_hid_subdriver_t subdriver; 61 61 } usb_hid_subdriver_mapping_t; -
uspace/drv/usbhid/usbhid.c
rcbdb6457 r11d2e96a 67 67 static int usb_hid_set_boot_kbd_subdriver(usb_hid_dev_t *hid_dev) 68 68 { 69 assert(hid_dev ->subdriver_count == 0);69 assert(hid_dev != NULL && hid_dev->subdriver_count == 0); 70 70 71 71 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc( … … 97 97 static int usb_hid_set_boot_mouse_subdriver(usb_hid_dev_t *hid_dev) 98 98 { 99 assert(hid_dev ->subdriver_count == 0);99 assert(hid_dev != NULL && hid_dev->subdriver_count == 0); 100 100 101 101 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc( … … 127 127 static int usb_hid_set_generic_hid_subdriver(usb_hid_dev_t *hid_dev) 128 128 { 129 assert(hid_dev ->subdriver_count == 0);129 assert(hid_dev != NULL && hid_dev->subdriver_count == 0); 130 130 131 131 hid_dev->subdrivers = (usb_hid_subdriver_t *)malloc( … … 164 164 165 165 static bool usb_hid_path_matches(usb_hid_dev_t *hid_dev, 166 const usb_hid_subdriver_ usage_t *path, int path_size, int compare)166 const usb_hid_subdriver_mapping_t *mapping) 167 167 { 168 168 assert(hid_dev != NULL); 169 assert( path!= NULL);169 assert(mapping != NULL); 170 170 171 171 usb_hid_report_path_t *usage_path = usb_hid_report_path(); … … 174 174 return false; 175 175 } 176 int i; 177 for (i = 0; i < path_size; ++i) { 176 int i = 0; 177 while (mapping->usage_path[i].usage != 0 178 || mapping->usage_path[i].usage_page != 0) { 178 179 if (usb_hid_report_path_append_item(usage_path, 179 path[i].usage_page, path[i].usage) != EOK) { 180 mapping->usage_path[i].usage_page, 181 mapping->usage_path[i].usage) != EOK) { 180 182 usb_log_debug("Failed to append to usage path.\n"); 181 183 usb_hid_report_path_free(usage_path); 182 184 return false; 183 185 } 186 ++i; 187 } 188 189 if (mapping->report_id >= 0) { 190 usb_hid_report_path_set_report_id(usage_path, 191 mapping->report_id); 184 192 } 185 193 186 194 assert(hid_dev->parser != NULL); 187 195 188 usb_log_debug("Compare flags: %d\n", compare);196 usb_log_debug("Compare flags: %d\n", mapping->compare); 189 197 size_t size = usb_hid_report_input_length(hid_dev->parser, usage_path, 190 compare);198 mapping->compare); 191 199 usb_log_debug("Size of the input report: %d\n", size); 192 200 … … 231 239 static int usb_hid_find_subdrivers(usb_hid_dev_t *hid_dev) 232 240 { 241 assert(hid_dev != NULL); 242 233 243 const usb_hid_subdriver_t *subdrivers[USB_HID_MAX_SUBDRIVERS]; 234 244 235 245 int i = 0, count = 0; 236 246 const usb_hid_subdriver_mapping_t *mapping = &usb_hid_subdrivers[i]; 247 248 bool ids_matched; 249 bool matched; 237 250 238 251 while (count < USB_HID_MAX_SUBDRIVERS && 239 252 (mapping->usage_path != NULL 240 || mapping->vendor_id != NULL 241 || mapping->product_id != NULL)) { 253 || mapping->vendor_id != 0 || mapping->product_id != 0)) { 242 254 // check the vendor & product ID 243 if (mapping->vendor_id != NULL && mapping->product_id == NULL) {244 usb_log_warning("Missing Product ID for Vendor ID % s\n",255 if (mapping->vendor_id != 0 && mapping->product_id == 0) { 256 usb_log_warning("Missing Product ID for Vendor ID %u\n", 245 257 mapping->vendor_id); 246 258 return EINVAL; 247 259 } 248 if (mapping->product_id != NULL && mapping->vendor_id == NULL) {249 usb_log_warning("Missing Vendor ID for Product ID % s\n",260 if (mapping->product_id != 0 && mapping->vendor_id == 0) { 261 usb_log_warning("Missing Vendor ID for Product ID %u\n", 250 262 mapping->product_id); 251 263 return EINVAL; 252 264 } 253 265 254 if (mapping->vendor_id != NULL) { 255 assert(mapping->product_id != NULL); 256 usb_log_debug("Comparing device against vendor ID %s" 257 " and product ID %s.\n", mapping->vendor_id, 266 ids_matched = false; 267 matched = false; 268 269 if (mapping->vendor_id != 0) { 270 assert(mapping->product_id != 0); 271 usb_log_debug("Comparing device against vendor ID %u" 272 " and product ID %u.\n", mapping->vendor_id, 258 273 mapping->product_id); 259 274 if (usb_hid_ids_match(hid_dev, mapping)) { 260 usb_log_debug("Matched.\n"); 261 subdrivers[count++] = &mapping->subdriver; 262 // skip the checking of usage path 263 goto next; 275 usb_log_debug("IDs matched.\n"); 276 ids_matched = true; 264 277 } 265 278 } … … 267 280 if (mapping->usage_path != NULL) { 268 281 usb_log_debug("Comparing device against usage path.\n"); 269 if (usb_hid_path_matches(hid_dev, 270 mapping->usage_path, mapping->path_size, 271 mapping->compare)) { 272 subdrivers[count++] = &mapping->subdriver; 273 } else { 274 usb_log_debug("Not matched.\n"); 282 if (usb_hid_path_matches(hid_dev, mapping)) { 283 // does not matter if IDs were matched 284 matched = true; 275 285 } 276 } 277 next: 286 } else { 287 // matched only if IDs were matched and there is no path 288 matched = ids_matched; 289 } 290 291 if (matched) { 292 subdrivers[count++] = &mapping->subdriver; 293 } 294 278 295 mapping = &usb_hid_subdrivers[++i]; 279 296 } … … 287 304 static int usb_hid_check_pipes(usb_hid_dev_t *hid_dev, usb_device_t *dev) 288 305 { 306 assert(hid_dev != NULL && dev != NULL); 307 289 308 int rc = EOK; 290 309
Note:
See TracChangeset
for help on using the changeset viewer.