Ignore:
File:
1 edited

Legend:

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

    ra8c4e871 r9d58539  
    4646#include "usbhid.h"
    4747
    48 /*----------------------------------------------------------------------------*/
    49 
    5048#define NAME "usbhid"
    5149
    5250/**
    53  * Function for adding a new device of type USB/HID/keyboard.
     51 * Callback for passing a new device to the driver.
    5452 *
    55  * This functions initializes required structures from the device's descriptors
    56  * and starts new fibril for polling the keyboard for events and another one for
    57  * handling auto-repeat of keys.
     53 * @note Currently, only boot-protocol keyboards are supported by this driver.
    5854 *
    59  * During initialization, the keyboard is switched into boot protocol, the idle
    60  * rate is set to 0 (infinity), resulting in the keyboard only reporting event
    61  * when a key is pressed or released. Finally, the LED lights are turned on
    62  * according to the default setup of lock keys.
    63  *
    64  * @note By default, the keyboards is initialized with Num Lock turned on and
    65  *       other locks turned off.
    66  * @note Currently supports only boot-protocol keyboards.
    67  *
    68  * @param dev Device to add.
    69  *
    70  * @retval EOK if successful.
    71  * @retval ENOMEM if there
    72  * @return Other error code inherited from one of functions usb_kbd_init(),
    73  *         ddf_fun_bind() and ddf_fun_add_to_class().
     55 * @param dev Structure representing the new device.
     56 * @return Error code.
    7457 */
    75 static int usb_hid_try_add_device(usb_device_t *dev)
     58static int usb_hid_device_add(usb_device_t *dev)
    7659{
    77         assert(dev != NULL);
     60        usb_log_debug("%s\n", __FUNCTION__);
    7861
    79         /* Initialize device (get and process descriptors, get address, etc.) */
    80         usb_log_debug("Initializing USB/HID device...\n");
     62        if (dev == NULL) {
     63                usb_log_error("Wrong parameter given for add_device().\n");
     64                return EINVAL;
     65        }
    8166
     67        if (dev->interface_no < 0) {
     68                usb_log_error("Failed to add HID device: endpoints not found."
     69                    "\n");
     70                return ENOTSUP;
     71        }
    8272        usb_hid_dev_t *hid_dev =
    8373            usb_device_data_alloc(dev, sizeof(usb_hid_dev_t));
    8474        if (hid_dev == NULL) {
    85                 usb_log_error("Error while creating USB/HID device "
    86                     "structure.\n");
     75                usb_log_error("Failed to create USB/HID device structure.\n");
    8776                return ENOMEM;
    8877        }
    8978
    9079        int rc = usb_hid_init(hid_dev, dev);
    91 
    9280        if (rc != EOK) {
    9381                usb_log_error("Failed to initialize USB/HID device.\n");
     
    9886        usb_log_debug("USB/HID device structure initialized.\n");
    9987
    100         /*
    101          * 1) subdriver vytvori vlastnu ddf_fun, vlastne ddf_dev_ops, ktore da
    102          *    do nej.
    103          * 2) do tych ops do .interfaces[DEV_IFACE_USBHID (asi)] priradi
    104          *    vyplnenu strukturu usbhid_iface_t.
    105          * 3) klientska aplikacia - musi si rucne vytvorit telefon
    106          *    (devman_device_connect() - cesta k zariadeniu (/hw/pci0/...) az
    107          *    k tej fcii.
    108          *    pouzit usb/classes/hid/iface.h - prvy int je telefon
    109          */
    110 
    11188        /* Start automated polling function.
    11289         * This will create a separate fibril that will query the device
    113          * for the data continuously
    114          */
     90         * for the data continuously. */
    11591       rc = usb_device_auto_poll(dev,
    11692           /* Index of the polling pipe. */
     
    11995           usb_hid_polling_callback,
    12096           /* How much data to request. */
    121            dev->pipes[hid_dev->poll_pipe_index].pipe->max_packet_size,
     97           dev->pipes[hid_dev->poll_pipe_index].pipe.max_packet_size,
    12298           /* Callback when the polling ends. */
    12399           usb_hid_polling_ended_callback,
     
    133109        hid_dev->running = true;
    134110
    135         /*
    136          * Hurrah, device is initialized.
    137          */
    138         return EOK;
    139 }
    140 
    141 /*----------------------------------------------------------------------------*/
    142 /**
    143  * Callback for passing a new device to the driver.
    144  *
    145  * @note Currently, only boot-protocol keyboards are supported by this driver.
    146  *
    147  * @param dev Structure representing the new device.
    148  *
    149  * @retval EOK if successful.
    150  * @retval EREFUSED if the device is not supported.
    151  */
    152 static int usb_hid_device_add(usb_device_t *dev)
    153 {
    154         usb_log_debug("usb_hid_device_add()\n");
    155 
    156         if (dev == NULL) {
    157                 usb_log_warning("Wrong parameter given for add_device().\n");
    158                 return EINVAL;
    159         }
    160 
    161         if (dev->interface_no < 0) {
    162                 usb_log_warning("Device is not a supported HID device.\n");
    163                 usb_log_error("Failed to add HID device: endpoints not found."
    164                     "\n");
    165                 return ENOTSUP;
    166         }
    167 
    168         int rc = usb_hid_try_add_device(dev);
    169 
    170         if (rc != EOK) {
    171                 usb_log_warning("Device is not a supported HID device.\n");
    172                 usb_log_error("Failed to add HID device: %s.\n",
    173                     str_error(rc));
    174                 return rc;
    175         }
    176 
    177111        usb_log_info("HID device `%s' ready to use.\n", dev->ddf_dev->name);
    178112
    179113        return EOK;
    180114}
    181 
    182115/*----------------------------------------------------------------------------*/
    183 
     116/**
     117 * Callback for a device about to be removed from the driver.
     118 *
     119 * @param dev Structure representing the device.
     120 * @return Error code.
     121 */
     122static int usb_hid_device_rem(usb_device_t *dev)
     123{
     124        // TODO: Stop device polling
     125        // TODO: Call deinit (stops autorepeat too)
     126        return ENOTSUP;
     127}
     128/*----------------------------------------------------------------------------*/
    184129/**
    185130 * Callback for removing a device from the driver.
    186131 *
    187132 * @param dev Structure representing the device.
    188  *
    189  * @retval EOK if successful.
    190  * @retval EREFUSED if the device is not supported.
     133 * @return Error code.
    191134 */
    192135static int usb_hid_device_gone(usb_device_t *dev)
    193136{
     137        assert(dev);
     138        assert(dev->driver_data);
    194139        usb_hid_dev_t *hid_dev = dev->driver_data;
    195         unsigned tries = 10;
    196         while (hid_dev->running) {
     140        unsigned tries = 100;
     141        /* Wait for fail. */
     142        while (hid_dev->running && tries--) {
    197143                async_usleep(100000);
    198                 if (!tries--) {
    199                         usb_log_error("Can't remove hub, still running.\n");
    200                         return EINPROGRESS;
    201                 }
     144        }
     145        if (hid_dev->running) {
     146                usb_log_error("Can't remove hid, still running.\n");
     147                return EBUSY;
    202148        }
    203149
    204         assert(!hid_dev->running);
    205150        usb_hid_deinit(hid_dev);
    206151        usb_log_debug2("%s destruction complete.\n", dev->ddf_dev->name);
    207152        return EOK;
    208153}
    209 
     154/*----------------------------------------------------------------------------*/
    210155/** USB generic driver callbacks */
    211 static usb_driver_ops_t usb_hid_driver_ops = {
     156static const usb_driver_ops_t usb_hid_driver_ops = {
    212157        .device_add = usb_hid_device_add,
     158        .device_rem = usb_hid_device_rem,
    213159        .device_gone = usb_hid_device_gone,
    214160};
    215 
    216 
     161/*----------------------------------------------------------------------------*/
    217162/** The driver itself. */
    218 static usb_driver_t usb_hid_driver = {
     163static const usb_driver_t usb_hid_driver = {
    219164        .name = NAME,
    220165        .ops = &usb_hid_driver_ops,
    221166        .endpoints = usb_hid_endpoints
    222167};
    223 
    224168/*----------------------------------------------------------------------------*/
    225 
    226169int main(int argc, char *argv[])
    227170{
     
    232175        return usb_driver_main(&usb_hid_driver);
    233176}
    234 
    235177/**
    236178 * @}
Note: See TracChangeset for help on using the changeset viewer.