Changes in / [51b46f2:0e3505a] in mainline


Ignore:
Location:
uspace
Files:
2 added
2 deleted
35 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/pciintel/pci.c

    r51b46f2 r0e3505a  
    320320        /* Get the value of the BAR. */
    321321        val = pci_conf_read_32(fun, addr);
    322 
    323 #define IO_MASK  (~0x3)
    324 #define MEM_MASK (~0xf)
    325322       
    326323        io = (bool) (val & 1);
    327324        if (io) {
    328325                addrw64 = false;
    329                 mask = IO_MASK;
    330326        } else {
    331                 mask = MEM_MASK;
    332327                switch ((val >> 1) & 3) {
    333328                case 0:
     
    345340        /* Get the address mask. */
    346341        pci_conf_write_32(fun, addr, 0xffffffff);
    347         mask &= pci_conf_read_32(fun, addr);
     342        mask = pci_conf_read_32(fun, addr);
    348343       
    349344        /* Restore the original value. */
     
    664659size_t pci_bar_mask_to_size(uint32_t mask)
    665660{
    666         size_t size = mask & ~(mask - 1);
    667         return size;
     661        return ((mask & 0xfffffff0) ^ 0xffffffff) + 1;
    668662}
    669663
  • uspace/drv/uhci-hcd/Makefile

    r51b46f2 r0e3505a  
    3939        uhci.c \
    4040        uhci_struct/transfer_descriptor.c \
    41         utils/device_keeper.c \
    4241        pci.c \
    4342        batch.c
  • uspace/drv/uhci-hcd/batch.c

    r51b46f2 r0e3505a  
    3333 */
    3434#include <errno.h>
    35 #include <str_error.h>
    3635
    3736#include <usb/debug.h>
     
    5453batch_t * batch_get(ddf_fun_t *fun, usb_target_t target,
    5554    usb_transfer_type_t transfer_type, size_t max_packet_size,
    56     usb_speed_t speed, char *buffer, size_t size,
     55    dev_speed_t speed, char *buffer, size_t size,
    5756    char* setup_buffer, size_t setup_size,
    5857    usbhc_iface_transfer_in_callback_t func_in,
     
    134133
    135134        queue_head_element_td(instance->qh, addr_to_phys(instance->tds));
    136         usb_log_debug("Batch(%p) %d:%d memory structures ready.\n",
    137             instance, target.address, target.endpoint);
    138135        return instance;
    139136}
     
    142139{
    143140        assert(instance);
    144         usb_log_debug2("Batch(%p) checking %d packet(s) for completion.\n",
     141        usb_log_debug("Checking(%p) %d packet for completion.\n",
    145142            instance, instance->packets);
    146143        instance->transfered_size = 0;
     
    154151                        if (i > 0)
    155152                                instance->transfered_size -= instance->setup_size;
    156                         usb_log_debug("Batch(%p) found error TD(%d):%x.\n",
    157                           instance, i, instance->tds[i].status);
    158153                        return true;
    159154                }
     
    161156                    transfer_descriptor_actual_size(&instance->tds[i]);
    162157        }
     158        /* This is just an ugly trick to support the old API */
    163159        instance->transfered_size -= instance->setup_size;
    164160        return true;
     
    172168        memcpy(instance->transport_buffer, instance->buffer, instance->buffer_size);
    173169
    174         const bool low_speed = instance->speed == USB_SPEED_LOW;
    175170        int toggle = 0;
    176171        /* setup stage */
    177172        transfer_descriptor_init(instance->tds, DEFAULT_ERROR_COUNT,
    178             instance->setup_size, toggle, false, low_speed,
    179             instance->target, USB_PID_SETUP, instance->setup_buffer,
    180             &instance->tds[1]);
     173            instance->setup_size, toggle, false, instance->target,
     174            USB_PID_SETUP, instance->setup_buffer, &instance->tds[1]);
    181175
    182176        /* data stage */
     
    188182
    189183                transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT,
    190                     instance->max_packet_size, toggle++, false, low_speed,
    191                     instance->target, USB_PID_OUT, data, &instance->tds[i + 1]);
     184                    instance->max_packet_size, toggle++, false, instance->target,
     185                    USB_PID_OUT, data, &instance->tds[i + 1]);
    192186        }
    193187
     
    195189        i = instance->packets - 1;
    196190        transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT,
    197             0, 1, false, low_speed, instance->target, USB_PID_IN, NULL, NULL);
     191            0, 1, false, instance->target, USB_PID_IN, NULL, NULL);
    198192
    199193        instance->tds[i].status |= TD_STATUS_COMPLETE_INTERRUPT_FLAG;
    200         usb_log_debug2("Control write last TD status: %x.\n",
    201                 instance->tds[i].status);
    202194
    203195        instance->next_step = batch_call_out_and_dispose;
    204         usb_log_debug("Batch(%p) CONTROL WRITE initialized.\n", instance);
    205196        batch_schedule(instance);
    206197}
     
    210201        assert(instance);
    211202
    212         const bool low_speed = instance->speed == USB_SPEED_LOW;
    213203        int toggle = 0;
    214204        /* setup stage */
    215205        transfer_descriptor_init(instance->tds, DEFAULT_ERROR_COUNT,
    216             instance->setup_size, toggle, false, low_speed, instance->target,
     206            instance->setup_size, toggle, false, instance->target,
    217207            USB_PID_SETUP, instance->setup_buffer, &instance->tds[1]);
    218208
     
    225215
    226216                transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT,
    227                     instance->max_packet_size, toggle, false, low_speed,
    228                                 instance->target, USB_PID_IN, data, &instance->tds[i + 1]);
     217                    instance->max_packet_size, toggle, false, instance->target,
     218                    USB_PID_IN, data, &instance->tds[i + 1]);
    229219        }
    230220
     
    232222        i = instance->packets - 1;
    233223        transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT,
    234             0, 1, false, low_speed, instance->target, USB_PID_OUT, NULL, NULL);
     224            0, 1, false, instance->target, USB_PID_OUT, NULL, NULL);
    235225
    236226        instance->tds[i].status |= TD_STATUS_COMPLETE_INTERRUPT_FLAG;
    237         usb_log_debug2("Control read last TD status: %x.\n",
    238                 instance->tds[i].status);
    239227
    240228        instance->next_step = batch_call_in_and_dispose;
    241         usb_log_debug("Batch(%p) CONTROL READ initialized.\n", instance);
    242229        batch_schedule(instance);
    243230}
     
    247234        assert(instance);
    248235
    249         const bool low_speed = instance->speed == USB_SPEED_LOW;
    250236        int toggle = 1;
    251237        size_t i = 0;
     
    258244
    259245                transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT,
    260                     instance->max_packet_size, toggle, false, low_speed,
    261                     instance->target, USB_PID_IN, data, next);
     246                    instance->max_packet_size, toggle, false, instance->target,
     247                    USB_PID_IN, data, next);
    262248        }
    263249
     
    265251
    266252        instance->next_step = batch_call_in_and_dispose;
    267         usb_log_debug("Batch(%p) INTERRUPT IN initialized.\n", instance);
    268253        batch_schedule(instance);
    269254}
     
    275260        memcpy(instance->transport_buffer, instance->buffer, instance->buffer_size);
    276261
    277         const bool low_speed = instance->speed == USB_SPEED_LOW;
    278262        int toggle = 1;
    279263        size_t i = 0;
     
    286270
    287271                transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT,
    288                     instance->max_packet_size, toggle++, false, low_speed,
    289                     instance->target, USB_PID_OUT, data, next);
     272                    instance->max_packet_size, toggle++, false, instance->target,
     273                    USB_PID_OUT, data, next);
    290274        }
    291275
     
    293277
    294278        instance->next_step = batch_call_out_and_dispose;
    295         usb_log_debug("Batch(%p) INTERRUPT OUT initialized.\n", instance);
    296279        batch_schedule(instance);
    297280}
     
    305288
    306289        int err = instance->error;
    307         usb_log_debug("Batch(%p) callback IN(type:%d): %s(%d), %zu.\n",
    308             instance, instance->transfer_type, str_error(err), err,
    309             instance->transfered_size);
     290        usb_log_info("Callback IN(%d): %d, %zu.\n", instance->transfer_type,
     291            err, instance->transfered_size);
    310292
    311293        instance->callback_in(instance->fun,
     
    320302
    321303        int err = instance->error;
    322         usb_log_debug("Batch(%p) callback OUT(type:%d): %s(%d).\n",
    323             instance, instance->transfer_type, str_error(err), err);
     304        usb_log_info("Callback OUT(%d): %d.\n", instance->transfer_type, err);
    324305        instance->callback_out(instance->fun,
    325306            err, instance->arg);
     
    330311        assert(instance);
    331312        batch_call_in(instance);
    332         usb_log_debug("Batch(%p) disposing.\n", instance);
     313        usb_log_debug("Disposing batch: %p.\n", instance);
    333314        free32(instance->tds);
    334315        free32(instance->qh);
     
    342323        assert(instance);
    343324        batch_call_out(instance);
    344         usb_log_debug("Batch(%p) disposing.\n", instance);
     325        usb_log_debug("Disposing batch: %p.\n", instance);
    345326        free32(instance->tds);
    346327        free32(instance->qh);
     
    357338        return uhci_schedule(hc, instance);
    358339}
     340/*----------------------------------------------------------------------------*/
     341/* DEPRECATED FUNCTIONS NEEDED BY THE OLD API */
     342void batch_control_setup_old(batch_t *instance)
     343{
     344        assert(instance);
     345        instance->packets = 1;
     346
     347        /* setup stage */
     348        transfer_descriptor_init(instance->tds, DEFAULT_ERROR_COUNT,
     349            instance->setup_size, 0, false, instance->target,
     350            USB_PID_SETUP, instance->setup_buffer, NULL);
     351
     352        instance->next_step = batch_call_out_and_dispose;
     353        batch_schedule(instance);
     354}
     355/*----------------------------------------------------------------------------*/
     356void batch_control_write_data_old(batch_t *instance)
     357{
     358        assert(instance);
     359        instance->packets -= 2;
     360        batch_interrupt_out(instance);
     361}
     362/*----------------------------------------------------------------------------*/
     363void batch_control_read_data_old(batch_t *instance)
     364{
     365        assert(instance);
     366        instance->packets -= 2;
     367        batch_interrupt_in(instance);
     368}
     369/*----------------------------------------------------------------------------*/
     370void batch_control_write_status_old(batch_t *instance)
     371{
     372        assert(instance);
     373        instance->packets = 1;
     374        transfer_descriptor_init(instance->tds, DEFAULT_ERROR_COUNT,
     375            0, 1, false, instance->target, USB_PID_IN, NULL, NULL);
     376        instance->next_step = batch_call_in_and_dispose;
     377        batch_schedule(instance);
     378}
     379/*----------------------------------------------------------------------------*/
     380void batch_control_read_status_old(batch_t *instance)
     381{
     382        assert(instance);
     383        instance->packets = 1;
     384        transfer_descriptor_init(instance->tds, DEFAULT_ERROR_COUNT,
     385            0, 1, false, instance->target, USB_PID_OUT, NULL, NULL);
     386        instance->next_step = batch_call_out_and_dispose;
     387        batch_schedule(instance);
     388}
    359389/**
    360390 * @}
  • uspace/drv/uhci-hcd/batch.h

    r51b46f2 r0e3505a  
    4343#include "uhci_struct/queue_head.h"
    4444
     45typedef enum {
     46        LOW_SPEED,
     47        FULL_SPEED,
     48} dev_speed_t;
     49
    4550typedef struct batch
    4651{
    4752        link_t link;
    48         usb_speed_t speed;
     53        dev_speed_t speed;
    4954        usb_target_t target;
    5055        usb_transfer_type_t transfer_type;
     
    7176batch_t * batch_get(ddf_fun_t *fun, usb_target_t target,
    7277    usb_transfer_type_t transfer_type, size_t max_packet_size,
    73     usb_speed_t speed, char *buffer, size_t size,
     78    dev_speed_t speed, char *buffer, size_t size,
    7479                char *setup_buffer, size_t setup_size,
    7580    usbhc_iface_transfer_in_callback_t func_in,
  • uspace/drv/uhci-hcd/iface.c

    r51b46f2 r0e3505a  
    4141#include "iface.h"
    4242#include "uhci.h"
    43 #include "utils/device_keeper.h"
    4443
    4544/*----------------------------------------------------------------------------*/
     
    4948        uhci_t *hc = fun_to_uhci(fun);
    5049        assert(hc);
    51         usb_log_debug("Default address request with speed %d.\n", speed);
    52         device_keeper_reserve_default(&hc->device_manager, speed);
     50        usb_address_keeping_reserve_default(&hc->address_manager);
    5351        return EOK;
    5452}
     
    5957        uhci_t *hc = fun_to_uhci(fun);
    6058        assert(hc);
    61         usb_log_debug("Default address release.\n");
    62         device_keeper_release_default(&hc->device_manager);
     59        usb_address_keeping_release_default(&hc->address_manager);
    6360        return EOK;
    6461}
     
    7067        uhci_t *hc = fun_to_uhci(fun);
    7168        assert(hc);
    72         assert(address);
    73 
    74         usb_log_debug("Address request with speed %d.\n", speed);
    75         *address = device_keeper_request(&hc->device_manager, speed);
    76         usb_log_debug("Address request with result: %d.\n", *address);
     69        *address = usb_address_keeping_request(&hc->address_manager);
    7770        if (*address <= 0)
    7871          return *address;
     
    8679        uhci_t *hc = fun_to_uhci(fun);
    8780        assert(hc);
    88         usb_log_debug("Address bind %d-%d.\n", address, handle);
    89         device_keeper_bind(&hc->device_manager, address, handle);
     81        usb_address_keeping_devman_bind(&hc->address_manager, address, handle);
    9082        return EOK;
    9183}
     
    9688        uhci_t *hc = fun_to_uhci(fun);
    9789        assert(hc);
    98         usb_log_debug("Address release %d.\n", address);
    99         device_keeper_release(&hc->device_manager, address);
     90        usb_address_keeping_release_default(&hc->address_manager);
    10091        return EOK;
    10192}
    10293/*----------------------------------------------------------------------------*/
    10394static int interrupt_out(ddf_fun_t *fun, usb_target_t target,
    104     size_t max_packet_size, void *data, size_t size,
     95    size_t max_packet_size,
     96    void *data, size_t size,
    10597    usbhc_iface_transfer_out_callback_t callback, void *arg)
    10698{
    107         assert(fun);
    108         uhci_t *hc = fun_to_uhci(fun);
    109         assert(hc);
    110         usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address);
    111 
    112         usb_log_debug("Interrupt OUT %d:%d %zu(%zu).\n",
    113             target.address, target.endpoint, size, max_packet_size);
     99        dev_speed_t speed = FULL_SPEED;
    114100
    115101        batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT,
     
    122108/*----------------------------------------------------------------------------*/
    123109static int interrupt_in(ddf_fun_t *fun, usb_target_t target,
    124     size_t max_packet_size, void *data, size_t size,
     110    size_t max_packet_size,
     111    void *data, size_t size,
    125112    usbhc_iface_transfer_in_callback_t callback, void *arg)
    126113{
    127         assert(fun);
    128         uhci_t *hc = fun_to_uhci(fun);
    129         assert(hc);
    130         usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address);
    131         usb_log_debug("Interrupt IN %d:%d %zu(%zu).\n",
    132             target.address, target.endpoint, size, max_packet_size);
     114        dev_speed_t speed = FULL_SPEED;
    133115
    134116        batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT,
     
    145127    usbhc_iface_transfer_out_callback_t callback, void *arg)
    146128{
    147         assert(fun);
    148         uhci_t *hc = fun_to_uhci(fun);
    149         assert(hc);
    150         usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address);
    151         usb_log_debug("Control WRITE %d:%d %zu(%zu).\n",
    152             target.address, target.endpoint, size, max_packet_size);
     129        dev_speed_t speed = FULL_SPEED;
    153130
    154131        batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL,
     
    166143    usbhc_iface_transfer_in_callback_t callback, void *arg)
    167144{
    168         assert(fun);
    169         uhci_t *hc = fun_to_uhci(fun);
    170         assert(hc);
    171         usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address);
     145        dev_speed_t speed = FULL_SPEED;
    172146
    173         usb_log_debug("Control READ %d:%d %zu(%zu).\n",
    174             target.address, target.endpoint, size, max_packet_size);
    175147        batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL,
    176148            max_packet_size, speed, data, size, setup_data, setup_size, callback,
  • uspace/drv/uhci-hcd/main.c

    r51b46f2 r0e3505a  
    8282        usb_log_info("uhci_add_device() called\n");
    8383
    84         uintptr_t io_reg_base = 0;
    85         size_t io_reg_size = 0;
    86         int irq = 0;
     84
     85        uintptr_t io_reg_base;
     86        size_t io_reg_size;
     87        int irq;
    8788
    8889        int ret =
     
    9495            io_reg_base, io_reg_size, irq);
    9596
    96 //      ret = pci_enable_interrupts(device);
    97 //      CHECK_RET_RETURN(ret, "Failed(%d) to get enable interrupts:\n", ret);
     97        ret = pci_enable_interrupts(device);
     98        CHECK_RET_RETURN(ret, "Failed(%d) to get enable interrupts:\n", ret);
    9899
    99100        uhci_t *uhci_hc = malloc(sizeof(uhci_t));
     
    113114         */
    114115        device->driver_data = uhci_hc;
     116
    115117        ret = register_interrupt_handler(device, irq, irq_handler,
    116118            &uhci_hc->interrupt_code);
     
    147149{
    148150        sleep(3);
    149         usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME);
     151        usb_log_enable(USB_LOG_LEVEL_INFO, NAME);
    150152
    151153        return ddf_driver_main(&uhci_driver);
  • uspace/drv/uhci-hcd/pci.c

    r51b46f2 r0e3505a  
    3838#include <devman.h>
    3939#include <device/hw_res.h>
    40 
    41 #include <usb/debug.h>
    4240
    4341#include "pci.h"
     
    8583                                irq = res->res.interrupt.irq;
    8684                                irq_found = true;
    87                                 usb_log_debug2("Found interrupt: %d.\n", irq);
    8885                                break;
    8986                        case IO_RANGE:
    90                                 io_address = res->res.io_range.address;
     87                                io_address = (uintptr_t)
     88                                    res->res.io_range.address;
    9189                                io_size = res->res.io_range.size;
    92                                 usb_log_debug2("Found io: %llx %zu.\n",
    93                                     res->res.io_range.address, res->res.io_range.size);
    9490                                io_found = true;
    9591                                break;
     
    109105        }
    110106
    111         *io_reg_address = io_address;
    112         *io_reg_size = io_size;
    113         *irq_no = irq;
     107        if (io_reg_address != NULL) {
     108                *io_reg_address = io_address;
     109        }
     110        if (io_reg_size != NULL) {
     111                *io_reg_size = io_size;
     112        }
     113        if (irq_no != NULL) {
     114                *irq_no = irq;
     115        }
    114116
    115117        rc = EOK;
     
    125127            IPC_FLAG_BLOCKING);
    126128        bool enabled = hw_res_enable_interrupt(parent_phone);
    127         async_hangup(parent_phone);
    128129        return enabled ? EOK : EIO;
    129130}
  • uspace/drv/uhci-hcd/root_hub.c

    r51b46f2 r0e3505a  
    3434#include <assert.h>
    3535#include <errno.h>
    36 #include <str_error.h>
    3736#include <stdio.h>
    38 #include <ops/hw_res.h>
    39 
    4037#include <usb_iface.h>
    4138#include <usb/debug.h>
     
    4441#include "uhci.h"
    4542
    46 /*----------------------------------------------------------------------------*/
    4743static int usb_iface_get_hc_handle_rh_impl(ddf_fun_t *root_hub_fun,
    4844    devman_handle_t *handle)
     
    5551        return EOK;
    5652}
    57 /*----------------------------------------------------------------------------*/
     53
    5854static int usb_iface_get_address_rh_impl(ddf_fun_t *fun, devman_handle_t handle,
    5955    usb_address_t *address)
     
    6561        assert(hc);
    6662
    67         usb_address_t addr = device_keeper_find(&hc->device_manager,
     63        usb_address_t addr = usb_address_keeping_find(&hc->address_manager,
    6864            handle);
    6965        if (addr < 0) {
     
    7773        return EOK;
    7874}
    79 /*----------------------------------------------------------------------------*/
     75
    8076usb_iface_t usb_iface_root_hub_fun_impl = {
    8177        .get_hc_handle = usb_iface_get_hc_handle_rh_impl,
    8278        .get_address = usb_iface_get_address_rh_impl
    8379};
    84 /*----------------------------------------------------------------------------*/
    85 static hw_resource_list_t *get_resource_list(ddf_fun_t *dev)
    86 {
    87         assert(dev);
    88         ddf_fun_t *hc_ddf_instance = dev->driver_data;
    89         assert(hc_ddf_instance);
    90         uhci_t *hc = hc_ddf_instance->driver_data;
    91         assert(hc);
    9280
    93         //TODO: fix memory leak
    94         hw_resource_list_t *resource_list = malloc(sizeof(hw_resource_list_t));
    95         assert(resource_list);
    96         resource_list->count = 1;
    97         resource_list->resources = malloc(sizeof(hw_resource_t));
    98         assert(resource_list->resources);
    99         resource_list->resources[0].type = IO_RANGE;
    100         resource_list->resources[0].res.io_range.address =
    101             ((uintptr_t)hc->registers) + 0x10; // see UHCI design guide
    102         resource_list->resources[0].res.io_range.size = 4;
    103         resource_list->resources[0].res.io_range.endianness = LITTLE_ENDIAN;
     81static ddf_dev_ops_t root_hub_ops = {
     82        .interfaces[USB_DEV_IFACE] = &usb_iface_root_hub_fun_impl
     83};
    10484
    105         return resource_list;
    106 }
    107 /*----------------------------------------------------------------------------*/
    108 static hw_res_ops_t hw_res_iface = {
    109         .get_resource_list = get_resource_list,
    110         .enable_interrupt = NULL
    111 };
    112 /*----------------------------------------------------------------------------*/
    113 static ddf_dev_ops_t root_hub_ops = {
    114         .interfaces[USB_DEV_IFACE] = &usb_iface_root_hub_fun_impl,
    115         .interfaces[HW_RES_DEV_IFACE] = &hw_res_iface
    116 };
    11785/*----------------------------------------------------------------------------*/
    11886int setup_root_hub(ddf_fun_t **fun, ddf_dev_t *hc)
    11987{
    12088        assert(fun);
    121         assert(hc);
    12289        int ret;
    12390
     
    138105        ret = ddf_fun_add_match_id(hub, match_str, 100);
    139106        if (ret != EOK) {
    140                 usb_log_error("Failed(%d) to add root hub match id: %s\n",
    141                     ret, str_error(ret));
     107                usb_log_error("Failed to add root hub match id.\n");
    142108                ddf_fun_destroy(hub);
    143                 return ret;
     109                return ENOMEM;
    144110        }
    145111
  • uspace/drv/uhci-hcd/transfer_list.c

    r51b46f2 r0e3505a  
    7070        assert(instance);
    7171        assert(batch);
    72         usb_log_debug2("Adding batch(%p) to queue %s.\n", batch, instance->name);
    7372
    7473        uint32_t pa = (uintptr_t)addr_to_phys(batch->qh);
     
    8483                list_append(&batch->link, &instance->batch_list);
    8584                instance->queue_head->element = pa;
    86                 usb_log_debug("Batch(%p) added to queue %s first.\n",
     85                usb_log_debug2("Added batch(%p) to queue %s first.\n",
    8786                        batch, instance->name);
    8887                fibril_mutex_unlock(&instance->guard);
     
    9796        queue_head_append_qh(last->qh, pa);
    9897        list_append(&batch->link, &instance->batch_list);
    99         usb_log_debug("Batch(%p) added to queue %s last, first is %p.\n",
     98        usb_log_debug2("Added batch(%p) to queue %s last, first is %p.\n",
    10099                batch, instance->name, first );
    101100        fibril_mutex_unlock(&instance->guard);
     
    109108        assert(instance->queue_head);
    110109        assert(batch->qh);
    111         usb_log_debug2("Removing batch(%p) from queue %s.\n", batch, instance->name);
    112110
    113111        /* I'm the first one here */
    114112        if (batch->link.prev == &instance->batch_list) {
    115                 usb_log_debug("Batch(%p) removed (FIRST) from queue %s, next element %x.\n",
    116                         batch, instance->name, batch->qh->next_queue);
     113                usb_log_debug("Removing batch %p was first, next element %x.\n",
     114                        batch, batch->qh->next_queue);
    117115                instance->queue_head->element = batch->qh->next_queue;
    118116        } else {
    119                 usb_log_debug("Batch(%p) removed (NOT FIRST) from queue, next element %x.\n",
    120                         batch, instance->name, batch->qh->next_queue);
     117                usb_log_debug("Removing batch %p was NOT first, next element %x.\n",
     118                        batch, batch->qh->next_queue);
    121119                batch_t *prev = list_get_instance(batch->link.prev, batch_t, link);
    122120                prev->qh->next_queue = batch->qh->next_queue;
     
    125123}
    126124/*----------------------------------------------------------------------------*/
    127 void transfer_list_remove_finished(transfer_list_t *instance)
     125void transfer_list_check(transfer_list_t *instance)
    128126{
    129127        assert(instance);
    130 
    131         LIST_INITIALIZE(done);
    132 
    133128        fibril_mutex_lock(&instance->guard);
    134129        link_t *current = instance->batch_list.next;
     
    139134                if (batch_is_complete(batch)) {
    140135                        transfer_list_remove_batch(instance, batch);
    141                         list_append(current, &done);
     136                        batch->next_step(batch);
    142137                }
    143138                current = next;
    144139        }
    145140        fibril_mutex_unlock(&instance->guard);
    146 
    147         while (!list_empty(&done)) {
    148                 link_t *item = done.next;
    149                 list_remove(item);
    150                 batch_t *batch = list_get_instance(item, batch_t, link);
    151                 batch->next_step(batch);
    152         }
    153141}
    154142/**
  • uspace/drv/uhci-hcd/transfer_list.h

    r51b46f2 r0e3505a  
    6060        queue_head_dispose(instance->queue_head);
    6161}
    62 void transfer_list_remove_finished(transfer_list_t *instance);
     62void transfer_list_check(transfer_list_t *instance);
    6363
    6464void transfer_list_add_batch(transfer_list_t *instance, batch_t *batch);
  • uspace/drv/uhci-hcd/uhci-hcd.ma

    r51b46f2 r0e3505a  
    1110 pci/ven=8086&dev=7020
    2210 pci/ven=8086&dev=7112
    3 
    4 10 pci/ven=8086&dev=27c8
    5 10 pci/ven=8086&dev=27c9
    6 10 pci/ven=8086&dev=27ca
    7 10 pci/ven=8086&dev=27cb
    8 
    9 
    10 10 pci/ven=8086&dev=2830
    11 10 pci/ven=8086&dev=2831
    12 10 pci/ven=8086&dev=2832
    13 10 pci/ven=8086&dev=2834
    14 10 pci/ven=8086&dev=2835
    15 
    16 10 pci/ven=8086&dev=2934
    17 10 pci/ven=8086&dev=2935
    18 10 pci/ven=8086&dev=2936
    19 10 pci/ven=8086&dev=2937
    20 10 pci/ven=8086&dev=2938
    21 10 pci/ven=8086&dev=2939
  • uspace/drv/uhci-hcd/uhci.c

    r51b46f2 r0e3505a  
    4848        {
    4949                .cmd = CMD_PIO_READ_16,
    50                 .addr = NULL, /* patched for every instance */
     50                .addr = (void*)0xc022,
    5151                .dstarg = 1
    5252        },
    5353        {
    5454                .cmd = CMD_PIO_WRITE_16,
    55                 .addr = NULL, /* pathed for every instance */
     55                .addr = (void*)0xc022,
    5656                .value = 0x1f
    5757        },
     
    6868        assert(hc);
    6969
    70         usb_address_t addr = device_keeper_find(&hc->device_manager,
     70        usb_address_t addr = usb_address_keeping_find(&hc->address_manager,
    7171            handle);
    7272        if (addr < 0) {
     
    8080        return EOK;
    8181}
    82 /*----------------------------------------------------------------------------*/
     82
     83
    8384static usb_iface_t hc_usb_iface = {
    8485        .get_hc_handle = usb_iface_get_hc_handle_hc_impl,
     
    8889static ddf_dev_ops_t uhci_ops = {
    8990        .interfaces[USB_DEV_IFACE] = &hc_usb_iface,
    90         .interfaces[USBHC_DEV_IFACE] = &uhci_iface,
     91        .interfaces[USBHC_DEV_IFACE] = &uhci_iface
    9192};
    9293
     
    101102        bool low_speed, usb_transfer_type_t, size_t size);
    102103
     104#define CHECK_RET_RETURN(ret, message...) \
     105        if (ret != EOK) { \
     106                usb_log_error(message); \
     107                return ret; \
     108        } else (void) 0
    103109
    104110int uhci_init(uhci_t *instance, ddf_dev_t *dev, void *regs, size_t reg_size)
     
    106112        assert(reg_size >= sizeof(regs_t));
    107113        int ret;
    108 
    109 #define CHECK_RET_DEST_FUN_RETURN(ret, message...) \
    110         if (ret != EOK) { \
    111                 usb_log_error(message); \
    112                 if (instance->ddf_instance) \
    113                         ddf_fun_destroy(instance->ddf_instance); \
    114                 return ret; \
    115         } else (void) 0
    116114
    117115        /*
     
    119117         */
    120118        instance->ddf_instance = ddf_fun_create(dev, fun_exposed, "uhci");
    121         ret = (instance->ddf_instance == NULL) ? ENOMEM : EOK;
    122         CHECK_RET_DEST_FUN_RETURN(ret, "Failed to create UHCI device function.\n");
    123 
     119        if (instance->ddf_instance == NULL) {
     120                usb_log_error("Failed to create UHCI device function.\n");
     121                return ENOMEM;
     122        }
    124123        instance->ddf_instance->ops = &uhci_ops;
    125124        instance->ddf_instance->driver_data = instance;
    126125
    127126        ret = ddf_fun_bind(instance->ddf_instance);
    128         CHECK_RET_DEST_FUN_RETURN(ret, "Failed(%d) to bind UHCI device function: %s.\n",
    129             ret, str_error(ret));
     127        CHECK_RET_RETURN(ret, "Failed to bind UHCI device function: %s.\n",
     128            str_error(ret));
    130129
    131130        /* allow access to hc control registers */
    132131        regs_t *io;
    133132        ret = pio_enable(regs, reg_size, (void**)&io);
    134         CHECK_RET_DEST_FUN_RETURN(ret, "Failed(%d) to gain access to registers at %p: %s.\n",
    135             ret, str_error(ret), io);
     133        CHECK_RET_RETURN(ret, "Failed to gain access to registers at %p.\n", io);
    136134        instance->registers = io;
    137         usb_log_debug("Device registers at %p(%u) accessible.\n", io, reg_size);
     135        usb_log_debug("Device registers accessible.\n");
    138136
    139137        ret = uhci_init_mem_structures(instance);
    140         CHECK_RET_DEST_FUN_RETURN(ret, "Failed to initialize UHCI memory structures.\n");
     138        CHECK_RET_RETURN(ret, "Failed to initialize memory structures.\n");
    141139
    142140        uhci_init_hw(instance);
    143141
    144142        instance->cleaner = fibril_create(uhci_interrupt_emulator, instance);
    145         fibril_add_ready(instance->cleaner);
     143//      fibril_add_ready(instance->cleaner);
    146144
    147145        instance->debug_checker = fibril_create(uhci_debug_checker, instance);
    148146        fibril_add_ready(instance->debug_checker);
    149147
    150         usb_log_info("Started UHCI driver.\n");
    151         return EOK;
    152 #undef CHECK_RET_DEST_FUN_RETURN
     148        return EOK;
    153149}
    154150/*----------------------------------------------------------------------------*/
    155151void uhci_init_hw(uhci_t *instance)
    156152{
    157         /* reset everything, who knows what touched it before us */
    158         pio_write_16(&instance->registers->usbcmd, UHCI_CMD_GLOBAL_RESET);
    159         async_usleep(10000); /* 10ms according to USB spec */
    160         pio_write_16(&instance->registers->usbcmd, 0);
    161 
    162         /* reset hc, all states and counters */
    163         pio_write_16(&instance->registers->usbcmd, UHCI_CMD_HCRESET);
    164         while ((pio_read_16(&instance->registers->usbcmd) & UHCI_CMD_HCRESET) != 0)
    165                 { async_usleep(10); }
    166153
    167154        /* set framelist pointer */
     
    176163        pio_write_16(&instance->registers->usbcmd,
    177164            UHCI_CMD_RUN_STOP | UHCI_CMD_MAX_PACKET | UHCI_CMD_CONFIGURE);
     165        usb_log_debug("Started UHCI HC.\n");
    178166}
    179167/*----------------------------------------------------------------------------*/
     
    181169{
    182170        assert(instance);
    183 #define CHECK_RET_DEST_CMDS_RETURN(ret, message...) \
    184         if (ret != EOK) { \
    185                 usb_log_error(message); \
    186                 if (instance->interrupt_code.cmds != NULL) \
    187                         free(instance->interrupt_code.cmds); \
    188                 return ret; \
    189         } else (void) 0
    190171
    191172        /* init interrupt code */
    192         instance->interrupt_code.cmds = malloc(sizeof(uhci_cmds));
    193         int ret = (instance->interrupt_code.cmds == NULL) ? ENOMEM : EOK;
    194         CHECK_RET_DEST_CMDS_RETURN(ret, "Failed to allocate interrupt cmds space.\n");
    195 
    196         {
    197                 irq_cmd_t *interrupt_commands = instance->interrupt_code.cmds;
    198                 memcpy(interrupt_commands, uhci_cmds, sizeof(uhci_cmds));
    199                 interrupt_commands[0].addr = (void*)&instance->registers->usbsts;
    200                 interrupt_commands[1].addr = (void*)&instance->registers->usbsts;
    201                 instance->interrupt_code.cmdcount =
    202                                 sizeof(uhci_cmds) / sizeof(irq_cmd_t);
    203         }
     173        irq_cmd_t *interrupt_commands = malloc(sizeof(uhci_cmds));
     174        if (interrupt_commands == NULL) {
     175                return ENOMEM;
     176        }
     177        memcpy(interrupt_commands, uhci_cmds, sizeof(uhci_cmds));
     178        interrupt_commands[0].addr = (void*)&instance->registers->usbsts;
     179        interrupt_commands[1].addr = (void*)&instance->registers->usbsts;
     180        instance->interrupt_code.cmds = interrupt_commands;
     181        instance->interrupt_code.cmdcount =
     182            sizeof(uhci_cmds) / sizeof(irq_cmd_t);
    204183
    205184        /* init transfer lists */
    206         ret = uhci_init_transfer_lists(instance);
    207         CHECK_RET_DEST_CMDS_RETURN(ret, "Failed to initialize transfer lists.\n");
     185        int ret = uhci_init_transfer_lists(instance);
     186        CHECK_RET_RETURN(ret, "Failed to initialize transfer lists.\n");
    208187        usb_log_debug("Initialized transfer lists.\n");
    209188
     
    211190        instance->frame_list = get_page();
    212191        ret = instance ? EOK : ENOMEM;
    213         CHECK_RET_DEST_CMDS_RETURN(ret, "Failed to get frame list page.\n");
     192        CHECK_RET_RETURN(ret, "Failed to get frame list page.\n");
    214193        usb_log_debug("Initialized frame list.\n");
    215194
     
    218197          instance->transfers_interrupt.queue_head_pa
    219198          | LINK_POINTER_QUEUE_HEAD_FLAG;
    220 
    221199        unsigned i = 0;
    222200        for(; i < UHCI_FRAME_LIST_COUNT; ++i) {
     
    225203
    226204        /* init address keeper(libusb) */
    227         device_keeper_init(&instance->device_manager);
    228         usb_log_debug("Initialized device manager.\n");
    229 
    230         return EOK;
    231 #undef CHECK_RET_DEST_CMDS_RETURN
     205        usb_address_keeping_init(&instance->address_manager, USB11_ADDRESS_MAX);
     206        usb_log_debug("Initialized address manager.\n");
     207
     208        return EOK;
    232209}
    233210/*----------------------------------------------------------------------------*/
     
    235212{
    236213        assert(instance);
    237 #define CHECK_RET_CLEAR_RETURN(ret, message...) \
    238         if (ret != EOK) { \
    239                 usb_log_error(message); \
    240                 transfer_list_fini(&instance->transfers_bulk_full); \
    241                 transfer_list_fini(&instance->transfers_control_full); \
    242                 transfer_list_fini(&instance->transfers_control_slow); \
    243                 transfer_list_fini(&instance->transfers_interrupt); \
    244                 return ret; \
    245         } else (void) 0
    246214
    247215        /* initialize TODO: check errors */
    248216        int ret;
    249217        ret = transfer_list_init(&instance->transfers_bulk_full, "BULK_FULL");
    250         CHECK_RET_CLEAR_RETURN(ret, "Failed to init BULK list.");
     218        assert(ret == EOK);
    251219        ret = transfer_list_init(&instance->transfers_control_full, "CONTROL_FULL");
    252         CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL FULL list.");
     220        assert(ret == EOK);
    253221        ret = transfer_list_init(&instance->transfers_control_slow, "CONTROL_SLOW");
    254         CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL SLOW list.");
     222        assert(ret == EOK);
    255223        ret = transfer_list_init(&instance->transfers_interrupt, "INTERRUPT");
    256         CHECK_RET_CLEAR_RETURN(ret, "Failed to init INTERRUPT list.");
     224        assert(ret == EOK);
    257225
    258226        transfer_list_set_next(&instance->transfers_control_full,
     
    281249
    282250        return EOK;
    283 #undef CHECK_RET_CLEAR_RETURN
    284251}
    285252/*----------------------------------------------------------------------------*/
     
    288255        assert(instance);
    289256        assert(batch);
    290         const int low_speed = (batch->speed == USB_SPEED_LOW);
     257        const int low_speed = (batch->speed == LOW_SPEED);
    291258        if (!allowed_usb_packet(
    292259            low_speed, batch->transfer_type, batch->max_packet_size)) {
     
    309276{
    310277        assert(instance);
    311 //      if ((status & (UHCI_STATUS_INTERRUPT | UHCI_STATUS_ERROR_INTERRUPT)) == 0)
    312 //              return;
    313 //      usb_log_debug2("UHCI interrupt: %X.\n", status);
    314         transfer_list_remove_finished(&instance->transfers_interrupt);
    315         transfer_list_remove_finished(&instance->transfers_control_slow);
    316         transfer_list_remove_finished(&instance->transfers_control_full);
    317         transfer_list_remove_finished(&instance->transfers_bulk_full);
     278        if ((status & (UHCI_STATUS_INTERRUPT | UHCI_STATUS_ERROR_INTERRUPT)) == 0)
     279                return;
     280        usb_log_debug("UHCI interrupt: %X.\n", status);
     281        transfer_list_check(&instance->transfers_interrupt);
     282        transfer_list_check(&instance->transfers_control_slow);
     283        transfer_list_check(&instance->transfers_control_full);
     284        transfer_list_check(&instance->transfers_bulk_full);
    318285}
    319286/*----------------------------------------------------------------------------*/
     
    324291        assert(instance);
    325292
    326         while (1) {
     293        while(1) {
    327294                uint16_t status = pio_read_16(&instance->registers->usbsts);
    328                 if (status != 0)
    329                         usb_log_debug2("UHCI status: %x.\n", status);
    330                 status |= 1;
    331295                uhci_interrupt(instance, status);
    332                 pio_write_16(&instance->registers->usbsts, 0x1f);
    333                 async_usleep(UHCI_CLEANER_TIMEOUT * 5);
     296                async_usleep(UHCI_CLEANER_TIMEOUT);
    334297        }
    335298        return EOK;
     
    344307                const uint16_t sts = pio_read_16(&instance->registers->usbsts);
    345308                const uint16_t intr = pio_read_16(&instance->registers->usbintr);
    346                 if (((cmd & UHCI_CMD_RUN_STOP) != 1) || (sts != 0)) {
    347                         usb_log_debug2("Command: %X Status: %X Intr: %x\n",
    348                             cmd, sts, intr);
    349                 }
    350 
    351                 uintptr_t frame_list =
    352                     pio_read_32(&instance->registers->flbaseadd) & ~0xfff;
     309                usb_log_debug("Command: %X Status: %X Interrupts: %x\n",
     310                    cmd, sts, intr);
     311
     312                uintptr_t frame_list = pio_read_32(&instance->registers->flbaseadd);
    353313                if (frame_list != addr_to_phys(instance->frame_list)) {
    354314                        usb_log_debug("Framelist address: %p vs. %p.\n",
  • uspace/drv/uhci-hcd/uhci.h

    r51b46f2 r0e3505a  
    4141#include <ddi.h>
    4242
     43#include <usb/addrkeep.h>
    4344#include <usbhc_iface.h>
    4445
     46#include "transfer_list.h"
    4547#include "batch.h"
    46 #include "transfer_list.h"
    47 #include "utils/device_keeper.h"
    4848
    4949typedef struct uhci_regs {
     
    8282
    8383typedef struct uhci {
    84         device_keeper_t device_manager;
    85 
     84        usb_address_keeping_t address_manager;
    8685        volatile regs_t *registers;
    8786
  • uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.c

    r51b46f2 r0e3505a  
    3939
    4040void transfer_descriptor_init(transfer_descriptor_t *instance,
    41     int error_count, size_t size, bool toggle, bool isochronous, bool low_speed,
     41    int error_count, size_t size, bool toggle, bool isochronous,
    4242    usb_target_t target, int pid, void *buffer, transfer_descriptor_t *next)
    4343{
     
    5050        instance->status = 0
    5151          | ((error_count & TD_STATUS_ERROR_COUNT_MASK) << TD_STATUS_ERROR_COUNT_POS)
    52                 | (low_speed ? TD_STATUS_LOW_SPEED_FLAG : 0)
    5352          | TD_STATUS_ERROR_ACTIVE;
    5453
     
    6766        }
    6867
    69         usb_log_debug2("Created TD: %X:%X:%X:%X(%p).\n",
     68        usb_log_info("Created TD: %X:%X:%X:%X(%p).\n",
    7069                instance->next, instance->status, instance->device,
    7170          instance->buffer_ptr, buffer);
     71#if 0
     72        if (size) {
     73                unsigned char * buff = buffer;
     74                uhci_print_verbose("TD Buffer dump(%p-%dB): ", buffer, size);
     75                unsigned i = 0;
     76                /* TODO: Verbose? */
     77                for (; i < size; ++i) {
     78                        printf((i & 1) ? "%x " : "%x", buff[i]);
     79                }
     80                printf("\n");
     81        }
     82#endif
    7283}
    7384/*----------------------------------------------------------------------------*/
     
    7788
    7889        if ((instance->status & TD_STATUS_ERROR_STALLED) != 0)
    79                 return ESTALL;
     90                return EIO;
    8091
    8192        if ((instance->status & TD_STATUS_ERROR_CRC) != 0)
    82                 return EBADCHECKSUM;
     93                return EAGAIN;
    8394
    8495        if ((instance->status & TD_STATUS_ERROR_BUFFER) != 0)
  • uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.h

    r51b46f2 r0e3505a  
    9292
    9393void transfer_descriptor_init(transfer_descriptor_t *instance,
    94     int error_count, size_t size, bool toggle, bool isochronous, bool low_speed,
     94    int error_count, size_t size, bool toggle, bool isochronous,
    9595    usb_target_t target, int pid, void *buffer, transfer_descriptor_t * next);
    9696
  • uspace/drv/uhci-rhd/main.c

    r51b46f2 r0e3505a  
    3333 */
    3434#include <ddf/driver.h>
    35 #include <devman.h>
    36 #include <device/hw_res.h>
    3735#include <usb_iface.h>
    3836#include <usb/ddfiface.h>
     
    4543
    4644#define NAME "uhci-rhd"
    47 static int hc_get_my_registers(ddf_dev_t *dev,
    48     uintptr_t *io_reg_address, size_t *io_reg_size);
    4945
    5046static int usb_iface_get_hc_handle(ddf_fun_t *fun, devman_handle_t *handle)
     
    8480        }
    8581
    86         uintptr_t io_regs = 0;
    87         size_t io_size = 0;
    88 
    89         int ret = hc_get_my_registers(device, &io_regs, &io_size);
    90         assert(ret == EOK);
    91 
    92         /* TODO: verify values from hc */
    93         usb_log_info("I/O regs at 0x%X (size %zu).\n", io_regs, io_size);
    94         ret = uhci_root_hub_init(rh, (void*)io_regs, io_size, device);
     82        /* TODO: get register values from hc */
     83        int ret = uhci_root_hub_init(rh, (void*)0xc030, 4, device);
    9584        if (ret != EOK) {
    9685                usb_log_error("Failed(%d) to initialize driver instance.\n", ret);
     
    113102        .driver_ops = &uhci_rh_driver_ops
    114103};
    115 /*----------------------------------------------------------------------------*/
     104
    116105int main(int argc, char *argv[])
    117106{
    118         usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME);
     107        usb_log_enable(USB_LOG_LEVEL_INFO, NAME);
    119108        return ddf_driver_main(&uhci_rh_driver);
    120 }
    121 /*----------------------------------------------------------------------------*/
    122 int hc_get_my_registers(ddf_dev_t *dev,
    123     uintptr_t *io_reg_address, size_t *io_reg_size)
    124 {
    125         assert(dev != NULL);
    126 
    127         int parent_phone = devman_parent_device_connect(dev->handle,
    128             IPC_FLAG_BLOCKING);
    129         if (parent_phone < 0) {
    130                 return parent_phone;
    131         }
    132 
    133         int rc;
    134 
    135         hw_resource_list_t hw_resources;
    136         rc = hw_res_get_resource_list(parent_phone, &hw_resources);
    137         if (rc != EOK) {
    138                 goto leave;
    139         }
    140 
    141         uintptr_t io_address = 0;
    142         size_t io_size = 0;
    143         bool io_found = false;
    144 
    145         size_t i;
    146         for (i = 0; i < hw_resources.count; i++) {
    147                 hw_resource_t *res = &hw_resources.resources[i];
    148                 switch (res->type) {
    149                         case IO_RANGE:
    150                                 io_address = (uintptr_t)
    151                                     res->res.io_range.address;
    152                                 io_size = res->res.io_range.size;
    153                                 io_found = true;
    154                                 break;
    155                         default:
    156                                 break;
    157                 }
    158         }
    159 
    160         if (!io_found) {
    161                 rc = ENOENT;
    162                 goto leave;
    163         }
    164 
    165         if (io_reg_address != NULL) {
    166                 *io_reg_address = io_address;
    167         }
    168         if (io_reg_size != NULL) {
    169                 *io_reg_size = io_size;
    170         }
    171         rc = EOK;
    172 leave:
    173         async_hangup(parent_phone);
    174 
    175         return rc;
    176109}
    177110/**
  • uspace/drv/uhci-rhd/port.c

    r51b46f2 r0e3505a  
    3434#include <errno.h>
    3535#include <str_error.h>
    36 #include <fibril_synch.h>
    3736
    3837#include <usb/usb.h>    /* usb_address_t */
     
    4645#include "port_status.h"
    4746
    48 static int uhci_port_new_device(uhci_port_t *port, uint16_t status);
     47static int uhci_port_new_device(uhci_port_t *port);
    4948static int uhci_port_remove_device(uhci_port_t *port);
    5049static int uhci_port_set_enabled(uhci_port_t *port, bool enabled);
    5150static int uhci_port_check(void *port);
    52 static int new_device_enable_port(int portno, void *arg);
    5351
    5452int uhci_port_init(
    5553  uhci_port_t *port, port_status_t *address, unsigned number,
    56   unsigned usec, ddf_dev_t *rh)
     54  unsigned usec, ddf_dev_t *rh, int parent_phone)
    5755{
    5856        assert(port);
     
    7169        port->checker = fibril_create(uhci_port_check, port);
    7270        if (port->checker == 0) {
    73                 usb_log_error("Port(%p - %d): failed to launch root hub fibril.",
    74                     port->address, port->number);
     71                usb_log_error(": failed to launch root hub fibril.");
    7572                return ENOMEM;
    7673        }
    7774        fibril_add_ready(port->checker);
    78         usb_log_debug("Port(%p - %d): Added fibril. %x\n",
    79             port->address, port->number, port->checker);
     75        usb_log_debug(
     76          "Added fibril for port %d: %p.\n", number, port->checker);
    8077        return EOK;
    8178}
     
    9390        uhci_port_t *port_instance = port;
    9491        assert(port_instance);
    95 //      port_status_write(port_instance->address, 0);
    96 
    97         unsigned count = 0;
    9892
    9993        while (1) {
    100                 async_usleep(port_instance->wait_period_usec);
    101 
    10294                /* read register value */
    10395                port_status_t port_status =
     
    10597
    10698                /* debug print */
    107                 static fibril_mutex_t dbg_mtx = FIBRIL_MUTEX_INITIALIZER(dbg_mtx);
    108                 fibril_mutex_lock(&dbg_mtx);
    109                 usb_log_debug2("Port(%p - %d): Status: %#04x. === %u\n",
    110                   port_instance->address, port_instance->number, port_status, count++);
    111 //              print_port_status(port_status);
    112                 fibril_mutex_unlock(&dbg_mtx);
    113 
    114                 if ((port_status & STATUS_CONNECTED_CHANGED) != 0) {
    115                         usb_log_debug("Port(%p - %d): Connected change detected: %x.\n",
    116                             port_instance->address, port_instance->number, port_status);
    117 
    118 
     99                usb_log_debug("Port %d status at %p: 0x%04x.\n",
     100                  port_instance->number, port_instance->address, port_status);
     101                print_port_status(port_status);
     102
     103                if (port_status & STATUS_CONNECTED_CHANGED) {
    119104                        int rc = usb_hc_connection_open(
    120105                            &port_instance->hc_connection);
    121106                        if (rc != EOK) {
    122                                 usb_log_error("Port(%p - %d): Failed to connect to HC.",
    123                                     port_instance->address, port_instance->number);
    124                                 continue;
     107                                usb_log_error("Failed to connect to HC.");
     108                                goto next;
    125109                        }
    126110
    127                         /* remove any old device */
    128                         if (port_instance->attached_device) {
    129                                 usb_log_debug("Port(%p - %d): Removing device.\n",
    130                                     port_instance->address, port_instance->number);
     111                        if (port_status & STATUS_CONNECTED) {
     112                                /* new device */
     113                                uhci_port_new_device(port_instance);
     114                        } else {
    131115                                uhci_port_remove_device(port_instance);
    132                         }
    133 
    134                         if ((port_status & STATUS_CONNECTED) != 0) {
    135                                 /* new device */
    136                                 uhci_port_new_device(port_instance, port_status);
    137                         } else {
    138                                 /* ack changes by writing one to WC bits */
    139                                 port_status_write(port_instance->address, port_status);
    140                                 usb_log_debug("Port(%p - %d): Change status ACK.\n",
    141                                                 port_instance->address, port_instance->number);
    142116                        }
    143117
     
    145119                            &port_instance->hc_connection);
    146120                        if (rc != EOK) {
    147                                 usb_log_error("Port(%p - %d): Failed to disconnect from HC.",
    148                                     port_instance->address, port_instance->number);
     121                                usb_log_error("Failed to disconnect from HC.");
     122                                goto next;
    149123                        }
    150124                }
     125        next:
     126                async_usleep(port_instance->wait_period_usec);
    151127        }
    152128        return EOK;
     
    163139        uhci_port_t *port = (uhci_port_t *) arg;
    164140
    165         usb_log_debug2("Port(%p - %d): new_device_enable_port.\n",
    166             port->address, port->number);
     141        usb_log_debug("new_device_enable_port(%d)\n", port->number);
    167142
    168143        /*
     
    172147        async_usleep(100000);
    173148
     149        /* Enable the port. */
     150        uhci_port_set_enabled(port, true);
    174151
    175152        /* The hub maintains the reset signal to that port for 10 ms
     
    177154         */
    178155        {
    179                 usb_log_debug("Port(%p - %d): Reset Signal start.\n",
    180                     port->address, port->number);
     156                usb_log_debug("Reset Signal start on port %d.\n",
     157                    port->number);
    181158                port_status_t port_status =
    182159                        port_status_read(port->address);
     
    188165                port_status &= ~STATUS_IN_RESET;
    189166                port_status_write(port->address, port_status);
    190                 usb_log_debug("Port(%p - %d): Reset Signal stop.\n",
    191                     port->address, port->number);
    192         }
    193 
    194         /* Enable the port. */
    195         uhci_port_set_enabled(port, true);
    196 
    197         return EOK;
    198 }
    199 
    200 /*----------------------------------------------------------------------------*/
    201 static int uhci_port_new_device(uhci_port_t *port, uint16_t status)
     167                usb_log_debug("Reset Signal stop on port %d.\n",
     168                    port->number);
     169        }
     170
     171        return EOK;
     172}
     173
     174/*----------------------------------------------------------------------------*/
     175static int uhci_port_new_device(uhci_port_t *port)
    202176{
    203177        assert(port);
    204178        assert(usb_hc_connection_is_opened(&port->hc_connection));
    205179
    206         usb_log_info("Port(%p-%d): Detected new device.\n",
    207             port->address, port->number);
     180        usb_log_info("Detected new device on port %u.\n", port->number);
    208181
    209182        usb_address_t dev_addr;
    210183        int rc = usb_hc_new_device_wrapper(port->rh, &port->hc_connection,
    211             ((status & STATUS_LOW_SPEED) != 0) ? USB_SPEED_LOW : USB_SPEED_FULL,
     184            USB_SPEED_FULL,
    212185            new_device_enable_port, port->number, port,
    213186            &dev_addr, &port->attached_device, NULL, NULL, NULL);
    214 
    215187        if (rc != EOK) {
    216                 usb_log_error("Port(%p-%d): Failed(%d) adding new device: %s.\n",
    217                     port->address, port->number, rc, str_error(rc));
     188                usb_log_error("Failed adding new device on port %u: %s.\n",
     189                    port->number, str_error(rc));
    218190                uhci_port_set_enabled(port, false);
    219191                return rc;
    220192        }
    221193
    222         usb_log_info("Port(%p-%d): New device has address %d (handle %zu).\n",
    223             port->address, port->number, dev_addr, port->attached_device);
     194        usb_log_info("New device on port %u has address %d (handle %zu).\n",
     195            port->number, dev_addr, port->attached_device);
    224196
    225197        return EOK;
     
    229201static int uhci_port_remove_device(uhci_port_t *port)
    230202{
    231         usb_log_error("Port(%p-%d): Don't know how to remove device %#x.\n",
    232                 port->address, port->number, (unsigned int)port->attached_device);
     203        usb_log_error("Don't know how to remove device %#x.\n",
     204                (unsigned int)port->attached_device);
    233205//      uhci_port_set_enabled(port, false);
    234206        return EOK;
     
    251223        port_status_write(port->address, port_status);
    252224
    253         usb_log_info("Port(%p-%d): %sabled port.\n",
    254                 port->address, port->number, enabled ? "En" : "Dis");
     225        usb_log_info("%s port %d.\n",
     226          enabled ? "Enabled" : "Disabled", port->number);
    255227        return EOK;
    256228}
  • uspace/drv/uhci-rhd/port.h

    r51b46f2 r0e3505a  
    5555int uhci_port_init(
    5656  uhci_port_t *port, port_status_t *address, unsigned number,
    57   unsigned usec, ddf_dev_t *rh);
     57  unsigned usec, ddf_dev_t *rh, int parent_phone);
    5858
    5959void uhci_port_fini(uhci_port_t *port);
  • uspace/drv/uhci-rhd/port_status.c

    r51b46f2 r0e3505a  
    4141struct flag_name
    4242{
    43         uint16_t flag;
     43        unsigned flag;
    4444        const char *name;
    4545};
     
    6565        for (;i < sizeof(flags)/sizeof(struct flag_name); ++i) {
    6666                usb_log_debug2("\t%s status: %s.\n", flags[i].name,
    67                   ((value & flags[i].flag) != 0) ? "YES" : "NO");
     67                  value & flags[i].flag ? "YES" : "NO");
    6868        }
    6969}
  • uspace/drv/uhci-rhd/port_status.h

    r51b46f2 r0e3505a  
    4141typedef uint16_t port_status_t;
    4242
    43 #define STATUS_CONNECTED         (1 << 0)
    44 #define STATUS_CONNECTED_CHANGED (1 << 1)
    45 #define STATUS_ENABLED           (1 << 2)
    46 #define STATUS_ENABLED_CHANGED   (1 << 3)
    47 #define STATUS_LINE_D_PLUS       (1 << 4)
    48 #define STATUS_LINE_D_MINUS      (1 << 5)
    49 #define STATUS_RESUME            (1 << 6)
    50 #define STATUS_ALWAYS_ONE        (1 << 7)
     43enum {
     44        STATUS_CONNECTED         = 1 << 0,
     45        STATUS_CONNECTED_CHANGED = 1 << 1,
     46        STATUS_ENABLED           = 1 << 2,
     47        STATUS_ENABLED_CHANGED   = 1 << 3,
     48        STATUS_LINE_D_PLUS       = 1 << 4,
     49        STATUS_LINE_D_MINUS      = 1 << 5,
     50        STATUS_RESUME            = 1 << 6,
     51        STATUS_ALWAYS_ONE        = 1 << 7,
    5152
    52 #define STATUS_LOW_SPEED (1 <<  8)
    53 #define STATUS_IN_RESET  (1 <<  9)
    54 #define STATUS_SUSPEND   (1 << 12)
     53        STATUS_LOW_SPEED = 1 <<  8,
     54        STATUS_IN_RESET  = 1 <<  9,
     55        STATUS_SUSPEND   = 1 << 12,
     56};
    5557
    5658static inline port_status_t port_status_read(port_status_t * address)
  • uspace/drv/uhci-rhd/root_hub.c

    r51b46f2 r0e3505a  
    4040#include "root_hub.h"
    4141
     42
    4243int uhci_root_hub_init(
    4344  uhci_root_hub_t *instance, void *addr, size_t size, ddf_dev_t *rh)
     
    4647        assert(rh);
    4748        int ret;
     49        ret = usb_hc_find(rh->handle, &instance->hc_handle);
     50        usb_log_info("rh found(%d) hc handle: %d.\n", ret, instance->hc_handle);
     51        if (ret != EOK) {
     52                return ret;
     53        }
    4854
    4955        /* allow access to root hub registers */
    5056        assert(sizeof(port_status_t) * UHCI_ROOT_HUB_PORT_COUNT == size);
    5157        port_status_t *regs;
    52         ret = pio_enable(addr, size, (void**)&regs);
     58        ret = pio_enable(
     59          addr, sizeof(port_status_t) * UHCI_ROOT_HUB_PORT_COUNT, (void**)&regs);
    5360
    5461        if (ret < 0) {
     
    6067        unsigned i = 0;
    6168        for (; i < UHCI_ROOT_HUB_PORT_COUNT; ++i) {
     69                /* connect to the parent device (HC) */
     70                int parent_phone = devman_device_connect(instance->hc_handle, 0);
     71                //usb_drv_hc_connect(rh, instance->hc_handle, 0);
     72                if (parent_phone < 0) {
     73                        usb_log_error("Failed to connect to the HC device port %d.\n", i);
     74                        return parent_phone;
     75                }
    6276                /* mind pointer arithmetics */
    63                 ret = uhci_port_init(
    64                   &instance->ports[i], regs + i, i, ROOT_HUB_WAIT_USEC, rh);
     77                int ret = uhci_port_init(
     78                  &instance->ports[i], regs + i, i, ROOT_HUB_WAIT_USEC, rh, parent_phone);
    6579                if (ret != EOK) {
    6680                        unsigned j = 0;
  • uspace/drv/uhci-rhd/root_hub.h

    r51b46f2 r0e3505a  
    4141
    4242#define UHCI_ROOT_HUB_PORT_COUNT 2
    43 #define ROOT_HUB_WAIT_USEC 5000000 /* 5 seconds */
     43#define UHCI_ROOT_HUB_PORT_REGISTERS_OFFSET 0x10
     44#define ROOT_HUB_WAIT_USEC 10000000 /* 10 seconds */
    4445
    4546typedef struct root_hub {
  • uspace/drv/usbhid/Makefile

    r51b46f2 r0e3505a  
    3939SOURCES = \
    4040        main.c \
     41        descparser.c \
     42        descdump.c \
    4143        conv.c \
    4244        $(STOLEN_LAYOUT_SOURCES)
  • uspace/drv/usbhid/conv.c

    r51b46f2 r0e3505a  
    3636#include <io/keycode.h>
    3737#include <stdint.h>
    38 #include <stdio.h>
    39 #include <usb/debug.h>
    4038#include "conv.h"
    4139
     
    143141        //[0xe7] = KC_R // TODO: right GUI
    144142       
    145         [0x53] = KC_NUM_LOCK,
    146         [0x54] = KC_NSLASH,
    147         [0x55] = KC_NTIMES,
    148         [0x56] = KC_NMINUS,
    149         [0x57] = KC_NPLUS,
    150         [0x58] = KC_NENTER,
    151         [0x59] = KC_N1,
    152         [0x5a] = KC_N2,
    153         [0x5b] = KC_N3,
    154         [0x5c] = KC_N4,
    155         [0x5d] = KC_N5,
    156         [0x5e] = KC_N6,
    157         [0x5f] = KC_N7,
    158         [0x60] = KC_N8,
    159         [0x61] = KC_N9,
    160         [0x62] = KC_N0,
    161         [0x63] = KC_NPERIOD
    162        
    163143};
    164144
     
    209189
    210190        key = map[scancode];
    211        
    212         if (scancode == 0x53) {
    213                 usb_log_debug("\n\nWe have a NUM LOCK!, sending key %u\n\n", key);
    214         }
    215        
    216         if (scancode == 0x47) {
    217                 usb_log_debug("\n\nWe have a SCROLL LOCK!, sending key %u\n\n", key);
    218         }
    219        
    220         if (scancode == 0x39) {
    221                 usb_log_debug("\n\nWe have a CAPS LOCK!, sending key %u\n\n", key);
    222         }
    223        
    224191//      if (key != 0)
    225192//              kbd_push_ev(type, key);
  • uspace/drv/usbhid/hid.h

    r51b46f2 r0e3505a  
    3737#define USBHID_HID_H_
    3838
    39 #include <stdint.h>
    40 
    4139#include <usb/classes/hid.h>
    4240#include <ddf/driver.h>
    4341#include <usb/pipes.h>
     42
     43/**
     44 *
     45 */
     46typedef struct {
     47        usb_standard_interface_descriptor_t iface_desc;
     48        usb_standard_endpoint_descriptor_t *endpoints;
     49        usb_standard_hid_descriptor_t hid_desc;
     50        uint8_t *report_desc;
     51        //usb_standard_hid_class_descriptor_info_t *class_desc_info;
     52        //uint8_t **class_descs;
     53} usb_hid_iface_t;
     54
     55/**
     56 *
     57 */
     58typedef struct {
     59        usb_standard_configuration_descriptor_t config_descriptor;
     60        usb_hid_iface_t *interfaces;
     61} usb_hid_configuration_t;
    4462
    4563/**
     
    5068typedef struct {
    5169        ddf_dev_t *device;
     70        usb_hid_configuration_t *conf;
     71        usb_hid_report_parser_t *parser;
    5272
    5373        usb_device_connection_t wire;
    5474        usb_endpoint_pipe_t ctrl_pipe;
    5575        usb_endpoint_pipe_t poll_pipe;
    56        
    57         uint16_t iface;
    58        
    59         uint8_t *report_desc;
    60         usb_hid_report_parser_t *parser;
    61        
    62         uint8_t *keycodes;
    63         size_t keycode_count;
    64         uint8_t modifiers;
    65        
    66         unsigned mods;
    67         unsigned lock_keys;
    6876} usb_hid_dev_kbd_t;
    6977
     78// TODO: more configurations!
     79
    7080#endif
  • uspace/drv/usbhid/main.c

    r51b46f2 r0e3505a  
    5151#include <usb/descriptor.h>
    5252#include <io/console.h>
    53 #include <stdint.h>
    54 #include <usb/dp.h>
    5553#include "hid.h"
     54#include "descparser.h"
     55#include "descdump.h"
    5656#include "conv.h"
    5757#include "layout.h"
    5858
    5959#define BUFFER_SIZE 8
    60 #define BUFFER_OUT_SIZE 1
    6160#define NAME "usbhid"
    6261
    63 //#define GUESSED_POLL_ENDPOINT 1
    64 #define BOOTP_REPORT_SIZE 6
    65 
    66 static unsigned DEFAULT_ACTIVE_MODS = KM_NUM_LOCK;
     62#define GUESSED_POLL_ENDPOINT 1
    6763
    6864/** Keyboard polling endpoint description for boot protocol class. */
     
    124120
    125121static void dump_buffer(const char *msg, const uint8_t *buffer, size_t length)
    126 {uint8_t buffer[BUFFER_SIZE];
     122{
    127123        printf("%s\n", msg);
    128124       
     
    141137 */
    142138
    143 /** Currently active modifiers (locks is probably better word).
     139/** Currently active modifiers.
    144140 *
    145141 * TODO: put to device?
    146142 */
    147 //static unsigned mods = KM_NUM_LOCK;
     143static unsigned mods = KM_NUM_LOCK;
    148144
    149145/** Currently pressed lock keys. We track these to tackle autorepeat. 
     
    151147 * TODO: put to device?
    152148 */
    153 //static unsigned lock_keys;
     149static unsigned lock_keys;
    154150
    155151#define NUM_LAYOUTS 3
     
    163159static int active_layout = 0;
    164160
    165 static void usbkbd_req_set_report(usb_hid_dev_kbd_t *kbd_dev, uint16_t iface,
    166     usb_hid_report_type_t type, uint8_t *buffer, size_t buf_size)
    167 {
    168         int rc, sess_rc;
    169        
    170         sess_rc = usb_endpoint_pipe_start_session(&kbd_dev->ctrl_pipe);
    171         if (sess_rc != EOK) {
    172                 usb_log_warning("Failed to start a session: %s.\n",
    173                     str_error(sess_rc));
    174                 return;
    175         }
    176 
    177         usb_log_debug("Sending Set_Report request to the device.\n");
    178        
    179         rc = usb_control_request_set(&kbd_dev->ctrl_pipe,
    180             USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE,
    181             USB_HIDREQ_SET_REPORT, type, iface, buffer, buf_size);
    182 
    183         sess_rc = usb_endpoint_pipe_end_session(&kbd_dev->ctrl_pipe);
    184 
    185         if (rc != EOK) {
    186                 usb_log_warning("Error sending output report to the keyboard: "
    187                     "%s.\n", str_error(rc));
    188                 return;
    189         }
    190 
    191         if (sess_rc != EOK) {
    192                 usb_log_warning("Error closing session: %s.\n",
    193                     str_error(sess_rc));
    194                 return;
    195         }
    196 }
    197 
    198 static void usbkbd_req_set_protocol(usb_hid_dev_kbd_t *kbd_dev,
    199     usb_hid_protocol_t protocol)
    200 {
    201         int rc, sess_rc;
    202        
    203         sess_rc = usb_endpoint_pipe_start_session(&kbd_dev->ctrl_pipe);
    204         if (sess_rc != EOK) {
    205                 usb_log_warning("Failed to start a session: %s.\n",
    206                     str_error(sess_rc));
    207                 return;
    208         }
    209 
    210         usb_log_debug("Sending Set_Protocol request to the device ("
    211             "protocol: %d, iface: %d).\n", protocol, kbd_dev->iface);
    212        
    213         rc = usb_control_request_set(&kbd_dev->ctrl_pipe,
    214             USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE,
    215             USB_HIDREQ_SET_PROTOCOL, protocol, kbd_dev->iface, NULL, 0);
    216 
    217         sess_rc = usb_endpoint_pipe_end_session(&kbd_dev->ctrl_pipe);
    218 
    219         if (rc != EOK) {
    220                 usb_log_warning("Error sending output report to the keyboard: "
    221                     "%s.\n", str_error(rc));
    222                 return;
    223         }
    224 
    225         if (sess_rc != EOK) {
    226                 usb_log_warning("Error closing session: %s.\n",
    227                     str_error(sess_rc));
    228                 return;
    229         }
    230 }
    231 
    232 static void usbkbd_set_led(usb_hid_dev_kbd_t *kbd_dev)
    233 {
    234         uint8_t buffer[BUFFER_OUT_SIZE];
    235         int rc= 0, i;
    236        
    237         memset(buffer, 0, BUFFER_OUT_SIZE);
    238         uint8_t leds = 0;
    239 
    240         if (kbd_dev->mods & KM_NUM_LOCK) {
    241                 leds |= USB_HID_LED_NUM_LOCK;
    242         }
    243        
    244         if (kbd_dev->mods & KM_CAPS_LOCK) {
    245                 leds |= USB_HID_LED_CAPS_LOCK;
    246         }
    247        
    248         if (kbd_dev->mods & KM_SCROLL_LOCK) {
    249                 leds |= USB_HID_LED_SCROLL_LOCK;
    250         }
    251 
    252         // TODO: COMPOSE and KANA
    253        
    254         usb_log_debug("Creating output report.\n");
    255         usb_log_debug("Leds: 0x%x\n", leds);
    256         if ((rc = usb_hid_boot_keyboard_output_report(
    257             leds, buffer, BUFFER_OUT_SIZE)) != EOK) {
    258                 usb_log_warning("Error composing output report to the keyboard:"
    259                     "%s.\n", str_error(rc));
    260                 return;
    261         }
    262        
    263         usb_log_debug("Output report buffer: ");
    264         for (i = 0; i < BUFFER_OUT_SIZE; ++i) {
    265                 usb_log_debug("0x%x ", buffer[i]);
    266         }
    267         usb_log_debug("\n");
    268        
    269         uint16_t value = 0;
    270         value |= (USB_HID_REPORT_TYPE_OUTPUT << 8);
    271 
    272         usbkbd_req_set_report(kbd_dev, kbd_dev->iface, value, buffer,
    273             BUFFER_OUT_SIZE);
    274 }
    275 
    276 static void kbd_push_ev(int type, unsigned int key, usb_hid_dev_kbd_t *kbd_dev)
     161static void kbd_push_ev(int type, unsigned int key)
    277162{
    278163        console_event_t ev;
     
    292177        if (mod_mask != 0) {
    293178                if (type == KEY_PRESS)
    294                         kbd_dev->mods = kbd_dev->mods | mod_mask;
     179                        mods = mods | mod_mask;
    295180                else
    296                         kbd_dev->mods = kbd_dev->mods & ~mod_mask;
     181                        mods = mods & ~mod_mask;
    297182        }
    298183
    299184        switch (key) {
    300         case KC_CAPS_LOCK: mod_mask = KM_CAPS_LOCK; usb_log_debug2("\n\nPushing CAPS LOCK! (mask: %u)\n\n", mod_mask); break;
    301         case KC_NUM_LOCK: mod_mask = KM_NUM_LOCK; usb_log_debug2("\n\nPushing NUM LOCK! (mask: %u)\n\n", mod_mask); break;
    302         case KC_SCROLL_LOCK: mod_mask = KM_SCROLL_LOCK; usb_log_debug2("\n\nPushing SCROLL LOCK! (mask: %u)\n\n", mod_mask); break;
     185        case KC_CAPS_LOCK: mod_mask = KM_CAPS_LOCK; break;
     186        case KC_NUM_LOCK: mod_mask = KM_NUM_LOCK; break;
     187        case KC_SCROLL_LOCK: mod_mask = KM_SCROLL_LOCK; break;
    303188        default: mod_mask = 0; break;
    304189        }
    305190
    306191        if (mod_mask != 0) {
    307                 usb_log_debug2("\n\nChanging mods and lock keys\n");
    308                 usb_log_debug2("\nmods before: 0x%x\n", kbd_dev->mods);
    309                 usb_log_debug2("\nLock keys before:0x%x\n\n", kbd_dev->lock_keys);
    310                
    311192                if (type == KEY_PRESS) {
    312                         usb_log_debug2("\nKey pressed.\n");
    313193                        /*
    314194                         * Only change lock state on transition from released
     
    316196                         * up the lock state.
    317197                         */
    318                         kbd_dev->mods =
    319                             kbd_dev->mods ^ (mod_mask & ~kbd_dev->lock_keys);
    320                         kbd_dev->lock_keys = kbd_dev->lock_keys | mod_mask;
     198                        mods = mods ^ (mod_mask & ~lock_keys);
     199                        lock_keys = lock_keys | mod_mask;
    321200
    322201                        /* Update keyboard lock indicator lights. */
    323                         usbkbd_set_led(kbd_dev);
     202                        // TODO
     203                        //kbd_ctl_set_ind(mods);
    324204                } else {
    325                         usb_log_debug2("\nKey released.\n");
    326                         kbd_dev->lock_keys = kbd_dev->lock_keys & ~mod_mask;
    327                 }
    328         }
    329 
    330         usb_log_debug2("\n\nmods after: 0x%x\n", kbd_dev->mods);
    331         usb_log_debug2("\nLock keys after: 0x%x\n\n", kbd_dev->lock_keys);
    332        
    333         if (type == KEY_PRESS && (kbd_dev->mods & KM_LCTRL) && key == KC_F1) {
     205                        lock_keys = lock_keys & ~mod_mask;
     206                }
     207        }
     208/*
     209        printf("type: %d\n", type);
     210        printf("mods: 0x%x\n", mods);
     211        printf("keycode: %u\n", key);
     212*/
     213       
     214        if (type == KEY_PRESS && (mods & KM_LCTRL) &&
     215                key == KC_F1) {
    334216                active_layout = 0;
    335217                layout[active_layout]->reset();
     
    337219        }
    338220
    339         if (type == KEY_PRESS && (kbd_dev->mods & KM_LCTRL) && key == KC_F2) {
     221        if (type == KEY_PRESS && (mods & KM_LCTRL) &&
     222                key == KC_F2) {
    340223                active_layout = 1;
    341224                layout[active_layout]->reset();
     
    343226        }
    344227
    345         if (type == KEY_PRESS && (kbd_dev->mods & KM_LCTRL) && key == KC_F3) {
     228        if (type == KEY_PRESS && (mods & KM_LCTRL) &&
     229                key == KC_F3) {
    346230                active_layout = 2;
    347231                layout[active_layout]->reset();
     
    351235        ev.type = type;
    352236        ev.key = key;
    353         ev.mods = kbd_dev->mods;
    354        
    355         if (ev.mods & KM_NUM_LOCK) {
    356                 usb_log_debug("\n\nNum Lock turned on.\n\n");
    357         }
     237        ev.mods = mods;
    358238
    359239        ev.c = layout[active_layout]->parse_ev(&ev);
    360240
    361         usb_log_debug2("Sending key %d to the console\n", ev.key);
     241        printf("Sending key %d to the console\n", ev.key);
    362242        assert(console_callback_phone != -1);
    363         async_msg_4(console_callback_phone, KBD_EVENT, ev.type, ev.key,
    364             ev.mods, ev.c);
     243        async_msg_4(console_callback_phone, KBD_EVENT, ev.type, ev.key, ev.mods, ev.c);
    365244}
    366245/*
     
    370249        /*
    371250         * TODO:
    372          * 1) key press / key release - how does the keyboard notify about
    373          *    release?
     251         * 1) key press / key release - how does the keyboard notify about release?
    374252         * 2) layouts (use the already defined), not important now
    375253         * 3)
    376254         */
    377255
    378 static const keycode_t usb_hid_modifiers_keycodes[USB_HID_MOD_COUNT] = {
    379         KC_LCTRL,         /* USB_HID_MOD_LCTRL */
    380         KC_LSHIFT,        /* USB_HID_MOD_LSHIFT */
    381         KC_LALT,          /* USB_HID_MOD_LALT */
    382         0,                /* USB_HID_MOD_LGUI */
    383         KC_RCTRL,         /* USB_HID_MOD_RCTRL */
    384         KC_RSHIFT,        /* USB_HID_MOD_RSHIFT */
    385         KC_RALT,          /* USB_HID_MOD_RALT */
    386         0,                /* USB_HID_MOD_RGUI */
    387 };
    388 
    389 static void usbkbd_check_modifier_changes(usb_hid_dev_kbd_t *kbd_dev,
    390     uint8_t modifiers)
    391 {
    392         /*
    393          * TODO: why the USB keyboard has NUM_, SCROLL_ and CAPS_LOCK
    394          *       both as modifiers and as keys with their own scancodes???
    395          *
    396          * modifiers should be sent as normal keys to usbkbd_parse_scancode()!!
    397          * so maybe it would be better if I received it from report parser in
    398          * that way
    399          */
    400        
    401         int i;
    402         for (i = 0; i < USB_HID_MOD_COUNT; ++i) {
    403                 if ((modifiers & usb_hid_modifiers_consts[i]) &&
    404                     !(kbd_dev->modifiers & usb_hid_modifiers_consts[i])) {
    405                         // modifier pressed
    406                         if (usb_hid_modifiers_keycodes[i] != 0) {
    407                                 kbd_push_ev(KEY_PRESS,
    408                                     usb_hid_modifiers_keycodes[i], kbd_dev);
    409                         }
    410                 } else if (!(modifiers & usb_hid_modifiers_consts[i]) &&
    411                     (kbd_dev->modifiers & usb_hid_modifiers_consts[i])) {
    412                         // modifier released
    413                         if (usb_hid_modifiers_keycodes[i] != 0) {
    414                                 kbd_push_ev(KEY_RELEASE,
    415                                     usb_hid_modifiers_keycodes[i], kbd_dev);
    416                         }
    417                 }       // no change
    418         }
    419        
    420         kbd_dev->modifiers = modifiers;
    421 }
    422 
    423 static void usbkbd_check_key_changes(usb_hid_dev_kbd_t *kbd_dev,
    424     const uint8_t *key_codes)
    425 {
    426         // TODO: phantom state!!
    427        
    428         unsigned int key;
    429         unsigned int i, j;
    430        
    431         // TODO: quite dummy right now, think of better implementation
    432        
    433         // key releases
    434         for (j = 0; j < kbd_dev->keycode_count; ++j) {
    435                 // try to find the old key in the new key list
    436                 i = 0;
    437                 while (i < kbd_dev->keycode_count
    438                     && key_codes[i] != kbd_dev->keycodes[j]) {
    439                         ++i;
    440                 }
    441                
    442                 if (i == kbd_dev->keycode_count) {
    443                         // not found, i.e. the key was released
    444                         key = usbkbd_parse_scancode(kbd_dev->keycodes[j]);
    445                         kbd_push_ev(KEY_RELEASE, key, kbd_dev);
    446                         usb_log_debug2("\nKey released: %d\n", key);
    447                 } else {
    448                         // found, nothing happens
    449                 }
    450         }
    451        
    452         // key presses
    453         for (i = 0; i < kbd_dev->keycode_count; ++i) {
    454                 // try to find the new key in the old key list
    455                 j = 0;
    456                 while (j < kbd_dev->keycode_count
    457                     && kbd_dev->keycodes[j] != key_codes[i]) {
    458                         ++j;
    459                 }
    460                
    461                 if (j == kbd_dev->keycode_count) {
    462                         // not found, i.e. new key pressed
    463                         key = usbkbd_parse_scancode(key_codes[i]);
    464                         usb_log_debug2("\nKey pressed: %d (keycode: %d)\n", key,
    465                             key_codes[i]);
    466                         kbd_push_ev(KEY_PRESS, key, kbd_dev);
    467                 } else {
    468                         // found, nothing happens
    469                 }
    470         }
    471        
    472         memcpy(kbd_dev->keycodes, key_codes, kbd_dev->keycode_count);
    473        
    474         usb_log_debug2("\nNew stored keycodes: ");
    475         for (i = 0; i < kbd_dev->keycode_count; ++i) {
    476                 usb_log_debug2("%d ", kbd_dev->keycodes[i]);
    477         }
    478 }
    479 
    480256/*
    481257 * Callbacks for parser
     
    484260    uint8_t modifiers, void *arg)
    485261{
    486         if (arg == NULL) {
    487                 usb_log_warning("Missing argument in callback "
    488                     "usbkbd_process_keycodes().\n");
    489                 return;
    490         }
    491 
    492         usb_log_debug2("Got keys from parser: ");
     262        printf("Got keys: ");
    493263        unsigned i;
    494264        for (i = 0; i < count; ++i) {
    495                 usb_log_debug2("%d ", key_codes[i]);
    496         }
    497         usb_log_debug2("\n");
    498        
    499         usb_hid_dev_kbd_t *kbd_dev = (usb_hid_dev_kbd_t *)arg;
    500        
    501         if (count != kbd_dev->keycode_count) {
    502                 usb_log_warning("Number of received keycodes (%d) differs from"
    503                     " expected number (%d).\n", count, kbd_dev->keycode_count);
    504                 return;
    505         }
    506        
    507         usbkbd_check_modifier_changes(kbd_dev, modifiers);
    508         usbkbd_check_key_changes(kbd_dev, key_codes);
     265                printf("%d ", key_codes[i]);
     266        }
     267        printf("\n");
     268
     269        for (i = 0; i < count; ++i) {
     270                // TODO: Key press / release
     271
     272                // TODO: NOT WORKING
     273                unsigned int key = usbkbd_parse_scancode(key_codes[i]);
     274
     275                if (key == 0) {
     276                        continue;
     277                }
     278                kbd_push_ev(KEY_PRESS, key);
     279        }
     280        printf("\n");
    509281}
    510282
     
    512284 * Kbd functions
    513285 */
    514 //static int usbkbd_get_report_descriptor(usb_hid_dev_kbd_t *kbd_dev)
    515 //{
    516 //      // iterate over all configurations and interfaces
    517 //      // TODO: more configurations!!
    518 //      unsigned i;
    519 //      for (i = 0; i < kbd_dev->conf->config_descriptor.interface_count; ++i) {
    520 //              // TODO: endianness
    521 //              uint16_t length =  kbd_dev->conf->interfaces[i].hid_desc.
    522 //                  report_desc_info.length;
    523 //              size_t actual_size = 0;
    524 
    525 //              // allocate space for the report descriptor
    526 //              kbd_dev->conf->interfaces[i].report_desc =
    527 //                  (uint8_t *)malloc(length);
     286static int usbkbd_get_report_descriptor(usb_hid_dev_kbd_t *kbd_dev)
     287{
     288        // iterate over all configurations and interfaces
     289        // TODO: more configurations!!
     290        unsigned i;
     291        for (i = 0; i < kbd_dev->conf->config_descriptor.interface_count; ++i) {
     292                // TODO: endianness
     293                uint16_t length =
     294                    kbd_dev->conf->interfaces[i].hid_desc.report_desc_info.length;
     295                size_t actual_size = 0;
     296
     297                // allocate space for the report descriptor
     298                kbd_dev->conf->interfaces[i].report_desc = (uint8_t *)malloc(length);
    528299               
    529 //              // get the descriptor from the device
    530 //              int rc = usb_request_get_descriptor(&kbd_dev->ctrl_pipe,
    531 //                  USB_REQUEST_TYPE_CLASS, USB_DESCTYPE_HID_REPORT,
    532 //                  i, 0,
    533 //                  kbd_dev->conf->interfaces[i].report_desc, length,
    534 //                  &actual_size);
    535 
    536 //              if (rc != EOK) {
    537 //                      return rc;
    538 //              }
    539 
    540 //              assert(actual_size == length);
    541 
    542 //              //dump_hid_class_descriptor(0, USB_DESCTYPE_HID_REPORT,
    543 //              //    kbd_dev->conf->interfaces[i].report_desc, length);
    544 //      }
    545 
    546 //      return EOK;
    547 //}
    548 
    549 static int usbkbd_get_report_descriptor(usb_hid_dev_kbd_t *kbd_dev,
    550     uint8_t *config_desc, size_t config_desc_size, uint8_t *iface_desc)
    551 {
    552         assert(kbd_dev != NULL);
    553         assert(config_desc != NULL);
    554         assert(config_desc_size != 0);
    555         assert(iface_desc != NULL);
    556        
    557         usb_dp_parser_t parser =  {
    558                 .nesting = usb_dp_standard_descriptor_nesting
    559         };
    560        
    561         usb_dp_parser_data_t parser_data = {
    562                 .data = config_desc,
    563                 .size = config_desc_size,
    564                 .arg = NULL
    565         };
    566        
    567         /*
    568          * First nested descriptor of interface descriptor.
    569          */
    570         uint8_t *d =
    571             usb_dp_get_nested_descriptor(&parser, &parser_data, iface_desc);
    572        
    573         /*
    574          * Search through siblings until the HID descriptor is found.
    575          */
    576         while (d != NULL && *(d + 1) != USB_DESCTYPE_HID) {
    577                 d = usb_dp_get_sibling_descriptor(&parser, &parser_data,
    578                     iface_desc, d);
    579         }
    580        
    581         if (d == NULL) {
    582                 usb_log_fatal("No HID descriptor found!\n");
    583                 return ENOENT;
    584         }
    585        
    586         if (*d != sizeof(usb_standard_hid_descriptor_t)) {
    587                 usb_log_fatal("HID descriptor hass wrong size (%u, expected %u"
    588                     ")\n", *d, sizeof(usb_standard_hid_descriptor_t));
    589                 return EINVAL;
    590         }
    591        
    592         usb_standard_hid_descriptor_t *hid_desc =
    593             (usb_standard_hid_descriptor_t *)d;
    594        
    595         uint16_t length =  hid_desc->report_desc_info.length;
    596         size_t actual_size = 0;
    597 
    598         /*
    599          * Allocate space for the report descriptor.
    600          */
    601         kbd_dev->report_desc = (uint8_t *)malloc(length);
    602         if (kbd_dev->report_desc == NULL) {
    603                 usb_log_fatal("Failed to allocate space for Report descriptor."
    604                     "\n");
    605                 return ENOMEM;
    606         }
    607        
    608         usb_log_debug("Getting Report descriptor, expected size: %u\n", length);
    609        
    610         /*
    611          * Get the descriptor from the device.
    612          */
    613         int rc = usb_request_get_descriptor(&kbd_dev->ctrl_pipe,
    614             USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_INTERFACE,
    615             USB_DESCTYPE_HID_REPORT, 0,
    616             kbd_dev->iface, kbd_dev->report_desc, length, &actual_size);
    617 
    618         if (rc != EOK) {
    619                 return rc;
    620         }
    621 
    622         if (actual_size != length) {
    623                 free(kbd_dev->report_desc);
    624                 kbd_dev->report_desc = NULL;
    625                 usb_log_fatal("Report descriptor has wrong size (%u, expected "
    626                     "%u)\n", actual_size, length);
    627                 return EINVAL;
    628         }
    629        
    630         usb_log_debug("Done.\n");
    631        
     300                // get the descriptor from the device
     301                int rc = usb_request_get_descriptor(&kbd_dev->ctrl_pipe,
     302                    USB_REQUEST_TYPE_CLASS, USB_DESCTYPE_HID_REPORT,
     303                    i, 0,
     304                    kbd_dev->conf->interfaces[i].report_desc, length,
     305                    &actual_size);
     306
     307                if (rc != EOK) {
     308                        return rc;
     309                }
     310
     311                assert(actual_size == length);
     312
     313                //dump_hid_class_descriptor(0, USB_DESCTYPE_HID_REPORT,
     314                //    kbd_dev->conf->interfaces[i].report_desc, length);
     315        }
     316
    632317        return EOK;
    633318}
    634 
    635319static int usbkbd_process_descriptors(usb_hid_dev_kbd_t *kbd_dev)
    636320{
     
    680364            descriptors, config_desc.total_length,
    681365            &kbd_dev->wire);
    682        
    683366        if (rc != EOK) {
    684367                usb_log_error("Failed to initialize poll pipe: %s.\n",
    685368                    str_error(rc));
    686                 free(descriptors);
    687369                return rc;
    688370        }
    689        
    690371        if (!endpoint_mapping[0].present) {
    691372                usb_log_warning("Not accepting device, " \
    692373                    "not boot-protocol keyboard.\n");
     374                return EREFUSED;
     375        }
     376
     377
     378
     379
     380        kbd_dev->conf = (usb_hid_configuration_t *)calloc(1,
     381            sizeof(usb_hid_configuration_t));
     382        if (kbd_dev->conf == NULL) {
    693383                free(descriptors);
    694                 return EREFUSED;
    695         }
    696        
    697         usb_log_debug("Accepted device. Saving interface, and getting Report"
    698             " descriptor.\n");
    699        
    700         /*
    701          * Save assigned interface number.
    702          */
    703         if (endpoint_mapping[0].interface_no < 0) {
    704                 usb_log_error("Bad interface number.\n");
    705                 free(descriptors);
    706                 return EINVAL;
    707         }
    708        
    709         kbd_dev->iface = endpoint_mapping[0].interface_no;
    710        
    711         assert(endpoint_mapping[0].interface != NULL);
    712        
    713         rc = usbkbd_get_report_descriptor(kbd_dev, descriptors, transferred,
    714             (uint8_t *)endpoint_mapping[0].interface);
    715        
     384                return ENOMEM;
     385        }
     386       
     387        /*rc = usbkbd_parse_descriptors(descriptors, transferred, kbd_dev->conf);
    716388        free(descriptors);
    717        
    718         if (rc != EOK) {
    719                 usb_log_warning("Problem with parsing REPORT descriptor.\n");
     389        if (rc != EOK) {
     390                printf("Problem with parsing standard descriptors.\n");
    720391                return rc;
    721392        }
    722        
    723         usb_log_debug("Done parsing descriptors.\n");
    724        
     393
     394        // get and report descriptors*/
     395        rc = usbkbd_get_report_descriptor(kbd_dev);
     396        if (rc != EOK) {
     397                printf("Problem with parsing HID REPORT descriptor.\n");
     398                return rc;
     399        }
     400       
     401        //usbkbd_print_config(kbd_dev->conf);
     402
     403        /*
     404         * TODO:
     405         * 1) select one configuration (lets say the first)
     406         * 2) how many interfaces?? how to select one??
     407     *    ("The default setting for an interface is always alternate setting zero.")
     408         * 3) find endpoint which is IN and INTERRUPT (parse), save its number
     409     *    as the endpoint for polling
     410         */
     411
    725412        return EOK;
    726413}
     
    734421
    735422        if (kbd_dev == NULL) {
    736                 usb_log_fatal("No memory!\n");
     423                fprintf(stderr, NAME ": No memory!\n");
    737424                return NULL;
    738425        }
     
    762449
    763450        /*
    764          * Get descriptors, parse descriptors and save endpoints.
    765          */
     451         * will need all descriptors:
     452         * 1) choose one configuration from configuration descriptors
     453         *    (set it to the device)
     454         * 2) set endpoints from endpoint descriptors
     455         */
     456
     457        // TODO: get descriptors, parse descriptors and save endpoints
    766458        usb_endpoint_pipe_start_session(&kbd_dev->ctrl_pipe);
    767        
     459        //usb_request_set_configuration(&kbd_dev->ctrl_pipe, 1);
    768460        rc = usbkbd_process_descriptors(kbd_dev);
    769        
    770461        usb_endpoint_pipe_end_session(&kbd_dev->ctrl_pipe);
    771462        if (rc != EOK) {
    772463                goto error_leave;
    773464        }
    774        
    775         // save the size of the report (boot protocol report by default)
    776         kbd_dev->keycode_count = BOOTP_REPORT_SIZE;
    777         kbd_dev->keycodes = (uint8_t *)calloc(
    778             kbd_dev->keycode_count, sizeof(uint8_t));
    779        
    780         if (kbd_dev->keycodes == NULL) {
    781                 usb_log_fatal("No memory!\n");
    782                 goto error_leave;
    783         }
    784        
    785         kbd_dev->modifiers = 0;
    786         kbd_dev->mods = DEFAULT_ACTIVE_MODS;
    787         kbd_dev->lock_keys = 0;
    788        
    789         // set boot protocol
    790         usbkbd_req_set_protocol(kbd_dev, USB_HID_PROTOCOL_BOOT);
    791        
    792         // set LEDs according to internal setup (NUM LOCK enabled)
    793         usbkbd_set_led(kbd_dev);
    794        
     465
    795466        return kbd_dev;
    796467
     
    805476        usb_hid_report_in_callbacks_t *callbacks =
    806477            (usb_hid_report_in_callbacks_t *)malloc(
    807                 sizeof(usb_hid_report_in_callbacks_t));
     478                sizeof(usb_hid_report_in_callbacks_t));
    808479        callbacks->keyboard = usbkbd_process_keycodes;
    809480
    810481        //usb_hid_parse_report(kbd_dev->parser, buffer, actual_size, callbacks,
    811482        //    NULL);
    812         /*usb_log_debug2("Calling usb_hid_boot_keyboard_input_report() with size"
    813             " %zu\n", actual_size);*/
     483        printf("Calling usb_hid_boot_keyboard_input_report() with size %zu\n",
     484            actual_size);
    814485        //dump_buffer("bufffer: ", buffer, actual_size);
    815         int rc = usb_hid_boot_keyboard_input_report(buffer, actual_size,
    816             callbacks, kbd_dev);
    817        
    818         if (rc != EOK) {
    819                 usb_log_warning("Error in usb_hid_boot_keyboard_input_report():"
    820                     "%s\n", str_error(rc));
     486        int rc = usb_hid_boot_keyboard_input_report(buffer, actual_size, callbacks,
     487            NULL);
     488        if (rc != EOK) {
     489                printf("Error in usb_hid_boot_keyboard_input_report(): %d\n", rc);
    821490        }
    822491}
     
    828497        size_t actual_size;
    829498
    830         usb_log_info("Polling keyboard...\n");
     499        printf("Polling keyboard...\n");
    831500
    832501        while (true) {
     
    835504                sess_rc = usb_endpoint_pipe_start_session(&kbd_dev->poll_pipe);
    836505                if (sess_rc != EOK) {
    837                         usb_log_warning("Failed to start a session: %s.\n",
     506                        printf("Failed to start a session: %s.\n",
    838507                            str_error(sess_rc));
    839508                        continue;
     
    845514
    846515                if (rc != EOK) {
    847                         usb_log_warning("Error polling the keyboard: %s.\n",
     516                        printf("Error polling the keyboard: %s.\n",
    848517                            str_error(rc));
    849518                        continue;
     
    851520
    852521                if (sess_rc != EOK) {
    853                         usb_log_warning("Error closing session: %s.\n",
     522                        printf("Error closing session: %s.\n",
    854523                            str_error(sess_rc));
    855524                        continue;
     
    861530                 */
    862531                if (actual_size == 0) {
    863                         usb_log_debug("Keyboard returned NAK\n");
     532                        printf("Keyboard returned NAK\n");
    864533                        continue;
    865534                }
     
    868537                 * TODO: Process pressed keys.
    869538                 */
    870                 usb_log_debug("Calling usbkbd_process_interrupt_in()\n");
     539                printf("Calling usbkbd_process_interrupt_in()\n");
    871540                usbkbd_process_interrupt_in(kbd_dev, buffer, actual_size);
    872541        }
     
    878547static int usbkbd_fibril_device(void *arg)
    879548{
     549        printf("!!! USB device fibril\n");
     550
    880551        if (arg == NULL) {
    881                 usb_log_error("No device!\n");
     552                printf("No device!\n");
    882553                return -1;
    883554        }
    884        
    885         usb_hid_dev_kbd_t *kbd_dev = (usb_hid_dev_kbd_t *)arg;
     555
     556        ddf_dev_t *dev = (ddf_dev_t *)arg;
     557
     558        // initialize device (get and process descriptors, get address, etc.)
     559        usb_hid_dev_kbd_t *kbd_dev = usbkbd_init_device(dev);
     560        if (kbd_dev == NULL) {
     561                printf("Error while initializing device.\n");
     562                return -1;
     563        }
    886564
    887565        usbkbd_poll_keyboard(kbd_dev);
     
    892570static int usbkbd_add_device(ddf_dev_t *dev)
    893571{
     572        /* For now, fail immediately. */
     573        //return ENOTSUP;
     574
     575        /*
     576         * When everything is okay, connect to "our" HC.
     577         *
     578         * Not supported yet, skip..
     579         */
     580//      int phone = usb_drv_hc_connect_auto(dev, 0);
     581//      if (phone < 0) {
     582//              /*
     583//               * Connecting to HC failed, roll-back and announce
     584//               * failure.
     585//               */
     586//              return phone;
     587//      }
     588
     589//      dev->parent_phone = phone;
     590
    894591        /*
    895592         * Create default function.
     
    904601        rc = ddf_fun_add_to_class(kbd_fun, "keyboard");
    905602        assert(rc == EOK);
    906        
    907         /*
    908          * Initialize device (get and process descriptors, get address, etc.)
    909          */
    910         usb_hid_dev_kbd_t *kbd_dev = usbkbd_init_device(dev);
    911         if (kbd_dev == NULL) {
    912                 usb_log_error("Error while initializing device.\n");
    913                 return -1;
    914         }
    915 
    916         usb_log_info("Device initialized.\n");
    917        
     603
    918604        /*
    919605         * Create new fibril for handling this keyboard
    920606         */
    921         fid_t fid = fibril_create(usbkbd_fibril_device, kbd_dev);
     607        fid_t fid = fibril_create(usbkbd_fibril_device, dev);
    922608        if (fid == 0) {
    923                 usb_log_error("Failed to start fibril for HID device\n");
     609                printf("%s: failed to start fibril for HID device\n", NAME);
    924610                return ENOMEM;
    925611        }
     
    948634int main(int argc, char *argv[])
    949635{
    950         usb_log_enable(USB_LOG_LEVEL_INFO, NAME);
     636        usb_log_enable(USB_LOG_LEVEL_INFO, "usbhid");
    951637        return ddf_driver_main(&kbd_driver);
    952638}
  • uspace/drv/usbhub/main.c

    r51b46f2 r0e3505a  
    3434#include <errno.h>
    3535#include <async.h>
    36 #include <stdio.h>
    3736
    3837#include "usbhub.h"
     
    5251};
    5352
     53int usb_hub_control_loop(void * noparam){
     54        while(true){
     55                usb_hub_check_hub_changes();
     56                async_usleep(1000 * 1000 );/// \TODO proper number once
     57        }
     58        return 0;
     59}
     60
     61
    5462int main(int argc, char *argv[])
    5563{
    5664        usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME);
    57         dprintf(USB_LOG_LEVEL_INFO, "starting hub driver");
    58 
    59         //this is probably not needed anymore
     65       
    6066        fibril_mutex_initialize(&usb_hub_list_lock);
    6167        fibril_mutex_lock(&usb_hub_list_lock);
    6268        usb_lst_init(&usb_hub_list);
    6369        fibril_mutex_unlock(&usb_hub_list_lock);
    64        
     70
     71        fid_t fid = fibril_create(usb_hub_control_loop, NULL);
     72        if (fid == 0) {
     73                fprintf(stderr, NAME ": failed to start monitoring fibril," \
     74                    " driver aborting.\n");
     75                return ENOMEM;
     76        }
     77        fibril_add_ready(fid);
     78
    6579        return ddf_driver_main(&hub_driver);
    6680}
  • uspace/drv/usbhub/port_status.h

    r51b46f2 r0e3505a  
    177177}
    178178
    179 /**
    180  * set the device request to be a port disable request
    181  * @param request
    182  * @param port
    183  */
    184 static inline void usb_hub_unset_power_port_request(
    185 usb_device_request_setup_packet_t * request, uint16_t port
    186 ){
    187         request->index = port;
    188         request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
    189         request->request = USB_HUB_REQUEST_CLEAR_FEATURE;
    190         request->value = USB_HUB_FEATURE_PORT_POWER;
    191         request->length = 0;
    192 }
    193 
    194179/** get i`th bit of port status */
    195180static inline bool usb_port_get_bit(usb_port_status_t * status, int idx)
  • uspace/drv/usbhub/usbhub.c

    r51b46f2 r0e3505a  
    4444#include <usb/request.h>
    4545#include <usb/classes/hub.h>
    46 #include <stdio.h>
    4746
    4847#include "usbhub.h"
     
    5756};
    5857
    59 /** Hub status-change endpoint description
    60  *
    61  * For more see usb hub specification in 11.15.1 of
    62  */
     58/** Hub status-change endpoint description */
    6359static usb_endpoint_description_t status_change_endpoint_description = {
    6460        .transfer_type = USB_TRANSFER_INTERRUPT,
    6561        .direction = USB_DIRECTION_IN,
    6662        .interface_class = USB_CLASS_HUB,
    67         .interface_subclass = 0,
    68         .interface_protocol = 0,
    6963        .flags = 0
    7064};
    71 
    72 int usb_hub_control_loop(void * hub_info_param){
    73         usb_hub_info_t * hub_info = (usb_hub_info_t*)hub_info_param;
    74         while(true){
    75                 usb_hub_check_hub_changes(hub_info);
    76                 async_usleep(1000 * 1000 );/// \TODO proper number once
    77         }
    78         return 0;
    79 }
    8065
    8166
     
    150135
    151136        //configuration descriptor
    152         /// \TODO check other configurations?
     137        /// \TODO check other configurations
    153138        usb_standard_configuration_descriptor_t config_descriptor;
    154139        opResult = usb_request_get_bare_configuration_descriptor(
     
    194179        }
    195180
     181        /**
     182         * Initialize the interrupt in endpoint.
     183         * \TODO this code should be checked...
     184         */
    196185        usb_endpoint_mapping_t endpoint_mapping[1] = {
    197186                {
     
    221210        return EOK;
    222211       
     212
     213        // Initialize the interrupt(=status change) endpoint.
     214        /*usb_endpoint_pipe_initialize(
     215                &result->endpoints->status_change,
     216                &result->device_connection, );USB_TRANSFER_INTERRUPT
     217        USB_DIRECTION_IN*/
     218
    223219}
    224220
     
    253249        usb_endpoint_pipe_start_session(&result->endpoints.control);
    254250        opResult = usb_request_get_descriptor(&result->endpoints.control,
    255                         USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_DEVICE,
    256                         USB_DESCTYPE_HUB,
    257                         0, 0, serialized_descriptor,
     251                        USB_REQUEST_TYPE_CLASS,
     252                        USB_DESCTYPE_HUB, 0, 0, serialized_descriptor,
    258253                        USB_HUB_MAX_DESCRIPTOR_SIZE, &received_size);
    259254        usb_endpoint_pipe_end_session(&result->endpoints.control);
     
    272267        }
    273268
     269       
    274270        dprintf(USB_LOG_LEVEL_INFO, "setting port count to %d",descriptor->ports_count);
    275271        result->port_count = descriptor->ports_count;
     
    333329
    334330        //add the hub to list
    335         //is this needed now?
    336331        fibril_mutex_lock(&usb_hub_list_lock);
    337332        usb_lst_append(&usb_hub_list, hub_info);
    338333        fibril_mutex_unlock(&usb_hub_list_lock);
     334
    339335        dprintf(USB_LOG_LEVEL_DEBUG, "hub info added to list");
    340 
    341         dprintf(USB_LOG_LEVEL_DEBUG, "adding to ddf");
    342         ddf_fun_t *hub_fun = ddf_fun_create(dev, fun_exposed, "hub");
    343         assert(hub_fun != NULL);
    344         hub_fun->ops = NULL;
    345 
    346         int rc = ddf_fun_bind(hub_fun);
    347         assert(rc == EOK);
    348         rc = ddf_fun_add_to_class(hub_fun, "hub");
    349         assert(rc == EOK);
    350 
    351         fid_t fid = fibril_create(usb_hub_control_loop, hub_info);
    352         if (fid == 0) {
    353                 dprintf(USB_LOG_LEVEL_ERROR,
    354                                 ": failed to start monitoring fibril for new hub");
    355                 return ENOMEM;
    356         }
    357         fibril_add_ready(fid);
    358 
    359         dprintf(USB_LOG_LEVEL_DEBUG, "hub fibril created");
    360336        //(void)hub_info;
    361         //usb_hub_check_hub_changes();
     337        usb_hub_check_hub_changes();
    362338       
    363339        dprintf(USB_LOG_LEVEL_INFO, "hub dev added");
     
    392368        //opResult = usb_drv_reserve_default_address(hc);
    393369        opResult = usb_hc_reserve_default_address(&hub->connection, USB_SPEED_LOW);
    394        
    395         if (opResult != EOK) {
    396                 dprintf(USB_LOG_LEVEL_WARNING,
    397                                 "cannot assign default address, it is probably used %d",opResult);
     370
     371        if (opResult != EOK) {
     372                dprintf(USB_LOG_LEVEL_WARNING, "cannot assign default address, it is probably used");
    398373                return;
    399374        }
     
    406381                        );
    407382        if (opResult != EOK) {
    408                 dprintf(USB_LOG_LEVEL_ERROR,
    409                                 "something went wrong when reseting a port %d",opResult);
     383                dprintf(USB_LOG_LEVEL_ERROR, "something went wrong when reseting a port");
    410384                //usb_hub_release_default_address(hc);
    411385                usb_hc_release_default_address(&hub->connection);
     
    420394 */
    421395static void usb_hub_finalize_add_device( usb_hub_info_t * hub,
    422                 uint16_t port, bool isLowSpeed) {
     396                uint16_t port) {
    423397
    424398        int opResult;
     
    443417                        &new_device_connection);
    444418        /// \TODO get highspeed info
    445         usb_speed_t speed = isLowSpeed?USB_SPEED_LOW:USB_SPEED_FULL;
     419
     420
     421
    446422
    447423
     
    449425        usb_address_t new_device_address = usb_hc_request_address(
    450426                        &hub->connection,
    451                         speed/// \TODO fullspeed??
     427                        USB_SPEED_LOW/// \TODO fullspeed??
    452428                        );
    453429        if (new_device_address < 0) {
     
    460436        //opResult = usb_drv_req_set_address(hc, USB_ADDRESS_DEFAULT,
    461437        //    new_device_address);
    462         usb_endpoint_pipe_start_session(&new_device_pipe);
    463438        opResult = usb_request_set_address(&new_device_pipe,new_device_address);
    464         usb_endpoint_pipe_end_session(&new_device_pipe);
    465         if (opResult != EOK) {
    466                 dprintf(USB_LOG_LEVEL_ERROR,
    467                                 "could not set address for new device %d",opResult);
     439
     440        if (opResult != EOK) {
     441                dprintf(USB_LOG_LEVEL_ERROR, "could not set address for new device");
    468442                usb_hc_release_default_address(&hub->connection);
    469443                return;
     
    484458
    485459        if (opResult != EOK) {
    486                 dprintf(USB_LOG_LEVEL_ERROR,
    487                                 "could not start driver for new device %d",opResult);
     460                dprintf(USB_LOG_LEVEL_ERROR, "could not start driver for new device");
    488461                return;
    489462        }
     
    496469                        &hub->attached_devs[port]);
    497470        if (opResult != EOK) {
    498                 dprintf(USB_LOG_LEVEL_ERROR,
    499                                 "could not assign address of device in hcd %d",opResult);
     471                dprintf(USB_LOG_LEVEL_ERROR, "could not assign address of device in hcd");
    500472                return;
    501473        }
     
    539511}
    540512
    541 
    542 /**
    543  *Process over current condition on port.
    544  *
    545  * Turn off the power on the port.
    546  *
    547  * @param hub
    548  * @param port
    549  */
    550 static void usb_hub_over_current( usb_hub_info_t * hub,
    551                 uint16_t port){
    552         int opResult;
    553         opResult = usb_hub_clear_port_feature(&hub->endpoints.control,
    554             port, USB_HUB_FEATURE_PORT_POWER);
    555         if(opResult!=EOK){
    556                 dprintf(USB_LOG_LEVEL_ERROR, "cannot power off port %d;  %d",
    557                                 port, opResult);
    558         }
    559 }
    560 
    561513/**
    562514 * Process interrupts on given hub port
     
    570522        //determine type of change
    571523        usb_endpoint_pipe_t *pipe = &hub->endpoints.control;
     524        int opResult = usb_endpoint_pipe_start_session(pipe);
    572525       
    573         int opResult;
     526        if(opResult != EOK){
     527                dprintf(USB_LOG_LEVEL_ERROR, "cannot open pipe %d", opResult);
     528        }
     529
     530        /*
     531        usb_target_t target;
     532        target.address=address;
     533        target.endpoint=0;
     534        */
    574535
    575536        usb_port_status_t status;
     
    586547                        );
    587548        if (opResult != EOK) {
    588                 dprintf(USB_LOG_LEVEL_ERROR, "could not get port status");
     549                dprintf(USB_LOG_LEVEL_ERROR, "ERROR: could not get port status");
    589550                return;
    590551        }
    591552        if (rcvd_size != sizeof (usb_port_status_t)) {
    592                 dprintf(USB_LOG_LEVEL_ERROR, "received status has incorrect size");
     553                dprintf(USB_LOG_LEVEL_ERROR, "ERROR: received status has incorrect size");
    593554                return;
    594555        }
     
    605566                }
    606567        }
    607         //over current
    608         if (usb_port_overcurrent_change(&status)) {
    609                 //check if it was not auto-resolved
    610                 if(usb_port_over_current(&status)){
    611                         usb_hub_over_current(hub,port);
    612                 }else{
    613                         dprintf(USB_LOG_LEVEL_INFO,
    614                                 "over current condition was auto-resolved on port %d",port);
    615                 }
    616         }
    617568        //port reset
    618569        if (usb_port_reset_completed(&status)) {
    619570                dprintf(USB_LOG_LEVEL_INFO, "port reset complete");
    620571                if (usb_port_enabled(&status)) {
    621                         usb_hub_finalize_add_device(hub, port, usb_port_low_speed(&status));
     572                        usb_hub_finalize_add_device(hub, port);
    622573                } else {
    623                         dprintf(USB_LOG_LEVEL_WARNING, "port reset, but port still not enabled");
     574                        dprintf(USB_LOG_LEVEL_WARNING, "ERROR: port reset, but port still not enabled");
    624575                }
    625576        }
     
    634585        }
    635586        /// \TODO handle other changes
    636 }
    637 
    638 /**
    639  * Check changes on particular hub
    640  * @param hub_info_param
    641  */
    642 void usb_hub_check_hub_changes(usb_hub_info_t * hub_info){
    643         int opResult;
    644         opResult = usb_endpoint_pipe_start_session(&hub_info->endpoints.status_change);
    645         if(opResult != EOK){
    646                 dprintf(USB_LOG_LEVEL_ERROR,
    647                                 "could not initialize communication for hub; %d", opResult);
    648                 return;
    649         }
    650 
    651         size_t port_count = hub_info->port_count;
    652 
    653         /// FIXME: count properly
    654         size_t byte_length = ((port_count+1) / 8) + 1;
     587        /// \TODO debug log for various situations
     588        usb_endpoint_pipe_end_session(pipe);
     589
     590
     591}
     592
     593/**
     594 * Check changes on all known hubs.
     595 */
     596void usb_hub_check_hub_changes(void) {
     597        /*
     598         * Iterate through all hubs.
     599         */
     600        usb_general_list_t * lst_item;
     601        fibril_mutex_lock(&usb_hub_list_lock);
     602        for (lst_item = usb_hub_list.next;
     603                        lst_item != &usb_hub_list;
     604                        lst_item = lst_item->next) {
     605                fibril_mutex_unlock(&usb_hub_list_lock);
     606                usb_hub_info_t * hub_info = ((usb_hub_info_t*)lst_item->data);
     607                int opResult;
     608
     609                opResult = usb_endpoint_pipe_start_session(&hub_info->endpoints.status_change);
     610                if(opResult != EOK){
     611                        continue;
     612                }
     613                /*
     614                 * Check status change pipe of this hub.
     615                 */
     616                /*
     617                usb_target_t target;
     618                target.address = hub_info->address;
     619                target.endpoint = 1;/// \TODO get from endpoint descriptor
     620                dprintf(USB_LOG_LEVEL_INFO, "checking changes for hub at addr %d",
     621                    target.address);
     622                */
     623                size_t port_count = hub_info->port_count;
     624
     625                /*
     626                 * Connect to respective HC.
     627                 *
     628                int hc = usb_drv_hc_connect_auto(hub_info->device, 0);
     629                if (hc < 0) {
     630                        continue;
     631                }*/
     632
     633                /// FIXME: count properly
     634                size_t byte_length = ((port_count+1) / 8) + 1;
     635
    655636                void *change_bitmap = malloc(byte_length);
    656         size_t actual_size;
    657 
    658         /*
    659          * Send the request.
    660          */
    661         opResult = usb_endpoint_pipe_read(
    662                         &hub_info->endpoints.status_change,
    663                         change_bitmap, byte_length, &actual_size
    664                         );
    665 
    666         if (opResult != EOK) {
     637                size_t actual_size;
     638                //usb_handle_t handle;
     639
     640                /*
     641                 * Send the request.
     642                 */
     643                opResult = usb_endpoint_pipe_read(
     644                                &hub_info->endpoints.status_change,
     645                                change_bitmap, byte_length, &actual_size
     646                                );
     647
     648                //usb_drv_async_wait_for(handle);
     649
     650                if (opResult != EOK) {
     651                        free(change_bitmap);
     652                        dprintf(USB_LOG_LEVEL_WARNING, "something went wrong while getting status of hub");
     653                        continue;
     654                }
     655                unsigned int port;
     656                for (port = 1; port < port_count+1; ++port) {
     657                        bool interrupt =
     658                                        (((uint8_t*) change_bitmap)[port / 8] >> (port % 8)) % 2;
     659                        if (interrupt) {
     660                                usb_hub_process_interrupt(
     661                                        hub_info, port);
     662                        }
     663                }
     664                usb_endpoint_pipe_end_session(&hub_info->endpoints.status_change);
    667665                free(change_bitmap);
    668                 dprintf(USB_LOG_LEVEL_WARNING, "something went wrong while getting status of hub");
    669                 usb_endpoint_pipe_end_session(&hub_info->endpoints.status_change);
    670                 return;
    671         }
    672         unsigned int port;
    673         opResult = usb_endpoint_pipe_start_session(&hub_info->endpoints.control);
    674         if(opResult!=EOK){
    675                 dprintf(USB_LOG_LEVEL_ERROR, "could not start control pipe session %d",
    676                                 opResult);
    677                 usb_endpoint_pipe_end_session(&hub_info->endpoints.status_change);
    678                 return;
    679         }
    680         opResult = usb_hc_connection_open(&hub_info->connection);
    681         if(opResult!=EOK){
    682                 dprintf(USB_LOG_LEVEL_ERROR, "could not start host controller session %d",
    683                                 opResult);
    684                 usb_endpoint_pipe_end_session(&hub_info->endpoints.control);
    685                 usb_endpoint_pipe_end_session(&hub_info->endpoints.status_change);
    686                 return;
    687         }
    688 
    689         ///todo, opresult check, pre obe konekce
    690         for (port = 1; port < port_count+1; ++port) {
    691                 bool interrupt =
    692                                 (((uint8_t*) change_bitmap)[port / 8] >> (port % 8)) % 2;
    693                 if (interrupt) {
    694                         usb_hub_process_interrupt(
    695                                 hub_info, port);
    696                 }
    697         }
    698         usb_hc_connection_close(&hub_info->connection);
    699         usb_endpoint_pipe_end_session(&hub_info->endpoints.control);
    700         usb_endpoint_pipe_end_session(&hub_info->endpoints.status_change);
    701         free(change_bitmap);
    702 }
     666               
     667
     668                //async_hangup(hc);
     669                fibril_mutex_lock(&usb_hub_list_lock);
     670        }
     671        fibril_mutex_unlock(&usb_hub_list_lock);
     672}
     673
     674
    703675
    704676
  • uspace/drv/usbhub/usbhub.h

    r51b46f2 r0e3505a  
    7575/**
    7676 * function running the hub-controlling loop.
    77  * @param hub_info_param hub info pointer
     77 * @param noparam fundtion does not need any parameters
    7878 */
    79 int usb_hub_control_loop(void * hub_info_param);
     79int usb_hub_control_loop(void * noparam);
    8080
    8181/** Callback when new hub device is detected.
     
    8787
    8888/**
    89  * check changes on specified hub
    90  * @param hub_info_param pointer to usb_hub_info_t structure
     89 * check changes on all registered hubs
    9190 */
    92 void usb_hub_check_hub_changes(usb_hub_info_t * hub_info_param);
     91void usb_hub_check_hub_changes(void);
    9392
    9493
     94//int usb_add_hub_device(device_t *);
    9595
    9696
  • uspace/lib/usb/include/usb/classes/hid.h

    r51b46f2 r0e3505a  
    5151} usb_hid_request_t;
    5252
    53 typedef enum {
    54         USB_HID_REPORT_TYPE_INPUT = 1,
    55         USB_HID_REPORT_TYPE_OUTPUT = 2,
    56         USB_HID_REPORT_TYPE_FEATURE = 3
    57 } usb_hid_report_type_t;
    58 
    59 typedef enum {
    60         USB_HID_PROTOCOL_BOOT = 0,
    61         USB_HID_PROTOCOL_REPORT = 1
    62 } usb_hid_protocol_t;
    63 
    6453/** USB/HID subclass constants. */
    6554typedef enum {
     
    7362        USB_HID_PROTOCOL_KEYBOARD = 1,
    7463        USB_HID_PROTOCOL_MOUSE = 2
    75 } usb_hid_iface_protocol_t;
     64} usb_hid_protocol_t;
    7665
    7766/** Part of standard USB HID descriptor specifying one class descriptor.
  • uspace/lib/usb/include/usb/classes/hidparser.h

    r51b46f2 r0e3505a  
    7070} usb_hid_report_in_callbacks_t;
    7171
    72 
    73 typedef enum {
    74         USB_HID_MOD_LCTRL = 0x01,
    75         USB_HID_MOD_LSHIFT = 0x02,
    76         USB_HID_MOD_LALT = 0x04,
    77         USB_HID_MOD_LGUI = 0x08,
    78         USB_HID_MOD_RCTRL = 0x10,
    79         USB_HID_MOD_RSHIFT = 0x20,
    80         USB_HID_MOD_RALT = 0x40,
    81         USB_HID_MOD_RGUI = 0x80,
    82         USB_HID_MOD_COUNT = 8
    83 } usb_hid_modifiers_t;
    84 
    85 typedef enum {
    86         USB_HID_LED_NUM_LOCK = 0x1,
    87         USB_HID_LED_CAPS_LOCK = 0x2,
    88         USB_HID_LED_SCROLL_LOCK = 0x4,
    89         USB_HID_LED_COMPOSE = 0x8,
    90         USB_HID_LED_KANA = 0x10,
    91         USB_HID_LED_COUNT = 5
    92 } usb_hid_led_t;
    93 
    94 static const usb_hid_modifiers_t
    95     usb_hid_modifiers_consts[USB_HID_MOD_COUNT] = {
    96         USB_HID_MOD_LCTRL,
    97         USB_HID_MOD_LSHIFT,
    98         USB_HID_MOD_LALT,
    99         USB_HID_MOD_LGUI,
    100         USB_HID_MOD_RCTRL,
    101         USB_HID_MOD_RSHIFT,
    102         USB_HID_MOD_RALT,
    103         USB_HID_MOD_RGUI
    104 };
    105 
    106 //static const usb_hid_led_t usb_hid_led_consts[USB_HID_LED_COUNT] = {
    107 //      USB_HID_LED_NUM_LOCK,
    108 //      USB_HID_LED_CAPS_LOCK,
    109 //      USB_HID_LED_SCROLL_LOCK,
    110 //      USB_HID_LED_COMPOSE,
    111 //      USB_HID_LED_KANA
    112 //};
    113 
    114 //#define USB_HID_BOOT_KEYBOARD_NUM_LOCK                0x01
    115 //#define USB_HID_BOOT_KEYBOARD_CAPS_LOCK               0x02
    116 //#define USB_HID_BOOT_KEYBOARD_SCROLL_LOCK     0x04
    117 //#define USB_HID_BOOT_KEYBOARD_COMPOSE         0x08
    118 //#define USB_HID_BOOT_KEYBOARD_KANA                    0x10
     72#define USB_HID_BOOT_KEYBOARD_NUM_LOCK          0x01
     73#define USB_HID_BOOT_KEYBOARD_CAPS_LOCK         0x02
     74#define USB_HID_BOOT_KEYBOARD_SCROLL_LOCK       0x04
     75#define USB_HID_BOOT_KEYBOARD_COMPOSE           0x08
     76#define USB_HID_BOOT_KEYBOARD_KANA                      0x10
    11977
    12078/*
  • uspace/lib/usb/include/usb/request.h

    r51b46f2 r0e3505a  
    9696int usb_request_set_address(usb_endpoint_pipe_t *, usb_address_t);
    9797int usb_request_get_descriptor(usb_endpoint_pipe_t *, usb_request_type_t,
    98     usb_request_recipient_t, uint8_t, uint8_t, uint16_t, void *, size_t,
    99     size_t *);
     98    uint8_t, uint8_t, uint16_t, void *, size_t, size_t *);
    10099int usb_request_get_descriptor_alloc(usb_endpoint_pipe_t *, usb_request_type_t,
    101     usb_request_recipient_t, uint8_t, uint8_t, uint16_t, void **, size_t *);
     100    uint8_t, uint8_t, uint16_t, void **, size_t *);
    102101int usb_request_get_device_descriptor(usb_endpoint_pipe_t *,
    103102    usb_standard_device_descriptor_t *);
  • uspace/lib/usb/src/hidparser.c

    r51b46f2 r0e3505a  
    144144int usb_hid_boot_keyboard_output_report(uint8_t leds, uint8_t *data, size_t size)
    145145{
    146         if (size < 1){
     146        if(size != 1){
    147147                return -1;
    148148        }
    149149
    150         data[0] = leds;
     150        /* used only first five bits, others are only padding*/
     151        *data = leds;
    151152        return EOK;
    152153}
  • uspace/lib/usb/src/request.c

    r51b46f2 r0e3505a  
    3636#include <errno.h>
    3737#include <assert.h>
    38 #include <usb/debug.h>
    3938
    4039#define MAX_DATA_LENGTH ((size_t)(0xFFFF))
     
    210209 */
    211210int usb_request_get_descriptor(usb_endpoint_pipe_t *pipe,
    212     usb_request_type_t request_type, usb_request_recipient_t recipient,
     211    usb_request_type_t request_type,
    213212    uint8_t descriptor_type, uint8_t descriptor_index,
    214213    uint16_t language,
     
    225224
    226225        return usb_control_request_get(pipe,
    227             request_type, recipient,
     226            request_type, USB_REQUEST_RECIPIENT_DEVICE,
    228227            USB_DEVREQ_GET_DESCRIPTOR,
    229228            wValue, language,
     
    243242 */
    244243int usb_request_get_descriptor_alloc(usb_endpoint_pipe_t * pipe,
    245     usb_request_type_t request_type, usb_request_recipient_t recipient,
     244    usb_request_type_t request_type,
    246245    uint8_t descriptor_type, uint8_t descriptor_index,
    247246    uint16_t language,
     
    259258        uint8_t tmp_buffer[1];
    260259        size_t bytes_transfered;
    261         rc = usb_request_get_descriptor(pipe, request_type, recipient,
     260        rc = usb_request_get_descriptor(pipe, request_type,
    262261            descriptor_type, descriptor_index, language,
    263262            &tmp_buffer, 1, &bytes_transfered);
     
    284283        }
    285284
    286         rc = usb_request_get_descriptor(pipe, request_type, recipient,
     285        rc = usb_request_get_descriptor(pipe, request_type,
    287286            descriptor_type, descriptor_index, language,
    288287            buffer, size, &bytes_transfered);
     
    321320        usb_standard_device_descriptor_t descriptor_tmp;
    322321        int rc = usb_request_get_descriptor(pipe,
    323             USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE,
    324             USB_DESCTYPE_DEVICE, 0, 0,
     322            USB_REQUEST_TYPE_STANDARD, USB_DESCTYPE_DEVICE,
     323            0, 0,
    325324            &descriptor_tmp, sizeof(descriptor_tmp),
    326325            &actually_transferred);
     
    367366        usb_standard_configuration_descriptor_t descriptor_tmp;
    368367        int rc = usb_request_get_descriptor(pipe,
    369             USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE,
    370             USB_DESCTYPE_CONFIGURATION, index, 0,
     368            USB_REQUEST_TYPE_STANDARD, USB_DESCTYPE_CONFIGURATION,
     369            index, 0,
    371370            &descriptor_tmp, sizeof(descriptor_tmp),
    372371            &actually_transferred);
     
    407406
    408407        return usb_request_get_descriptor(pipe,
    409             USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE,
    410             USB_DESCTYPE_CONFIGURATION, index, 0,
     408            USB_REQUEST_TYPE_STANDARD, USB_DESCTYPE_CONFIGURATION,
     409            index, 0,
    411410            descriptor, descriptor_size, actual_size);
    412411}
     
    453452        size_t string_descriptor_size = 0;
    454453        rc = usb_request_get_descriptor_alloc(pipe,
    455             USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE,
    456             USB_DESCTYPE_STRING, 0, 0,
     454            USB_REQUEST_TYPE_STANDARD, USB_DESCTYPE_STRING, 0, 0,
    457455            (void **) &string_descriptor, &string_descriptor_size);
    458456        if (rc != EOK) {
     
    537535        size_t string_size;
    538536        rc = usb_request_get_descriptor_alloc(pipe,
    539             USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE,
    540             USB_DESCTYPE_STRING, index, uint16_host2usb(lang),
     537            USB_REQUEST_TYPE_STANDARD, USB_DESCTYPE_STRING,
     538            index, uint16_host2usb(lang),
    541539            (void **) &string, &string_size);
    542540        if (rc != EOK) {
Note: See TracChangeset for help on using the changeset viewer.