Changeset 5da18c7 in mainline
- Timestamp:
- 2011-05-30T18:41:16Z (13 years ago)
- 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. - Location:
- uspace
- Files:
-
- 1 added
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/mkbd/main.c
ra2a3763 r5da18c7 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;218 215 219 216 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", 223 221 str_error(rc)); 224 222 return rc; -
uspace/drv/ehci-hcd/main.c
ra2a3763 r5da18c7 75 75 } 76 76 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; 79 79 int irq = 0; 80 80 81 int ret = 82 pci_get_my_registers(device, &mem_reg_base, &mem_reg_size, &irq); 81 int ret = pci_get_my_registers(device, ®_base, ®_size, &irq); 83 82 CHECK_RET_RETURN(ret, 84 83 "Failed to get memory addresses for %" PRIun ": %s.\n", 85 84 device->handle, str_error(ret)); 86 85 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); 88 87 89 ret = pci_disable_legacy(device );88 ret = pci_disable_legacy(device, reg_base, reg_size, irq); 90 89 CHECK_RET_RETURN(ret, 91 90 "Failed(%d) disable legacy USB: %s.\n", ret, str_error(ret)); -
uspace/drv/ehci-hcd/pci.c
ra2a3763 r5da18c7 55 55 #define CMD_OFFSET 0x0 56 56 #define STS_OFFSET 0x4 57 #define INT_OFFSET 0x8 57 58 #define CFG_OFFSET 0x40 58 59 59 60 #define USBCMD_RUN 1 61 #define USBSTS_HALTED (1 << 12) 60 62 61 63 #define USBLEGSUP_OFFSET 0 … … 64 66 #define USBLEGCTLSTS_OFFSET 4 65 67 66 #define DEFAULT_WAIT 1000 068 #define DEFAULT_WAIT 1000 67 69 #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 } 68 129 69 130 /** Get address of registers and IRQ for given device. … … 75 136 * @return Error code. 76 137 */ 77 int pci_get_my_registers( ddf_dev_t *dev,138 int pci_get_my_registers(const ddf_dev_t *dev, 78 139 uintptr_t *mem_reg_address, size_t *mem_reg_size, int *irq_no) 79 140 { 80 141 assert(dev != NULL); 81 142 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); 84 145 if (parent_phone < 0) { 85 146 return parent_phone; … … 145 206 * @return Error code. 146 207 */ 147 int pci_enable_interrupts( ddf_dev_t *device)148 { 149 int parent_phone =208 int pci_enable_interrupts(const ddf_dev_t *device) 209 { 210 const int parent_phone = 150 211 devman_parent_device_connect(device->handle, IPC_FLAG_BLOCKING); 151 212 if (parent_phone < 0) { 152 213 return parent_phone; 153 214 } 154 bool enabled = hw_res_enable_interrupt(parent_phone);215 const bool enabled = hw_res_enable_interrupt(parent_phone); 155 216 async_hangup(parent_phone); 156 217 return enabled ? EOK : EIO; … … 162 223 * @return Error code. 163 224 */ 164 int pci_disable_legacy(ddf_dev_t *device) 225 int pci_disable_legacy( 226 const ddf_dev_t *device, uintptr_t reg_base, size_t reg_size, int irq) 165 227 { 166 228 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...) \ 174 234 if (ret != EOK) { \ 175 235 usb_log_error(message); \ 176 async_hangup(parent_phone); \177 236 return ret; \ 178 237 } else (void)0 179 238 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, ®s); 242 CHECK_RET_RETURN(ret, "Failed(%d) to map registers %p.\n", 243 ret, (void *) reg_base); 209 244 210 245 const uint32_t hcc_params = 211 *(uint32_t*)(reg isters + HCC_PARAMS_OFFSET);246 *(uint32_t*)(regs + HCC_PARAMS_OFFSET); 212 247 usb_log_debug("Value of hcc params register: %x.\n", hcc_params); 213 248 214 249 /* 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 = 217 252 (hcc_params >> HCC_PARAMS_EECP_OFFSET) & HCC_PARAMS_EECP_MASK; 218 253 usb_log_debug("Value of EECP: %x.\n", eecp); 219 254 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 227 255 /* 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); 233 260 234 261 /* Request control from firmware/BIOS, by writing 1 to highest byte. 235 262 * (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); 240 266 241 267 size_t wait = 0; 242 268 /* 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)) { 244 271 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); 247 273 wait += WAIT_STEP; 248 274 } 249 275 250 276 251 if (( value& USBLEGSUP_BIOS_CONTROL) == 0) {277 if ((usblegsup & USBLEGSUP_BIOS_CONTROL) == 0) { 252 278 usb_log_info("BIOS released control after %zu usec.\n", wait); 253 279 } else { … … 255 281 usb_log_warning( "BIOS failed to release control after " 256 282 "%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, 259 284 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 276 318 277 319 /* 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); 282 323 283 324 /* … … 286 327 287 328 /* Get size of capability registers in memory space. */ 288 uint8_t operation_offset = *(uint8_t*)registers;329 const unsigned operation_offset = *(uint8_t*)regs; 289 330 usb_log_debug("USBCMD offset: %d.\n", operation_offset); 290 331 291 332 /* Zero USBCMD register. */ 292 333 volatile uint32_t *usbcmd = 293 (uint32_t*)((uint8_t*)reg isters + operation_offset + CMD_OFFSET);334 (uint32_t*)((uint8_t*)regs + operation_offset + CMD_OFFSET); 294 335 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); 298 341 usb_log_debug("USBCMD value: %x.\n", *usbcmd); 299 342 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 300 347 *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); 303 350 usb_log_info("EHCI turned off.\n"); 304 351 } else { 305 352 usb_log_info("EHCI was not running.\n"); 306 353 } 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 311 361 return ret; 312 #undef CHECK_RET_ HANGUP_RETURN362 #undef CHECK_RET_RETURN 313 363 } 314 364 /*----------------------------------------------------------------------------*/ -
uspace/drv/ehci-hcd/pci.h
ra2a3763 r5da18c7 38 38 #include <ddf/driver.h> 39 39 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 *);40 int pci_get_my_registers(const ddf_dev_t *, uintptr_t *, size_t *, int *); 41 int pci_enable_interrupts(const ddf_dev_t *); 42 int pci_disable_legacy(const ddf_dev_t *, uintptr_t, size_t, int); 43 43 44 44 #endif -
uspace/drv/ohci/root_hub.c
ra2a3763 r5da18c7 57 57 .device_version = 0, 58 58 .length = sizeof (usb_standard_device_descriptor_t), 59 /// \TODO this value is guessed60 59 .max_packet_size = 8, 61 60 .vendor_id = 0x16db, … … 117 116 */ 118 117 static const uint32_t hub_clear_feature_by_writing_one_mask = 119 RHS_CLEAR_PORT_POWER;118 RHS_CLEAR_PORT_POWER; 120 119 121 120 /** … … 412 411 request->transfered_size = 4; 413 412 uint32_t data = instance->registers->rh_port_status[port - 1]; 414 memcpy(request->data_buffer, &data,4);413 memcpy(request->data_buffer, &data, 4); 415 414 #if 0 416 415 int i; … … 445 444 uint32_t data = mask & instance->registers->rh_status; 446 445 //uint32_buffer[0] = mask & instance->registers->rh_status; 447 memcpy(request->data_buffer, &data,4);446 memcpy(request->data_buffer, &data, 4); 448 447 449 448 return EOK; … … 468 467 469 468 usb_hub_bm_request_type_t request_type = request_packet->request_type; 470 if (buffer_size < 4 /*request_packet->length*/) {///\TODO469 if (buffer_size < 4) { 471 470 usb_log_warning("requested more data than buffer size\n"); 472 471 return EINVAL; … … 499 498 | (1 << (USB_HUB_FEATURE_C_HUB_OVER_CURRENT + 16)); 500 499 bzero(bitmap, instance->interrupt_mask_size); 501 if ((instance->registers->rh_status & mask) != 0) {500 if ((instance->registers->rh_status & mask) != 0) { 502 501 bitmap[0] = 1; 503 502 } … … 678 677 (instance->registers->rh_port_status[port - 1] | (1 << feature)) 679 678 & (~port_clear_feature_valid_mask); 680 /// \TODO any error?681 682 679 return EOK; 683 680 } … … 707 704 & (~port_clear_feature_valid_mask)) 708 705 | (1 << feature); 709 /// \TODO any error?710 706 711 707 return EOK; … … 925 921 * @return 926 922 */ 927 static int process_interrupt_mask_in_instance(rh_t *instance, usb_transfer_batch_t * request) { 923 static int process_interrupt_mask_in_instance(rh_t *instance, 924 usb_transfer_batch_t * request) { 928 925 memcpy(request->data_buffer, instance->interrupt_buffer, 929 926 instance->interrupt_mask_size); … … 945 942 * @return 946 943 */ 947 static bool is_zeros(void * 944 static bool is_zeros(void *buffer, size_t size) { 948 945 if (!buffer) return true; 949 946 if (!size) return true; -
uspace/drv/uhci-rhd/port.h
ra2a3763 r5da18c7 55 55 56 56 /** UHCI port structure */ 57 typedef struct uhci_port 58 { 57 typedef struct uhci_port { 59 58 const char *id_string; 60 59 port_status_t *address; … … 68 67 69 68 int 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); 72 71 73 72 void uhci_port_fini(uhci_port_t *port); -
uspace/drv/usbhid/usbhid.c
ra2a3763 r5da18c7 78 78 } 79 79 80 assert(hid_dev->subdriver_count >= 0); 81 80 82 // 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; 82 84 83 85 // 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; 85 88 86 89 // set the polling ended callback 87 hid_dev->subdrivers[ 0].poll_end = NULL;90 hid_dev->subdrivers[hid_dev->subdriver_count].poll_end = NULL; 88 91 89 92 // 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; 91 94 92 95 // set subdriver count 93 hid_dev->subdriver_count = 1;96 ++hid_dev->subdriver_count; 94 97 95 98 return EOK; … … 108 111 } 109 112 113 assert(hid_dev->subdriver_count >= 0); 114 110 115 // 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; 112 117 113 118 // 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; 115 121 116 122 // set the polling ended callback 117 hid_dev->subdrivers[ 0].poll_end = NULL;123 hid_dev->subdrivers[hid_dev->subdriver_count].poll_end = NULL; 118 124 119 125 // 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; 121 127 122 128 // set subdriver count 123 hid_dev->subdriver_count = 1;129 ++hid_dev->subdriver_count; 124 130 125 131 return EOK; … … 138 144 } 139 145 146 assert(hid_dev->subdriver_count >= 0); 147 140 148 // 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; 142 151 143 152 // 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; 145 155 146 156 // set the polling ended callback 147 hid_dev->subdrivers[ 0].poll_end = NULL;157 hid_dev->subdrivers[hid_dev->subdriver_count].poll_end = NULL; 148 158 149 159 // set the deinit callback 150 hid_dev->subdrivers[ 0].deinit = NULL;160 hid_dev->subdrivers[hid_dev->subdriver_count].deinit = NULL; 151 161 152 162 // set subdriver count 153 hid_dev->subdriver_count = 1;163 ++hid_dev->subdriver_count; 154 164 155 165 return EOK; … … 196 206 } 197 207 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 // } 202 212 203 213 assert(hid_dev->report != NULL); … … 206 216 // size_t size = usb_hid_report_size(hid_dev->report, 0, 207 217 // 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); 219 280 usb_hid_report_path_free(usage_path); 220 281 221 return (size > 0);282 return matches; 222 283 } 223 284 … … 368 429 369 430 do { 431 usb_log_debug("Getting size of the report.\n"); 370 432 size = usb_hid_report_byte_size(hid_dev->report, report_id, 371 433 USB_HID_REPORT_TYPE_INPUT); 372 434 usb_log_debug("Report ID: %u, size: %zu\n", report_id, size); 373 435 max_size = (size > max_size) ? size : max_size; 436 usb_log_debug("Getting next report ID\n"); 374 437 report_id = usb_hid_get_next_report_id(hid_dev->report, 375 438 report_id, USB_HID_REPORT_TYPE_INPUT); … … 501 564 hid_dev->subdriver_count); 502 565 //usb_hid_free(&hid_dev); 566 503 567 } else { 504 568 bool ok = false; … … 527 591 } 528 592 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 534 603 535 604 return rc; … … 554 623 usb_log_debug("Max input report size: %zu, buffer size: %zu\n", 555 624 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 } 583 632 584 633 bool cont = false; -
uspace/drv/usbhub/main.c
ra2a3763 r5da18c7 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
ra2a3763 r5da18c7 64 64 */ 65 65 static 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) { 68 67 request->index = port; 69 68 request->request_type = USB_HUB_REQ_TYPE_GET_PORT_STATUS; … … 79 78 */ 80 79 static 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) { 83 81 request->index = 0; 84 82 request->request_type = USB_HUB_REQ_TYPE_GET_HUB_STATUS; … … 95 93 static inline usb_device_request_setup_packet_t * 96 94 usb_hub_create_port_status_request(uint16_t port) { 97 usb_device_request_setup_packet_t * 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)); 99 97 usb_hub_set_port_status_request(result, port); 100 98 return result; … … 108 106 */ 109 107 static 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) { 113 110 request->index = port; 114 111 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 125 122 */ 126 123 static inline void usb_hub_set_disable_port_feature_request( 127 usb_device_request_setup_packet_t *request, uint16_t port,128 129 124 usb_device_request_setup_packet_t *request, uint16_t port, 125 uint16_t feature_selector 126 ) { 130 127 request->index = port; 131 128 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 141 138 */ 142 139 static inline void usb_hub_set_enable_port_request( 143 usb_device_request_setup_packet_t *request, uint16_t port144 140 usb_device_request_setup_packet_t *request, uint16_t port 141 ) { 145 142 request->index = port; 146 143 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 157 154 static inline usb_device_request_setup_packet_t * 158 155 usb_hub_create_enable_port_request(uint16_t port) { 159 usb_device_request_setup_packet_t * 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)); 161 158 usb_hub_set_enable_port_request(result, port); 162 159 return result; … … 169 166 */ 170 167 static inline void usb_hub_set_disable_port_request( 171 usb_device_request_setup_packet_t *request, uint16_t port172 168 usb_device_request_setup_packet_t *request, uint16_t port 169 ) { 173 170 request->index = port; 174 171 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 185 182 static inline usb_device_request_setup_packet_t * 186 183 usb_hub_create_disable_port_request(uint16_t port) { 187 usb_device_request_setup_packet_t * 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)); 189 186 usb_hub_set_disable_port_request(result, port); 190 187 return result; … … 197 194 */ 198 195 static inline void usb_hub_set_reset_port_request( 199 usb_device_request_setup_packet_t *request, uint16_t port200 196 usb_device_request_setup_packet_t *request, uint16_t port 197 ) { 201 198 request->index = port; 202 199 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 213 210 static inline usb_device_request_setup_packet_t * 214 211 usb_hub_create_reset_port_request(uint16_t port) { 215 usb_device_request_setup_packet_t * 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)); 217 214 usb_hub_set_reset_port_request(result, port); 218 215 return result; … … 225 222 */ 226 223 static inline void usb_hub_set_power_port_request( 227 usb_device_request_setup_packet_t *request, uint16_t port228 224 usb_device_request_setup_packet_t *request, uint16_t port 225 ) { 229 226 request->index = port; 230 227 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 240 237 */ 241 238 static inline void usb_hub_unset_power_port_request( 242 usb_device_request_setup_packet_t *request, uint16_t port243 239 usb_device_request_setup_packet_t *request, uint16_t port 240 ) { 244 241 request->index = port; 245 242 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; … … 257 254 */ 258 255 static 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; 260 257 } 261 258 … … 268 265 */ 269 266 static inline void usb_port_status_set_bit( 270 267 usb_port_status_t * status, int idx, bool value) { 271 268 (*status) = value ? 272 273 269 ((*status) | (1 << (idx))) : 270 ((*status)&(~(1 << (idx)))); 274 271 } 275 272 … … 282 279 */ 283 280 static 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; 285 282 } 286 283 … … 293 290 */ 294 291 static 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) { 296 293 (*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 432 298 /** 433 299 * low speed device on the port indicator … … 446 312 * @param low_speed value of the bit 447 313 */ 448 static inline void usb_port_set_low_speed(usb_port_status_t * 314 static inline void usb_port_set_low_speed(usb_port_status_t *status, bool low_speed) { 449 315 usb_port_status_set_bit(status, 9, low_speed); 450 316 } 451 317 452 318 //high speed device attached 319 453 320 /** 454 321 * high speed device on the port indicator … … 467 334 * @param high_speed value of the bit 468 335 */ 469 static inline void usb_port_set_high_speed(usb_port_status_t * 336 static inline void usb_port_set_high_speed(usb_port_status_t *status, bool high_speed) { 470 337 usb_port_status_set_bit(status, 10, high_speed); 471 338 } … … 485 352 } 486 353 487 #if 0488 //connect change489 /**490 * port connect change indicator491 *492 * @param status493 * @return true if connection has changed494 */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 status501 * @param status502 * @param change value of the bit503 */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 change509 /**510 * port enable change for port status511 *512 * @param status513 * @return true if the port has been enabled/disabled514 */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 status521 *522 * @param status523 * @param change value of the bit524 */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 change530 /**531 * port suspend change for port status532 *533 * @param status534 * @return ture if suspend status has changed535 */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 status542 *543 * @param status544 * @param change value of the bit545 */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 change551 /**552 * over current change indicator553 *554 * @param status555 * @return true if over-current condition on port has changed556 */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 status563 *564 * @param status565 * @param change value of the bit566 */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 change572 /**573 * port reset change indicator574 * @param status575 * @return true if port has been reset576 */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 status583 *584 * @param status585 * @param change value of the bit586 */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 status592 /**593 * local power lost indicator for hub status594 *595 * @param status596 * @return true if hub is not powered597 */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 status604 *605 * @param status606 * @param change value of the bit607 */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 ocndition614 /**615 * hub over-current indicator616 *617 * @param status618 * @return true if over-current condition occurred on hub619 */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 status626 *627 * @param status628 * @param change value of the bit629 */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 change636 /**637 * hub power change indicator638 *639 * @param status640 * @return true if local power status has been changed - power has been641 * dropped or re-established642 */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 status649 *650 * @param status651 * @param change value of the bit652 */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 status659 /**660 * hub over-current condition change indicator661 *662 * @param status663 * @return true if over-current condition has changed664 */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 status671 *672 * @param status673 * @param change value of the bit674 */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 #endif680 354 681 355 -
uspace/drv/usbhub/ports.c
ra2a3763 r5da18c7 47 47 #include "port_status.h" 48 48 49 50 49 /** Information for fibril for device discovery. */ 51 50 struct add_device_phase1 { … … 65 64 * any function here and must be cleared by hand 66 65 */ 67 static const int non_handled_changes[] = 66 static const int non_handled_changes[] = { 68 67 USB_HUB_FEATURE_C_PORT_ENABLE, 69 68 USB_HUB_FEATURE_C_PORT_SUSPEND … … 71 70 72 71 static 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 * 76 77 78 static void usb_hub_port_over_current(usb_hub_info_t * 79 72 usb_hub_info_t *hub, uint16_t port); 73 74 static void usb_hub_port_reset_completed(usb_hub_info_t *hub, 75 uint16_t port, uint32_t status); 76 77 static void usb_hub_port_over_current(usb_hub_info_t *hub, 78 uint16_t port, uint32_t status); 80 79 81 80 static int get_port_status(usb_pipe_t *ctrl_pipe, size_t port, … … 96 95 * @param port port number, starting from 1 97 96 */ 98 void usb_hub_process_interrupt(usb_hub_info_t * 99 100 usb_log_debug(" interrupt at port %zu\n", (size_t) port);97 void 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); 101 100 //determine type of change 102 101 //usb_pipe_t *pipe = hub->control_pipe; … … 134 133 if (usb_port_is_status(status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT)) { 135 134 //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"); 137 136 usb_hub_port_over_current(hub, port, status); 138 137 } … … 141 140 usb_hub_port_reset_completed(hub, port, status); 142 141 } 143 usb_log_debug(" status x%x : %d\n ", status, status);142 usb_log_debug("Status x%x : %d\n ", status, status); 144 143 145 144 usb_port_status_set_bit( 146 &status, USB_HUB_FEATURE_C_PORT_CONNECTION, false);145 &status, USB_HUB_FEATURE_C_PORT_CONNECTION, false); 147 146 usb_port_status_set_bit( 148 &status, USB_HUB_FEATURE_C_PORT_RESET, false);147 &status, USB_HUB_FEATURE_C_PORT_RESET, false); 149 148 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 152 151 //clearing not yet handled changes 153 152 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) { 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 port, bit_idx);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: %d\n",168 bit_idx, opResult167 "Could not clear port flag %d: %s\n", 168 bit_idx, str_error(opResult) 169 169 ); 170 170 } 171 171 usb_port_status_set_bit( 172 &status, bit_idx, false);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 181 180 182 181 /** … … 190 189 */ 191 190 static void usb_hub_removed_device( 192 usb_hub_info_t *hub, uint16_t port) {191 usb_hub_info_t *hub, uint16_t port) { 193 192 194 193 int opResult = usb_hub_clear_port_feature(hub->control_pipe, 195 194 port, USB_HUB_FEATURE_C_PORT_CONNECTION); 196 195 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"); 198 197 } 199 198 /** \TODO remove device from device manager - not yet implemented in … … 231 230 } 232 231 233 234 232 /** 235 233 * Process port reset change … … 241 239 * @param status 242 240 */ 243 static void usb_hub_port_reset_completed(usb_hub_info_t * 244 uint16_t port, uint32_t status){241 static void usb_hub_port_reset_completed(usb_hub_info_t *hub, 242 uint16_t port, uint32_t status) { 245 243 usb_log_debug("Port %zu reset complete.\n", (size_t) port); 246 244 if (usb_port_is_status(status, USB_HUB_FEATURE_PORT_ENABLE)) { … … 274 272 * @param port port number, starting from 1 275 273 */ 276 static void usb_hub_port_over_current(usb_hub_info_t * 277 274 static void usb_hub_port_over_current(usb_hub_info_t *hub, 275 uint16_t port, uint32_t status) { 278 276 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)) { 280 278 opResult = usb_hub_clear_port_feature(hub->control_pipe, 281 279 port, USB_HUB_FEATURE_PORT_POWER); 282 280 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)); 285 283 } 286 } else{284 } else { 287 285 opResult = usb_hub_set_port_feature(hub->control_pipe, 288 286 port, USB_HUB_FEATURE_PORT_POWER); 289 287 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)); 292 290 } 293 291 } … … 302 300 */ 303 301 static 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) { 306 303 size_t recv_size; 307 304 usb_device_request_setup_packet_t request; … … 310 307 usb_hub_set_port_status_request(&request, port); 311 308 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); 314 311 if (rc != EOK) { 315 312 return rc; … … 336 333 * @return Error code. 337 334 */ 338 static int enable_port_callback(int port_no, void *arg) 339 { 335 static int enable_port_callback(int port_no, void *arg) { 340 336 usb_hub_info_t *hub = arg; 341 337 int rc; … … 345 341 usb_hub_set_reset_port_request(&request, port_no); 346 342 rc = usb_pipe_control_write(hub->control_pipe, 347 &request, sizeof (request), NULL, 0);343 &request, sizeof (request), NULL, 0); 348 344 if (rc != EOK) { 349 345 usb_log_warning("Port reset failed: %s.\n", str_error(rc)); … … 375 371 * @return 0 Always. 376 372 */ 377 static int add_device_phase1_worker_fibril(void *arg) 378 { 373 static int add_device_phase1_worker_fibril(void *arg) { 379 374 struct add_device_phase1 *data 380 375 = (struct add_device_phase1 *) arg; … … 418 413 } 419 414 420 421 415 /** Start device adding when connection change is detected. 422 416 * … … 429 423 */ 430 424 static int create_add_device_fibril(usb_hub_info_t *hub, size_t port, 431 usb_speed_t speed) 432 { 425 usb_speed_t speed) { 433 426 struct add_device_phase1 *data 434 = malloc(sizeof (struct add_device_phase1));427 = malloc(sizeof (struct add_device_phase1)); 435 428 if (data == NULL) { 436 429 return ENOMEM; -
uspace/drv/usbhub/ports.h
ra2a3763 r5da18c7 70 70 71 71 72 void usb_hub_process_interrupt(usb_hub_info_t * 72 void usb_hub_process_interrupt(usb_hub_info_t *hub, 73 73 uint16_t port); 74 74 -
uspace/drv/usbhub/usbhub.c
ra2a3763 r5da18c7 56 56 57 57 58 static usb_hub_info_t * usb_hub_info_create(usb_device_t * 59 60 static int usb_hub_process_hub_specific_info(usb_hub_info_t * 61 62 static int usb_hub_set_configuration(usb_hub_info_t * 63 64 static int usb_hub_start_hub_fibril(usb_hub_info_t * 65 66 static int usb_process_hub_over_current(usb_hub_info_t * 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 * 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 * 73 74 static void usb_hub_polling_terminated_callback(usb_device_t * 75 bool was_error, void * 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 * 92 int usb_hub_add_device(usb_device_t *usb_dev) { 93 93 if (!usb_dev) return EINVAL; 94 usb_hub_info_t * 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 " errno %d\n",103 opResult);101 usb_log_error("Could not initialize connection to device, " 102 " %s\n", 103 str_error(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, errno %d\n",112 opResult);111 usb_log_error("Could not set hub configuration, %s\n", 112 str_error(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, errno %d\n",120 opResult);119 usb_log_error("Could process hub specific info, %s\n", 120 str_error(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 142 141 143 142 /** Callback for polling hub for changes. … … 193 192 * @return basic usb_hub_info_t structure 194 193 */ 195 static usb_hub_info_t * usb_hub_info_create(usb_device_t * 196 usb_hub_info_t * result = malloc(sizeof (usb_hub_info_t));194 static 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)); 197 196 if (!result) return NULL; 198 197 result->usb_device = usb_dev; … … 202 201 203 202 result->ports = NULL; 204 result->port_count = (size_t) - 1;203 result->port_count = (size_t) - 1; 205 204 fibril_mutex_initialize(&result->port_mutex); 206 205 … … 221 220 * @return error code 222 221 */ 223 static int usb_hub_process_hub_specific_info(usb_hub_info_t * 222 static int usb_hub_process_hub_specific_info(usb_hub_info_t *hub_info) { 224 223 // get hub descriptor 225 usb_log_debug(" creating serialized descriptor\n");224 usb_log_debug("Creating serialized descriptor\n"); 226 225 uint8_t serialized_descriptor[USB_HUB_MAX_DESCRIPTOR_SIZE]; 227 226 usb_hub_descriptor_t * descriptor; … … 235 234 236 235 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)); 240 239 free(serialized_descriptor); 241 240 return opResult; 242 241 } 243 usb_log_debug2(" deserializing descriptor\n");242 usb_log_debug2("Deserializing descriptor\n"); 244 243 descriptor = usb_create_deserialized_hub_desriptor( 245 244 serialized_descriptor); … … 250 249 usb_log_debug("setting port count to %d\n", descriptor->ports_count); 251 250 hub_info->port_count = descriptor->ports_count; 252 /// \TODO this is not semantically correct253 251 bool is_power_switched = 254 ((descriptor->hub_characteristics & 1) == 0);252 ((descriptor->hub_characteristics & 1) == 0); 255 253 bool has_individual_port_powering = 256 ((descriptor->hub_characteristics & 1) != 0);254 ((descriptor->hub_characteristics & 1) != 0); 257 255 hub_info->ports = malloc( 258 256 sizeof (usb_hub_port_t) * (hub_info->port_count + 1)); 259 if (!hub_info->ports){257 if (!hub_info->ports) { 260 258 return ENOMEM; 261 259 } … … 264 262 usb_hub_port_init(&hub_info->ports[port]); 265 263 } 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"); 271 269 opResult = usb_hub_set_feature(hub_info->control_pipe, 272 270 USB_HUB_FEATURE_C_HUB_LOCAL_POWER); 273 271 if (opResult != EOK) { 274 usb_log_error(" cannot power hub: %s\n",272 usb_log_error("Cannot power hub: %s\n", 275 273 str_error(opResult)); 276 274 } … … 278 276 279 277 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); 281 279 opResult = usb_hub_set_port_feature(hub_info->control_pipe, 282 280 port, USB_HUB_FEATURE_PORT_POWER); … … 286 284 } 287 285 } 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"); 293 291 free(descriptor); 294 292 return EOK; … … 303 301 * @return error code 304 302 */ 305 static int usb_hub_set_configuration(usb_hub_info_t * 303 static int usb_hub_set_configuration(usb_hub_info_t *hub_info) { 306 304 //device descriptor 307 305 usb_standard_device_descriptor_t *std_descriptor 308 306 = &hub_info->usb_device->descriptors.device; 309 usb_log_debug(" hub has %d configurations\n",307 usb_log_debug("Hub has %d configurations\n", 310 308 std_descriptor->configuration_count); 311 309 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"); 313 311 return EINVAL; 314 312 } … … 328 326 return opResult; 329 327 } 330 usb_log_debug("\t used configuration %d\n",328 usb_log_debug("\tUsed configuration %d\n", 331 329 config_descriptor->configuration_number); 332 330 … … 343 341 * @return error code 344 342 */ 345 static int usb_hub_start_hub_fibril(usb_hub_info_t * hub_info){343 static int usb_hub_start_hub_fibril(usb_hub_info_t *hub_info) { 346 344 int rc; 347 345 … … 367 365 //********************************************* 368 366 369 370 367 /** 371 368 * process hub over current change … … 376 373 * @return error code 377 374 */ 378 static int usb_process_hub_over_current(usb_hub_info_t * 375 static int usb_process_hub_over_current(usb_hub_info_t *hub_info, 379 376 usb_hub_status_t status) { 380 377 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)) { 382 379 //poweroff all ports 383 380 unsigned int port; 384 for (port = 1;port <= hub_info->port_count;++port){381 for (port = 1; port <= hub_info->port_count; ++port) { 385 382 opResult = usb_hub_clear_port_feature( 386 hub_info->control_pipe, port,383 hub_info->control_pipe, port, 387 384 USB_HUB_FEATURE_PORT_POWER); 388 385 if (opResult != EOK) { 389 386 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)); 392 389 } 393 390 } … … 395 392 //power all ports 396 393 unsigned int port; 397 for (port = 1;port <= hub_info->port_count;++port){394 for (port = 1; port <= hub_info->port_count; ++port) { 398 395 opResult = usb_hub_set_port_feature( 399 hub_info->control_pipe, port,396 hub_info->control_pipe, port, 400 397 USB_HUB_FEATURE_PORT_POWER); 401 398 if (opResult != EOK) { 402 399 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)); 405 402 } 406 403 } … … 417 414 * @return error code 418 415 */ 419 static int usb_process_hub_local_power_change(usb_hub_info_t * 416 static int usb_process_hub_local_power_change(usb_hub_info_t *hub_info, 420 417 usb_hub_status_t status) { 421 418 int opResult = EOK; 422 419 opResult = usb_hub_clear_feature(hub_info->control_pipe, 423 420 USB_HUB_FEATURE_C_HUB_LOCAL_POWER); 424 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)); 428 425 } 429 426 return opResult; … … 437 434 * @param hub_info hub instance 438 435 */ 439 static void usb_hub_process_global_interrupt(usb_hub_info_t * 440 usb_log_debug(" global interrupt on a hub\n");436 static void usb_hub_process_global_interrupt(usb_hub_info_t *hub_info) { 437 usb_log_debug("Global interrupt on a hub\n"); 441 438 usb_pipe_t *pipe = hub_info->control_pipe; 442 439 int opResult; … … 455 452 ); 456 453 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)); 458 456 return; 459 457 } 460 458 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"); 462 460 return; 463 461 } 464 462 //port reset 465 463 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)) { 467 465 usb_process_hub_over_current(hub_info, status); 468 466 } 469 467 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)) { 471 469 usb_process_hub_local_power_change(hub_info, status); 472 470 } … … 481 479 * @param data pointer to usb_hub_info_t structure 482 480 */ 483 static void usb_hub_polling_terminated_callback(usb_device_t * 484 bool was_error, void * data){481 static void usb_hub_polling_terminated_callback(usb_device_t *device, 482 bool was_error, void *data) { 485 483 usb_hub_info_t * hub = data; 486 484 assert(hub); -
uspace/drv/usbhub/usbhub.h
ra2a3763 r5da18c7 51 51 #include "ports.h" 52 52 53 54 55 53 /** Information about attached hub. */ 56 struct usb_hub_info_t {54 struct usb_hub_info_t { 57 55 /** Number of ports. */ 58 56 size_t port_count; … … 106 104 }; 107 105 108 //int usb_hub_control_loop(void * hub_info_param); 109 110 int usb_hub_add_device(usb_device_t * usb_dev); 106 int usb_hub_add_device(usb_device_t *usb_dev); 111 107 112 108 bool hub_port_changes_callback(usb_device_t *dev, -
uspace/drv/usbhub/usbhub_private.h
ra2a3763 r5da18c7 65 65 */ 66 66 static inline void usb_hub_set_descriptor_request( 67 usb_device_request_setup_packet_t * request68 ){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 (clear_request), NULL, 0);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 (clear_request), NULL, 0);122 sizeof (clear_request), NULL, 0); 123 123 } 124 125 124 126 125 /** … … 142 141 clear_request.value = feature; 143 142 return usb_pipe_control_write(pipe, &clear_request, 144 sizeof (clear_request), NULL, 0);143 sizeof (clear_request), NULL, 0); 145 144 } 146 145 … … 163 162 clear_request.value = feature; 164 163 return usb_pipe_control_write(pipe, &clear_request, 165 sizeof (clear_request), NULL, 0);164 sizeof (clear_request), NULL, 0); 166 165 } 167 166 -
uspace/drv/usbhub/utils.c
ra2a3763 r5da18c7 62 62 * @return newly created serializd descriptor pointer 63 63 */ 64 void * usb_create_serialized_hub_descriptor(usb_hub_descriptor_t * 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 (result)73 usb_serialize_hub_descriptor(descriptor, result);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 * 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 113 112 /** 114 113 * create deserialized desriptor structure out of serialized descriptor … … 121 120 */ 122 121 usb_hub_descriptor_t * usb_create_deserialized_hub_desriptor( 123 void *serialized_descriptor) {122 void *serialized_descriptor) { 124 123 uint8_t * sdescriptor = serialized_descriptor; 125 124 … … 130 129 } 131 130 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); 135 134 return result; 136 135 } … … 144 143 */ 145 144 void usb_deserialize_hub_desriptor( 146 void * serialized_descriptor, usb_hub_descriptor_t *descriptor) {145 void * serialized_descriptor, usb_hub_descriptor_t *descriptor) { 147 146 uint8_t * sdescriptor = serialized_descriptor; 148 147 descriptor->ports_count = sdescriptor[2]; … … 151 150 descriptor->pwr_on_2_good_time = sdescriptor[5]; 152 151 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; 154 153 //descriptor->devices_removable = (uint8_t*) malloc(var_size); 155 154 -
uspace/lib/usbhid/src/hiddescriptor.c
ra2a3763 r5da18c7 187 187 188 188 field = malloc(sizeof(usb_hid_report_field_t)); 189 if(field == NULL) { 190 return ENOMEM; 191 } 192 189 193 memset(field, 0, sizeof(usb_hid_report_field_t)); 190 194 list_initialize(&field->link); … … 216 220 } 217 221 else { 218 usage = 222 usage = report_item->usages[ 219 223 report_item->usages_count- 1]; 220 224 } … … 241 245 242 246 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) { 252 265 field->offset += 8; 253 266 report->use_report_ids = 1; 254 267 } 268 255 269 field->item_flags = report_item->item_flags; 256 270 … … 315 329 usb_hid_report_type_t type) { 316 330 331 if(report == NULL) { 332 return NULL; 333 } 334 317 335 link_t *report_it = report->reports.next; 318 336 usb_hid_report_description_t *report_des = NULL; … … 322 340 usb_hid_report_description_t, link); 323 341 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)) && 325 344 (report_des->type == type)) { 326 345 return report_des; -
uspace/lib/usbhid/src/hidparser.c
ra2a3763 r5da18c7 153 153 154 154 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 156 158 if(report_des == NULL) { 157 159 return EINVAL; … … 167 169 if(USB_HID_ITEM_FLAG_CONSTANT(item->item_flags) == 0) { 168 170 169 if(USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0) 171 if(USB_HID_ITEM_FLAG_VARIABLE(item->item_flags) == 0){ 170 172 171 173 // array … … 174 176 175 177 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, 185 193 USB_HID_TAG_CLASS_LOCAL, item->usage); 186 194 … … 188 196 else { 189 197 // variable item 190 item->value = usb_hid_translate_data(item, data); 191 } 198 item->value = usb_hid_translate_data(item, 199 data); 200 } 192 201 } 193 202 list_item = list_item->next; … … 213 222 214 223 int32_t value=0; 215 int32_t mask ;216 const uint8_t *foo ;224 int32_t mask=0; 225 const uint8_t *foo=0; 217 226 218 227 // now only shot tags are allowed … … 240 249 if((size_t)(offset/8) != (size_t)((offset+item->size-1)/8)) { 241 250 242 part_size = ((offset+item->size)%8);251 part_size = 0; 243 252 244 253 size_t i=0; … … 246 255 if(i == (size_t)(offset/8)) { 247 256 // the higher one 257 part_size = 8 - (offset % 8); 248 258 foo = data + i; 249 259 mask = ((1 << (item->size-part_size))-1); 250 value = (*foo & mask) << part_size;260 value = (*foo & mask); 251 261 } 252 262 else if(i == ((offset+item->size-1)/8)){ 253 263 // the lower one 254 264 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; 257 271 } 258 272 else { 259 value = value << 8;260 value += *(data + 1);273 value = (*(data + 1) << (part_size + 8)) + value; 274 part_size += 8; 261 275 } 262 276 } … … 375 389 report_item = list_get_instance(item, usb_hid_report_field_t, link); 376 390 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 395 397 usb_log_debug("\ttranslated value: %x\n", value); 396 398 … … 603 605 604 606 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 } 607 615 } 608 616 else { … … 617 625 return report_des->report_id; 618 626 } 627 628 report_it = report_it->next; 619 629 } 620 630 -
uspace/lib/usbhid/src/hidpath.c
ra2a3763 r5da18c7 211 211 212 212 if(report_path->report_id != path->report_id) { 213 return 1; 213 if(path->report_id != 0) { 214 return 1; 215 } 214 216 } 215 217 -
uspace/srv/hid/console/console.c
ra2a3763 r5da18c7 768 768 769 769 int phone = fd_phone(fd); 770 close(fd); 770 771 if (phone < 0) { 771 772 printf(NAME ": Failed to connect to input device\n"); … … 777 778 handler, &hash); 778 779 if (rc != EOK) { 780 async_hangup(phone); 779 781 printf(NAME ": " \ 780 782 "Failed to create callback from input device: %s.\n",
Note:
See TracChangeset
for help on using the changeset viewer.