Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/usbkbd/main.c

    r0e126be7 r101ef25c  
    2828#include <usb/usbdrv.h>
    2929#include <driver.h>
     30#include <ipc/driver.h>
    3031#include <errno.h>
     32#include <fibril.h>
     33#include <usb/classes/hid.h>
    3134
    3235#define BUFFER_SIZE 32
    33 
    34 /* Call this periodically to check keyboard status changes. */
    35 static void poll_keyboard(device_t *dev)
     36#define NAME "usbkbd"
     37
     38static const usb_endpoint_t CONTROL_EP = 0;
     39
     40static usb_hid_dev_kbd_t *usbkbd_init_device(device_t *dev)
     41{
     42        usb_hid_dev_kbd_t *kbd_dev = (usb_hid_dev_kbd_t *)malloc(
     43                        sizeof(usb_hid_dev_kbd_t));
     44
     45        if (kbd_dev == NULL) {
     46                fprintf(stderr, NAME ": No memory!\n");
     47                return NULL;
     48        }
     49
     50        kbd_dev->device = dev;
     51
     52        // get phone to my HC and save it as my parent's phone
     53        // TODO: maybe not a good idea if DDF will use parent_phone
     54        kbd_dev->device->parent_phone = usb_drv_hc_connect(dev, 0);
     55
     56        kbd_dev->address = usb_drv_get_my_address(dev->parent_phone,
     57            dev);
     58
     59        // doesn't matter now that we have no address
     60//      if (kbd_dev->address < 0) {
     61//              fprintf(stderr, NAME ": No device address!\n");
     62//              free(kbd_dev);
     63//              return NULL;
     64//      }
     65
     66        // default endpoint
     67        kbd_dev->default_ep = CONTROL_EP;
     68
     69        // TODO: get descriptors
     70
     71        // TODO: parse descriptors and save endpoints
     72
     73        return kbd_dev;
     74}
     75
     76static void usbkbd_process_interrupt_in(usb_hid_dev_kbd_t *kbd_dev,
     77                                        char *buffer, size_t actual_size)
     78{
     79        /*
     80         * here, the parser will be called, probably with some callbacks
     81         * now only take last 6 bytes and process, i.e. send to kbd
     82         */
     83}
     84
     85static void usbkbd_poll_keyboard(usb_hid_dev_kbd_t *kbd_dev)
    3686{
    3787        int rc;
     
    3989        char buffer[BUFFER_SIZE];
    4090        size_t actual_size;
    41         usb_endpoint_t poll_endpoint = 1;
    42 
    43         usb_address_t my_address = usb_drv_get_my_address(dev->parent_phone,
    44             dev);
    45         if (my_address < 0) {
    46                 return;
    47         }
     91        //usb_endpoint_t poll_endpoint = 1;
     92
     93//      usb_address_t my_address = usb_drv_get_my_address(dev->parent_phone,
     94//          dev);
     95//      if (my_address < 0) {
     96//              return;
     97//      }
    4898
    4999        usb_target_t poll_target = {
    50                 .address = my_address,
    51                 .endpoint = poll_endpoint
     100                .address = kbd_dev->address,
     101                .endpoint = kbd_dev->default_ep
    52102        };
    53103
    54         rc = usb_drv_async_interrupt_in(dev->parent_phone, poll_target,
    55             buffer, BUFFER_SIZE, &actual_size, &handle);
    56         if (rc != EOK) {
    57                 return;
    58         }
    59 
    60         rc = usb_drv_async_wait_for(handle);
    61         if (rc != EOK) {
    62                 return;
    63         }
    64 
    65         /*
    66          * If the keyboard answered with NAK, it returned no data.
    67          * This implies that no change happened since last query.
    68          */
    69         if (actual_size == 0) {
    70                 return;
    71         }
    72 
    73         /*
    74          * Process pressed keys.
    75          */
    76 }
    77 
    78 static int add_kbd_device(device_t *dev)
     104        while (true) {
     105                rc = usb_drv_async_interrupt_in(kbd_dev->device->parent_phone,
     106                    poll_target, buffer, BUFFER_SIZE, &actual_size, &handle);
     107
     108                if (rc != EOK) {
     109                        continue;
     110                }
     111
     112                rc = usb_drv_async_wait_for(handle);
     113                if (rc != EOK) {
     114                        continue;
     115                }
     116
     117                /*
     118                 * If the keyboard answered with NAK, it returned no data.
     119                 * This implies that no change happened since last query.
     120                 */
     121                if (actual_size == 0) {
     122                        continue;
     123                }
     124
     125                /*
     126                 * TODO: Process pressed keys.
     127                 */
     128                usbkbd_process_interrupt_in(kbd_dev, buffer, actual_size);
     129        }
     130
     131        // not reached
     132        assert(0);
     133}
     134
     135static int usbkbd_fibril_device(void *arg)
     136{
     137        printf("!!! USB device fibril\n");
     138
     139        if (arg == NULL) {
     140                printf("No device!\n");
     141                return -1;
     142        }
     143
     144        device_t *dev = (device_t *)arg;
     145
     146        // initialize device (get and process descriptors, get address, etc.)
     147        usb_hid_dev_kbd_t *kbd_dev = usbkbd_init_device(dev);
     148
     149        usbkbd_poll_keyboard(kbd_dev);
     150
     151        return EOK;
     152}
     153
     154static int usbkbd_add_device(device_t *dev)
    79155{
    80156        /* For now, fail immediately. */
    81         return ENOTSUP;
     157        //return ENOTSUP;
    82158
    83159        /*
    84160         * When everything is okay, connect to "our" HC.
    85          */
    86         int phone = usb_drv_hc_connect(dev, 0);
    87         if (phone < 0) {
    88                 /*
    89                  * Connecting to HC failed, roll-back and announce
    90                  * failure.
    91                  */
    92                 return phone;
    93         }
    94 
    95         dev->parent_phone = phone;
    96 
    97         /*
    98          * Just for fun ;-).
    99          */
    100         poll_keyboard(dev);
     161         *
     162         * Not supported yet, skip..
     163         */
     164//      int phone = usb_drv_hc_connect(dev, 0);
     165//      if (phone < 0) {
     166//              /*
     167//               * Connecting to HC failed, roll-back and announce
     168//               * failure.
     169//               */
     170//              return phone;
     171//      }
     172
     173//      dev->parent_phone = phone;
     174
     175        /*
     176         * Create new fibril for handling this keyboard
     177         */
     178        fid_t fid = fibril_create(usbkbd_fibril_device, dev);
     179        if (fid == 0) {
     180                printf("%s: failed to start fibril for HID device\n", NAME);
     181                return ENOMEM;
     182        }
     183        fibril_add_ready(fid);
    101184
    102185        /*
     
    107190
    108191static driver_ops_t kbd_driver_ops = {
    109         .add_device = add_kbd_device,
     192        .add_device = usbkbd_add_device,
    110193};
    111194
    112195static driver_t kbd_driver = {
    113         .name = "usbkbd",
     196        .name = NAME,
    114197        .driver_ops = &kbd_driver_ops
    115198};
Note: See TracChangeset for help on using the changeset viewer.