Changes in / [5da18c7:a2a3763] in mainline
- Location:
- uspace
- Files:
-
- 1 deleted
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/mkbd/main.c
r5da18c7 ra2a3763 71 71 usb_hid_free_report(*report); 72 72 *report = NULL; 73 //printf("usb_hid_report_init() failed.\n");73 printf("usb_hid_report_init() failed.\n"); 74 74 return rc; 75 75 } … … 82 82 usb_hid_free_report(*report); 83 83 *report = NULL; 84 //printf("usbhid_dev_get_report_descriptor_length() failed.\n");84 printf("usbhid_dev_get_report_descriptor_length() failed.\n"); 85 85 return rc; 86 86 } … … 89 89 usb_hid_free_report(*report); 90 90 *report = NULL; 91 //printf("usbhid_dev_get_report_descriptor_length() returned 0.\n");91 printf("usbhid_dev_get_report_descriptor_length() returned 0.\n"); 92 92 return EINVAL; // TODO: other error code? 93 93 } … … 108 108 *report = NULL; 109 109 free(desc); 110 //printf("usbhid_dev_get_report_descriptor() failed.\n");110 printf("usbhid_dev_get_report_descriptor() failed.\n"); 111 111 return rc; 112 112 } … … 116 116 *report = NULL; 117 117 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); 120 120 return EINVAL; // TODO: other error code? 121 121 } … … 128 128 if (rc != EOK) { 129 129 free(desc); 130 //printf("usb_hid_parse_report_descriptor() failed.\n");130 printf("usb_hid_parse_report_descriptor() failed.\n"); 131 131 return rc; 132 132 } … … 213 213 214 214 char *devpath = argv[1]; 215 //const char *devpath = "/hw/pci0/00:06.0/ohci-rh/usb00_a2/HID1/hid"; 216 217 int rc; 215 218 216 219 devman_handle_t dev_handle = 0; 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", 220 rc = devman_device_get_handle(devpath, &dev_handle, 0); 221 if (rc != EOK) { 222 printf("Failed to get handle from devman: %s.\n", 221 223 str_error(rc)); 222 224 return rc; -
uspace/drv/ehci-hcd/main.c
r5da18c7 ra2a3763 75 75 } 76 76 77 uintptr_t reg_base = 0;78 size_t reg_size = 0;77 uintptr_t mem_reg_base = 0; 78 size_t mem_reg_size = 0; 79 79 int irq = 0; 80 80 81 int ret = pci_get_my_registers(device, ®_base, ®_size, &irq); 81 int ret = 82 pci_get_my_registers(device, &mem_reg_base, &mem_reg_size, &irq); 82 83 CHECK_RET_RETURN(ret, 83 84 "Failed to get memory addresses for %" PRIun ": %s.\n", 84 85 device->handle, str_error(ret)); 85 86 usb_log_info("Memory mapped regs at 0x%" PRIxn " (size %zu), IRQ %d.\n", 86 reg_base,reg_size, irq);87 mem_reg_base, mem_reg_size, irq); 87 88 88 ret = pci_disable_legacy(device , reg_base, reg_size, irq);89 ret = pci_disable_legacy(device); 89 90 CHECK_RET_RETURN(ret, 90 91 "Failed(%d) disable legacy USB: %s.\n", ret, str_error(ret)); -
uspace/drv/ehci-hcd/pci.c
r5da18c7 ra2a3763 55 55 #define CMD_OFFSET 0x0 56 56 #define STS_OFFSET 0x4 57 #define INT_OFFSET 0x858 57 #define CFG_OFFSET 0x40 59 58 60 59 #define USBCMD_RUN 1 61 #define USBSTS_HALTED (1 << 12)62 60 63 61 #define USBLEGSUP_OFFSET 0 … … 66 64 #define USBLEGCTLSTS_OFFSET 4 67 65 68 #define DEFAULT_WAIT 1000 66 #define DEFAULT_WAIT 10000 69 67 #define WAIT_STEP 10 70 71 #define PCI_READ(size) \72 do { \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 89 static int pci_read32(const ddf_dev_t *dev, int address, uint32_t *value)90 {91 PCI_READ(32);92 }93 static int pci_read16(const ddf_dev_t *dev, int address, uint16_t *value)94 {95 PCI_READ(16);96 }97 static int pci_read8(const ddf_dev_t *dev, int address, uint8_t *value)98 {99 PCI_READ(8);100 }101 #define PCI_WRITE(size) \102 do { \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 117 static int pci_write32(const ddf_dev_t *dev, int address, uint32_t value)118 {119 PCI_WRITE(32);120 }121 static int pci_write16(const ddf_dev_t *dev, int address, uint16_t value)122 {123 PCI_WRITE(16);124 }125 static int pci_write8(const ddf_dev_t *dev, int address, uint8_t value)126 {127 PCI_WRITE(8);128 }129 68 130 69 /** Get address of registers and IRQ for given device. … … 136 75 * @return Error code. 137 76 */ 138 int pci_get_my_registers( constddf_dev_t *dev,77 int pci_get_my_registers(ddf_dev_t *dev, 139 78 uintptr_t *mem_reg_address, size_t *mem_reg_size, int *irq_no) 140 79 { 141 80 assert(dev != NULL); 142 81 143 const int parent_phone =144 devman_parent_device_connect(dev->handle,IPC_FLAG_BLOCKING);82 int parent_phone = devman_parent_device_connect(dev->handle, 83 IPC_FLAG_BLOCKING); 145 84 if (parent_phone < 0) { 146 85 return parent_phone; … … 206 145 * @return Error code. 207 146 */ 208 int pci_enable_interrupts( constddf_dev_t *device)147 int pci_enable_interrupts(ddf_dev_t *device) 209 148 { 210 constint parent_phone =149 int parent_phone = 211 150 devman_parent_device_connect(device->handle, IPC_FLAG_BLOCKING); 212 151 if (parent_phone < 0) { 213 152 return parent_phone; 214 153 } 215 constbool enabled = hw_res_enable_interrupt(parent_phone);154 bool enabled = hw_res_enable_interrupt(parent_phone); 216 155 async_hangup(parent_phone); 217 156 return enabled ? EOK : EIO; … … 223 162 * @return Error code. 224 163 */ 225 int pci_disable_legacy( 226 const ddf_dev_t *device, uintptr_t reg_base, size_t reg_size, int irq) 164 int pci_disable_legacy(ddf_dev_t *device) 227 165 { 228 166 assert(device); 229 (void) pci_read16; 230 (void) pci_read8; 231 (void) pci_write16; 232 233 #define CHECK_RET_RETURN(ret, message...) \ 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...) \ 234 174 if (ret != EOK) { \ 235 175 usb_log_error(message); \ 176 async_hangup(parent_phone); \ 236 177 return ret; \ 237 178 } else (void)0 238 179 239 /* Map EHCI registers */ 240 void *regs = NULL; 241 int ret = pio_enable((void*)reg_base, reg_size, ®s); 242 CHECK_RET_RETURN(ret, "Failed(%d) to map registers %p.\n", 243 ret, (void *) reg_base); 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; 244 209 245 210 const uint32_t hcc_params = 246 *(uint32_t*)(reg s + HCC_PARAMS_OFFSET);211 *(uint32_t*)(registers + HCC_PARAMS_OFFSET); 247 212 usb_log_debug("Value of hcc params register: %x.\n", hcc_params); 248 213 249 214 /* Read value of EHCI Extended Capabilities Pointer 250 * position of EEC registers(points to PCI config space) */251 constuint32_t eecp =215 * (points to PCI config space) */ 216 uint32_t eecp = 252 217 (hcc_params >> HCC_PARAMS_EECP_OFFSET) & HCC_PARAMS_EECP_MASK; 253 218 usb_log_debug("Value of EECP: %x.\n", eecp); 254 219 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 255 227 /* Read the first EEC. i.e. Legacy Support register */ 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); 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); 260 233 261 234 /* Request control from firmware/BIOS, by writing 1 to highest byte. 262 235 * (OS Control semaphore)*/ 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); 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); 266 240 267 241 size_t wait = 0; 268 242 /* Wait for BIOS to release control. */ 269 ret = pci_read32(device, eecp + USBLEGSUP_OFFSET, &usblegsup); 270 while ((wait < DEFAULT_WAIT) && (usblegsup & USBLEGSUP_BIOS_CONTROL)) { 243 while ((wait < DEFAULT_WAIT) && (value & USBLEGSUP_BIOS_CONTROL)) { 271 244 async_usleep(WAIT_STEP); 272 ret = pci_read32(device, eecp + USBLEGSUP_OFFSET, &usblegsup); 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); 273 247 wait += WAIT_STEP; 274 248 } 275 249 276 250 277 if (( usblegsup& USBLEGSUP_BIOS_CONTROL) == 0) {251 if ((value & USBLEGSUP_BIOS_CONTROL) == 0) { 278 252 usb_log_info("BIOS released control after %zu usec.\n", wait); 279 253 } else { … … 281 255 usb_log_warning( "BIOS failed to release control after " 282 256 "%zu usecs, force it.\n", wait); 283 ret = pci_write32(device, eecp + USBLEGSUP_OFFSET, 257 ret = async_req_3_0(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE), 258 IPC_M_CONFIG_SPACE_WRITE_32, eecp + USBLEGSUP_OFFSET, 284 259 USBLEGSUP_OS_CONTROL); 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 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); 318 276 319 277 /* Read again Legacy Support register */ 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); 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); 323 282 324 283 /* … … 327 286 328 287 /* Get size of capability registers in memory space. */ 329 const unsigned operation_offset = *(uint8_t*)regs;288 uint8_t operation_offset = *(uint8_t*)registers; 330 289 usb_log_debug("USBCMD offset: %d.\n", operation_offset); 331 290 332 291 /* Zero USBCMD register. */ 333 292 volatile uint32_t *usbcmd = 334 (uint32_t*)((uint8_t*)reg s + operation_offset + CMD_OFFSET);293 (uint32_t*)((uint8_t*)registers + operation_offset + CMD_OFFSET); 335 294 volatile uint32_t *usbsts = 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); 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); 341 298 usb_log_debug("USBCMD value: %x.\n", *usbcmd); 342 299 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 347 300 *usbcmd = 0; 348 /* Wait until hc is halted */349 while ((*usbsts & USBSTS_HALTED) == 0);301 while (!(*usbsts & (1 << 12))); /*wait until hc is halted */ 302 *usbconfigured = 0; 350 303 usb_log_info("EHCI turned off.\n"); 351 304 } else { 352 305 usb_log_info("EHCI was not running.\n"); 353 306 } 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 307 usb_log_debug("Registers: %x(0x00080000):%x(0x00001000):%x(0x0).\n", 308 *usbcmd, *usbsts, *usbconfigured); 309 310 async_hangup(parent_phone); 361 311 return ret; 362 #undef CHECK_RET_ RETURN312 #undef CHECK_RET_HANGUP_RETURN 363 313 } 364 314 /*----------------------------------------------------------------------------*/ -
uspace/drv/ehci-hcd/pci.h
r5da18c7 ra2a3763 38 38 #include <ddf/driver.h> 39 39 40 int pci_get_my_registers( constddf_dev_t *, uintptr_t *, size_t *, int *);41 int pci_enable_interrupts( constddf_dev_t *);42 int pci_disable_legacy( const ddf_dev_t *, uintptr_t, size_t, int);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 *); 43 43 44 44 #endif -
uspace/drv/ohci/root_hub.c
r5da18c7 ra2a3763 57 57 .device_version = 0, 58 58 .length = sizeof (usb_standard_device_descriptor_t), 59 /// \TODO this value is guessed 59 60 .max_packet_size = 8, 60 61 .vendor_id = 0x16db, … … 116 117 */ 117 118 static const uint32_t hub_clear_feature_by_writing_one_mask = 118 119 RHS_CLEAR_PORT_POWER; 119 120 120 121 /** … … 411 412 request->transfered_size = 4; 412 413 uint32_t data = instance->registers->rh_port_status[port - 1]; 413 memcpy(request->data_buffer, &data,4);414 memcpy(request->data_buffer,&data,4); 414 415 #if 0 415 416 int i; … … 444 445 uint32_t data = mask & instance->registers->rh_status; 445 446 //uint32_buffer[0] = mask & instance->registers->rh_status; 446 memcpy(request->data_buffer, &data,4);447 memcpy(request->data_buffer,&data,4); 447 448 448 449 return EOK; … … 467 468 468 469 usb_hub_bm_request_type_t request_type = request_packet->request_type; 469 if (buffer_size < 4 ) {470 if (buffer_size < 4/*request_packet->length*/) {///\TODO 470 471 usb_log_warning("requested more data than buffer size\n"); 471 472 return EINVAL; … … 498 499 | (1 << (USB_HUB_FEATURE_C_HUB_OVER_CURRENT + 16)); 499 500 bzero(bitmap, instance->interrupt_mask_size); 500 if ((instance->registers->rh_status & mask) != 0) {501 if ((instance->registers->rh_status & mask) !=0 ) { 501 502 bitmap[0] = 1; 502 503 } … … 677 678 (instance->registers->rh_port_status[port - 1] | (1 << feature)) 678 679 & (~port_clear_feature_valid_mask); 680 /// \TODO any error? 681 679 682 return EOK; 680 683 } … … 704 707 & (~port_clear_feature_valid_mask)) 705 708 | (1 << feature); 709 /// \TODO any error? 706 710 707 711 return EOK; … … 921 925 * @return 922 926 */ 923 static int process_interrupt_mask_in_instance(rh_t *instance, 924 usb_transfer_batch_t * request) { 927 static int process_interrupt_mask_in_instance(rh_t *instance, usb_transfer_batch_t * request) { 925 928 memcpy(request->data_buffer, instance->interrupt_buffer, 926 929 instance->interrupt_mask_size); … … 942 945 * @return 943 946 */ 944 static bool is_zeros(void * buffer, size_t size) {947 static bool is_zeros(void * buffer, size_t size) { 945 948 if (!buffer) return true; 946 949 if (!size) return true; -
uspace/drv/uhci-rhd/port.h
r5da18c7 ra2a3763 55 55 56 56 /** UHCI port structure */ 57 typedef struct uhci_port { 57 typedef struct uhci_port 58 { 58 59 const char *id_string; 59 60 port_status_t *address; … … 67 68 68 69 int uhci_port_init( 69 70 70 uhci_port_t *port, port_status_t *address, unsigned number, 71 unsigned usec, ddf_dev_t *rh); 71 72 72 73 void uhci_port_fini(uhci_port_t *port); -
uspace/drv/usbhid/usbhid.c
r5da18c7 ra2a3763 78 78 } 79 79 80 assert(hid_dev->subdriver_count >= 0);81 82 80 // set the init callback 83 hid_dev->subdrivers[ hid_dev->subdriver_count].init = usb_kbd_init;81 hid_dev->subdrivers[0].init = usb_kbd_init; 84 82 85 83 // set the polling callback 86 hid_dev->subdrivers[hid_dev->subdriver_count].poll = 87 usb_kbd_polling_callback; 84 hid_dev->subdrivers[0].poll = usb_kbd_polling_callback; 88 85 89 86 // set the polling ended callback 90 hid_dev->subdrivers[ hid_dev->subdriver_count].poll_end = NULL;87 hid_dev->subdrivers[0].poll_end = NULL; 91 88 92 89 // set the deinit callback 93 hid_dev->subdrivers[ hid_dev->subdriver_count].deinit = usb_kbd_deinit;90 hid_dev->subdrivers[0].deinit = usb_kbd_deinit; 94 91 95 92 // set subdriver count 96 ++hid_dev->subdriver_count;93 hid_dev->subdriver_count = 1; 97 94 98 95 return EOK; … … 111 108 } 112 109 113 assert(hid_dev->subdriver_count >= 0);114 115 110 // set the init callback 116 hid_dev->subdrivers[ hid_dev->subdriver_count].init = usb_mouse_init;111 hid_dev->subdrivers[0].init = usb_mouse_init; 117 112 118 113 // set the polling callback 119 hid_dev->subdrivers[hid_dev->subdriver_count].poll = 120 usb_mouse_polling_callback; 114 hid_dev->subdrivers[0].poll = usb_mouse_polling_callback; 121 115 122 116 // set the polling ended callback 123 hid_dev->subdrivers[ hid_dev->subdriver_count].poll_end = NULL;117 hid_dev->subdrivers[0].poll_end = NULL; 124 118 125 119 // set the deinit callback 126 hid_dev->subdrivers[ hid_dev->subdriver_count].deinit = usb_mouse_deinit;120 hid_dev->subdrivers[0].deinit = usb_mouse_deinit; 127 121 128 122 // set subdriver count 129 ++hid_dev->subdriver_count;123 hid_dev->subdriver_count = 1; 130 124 131 125 return EOK; … … 144 138 } 145 139 146 assert(hid_dev->subdriver_count >= 0);147 148 140 // set the init callback 149 hid_dev->subdrivers[hid_dev->subdriver_count].init = 150 usb_generic_hid_init; 141 hid_dev->subdrivers[0].init = usb_generic_hid_init; 151 142 152 143 // set the polling callback 153 hid_dev->subdrivers[hid_dev->subdriver_count].poll = 154 usb_generic_hid_polling_callback; 144 hid_dev->subdrivers[0].poll = usb_generic_hid_polling_callback; 155 145 156 146 // set the polling ended callback 157 hid_dev->subdrivers[ hid_dev->subdriver_count].poll_end = NULL;147 hid_dev->subdrivers[0].poll_end = NULL; 158 148 159 149 // set the deinit callback 160 hid_dev->subdrivers[ hid_dev->subdriver_count].deinit = NULL;150 hid_dev->subdrivers[0].deinit = NULL; 161 151 162 152 // set subdriver count 163 ++hid_dev->subdriver_count;153 hid_dev->subdriver_count = 1; 164 154 165 155 return EOK; … … 206 196 } 207 197 208 //if (mapping->report_id >= 0) {209 //usb_hid_report_path_set_report_id(usage_path,210 //mapping->report_id);211 //}198 if (mapping->report_id >= 0) { 199 usb_hid_report_path_set_report_id(usage_path, 200 mapping->report_id); 201 } 212 202 213 203 assert(hid_dev->report != NULL); … … 216 206 // size_t size = usb_hid_report_size(hid_dev->report, 0, 217 207 // USB_HID_REPORT_TYPE_INPUT); 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); 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); 280 219 usb_hid_report_path_free(usage_path); 281 220 282 return matches;221 return (size > 0); 283 222 } 284 223 … … 429 368 430 369 do { 431 usb_log_debug("Getting size of the report.\n");432 370 size = usb_hid_report_byte_size(hid_dev->report, report_id, 433 371 USB_HID_REPORT_TYPE_INPUT); 434 372 usb_log_debug("Report ID: %u, size: %zu\n", report_id, size); 435 373 max_size = (size > max_size) ? size : max_size; 436 usb_log_debug("Getting next report ID\n");437 374 report_id = usb_hid_get_next_report_id(hid_dev->report, 438 375 report_id, USB_HID_REPORT_TYPE_INPUT); … … 564 501 hid_dev->subdriver_count); 565 502 //usb_hid_free(&hid_dev); 566 567 503 } else { 568 504 bool ok = false; … … 591 527 } 592 528 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 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 } 603 534 604 535 return rc; … … 623 554 usb_log_debug("Max input report size: %zu, buffer size: %zu\n", 624 555 hid_dev->max_input_report_size, buffer_size); 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 } 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); 632 583 633 584 bool cont = false; -
uspace/drv/usbhub/main.c
r5da18c7 ra2a3763 87 87 88 88 usb_log_enable(USB_LOG_LEVEL_DEFAULT, NAME); 89 89 90 90 return usb_driver_main(&usb_hub_driver); 91 91 } -
uspace/drv/usbhub/port_status.h
r5da18c7 ra2a3763 64 64 */ 65 65 static inline void usb_hub_set_port_status_request( 66 usb_device_request_setup_packet_t *request, uint16_t port) { 66 usb_device_request_setup_packet_t * request, uint16_t port 67 ) { 67 68 request->index = port; 68 69 request->request_type = USB_HUB_REQ_TYPE_GET_PORT_STATUS; … … 78 79 */ 79 80 static inline void usb_hub_set_hub_status_request( 80 usb_device_request_setup_packet_t *request) { 81 usb_device_request_setup_packet_t * request 82 ) { 81 83 request->index = 0; 82 84 request->request_type = USB_HUB_REQ_TYPE_GET_HUB_STATUS; … … 93 95 static inline usb_device_request_setup_packet_t * 94 96 usb_hub_create_port_status_request(uint16_t port) { 95 usb_device_request_setup_packet_t * result =96 malloc(sizeof(usb_device_request_setup_packet_t));97 usb_device_request_setup_packet_t * result = 98 malloc(sizeof(usb_device_request_setup_packet_t)); 97 99 usb_hub_set_port_status_request(result, port); 98 100 return result; … … 106 108 */ 107 109 static inline void usb_hub_set_enable_port_feature_request( 108 usb_device_request_setup_packet_t *request, uint16_t port, 109 uint16_t feature_selector) { 110 usb_device_request_setup_packet_t * request, uint16_t port, 111 uint16_t feature_selector 112 ) { 110 113 request->index = port; 111 114 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 122 125 */ 123 126 static inline void usb_hub_set_disable_port_feature_request( 124 usb_device_request_setup_packet_t *request, uint16_t port,125 126 127 usb_device_request_setup_packet_t * request, uint16_t port, 128 uint16_t feature_selector 129 ) { 127 130 request->index = port; 128 131 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 138 141 */ 139 142 static inline void usb_hub_set_enable_port_request( 140 usb_device_request_setup_packet_t *request, uint16_t port141 143 usb_device_request_setup_packet_t * request, uint16_t port 144 ) { 142 145 request->index = port; 143 146 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 154 157 static inline usb_device_request_setup_packet_t * 155 158 usb_hub_create_enable_port_request(uint16_t port) { 156 usb_device_request_setup_packet_t * result =157 malloc(sizeof(usb_device_request_setup_packet_t));159 usb_device_request_setup_packet_t * result = 160 malloc(sizeof(usb_device_request_setup_packet_t)); 158 161 usb_hub_set_enable_port_request(result, port); 159 162 return result; … … 166 169 */ 167 170 static inline void usb_hub_set_disable_port_request( 168 usb_device_request_setup_packet_t *request, uint16_t port169 171 usb_device_request_setup_packet_t * request, uint16_t port 172 ) { 170 173 request->index = port; 171 174 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 182 185 static inline usb_device_request_setup_packet_t * 183 186 usb_hub_create_disable_port_request(uint16_t port) { 184 usb_device_request_setup_packet_t * result =185 malloc(sizeof(usb_device_request_setup_packet_t));187 usb_device_request_setup_packet_t * result = 188 malloc(sizeof(usb_device_request_setup_packet_t)); 186 189 usb_hub_set_disable_port_request(result, port); 187 190 return result; … … 194 197 */ 195 198 static inline void usb_hub_set_reset_port_request( 196 usb_device_request_setup_packet_t *request, uint16_t port197 199 usb_device_request_setup_packet_t * request, uint16_t port 200 ) { 198 201 request->index = port; 199 202 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 210 213 static inline usb_device_request_setup_packet_t * 211 214 usb_hub_create_reset_port_request(uint16_t port) { 212 usb_device_request_setup_packet_t * result =213 malloc(sizeof(usb_device_request_setup_packet_t));215 usb_device_request_setup_packet_t * result = 216 malloc(sizeof(usb_device_request_setup_packet_t)); 214 217 usb_hub_set_reset_port_request(result, port); 215 218 return result; … … 222 225 */ 223 226 static inline void usb_hub_set_power_port_request( 224 usb_device_request_setup_packet_t *request, uint16_t port225 227 usb_device_request_setup_packet_t * request, uint16_t port 228 ) { 226 229 request->index = port; 227 230 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 237 240 */ 238 241 static inline void usb_hub_unset_power_port_request( 239 usb_device_request_setup_packet_t *request, uint16_t port240 242 usb_device_request_setup_packet_t * request, uint16_t port 243 ) { 241 244 request->index = port; 242 245 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 254 257 */ 255 258 static inline bool usb_port_is_status(usb_port_status_t status, int idx) { 256 return (status & (1 << idx)) !=0;259 return (status&(1 << idx))!=0; 257 260 } 258 261 … … 265 268 */ 266 269 static inline void usb_port_status_set_bit( 267 270 usb_port_status_t * status, int idx, bool value) { 268 271 (*status) = value ? 269 270 272 ((*status) | (1 << (idx))) : 273 ((*status)&(~(1 << (idx)))); 271 274 } 272 275 … … 279 282 */ 280 283 static inline bool usb_hub_is_status(usb_hub_status_t status, int idx) { 281 return (status & (1 << idx)) !=0;284 return (status&(1 << idx))!=0; 282 285 } 283 286 … … 290 293 */ 291 294 static inline void usb_hub_status_set_bit( 292 usb_hub_status_t *status, int idx, bool value) {295 usb_hub_status_t * status, int idx, bool value) { 293 296 (*status) = value ? 294 ((*status) | (1 << (idx))) : 295 ((*status)&(~(1 << (idx)))); 296 } 297 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 298 432 /** 299 433 * low speed device on the port indicator … … 312 446 * @param low_speed value of the bit 313 447 */ 314 static inline void usb_port_set_low_speed(usb_port_status_t * status, bool low_speed) {448 static inline void usb_port_set_low_speed(usb_port_status_t * status, bool low_speed) { 315 449 usb_port_status_set_bit(status, 9, low_speed); 316 450 } 317 451 318 452 //high speed device attached 319 320 453 /** 321 454 * high speed device on the port indicator … … 334 467 * @param high_speed value of the bit 335 468 */ 336 static inline void usb_port_set_high_speed(usb_port_status_t * status, bool high_speed) {469 static inline void usb_port_set_high_speed(usb_port_status_t * status, bool high_speed) { 337 470 usb_port_status_set_bit(status, 10, high_speed); 338 471 } … … 352 485 } 353 486 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 354 680 355 681 -
uspace/drv/usbhub/ports.c
r5da18c7 ra2a3763 47 47 #include "port_status.h" 48 48 49 49 50 /** Information for fibril for device discovery. */ 50 51 struct add_device_phase1 { … … 64 65 * any function here and must be cleared by hand 65 66 */ 66 static const int non_handled_changes[] = {67 static const int non_handled_changes[] = { 67 68 USB_HUB_FEATURE_C_PORT_ENABLE, 68 69 USB_HUB_FEATURE_C_PORT_SUSPEND … … 70 71 71 72 static void usb_hub_removed_device( 72 usb_hub_info_t *hub, uint16_t port);73 74 static void usb_hub_port_reset_completed(usb_hub_info_t * hub,75 76 77 static void usb_hub_port_over_current(usb_hub_info_t * hub,78 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); 79 80 80 81 static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port, … … 95 96 * @param port port number, starting from 1 96 97 */ 97 void usb_hub_process_interrupt(usb_hub_info_t * hub,98 99 usb_log_debug(" Interrupt at port %zu\n", (size_t) port);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); 100 101 //determine type of change 101 102 //usb_pipe_t *pipe = hub->control_pipe; … … 133 134 if (usb_port_is_status(status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT)) { 134 135 //check if it was not auto-resolved 135 usb_log_debug(" Overcurrent change on port\n");136 usb_log_debug("overcurrent change on port\n"); 136 137 usb_hub_port_over_current(hub, port, status); 137 138 } … … 140 141 usb_hub_port_reset_completed(hub, port, status); 141 142 } 142 usb_log_debug(" Status x%x : %d\n ", status, status);143 usb_log_debug("status x%x : %d\n ", status, status); 143 144 144 145 usb_port_status_set_bit( 145 &status, USB_HUB_FEATURE_C_PORT_CONNECTION, 146 &status, USB_HUB_FEATURE_C_PORT_CONNECTION,false); 146 147 usb_port_status_set_bit( 147 &status, USB_HUB_FEATURE_C_PORT_RESET, 148 &status, USB_HUB_FEATURE_C_PORT_RESET,false); 148 149 usb_port_status_set_bit( 149 &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT, 150 150 &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT,false); 151 151 152 //clearing not yet handled changes 152 153 unsigned int feature_idx; 153 for (feature_idx = 0; 154 feature_idx < non_handled_changes_count; 155 ++feature_idx) { 154 for(feature_idx = 0;feature_idx<non_handled_changes_count; 155 ++feature_idx){ 156 156 unsigned int bit_idx = non_handled_changes[feature_idx]; 157 if (status & (1 << bit_idx)){157 if(status & (1<<bit_idx)){ 158 158 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" 160 160 ";clearing it\n", 161 161 port, bit_idx); 162 162 int opResult = usb_hub_clear_port_feature( 163 163 hub->control_pipe, … … 165 165 if (opResult != EOK) { 166 166 usb_log_warning( 167 " Could not clear port flag %d: %s\n",168 bit_idx, str_error(opResult)167 "could not clear port flag %d: %d\n", 168 bit_idx, opResult 169 169 ); 170 170 } 171 171 usb_port_status_set_bit( 172 &status, bit_idx, 172 &status, bit_idx,false); 173 173 } 174 174 } 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", 177 177 status); 178 178 } 179 179 } 180 180 181 181 182 /** … … 189 190 */ 190 191 static void usb_hub_removed_device( 191 usb_hub_info_t *hub, uint16_t port) {192 usb_hub_info_t * hub, uint16_t port) { 192 193 193 194 int opResult = usb_hub_clear_port_feature(hub->control_pipe, 194 195 port, USB_HUB_FEATURE_C_PORT_CONNECTION); 195 196 if (opResult != EOK) { 196 usb_log_warning(" Could not clear port-change-connection flag\n");197 usb_log_warning("could not clear port-change-connection flag\n"); 197 198 } 198 199 /** \TODO remove device from device manager - not yet implemented in … … 230 231 } 231 232 233 232 234 /** 233 235 * Process port reset change … … 239 241 * @param status 240 242 */ 241 static void usb_hub_port_reset_completed(usb_hub_info_t * hub,242 uint16_t port, uint32_t status){243 static void usb_hub_port_reset_completed(usb_hub_info_t * hub, 244 uint16_t port, uint32_t status){ 243 245 usb_log_debug("Port %zu reset complete.\n", (size_t) port); 244 246 if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_ENABLE)) { … … 272 274 * @param port port number, starting from 1 273 275 */ 274 static void usb_hub_port_over_current(usb_hub_info_t * hub,275 276 static void usb_hub_port_over_current(usb_hub_info_t * hub, 277 uint16_t port, uint32_t status) { 276 278 int opResult; 277 if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_OVER_CURRENT)){279 if(usb_port_is_status(status, USB_HUB_FEATURE_PORT_OVER_CURRENT)){ 278 280 opResult = usb_hub_clear_port_feature(hub->control_pipe, 279 281 port, USB_HUB_FEATURE_PORT_POWER); 280 282 if (opResult != EOK) { 281 usb_log_error(" Cannot power off port %d; %s\n",282 port, str_error(opResult));283 usb_log_error("cannot power off port %d; %d\n", 284 port, opResult); 283 285 } 284 } else{286 }else{ 285 287 opResult = usb_hub_set_port_feature(hub->control_pipe, 286 288 port, USB_HUB_FEATURE_PORT_POWER); 287 289 if (opResult != EOK) { 288 usb_log_error(" Cannot power on port %d; %s\n",289 port, str_error(opResult));290 usb_log_error("cannot power on port %d; %d\n", 291 port, opResult); 290 292 } 291 293 } … … 300 302 */ 301 303 static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port, 302 usb_port_status_t *status) { 304 usb_port_status_t *status) 305 { 303 306 size_t recv_size; 304 307 usb_device_request_setup_packet_t request; … … 307 310 usb_hub_set_port_status_request(&request, port); 308 311 int rc = usb_pipe_control_read(ctrl_pipe, 309 &request, sizeof 310 &status_tmp, sizeof 312 &request, sizeof(usb_device_request_setup_packet_t), 313 &status_tmp, sizeof(status_tmp), &recv_size); 311 314 if (rc != EOK) { 312 315 return rc; … … 333 336 * @return Error code. 334 337 */ 335 static int enable_port_callback(int port_no, void *arg) { 338 static int enable_port_callback(int port_no, void *arg) 339 { 336 340 usb_hub_info_t *hub = arg; 337 341 int rc; … … 341 345 usb_hub_set_reset_port_request(&request, port_no); 342 346 rc = usb_pipe_control_write(hub->control_pipe, 343 &request, sizeof 347 &request, sizeof(request), NULL, 0); 344 348 if (rc != EOK) { 345 349 usb_log_warning("Port reset failed: %s.\n", str_error(rc)); … … 371 375 * @return 0 Always. 372 376 */ 373 static int add_device_phase1_worker_fibril(void *arg) { 377 static int add_device_phase1_worker_fibril(void *arg) 378 { 374 379 struct add_device_phase1 *data 375 380 = (struct add_device_phase1 *) arg; … … 413 418 } 414 419 420 415 421 /** Start device adding when connection change is detected. 416 422 * … … 423 429 */ 424 430 static int create_add_device_fibril(usb_hub_info_t *hub, size_t port, 425 usb_speed_t speed) { 431 usb_speed_t speed) 432 { 426 433 struct add_device_phase1 *data 427 = malloc(sizeof 434 = malloc(sizeof(struct add_device_phase1)); 428 435 if (data == NULL) { 429 436 return ENOMEM; -
uspace/drv/usbhub/ports.h
r5da18c7 ra2a3763 70 70 71 71 72 void usb_hub_process_interrupt(usb_hub_info_t * hub,72 void usb_hub_process_interrupt(usb_hub_info_t * hub, 73 73 uint16_t port); 74 74 -
uspace/drv/usbhub/usbhub.c
r5da18c7 ra2a3763 56 56 57 57 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,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, 67 67 usb_hub_status_t status); 68 68 69 static int usb_process_hub_local_power_change(usb_hub_info_t * hub_info,69 static int usb_process_hub_local_power_change(usb_hub_info_t * hub_info, 70 70 usb_hub_status_t status); 71 71 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);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); 76 76 77 77 … … 90 90 * @return error code 91 91 */ 92 int usb_hub_add_device(usb_device_t * usb_dev) {92 int usb_hub_add_device(usb_device_t * usb_dev) { 93 93 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); 95 95 //create hc connection 96 96 usb_log_debug("Initializing USB wire abstraction.\n"); … … 99 99 hub_info->usb_device->ddf_dev); 100 100 if (opResult != EOK) { 101 usb_log_error(" Could not initialize connection to device, "102 " %s\n",103 str_error(opResult));101 usb_log_error("could not initialize connection to device, " 102 "errno %d\n", 103 opResult); 104 104 free(hub_info); 105 105 return opResult; … … 109 109 opResult = usb_hub_set_configuration(hub_info); 110 110 if (opResult != EOK) { 111 usb_log_error(" Could not set hub configuration, %s\n",112 str_error(opResult));111 usb_log_error("could not set hub configuration, errno %d\n", 112 opResult); 113 113 free(hub_info); 114 114 return opResult; … … 117 117 opResult = usb_hub_process_hub_specific_info(hub_info); 118 118 if (opResult != EOK) { 119 usb_log_error(" Could process hub specific info, %s\n",120 str_error(opResult));119 usb_log_error("could process hub specific info, errno %d\n", 120 opResult); 121 121 free(hub_info); 122 122 return opResult; … … 135 135 136 136 opResult = usb_hub_start_hub_fibril(hub_info); 137 if (opResult !=EOK)137 if(opResult!=EOK) 138 138 free(hub_info); 139 139 return opResult; 140 140 } 141 141 142 142 143 /** Callback for polling hub for changes. … … 192 193 * @return basic usb_hub_info_t structure 193 194 */ 194 static usb_hub_info_t * usb_hub_info_create(usb_device_t * usb_dev) {195 usb_hub_info_t * result = malloc(sizeof 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)); 196 197 if (!result) return NULL; 197 198 result->usb_device = usb_dev; … … 201 202 202 203 result->ports = NULL; 203 result->port_count = (size_t) - 204 result->port_count = (size_t) -1; 204 205 fibril_mutex_initialize(&result->port_mutex); 205 206 … … 220 221 * @return error code 221 222 */ 222 static int usb_hub_process_hub_specific_info(usb_hub_info_t * hub_info) {223 static int usb_hub_process_hub_specific_info(usb_hub_info_t * hub_info) { 223 224 // get hub descriptor 224 usb_log_debug(" Creating serialized descriptor\n");225 usb_log_debug("creating serialized descriptor\n"); 225 226 uint8_t serialized_descriptor[USB_HUB_MAX_DESCRIPTOR_SIZE]; 226 227 usb_hub_descriptor_t * descriptor; … … 234 235 235 236 if (opResult != EOK) { 236 usb_log_error(" Failed when receiving hub descriptor, "237 " %s\n",238 str_error(opResult));237 usb_log_error("failed when receiving hub descriptor, " 238 "badcode = %d\n", 239 opResult); 239 240 free(serialized_descriptor); 240 241 return opResult; 241 242 } 242 usb_log_debug2(" Deserializing descriptor\n");243 usb_log_debug2("deserializing descriptor\n"); 243 244 descriptor = usb_create_deserialized_hub_desriptor( 244 245 serialized_descriptor); … … 249 250 usb_log_debug("setting port count to %d\n", descriptor->ports_count); 250 251 hub_info->port_count = descriptor->ports_count; 252 /// \TODO this is not semantically correct 251 253 bool is_power_switched = 252 ((descriptor->hub_characteristics & 1) == 254 ((descriptor->hub_characteristics & 1) ==0); 253 255 bool has_individual_port_powering = 254 ((descriptor->hub_characteristics & 1) != 256 ((descriptor->hub_characteristics & 1) !=0); 255 257 hub_info->ports = malloc( 256 258 sizeof (usb_hub_port_t) * (hub_info->port_count + 1)); 257 if (!hub_info->ports){259 if(!hub_info->ports){ 258 260 return ENOMEM; 259 261 } … … 262 264 usb_hub_port_init(&hub_info->ports[port]); 263 265 } 264 if (is_power_switched){265 usb_log_debug(" Hub powerswitched\n");266 267 if (!has_individual_port_powering){268 usb_log_debug(" Has_globalpowering\n");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"); 269 271 opResult = usb_hub_set_feature(hub_info->control_pipe, 270 272 USB_HUB_FEATURE_C_HUB_LOCAL_POWER); 271 273 if (opResult != EOK) { 272 usb_log_error(" Cannot power hub: %s\n",274 usb_log_error("cannot power hub: %s\n", 273 275 str_error(opResult)); 274 276 } … … 276 278 277 279 for (port = 1; port <= hub_info->port_count; ++port) { 278 usb_log_debug("Powering port %zu.\n", 280 usb_log_debug("Powering port %zu.\n",port); 279 281 opResult = usb_hub_set_port_feature(hub_info->control_pipe, 280 282 port, USB_HUB_FEATURE_PORT_POWER); … … 284 286 } 285 287 } 286 287 } else{288 usb_log_debug(" Power notswitched, not going to be powered\n");289 } 290 usb_log_debug2(" Freeing data\n");288 289 }else{ 290 usb_log_debug("!is_power_switched, not going to be powered\n"); 291 } 292 usb_log_debug2("freeing data\n"); 291 293 free(descriptor); 292 294 return EOK; … … 301 303 * @return error code 302 304 */ 303 static int usb_hub_set_configuration(usb_hub_info_t * hub_info) {305 static int usb_hub_set_configuration(usb_hub_info_t * hub_info) { 304 306 //device descriptor 305 307 usb_standard_device_descriptor_t *std_descriptor 306 308 = &hub_info->usb_device->descriptors.device; 307 usb_log_debug(" Hub has %d configurations\n",309 usb_log_debug("hub has %d configurations\n", 308 310 std_descriptor->configuration_count); 309 311 if (std_descriptor->configuration_count < 1) { 310 usb_log_error(" There are no configurations available\n");312 usb_log_error("there are no configurations available\n"); 311 313 return EINVAL; 312 314 } … … 326 328 return opResult; 327 329 } 328 usb_log_debug("\t Used configuration %d\n",330 usb_log_debug("\tused configuration %d\n", 329 331 config_descriptor->configuration_number); 330 332 … … 341 343 * @return error code 342 344 */ 343 static int usb_hub_start_hub_fibril(usb_hub_info_t * hub_info){345 static int usb_hub_start_hub_fibril(usb_hub_info_t * hub_info){ 344 346 int rc; 345 347 … … 365 367 //********************************************* 366 368 369 367 370 /** 368 371 * process hub over current change … … 373 376 * @return error code 374 377 */ 375 static int usb_process_hub_over_current(usb_hub_info_t * hub_info,378 static int usb_process_hub_over_current(usb_hub_info_t * hub_info, 376 379 usb_hub_status_t status) { 377 380 int opResult; 378 if (usb_hub_is_status(status, USB_HUB_FEATURE_HUB_OVER_CURRENT)){381 if (usb_hub_is_status(status,USB_HUB_FEATURE_HUB_OVER_CURRENT)){ 379 382 //poweroff all ports 380 383 unsigned int port; 381 for (port = 1; port <= hub_info->port_count; ++port){384 for(port = 1;port <= hub_info->port_count;++port){ 382 385 opResult = usb_hub_clear_port_feature( 383 hub_info->control_pipe, 386 hub_info->control_pipe,port, 384 387 USB_HUB_FEATURE_PORT_POWER); 385 388 if (opResult != EOK) { 386 389 usb_log_warning( 387 " Cannot power off port %d; %s\n",388 port, str_error(opResult));390 "cannot power off port %d; %d\n", 391 port, opResult); 389 392 } 390 393 } … … 392 395 //power all ports 393 396 unsigned int port; 394 for (port = 1; port <= hub_info->port_count; ++port){397 for(port = 1;port <= hub_info->port_count;++port){ 395 398 opResult = usb_hub_set_port_feature( 396 hub_info->control_pipe, 399 hub_info->control_pipe,port, 397 400 USB_HUB_FEATURE_PORT_POWER); 398 401 if (opResult != EOK) { 399 402 usb_log_warning( 400 " Cannot power off port %d; %s\n",401 port, str_error(opResult));403 "cannot power off port %d; %d\n", 404 port, opResult); 402 405 } 403 406 } … … 414 417 * @return error code 415 418 */ 416 static int usb_process_hub_local_power_change(usb_hub_info_t * hub_info,419 static int usb_process_hub_local_power_change(usb_hub_info_t * hub_info, 417 420 usb_hub_status_t status) { 418 421 int opResult = EOK; 419 422 opResult = usb_hub_clear_feature(hub_info->control_pipe, 420 423 USB_HUB_FEATURE_C_HUB_LOCAL_POWER); 421 if (opResult != EOK) {422 usb_log_error(" Cannnot clear hub power change flag: "423 "% s\n",424 str_error(opResult));424 if (opResult != EOK) { 425 usb_log_error("cannnot clear hub power change flag: " 426 "%d\n", 427 opResult); 425 428 } 426 429 return opResult; … … 434 437 * @param hub_info hub instance 435 438 */ 436 static void usb_hub_process_global_interrupt(usb_hub_info_t * hub_info) {437 usb_log_debug(" Global interrupt on a hub\n");439 static void usb_hub_process_global_interrupt(usb_hub_info_t * hub_info) { 440 usb_log_debug("global interrupt on a hub\n"); 438 441 usb_pipe_t *pipe = hub_info->control_pipe; 439 442 int opResult; … … 452 455 ); 453 456 if (opResult != EOK) { 454 usb_log_error("Could not get hub status: %s\n", 455 str_error(opResult)); 457 usb_log_error("could not get hub status\n"); 456 458 return; 457 459 } 458 460 if (rcvd_size != sizeof (usb_port_status_t)) { 459 usb_log_error(" Received status has incorrect size\n");461 usb_log_error("received status has incorrect size\n"); 460 462 return; 461 463 } 462 464 //port reset 463 465 if ( 464 usb_hub_is_status(status, 16 +USB_HUB_FEATURE_C_HUB_OVER_CURRENT)) {466 usb_hub_is_status(status,16+USB_HUB_FEATURE_C_HUB_OVER_CURRENT)) { 465 467 usb_process_hub_over_current(hub_info, status); 466 468 } 467 469 if ( 468 usb_hub_is_status(status, 16 +USB_HUB_FEATURE_C_HUB_LOCAL_POWER)) {470 usb_hub_is_status(status,16+USB_HUB_FEATURE_C_HUB_LOCAL_POWER)) { 469 471 usb_process_hub_local_power_change(hub_info, status); 470 472 } … … 479 481 * @param data pointer to usb_hub_info_t structure 480 482 */ 481 static void usb_hub_polling_terminated_callback(usb_device_t * device,482 bool was_error, void * data){483 static void usb_hub_polling_terminated_callback(usb_device_t * device, 484 bool was_error, void * data){ 483 485 usb_hub_info_t * hub = data; 484 486 assert(hub); -
uspace/drv/usbhub/usbhub.h
r5da18c7 ra2a3763 51 51 #include "ports.h" 52 52 53 54 53 55 /** Information about attached hub. */ 54 struct usb_hub_info_t 56 struct usb_hub_info_t{ 55 57 /** Number of ports. */ 56 58 size_t port_count; … … 104 106 }; 105 107 106 int usb_hub_add_device(usb_device_t *usb_dev); 108 //int usb_hub_control_loop(void * hub_info_param); 109 110 int usb_hub_add_device(usb_device_t * usb_dev); 107 111 108 112 bool hub_port_changes_callback(usb_device_t *dev, -
uspace/drv/usbhub/usbhub_private.h
r5da18c7 ra2a3763 65 65 */ 66 66 static inline void usb_hub_set_descriptor_request( 67 68 ){67 usb_device_request_setup_packet_t * request 68 ){ 69 69 request->index = 0; 70 70 request->request_type = USB_HUB_REQ_TYPE_GET_DESCRIPTOR; … … 87 87 int port_index, 88 88 usb_hub_class_feature_t feature) { 89 89 90 90 usb_device_request_setup_packet_t clear_request = { 91 91 .request_type = USB_HUB_REQ_TYPE_CLEAR_PORT_FEATURE, … … 96 96 clear_request.value = feature; 97 97 return usb_pipe_control_write(pipe, &clear_request, 98 sizeof 98 sizeof(clear_request), NULL, 0); 99 99 } 100 100 … … 120 120 clear_request.value = feature; 121 121 return usb_pipe_control_write(pipe, &clear_request, 122 sizeof 122 sizeof(clear_request), NULL, 0); 123 123 } 124 124 125 125 126 /** … … 141 142 clear_request.value = feature; 142 143 return usb_pipe_control_write(pipe, &clear_request, 143 sizeof 144 sizeof(clear_request), NULL, 0); 144 145 } 145 146 … … 162 163 clear_request.value = feature; 163 164 return usb_pipe_control_write(pipe, &clear_request, 164 sizeof 165 sizeof(clear_request), NULL, 0); 165 166 } 166 167 -
uspace/drv/usbhub/utils.c
r5da18c7 ra2a3763 62 62 * @return newly created serializd descriptor pointer 63 63 */ 64 void * usb_create_serialized_hub_descriptor(usb_hub_descriptor_t * descriptor) {64 void * usb_create_serialized_hub_descriptor(usb_hub_descriptor_t * descriptor) { 65 65 //base size 66 66 size_t size = 7; 67 67 //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; 69 69 size += 2 * var_size; 70 70 uint8_t * result = malloc(size); 71 71 //size 72 if 73 usb_serialize_hub_descriptor(descriptor, 72 if(result) 73 usb_serialize_hub_descriptor(descriptor,result); 74 74 return result; 75 75 } … … 82 82 * @param serialized_descriptor 83 83 */ 84 void usb_serialize_hub_descriptor(usb_hub_descriptor_t * descriptor,84 void usb_serialize_hub_descriptor(usb_hub_descriptor_t * descriptor, 85 85 void * serialized_descriptor) { 86 86 //base size … … 88 88 size_t size = 7; 89 89 //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; 91 91 size += 2 * var_size; 92 92 //size … … 110 110 } 111 111 112 112 113 /** 113 114 * create deserialized desriptor structure out of serialized descriptor … … 120 121 */ 121 122 usb_hub_descriptor_t * usb_create_deserialized_hub_desriptor( 122 void *serialized_descriptor) {123 void * serialized_descriptor) { 123 124 uint8_t * sdescriptor = serialized_descriptor; 124 125 … … 129 130 } 130 131 131 usb_hub_descriptor_t * result = malloc(sizeof 132 if 133 usb_deserialize_hub_desriptor(serialized_descriptor, 132 usb_hub_descriptor_t * result = malloc(sizeof(usb_hub_descriptor_t)); 133 if(result) 134 usb_deserialize_hub_desriptor(serialized_descriptor,result); 134 135 return result; 135 136 } … … 143 144 */ 144 145 void usb_deserialize_hub_desriptor( 145 void * serialized_descriptor, usb_hub_descriptor_t *descriptor) {146 void * serialized_descriptor, usb_hub_descriptor_t * descriptor) { 146 147 uint8_t * sdescriptor = serialized_descriptor; 147 148 descriptor->ports_count = sdescriptor[2]; … … 150 151 descriptor->pwr_on_2_good_time = sdescriptor[5]; 151 152 descriptor->current_requirement = sdescriptor[6]; 152 size_t var_size = (descriptor->ports_count +7) / 8;153 size_t var_size = (descriptor->ports_count+7) / 8; 153 154 //descriptor->devices_removable = (uint8_t*) malloc(var_size); 154 155 -
uspace/lib/usbhid/src/hiddescriptor.c
r5da18c7 ra2a3763 187 187 188 188 field = malloc(sizeof(usb_hid_report_field_t)); 189 if(field == NULL) {190 return ENOMEM;191 }192 193 189 memset(field, 0, sizeof(usb_hid_report_field_t)); 194 190 list_initialize(&field->link); … … 220 216 } 221 217 else { 222 usage = 218 usage = report_item->usages[ 223 219 report_item->usages_count- 1]; 224 220 } … … 245 241 246 242 field->size = report_item->size; 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) { 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) { 265 252 field->offset += 8; 266 253 report->use_report_ids = 1; 267 254 } 268 269 255 field->item_flags = report_item->item_flags; 270 256 … … 329 315 usb_hid_report_type_t type) { 330 316 331 if(report == NULL) {332 return NULL;333 }334 335 317 link_t *report_it = report->reports.next; 336 318 usb_hid_report_description_t *report_des = NULL; … … 340 322 usb_hid_report_description_t, link); 341 323 342 // if report id not set, return the first of the type 343 if(((report_des->report_id == report_id) || (report_id == 0)) && 324 if((report_des->report_id == report_id) && 344 325 (report_des->type == type)) { 345 326 return report_des; -
uspace/lib/usbhid/src/hidparser.c
r5da18c7 ra2a3763 153 153 154 154 155 report_des = usb_hid_report_find_description(report, *report_id, 156 type); 157 155 report_des = usb_hid_report_find_description(report, *report_id, type); 158 156 if(report_des == NULL) { 159 157 return EINVAL; … … 169 167 if(USB_HID_ITEM_FLAG_CONSTANT(item->item_flags) == 0) { 170 168 171 if(USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0) {169 if(USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0) { 172 170 173 171 // array … … 176 174 177 175 item->usage = USB_HID_EXTENDED_USAGE( 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, 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, 193 185 USB_HID_TAG_CLASS_LOCAL, item->usage); 194 186 … … 196 188 else { 197 189 // variable item 198 item->value = usb_hid_translate_data(item, 199 data); 200 } 190 item->value = usb_hid_translate_data(item, data); 191 } 201 192 } 202 193 list_item = list_item->next; … … 222 213 223 214 int32_t value=0; 224 int32_t mask =0;225 const uint8_t *foo =0;215 int32_t mask; 216 const uint8_t *foo; 226 217 227 218 // now only shot tags are allowed … … 249 240 if((size_t)(offset/8) != (size_t)((offset+item->size-1)/8)) { 250 241 251 part_size = 0;242 part_size = ((offset+item->size)%8); 252 243 253 244 size_t i=0; … … 255 246 if(i == (size_t)(offset/8)) { 256 247 // the higher one 257 part_size = 8 - (offset % 8);258 248 foo = data + i; 259 249 mask = ((1 << (item->size-part_size))-1); 260 value = (*foo & mask) ;250 value = (*foo & mask) << part_size; 261 251 } 262 252 else if(i == ((offset+item->size-1)/8)){ 263 253 // the lower one 264 254 foo = data + i; 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; 255 mask = ((1 << part_size)-1) << (8-part_size); 256 value += ((*foo & mask) >> (8-part_size)); 271 257 } 272 258 else { 273 value = (*(data + 1) << (part_size + 8)) + value;274 part_size += 8;259 value = value << 8; 260 value += *(data + 1); 275 261 } 276 262 } … … 389 375 report_item = list_get_instance(item, usb_hid_report_field_t, link); 390 376 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 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 397 395 usb_log_debug("\ttranslated value: %x\n", value); 398 396 … … 605 603 606 604 if(report_id > 0) { 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 } 605 report_it = usb_hid_report_find_description(report, report_id, 606 type)->link.next; 615 607 } 616 608 else { … … 625 617 return report_des->report_id; 626 618 } 627 628 report_it = report_it->next;629 619 } 630 620 -
uspace/lib/usbhid/src/hidpath.c
r5da18c7 ra2a3763 211 211 212 212 if(report_path->report_id != path->report_id) { 213 if(path->report_id != 0) { 214 return 1; 215 } 213 return 1; 216 214 } 217 215 -
uspace/srv/hid/console/console.c
r5da18c7 ra2a3763 768 768 769 769 int phone = fd_phone(fd); 770 close(fd);771 770 if (phone < 0) { 772 771 printf(NAME ": Failed to connect to input device\n"); … … 778 777 handler, &hash); 779 778 if (rc != EOK) { 780 async_hangup(phone);781 779 printf(NAME ": " \ 782 780 "Failed to create callback from input device: %s.\n",
Note:
See TracChangeset
for help on using the changeset viewer.