Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/usbhid/usbhid.c

    r9d58539 re2dfa86  
    4141#include <usb/hid/hidreport.h>
    4242#include <usb/hid/request.h>
     43
    4344#include <errno.h>
     45#include <macros.h>
    4446#include <str_error.h>
    4547
     
    5860        NULL
    5961};
    60 /*----------------------------------------------------------------------------*/
     62
    6163static int usb_hid_set_boot_kbd_subdriver(usb_hid_dev_t *hid_dev)
    6264{
     
    7476        return EOK;
    7577}
    76 /*----------------------------------------------------------------------------*/
     78
    7779static int usb_hid_set_boot_mouse_subdriver(usb_hid_dev_t *hid_dev)
    7880{
     
    9092        return EOK;
    9193}
    92 /*----------------------------------------------------------------------------*/
     94
    9395static int usb_hid_set_generic_hid_subdriver(usb_hid_dev_t *hid_dev)
    9496{
     
    110112        return EOK;
    111113}
    112 /*----------------------------------------------------------------------------*/
     114
    113115static bool usb_hid_ids_match(const usb_hid_dev_t *hid_dev,
    114116    const usb_hid_subdriver_mapping_t *mapping)
    115117{
    116         assert(hid_dev != NULL);
    117         assert(hid_dev->usb_dev != NULL);
    118 
    119         return (hid_dev->usb_dev->descriptors.device.vendor_id
    120             == mapping->vendor_id
    121             && hid_dev->usb_dev->descriptors.device.product_id
    122             == mapping->product_id);
    123 }
    124 /*----------------------------------------------------------------------------*/
     118        assert(hid_dev);
     119        assert(hid_dev->usb_dev);
     120        assert(mapping);
     121        const usb_standard_device_descriptor_t *d =
     122            &usb_device_descriptors(hid_dev->usb_dev)->device;
     123
     124        return (d->vendor_id == mapping->vendor_id)
     125            && (d->product_id == mapping->product_id);
     126}
     127
    125128static bool usb_hid_path_matches(usb_hid_dev_t *hid_dev,
    126129    const usb_hid_subdriver_mapping_t *mapping)
     
    178181        return matches;
    179182}
    180 /*----------------------------------------------------------------------------*/
     183
    181184static int usb_hid_save_subdrivers(usb_hid_dev_t *hid_dev,
    182185    const usb_hid_subdriver_t **subdrivers, unsigned count)
     
    211214        return EOK;
    212215}
    213 /*----------------------------------------------------------------------------*/
     216
    214217static int usb_hid_find_subdrivers(usb_hid_dev_t *hid_dev)
    215218{
     
    263266        return usb_hid_save_subdrivers(hid_dev, subdrivers, count);
    264267}
    265 /*----------------------------------------------------------------------------*/
    266 static int usb_hid_check_pipes(usb_hid_dev_t *hid_dev, const usb_device_t *dev)
     268
     269static int usb_hid_check_pipes(usb_hid_dev_t *hid_dev, usb_device_t *dev)
    267270{
    268271        assert(hid_dev);
     
    270273
    271274        static const struct {
    272                 unsigned ep_number;
     275                const usb_endpoint_description_t *desc;
    273276                const char* description;
    274277        } endpoints[] = {
    275                 {USB_HID_KBD_POLL_EP_NO, "Keyboard endpoint"},
    276                 {USB_HID_MOUSE_POLL_EP_NO, "Mouse endpoint"},
    277                 {USB_HID_GENERIC_POLL_EP_NO, "Generic HID endpoint"},
     278                {&usb_hid_kbd_poll_endpoint_description, "Keyboard endpoint"},
     279                {&usb_hid_mouse_poll_endpoint_description, "Mouse endpoint"},
     280                {&usb_hid_generic_poll_endpoint_description, "Generic HID endpoint"},
    278281        };
    279282
    280         for (unsigned i = 0; i < sizeof(endpoints)/sizeof(endpoints[0]); ++i) {
    281                 if (endpoints[i].ep_number >= dev->pipes_count) {
    282                         return EINVAL;
    283                 }
    284                 if (dev->pipes[endpoints[i].ep_number].present) {
     283        for (unsigned i = 0; i < ARRAY_SIZE(endpoints); ++i) {
     284                usb_endpoint_mapping_t *epm =
     285                    usb_device_get_mapped_ep_desc(dev, endpoints[i].desc);
     286                if (epm && epm->present) {
    285287                        usb_log_debug("Found: %s.\n", endpoints[i].description);
    286                         hid_dev->poll_pipe_index = endpoints[i].ep_number;
     288                        hid_dev->poll_pipe_mapping = epm;
    287289                        return EOK;
    288290                }
     
    290292        return ENOTSUP;
    291293}
    292 /*----------------------------------------------------------------------------*/
     294
    293295static int usb_hid_init_report(usb_hid_dev_t *hid_dev)
    294296{
     
    322324        return EOK;
    323325}
    324 /*----------------------------------------------------------------------------*/
     326
    325327/*
    326328 * This functions initializes required structures from the device's descriptors
     
    351353        /* The USB device should already be initialized, save it in structure */
    352354        hid_dev->usb_dev = dev;
    353         hid_dev->poll_pipe_index = -1;
     355        hid_dev->poll_pipe_mapping = NULL;
    354356
    355357        int rc = usb_hid_check_pipes(hid_dev, dev);
     
    381383                    "boot protocol.\n");
    382384
    383                 switch (hid_dev->poll_pipe_index) {
    384                 case USB_HID_KBD_POLL_EP_NO:
     385                switch (hid_dev->poll_pipe_mapping->interface->interface_protocol) {
     386                case USB_HID_PROTOCOL_KEYBOARD:
    385387                        usb_log_info("Falling back to kbd boot protocol.\n");
    386388                        rc = usb_kbd_set_boot_protocol(hid_dev);
     
    389391                        }
    390392                        break;
    391                 case USB_HID_MOUSE_POLL_EP_NO:
     393                case USB_HID_PROTOCOL_MOUSE:
    392394                        usb_log_info("Falling back to mouse boot protocol.\n");
    393395                        rc = usb_mouse_set_boot_protocol(hid_dev);
     
    397399                        break;
    398400                default:
    399                         assert(hid_dev->poll_pipe_index
    400                             == USB_HID_GENERIC_POLL_EP_NO);
    401401                        usb_log_info("Falling back to generic HID driver.\n");
    402402                        usb_hid_set_generic_hid_subdriver(hid_dev);
     
    458458        return rc;
    459459}
    460 /*----------------------------------------------------------------------------*/
     460
    461461bool usb_hid_polling_callback(usb_device_t *dev, uint8_t *buffer,
    462462    size_t buffer_size, void *arg)
     
    485485            &hid_dev->report, buffer, buffer_size, &hid_dev->report_id);
    486486        if (rc != EOK) {
    487                 usb_log_warning("Error in usb_hid_parse_report():"
     487                usb_log_warning("Failure in usb_hid_parse_report():"
    488488                    "%s\n", str_error(rc));
    489489        }
     
    500500        return cont;
    501501}
    502 /*----------------------------------------------------------------------------*/
     502
    503503void usb_hid_polling_ended_callback(usb_device_t *dev, bool reason, void *arg)
    504504{
     
    517517        hid_dev->running = false;
    518518}
    519 /*----------------------------------------------------------------------------*/
     519
    520520void usb_hid_new_report(usb_hid_dev_t *hid_dev)
    521521{
    522522        ++hid_dev->report_nr;
    523523}
    524 /*----------------------------------------------------------------------------*/
     524
    525525int usb_hid_report_number(const usb_hid_dev_t *hid_dev)
    526526{
    527527        return hid_dev->report_nr;
    528528}
    529 /*----------------------------------------------------------------------------*/
     529
    530530void usb_hid_deinit(usb_hid_dev_t *hid_dev)
    531531{
Note: See TracChangeset for help on using the changeset viewer.