Changeset 3690c75 in mainline for uspace/drv/usbhid/usbhid.c
- Timestamp:
- 2011-04-15T16:13:07Z (13 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 242f0e2, e3f1987
- Parents:
- 6b082a1b (diff), 11d2e96a (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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/usbhid/usbhid.c
r6b082a1b r3690c75 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.