Changeset 5da18c7 in mainline


Ignore:
Timestamp:
2011-05-30T18:41:16Z (13 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
109d55c
Parents:
a2a3763 (diff), 8c74d15 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge development/ changes

Location:
uspace
Files:
1 added
19 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/mkbd/main.c

    ra2a3763 r5da18c7  
    7171                usb_hid_free_report(*report);
    7272                *report = NULL;
    73                 printf("usb_hid_report_init() failed.\n");
     73                //printf("usb_hid_report_init() failed.\n");
    7474                return rc;
    7575        }
     
    8282                usb_hid_free_report(*report);
    8383                *report = NULL;
    84                 printf("usbhid_dev_get_report_descriptor_length() failed.\n");
     84                //printf("usbhid_dev_get_report_descriptor_length() failed.\n");
    8585                return rc;
    8686        }
     
    8989                usb_hid_free_report(*report);
    9090                *report = NULL;
    91                 printf("usbhid_dev_get_report_descriptor_length() returned 0.\n");
     91                //printf("usbhid_dev_get_report_descriptor_length() returned 0.\n");
    9292                return EINVAL;  // TODO: other error code?
    9393        }
     
    108108                *report = NULL;
    109109                free(desc);
    110                 printf("usbhid_dev_get_report_descriptor() failed.\n");
     110                //printf("usbhid_dev_get_report_descriptor() failed.\n");
    111111                return rc;
    112112        }
     
    116116                *report = NULL;
    117117                free(desc);
    118                 printf("usbhid_dev_get_report_descriptor() returned wrong size:"
    119                     " %zu, expected: %zu.\n", actual_size, report_desc_size);
     118//              printf("usbhid_dev_get_report_descriptor() returned wrong size:"
     119//                  " %zu, expected: %zu.\n", actual_size, report_desc_size);
    120120                return EINVAL;  // TODO: other error code?
    121121        }
     
    128128        if (rc != EOK) {
    129129                free(desc);
    130                 printf("usb_hid_parse_report_descriptor() failed.\n");
     130//              printf("usb_hid_parse_report_descriptor() failed.\n");
    131131                return rc;
    132132        }
     
    213213       
    214214        char *devpath = argv[1];
    215         //const char *devpath = "/hw/pci0/00:06.0/ohci-rh/usb00_a2/HID1/hid";
    216        
    217         int rc;
    218215       
    219216        devman_handle_t dev_handle = 0;
    220         rc = devman_device_get_handle(devpath, &dev_handle, 0);
    221         if (rc != EOK) {
    222                 printf("Failed to get handle from devman: %s.\n",
     217       
     218        int rc = usb_resolve_device_handle(devpath, NULL, NULL, &dev_handle);
     219        if (rc != EOK) {
     220                printf("Device not found or not of USB kind: %s.\n",
    223221                    str_error(rc));
    224222                return rc;
  • uspace/drv/ehci-hcd/main.c

    ra2a3763 r5da18c7  
    7575}
    7676
    77         uintptr_t mem_reg_base = 0;
    78         size_t mem_reg_size = 0;
     77        uintptr_t reg_base = 0;
     78        size_t reg_size = 0;
    7979        int irq = 0;
    8080
    81         int ret =
    82             pci_get_my_registers(device, &mem_reg_base, &mem_reg_size, &irq);
     81        int ret = pci_get_my_registers(device, &reg_base, &reg_size, &irq);
    8382        CHECK_RET_RETURN(ret,
    8483            "Failed to get memory addresses for %" PRIun ": %s.\n",
    8584            device->handle, str_error(ret));
    8685        usb_log_info("Memory mapped regs at 0x%" PRIxn " (size %zu), IRQ %d.\n",
    87             mem_reg_base, mem_reg_size, irq);
     86            reg_base, reg_size, irq);
    8887
    89         ret = pci_disable_legacy(device);
     88        ret = pci_disable_legacy(device, reg_base, reg_size, irq);
    9089        CHECK_RET_RETURN(ret,
    9190            "Failed(%d) disable legacy USB: %s.\n", ret, str_error(ret));
  • uspace/drv/ehci-hcd/pci.c

    ra2a3763 r5da18c7  
    5555#define CMD_OFFSET 0x0
    5656#define STS_OFFSET 0x4
     57#define INT_OFFSET 0x8
    5758#define CFG_OFFSET 0x40
    5859
    5960#define USBCMD_RUN 1
     61#define USBSTS_HALTED (1 << 12)
    6062
    6163#define USBLEGSUP_OFFSET 0
     
    6466#define USBLEGCTLSTS_OFFSET 4
    6567
    66 #define DEFAULT_WAIT 10000
     68#define DEFAULT_WAIT 1000
    6769#define WAIT_STEP 10
     70
     71#define PCI_READ(size) \
     72do { \
     73        const int parent_phone = \
     74            devman_parent_device_connect(dev->handle, IPC_FLAG_BLOCKING);\
     75        if (parent_phone < 0) {\
     76                return parent_phone; \
     77        } \
     78        sysarg_t add = (sysarg_t)address; \
     79        sysarg_t val; \
     80        const int ret = \
     81            async_req_2_1(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE), \
     82                IPC_M_CONFIG_SPACE_READ_##size, add, &val); \
     83        assert(value); \
     84        *value = val; \
     85        async_hangup(parent_phone); \
     86        return ret; \
     87} while(0)
     88
     89static int pci_read32(const ddf_dev_t *dev, int address, uint32_t *value)
     90{
     91        PCI_READ(32);
     92}
     93static int pci_read16(const ddf_dev_t *dev, int address, uint16_t *value)
     94{
     95        PCI_READ(16);
     96}
     97static int pci_read8(const ddf_dev_t *dev, int address, uint8_t *value)
     98{
     99        PCI_READ(8);
     100}
     101#define PCI_WRITE(size) \
     102do { \
     103        const int parent_phone = \
     104            devman_parent_device_connect(dev->handle, IPC_FLAG_BLOCKING);\
     105        if (parent_phone < 0) {\
     106                return parent_phone; \
     107        } \
     108        sysarg_t add = (sysarg_t)address; \
     109        sysarg_t val = value; \
     110        const int ret = \
     111            async_req_3_0(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE), \
     112                IPC_M_CONFIG_SPACE_WRITE_##size, add, val); \
     113        async_hangup(parent_phone); \
     114        return ret; \
     115} while(0)
     116
     117static int pci_write32(const ddf_dev_t *dev, int address, uint32_t value)
     118{
     119        PCI_WRITE(32);
     120}
     121static int pci_write16(const ddf_dev_t *dev, int address, uint16_t value)
     122{
     123        PCI_WRITE(16);
     124}
     125static int pci_write8(const ddf_dev_t *dev, int address, uint8_t value)
     126{
     127        PCI_WRITE(8);
     128}
    68129
    69130/** Get address of registers and IRQ for given device.
     
    75136 * @return Error code.
    76137 */
    77 int pci_get_my_registers(ddf_dev_t *dev,
     138int pci_get_my_registers(const ddf_dev_t *dev,
    78139    uintptr_t *mem_reg_address, size_t *mem_reg_size, int *irq_no)
    79140{
    80141        assert(dev != NULL);
    81142
    82         int parent_phone = devman_parent_device_connect(dev->handle,
    83             IPC_FLAG_BLOCKING);
     143        const int parent_phone =
     144            devman_parent_device_connect(dev->handle, IPC_FLAG_BLOCKING);
    84145        if (parent_phone < 0) {
    85146                return parent_phone;
     
    145206 * @return Error code.
    146207 */
    147 int pci_enable_interrupts(ddf_dev_t *device)
    148 {
    149         int parent_phone =
     208int pci_enable_interrupts(const ddf_dev_t *device)
     209{
     210        const int parent_phone =
    150211            devman_parent_device_connect(device->handle, IPC_FLAG_BLOCKING);
    151212        if (parent_phone < 0) {
    152213                return parent_phone;
    153214        }
    154         bool enabled = hw_res_enable_interrupt(parent_phone);
     215        const bool enabled = hw_res_enable_interrupt(parent_phone);
    155216        async_hangup(parent_phone);
    156217        return enabled ? EOK : EIO;
     
    162223 * @return Error code.
    163224 */
    164 int pci_disable_legacy(ddf_dev_t *device)
     225int pci_disable_legacy(
     226    const ddf_dev_t *device, uintptr_t reg_base, size_t reg_size, int irq)
    165227{
    166228        assert(device);
    167         int parent_phone = devman_parent_device_connect(device->handle,
    168                 IPC_FLAG_BLOCKING);
    169         if (parent_phone < 0) {
    170                 return parent_phone;
    171         }
    172 
    173 #define CHECK_RET_HANGUP_RETURN(ret, message...) \
     229        (void) pci_read16;
     230        (void) pci_read8;
     231        (void) pci_write16;
     232
     233#define CHECK_RET_RETURN(ret, message...) \
    174234        if (ret != EOK) { \
    175235                usb_log_error(message); \
    176                 async_hangup(parent_phone); \
    177236                return ret; \
    178237        } else (void)0
    179238
    180 
    181         /* read register space BASE BAR */
    182         sysarg_t address = 0x10;
    183         sysarg_t value;
    184 
    185         int ret = async_req_2_1(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
    186             IPC_M_CONFIG_SPACE_READ_32, address, &value);
    187         CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) to read PCI config space.\n",
    188             ret);
    189         usb_log_info("Register space BAR at %p:%" PRIxn ".\n",
    190             (void *) address, value);
    191 
    192         /* clear lower byte, it's not part of the BASE address */
    193         uintptr_t registers = (value & 0xffffff00);
    194         usb_log_info("Memory registers BASE address:%p.\n", (void *) registers);
    195 
    196         /* if nothing setup the hc, we don't need to turn it off */
    197         if (registers == 0)
    198                 return ENOTSUP;
    199 
    200         /* map EHCI registers */
    201         void *regs = as_get_mappable_page(4096);
    202         ret = physmem_map((void*)(registers & PAGE_SIZE_MASK), regs, 1,
    203             AS_AREA_READ | AS_AREA_WRITE);
    204         CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) to map registers %p:%p.\n",
    205             ret, regs, (void *) registers);
    206 
    207         /* calculate value of BASE */
    208         registers = (registers & 0xf00) | (uintptr_t)regs;
     239        /* Map EHCI registers */
     240        void *regs = NULL;
     241        int ret = pio_enable((void*)reg_base, reg_size, &regs);
     242        CHECK_RET_RETURN(ret, "Failed(%d) to map registers %p.\n",
     243            ret, (void *) reg_base);
    209244
    210245        const uint32_t hcc_params =
    211             *(uint32_t*)(registers + HCC_PARAMS_OFFSET);
     246            *(uint32_t*)(regs + HCC_PARAMS_OFFSET);
    212247        usb_log_debug("Value of hcc params register: %x.\n", hcc_params);
    213248
    214249        /* Read value of EHCI Extended Capabilities Pointer
    215          * (points to PCI config space) */
    216         uint32_t eecp =
     250         * position of EEC registers (points to PCI config space) */
     251        const uint32_t eecp =
    217252            (hcc_params >> HCC_PARAMS_EECP_OFFSET) & HCC_PARAMS_EECP_MASK;
    218253        usb_log_debug("Value of EECP: %x.\n", eecp);
    219254
    220         /* Read the second EEC. i.e. Legacy Support and Control register */
    221         /* TODO: Check capability type here */
    222         ret = async_req_2_1(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
    223             IPC_M_CONFIG_SPACE_READ_32, eecp + USBLEGCTLSTS_OFFSET, &value);
    224         CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) to read USBLEGCTLSTS.\n", ret);
    225         usb_log_debug("USBLEGCTLSTS: %" PRIxn ".\n", value);
    226 
    227255        /* Read the first EEC. i.e. Legacy Support register */
    228         /* TODO: Check capability type here */
    229         ret = async_req_2_1(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
    230             IPC_M_CONFIG_SPACE_READ_32, eecp + USBLEGSUP_OFFSET, &value);
    231         CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) to read USBLEGSUP.\n", ret);
    232         usb_log_debug2("USBLEGSUP: %" PRIxn ".\n", value);
     256        uint32_t usblegsup;
     257        ret = pci_read32(device, eecp + USBLEGSUP_OFFSET, &usblegsup);
     258        CHECK_RET_RETURN(ret, "Failed(%d) to read USBLEGSUP.\n", ret);
     259        usb_log_debug("USBLEGSUP: %" PRIxn ".\n", usblegsup);
    233260
    234261        /* Request control from firmware/BIOS, by writing 1 to highest byte.
    235262         * (OS Control semaphore)*/
    236         ret = async_req_3_0(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
    237            IPC_M_CONFIG_SPACE_WRITE_8, eecp + USBLEGSUP_OFFSET + 3, 1);
    238         CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) to request OS EHCI control.\n",
    239             ret);
     263        usb_log_debug("Requesting OS control.\n");
     264        ret = pci_write8(device, eecp + USBLEGSUP_OFFSET + 3, 1);
     265        CHECK_RET_RETURN(ret, "Failed(%d) to request OS EHCI control.\n", ret);
    240266
    241267        size_t wait = 0;
    242268        /* Wait for BIOS to release control. */
    243         while ((wait < DEFAULT_WAIT) && (value & USBLEGSUP_BIOS_CONTROL)) {
     269        ret = pci_read32(device, eecp + USBLEGSUP_OFFSET, &usblegsup);
     270        while ((wait < DEFAULT_WAIT) && (usblegsup & USBLEGSUP_BIOS_CONTROL)) {
    244271                async_usleep(WAIT_STEP);
    245                 ret = async_req_2_1(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
    246                     IPC_M_CONFIG_SPACE_READ_32, eecp + USBLEGSUP_OFFSET, &value);
     272                ret = pci_read32(device, eecp + USBLEGSUP_OFFSET, &usblegsup);
    247273                wait += WAIT_STEP;
    248274        }
    249275
    250276
    251         if ((value & USBLEGSUP_BIOS_CONTROL) == 0) {
     277        if ((usblegsup & USBLEGSUP_BIOS_CONTROL) == 0) {
    252278                usb_log_info("BIOS released control after %zu usec.\n", wait);
    253279        } else {
     
    255281                usb_log_warning( "BIOS failed to release control after "
    256282                    "%zu usecs, force it.\n", wait);
    257                 ret = async_req_3_0(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
    258                     IPC_M_CONFIG_SPACE_WRITE_32, eecp + USBLEGSUP_OFFSET,
     283                ret = pci_write32(device, eecp + USBLEGSUP_OFFSET,
    259284                    USBLEGSUP_OS_CONTROL);
    260                 CHECK_RET_HANGUP_RETURN(ret,
    261                     "Failed(%d) to force OS EHCI control.\n", ret);
    262         }
    263 
    264         /* Zero SMI enables in legacy control register.
    265          * It would prevent pre-OS code from interfering. */
    266         ret = async_req_3_0(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
    267            IPC_M_CONFIG_SPACE_WRITE_32, eecp + USBLEGCTLSTS_OFFSET,
    268            0xe0000000);
    269         CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) zero USBLEGCTLSTS.\n", ret);
    270 
    271         /* Read again Legacy Support and Control register */
    272         ret = async_req_2_1(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
    273             IPC_M_CONFIG_SPACE_READ_32, eecp + USBLEGCTLSTS_OFFSET, &value);
    274         CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) to read USBLEGCTLSTS.\n", ret);
    275         usb_log_debug2("USBLEGCTLSTS: %" PRIxn ".\n", value);
     285                CHECK_RET_RETURN(ret, "Failed(%d) to force OS control.\n", ret);
     286                /* Check capability type here, A value of 01h
     287                 * identifies the capability as Legacy Support.
     288                 * This extended capability requires one
     289                 * additional 32-bit register for control/status information,
     290                 * and this register is located at offset EECP+04h
     291                 * */
     292                if ((usblegsup & 0xff) == 1) {
     293                        /* Read the second EEC
     294                         * Legacy Support and Control register */
     295                        uint32_t usblegctlsts;
     296                        ret = pci_read32(
     297                            device, eecp + USBLEGCTLSTS_OFFSET, &usblegctlsts);
     298                        CHECK_RET_RETURN(ret,
     299                            "Failed(%d) to get USBLEGCTLSTS.\n", ret);
     300                        usb_log_debug("USBLEGCTLSTS: %" PRIxn ".\n",
     301                            usblegctlsts);
     302                        /* Zero SMI enables in legacy control register.
     303                         * It should prevent pre-OS code from interfering. */
     304                        ret = pci_write32(device, eecp + USBLEGCTLSTS_OFFSET,
     305                            0xe0000000); /* three upper bits are WC */
     306                        CHECK_RET_RETURN(ret,
     307                            "Failed(%d) zero USBLEGCTLSTS.\n", ret);
     308                        udelay(10);
     309                        ret = pci_read32(
     310                            device, eecp + USBLEGCTLSTS_OFFSET, &usblegctlsts);
     311                        CHECK_RET_RETURN(ret,
     312                            "Failed(%d) to get USBLEGCTLSTS 2.\n", ret);
     313                        usb_log_debug("Zeroed USBLEGCTLSTS: %" PRIxn ".\n",
     314                            usblegctlsts);
     315                }
     316        }
     317
    276318
    277319        /* Read again Legacy Support register */
    278         ret = async_req_2_1(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE),
    279             IPC_M_CONFIG_SPACE_READ_32, eecp + USBLEGSUP_OFFSET, &value);
    280         CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) to read USBLEGSUP.\n", ret);
    281         usb_log_debug2("USBLEGSUP: %" PRIxn ".\n", value);
     320        ret = pci_read32(device, eecp + USBLEGSUP_OFFSET, &usblegsup);
     321        CHECK_RET_RETURN(ret, "Failed(%d) to read USBLEGSUP.\n", ret);
     322        usb_log_debug("USBLEGSUP: %" PRIxn ".\n", usblegsup);
    282323
    283324        /*
     
    286327
    287328        /* Get size of capability registers in memory space. */
    288         uint8_t operation_offset = *(uint8_t*)registers;
     329        const unsigned operation_offset = *(uint8_t*)regs;
    289330        usb_log_debug("USBCMD offset: %d.\n", operation_offset);
    290331
    291332        /* Zero USBCMD register. */
    292333        volatile uint32_t *usbcmd =
    293             (uint32_t*)((uint8_t*)registers + operation_offset + CMD_OFFSET);
     334            (uint32_t*)((uint8_t*)regs + operation_offset + CMD_OFFSET);
    294335        volatile uint32_t *usbsts =
    295             (uint32_t*)((uint8_t*)registers + operation_offset + STS_OFFSET);
    296         volatile uint32_t *usbconfigured =
    297             (uint32_t*)((uint8_t*)registers + operation_offset + CFG_OFFSET);
     336            (uint32_t*)((uint8_t*)regs + operation_offset + STS_OFFSET);
     337        volatile uint32_t *usbconf =
     338            (uint32_t*)((uint8_t*)regs + operation_offset + CFG_OFFSET);
     339        volatile uint32_t *usbint =
     340            (uint32_t*)((uint8_t*)regs + operation_offset + INT_OFFSET);
    298341        usb_log_debug("USBCMD value: %x.\n", *usbcmd);
    299342        if (*usbcmd & USBCMD_RUN) {
     343                *usbsts = 0x3f; /* ack all interrupts */
     344                *usbint = 0; /* disable all interrutps */
     345                *usbconf = 0; /* relase control of RH ports */
     346
    300347                *usbcmd = 0;
    301                 while (!(*usbsts & (1 << 12))); /*wait until hc is halted */
    302                 *usbconfigured = 0;
     348                /* Wait until hc is halted */
     349                while ((*usbsts & USBSTS_HALTED) == 0);
    303350                usb_log_info("EHCI turned off.\n");
    304351        } else {
    305352                usb_log_info("EHCI was not running.\n");
    306353        }
    307         usb_log_debug("Registers: %x(0x00080000):%x(0x00001000):%x(0x0).\n",
    308             *usbcmd, *usbsts, *usbconfigured);
    309 
    310         async_hangup(parent_phone);
     354        usb_log_debug("Registers: \n"
     355            "\t USBCMD: %x(0x00080000 = at least 1ms between interrupts)\n"
     356            "\t USBSTS: %x(0x00001000 = HC halted)\n"
     357            "\t USBINT: %x(0x0 = no interrupts).\n"
     358            "\t CONFIG: %x(0x0 = ports controlled by companion hc).\n",
     359            *usbcmd, *usbsts, *usbint, *usbconf);
     360
    311361        return ret;
    312 #undef CHECK_RET_HANGUP_RETURN
     362#undef CHECK_RET_RETURN
    313363}
    314364/*----------------------------------------------------------------------------*/
  • uspace/drv/ehci-hcd/pci.h

    ra2a3763 r5da18c7  
    3838#include <ddf/driver.h>
    3939
    40 int pci_get_my_registers(ddf_dev_t *, uintptr_t *, size_t *, int *);
    41 int pci_enable_interrupts(ddf_dev_t *);
    42 int pci_disable_legacy(ddf_dev_t *);
     40int pci_get_my_registers(const ddf_dev_t *, uintptr_t *, size_t *, int *);
     41int pci_enable_interrupts(const ddf_dev_t *);
     42int pci_disable_legacy(const ddf_dev_t *, uintptr_t, size_t, int);
    4343
    4444#endif
  • uspace/drv/ohci/root_hub.c

    ra2a3763 r5da18c7  
    5757        .device_version = 0,
    5858        .length = sizeof (usb_standard_device_descriptor_t),
    59         /// \TODO this value is guessed
    6059        .max_packet_size = 8,
    6160        .vendor_id = 0x16db,
     
    117116 */
    118117static const uint32_t hub_clear_feature_by_writing_one_mask =
    119    RHS_CLEAR_PORT_POWER;
     118    RHS_CLEAR_PORT_POWER;
    120119
    121120/**
     
    412411        request->transfered_size = 4;
    413412        uint32_t data = instance->registers->rh_port_status[port - 1];
    414         memcpy(request->data_buffer,&data,4);
     413        memcpy(request->data_buffer, &data, 4);
    415414#if 0
    416415        int i;
     
    445444        uint32_t data = mask & instance->registers->rh_status;
    446445        //uint32_buffer[0] = mask & instance->registers->rh_status;
    447         memcpy(request->data_buffer,&data,4);
     446        memcpy(request->data_buffer, &data, 4);
    448447
    449448        return EOK;
     
    468467
    469468        usb_hub_bm_request_type_t request_type = request_packet->request_type;
    470         if (buffer_size < 4/*request_packet->length*/) {///\TODO
     469        if (buffer_size < 4) {
    471470                usb_log_warning("requested more data than buffer size\n");
    472471                return EINVAL;
     
    499498            | (1 << (USB_HUB_FEATURE_C_HUB_OVER_CURRENT + 16));
    500499        bzero(bitmap, instance->interrupt_mask_size);
    501         if ((instance->registers->rh_status & mask) !=0 ) {
     500        if ((instance->registers->rh_status & mask) != 0) {
    502501                bitmap[0] = 1;
    503502        }
     
    678677            (instance->registers->rh_port_status[port - 1] | (1 << feature))
    679678            & (~port_clear_feature_valid_mask);
    680         /// \TODO any error?
    681 
    682679        return EOK;
    683680}
     
    707704            & (~port_clear_feature_valid_mask))
    708705            | (1 << feature);
    709         /// \TODO any error?
    710706
    711707        return EOK;
     
    925921 * @return
    926922 */
    927 static int process_interrupt_mask_in_instance(rh_t *instance, usb_transfer_batch_t * request) {
     923static int process_interrupt_mask_in_instance(rh_t *instance,
     924    usb_transfer_batch_t * request) {
    928925        memcpy(request->data_buffer, instance->interrupt_buffer,
    929926            instance->interrupt_mask_size);
     
    945942 * @return
    946943 */
    947 static bool is_zeros(void * buffer, size_t size) {
     944static bool is_zeros(void *buffer, size_t size) {
    948945        if (!buffer) return true;
    949946        if (!size) return true;
  • uspace/drv/uhci-rhd/port.h

    ra2a3763 r5da18c7  
    5555
    5656/** UHCI port structure */
    57 typedef struct uhci_port
    58 {
     57typedef struct uhci_port {
    5958        const char *id_string;
    6059        port_status_t *address;
     
    6867
    6968int uhci_port_init(
    70   uhci_port_t *port, port_status_t *address, unsigned number,
    71   unsigned usec, ddf_dev_t *rh);
     69    uhci_port_t *port, port_status_t *address, unsigned number,
     70    unsigned usec, ddf_dev_t *rh);
    7271
    7372void uhci_port_fini(uhci_port_t *port);
  • uspace/drv/usbhid/usbhid.c

    ra2a3763 r5da18c7  
    7878        }
    7979       
     80        assert(hid_dev->subdriver_count >= 0);
     81       
    8082        // set the init callback
    81         hid_dev->subdrivers[0].init = usb_kbd_init;
     83        hid_dev->subdrivers[hid_dev->subdriver_count].init = usb_kbd_init;
    8284       
    8385        // set the polling callback
    84         hid_dev->subdrivers[0].poll = usb_kbd_polling_callback;
     86        hid_dev->subdrivers[hid_dev->subdriver_count].poll =
     87            usb_kbd_polling_callback;
    8588       
    8689        // set the polling ended callback
    87         hid_dev->subdrivers[0].poll_end = NULL;
     90        hid_dev->subdrivers[hid_dev->subdriver_count].poll_end = NULL;
    8891       
    8992        // set the deinit callback
    90         hid_dev->subdrivers[0].deinit = usb_kbd_deinit;
     93        hid_dev->subdrivers[hid_dev->subdriver_count].deinit = usb_kbd_deinit;
    9194       
    9295        // set subdriver count
    93         hid_dev->subdriver_count = 1;
     96        ++hid_dev->subdriver_count;
    9497       
    9598        return EOK;
     
    108111        }
    109112       
     113        assert(hid_dev->subdriver_count >= 0);
     114       
    110115        // set the init callback
    111         hid_dev->subdrivers[0].init = usb_mouse_init;
     116        hid_dev->subdrivers[hid_dev->subdriver_count].init = usb_mouse_init;
    112117       
    113118        // set the polling callback
    114         hid_dev->subdrivers[0].poll = usb_mouse_polling_callback;
     119        hid_dev->subdrivers[hid_dev->subdriver_count].poll =
     120            usb_mouse_polling_callback;
    115121       
    116122        // set the polling ended callback
    117         hid_dev->subdrivers[0].poll_end = NULL;
     123        hid_dev->subdrivers[hid_dev->subdriver_count].poll_end = NULL;
    118124       
    119125        // set the deinit callback
    120         hid_dev->subdrivers[0].deinit = usb_mouse_deinit;
     126        hid_dev->subdrivers[hid_dev->subdriver_count].deinit = usb_mouse_deinit;
    121127       
    122128        // set subdriver count
    123         hid_dev->subdriver_count = 1;
     129        ++hid_dev->subdriver_count;
    124130       
    125131        return EOK;
     
    138144        }
    139145       
     146        assert(hid_dev->subdriver_count >= 0);
     147       
    140148        // set the init callback
    141         hid_dev->subdrivers[0].init = usb_generic_hid_init;
     149        hid_dev->subdrivers[hid_dev->subdriver_count].init =
     150            usb_generic_hid_init;
    142151       
    143152        // set the polling callback
    144         hid_dev->subdrivers[0].poll = usb_generic_hid_polling_callback;
     153        hid_dev->subdrivers[hid_dev->subdriver_count].poll =
     154            usb_generic_hid_polling_callback;
    145155       
    146156        // set the polling ended callback
    147         hid_dev->subdrivers[0].poll_end = NULL;
     157        hid_dev->subdrivers[hid_dev->subdriver_count].poll_end = NULL;
    148158       
    149159        // set the deinit callback
    150         hid_dev->subdrivers[0].deinit = NULL;
     160        hid_dev->subdrivers[hid_dev->subdriver_count].deinit = NULL;
    151161       
    152162        // set subdriver count
    153         hid_dev->subdriver_count = 1;
     163        ++hid_dev->subdriver_count;
    154164       
    155165        return EOK;
     
    196206        }
    197207       
    198         if (mapping->report_id >= 0) {
    199                 usb_hid_report_path_set_report_id(usage_path,
    200                     mapping->report_id);
    201         }
     208//      if (mapping->report_id >= 0) {
     209//              usb_hid_report_path_set_report_id(usage_path,
     210//                  mapping->report_id);
     211//      }
    202212       
    203213        assert(hid_dev->report != NULL);
     
    206216//      size_t size = usb_hid_report_size(hid_dev->report, 0,
    207217//          USB_HID_REPORT_TYPE_INPUT);
    208         size_t size = 0;
    209         usb_hid_report_field_t *field = usb_hid_report_get_sibling (hid_dev->report,
    210                 NULL, usage_path, mapping->compare, USB_HID_REPORT_TYPE_INPUT);
    211         while(field != NULL) {
    212                 size++;
    213                 field = usb_hid_report_get_sibling (hid_dev->report,
    214                                         field, usage_path, mapping->compare,
    215                             USB_HID_REPORT_TYPE_INPUT);
    216         }
    217        
    218         usb_log_debug("Size of the input report: %zuB\n", size);
     218//      size_t size = 0;
     219       
     220        bool matches = false;
     221
     222//      usb_hid_report_description_t *report_des =
     223//              usb_hid_report_find_description(hid_dev->report,
     224//              mapping->report_id, USB_HID_REPORT_TYPE_INPUT);
     225        uint8_t report_id = mapping->report_id;
     226
     227        /*while(report_des != NULL)*/do {
     228
     229//              if((mapping->report_id) == 0 && (report_des->report_id != 0)) {
     230//                      usb_hid_report_path_set_report_id(usage_path,
     231//                              report_des->report_id);
     232//              }
     233                                             
     234                usb_log_debug("Trying report id %u\n", report_id);
     235               
     236                if (report_id != 0) {
     237                        usb_hid_report_path_set_report_id(usage_path,
     238                                report_id);
     239                }
     240
     241                usb_hid_report_field_t *field = usb_hid_report_get_sibling(
     242                    hid_dev->report,
     243                    NULL, usage_path, mapping->compare,
     244                    USB_HID_REPORT_TYPE_INPUT);
     245               
     246                usb_log_debug("Field: %p\n", field);
     247
     248                if (field != NULL) {
     249//                      size++;
     250//                      field = usb_hid_report_get_sibling(hid_dev->report,
     251//                          field, usage_path, mapping->compare,
     252//                          USB_HID_REPORT_TYPE_INPUT);
     253                        matches = true;
     254                        break;
     255                }
     256               
     257                report_id = usb_hid_get_next_report_id(
     258                    hid_dev->report, report_id,
     259                    USB_HID_REPORT_TYPE_INPUT);
     260
     261//              if((mapping->report_id == 0) && (report_des->report_id != 0)) {
     262//                      uint8_t report_id = usb_hid_get_next_report_id(
     263//                              hid_dev->report, report_des->report_id,
     264//                              USB_HID_REPORT_TYPE_INPUT);
     265
     266//                      if(report_id == 0) {
     267//                              break;
     268//                      }
     269
     270//                      report_des = usb_hid_report_find_description(
     271//                              hid_dev->report, report_id,
     272//                              USB_HID_REPORT_TYPE_INPUT);
     273//              }
     274//              else {
     275//                      break;
     276//              }
     277        } while (!matches && report_id != 0);
     278       
     279//      usb_log_debug("Size of the input report: %zu\n", size);
    219280        usb_hid_report_path_free(usage_path);
    220281       
    221         return (size > 0);
     282        return matches;
    222283}
    223284
     
    368429       
    369430        do {
     431                usb_log_debug("Getting size of the report.\n");
    370432                size = usb_hid_report_byte_size(hid_dev->report, report_id,
    371433                    USB_HID_REPORT_TYPE_INPUT);
    372434                usb_log_debug("Report ID: %u, size: %zu\n", report_id, size);
    373435                max_size = (size > max_size) ? size : max_size;
     436                usb_log_debug("Getting next report ID\n");
    374437                report_id = usb_hid_get_next_report_id(hid_dev->report,
    375438                    report_id, USB_HID_REPORT_TYPE_INPUT);
     
    501564                    hid_dev->subdriver_count);
    502565                //usb_hid_free(&hid_dev);
     566               
    503567        } else {
    504568                bool ok = false;
     
    527591        }
    528592       
    529         // save max input report size and allocate space for the report
    530         rc = usb_hid_init_report(hid_dev);
    531         if (rc != EOK) {
    532                 usb_log_error("Failed to initialize input report buffer.\n");
    533         }
     593       
     594        if (rc == EOK) {
     595                // save max input report size and allocate space for the report
     596                rc = usb_hid_init_report(hid_dev);
     597                if (rc != EOK) {
     598                        usb_log_error("Failed to initialize input report buffer"
     599                            ".\n");
     600                }
     601        }
     602       
    534603       
    535604        return rc;
     
    554623        usb_log_debug("Max input report size: %zu, buffer size: %zu\n",
    555624            hid_dev->max_input_report_size, buffer_size);
    556         assert(hid_dev->max_input_report_size >= buffer_size);
    557        
    558 //      if (/*!allocated*/
    559 //          /*|| *//*hid_dev->input_report_size < buffer_size*/) {
    560 //              uint8_t *input_old = hid_dev->input_report;
    561 //              uint8_t *input_new = (uint8_t *)malloc(buffer_size);
    562                
    563 //              if (input_new == NULL) {
    564 //                      usb_log_error("Failed to allocate space for input "
    565 //                          "buffer. This event may not be reported\n");
    566 //                      memset(hid_dev->input_report, 0,
    567 //                          hid_dev->input_report_size);
    568 //              } else {
    569 //                      memcpy(input_new, input_old,
    570 //                          hid_dev->input_report_size);
    571 //                      hid_dev->input_report = input_new;
    572 //                      if (allocated) {
    573 //                              free(input_old);
    574 //                      }
    575 //                      usb_hid_new_report();
    576 //              }
    577 //      }
    578        
    579         /*! @todo This should probably be atomic. */
    580         memcpy(hid_dev->input_report, buffer, buffer_size);
    581         hid_dev->input_report_size = buffer_size;
    582         usb_hid_new_report(hid_dev);
     625        //assert(hid_dev->max_input_report_size >= buffer_size);
     626        if (hid_dev->max_input_report_size >= buffer_size) {
     627                /*! @todo This should probably be atomic. */
     628                memcpy(hid_dev->input_report, buffer, buffer_size);
     629                hid_dev->input_report_size = buffer_size;
     630                usb_hid_new_report(hid_dev);
     631        }
    583632       
    584633        bool cont = false;
  • uspace/drv/usbhub/main.c

    ra2a3763 r5da18c7  
    8787
    8888        usb_log_enable(USB_LOG_LEVEL_DEFAULT, NAME);
    89        
     89
    9090        return usb_driver_main(&usb_hub_driver);
    9191}
  • uspace/drv/usbhub/port_status.h

    ra2a3763 r5da18c7  
    6464 */
    6565static inline void usb_hub_set_port_status_request(
    66         usb_device_request_setup_packet_t * request, uint16_t port
    67         ) {
     66    usb_device_request_setup_packet_t *request, uint16_t port) {
    6867        request->index = port;
    6968        request->request_type = USB_HUB_REQ_TYPE_GET_PORT_STATUS;
     
    7978 */
    8079static inline void usb_hub_set_hub_status_request(
    81         usb_device_request_setup_packet_t * request
    82         ) {
     80    usb_device_request_setup_packet_t *request) {
    8381        request->index = 0;
    8482        request->request_type = USB_HUB_REQ_TYPE_GET_HUB_STATUS;
     
    9593static inline usb_device_request_setup_packet_t *
    9694usb_hub_create_port_status_request(uint16_t port) {
    97         usb_device_request_setup_packet_t * result =
    98                 malloc(sizeof(usb_device_request_setup_packet_t));
     95        usb_device_request_setup_packet_t *result =
     96            malloc(sizeof (usb_device_request_setup_packet_t));
    9997        usb_hub_set_port_status_request(result, port);
    10098        return result;
     
    108106 */
    109107static inline void usb_hub_set_enable_port_feature_request(
    110         usb_device_request_setup_packet_t * request, uint16_t port,
    111         uint16_t feature_selector
    112         ) {
     108    usb_device_request_setup_packet_t *request, uint16_t port,
     109    uint16_t feature_selector) {
    113110        request->index = port;
    114111        request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
     
    125122 */
    126123static inline void usb_hub_set_disable_port_feature_request(
    127         usb_device_request_setup_packet_t * request, uint16_t port,
    128         uint16_t feature_selector
    129         ) {
     124    usb_device_request_setup_packet_t *request, uint16_t port,
     125    uint16_t feature_selector
     126    ) {
    130127        request->index = port;
    131128        request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
     
    141138 */
    142139static inline void usb_hub_set_enable_port_request(
    143         usb_device_request_setup_packet_t * request, uint16_t port
    144         ) {
     140    usb_device_request_setup_packet_t *request, uint16_t port
     141    ) {
    145142        request->index = port;
    146143        request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
     
    157154static inline usb_device_request_setup_packet_t *
    158155usb_hub_create_enable_port_request(uint16_t port) {
    159         usb_device_request_setup_packet_t * result =
    160                 malloc(sizeof(usb_device_request_setup_packet_t));
     156        usb_device_request_setup_packet_t *result =
     157            malloc(sizeof (usb_device_request_setup_packet_t));
    161158        usb_hub_set_enable_port_request(result, port);
    162159        return result;
     
    169166 */
    170167static inline void usb_hub_set_disable_port_request(
    171         usb_device_request_setup_packet_t * request, uint16_t port
    172         ) {
     168    usb_device_request_setup_packet_t *request, uint16_t port
     169    ) {
    173170        request->index = port;
    174171        request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
     
    185182static inline usb_device_request_setup_packet_t *
    186183usb_hub_create_disable_port_request(uint16_t port) {
    187         usb_device_request_setup_packet_t * result =
    188                 malloc(sizeof(usb_device_request_setup_packet_t));
     184        usb_device_request_setup_packet_t *result =
     185            malloc(sizeof (usb_device_request_setup_packet_t));
    189186        usb_hub_set_disable_port_request(result, port);
    190187        return result;
     
    197194 */
    198195static inline void usb_hub_set_reset_port_request(
    199         usb_device_request_setup_packet_t * request, uint16_t port
    200         ) {
     196    usb_device_request_setup_packet_t *request, uint16_t port
     197    ) {
    201198        request->index = port;
    202199        request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
     
    213210static inline usb_device_request_setup_packet_t *
    214211usb_hub_create_reset_port_request(uint16_t port) {
    215         usb_device_request_setup_packet_t * result =
    216                 malloc(sizeof(usb_device_request_setup_packet_t));
     212        usb_device_request_setup_packet_t *result =
     213            malloc(sizeof (usb_device_request_setup_packet_t));
    217214        usb_hub_set_reset_port_request(result, port);
    218215        return result;
     
    225222 */
    226223static inline void usb_hub_set_power_port_request(
    227         usb_device_request_setup_packet_t * request, uint16_t port
    228         ) {
     224    usb_device_request_setup_packet_t *request, uint16_t port
     225    ) {
    229226        request->index = port;
    230227        request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
     
    240237 */
    241238static inline void usb_hub_unset_power_port_request(
    242         usb_device_request_setup_packet_t * request, uint16_t port
    243         ) {
     239    usb_device_request_setup_packet_t *request, uint16_t port
     240    ) {
    244241        request->index = port;
    245242        request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;
     
    257254 */
    258255static inline bool usb_port_is_status(usb_port_status_t status, int idx) {
    259         return (status&(1 << idx))!=0;
     256        return (status & (1 << idx)) != 0;
    260257}
    261258
     
    268265 */
    269266static inline void usb_port_status_set_bit(
    270         usb_port_status_t * status, int idx, bool value) {
     267    usb_port_status_t * status, int idx, bool value) {
    271268        (*status) = value ?
    272                 ((*status) | (1 << (idx))) :
    273                 ((*status)&(~(1 << (idx))));
     269            ((*status) | (1 << (idx))) :
     270            ((*status)&(~(1 << (idx))));
    274271}
    275272
     
    282279 */
    283280static inline bool usb_hub_is_status(usb_hub_status_t status, int idx) {
    284         return (status&(1 << idx))!=0;
     281        return (status & (1 << idx)) != 0;
    285282}
    286283
     
    293290 */
    294291static inline void usb_hub_status_set_bit(
    295         usb_hub_status_t * status, int idx, bool value) {
     292    usb_hub_status_t *status, int idx, bool value) {
    296293        (*status) = value ?
    297                 ((*status) | (1 << (idx))) :
    298                 ((*status)&(~(1 << (idx))));
    299 }
    300 
    301 
    302 #if 0
    303 /**
    304  * connection status geter for port status
    305  *
    306  * @param status
    307  * @return true if there is something connected
    308  */
    309 static inline bool usb_port_dev_connected(usb_port_status_t * status) {
    310         return usb_port_get_bit(status, 0);
    311 }
    312 
    313 /**
    314  * set device connected bit in port status
    315  *
    316  * @param status
    317  * @param connected value of the bit
    318  */
    319 static inline void usb_port_set_dev_connected(usb_port_status_t * status, bool connected) {
    320         usb_port_set_bit(status, 0, connected);
    321 }
    322 
    323 //port enabled
    324 
    325 /**
    326  * port enabled getter for port status
    327  *
    328  * @param status
    329  * @return true if the port is enabled
    330  */
    331 static inline bool usb_port_enabled(usb_port_status_t * status) {
    332         return usb_port_get_bit(status, 1);
    333 }
    334 
    335 /**
    336  * set port enabled bit in port status
    337  *
    338  * @param status
    339  * @param enabled value of the bit
    340  */
    341 static inline void usb_port_set_enabled(usb_port_status_t * status, bool enabled) {
    342         usb_port_set_bit(status, 1, enabled);
    343 }
    344 
    345 //port suspended
    346 /**
    347  * port suspended getter for port status
    348  *
    349  * @param status
    350  * @return true if port is suspended
    351  */
    352 static inline bool usb_port_suspended(usb_port_status_t * status) {
    353         return usb_port_get_bit(status, 2);
    354 }
    355 
    356 /**
    357  * set port suspended bit in port status
    358  *
    359  * @param status
    360  * @param suspended value of the bit
    361  */
    362 static inline void usb_port_set_suspended(usb_port_status_t * status, bool suspended) {
    363         usb_port_set_bit(status, 2, suspended);
    364 }
    365 
    366 //over currect
    367 /**
    368  * over current condition indicator getter for port status
    369  *
    370  * @param status
    371  * @return true if there is opver-current condition on the hub
    372  */
    373 static inline bool usb_port_over_current(usb_port_status_t * status) {
    374         return usb_port_get_bit(status, 3);
    375 }
    376 
    377 /**
    378  * set over current indicator bit in port status
    379  *
    380  * @param status
    381  * @param value value of the bit
    382  */
    383 static inline void usb_port_set_over_current(usb_port_status_t * status, bool value) {
    384         usb_port_set_bit(status, 3, value);
    385 }
    386 
    387 //port reset
    388 /**
    389  * port reset indicator getter for port status
    390  *
    391  * @param status
    392  * @return true if port is reset
    393  */
    394 static inline bool usb_port_reset(usb_port_status_t * status) {
    395         return usb_port_get_bit(status, 4);
    396 }
    397 
    398 /**
    399  * set port reset bit in port status
    400  *
    401  * @param status
    402  * @param value value of the bit
    403  */
    404 static inline void usb_port_set_reset(usb_port_status_t * status, bool value) {
    405         usb_port_set_bit(status, 4, value);
    406 }
    407 
    408 //powered
    409 /**
    410  * power state getter for port status
    411  *
    412  * @param status
    413  * @return true if port is powered
    414  */
    415 static inline bool usb_port_powered(usb_port_status_t * status) {
    416         return usb_port_get_bit(status, 8);
    417 }
    418 
    419 /**
    420  * set port powered bit in port status
    421  *
    422  * @param status
    423  * @param powered value of the bit
    424  */
    425 static inline void usb_port_set_powered(usb_port_status_t * status, bool powered) {
    426         usb_port_set_bit(status, 8, powered);
    427 }
    428 
    429 #endif
    430 
    431 //low speed device attached
     294            ((*status) | (1 << (idx))) :
     295            ((*status)&(~(1 << (idx))));
     296}
     297
    432298/**
    433299 * low speed device on the port indicator
     
    446312 * @param low_speed value of the bit
    447313 */
    448 static inline void usb_port_set_low_speed(usb_port_status_t * status, bool low_speed) {
     314static inline void usb_port_set_low_speed(usb_port_status_t *status, bool low_speed) {
    449315        usb_port_status_set_bit(status, 9, low_speed);
    450316}
    451317
    452318//high speed device attached
     319
    453320/**
    454321 * high speed device on the port indicator
     
    467334 * @param high_speed value of the bit
    468335 */
    469 static inline void usb_port_set_high_speed(usb_port_status_t * status, bool high_speed) {
     336static inline void usb_port_set_high_speed(usb_port_status_t *status, bool high_speed) {
    470337        usb_port_status_set_bit(status, 10, high_speed);
    471338}
     
    485352}
    486353
    487 #if 0
    488 //connect change
    489 /**
    490  * port connect change indicator
    491  *
    492  * @param status
    493  * @return true if connection has changed
    494  */
    495 static inline bool usb_port_connect_change(usb_port_status_t * status) {
    496         return usb_port_get_bit(status, 16);
    497 }
    498 
    499 /**
    500  * set connection change bit in port status
    501  * @param status
    502  * @param change value of the bit
    503  */
    504 static inline void usb_port_set_connect_change(usb_port_status_t * status, bool change) {
    505         usb_port_set_bit(status, 16, change);
    506 }
    507 
    508 //port enable change
    509 /**
    510  * port enable change for port status
    511  *
    512  * @param status
    513  * @return true if the port has been enabled/disabled
    514  */
    515 static inline bool usb_port_enabled_change(usb_port_status_t * status) {
    516         return usb_port_get_bit(status, 17);
    517 }
    518 
    519 /**
    520  * set port enable change bit in port status
    521  *
    522  * @param status
    523  * @param change value of the bit
    524  */
    525 static inline void usb_port_set_enabled_change(usb_port_status_t * status, bool change) {
    526         usb_port_set_bit(status, 17, change);
    527 }
    528 
    529 //suspend change
    530 /**
    531  * port suspend change for port status
    532  *
    533  * @param status
    534  * @return ture if suspend status has changed
    535  */
    536 static inline bool usb_port_suspend_change(usb_port_status_t * status) {
    537         return usb_port_get_bit(status, 18);
    538 }
    539 
    540 /**
    541  * set port suspend change bit in port status
    542  *
    543  * @param status
    544  * @param change value of the bit
    545  */
    546 static inline void usb_port_set_suspend_change(usb_port_status_t * status, bool change) {
    547         usb_port_set_bit(status, 18, change);
    548 }
    549 
    550 //over current change
    551 /**
    552  * over current change indicator
    553  *
    554  * @param status
    555  * @return true if over-current condition on port has changed
    556  */
    557 static inline bool usb_port_overcurrent_change(usb_port_status_t * status) {
    558         return usb_port_get_bit(status, 19);
    559 }
    560 
    561 /**
    562  * set port over current change bit in port status
    563  *
    564  * @param status
    565  * @param change value of the bit
    566  */
    567 static inline void usb_port_set_overcurrent_change(usb_port_status_t * status, bool change) {
    568         usb_port_set_bit(status, 19, change);
    569 }
    570 
    571 //reset change
    572 /**
    573  * port reset change indicator
    574  * @param status
    575  * @return true if port has been reset
    576  */
    577 static inline bool usb_port_reset_completed(usb_port_status_t * status) {
    578         return usb_port_get_bit(status, 20);
    579 }
    580 
    581 /**
    582  * set port reset completed bit in port status
    583  *
    584  * @param status
    585  * @param change value of the bit
    586  */
    587 static inline void usb_port_set_reset_completed(usb_port_status_t * status, bool completed) {
    588         usb_port_set_bit(status, 20, completed);
    589 }
    590 
    591 //local power status
    592 /**
    593  * local power lost indicator for hub status
    594  *
    595  * @param status
    596  * @return true if hub is not powered
    597  */
    598 static inline bool usb_hub_local_power_lost(usb_hub_status_t * status) {
    599         return usb_hub_get_bit(status, 0);
    600 }
    601 
    602 /**
    603  * set hub power lost bit in hub status
    604  *
    605  * @param status
    606  * @param change value of the bit
    607  */
    608 static inline void usb_hub_set_local_power_lost(usb_port_status_t * status,
    609         bool power_lost) {
    610         usb_hub_set_bit(status, 0, power_lost);
    611 }
    612 
    613 //over current ocndition
    614 /**
    615  * hub over-current indicator
    616  *
    617  * @param status
    618  * @return true if over-current condition occurred on hub
    619  */
    620 static inline bool usb_hub_over_current(usb_hub_status_t * status) {
    621         return usb_hub_get_bit(status, 1);
    622 }
    623 
    624 /**
    625  * set hub over current bit in hub status
    626  *
    627  * @param status
    628  * @param change value of the bit
    629  */
    630 static inline void usb_hub_set_over_current(usb_port_status_t * status,
    631         bool over_current) {
    632         usb_hub_set_bit(status, 1, over_current);
    633 }
    634 
    635 //local power change
    636 /**
    637  * hub power change indicator
    638  *
    639  * @param status
    640  * @return true if local power status has been changed - power has been
    641  * dropped or re-established
    642  */
    643 static inline bool usb_hub_local_power_change(usb_hub_status_t * status) {
    644         return usb_hub_get_bit(status, 16);
    645 }
    646 
    647 /**
    648  * set hub power change bit in hub status
    649  *
    650  * @param status
    651  * @param change value of the bit
    652  */
    653 static inline void usb_hub_set_local_power_change(usb_port_status_t * status,
    654         bool change) {
    655         usb_hub_set_bit(status, 16, change);
    656 }
    657 
    658 //local power status
    659 /**
    660  * hub over-current condition change indicator
    661  *
    662  * @param status
    663  * @return true if over-current condition has changed
    664  */
    665 static inline bool usb_hub_over_current_change(usb_hub_status_t * status) {
    666         return usb_hub_get_bit(status, 17);
    667 }
    668 
    669 /**
    670  * set hub over current change bit in hub status
    671  *
    672  * @param status
    673  * @param change value of the bit
    674  */
    675 static inline void usb_hub_set_over_current_change(usb_port_status_t * status,
    676         bool change) {
    677         usb_hub_set_bit(status, 17, change);
    678 }
    679 #endif
    680354
    681355
  • uspace/drv/usbhub/ports.c

    ra2a3763 r5da18c7  
    4747#include "port_status.h"
    4848
    49 
    5049/** Information for fibril for device discovery. */
    5150struct add_device_phase1 {
     
    6564 * any function here and must be cleared by hand
    6665 */
    67 static const int non_handled_changes[] =  {
     66static const int non_handled_changes[] = {
    6867        USB_HUB_FEATURE_C_PORT_ENABLE,
    6968        USB_HUB_FEATURE_C_PORT_SUSPEND
     
    7170
    7271static void usb_hub_removed_device(
    73         usb_hub_info_t * hub, uint16_t port);
    74 
    75 static void usb_hub_port_reset_completed(usb_hub_info_t * hub,
    76         uint16_t port, uint32_t status);
    77 
    78 static void usb_hub_port_over_current(usb_hub_info_t * hub,
    79         uint16_t port, uint32_t status);
     72    usb_hub_info_t *hub, uint16_t port);
     73
     74static void usb_hub_port_reset_completed(usb_hub_info_t *hub,
     75    uint16_t port, uint32_t status);
     76
     77static void usb_hub_port_over_current(usb_hub_info_t *hub,
     78    uint16_t port, uint32_t status);
    8079
    8180static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port,
     
    9695 * @param port port number, starting from 1
    9796 */
    98 void usb_hub_process_interrupt(usb_hub_info_t * hub,
    99         uint16_t port) {
    100         usb_log_debug("interrupt at port %zu\n", (size_t) port);
     97void usb_hub_process_interrupt(usb_hub_info_t *hub,
     98    uint16_t port) {
     99        usb_log_debug("Interrupt at port %zu\n", (size_t) port);
    101100        //determine type of change
    102101        //usb_pipe_t *pipe = hub->control_pipe;
     
    134133        if (usb_port_is_status(status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT)) {
    135134                //check if it was not auto-resolved
    136                 usb_log_debug("overcurrent change on port\n");
     135                usb_log_debug("Overcurrent change on port\n");
    137136                usb_hub_port_over_current(hub, port, status);
    138137        }
     
    141140                usb_hub_port_reset_completed(hub, port, status);
    142141        }
    143         usb_log_debug("status x%x : %d\n ", status, status);
     142        usb_log_debug("Status x%x : %d\n ", status, status);
    144143
    145144        usb_port_status_set_bit(
    146             &status, USB_HUB_FEATURE_C_PORT_CONNECTION,false);
     145            &status, USB_HUB_FEATURE_C_PORT_CONNECTION, false);
    147146        usb_port_status_set_bit(
    148             &status, USB_HUB_FEATURE_C_PORT_RESET,false);
     147            &status, USB_HUB_FEATURE_C_PORT_RESET, false);
    149148        usb_port_status_set_bit(
    150             &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT,false);
    151        
     149            &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT, false);
     150
    152151        //clearing not yet handled changes     
    153152        unsigned int feature_idx;
    154         for(feature_idx = 0;feature_idx<non_handled_changes_count;
    155             ++feature_idx){
     153        for (feature_idx = 0;
     154            feature_idx < non_handled_changes_count;
     155            ++feature_idx) {
    156156                unsigned int bit_idx = non_handled_changes[feature_idx];
    157                 if(status & (1<<bit_idx)){
     157                if (status & (1 << bit_idx)) {
    158158                        usb_log_info(
    159                             "there was not yet handled change on port %d: %d"
     159                            "There was not yet handled change on port %d: %d"
    160160                            ";clearing it\n",
    161                         port, bit_idx);
     161                            port, bit_idx);
    162162                        int opResult = usb_hub_clear_port_feature(
    163163                            hub->control_pipe,
     
    165165                        if (opResult != EOK) {
    166166                                usb_log_warning(
    167                                     "could not clear port flag %d: %d\n",
    168                                     bit_idx, opResult
     167                                    "Could not clear port flag %d: %s\n",
     168                                    bit_idx, str_error(opResult)
    169169                                    );
    170170                        }
    171171                        usb_port_status_set_bit(
    172                             &status, bit_idx,false);
     172                            &status, bit_idx, false);
    173173                }
    174174        }
    175         if(status>>16){
    176                 usb_log_info("there is still some unhandled change %X\n",
     175        if (status >> 16) {
     176                usb_log_info("There is still some unhandled change %X\n",
    177177                    status);
    178178        }
    179179}
    180 
    181180
    182181/**
     
    190189 */
    191190static void usb_hub_removed_device(
    192         usb_hub_info_t * hub, uint16_t port) {
     191    usb_hub_info_t *hub, uint16_t port) {
    193192
    194193        int opResult = usb_hub_clear_port_feature(hub->control_pipe,
    195                 port, USB_HUB_FEATURE_C_PORT_CONNECTION);
     194            port, USB_HUB_FEATURE_C_PORT_CONNECTION);
    196195        if (opResult != EOK) {
    197                 usb_log_warning("could not clear port-change-connection flag\n");
     196                usb_log_warning("Could not clear port-change-connection flag\n");
    198197        }
    199198        /** \TODO remove device from device manager - not yet implemented in
     
    231230}
    232231
    233 
    234232/**
    235233 * Process port reset change
     
    241239 * @param status
    242240 */
    243 static void usb_hub_port_reset_completed(usb_hub_info_t * hub,
    244         uint16_t port, uint32_t status){
     241static void usb_hub_port_reset_completed(usb_hub_info_t *hub,
     242    uint16_t port, uint32_t status) {
    245243        usb_log_debug("Port %zu reset complete.\n", (size_t) port);
    246244        if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_ENABLE)) {
     
    274272 * @param port port number, starting from 1
    275273 */
    276 static void usb_hub_port_over_current(usb_hub_info_t * hub,
    277         uint16_t port, uint32_t status) {
     274static void usb_hub_port_over_current(usb_hub_info_t *hub,
     275    uint16_t port, uint32_t status) {
    278276        int opResult;
    279         if(usb_port_is_status(status, USB_HUB_FEATURE_PORT_OVER_CURRENT)){
     277        if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_OVER_CURRENT)) {
    280278                opResult = usb_hub_clear_port_feature(hub->control_pipe,
    281                         port, USB_HUB_FEATURE_PORT_POWER);
     279                    port, USB_HUB_FEATURE_PORT_POWER);
    282280                if (opResult != EOK) {
    283                         usb_log_error("cannot power off port %d;  %d\n",
    284                                 port, opResult);
     281                        usb_log_error("Cannot power off port %d; %s\n",
     282                            port, str_error(opResult));
    285283                }
    286         }else{
     284        } else {
    287285                opResult = usb_hub_set_port_feature(hub->control_pipe,
    288                         port, USB_HUB_FEATURE_PORT_POWER);
     286                    port, USB_HUB_FEATURE_PORT_POWER);
    289287                if (opResult != EOK) {
    290                         usb_log_error("cannot power on port %d;  %d\n",
    291                                 port, opResult);
     288                        usb_log_error("Cannot power on port %d; %s\n",
     289                            port, str_error(opResult));
    292290                }
    293291        }
     
    302300 */
    303301static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port,
    304     usb_port_status_t *status)
    305 {
     302    usb_port_status_t *status) {
    306303        size_t recv_size;
    307304        usb_device_request_setup_packet_t request;
     
    310307        usb_hub_set_port_status_request(&request, port);
    311308        int rc = usb_pipe_control_read(ctrl_pipe,
    312             &request, sizeof(usb_device_request_setup_packet_t),
    313             &status_tmp, sizeof(status_tmp), &recv_size);
     309            &request, sizeof (usb_device_request_setup_packet_t),
     310            &status_tmp, sizeof (status_tmp), &recv_size);
    314311        if (rc != EOK) {
    315312                return rc;
     
    336333 * @return Error code.
    337334 */
    338 static int enable_port_callback(int port_no, void *arg)
    339 {
     335static int enable_port_callback(int port_no, void *arg) {
    340336        usb_hub_info_t *hub = arg;
    341337        int rc;
     
    345341        usb_hub_set_reset_port_request(&request, port_no);
    346342        rc = usb_pipe_control_write(hub->control_pipe,
    347             &request, sizeof(request), NULL, 0);
     343            &request, sizeof (request), NULL, 0);
    348344        if (rc != EOK) {
    349345                usb_log_warning("Port reset failed: %s.\n", str_error(rc));
     
    375371 * @return 0 Always.
    376372 */
    377 static int add_device_phase1_worker_fibril(void *arg)
    378 {
     373static int add_device_phase1_worker_fibril(void *arg) {
    379374        struct add_device_phase1 *data
    380375            = (struct add_device_phase1 *) arg;
     
    418413}
    419414
    420 
    421415/** Start device adding when connection change is detected.
    422416 *
     
    429423 */
    430424static int create_add_device_fibril(usb_hub_info_t *hub, size_t port,
    431     usb_speed_t speed)
    432 {
     425    usb_speed_t speed) {
    433426        struct add_device_phase1 *data
    434             = malloc(sizeof(struct add_device_phase1));
     427            = malloc(sizeof (struct add_device_phase1));
    435428        if (data == NULL) {
    436429                return ENOMEM;
  • uspace/drv/usbhub/ports.h

    ra2a3763 r5da18c7  
    7070
    7171
    72 void usb_hub_process_interrupt(usb_hub_info_t * hub,
     72void usb_hub_process_interrupt(usb_hub_info_t *hub,
    7373        uint16_t port);
    7474
  • uspace/drv/usbhub/usbhub.c

    ra2a3763 r5da18c7  
    5656
    5757
    58 static usb_hub_info_t * usb_hub_info_create(usb_device_t * usb_dev);
    59 
    60 static int usb_hub_process_hub_specific_info(usb_hub_info_t * hub_info);
    61 
    62 static int usb_hub_set_configuration(usb_hub_info_t * hub_info);
    63 
    64 static int usb_hub_start_hub_fibril(usb_hub_info_t * hub_info);
    65 
    66 static int usb_process_hub_over_current(usb_hub_info_t * hub_info,
     58static usb_hub_info_t * usb_hub_info_create(usb_device_t *usb_dev);
     59
     60static int usb_hub_process_hub_specific_info(usb_hub_info_t *hub_info);
     61
     62static int usb_hub_set_configuration(usb_hub_info_t *hub_info);
     63
     64static int usb_hub_start_hub_fibril(usb_hub_info_t *hub_info);
     65
     66static int usb_process_hub_over_current(usb_hub_info_t *hub_info,
    6767    usb_hub_status_t status);
    6868
    69 static int usb_process_hub_local_power_change(usb_hub_info_t * hub_info,
     69static int usb_process_hub_local_power_change(usb_hub_info_t *hub_info,
    7070    usb_hub_status_t status);
    7171
    72 static void usb_hub_process_global_interrupt(usb_hub_info_t * hub_info);
    73 
    74 static void usb_hub_polling_terminated_callback(usb_device_t * device,
    75     bool was_error, void * data);
     72static void usb_hub_process_global_interrupt(usb_hub_info_t *hub_info);
     73
     74static void usb_hub_polling_terminated_callback(usb_device_t *device,
     75    bool was_error, void *data);
    7676
    7777
     
    9090 * @return error code
    9191 */
    92 int usb_hub_add_device(usb_device_t * usb_dev) {
     92int usb_hub_add_device(usb_device_t *usb_dev) {
    9393        if (!usb_dev) return EINVAL;
    94         usb_hub_info_t * hub_info = usb_hub_info_create(usb_dev);
     94        usb_hub_info_t *hub_info = usb_hub_info_create(usb_dev);
    9595        //create hc connection
    9696        usb_log_debug("Initializing USB wire abstraction.\n");
     
    9999            hub_info->usb_device->ddf_dev);
    100100        if (opResult != EOK) {
    101                 usb_log_error("could not initialize connection to device, "
    102                     "errno %d\n",
    103                     opResult);
     101                usb_log_error("Could not initialize connection to device, "
     102                    " %s\n",
     103                    str_error(opResult));
    104104                free(hub_info);
    105105                return opResult;
     
    109109        opResult = usb_hub_set_configuration(hub_info);
    110110        if (opResult != EOK) {
    111                 usb_log_error("could not set hub configuration, errno %d\n",
    112                     opResult);
     111                usb_log_error("Could not set hub configuration, %s\n",
     112                    str_error(opResult));
    113113                free(hub_info);
    114114                return opResult;
     
    117117        opResult = usb_hub_process_hub_specific_info(hub_info);
    118118        if (opResult != EOK) {
    119                 usb_log_error("could process hub specific info, errno %d\n",
    120                     opResult);
     119                usb_log_error("Could process hub specific info, %s\n",
     120                    str_error(opResult));
    121121                free(hub_info);
    122122                return opResult;
     
    135135
    136136        opResult = usb_hub_start_hub_fibril(hub_info);
    137         if(opResult!=EOK)
     137        if (opResult != EOK)
    138138                free(hub_info);
    139139        return opResult;
    140140}
    141 
    142141
    143142/** Callback for polling hub for changes.
     
    193192 * @return basic usb_hub_info_t structure
    194193 */
    195 static usb_hub_info_t * usb_hub_info_create(usb_device_t * usb_dev) {
    196         usb_hub_info_t * result = malloc(sizeof(usb_hub_info_t));
     194static usb_hub_info_t * usb_hub_info_create(usb_device_t *usb_dev) {
     195        usb_hub_info_t * result = malloc(sizeof (usb_hub_info_t));
    197196        if (!result) return NULL;
    198197        result->usb_device = usb_dev;
     
    202201
    203202        result->ports = NULL;
    204         result->port_count = (size_t) -1;
     203        result->port_count = (size_t) - 1;
    205204        fibril_mutex_initialize(&result->port_mutex);
    206205
     
    221220 * @return error code
    222221 */
    223 static int usb_hub_process_hub_specific_info(usb_hub_info_t * hub_info) {
     222static int usb_hub_process_hub_specific_info(usb_hub_info_t *hub_info) {
    224223        // get hub descriptor
    225         usb_log_debug("creating serialized descriptor\n");
     224        usb_log_debug("Creating serialized descriptor\n");
    226225        uint8_t serialized_descriptor[USB_HUB_MAX_DESCRIPTOR_SIZE];
    227226        usb_hub_descriptor_t * descriptor;
     
    235234
    236235        if (opResult != EOK) {
    237                 usb_log_error("failed when receiving hub descriptor, "
    238                     "badcode = %d\n",
    239                     opResult);
     236                usb_log_error("Failed when receiving hub descriptor, "
     237                    "%s\n",
     238                    str_error(opResult));
    240239                free(serialized_descriptor);
    241240                return opResult;
    242241        }
    243         usb_log_debug2("deserializing descriptor\n");
     242        usb_log_debug2("Deserializing descriptor\n");
    244243        descriptor = usb_create_deserialized_hub_desriptor(
    245244            serialized_descriptor);
     
    250249        usb_log_debug("setting port count to %d\n", descriptor->ports_count);
    251250        hub_info->port_count = descriptor->ports_count;
    252         /// \TODO this is not semantically correct
    253251        bool is_power_switched =
    254             ((descriptor->hub_characteristics & 1) ==0);
     252            ((descriptor->hub_characteristics & 1) == 0);
    255253        bool has_individual_port_powering =
    256             ((descriptor->hub_characteristics & 1) !=0);
     254            ((descriptor->hub_characteristics & 1) != 0);
    257255        hub_info->ports = malloc(
    258256            sizeof (usb_hub_port_t) * (hub_info->port_count + 1));
    259         if(!hub_info->ports){
     257        if (!hub_info->ports) {
    260258                return ENOMEM;
    261259        }
     
    264262                usb_hub_port_init(&hub_info->ports[port]);
    265263        }
    266         if(is_power_switched){
    267                 usb_log_debug("is_power_switched\n");
    268                
    269                 if(!has_individual_port_powering){
    270                         usb_log_debug("!has_individual_port_powering\n");
     264        if (is_power_switched) {
     265                usb_log_debug("Hub power switched\n");
     266
     267                if (!has_individual_port_powering) {
     268                        usb_log_debug("Has_global powering\n");
    271269                        opResult = usb_hub_set_feature(hub_info->control_pipe,
    272270                            USB_HUB_FEATURE_C_HUB_LOCAL_POWER);
    273271                        if (opResult != EOK) {
    274                                 usb_log_error("cannot power hub: %s\n",
     272                                usb_log_error("Cannot power hub: %s\n",
    275273                                    str_error(opResult));
    276274                        }
     
    278276
    279277                for (port = 1; port <= hub_info->port_count; ++port) {
    280                         usb_log_debug("Powering port %zu.\n",port);
     278                        usb_log_debug("Powering port %zu.\n", port);
    281279                        opResult = usb_hub_set_port_feature(hub_info->control_pipe,
    282280                            port, USB_HUB_FEATURE_PORT_POWER);
     
    286284                        }
    287285                }
    288                
    289         }else{
    290                 usb_log_debug("!is_power_switched, not going to be powered\n");
    291         }
    292         usb_log_debug2("freeing data\n");
     286
     287        } else {
     288                usb_log_debug("Power not switched, not going to be powered\n");
     289        }
     290        usb_log_debug2("Freeing data\n");
    293291        free(descriptor);
    294292        return EOK;
     
    303301 * @return error code
    304302 */
    305 static int usb_hub_set_configuration(usb_hub_info_t * hub_info) {
     303static int usb_hub_set_configuration(usb_hub_info_t *hub_info) {
    306304        //device descriptor
    307305        usb_standard_device_descriptor_t *std_descriptor
    308306            = &hub_info->usb_device->descriptors.device;
    309         usb_log_debug("hub has %d configurations\n",
     307        usb_log_debug("Hub has %d configurations\n",
    310308            std_descriptor->configuration_count);
    311309        if (std_descriptor->configuration_count < 1) {
    312                 usb_log_error("there are no configurations available\n");
     310                usb_log_error("There are no configurations available\n");
    313311                return EINVAL;
    314312        }
     
    328326                return opResult;
    329327        }
    330         usb_log_debug("\tused configuration %d\n",
     328        usb_log_debug("\tUsed configuration %d\n",
    331329            config_descriptor->configuration_number);
    332330
     
    343341 * @return error code
    344342 */
    345 static int usb_hub_start_hub_fibril(usb_hub_info_t * hub_info){
     343static int usb_hub_start_hub_fibril(usb_hub_info_t *hub_info) {
    346344        int rc;
    347345
     
    367365//*********************************************
    368366
    369 
    370367/**
    371368 * process hub over current change
     
    376373 * @return error code
    377374 */
    378 static int usb_process_hub_over_current(usb_hub_info_t * hub_info,
     375static int usb_process_hub_over_current(usb_hub_info_t *hub_info,
    379376    usb_hub_status_t status) {
    380377        int opResult;
    381         if (usb_hub_is_status(status,USB_HUB_FEATURE_HUB_OVER_CURRENT)){
     378        if (usb_hub_is_status(status, USB_HUB_FEATURE_HUB_OVER_CURRENT)) {
    382379                //poweroff all ports
    383380                unsigned int port;
    384                 for(port = 1;port <= hub_info->port_count;++port){
     381                for (port = 1; port <= hub_info->port_count; ++port) {
    385382                        opResult = usb_hub_clear_port_feature(
    386                             hub_info->control_pipe,port,
     383                            hub_info->control_pipe, port,
    387384                            USB_HUB_FEATURE_PORT_POWER);
    388385                        if (opResult != EOK) {
    389386                                usb_log_warning(
    390                                     "cannot power off port %d;  %d\n",
    391                                     port, opResult);
     387                                    "Cannot power off port %d;  %s\n",
     388                                    port, str_error(opResult));
    392389                        }
    393390                }
     
    395392                //power all ports
    396393                unsigned int port;
    397                 for(port = 1;port <= hub_info->port_count;++port){
     394                for (port = 1; port <= hub_info->port_count; ++port) {
    398395                        opResult = usb_hub_set_port_feature(
    399                             hub_info->control_pipe,port,
     396                            hub_info->control_pipe, port,
    400397                            USB_HUB_FEATURE_PORT_POWER);
    401398                        if (opResult != EOK) {
    402399                                usb_log_warning(
    403                                     "cannot power off port %d;  %d\n",
    404                                     port, opResult);
     400                                    "Cannot power off port %d;  %s\n",
     401                                    port, str_error(opResult));
    405402                        }
    406403                }
     
    417414 * @return error code
    418415 */
    419 static int usb_process_hub_local_power_change(usb_hub_info_t * hub_info,
     416static int usb_process_hub_local_power_change(usb_hub_info_t *hub_info,
    420417    usb_hub_status_t status) {
    421418        int opResult = EOK;
    422419        opResult = usb_hub_clear_feature(hub_info->control_pipe,
    423420            USB_HUB_FEATURE_C_HUB_LOCAL_POWER);
    424                 if (opResult != EOK) {
    425                 usb_log_error("cannnot clear hub power change flag: "
    426                     "%d\n",
    427                     opResult);
     421        if (opResult != EOK) {
     422                usb_log_error("Cannnot clear hub power change flag: "
     423                    "%s\n",
     424                    str_error(opResult));
    428425        }
    429426        return opResult;
     
    437434 * @param hub_info hub instance
    438435 */
    439 static void usb_hub_process_global_interrupt(usb_hub_info_t * hub_info) {
    440         usb_log_debug("global interrupt on a hub\n");
     436static void usb_hub_process_global_interrupt(usb_hub_info_t *hub_info) {
     437        usb_log_debug("Global interrupt on a hub\n");
    441438        usb_pipe_t *pipe = hub_info->control_pipe;
    442439        int opResult;
     
    455452            );
    456453        if (opResult != EOK) {
    457                 usb_log_error("could not get hub status\n");
     454                usb_log_error("Could not get hub status: %s\n",
     455                    str_error(opResult));
    458456                return;
    459457        }
    460458        if (rcvd_size != sizeof (usb_port_status_t)) {
    461                 usb_log_error("received status has incorrect size\n");
     459                usb_log_error("Received status has incorrect size\n");
    462460                return;
    463461        }
    464462        //port reset
    465463        if (
    466             usb_hub_is_status(status,16+USB_HUB_FEATURE_C_HUB_OVER_CURRENT)) {
     464            usb_hub_is_status(status, 16 + USB_HUB_FEATURE_C_HUB_OVER_CURRENT)) {
    467465                usb_process_hub_over_current(hub_info, status);
    468466        }
    469467        if (
    470             usb_hub_is_status(status,16+USB_HUB_FEATURE_C_HUB_LOCAL_POWER)) {
     468            usb_hub_is_status(status, 16 + USB_HUB_FEATURE_C_HUB_LOCAL_POWER)) {
    471469                usb_process_hub_local_power_change(hub_info, status);
    472470        }
     
    481479 * @param data pointer to usb_hub_info_t structure
    482480 */
    483 static void usb_hub_polling_terminated_callback(usb_device_t * device,
    484     bool was_error, void * data){
     481static void usb_hub_polling_terminated_callback(usb_device_t *device,
     482    bool was_error, void *data) {
    485483        usb_hub_info_t * hub = data;
    486484        assert(hub);
  • uspace/drv/usbhub/usbhub.h

    ra2a3763 r5da18c7  
    5151#include "ports.h"
    5252
    53 
    54 
    5553/** Information about attached hub. */
    56 struct usb_hub_info_t{
     54struct usb_hub_info_t {
    5755        /** Number of ports. */
    5856        size_t port_count;
     
    106104};
    107105
    108 //int usb_hub_control_loop(void * hub_info_param);
    109 
    110 int usb_hub_add_device(usb_device_t * usb_dev);
     106int usb_hub_add_device(usb_device_t *usb_dev);
    111107
    112108bool hub_port_changes_callback(usb_device_t *dev,
  • uspace/drv/usbhub/usbhub_private.h

    ra2a3763 r5da18c7  
    6565 */
    6666static inline void usb_hub_set_descriptor_request(
    67 usb_device_request_setup_packet_t * request
    68 ){
     67    usb_device_request_setup_packet_t * request
     68    ) {
    6969        request->index = 0;
    7070        request->request_type = USB_HUB_REQ_TYPE_GET_DESCRIPTOR;
     
    8787    int port_index,
    8888    usb_hub_class_feature_t feature) {
    89        
     89
    9090        usb_device_request_setup_packet_t clear_request = {
    9191                .request_type = USB_HUB_REQ_TYPE_CLEAR_PORT_FEATURE,
     
    9696        clear_request.value = feature;
    9797        return usb_pipe_control_write(pipe, &clear_request,
    98             sizeof(clear_request), NULL, 0);
     98            sizeof (clear_request), NULL, 0);
    9999}
    100100
     
    120120        clear_request.value = feature;
    121121        return usb_pipe_control_write(pipe, &clear_request,
    122             sizeof(clear_request), NULL, 0);
     122            sizeof (clear_request), NULL, 0);
    123123}
    124 
    125124
    126125/**
     
    142141        clear_request.value = feature;
    143142        return usb_pipe_control_write(pipe, &clear_request,
    144             sizeof(clear_request), NULL, 0);
     143            sizeof (clear_request), NULL, 0);
    145144}
    146145
     
    163162        clear_request.value = feature;
    164163        return usb_pipe_control_write(pipe, &clear_request,
    165             sizeof(clear_request), NULL, 0);
     164            sizeof (clear_request), NULL, 0);
    166165}
    167166
  • uspace/drv/usbhub/utils.c

    ra2a3763 r5da18c7  
    6262 * @return newly created serializd descriptor pointer
    6363 */
    64 void * usb_create_serialized_hub_descriptor(usb_hub_descriptor_t * descriptor) {
     64void * usb_create_serialized_hub_descriptor(usb_hub_descriptor_t *descriptor) {
    6565        //base size
    6666        size_t size = 7;
    6767        //variable size according to port count
    68         size_t var_size = (descriptor->ports_count+7)/8;
     68        size_t var_size = (descriptor->ports_count + 7) / 8;
    6969        size += 2 * var_size;
    7070        uint8_t * result = malloc(size);
    7171        //size
    72         if(result)
    73                 usb_serialize_hub_descriptor(descriptor,result);
     72        if (result)
     73                usb_serialize_hub_descriptor(descriptor, result);
    7474        return result;
    7575}
     
    8282 * @param serialized_descriptor
    8383 */
    84 void usb_serialize_hub_descriptor(usb_hub_descriptor_t * descriptor,
     84void usb_serialize_hub_descriptor(usb_hub_descriptor_t *descriptor,
    8585    void * serialized_descriptor) {
    8686        //base size
     
    8888        size_t size = 7;
    8989        //variable size according to port count
    90         size_t var_size = (descriptor->ports_count+7)/8;
     90        size_t var_size = (descriptor->ports_count + 7) / 8;
    9191        size += 2 * var_size;
    9292        //size
     
    110110}
    111111
    112 
    113112/**
    114113 * create deserialized desriptor structure out of serialized descriptor
     
    121120 */
    122121usb_hub_descriptor_t * usb_create_deserialized_hub_desriptor(
    123 void * serialized_descriptor) {
     122    void *serialized_descriptor) {
    124123        uint8_t * sdescriptor = serialized_descriptor;
    125124
     
    130129        }
    131130
    132         usb_hub_descriptor_t * result = malloc(sizeof(usb_hub_descriptor_t));
    133         if(result)
    134                 usb_deserialize_hub_desriptor(serialized_descriptor,result);
     131        usb_hub_descriptor_t * result = malloc(sizeof (usb_hub_descriptor_t));
     132        if (result)
     133                usb_deserialize_hub_desriptor(serialized_descriptor, result);
    135134        return result;
    136135}
     
    144143 */
    145144void usb_deserialize_hub_desriptor(
    146 void * serialized_descriptor, usb_hub_descriptor_t * descriptor) {
     145    void * serialized_descriptor, usb_hub_descriptor_t *descriptor) {
    147146        uint8_t * sdescriptor = serialized_descriptor;
    148147        descriptor->ports_count = sdescriptor[2];
     
    151150        descriptor->pwr_on_2_good_time = sdescriptor[5];
    152151        descriptor->current_requirement = sdescriptor[6];
    153         size_t var_size = (descriptor->ports_count+7) / 8;
     152        size_t var_size = (descriptor->ports_count + 7) / 8;
    154153        //descriptor->devices_removable = (uint8_t*) malloc(var_size);
    155154
  • uspace/lib/usbhid/src/hiddescriptor.c

    ra2a3763 r5da18c7  
    187187
    188188                field = malloc(sizeof(usb_hid_report_field_t));
     189                if(field == NULL) {
     190                        return ENOMEM;
     191                }
     192
    189193                memset(field, 0, sizeof(usb_hid_report_field_t));
    190194                list_initialize(&field->link);
     
    216220                        }
    217221                        else {
    218                                 usage = report_item->usages[
     222                                usage = report_item->usages[
    219223                                        report_item->usages_count- 1];
    220224                        }
     
    241245
    242246                field->size = report_item->size;
    243                
    244                 size_t offset_byte = (report_item->offset + (i *
    245                         report_item->size)) / 8;
    246 
    247                 size_t offset_bit = 8 - ((report_item->offset + (i *
    248                         report_item->size)) % 8) - report_item->size;
    249 
    250                 field->offset = 8 * offset_byte + offset_bit;
    251                 if(report_item->id != 0) {
     247
     248                if(report_item->type == USB_HID_REPORT_TYPE_INPUT) {
     249                        int offset = report_item->offset + report_item->size * i;
     250                        int field_offset = (offset/8)*8 + (offset/8 + 1) * 8 -
     251                                offset - report_item->size;
     252                        if(field_offset < 0) {
     253                                field->offset = 0;
     254                        }
     255                        else {
     256                                field->offset = field_offset;
     257                        }
     258                }
     259                else {
     260                        field->offset = report_item->offset + (i * report_item->size);
     261                }
     262
     263
     264                if(report->use_report_ids != 0) {
    252265                        field->offset += 8;
    253266                        report->use_report_ids = 1;
    254267                }
     268
    255269                field->item_flags = report_item->item_flags;
    256270
     
    315329                usb_hid_report_type_t type) {
    316330
     331        if(report == NULL) {
     332                return NULL;
     333        }
     334
    317335        link_t *report_it = report->reports.next;
    318336        usb_hid_report_description_t *report_des = NULL;
     
    322340                                usb_hid_report_description_t, link);
    323341
    324                 if((report_des->report_id == report_id) &&
     342                // if report id not set, return the first of the type
     343                if(((report_des->report_id == report_id) || (report_id == 0)) &&
    325344                   (report_des->type == type)) {
    326345                        return report_des;
  • uspace/lib/usbhid/src/hidparser.c

    ra2a3763 r5da18c7  
    153153
    154154
    155         report_des = usb_hid_report_find_description(report, *report_id, type);
     155        report_des = usb_hid_report_find_description(report, *report_id,
     156                type);
     157
    156158        if(report_des == NULL) {
    157159                return EINVAL;
     
    167169                if(USB_HID_ITEM_FLAG_CONSTANT(item->item_flags) == 0) {
    168170                       
    169                         if(USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0) {
     171                        if(USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0){
    170172
    171173                                // array
     
    174176               
    175177                                item->usage = USB_HID_EXTENDED_USAGE(
    176                                     item->usages[item->value - item->physical_minimum]);
    177 
    178                                 item->usage_page = USB_HID_EXTENDED_USAGE_PAGE(
    179                                     item->usages[item->value - item->physical_minimum]);
    180 
    181                                 usb_hid_report_set_last_item (item->collection_path,
    182                                     USB_HID_TAG_CLASS_GLOBAL, item->usage_page);
    183 
    184                                 usb_hid_report_set_last_item (item->collection_path,
     178                                    item->usages[
     179                                    item->value - item->physical_minimum]);
     180
     181                                item->usage_page =
     182                                    USB_HID_EXTENDED_USAGE_PAGE(
     183                                    item->usages[
     184                                    item->value - item->physical_minimum]);
     185
     186                                usb_hid_report_set_last_item (
     187                                    item->collection_path,
     188                                    USB_HID_TAG_CLASS_GLOBAL,
     189                                    item->usage_page);
     190
     191                                usb_hid_report_set_last_item (
     192                                    item->collection_path,
    185193                                    USB_HID_TAG_CLASS_LOCAL, item->usage);
    186194                               
     
    188196                        else {
    189197                                // variable item
    190                                 item->value = usb_hid_translate_data(item, data);                               
    191                         }                               
     198                                item->value = usb_hid_translate_data(item,
     199                                    data);                             
     200                        }                       
    192201                }
    193202                list_item = list_item->next;
     
    213222       
    214223        int32_t value=0;
    215         int32_t mask;
    216         const uint8_t *foo;
     224        int32_t mask=0;
     225        const uint8_t *foo=0;
    217226
    218227        // now only shot tags are allowed
     
    240249        if((size_t)(offset/8) != (size_t)((offset+item->size-1)/8)) {
    241250               
    242                 part_size = ((offset+item->size)%8);
     251                part_size = 0;
    243252
    244253                size_t i=0;
     
    246255                        if(i == (size_t)(offset/8)) {
    247256                                // the higher one
     257                                part_size = 8 - (offset % 8);
    248258                                foo = data + i;
    249259                                mask =  ((1 << (item->size-part_size))-1);
    250                                 value = (*foo & mask) << part_size;
     260                                value = (*foo & mask);
    251261                        }
    252262                        else if(i == ((offset+item->size-1)/8)){
    253263                                // the lower one
    254264                                foo = data + i;
    255                                 mask =  ((1 << part_size)-1) << (8-part_size);
    256                                 value += ((*foo & mask) >> (8-part_size));
     265                                mask = ((1 << (item->size - part_size)) - 1)
     266                                        << (8 - (item->size - part_size));
     267
     268                                value = (((*foo & mask) >> (8 -
     269                                    (item->size - part_size))) << part_size )
     270                                    + value;
    257271                        }
    258272                        else {
    259                                 value = value << 8;
    260                                 value += *(data + 1);
     273                                value = (*(data + 1) << (part_size + 8)) + value;
     274                                part_size += 8;
    261275                        }
    262276                }
     
    375389                report_item = list_get_instance(item, usb_hid_report_field_t, link);
    376390
    377                 if(USB_HID_ITEM_FLAG_VARIABLE(report_item->item_flags) == 0) {
    378                                        
    379                         // array
    380                         value = usb_hid_translate_data_reverse(report_item,
    381                                 report_item->value);
    382 
    383                         offset = report_item->offset;
    384                         length = report_item->size;
    385                 }
    386                 else {
    387                         // variable item
    388                         value  = usb_hid_translate_data_reverse(report_item,
    389                                 report_item->value);
    390 
    391                         offset = report_item->offset;
    392                         length = report_item->size;
    393                 }
    394 
     391                value = usb_hid_translate_data_reverse(report_item,
     392                        report_item->value);
     393
     394                offset = report_des->bit_length - report_item->offset - 1;
     395                length = report_item->size;
     396               
    395397                usb_log_debug("\ttranslated value: %x\n", value);
    396398
     
    603605       
    604606        if(report_id > 0) {
    605                 report_it = usb_hid_report_find_description(report, report_id,
    606                         type)->link.next;               
     607                report_des = usb_hid_report_find_description(report, report_id,
     608                        type);
     609                if(report_des == NULL) {
     610                        return 0;
     611                }
     612                else {
     613                        report_it = report_des->link.next;
     614                }       
    607615        }
    608616        else {
     
    617625                        return report_des->report_id;
    618626                }
     627
     628                report_it = report_it->next;
    619629        }
    620630
  • uspace/lib/usbhid/src/hidpath.c

    ra2a3763 r5da18c7  
    211211
    212212        if(report_path->report_id != path->report_id) {
    213                 return 1;
     213                if(path->report_id != 0) {
     214                        return 1;
     215                }
    214216        }
    215217
  • uspace/srv/hid/console/console.c

    ra2a3763 r5da18c7  
    768768       
    769769        int phone = fd_phone(fd);
     770        close(fd);
    770771        if (phone < 0) {
    771772                printf(NAME ": Failed to connect to input device\n");
     
    777778            handler, &hash);
    778779        if (rc != EOK) {
     780                async_hangup(phone);
    779781                printf(NAME ": " \
    780782                    "Failed to create callback from input device: %s.\n",
Note: See TracChangeset for help on using the changeset viewer.