Changes in / [51b46f2:0e3505a] in mainline
- Location:
- uspace
- Files:
-
- 2 added
- 2 deleted
- 35 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/pciintel/pci.c
r51b46f2 r0e3505a 320 320 /* Get the value of the BAR. */ 321 321 val = pci_conf_read_32(fun, addr); 322 323 #define IO_MASK (~0x3)324 #define MEM_MASK (~0xf)325 322 326 323 io = (bool) (val & 1); 327 324 if (io) { 328 325 addrw64 = false; 329 mask = IO_MASK;330 326 } else { 331 mask = MEM_MASK;332 327 switch ((val >> 1) & 3) { 333 328 case 0: … … 345 340 /* Get the address mask. */ 346 341 pci_conf_write_32(fun, addr, 0xffffffff); 347 mask &= pci_conf_read_32(fun, addr);342 mask = pci_conf_read_32(fun, addr); 348 343 349 344 /* Restore the original value. */ … … 664 659 size_t pci_bar_mask_to_size(uint32_t mask) 665 660 { 666 size_t size = mask & ~(mask - 1); 667 return size; 661 return ((mask & 0xfffffff0) ^ 0xffffffff) + 1; 668 662 } 669 663 -
uspace/drv/uhci-hcd/Makefile
r51b46f2 r0e3505a 39 39 uhci.c \ 40 40 uhci_struct/transfer_descriptor.c \ 41 utils/device_keeper.c \42 41 pci.c \ 43 42 batch.c -
uspace/drv/uhci-hcd/batch.c
r51b46f2 r0e3505a 33 33 */ 34 34 #include <errno.h> 35 #include <str_error.h>36 35 37 36 #include <usb/debug.h> … … 54 53 batch_t * batch_get(ddf_fun_t *fun, usb_target_t target, 55 54 usb_transfer_type_t transfer_type, size_t max_packet_size, 56 usb_speed_t speed, char *buffer, size_t size,55 dev_speed_t speed, char *buffer, size_t size, 57 56 char* setup_buffer, size_t setup_size, 58 57 usbhc_iface_transfer_in_callback_t func_in, … … 134 133 135 134 queue_head_element_td(instance->qh, addr_to_phys(instance->tds)); 136 usb_log_debug("Batch(%p) %d:%d memory structures ready.\n",137 instance, target.address, target.endpoint);138 135 return instance; 139 136 } … … 142 139 { 143 140 assert(instance); 144 usb_log_debug 2("Batch(%p) checking %d packet(s)for completion.\n",141 usb_log_debug("Checking(%p) %d packet for completion.\n", 145 142 instance, instance->packets); 146 143 instance->transfered_size = 0; … … 154 151 if (i > 0) 155 152 instance->transfered_size -= instance->setup_size; 156 usb_log_debug("Batch(%p) found error TD(%d):%x.\n",157 instance, i, instance->tds[i].status);158 153 return true; 159 154 } … … 161 156 transfer_descriptor_actual_size(&instance->tds[i]); 162 157 } 158 /* This is just an ugly trick to support the old API */ 163 159 instance->transfered_size -= instance->setup_size; 164 160 return true; … … 172 168 memcpy(instance->transport_buffer, instance->buffer, instance->buffer_size); 173 169 174 const bool low_speed = instance->speed == USB_SPEED_LOW;175 170 int toggle = 0; 176 171 /* setup stage */ 177 172 transfer_descriptor_init(instance->tds, DEFAULT_ERROR_COUNT, 178 instance->setup_size, toggle, false, low_speed, 179 instance->target, USB_PID_SETUP, instance->setup_buffer, 180 &instance->tds[1]); 173 instance->setup_size, toggle, false, instance->target, 174 USB_PID_SETUP, instance->setup_buffer, &instance->tds[1]); 181 175 182 176 /* data stage */ … … 188 182 189 183 transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT, 190 instance->max_packet_size, toggle++, false, low_speed,191 instance->target,USB_PID_OUT, data, &instance->tds[i + 1]);184 instance->max_packet_size, toggle++, false, instance->target, 185 USB_PID_OUT, data, &instance->tds[i + 1]); 192 186 } 193 187 … … 195 189 i = instance->packets - 1; 196 190 transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT, 197 0, 1, false, low_speed,instance->target, USB_PID_IN, NULL, NULL);191 0, 1, false, instance->target, USB_PID_IN, NULL, NULL); 198 192 199 193 instance->tds[i].status |= TD_STATUS_COMPLETE_INTERRUPT_FLAG; 200 usb_log_debug2("Control write last TD status: %x.\n",201 instance->tds[i].status);202 194 203 195 instance->next_step = batch_call_out_and_dispose; 204 usb_log_debug("Batch(%p) CONTROL WRITE initialized.\n", instance);205 196 batch_schedule(instance); 206 197 } … … 210 201 assert(instance); 211 202 212 const bool low_speed = instance->speed == USB_SPEED_LOW;213 203 int toggle = 0; 214 204 /* setup stage */ 215 205 transfer_descriptor_init(instance->tds, DEFAULT_ERROR_COUNT, 216 instance->setup_size, toggle, false, low_speed,instance->target,206 instance->setup_size, toggle, false, instance->target, 217 207 USB_PID_SETUP, instance->setup_buffer, &instance->tds[1]); 218 208 … … 225 215 226 216 transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT, 227 instance->max_packet_size, toggle, false, low_speed,228 instance->target,USB_PID_IN, data, &instance->tds[i + 1]);217 instance->max_packet_size, toggle, false, instance->target, 218 USB_PID_IN, data, &instance->tds[i + 1]); 229 219 } 230 220 … … 232 222 i = instance->packets - 1; 233 223 transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT, 234 0, 1, false, low_speed,instance->target, USB_PID_OUT, NULL, NULL);224 0, 1, false, instance->target, USB_PID_OUT, NULL, NULL); 235 225 236 226 instance->tds[i].status |= TD_STATUS_COMPLETE_INTERRUPT_FLAG; 237 usb_log_debug2("Control read last TD status: %x.\n",238 instance->tds[i].status);239 227 240 228 instance->next_step = batch_call_in_and_dispose; 241 usb_log_debug("Batch(%p) CONTROL READ initialized.\n", instance);242 229 batch_schedule(instance); 243 230 } … … 247 234 assert(instance); 248 235 249 const bool low_speed = instance->speed == USB_SPEED_LOW;250 236 int toggle = 1; 251 237 size_t i = 0; … … 258 244 259 245 transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT, 260 instance->max_packet_size, toggle, false, low_speed,261 instance->target,USB_PID_IN, data, next);246 instance->max_packet_size, toggle, false, instance->target, 247 USB_PID_IN, data, next); 262 248 } 263 249 … … 265 251 266 252 instance->next_step = batch_call_in_and_dispose; 267 usb_log_debug("Batch(%p) INTERRUPT IN initialized.\n", instance);268 253 batch_schedule(instance); 269 254 } … … 275 260 memcpy(instance->transport_buffer, instance->buffer, instance->buffer_size); 276 261 277 const bool low_speed = instance->speed == USB_SPEED_LOW;278 262 int toggle = 1; 279 263 size_t i = 0; … … 286 270 287 271 transfer_descriptor_init(&instance->tds[i], DEFAULT_ERROR_COUNT, 288 instance->max_packet_size, toggle++, false, low_speed,289 instance->target,USB_PID_OUT, data, next);272 instance->max_packet_size, toggle++, false, instance->target, 273 USB_PID_OUT, data, next); 290 274 } 291 275 … … 293 277 294 278 instance->next_step = batch_call_out_and_dispose; 295 usb_log_debug("Batch(%p) INTERRUPT OUT initialized.\n", instance);296 279 batch_schedule(instance); 297 280 } … … 305 288 306 289 int err = instance->error; 307 usb_log_debug("Batch(%p) callback IN(type:%d): %s(%d), %zu.\n", 308 instance, instance->transfer_type, str_error(err), err, 309 instance->transfered_size); 290 usb_log_info("Callback IN(%d): %d, %zu.\n", instance->transfer_type, 291 err, instance->transfered_size); 310 292 311 293 instance->callback_in(instance->fun, … … 320 302 321 303 int err = instance->error; 322 usb_log_debug("Batch(%p) callback OUT(type:%d): %s(%d).\n", 323 instance, instance->transfer_type, str_error(err), err); 304 usb_log_info("Callback OUT(%d): %d.\n", instance->transfer_type, err); 324 305 instance->callback_out(instance->fun, 325 306 err, instance->arg); … … 330 311 assert(instance); 331 312 batch_call_in(instance); 332 usb_log_debug(" Batch(%p) disposing.\n", instance);313 usb_log_debug("Disposing batch: %p.\n", instance); 333 314 free32(instance->tds); 334 315 free32(instance->qh); … … 342 323 assert(instance); 343 324 batch_call_out(instance); 344 usb_log_debug(" Batch(%p) disposing.\n", instance);325 usb_log_debug("Disposing batch: %p.\n", instance); 345 326 free32(instance->tds); 346 327 free32(instance->qh); … … 357 338 return uhci_schedule(hc, instance); 358 339 } 340 /*----------------------------------------------------------------------------*/ 341 /* DEPRECATED FUNCTIONS NEEDED BY THE OLD API */ 342 void batch_control_setup_old(batch_t *instance) 343 { 344 assert(instance); 345 instance->packets = 1; 346 347 /* setup stage */ 348 transfer_descriptor_init(instance->tds, DEFAULT_ERROR_COUNT, 349 instance->setup_size, 0, false, instance->target, 350 USB_PID_SETUP, instance->setup_buffer, NULL); 351 352 instance->next_step = batch_call_out_and_dispose; 353 batch_schedule(instance); 354 } 355 /*----------------------------------------------------------------------------*/ 356 void batch_control_write_data_old(batch_t *instance) 357 { 358 assert(instance); 359 instance->packets -= 2; 360 batch_interrupt_out(instance); 361 } 362 /*----------------------------------------------------------------------------*/ 363 void batch_control_read_data_old(batch_t *instance) 364 { 365 assert(instance); 366 instance->packets -= 2; 367 batch_interrupt_in(instance); 368 } 369 /*----------------------------------------------------------------------------*/ 370 void batch_control_write_status_old(batch_t *instance) 371 { 372 assert(instance); 373 instance->packets = 1; 374 transfer_descriptor_init(instance->tds, DEFAULT_ERROR_COUNT, 375 0, 1, false, instance->target, USB_PID_IN, NULL, NULL); 376 instance->next_step = batch_call_in_and_dispose; 377 batch_schedule(instance); 378 } 379 /*----------------------------------------------------------------------------*/ 380 void batch_control_read_status_old(batch_t *instance) 381 { 382 assert(instance); 383 instance->packets = 1; 384 transfer_descriptor_init(instance->tds, DEFAULT_ERROR_COUNT, 385 0, 1, false, instance->target, USB_PID_OUT, NULL, NULL); 386 instance->next_step = batch_call_out_and_dispose; 387 batch_schedule(instance); 388 } 359 389 /** 360 390 * @} -
uspace/drv/uhci-hcd/batch.h
r51b46f2 r0e3505a 43 43 #include "uhci_struct/queue_head.h" 44 44 45 typedef enum { 46 LOW_SPEED, 47 FULL_SPEED, 48 } dev_speed_t; 49 45 50 typedef struct batch 46 51 { 47 52 link_t link; 48 usb_speed_t speed;53 dev_speed_t speed; 49 54 usb_target_t target; 50 55 usb_transfer_type_t transfer_type; … … 71 76 batch_t * batch_get(ddf_fun_t *fun, usb_target_t target, 72 77 usb_transfer_type_t transfer_type, size_t max_packet_size, 73 usb_speed_t speed, char *buffer, size_t size,78 dev_speed_t speed, char *buffer, size_t size, 74 79 char *setup_buffer, size_t setup_size, 75 80 usbhc_iface_transfer_in_callback_t func_in, -
uspace/drv/uhci-hcd/iface.c
r51b46f2 r0e3505a 41 41 #include "iface.h" 42 42 #include "uhci.h" 43 #include "utils/device_keeper.h"44 43 45 44 /*----------------------------------------------------------------------------*/ … … 49 48 uhci_t *hc = fun_to_uhci(fun); 50 49 assert(hc); 51 usb_log_debug("Default address request with speed %d.\n", speed); 52 device_keeper_reserve_default(&hc->device_manager, speed); 50 usb_address_keeping_reserve_default(&hc->address_manager); 53 51 return EOK; 54 52 } … … 59 57 uhci_t *hc = fun_to_uhci(fun); 60 58 assert(hc); 61 usb_log_debug("Default address release.\n"); 62 device_keeper_release_default(&hc->device_manager); 59 usb_address_keeping_release_default(&hc->address_manager); 63 60 return EOK; 64 61 } … … 70 67 uhci_t *hc = fun_to_uhci(fun); 71 68 assert(hc); 72 assert(address); 73 74 usb_log_debug("Address request with speed %d.\n", speed); 75 *address = device_keeper_request(&hc->device_manager, speed); 76 usb_log_debug("Address request with result: %d.\n", *address); 69 *address = usb_address_keeping_request(&hc->address_manager); 77 70 if (*address <= 0) 78 71 return *address; … … 86 79 uhci_t *hc = fun_to_uhci(fun); 87 80 assert(hc); 88 usb_log_debug("Address bind %d-%d.\n", address, handle); 89 device_keeper_bind(&hc->device_manager, address, handle); 81 usb_address_keeping_devman_bind(&hc->address_manager, address, handle); 90 82 return EOK; 91 83 } … … 96 88 uhci_t *hc = fun_to_uhci(fun); 97 89 assert(hc); 98 usb_log_debug("Address release %d.\n", address); 99 device_keeper_release(&hc->device_manager, address); 90 usb_address_keeping_release_default(&hc->address_manager); 100 91 return EOK; 101 92 } 102 93 /*----------------------------------------------------------------------------*/ 103 94 static int interrupt_out(ddf_fun_t *fun, usb_target_t target, 104 size_t max_packet_size, void *data, size_t size, 95 size_t max_packet_size, 96 void *data, size_t size, 105 97 usbhc_iface_transfer_out_callback_t callback, void *arg) 106 98 { 107 assert(fun); 108 uhci_t *hc = fun_to_uhci(fun); 109 assert(hc); 110 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address); 111 112 usb_log_debug("Interrupt OUT %d:%d %zu(%zu).\n", 113 target.address, target.endpoint, size, max_packet_size); 99 dev_speed_t speed = FULL_SPEED; 114 100 115 101 batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT, … … 122 108 /*----------------------------------------------------------------------------*/ 123 109 static int interrupt_in(ddf_fun_t *fun, usb_target_t target, 124 size_t max_packet_size, void *data, size_t size, 110 size_t max_packet_size, 111 void *data, size_t size, 125 112 usbhc_iface_transfer_in_callback_t callback, void *arg) 126 113 { 127 assert(fun); 128 uhci_t *hc = fun_to_uhci(fun); 129 assert(hc); 130 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address); 131 usb_log_debug("Interrupt IN %d:%d %zu(%zu).\n", 132 target.address, target.endpoint, size, max_packet_size); 114 dev_speed_t speed = FULL_SPEED; 133 115 134 116 batch_t *batch = batch_get(fun, target, USB_TRANSFER_INTERRUPT, … … 145 127 usbhc_iface_transfer_out_callback_t callback, void *arg) 146 128 { 147 assert(fun); 148 uhci_t *hc = fun_to_uhci(fun); 149 assert(hc); 150 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address); 151 usb_log_debug("Control WRITE %d:%d %zu(%zu).\n", 152 target.address, target.endpoint, size, max_packet_size); 129 dev_speed_t speed = FULL_SPEED; 153 130 154 131 batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL, … … 166 143 usbhc_iface_transfer_in_callback_t callback, void *arg) 167 144 { 168 assert(fun); 169 uhci_t *hc = fun_to_uhci(fun); 170 assert(hc); 171 usb_speed_t speed = device_keeper_speed(&hc->device_manager, target.address); 145 dev_speed_t speed = FULL_SPEED; 172 146 173 usb_log_debug("Control READ %d:%d %zu(%zu).\n",174 target.address, target.endpoint, size, max_packet_size);175 147 batch_t *batch = batch_get(fun, target, USB_TRANSFER_CONTROL, 176 148 max_packet_size, speed, data, size, setup_data, setup_size, callback, -
uspace/drv/uhci-hcd/main.c
r51b46f2 r0e3505a 82 82 usb_log_info("uhci_add_device() called\n"); 83 83 84 uintptr_t io_reg_base = 0; 85 size_t io_reg_size = 0; 86 int irq = 0; 84 85 uintptr_t io_reg_base; 86 size_t io_reg_size; 87 int irq; 87 88 88 89 int ret = … … 94 95 io_reg_base, io_reg_size, irq); 95 96 96 //ret = pci_enable_interrupts(device);97 //CHECK_RET_RETURN(ret, "Failed(%d) to get enable interrupts:\n", ret);97 ret = pci_enable_interrupts(device); 98 CHECK_RET_RETURN(ret, "Failed(%d) to get enable interrupts:\n", ret); 98 99 99 100 uhci_t *uhci_hc = malloc(sizeof(uhci_t)); … … 113 114 */ 114 115 device->driver_data = uhci_hc; 116 115 117 ret = register_interrupt_handler(device, irq, irq_handler, 116 118 &uhci_hc->interrupt_code); … … 147 149 { 148 150 sleep(3); 149 usb_log_enable(USB_LOG_LEVEL_ DEBUG, NAME);151 usb_log_enable(USB_LOG_LEVEL_INFO, NAME); 150 152 151 153 return ddf_driver_main(&uhci_driver); -
uspace/drv/uhci-hcd/pci.c
r51b46f2 r0e3505a 38 38 #include <devman.h> 39 39 #include <device/hw_res.h> 40 41 #include <usb/debug.h>42 40 43 41 #include "pci.h" … … 85 83 irq = res->res.interrupt.irq; 86 84 irq_found = true; 87 usb_log_debug2("Found interrupt: %d.\n", irq);88 85 break; 89 86 case IO_RANGE: 90 io_address = res->res.io_range.address; 87 io_address = (uintptr_t) 88 res->res.io_range.address; 91 89 io_size = res->res.io_range.size; 92 usb_log_debug2("Found io: %llx %zu.\n",93 res->res.io_range.address, res->res.io_range.size);94 90 io_found = true; 95 91 break; … … 109 105 } 110 106 111 *io_reg_address = io_address; 112 *io_reg_size = io_size; 113 *irq_no = irq; 107 if (io_reg_address != NULL) { 108 *io_reg_address = io_address; 109 } 110 if (io_reg_size != NULL) { 111 *io_reg_size = io_size; 112 } 113 if (irq_no != NULL) { 114 *irq_no = irq; 115 } 114 116 115 117 rc = EOK; … … 125 127 IPC_FLAG_BLOCKING); 126 128 bool enabled = hw_res_enable_interrupt(parent_phone); 127 async_hangup(parent_phone);128 129 return enabled ? EOK : EIO; 129 130 } -
uspace/drv/uhci-hcd/root_hub.c
r51b46f2 r0e3505a 34 34 #include <assert.h> 35 35 #include <errno.h> 36 #include <str_error.h>37 36 #include <stdio.h> 38 #include <ops/hw_res.h>39 40 37 #include <usb_iface.h> 41 38 #include <usb/debug.h> … … 44 41 #include "uhci.h" 45 42 46 /*----------------------------------------------------------------------------*/47 43 static int usb_iface_get_hc_handle_rh_impl(ddf_fun_t *root_hub_fun, 48 44 devman_handle_t *handle) … … 55 51 return EOK; 56 52 } 57 /*----------------------------------------------------------------------------*/ 53 58 54 static int usb_iface_get_address_rh_impl(ddf_fun_t *fun, devman_handle_t handle, 59 55 usb_address_t *address) … … 65 61 assert(hc); 66 62 67 usb_address_t addr = device_keeper_find(&hc->device_manager,63 usb_address_t addr = usb_address_keeping_find(&hc->address_manager, 68 64 handle); 69 65 if (addr < 0) { … … 77 73 return EOK; 78 74 } 79 /*----------------------------------------------------------------------------*/ 75 80 76 usb_iface_t usb_iface_root_hub_fun_impl = { 81 77 .get_hc_handle = usb_iface_get_hc_handle_rh_impl, 82 78 .get_address = usb_iface_get_address_rh_impl 83 79 }; 84 /*----------------------------------------------------------------------------*/85 static hw_resource_list_t *get_resource_list(ddf_fun_t *dev)86 {87 assert(dev);88 ddf_fun_t *hc_ddf_instance = dev->driver_data;89 assert(hc_ddf_instance);90 uhci_t *hc = hc_ddf_instance->driver_data;91 assert(hc);92 80 93 //TODO: fix memory leak 94 hw_resource_list_t *resource_list = malloc(sizeof(hw_resource_list_t)); 95 assert(resource_list); 96 resource_list->count = 1; 97 resource_list->resources = malloc(sizeof(hw_resource_t)); 98 assert(resource_list->resources); 99 resource_list->resources[0].type = IO_RANGE; 100 resource_list->resources[0].res.io_range.address = 101 ((uintptr_t)hc->registers) + 0x10; // see UHCI design guide 102 resource_list->resources[0].res.io_range.size = 4; 103 resource_list->resources[0].res.io_range.endianness = LITTLE_ENDIAN; 81 static ddf_dev_ops_t root_hub_ops = { 82 .interfaces[USB_DEV_IFACE] = &usb_iface_root_hub_fun_impl 83 }; 104 84 105 return resource_list;106 }107 /*----------------------------------------------------------------------------*/108 static hw_res_ops_t hw_res_iface = {109 .get_resource_list = get_resource_list,110 .enable_interrupt = NULL111 };112 /*----------------------------------------------------------------------------*/113 static ddf_dev_ops_t root_hub_ops = {114 .interfaces[USB_DEV_IFACE] = &usb_iface_root_hub_fun_impl,115 .interfaces[HW_RES_DEV_IFACE] = &hw_res_iface116 };117 85 /*----------------------------------------------------------------------------*/ 118 86 int setup_root_hub(ddf_fun_t **fun, ddf_dev_t *hc) 119 87 { 120 88 assert(fun); 121 assert(hc);122 89 int ret; 123 90 … … 138 105 ret = ddf_fun_add_match_id(hub, match_str, 100); 139 106 if (ret != EOK) { 140 usb_log_error("Failed(%d) to add root hub match id: %s\n", 141 ret, str_error(ret)); 107 usb_log_error("Failed to add root hub match id.\n"); 142 108 ddf_fun_destroy(hub); 143 return ret;109 return ENOMEM; 144 110 } 145 111 -
uspace/drv/uhci-hcd/transfer_list.c
r51b46f2 r0e3505a 70 70 assert(instance); 71 71 assert(batch); 72 usb_log_debug2("Adding batch(%p) to queue %s.\n", batch, instance->name);73 72 74 73 uint32_t pa = (uintptr_t)addr_to_phys(batch->qh); … … 84 83 list_append(&batch->link, &instance->batch_list); 85 84 instance->queue_head->element = pa; 86 usb_log_debug ("Batch(%p) addedto queue %s first.\n",85 usb_log_debug2("Added batch(%p) to queue %s first.\n", 87 86 batch, instance->name); 88 87 fibril_mutex_unlock(&instance->guard); … … 97 96 queue_head_append_qh(last->qh, pa); 98 97 list_append(&batch->link, &instance->batch_list); 99 usb_log_debug ("Batch(%p) addedto queue %s last, first is %p.\n",98 usb_log_debug2("Added batch(%p) to queue %s last, first is %p.\n", 100 99 batch, instance->name, first ); 101 100 fibril_mutex_unlock(&instance->guard); … … 109 108 assert(instance->queue_head); 110 109 assert(batch->qh); 111 usb_log_debug2("Removing batch(%p) from queue %s.\n", batch, instance->name);112 110 113 111 /* I'm the first one here */ 114 112 if (batch->link.prev == &instance->batch_list) { 115 usb_log_debug(" Batch(%p) removed (FIRST) from queue %s, next element %x.\n",116 batch, instance->name,batch->qh->next_queue);113 usb_log_debug("Removing batch %p was first, next element %x.\n", 114 batch, batch->qh->next_queue); 117 115 instance->queue_head->element = batch->qh->next_queue; 118 116 } else { 119 usb_log_debug(" Batch(%p) removed (NOT FIRST) from queue, next element %x.\n",120 batch, instance->name,batch->qh->next_queue);117 usb_log_debug("Removing batch %p was NOT first, next element %x.\n", 118 batch, batch->qh->next_queue); 121 119 batch_t *prev = list_get_instance(batch->link.prev, batch_t, link); 122 120 prev->qh->next_queue = batch->qh->next_queue; … … 125 123 } 126 124 /*----------------------------------------------------------------------------*/ 127 void transfer_list_ remove_finished(transfer_list_t *instance)125 void transfer_list_check(transfer_list_t *instance) 128 126 { 129 127 assert(instance); 130 131 LIST_INITIALIZE(done);132 133 128 fibril_mutex_lock(&instance->guard); 134 129 link_t *current = instance->batch_list.next; … … 139 134 if (batch_is_complete(batch)) { 140 135 transfer_list_remove_batch(instance, batch); 141 list_append(current, &done);136 batch->next_step(batch); 142 137 } 143 138 current = next; 144 139 } 145 140 fibril_mutex_unlock(&instance->guard); 146 147 while (!list_empty(&done)) {148 link_t *item = done.next;149 list_remove(item);150 batch_t *batch = list_get_instance(item, batch_t, link);151 batch->next_step(batch);152 }153 141 } 154 142 /** -
uspace/drv/uhci-hcd/transfer_list.h
r51b46f2 r0e3505a 60 60 queue_head_dispose(instance->queue_head); 61 61 } 62 void transfer_list_ remove_finished(transfer_list_t *instance);62 void transfer_list_check(transfer_list_t *instance); 63 63 64 64 void transfer_list_add_batch(transfer_list_t *instance, batch_t *batch); -
uspace/drv/uhci-hcd/uhci-hcd.ma
r51b46f2 r0e3505a 1 1 10 pci/ven=8086&dev=7020 2 2 10 pci/ven=8086&dev=7112 3 4 10 pci/ven=8086&dev=27c85 10 pci/ven=8086&dev=27c96 10 pci/ven=8086&dev=27ca7 10 pci/ven=8086&dev=27cb8 9 10 10 pci/ven=8086&dev=283011 10 pci/ven=8086&dev=283112 10 pci/ven=8086&dev=283213 10 pci/ven=8086&dev=283414 10 pci/ven=8086&dev=283515 16 10 pci/ven=8086&dev=293417 10 pci/ven=8086&dev=293518 10 pci/ven=8086&dev=293619 10 pci/ven=8086&dev=293720 10 pci/ven=8086&dev=293821 10 pci/ven=8086&dev=2939 -
uspace/drv/uhci-hcd/uhci.c
r51b46f2 r0e3505a 48 48 { 49 49 .cmd = CMD_PIO_READ_16, 50 .addr = NULL, /* patched for every instance */50 .addr = (void*)0xc022, 51 51 .dstarg = 1 52 52 }, 53 53 { 54 54 .cmd = CMD_PIO_WRITE_16, 55 .addr = NULL, /* pathed for every instance */55 .addr = (void*)0xc022, 56 56 .value = 0x1f 57 57 }, … … 68 68 assert(hc); 69 69 70 usb_address_t addr = device_keeper_find(&hc->device_manager,70 usb_address_t addr = usb_address_keeping_find(&hc->address_manager, 71 71 handle); 72 72 if (addr < 0) { … … 80 80 return EOK; 81 81 } 82 /*----------------------------------------------------------------------------*/ 82 83 83 84 static usb_iface_t hc_usb_iface = { 84 85 .get_hc_handle = usb_iface_get_hc_handle_hc_impl, … … 88 89 static ddf_dev_ops_t uhci_ops = { 89 90 .interfaces[USB_DEV_IFACE] = &hc_usb_iface, 90 .interfaces[USBHC_DEV_IFACE] = &uhci_iface ,91 .interfaces[USBHC_DEV_IFACE] = &uhci_iface 91 92 }; 92 93 … … 101 102 bool low_speed, usb_transfer_type_t, size_t size); 102 103 104 #define CHECK_RET_RETURN(ret, message...) \ 105 if (ret != EOK) { \ 106 usb_log_error(message); \ 107 return ret; \ 108 } else (void) 0 103 109 104 110 int uhci_init(uhci_t *instance, ddf_dev_t *dev, void *regs, size_t reg_size) … … 106 112 assert(reg_size >= sizeof(regs_t)); 107 113 int ret; 108 109 #define CHECK_RET_DEST_FUN_RETURN(ret, message...) \110 if (ret != EOK) { \111 usb_log_error(message); \112 if (instance->ddf_instance) \113 ddf_fun_destroy(instance->ddf_instance); \114 return ret; \115 } else (void) 0116 114 117 115 /* … … 119 117 */ 120 118 instance->ddf_instance = ddf_fun_create(dev, fun_exposed, "uhci"); 121 ret = (instance->ddf_instance == NULL) ? ENOMEM : EOK; 122 CHECK_RET_DEST_FUN_RETURN(ret, "Failed to create UHCI device function.\n"); 123 119 if (instance->ddf_instance == NULL) { 120 usb_log_error("Failed to create UHCI device function.\n"); 121 return ENOMEM; 122 } 124 123 instance->ddf_instance->ops = &uhci_ops; 125 124 instance->ddf_instance->driver_data = instance; 126 125 127 126 ret = ddf_fun_bind(instance->ddf_instance); 128 CHECK_RET_ DEST_FUN_RETURN(ret, "Failed(%d)to bind UHCI device function: %s.\n",129 ret,str_error(ret));127 CHECK_RET_RETURN(ret, "Failed to bind UHCI device function: %s.\n", 128 str_error(ret)); 130 129 131 130 /* allow access to hc control registers */ 132 131 regs_t *io; 133 132 ret = pio_enable(regs, reg_size, (void**)&io); 134 CHECK_RET_DEST_FUN_RETURN(ret, "Failed(%d) to gain access to registers at %p: %s.\n", 135 ret, str_error(ret), io); 133 CHECK_RET_RETURN(ret, "Failed to gain access to registers at %p.\n", io); 136 134 instance->registers = io; 137 usb_log_debug("Device registers a t %p(%u) accessible.\n", io, reg_size);135 usb_log_debug("Device registers accessible.\n"); 138 136 139 137 ret = uhci_init_mem_structures(instance); 140 CHECK_RET_ DEST_FUN_RETURN(ret, "Failed to initialize UHCImemory structures.\n");138 CHECK_RET_RETURN(ret, "Failed to initialize memory structures.\n"); 141 139 142 140 uhci_init_hw(instance); 143 141 144 142 instance->cleaner = fibril_create(uhci_interrupt_emulator, instance); 145 fibril_add_ready(instance->cleaner);143 // fibril_add_ready(instance->cleaner); 146 144 147 145 instance->debug_checker = fibril_create(uhci_debug_checker, instance); 148 146 fibril_add_ready(instance->debug_checker); 149 147 150 usb_log_info("Started UHCI driver.\n"); 151 return EOK; 152 #undef CHECK_RET_DEST_FUN_RETURN 148 return EOK; 153 149 } 154 150 /*----------------------------------------------------------------------------*/ 155 151 void uhci_init_hw(uhci_t *instance) 156 152 { 157 /* reset everything, who knows what touched it before us */158 pio_write_16(&instance->registers->usbcmd, UHCI_CMD_GLOBAL_RESET);159 async_usleep(10000); /* 10ms according to USB spec */160 pio_write_16(&instance->registers->usbcmd, 0);161 162 /* reset hc, all states and counters */163 pio_write_16(&instance->registers->usbcmd, UHCI_CMD_HCRESET);164 while ((pio_read_16(&instance->registers->usbcmd) & UHCI_CMD_HCRESET) != 0)165 { async_usleep(10); }166 153 167 154 /* set framelist pointer */ … … 176 163 pio_write_16(&instance->registers->usbcmd, 177 164 UHCI_CMD_RUN_STOP | UHCI_CMD_MAX_PACKET | UHCI_CMD_CONFIGURE); 165 usb_log_debug("Started UHCI HC.\n"); 178 166 } 179 167 /*----------------------------------------------------------------------------*/ … … 181 169 { 182 170 assert(instance); 183 #define CHECK_RET_DEST_CMDS_RETURN(ret, message...) \184 if (ret != EOK) { \185 usb_log_error(message); \186 if (instance->interrupt_code.cmds != NULL) \187 free(instance->interrupt_code.cmds); \188 return ret; \189 } else (void) 0190 171 191 172 /* init interrupt code */ 192 instance->interrupt_code.cmds = malloc(sizeof(uhci_cmds)); 193 int ret = (instance->interrupt_code.cmds == NULL) ? ENOMEM : EOK; 194 CHECK_RET_DEST_CMDS_RETURN(ret, "Failed to allocate interrupt cmds space.\n"); 195 196 { 197 irq_cmd_t *interrupt_commands = instance->interrupt_code.cmds; 198 memcpy(interrupt_commands, uhci_cmds, sizeof(uhci_cmds)); 199 interrupt_commands[0].addr = (void*)&instance->registers->usbsts; 200 interrupt_commands[1].addr = (void*)&instance->registers->usbsts; 201 instance->interrupt_code.cmdcount = 202 sizeof(uhci_cmds) / sizeof(irq_cmd_t); 203 } 173 irq_cmd_t *interrupt_commands = malloc(sizeof(uhci_cmds)); 174 if (interrupt_commands == NULL) { 175 return ENOMEM; 176 } 177 memcpy(interrupt_commands, uhci_cmds, sizeof(uhci_cmds)); 178 interrupt_commands[0].addr = (void*)&instance->registers->usbsts; 179 interrupt_commands[1].addr = (void*)&instance->registers->usbsts; 180 instance->interrupt_code.cmds = interrupt_commands; 181 instance->interrupt_code.cmdcount = 182 sizeof(uhci_cmds) / sizeof(irq_cmd_t); 204 183 205 184 /* init transfer lists */ 206 ret = uhci_init_transfer_lists(instance);207 CHECK_RET_ DEST_CMDS_RETURN(ret, "Failed to initialize transfer lists.\n");185 int ret = uhci_init_transfer_lists(instance); 186 CHECK_RET_RETURN(ret, "Failed to initialize transfer lists.\n"); 208 187 usb_log_debug("Initialized transfer lists.\n"); 209 188 … … 211 190 instance->frame_list = get_page(); 212 191 ret = instance ? EOK : ENOMEM; 213 CHECK_RET_ DEST_CMDS_RETURN(ret, "Failed to get frame list page.\n");192 CHECK_RET_RETURN(ret, "Failed to get frame list page.\n"); 214 193 usb_log_debug("Initialized frame list.\n"); 215 194 … … 218 197 instance->transfers_interrupt.queue_head_pa 219 198 | LINK_POINTER_QUEUE_HEAD_FLAG; 220 221 199 unsigned i = 0; 222 200 for(; i < UHCI_FRAME_LIST_COUNT; ++i) { … … 225 203 226 204 /* init address keeper(libusb) */ 227 device_keeper_init(&instance->device_manager); 228 usb_log_debug("Initialized device manager.\n"); 229 230 return EOK; 231 #undef CHECK_RET_DEST_CMDS_RETURN 205 usb_address_keeping_init(&instance->address_manager, USB11_ADDRESS_MAX); 206 usb_log_debug("Initialized address manager.\n"); 207 208 return EOK; 232 209 } 233 210 /*----------------------------------------------------------------------------*/ … … 235 212 { 236 213 assert(instance); 237 #define CHECK_RET_CLEAR_RETURN(ret, message...) \238 if (ret != EOK) { \239 usb_log_error(message); \240 transfer_list_fini(&instance->transfers_bulk_full); \241 transfer_list_fini(&instance->transfers_control_full); \242 transfer_list_fini(&instance->transfers_control_slow); \243 transfer_list_fini(&instance->transfers_interrupt); \244 return ret; \245 } else (void) 0246 214 247 215 /* initialize TODO: check errors */ 248 216 int ret; 249 217 ret = transfer_list_init(&instance->transfers_bulk_full, "BULK_FULL"); 250 CHECK_RET_CLEAR_RETURN(ret, "Failed to init BULK list.");218 assert(ret == EOK); 251 219 ret = transfer_list_init(&instance->transfers_control_full, "CONTROL_FULL"); 252 CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL FULL list.");220 assert(ret == EOK); 253 221 ret = transfer_list_init(&instance->transfers_control_slow, "CONTROL_SLOW"); 254 CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL SLOW list.");222 assert(ret == EOK); 255 223 ret = transfer_list_init(&instance->transfers_interrupt, "INTERRUPT"); 256 CHECK_RET_CLEAR_RETURN(ret, "Failed to init INTERRUPT list.");224 assert(ret == EOK); 257 225 258 226 transfer_list_set_next(&instance->transfers_control_full, … … 281 249 282 250 return EOK; 283 #undef CHECK_RET_CLEAR_RETURN284 251 } 285 252 /*----------------------------------------------------------------------------*/ … … 288 255 assert(instance); 289 256 assert(batch); 290 const int low_speed = (batch->speed == USB_SPEED_LOW);257 const int low_speed = (batch->speed == LOW_SPEED); 291 258 if (!allowed_usb_packet( 292 259 low_speed, batch->transfer_type, batch->max_packet_size)) { … … 309 276 { 310 277 assert(instance); 311 //if ((status & (UHCI_STATUS_INTERRUPT | UHCI_STATUS_ERROR_INTERRUPT)) == 0)312 //return;313 // usb_log_debug2("UHCI interrupt: %X.\n", status);314 transfer_list_ remove_finished(&instance->transfers_interrupt);315 transfer_list_ remove_finished(&instance->transfers_control_slow);316 transfer_list_ remove_finished(&instance->transfers_control_full);317 transfer_list_ remove_finished(&instance->transfers_bulk_full);278 if ((status & (UHCI_STATUS_INTERRUPT | UHCI_STATUS_ERROR_INTERRUPT)) == 0) 279 return; 280 usb_log_debug("UHCI interrupt: %X.\n", status); 281 transfer_list_check(&instance->transfers_interrupt); 282 transfer_list_check(&instance->transfers_control_slow); 283 transfer_list_check(&instance->transfers_control_full); 284 transfer_list_check(&instance->transfers_bulk_full); 318 285 } 319 286 /*----------------------------------------------------------------------------*/ … … 324 291 assert(instance); 325 292 326 while 293 while(1) { 327 294 uint16_t status = pio_read_16(&instance->registers->usbsts); 328 if (status != 0)329 usb_log_debug2("UHCI status: %x.\n", status);330 status |= 1;331 295 uhci_interrupt(instance, status); 332 pio_write_16(&instance->registers->usbsts, 0x1f); 333 async_usleep(UHCI_CLEANER_TIMEOUT * 5); 296 async_usleep(UHCI_CLEANER_TIMEOUT); 334 297 } 335 298 return EOK; … … 344 307 const uint16_t sts = pio_read_16(&instance->registers->usbsts); 345 308 const uint16_t intr = pio_read_16(&instance->registers->usbintr); 346 if (((cmd & UHCI_CMD_RUN_STOP) != 1) || (sts != 0)) { 347 usb_log_debug2("Command: %X Status: %X Intr: %x\n", 348 cmd, sts, intr); 349 } 350 351 uintptr_t frame_list = 352 pio_read_32(&instance->registers->flbaseadd) & ~0xfff; 309 usb_log_debug("Command: %X Status: %X Interrupts: %x\n", 310 cmd, sts, intr); 311 312 uintptr_t frame_list = pio_read_32(&instance->registers->flbaseadd); 353 313 if (frame_list != addr_to_phys(instance->frame_list)) { 354 314 usb_log_debug("Framelist address: %p vs. %p.\n", -
uspace/drv/uhci-hcd/uhci.h
r51b46f2 r0e3505a 41 41 #include <ddi.h> 42 42 43 #include <usb/addrkeep.h> 43 44 #include <usbhc_iface.h> 44 45 46 #include "transfer_list.h" 45 47 #include "batch.h" 46 #include "transfer_list.h"47 #include "utils/device_keeper.h"48 48 49 49 typedef struct uhci_regs { … … 82 82 83 83 typedef struct uhci { 84 device_keeper_t device_manager; 85 84 usb_address_keeping_t address_manager; 86 85 volatile regs_t *registers; 87 86 -
uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.c
r51b46f2 r0e3505a 39 39 40 40 void transfer_descriptor_init(transfer_descriptor_t *instance, 41 int error_count, size_t size, bool toggle, bool isochronous, bool low_speed,41 int error_count, size_t size, bool toggle, bool isochronous, 42 42 usb_target_t target, int pid, void *buffer, transfer_descriptor_t *next) 43 43 { … … 50 50 instance->status = 0 51 51 | ((error_count & TD_STATUS_ERROR_COUNT_MASK) << TD_STATUS_ERROR_COUNT_POS) 52 | (low_speed ? TD_STATUS_LOW_SPEED_FLAG : 0)53 52 | TD_STATUS_ERROR_ACTIVE; 54 53 … … 67 66 } 68 67 69 usb_log_ debug2("Created TD: %X:%X:%X:%X(%p).\n",68 usb_log_info("Created TD: %X:%X:%X:%X(%p).\n", 70 69 instance->next, instance->status, instance->device, 71 70 instance->buffer_ptr, buffer); 71 #if 0 72 if (size) { 73 unsigned char * buff = buffer; 74 uhci_print_verbose("TD Buffer dump(%p-%dB): ", buffer, size); 75 unsigned i = 0; 76 /* TODO: Verbose? */ 77 for (; i < size; ++i) { 78 printf((i & 1) ? "%x " : "%x", buff[i]); 79 } 80 printf("\n"); 81 } 82 #endif 72 83 } 73 84 /*----------------------------------------------------------------------------*/ … … 77 88 78 89 if ((instance->status & TD_STATUS_ERROR_STALLED) != 0) 79 return E STALL;90 return EIO; 80 91 81 92 if ((instance->status & TD_STATUS_ERROR_CRC) != 0) 82 return E BADCHECKSUM;93 return EAGAIN; 83 94 84 95 if ((instance->status & TD_STATUS_ERROR_BUFFER) != 0) -
uspace/drv/uhci-hcd/uhci_struct/transfer_descriptor.h
r51b46f2 r0e3505a 92 92 93 93 void transfer_descriptor_init(transfer_descriptor_t *instance, 94 int error_count, size_t size, bool toggle, bool isochronous, bool low_speed,94 int error_count, size_t size, bool toggle, bool isochronous, 95 95 usb_target_t target, int pid, void *buffer, transfer_descriptor_t * next); 96 96 -
uspace/drv/uhci-rhd/main.c
r51b46f2 r0e3505a 33 33 */ 34 34 #include <ddf/driver.h> 35 #include <devman.h>36 #include <device/hw_res.h>37 35 #include <usb_iface.h> 38 36 #include <usb/ddfiface.h> … … 45 43 46 44 #define NAME "uhci-rhd" 47 static int hc_get_my_registers(ddf_dev_t *dev,48 uintptr_t *io_reg_address, size_t *io_reg_size);49 45 50 46 static int usb_iface_get_hc_handle(ddf_fun_t *fun, devman_handle_t *handle) … … 84 80 } 85 81 86 uintptr_t io_regs = 0; 87 size_t io_size = 0; 88 89 int ret = hc_get_my_registers(device, &io_regs, &io_size); 90 assert(ret == EOK); 91 92 /* TODO: verify values from hc */ 93 usb_log_info("I/O regs at 0x%X (size %zu).\n", io_regs, io_size); 94 ret = uhci_root_hub_init(rh, (void*)io_regs, io_size, device); 82 /* TODO: get register values from hc */ 83 int ret = uhci_root_hub_init(rh, (void*)0xc030, 4, device); 95 84 if (ret != EOK) { 96 85 usb_log_error("Failed(%d) to initialize driver instance.\n", ret); … … 113 102 .driver_ops = &uhci_rh_driver_ops 114 103 }; 115 /*----------------------------------------------------------------------------*/ 104 116 105 int main(int argc, char *argv[]) 117 106 { 118 usb_log_enable(USB_LOG_LEVEL_ DEBUG, NAME);107 usb_log_enable(USB_LOG_LEVEL_INFO, NAME); 119 108 return ddf_driver_main(&uhci_rh_driver); 120 }121 /*----------------------------------------------------------------------------*/122 int hc_get_my_registers(ddf_dev_t *dev,123 uintptr_t *io_reg_address, size_t *io_reg_size)124 {125 assert(dev != NULL);126 127 int parent_phone = devman_parent_device_connect(dev->handle,128 IPC_FLAG_BLOCKING);129 if (parent_phone < 0) {130 return parent_phone;131 }132 133 int rc;134 135 hw_resource_list_t hw_resources;136 rc = hw_res_get_resource_list(parent_phone, &hw_resources);137 if (rc != EOK) {138 goto leave;139 }140 141 uintptr_t io_address = 0;142 size_t io_size = 0;143 bool io_found = false;144 145 size_t i;146 for (i = 0; i < hw_resources.count; i++) {147 hw_resource_t *res = &hw_resources.resources[i];148 switch (res->type) {149 case IO_RANGE:150 io_address = (uintptr_t)151 res->res.io_range.address;152 io_size = res->res.io_range.size;153 io_found = true;154 break;155 default:156 break;157 }158 }159 160 if (!io_found) {161 rc = ENOENT;162 goto leave;163 }164 165 if (io_reg_address != NULL) {166 *io_reg_address = io_address;167 }168 if (io_reg_size != NULL) {169 *io_reg_size = io_size;170 }171 rc = EOK;172 leave:173 async_hangup(parent_phone);174 175 return rc;176 109 } 177 110 /** -
uspace/drv/uhci-rhd/port.c
r51b46f2 r0e3505a 34 34 #include <errno.h> 35 35 #include <str_error.h> 36 #include <fibril_synch.h>37 36 38 37 #include <usb/usb.h> /* usb_address_t */ … … 46 45 #include "port_status.h" 47 46 48 static int uhci_port_new_device(uhci_port_t *port , uint16_t status);47 static int uhci_port_new_device(uhci_port_t *port); 49 48 static int uhci_port_remove_device(uhci_port_t *port); 50 49 static int uhci_port_set_enabled(uhci_port_t *port, bool enabled); 51 50 static int uhci_port_check(void *port); 52 static int new_device_enable_port(int portno, void *arg);53 51 54 52 int uhci_port_init( 55 53 uhci_port_t *port, port_status_t *address, unsigned number, 56 unsigned usec, ddf_dev_t *rh )54 unsigned usec, ddf_dev_t *rh, int parent_phone) 57 55 { 58 56 assert(port); … … 71 69 port->checker = fibril_create(uhci_port_check, port); 72 70 if (port->checker == 0) { 73 usb_log_error("Port(%p - %d): failed to launch root hub fibril.", 74 port->address, port->number); 71 usb_log_error(": failed to launch root hub fibril."); 75 72 return ENOMEM; 76 73 } 77 74 fibril_add_ready(port->checker); 78 usb_log_debug( "Port(%p - %d): Added fibril. %x\n",79 port->address, port->number, port->checker);75 usb_log_debug( 76 "Added fibril for port %d: %p.\n", number, port->checker); 80 77 return EOK; 81 78 } … … 93 90 uhci_port_t *port_instance = port; 94 91 assert(port_instance); 95 // port_status_write(port_instance->address, 0);96 97 unsigned count = 0;98 92 99 93 while (1) { 100 async_usleep(port_instance->wait_period_usec);101 102 94 /* read register value */ 103 95 port_status_t port_status = … … 105 97 106 98 /* debug print */ 107 static fibril_mutex_t dbg_mtx = FIBRIL_MUTEX_INITIALIZER(dbg_mtx); 108 fibril_mutex_lock(&dbg_mtx); 109 usb_log_debug2("Port(%p - %d): Status: %#04x. === %u\n", 110 port_instance->address, port_instance->number, port_status, count++); 111 // print_port_status(port_status); 112 fibril_mutex_unlock(&dbg_mtx); 113 114 if ((port_status & STATUS_CONNECTED_CHANGED) != 0) { 115 usb_log_debug("Port(%p - %d): Connected change detected: %x.\n", 116 port_instance->address, port_instance->number, port_status); 117 118 99 usb_log_debug("Port %d status at %p: 0x%04x.\n", 100 port_instance->number, port_instance->address, port_status); 101 print_port_status(port_status); 102 103 if (port_status & STATUS_CONNECTED_CHANGED) { 119 104 int rc = usb_hc_connection_open( 120 105 &port_instance->hc_connection); 121 106 if (rc != EOK) { 122 usb_log_error("Port(%p - %d): Failed to connect to HC.", 123 port_instance->address, port_instance->number); 124 continue; 107 usb_log_error("Failed to connect to HC."); 108 goto next; 125 109 } 126 110 127 /* remove any old device */128 if (port_instance->attached_device) {129 u sb_log_debug("Port(%p - %d): Removing device.\n",130 port_instance->address, port_instance->number);111 if (port_status & STATUS_CONNECTED) { 112 /* new device */ 113 uhci_port_new_device(port_instance); 114 } else { 131 115 uhci_port_remove_device(port_instance); 132 }133 134 if ((port_status & STATUS_CONNECTED) != 0) {135 /* new device */136 uhci_port_new_device(port_instance, port_status);137 } else {138 /* ack changes by writing one to WC bits */139 port_status_write(port_instance->address, port_status);140 usb_log_debug("Port(%p - %d): Change status ACK.\n",141 port_instance->address, port_instance->number);142 116 } 143 117 … … 145 119 &port_instance->hc_connection); 146 120 if (rc != EOK) { 147 usb_log_error(" Port(%p - %d): Failed to disconnect from HC.",148 port_instance->address, port_instance->number);121 usb_log_error("Failed to disconnect from HC."); 122 goto next; 149 123 } 150 124 } 125 next: 126 async_usleep(port_instance->wait_period_usec); 151 127 } 152 128 return EOK; … … 163 139 uhci_port_t *port = (uhci_port_t *) arg; 164 140 165 usb_log_debug2("Port(%p - %d): new_device_enable_port.\n", 166 port->address, port->number); 141 usb_log_debug("new_device_enable_port(%d)\n", port->number); 167 142 168 143 /* … … 172 147 async_usleep(100000); 173 148 149 /* Enable the port. */ 150 uhci_port_set_enabled(port, true); 174 151 175 152 /* The hub maintains the reset signal to that port for 10 ms … … 177 154 */ 178 155 { 179 usb_log_debug(" Port(%p - %d): Reset Signal start.\n",180 port-> address, port->number);156 usb_log_debug("Reset Signal start on port %d.\n", 157 port->number); 181 158 port_status_t port_status = 182 159 port_status_read(port->address); … … 188 165 port_status &= ~STATUS_IN_RESET; 189 166 port_status_write(port->address, port_status); 190 usb_log_debug("Port(%p - %d): Reset Signal stop.\n", 191 port->address, port->number); 192 } 193 194 /* Enable the port. */ 195 uhci_port_set_enabled(port, true); 196 197 return EOK; 198 } 199 200 /*----------------------------------------------------------------------------*/ 201 static int uhci_port_new_device(uhci_port_t *port, uint16_t status) 167 usb_log_debug("Reset Signal stop on port %d.\n", 168 port->number); 169 } 170 171 return EOK; 172 } 173 174 /*----------------------------------------------------------------------------*/ 175 static int uhci_port_new_device(uhci_port_t *port) 202 176 { 203 177 assert(port); 204 178 assert(usb_hc_connection_is_opened(&port->hc_connection)); 205 179 206 usb_log_info("Port(%p-%d): Detected new device.\n", 207 port->address, port->number); 180 usb_log_info("Detected new device on port %u.\n", port->number); 208 181 209 182 usb_address_t dev_addr; 210 183 int rc = usb_hc_new_device_wrapper(port->rh, &port->hc_connection, 211 ((status & STATUS_LOW_SPEED) != 0) ? USB_SPEED_LOW :USB_SPEED_FULL,184 USB_SPEED_FULL, 212 185 new_device_enable_port, port->number, port, 213 186 &dev_addr, &port->attached_device, NULL, NULL, NULL); 214 215 187 if (rc != EOK) { 216 usb_log_error(" Port(%p-%d): Failed(%d) adding new device: %s.\n",217 port-> address, port->number, rc, str_error(rc));188 usb_log_error("Failed adding new device on port %u: %s.\n", 189 port->number, str_error(rc)); 218 190 uhci_port_set_enabled(port, false); 219 191 return rc; 220 192 } 221 193 222 usb_log_info(" Port(%p-%d): New devicehas address %d (handle %zu).\n",223 port-> address, port->number, dev_addr, port->attached_device);194 usb_log_info("New device on port %u has address %d (handle %zu).\n", 195 port->number, dev_addr, port->attached_device); 224 196 225 197 return EOK; … … 229 201 static int uhci_port_remove_device(uhci_port_t *port) 230 202 { 231 usb_log_error(" Port(%p-%d):Don't know how to remove device %#x.\n",232 port->address, port->number,(unsigned int)port->attached_device);203 usb_log_error("Don't know how to remove device %#x.\n", 204 (unsigned int)port->attached_device); 233 205 // uhci_port_set_enabled(port, false); 234 206 return EOK; … … 251 223 port_status_write(port->address, port_status); 252 224 253 usb_log_info(" Port(%p-%d): %sabled port.\n",254 port->address, port->number, enabled ? "En" : "Dis");225 usb_log_info("%s port %d.\n", 226 enabled ? "Enabled" : "Disabled", port->number); 255 227 return EOK; 256 228 } -
uspace/drv/uhci-rhd/port.h
r51b46f2 r0e3505a 55 55 int uhci_port_init( 56 56 uhci_port_t *port, port_status_t *address, unsigned number, 57 unsigned usec, ddf_dev_t *rh );57 unsigned usec, ddf_dev_t *rh, int parent_phone); 58 58 59 59 void uhci_port_fini(uhci_port_t *port); -
uspace/drv/uhci-rhd/port_status.c
r51b46f2 r0e3505a 41 41 struct flag_name 42 42 { 43 u int16_tflag;43 unsigned flag; 44 44 const char *name; 45 45 }; … … 65 65 for (;i < sizeof(flags)/sizeof(struct flag_name); ++i) { 66 66 usb_log_debug2("\t%s status: %s.\n", flags[i].name, 67 ((value & flags[i].flag) != 0)? "YES" : "NO");67 value & flags[i].flag ? "YES" : "NO"); 68 68 } 69 69 } -
uspace/drv/uhci-rhd/port_status.h
r51b46f2 r0e3505a 41 41 typedef uint16_t port_status_t; 42 42 43 #define STATUS_CONNECTED (1 << 0) 44 #define STATUS_CONNECTED_CHANGED (1 << 1) 45 #define STATUS_ENABLED (1 << 2) 46 #define STATUS_ENABLED_CHANGED (1 << 3) 47 #define STATUS_LINE_D_PLUS (1 << 4) 48 #define STATUS_LINE_D_MINUS (1 << 5) 49 #define STATUS_RESUME (1 << 6) 50 #define STATUS_ALWAYS_ONE (1 << 7) 43 enum { 44 STATUS_CONNECTED = 1 << 0, 45 STATUS_CONNECTED_CHANGED = 1 << 1, 46 STATUS_ENABLED = 1 << 2, 47 STATUS_ENABLED_CHANGED = 1 << 3, 48 STATUS_LINE_D_PLUS = 1 << 4, 49 STATUS_LINE_D_MINUS = 1 << 5, 50 STATUS_RESUME = 1 << 6, 51 STATUS_ALWAYS_ONE = 1 << 7, 51 52 52 #define STATUS_LOW_SPEED (1 << 8) 53 #define STATUS_IN_RESET (1 << 9) 54 #define STATUS_SUSPEND (1 << 12) 53 STATUS_LOW_SPEED = 1 << 8, 54 STATUS_IN_RESET = 1 << 9, 55 STATUS_SUSPEND = 1 << 12, 56 }; 55 57 56 58 static inline port_status_t port_status_read(port_status_t * address) -
uspace/drv/uhci-rhd/root_hub.c
r51b46f2 r0e3505a 40 40 #include "root_hub.h" 41 41 42 42 43 int uhci_root_hub_init( 43 44 uhci_root_hub_t *instance, void *addr, size_t size, ddf_dev_t *rh) … … 46 47 assert(rh); 47 48 int ret; 49 ret = usb_hc_find(rh->handle, &instance->hc_handle); 50 usb_log_info("rh found(%d) hc handle: %d.\n", ret, instance->hc_handle); 51 if (ret != EOK) { 52 return ret; 53 } 48 54 49 55 /* allow access to root hub registers */ 50 56 assert(sizeof(port_status_t) * UHCI_ROOT_HUB_PORT_COUNT == size); 51 57 port_status_t *regs; 52 ret = pio_enable(addr, size, (void**)®s); 58 ret = pio_enable( 59 addr, sizeof(port_status_t) * UHCI_ROOT_HUB_PORT_COUNT, (void**)®s); 53 60 54 61 if (ret < 0) { … … 60 67 unsigned i = 0; 61 68 for (; i < UHCI_ROOT_HUB_PORT_COUNT; ++i) { 69 /* connect to the parent device (HC) */ 70 int parent_phone = devman_device_connect(instance->hc_handle, 0); 71 //usb_drv_hc_connect(rh, instance->hc_handle, 0); 72 if (parent_phone < 0) { 73 usb_log_error("Failed to connect to the HC device port %d.\n", i); 74 return parent_phone; 75 } 62 76 /* mind pointer arithmetics */ 63 ret = uhci_port_init(64 &instance->ports[i], regs + i, i, ROOT_HUB_WAIT_USEC, rh );77 int ret = uhci_port_init( 78 &instance->ports[i], regs + i, i, ROOT_HUB_WAIT_USEC, rh, parent_phone); 65 79 if (ret != EOK) { 66 80 unsigned j = 0; -
uspace/drv/uhci-rhd/root_hub.h
r51b46f2 r0e3505a 41 41 42 42 #define UHCI_ROOT_HUB_PORT_COUNT 2 43 #define ROOT_HUB_WAIT_USEC 5000000 /* 5 seconds */ 43 #define UHCI_ROOT_HUB_PORT_REGISTERS_OFFSET 0x10 44 #define ROOT_HUB_WAIT_USEC 10000000 /* 10 seconds */ 44 45 45 46 typedef struct root_hub { -
uspace/drv/usbhid/Makefile
r51b46f2 r0e3505a 39 39 SOURCES = \ 40 40 main.c \ 41 descparser.c \ 42 descdump.c \ 41 43 conv.c \ 42 44 $(STOLEN_LAYOUT_SOURCES) -
uspace/drv/usbhid/conv.c
r51b46f2 r0e3505a 36 36 #include <io/keycode.h> 37 37 #include <stdint.h> 38 #include <stdio.h>39 #include <usb/debug.h>40 38 #include "conv.h" 41 39 … … 143 141 //[0xe7] = KC_R // TODO: right GUI 144 142 145 [0x53] = KC_NUM_LOCK,146 [0x54] = KC_NSLASH,147 [0x55] = KC_NTIMES,148 [0x56] = KC_NMINUS,149 [0x57] = KC_NPLUS,150 [0x58] = KC_NENTER,151 [0x59] = KC_N1,152 [0x5a] = KC_N2,153 [0x5b] = KC_N3,154 [0x5c] = KC_N4,155 [0x5d] = KC_N5,156 [0x5e] = KC_N6,157 [0x5f] = KC_N7,158 [0x60] = KC_N8,159 [0x61] = KC_N9,160 [0x62] = KC_N0,161 [0x63] = KC_NPERIOD162 163 143 }; 164 144 … … 209 189 210 190 key = map[scancode]; 211 212 if (scancode == 0x53) {213 usb_log_debug("\n\nWe have a NUM LOCK!, sending key %u\n\n", key);214 }215 216 if (scancode == 0x47) {217 usb_log_debug("\n\nWe have a SCROLL LOCK!, sending key %u\n\n", key);218 }219 220 if (scancode == 0x39) {221 usb_log_debug("\n\nWe have a CAPS LOCK!, sending key %u\n\n", key);222 }223 224 191 // if (key != 0) 225 192 // kbd_push_ev(type, key); -
uspace/drv/usbhid/hid.h
r51b46f2 r0e3505a 37 37 #define USBHID_HID_H_ 38 38 39 #include <stdint.h>40 41 39 #include <usb/classes/hid.h> 42 40 #include <ddf/driver.h> 43 41 #include <usb/pipes.h> 42 43 /** 44 * 45 */ 46 typedef struct { 47 usb_standard_interface_descriptor_t iface_desc; 48 usb_standard_endpoint_descriptor_t *endpoints; 49 usb_standard_hid_descriptor_t hid_desc; 50 uint8_t *report_desc; 51 //usb_standard_hid_class_descriptor_info_t *class_desc_info; 52 //uint8_t **class_descs; 53 } usb_hid_iface_t; 54 55 /** 56 * 57 */ 58 typedef struct { 59 usb_standard_configuration_descriptor_t config_descriptor; 60 usb_hid_iface_t *interfaces; 61 } usb_hid_configuration_t; 44 62 45 63 /** … … 50 68 typedef struct { 51 69 ddf_dev_t *device; 70 usb_hid_configuration_t *conf; 71 usb_hid_report_parser_t *parser; 52 72 53 73 usb_device_connection_t wire; 54 74 usb_endpoint_pipe_t ctrl_pipe; 55 75 usb_endpoint_pipe_t poll_pipe; 56 57 uint16_t iface;58 59 uint8_t *report_desc;60 usb_hid_report_parser_t *parser;61 62 uint8_t *keycodes;63 size_t keycode_count;64 uint8_t modifiers;65 66 unsigned mods;67 unsigned lock_keys;68 76 } usb_hid_dev_kbd_t; 69 77 78 // TODO: more configurations! 79 70 80 #endif -
uspace/drv/usbhid/main.c
r51b46f2 r0e3505a 51 51 #include <usb/descriptor.h> 52 52 #include <io/console.h> 53 #include <stdint.h>54 #include <usb/dp.h>55 53 #include "hid.h" 54 #include "descparser.h" 55 #include "descdump.h" 56 56 #include "conv.h" 57 57 #include "layout.h" 58 58 59 59 #define BUFFER_SIZE 8 60 #define BUFFER_OUT_SIZE 161 60 #define NAME "usbhid" 62 61 63 //#define GUESSED_POLL_ENDPOINT 1 64 #define BOOTP_REPORT_SIZE 6 65 66 static unsigned DEFAULT_ACTIVE_MODS = KM_NUM_LOCK; 62 #define GUESSED_POLL_ENDPOINT 1 67 63 68 64 /** Keyboard polling endpoint description for boot protocol class. */ … … 124 120 125 121 static void dump_buffer(const char *msg, const uint8_t *buffer, size_t length) 126 { uint8_t buffer[BUFFER_SIZE];122 { 127 123 printf("%s\n", msg); 128 124 … … 141 137 */ 142 138 143 /** Currently active modifiers (locks is probably better word).139 /** Currently active modifiers. 144 140 * 145 141 * TODO: put to device? 146 142 */ 147 //static unsigned mods = KM_NUM_LOCK;143 static unsigned mods = KM_NUM_LOCK; 148 144 149 145 /** Currently pressed lock keys. We track these to tackle autorepeat. … … 151 147 * TODO: put to device? 152 148 */ 153 //static unsigned lock_keys;149 static unsigned lock_keys; 154 150 155 151 #define NUM_LAYOUTS 3 … … 163 159 static int active_layout = 0; 164 160 165 static void usbkbd_req_set_report(usb_hid_dev_kbd_t *kbd_dev, uint16_t iface, 166 usb_hid_report_type_t type, uint8_t *buffer, size_t buf_size) 167 { 168 int rc, sess_rc; 169 170 sess_rc = usb_endpoint_pipe_start_session(&kbd_dev->ctrl_pipe); 171 if (sess_rc != EOK) { 172 usb_log_warning("Failed to start a session: %s.\n", 173 str_error(sess_rc)); 174 return; 175 } 176 177 usb_log_debug("Sending Set_Report request to the device.\n"); 178 179 rc = usb_control_request_set(&kbd_dev->ctrl_pipe, 180 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 181 USB_HIDREQ_SET_REPORT, type, iface, buffer, buf_size); 182 183 sess_rc = usb_endpoint_pipe_end_session(&kbd_dev->ctrl_pipe); 184 185 if (rc != EOK) { 186 usb_log_warning("Error sending output report to the keyboard: " 187 "%s.\n", str_error(rc)); 188 return; 189 } 190 191 if (sess_rc != EOK) { 192 usb_log_warning("Error closing session: %s.\n", 193 str_error(sess_rc)); 194 return; 195 } 196 } 197 198 static void usbkbd_req_set_protocol(usb_hid_dev_kbd_t *kbd_dev, 199 usb_hid_protocol_t protocol) 200 { 201 int rc, sess_rc; 202 203 sess_rc = usb_endpoint_pipe_start_session(&kbd_dev->ctrl_pipe); 204 if (sess_rc != EOK) { 205 usb_log_warning("Failed to start a session: %s.\n", 206 str_error(sess_rc)); 207 return; 208 } 209 210 usb_log_debug("Sending Set_Protocol request to the device (" 211 "protocol: %d, iface: %d).\n", protocol, kbd_dev->iface); 212 213 rc = usb_control_request_set(&kbd_dev->ctrl_pipe, 214 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE, 215 USB_HIDREQ_SET_PROTOCOL, protocol, kbd_dev->iface, NULL, 0); 216 217 sess_rc = usb_endpoint_pipe_end_session(&kbd_dev->ctrl_pipe); 218 219 if (rc != EOK) { 220 usb_log_warning("Error sending output report to the keyboard: " 221 "%s.\n", str_error(rc)); 222 return; 223 } 224 225 if (sess_rc != EOK) { 226 usb_log_warning("Error closing session: %s.\n", 227 str_error(sess_rc)); 228 return; 229 } 230 } 231 232 static void usbkbd_set_led(usb_hid_dev_kbd_t *kbd_dev) 233 { 234 uint8_t buffer[BUFFER_OUT_SIZE]; 235 int rc= 0, i; 236 237 memset(buffer, 0, BUFFER_OUT_SIZE); 238 uint8_t leds = 0; 239 240 if (kbd_dev->mods & KM_NUM_LOCK) { 241 leds |= USB_HID_LED_NUM_LOCK; 242 } 243 244 if (kbd_dev->mods & KM_CAPS_LOCK) { 245 leds |= USB_HID_LED_CAPS_LOCK; 246 } 247 248 if (kbd_dev->mods & KM_SCROLL_LOCK) { 249 leds |= USB_HID_LED_SCROLL_LOCK; 250 } 251 252 // TODO: COMPOSE and KANA 253 254 usb_log_debug("Creating output report.\n"); 255 usb_log_debug("Leds: 0x%x\n", leds); 256 if ((rc = usb_hid_boot_keyboard_output_report( 257 leds, buffer, BUFFER_OUT_SIZE)) != EOK) { 258 usb_log_warning("Error composing output report to the keyboard:" 259 "%s.\n", str_error(rc)); 260 return; 261 } 262 263 usb_log_debug("Output report buffer: "); 264 for (i = 0; i < BUFFER_OUT_SIZE; ++i) { 265 usb_log_debug("0x%x ", buffer[i]); 266 } 267 usb_log_debug("\n"); 268 269 uint16_t value = 0; 270 value |= (USB_HID_REPORT_TYPE_OUTPUT << 8); 271 272 usbkbd_req_set_report(kbd_dev, kbd_dev->iface, value, buffer, 273 BUFFER_OUT_SIZE); 274 } 275 276 static void kbd_push_ev(int type, unsigned int key, usb_hid_dev_kbd_t *kbd_dev) 161 static void kbd_push_ev(int type, unsigned int key) 277 162 { 278 163 console_event_t ev; … … 292 177 if (mod_mask != 0) { 293 178 if (type == KEY_PRESS) 294 kbd_dev->mods = kbd_dev->mods | mod_mask;179 mods = mods | mod_mask; 295 180 else 296 kbd_dev->mods = kbd_dev->mods & ~mod_mask;181 mods = mods & ~mod_mask; 297 182 } 298 183 299 184 switch (key) { 300 case KC_CAPS_LOCK: mod_mask = KM_CAPS_LOCK; usb_log_debug2("\n\nPushing CAPS LOCK! (mask: %u)\n\n", mod_mask);break;301 case KC_NUM_LOCK: mod_mask = KM_NUM_LOCK; usb_log_debug2("\n\nPushing NUM LOCK! (mask: %u)\n\n", mod_mask);break;302 case KC_SCROLL_LOCK: mod_mask = KM_SCROLL_LOCK; usb_log_debug2("\n\nPushing SCROLL LOCK! (mask: %u)\n\n", mod_mask);break;185 case KC_CAPS_LOCK: mod_mask = KM_CAPS_LOCK; break; 186 case KC_NUM_LOCK: mod_mask = KM_NUM_LOCK; break; 187 case KC_SCROLL_LOCK: mod_mask = KM_SCROLL_LOCK; break; 303 188 default: mod_mask = 0; break; 304 189 } 305 190 306 191 if (mod_mask != 0) { 307 usb_log_debug2("\n\nChanging mods and lock keys\n");308 usb_log_debug2("\nmods before: 0x%x\n", kbd_dev->mods);309 usb_log_debug2("\nLock keys before:0x%x\n\n", kbd_dev->lock_keys);310 311 192 if (type == KEY_PRESS) { 312 usb_log_debug2("\nKey pressed.\n");313 193 /* 314 194 * Only change lock state on transition from released … … 316 196 * up the lock state. 317 197 */ 318 kbd_dev->mods = 319 kbd_dev->mods ^ (mod_mask & ~kbd_dev->lock_keys); 320 kbd_dev->lock_keys = kbd_dev->lock_keys | mod_mask; 198 mods = mods ^ (mod_mask & ~lock_keys); 199 lock_keys = lock_keys | mod_mask; 321 200 322 201 /* Update keyboard lock indicator lights. */ 323 usbkbd_set_led(kbd_dev); 202 // TODO 203 //kbd_ctl_set_ind(mods); 324 204 } else { 325 usb_log_debug2("\nKey released.\n"); 326 kbd_dev->lock_keys = kbd_dev->lock_keys & ~mod_mask; 327 } 328 } 329 330 usb_log_debug2("\n\nmods after: 0x%x\n", kbd_dev->mods); 331 usb_log_debug2("\nLock keys after: 0x%x\n\n", kbd_dev->lock_keys); 332 333 if (type == KEY_PRESS && (kbd_dev->mods & KM_LCTRL) && key == KC_F1) { 205 lock_keys = lock_keys & ~mod_mask; 206 } 207 } 208 /* 209 printf("type: %d\n", type); 210 printf("mods: 0x%x\n", mods); 211 printf("keycode: %u\n", key); 212 */ 213 214 if (type == KEY_PRESS && (mods & KM_LCTRL) && 215 key == KC_F1) { 334 216 active_layout = 0; 335 217 layout[active_layout]->reset(); … … 337 219 } 338 220 339 if (type == KEY_PRESS && (kbd_dev->mods & KM_LCTRL) && key == KC_F2) { 221 if (type == KEY_PRESS && (mods & KM_LCTRL) && 222 key == KC_F2) { 340 223 active_layout = 1; 341 224 layout[active_layout]->reset(); … … 343 226 } 344 227 345 if (type == KEY_PRESS && (kbd_dev->mods & KM_LCTRL) && key == KC_F3) { 228 if (type == KEY_PRESS && (mods & KM_LCTRL) && 229 key == KC_F3) { 346 230 active_layout = 2; 347 231 layout[active_layout]->reset(); … … 351 235 ev.type = type; 352 236 ev.key = key; 353 ev.mods = kbd_dev->mods; 354 355 if (ev.mods & KM_NUM_LOCK) { 356 usb_log_debug("\n\nNum Lock turned on.\n\n"); 357 } 237 ev.mods = mods; 358 238 359 239 ev.c = layout[active_layout]->parse_ev(&ev); 360 240 361 usb_log_debug2("Sending key %d to the console\n", ev.key);241 printf("Sending key %d to the console\n", ev.key); 362 242 assert(console_callback_phone != -1); 363 async_msg_4(console_callback_phone, KBD_EVENT, ev.type, ev.key, 364 ev.mods, ev.c); 243 async_msg_4(console_callback_phone, KBD_EVENT, ev.type, ev.key, ev.mods, ev.c); 365 244 } 366 245 /* … … 370 249 /* 371 250 * TODO: 372 * 1) key press / key release - how does the keyboard notify about 373 * release? 251 * 1) key press / key release - how does the keyboard notify about release? 374 252 * 2) layouts (use the already defined), not important now 375 253 * 3) 376 254 */ 377 255 378 static const keycode_t usb_hid_modifiers_keycodes[USB_HID_MOD_COUNT] = {379 KC_LCTRL, /* USB_HID_MOD_LCTRL */380 KC_LSHIFT, /* USB_HID_MOD_LSHIFT */381 KC_LALT, /* USB_HID_MOD_LALT */382 0, /* USB_HID_MOD_LGUI */383 KC_RCTRL, /* USB_HID_MOD_RCTRL */384 KC_RSHIFT, /* USB_HID_MOD_RSHIFT */385 KC_RALT, /* USB_HID_MOD_RALT */386 0, /* USB_HID_MOD_RGUI */387 };388 389 static void usbkbd_check_modifier_changes(usb_hid_dev_kbd_t *kbd_dev,390 uint8_t modifiers)391 {392 /*393 * TODO: why the USB keyboard has NUM_, SCROLL_ and CAPS_LOCK394 * both as modifiers and as keys with their own scancodes???395 *396 * modifiers should be sent as normal keys to usbkbd_parse_scancode()!!397 * so maybe it would be better if I received it from report parser in398 * that way399 */400 401 int i;402 for (i = 0; i < USB_HID_MOD_COUNT; ++i) {403 if ((modifiers & usb_hid_modifiers_consts[i]) &&404 !(kbd_dev->modifiers & usb_hid_modifiers_consts[i])) {405 // modifier pressed406 if (usb_hid_modifiers_keycodes[i] != 0) {407 kbd_push_ev(KEY_PRESS,408 usb_hid_modifiers_keycodes[i], kbd_dev);409 }410 } else if (!(modifiers & usb_hid_modifiers_consts[i]) &&411 (kbd_dev->modifiers & usb_hid_modifiers_consts[i])) {412 // modifier released413 if (usb_hid_modifiers_keycodes[i] != 0) {414 kbd_push_ev(KEY_RELEASE,415 usb_hid_modifiers_keycodes[i], kbd_dev);416 }417 } // no change418 }419 420 kbd_dev->modifiers = modifiers;421 }422 423 static void usbkbd_check_key_changes(usb_hid_dev_kbd_t *kbd_dev,424 const uint8_t *key_codes)425 {426 // TODO: phantom state!!427 428 unsigned int key;429 unsigned int i, j;430 431 // TODO: quite dummy right now, think of better implementation432 433 // key releases434 for (j = 0; j < kbd_dev->keycode_count; ++j) {435 // try to find the old key in the new key list436 i = 0;437 while (i < kbd_dev->keycode_count438 && key_codes[i] != kbd_dev->keycodes[j]) {439 ++i;440 }441 442 if (i == kbd_dev->keycode_count) {443 // not found, i.e. the key was released444 key = usbkbd_parse_scancode(kbd_dev->keycodes[j]);445 kbd_push_ev(KEY_RELEASE, key, kbd_dev);446 usb_log_debug2("\nKey released: %d\n", key);447 } else {448 // found, nothing happens449 }450 }451 452 // key presses453 for (i = 0; i < kbd_dev->keycode_count; ++i) {454 // try to find the new key in the old key list455 j = 0;456 while (j < kbd_dev->keycode_count457 && kbd_dev->keycodes[j] != key_codes[i]) {458 ++j;459 }460 461 if (j == kbd_dev->keycode_count) {462 // not found, i.e. new key pressed463 key = usbkbd_parse_scancode(key_codes[i]);464 usb_log_debug2("\nKey pressed: %d (keycode: %d)\n", key,465 key_codes[i]);466 kbd_push_ev(KEY_PRESS, key, kbd_dev);467 } else {468 // found, nothing happens469 }470 }471 472 memcpy(kbd_dev->keycodes, key_codes, kbd_dev->keycode_count);473 474 usb_log_debug2("\nNew stored keycodes: ");475 for (i = 0; i < kbd_dev->keycode_count; ++i) {476 usb_log_debug2("%d ", kbd_dev->keycodes[i]);477 }478 }479 480 256 /* 481 257 * Callbacks for parser … … 484 260 uint8_t modifiers, void *arg) 485 261 { 486 if (arg == NULL) { 487 usb_log_warning("Missing argument in callback " 488 "usbkbd_process_keycodes().\n"); 489 return; 490 } 491 492 usb_log_debug2("Got keys from parser: "); 262 printf("Got keys: "); 493 263 unsigned i; 494 264 for (i = 0; i < count; ++i) { 495 usb_log_debug2("%d ", key_codes[i]); 496 } 497 usb_log_debug2("\n"); 498 499 usb_hid_dev_kbd_t *kbd_dev = (usb_hid_dev_kbd_t *)arg; 500 501 if (count != kbd_dev->keycode_count) { 502 usb_log_warning("Number of received keycodes (%d) differs from" 503 " expected number (%d).\n", count, kbd_dev->keycode_count); 504 return; 505 } 506 507 usbkbd_check_modifier_changes(kbd_dev, modifiers); 508 usbkbd_check_key_changes(kbd_dev, key_codes); 265 printf("%d ", key_codes[i]); 266 } 267 printf("\n"); 268 269 for (i = 0; i < count; ++i) { 270 // TODO: Key press / release 271 272 // TODO: NOT WORKING 273 unsigned int key = usbkbd_parse_scancode(key_codes[i]); 274 275 if (key == 0) { 276 continue; 277 } 278 kbd_push_ev(KEY_PRESS, key); 279 } 280 printf("\n"); 509 281 } 510 282 … … 512 284 * Kbd functions 513 285 */ 514 //static int usbkbd_get_report_descriptor(usb_hid_dev_kbd_t *kbd_dev) 515 //{ 516 // // iterate over all configurations and interfaces 517 // // TODO: more configurations!! 518 // unsigned i; 519 // for (i = 0; i < kbd_dev->conf->config_descriptor.interface_count; ++i) { 520 // // TODO: endianness 521 // uint16_t length = kbd_dev->conf->interfaces[i].hid_desc. 522 // report_desc_info.length; 523 // size_t actual_size = 0; 524 525 // // allocate space for the report descriptor 526 // kbd_dev->conf->interfaces[i].report_desc = 527 // (uint8_t *)malloc(length); 286 static int usbkbd_get_report_descriptor(usb_hid_dev_kbd_t *kbd_dev) 287 { 288 // iterate over all configurations and interfaces 289 // TODO: more configurations!! 290 unsigned i; 291 for (i = 0; i < kbd_dev->conf->config_descriptor.interface_count; ++i) { 292 // TODO: endianness 293 uint16_t length = 294 kbd_dev->conf->interfaces[i].hid_desc.report_desc_info.length; 295 size_t actual_size = 0; 296 297 // allocate space for the report descriptor 298 kbd_dev->conf->interfaces[i].report_desc = (uint8_t *)malloc(length); 528 299 529 // // get the descriptor from the device 530 // int rc = usb_request_get_descriptor(&kbd_dev->ctrl_pipe, 531 // USB_REQUEST_TYPE_CLASS, USB_DESCTYPE_HID_REPORT, 532 // i, 0, 533 // kbd_dev->conf->interfaces[i].report_desc, length, 534 // &actual_size); 535 536 // if (rc != EOK) { 537 // return rc; 538 // } 539 540 // assert(actual_size == length); 541 542 // //dump_hid_class_descriptor(0, USB_DESCTYPE_HID_REPORT, 543 // // kbd_dev->conf->interfaces[i].report_desc, length); 544 // } 545 546 // return EOK; 547 //} 548 549 static int usbkbd_get_report_descriptor(usb_hid_dev_kbd_t *kbd_dev, 550 uint8_t *config_desc, size_t config_desc_size, uint8_t *iface_desc) 551 { 552 assert(kbd_dev != NULL); 553 assert(config_desc != NULL); 554 assert(config_desc_size != 0); 555 assert(iface_desc != NULL); 556 557 usb_dp_parser_t parser = { 558 .nesting = usb_dp_standard_descriptor_nesting 559 }; 560 561 usb_dp_parser_data_t parser_data = { 562 .data = config_desc, 563 .size = config_desc_size, 564 .arg = NULL 565 }; 566 567 /* 568 * First nested descriptor of interface descriptor. 569 */ 570 uint8_t *d = 571 usb_dp_get_nested_descriptor(&parser, &parser_data, iface_desc); 572 573 /* 574 * Search through siblings until the HID descriptor is found. 575 */ 576 while (d != NULL && *(d + 1) != USB_DESCTYPE_HID) { 577 d = usb_dp_get_sibling_descriptor(&parser, &parser_data, 578 iface_desc, d); 579 } 580 581 if (d == NULL) { 582 usb_log_fatal("No HID descriptor found!\n"); 583 return ENOENT; 584 } 585 586 if (*d != sizeof(usb_standard_hid_descriptor_t)) { 587 usb_log_fatal("HID descriptor hass wrong size (%u, expected %u" 588 ")\n", *d, sizeof(usb_standard_hid_descriptor_t)); 589 return EINVAL; 590 } 591 592 usb_standard_hid_descriptor_t *hid_desc = 593 (usb_standard_hid_descriptor_t *)d; 594 595 uint16_t length = hid_desc->report_desc_info.length; 596 size_t actual_size = 0; 597 598 /* 599 * Allocate space for the report descriptor. 600 */ 601 kbd_dev->report_desc = (uint8_t *)malloc(length); 602 if (kbd_dev->report_desc == NULL) { 603 usb_log_fatal("Failed to allocate space for Report descriptor." 604 "\n"); 605 return ENOMEM; 606 } 607 608 usb_log_debug("Getting Report descriptor, expected size: %u\n", length); 609 610 /* 611 * Get the descriptor from the device. 612 */ 613 int rc = usb_request_get_descriptor(&kbd_dev->ctrl_pipe, 614 USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_INTERFACE, 615 USB_DESCTYPE_HID_REPORT, 0, 616 kbd_dev->iface, kbd_dev->report_desc, length, &actual_size); 617 618 if (rc != EOK) { 619 return rc; 620 } 621 622 if (actual_size != length) { 623 free(kbd_dev->report_desc); 624 kbd_dev->report_desc = NULL; 625 usb_log_fatal("Report descriptor has wrong size (%u, expected " 626 "%u)\n", actual_size, length); 627 return EINVAL; 628 } 629 630 usb_log_debug("Done.\n"); 631 300 // get the descriptor from the device 301 int rc = usb_request_get_descriptor(&kbd_dev->ctrl_pipe, 302 USB_REQUEST_TYPE_CLASS, USB_DESCTYPE_HID_REPORT, 303 i, 0, 304 kbd_dev->conf->interfaces[i].report_desc, length, 305 &actual_size); 306 307 if (rc != EOK) { 308 return rc; 309 } 310 311 assert(actual_size == length); 312 313 //dump_hid_class_descriptor(0, USB_DESCTYPE_HID_REPORT, 314 // kbd_dev->conf->interfaces[i].report_desc, length); 315 } 316 632 317 return EOK; 633 318 } 634 635 319 static int usbkbd_process_descriptors(usb_hid_dev_kbd_t *kbd_dev) 636 320 { … … 680 364 descriptors, config_desc.total_length, 681 365 &kbd_dev->wire); 682 683 366 if (rc != EOK) { 684 367 usb_log_error("Failed to initialize poll pipe: %s.\n", 685 368 str_error(rc)); 686 free(descriptors);687 369 return rc; 688 370 } 689 690 371 if (!endpoint_mapping[0].present) { 691 372 usb_log_warning("Not accepting device, " \ 692 373 "not boot-protocol keyboard.\n"); 374 return EREFUSED; 375 } 376 377 378 379 380 kbd_dev->conf = (usb_hid_configuration_t *)calloc(1, 381 sizeof(usb_hid_configuration_t)); 382 if (kbd_dev->conf == NULL) { 693 383 free(descriptors); 694 return EREFUSED; 695 } 696 697 usb_log_debug("Accepted device. Saving interface, and getting Report" 698 " descriptor.\n"); 699 700 /* 701 * Save assigned interface number. 702 */ 703 if (endpoint_mapping[0].interface_no < 0) { 704 usb_log_error("Bad interface number.\n"); 705 free(descriptors); 706 return EINVAL; 707 } 708 709 kbd_dev->iface = endpoint_mapping[0].interface_no; 710 711 assert(endpoint_mapping[0].interface != NULL); 712 713 rc = usbkbd_get_report_descriptor(kbd_dev, descriptors, transferred, 714 (uint8_t *)endpoint_mapping[0].interface); 715 384 return ENOMEM; 385 } 386 387 /*rc = usbkbd_parse_descriptors(descriptors, transferred, kbd_dev->conf); 716 388 free(descriptors); 717 718 if (rc != EOK) { 719 usb_log_warning("Problem with parsing REPORT descriptor.\n"); 389 if (rc != EOK) { 390 printf("Problem with parsing standard descriptors.\n"); 720 391 return rc; 721 392 } 722 723 usb_log_debug("Done parsing descriptors.\n"); 724 393 394 // get and report descriptors*/ 395 rc = usbkbd_get_report_descriptor(kbd_dev); 396 if (rc != EOK) { 397 printf("Problem with parsing HID REPORT descriptor.\n"); 398 return rc; 399 } 400 401 //usbkbd_print_config(kbd_dev->conf); 402 403 /* 404 * TODO: 405 * 1) select one configuration (lets say the first) 406 * 2) how many interfaces?? how to select one?? 407 * ("The default setting for an interface is always alternate setting zero.") 408 * 3) find endpoint which is IN and INTERRUPT (parse), save its number 409 * as the endpoint for polling 410 */ 411 725 412 return EOK; 726 413 } … … 734 421 735 422 if (kbd_dev == NULL) { 736 usb_log_fatal("No memory!\n");423 fprintf(stderr, NAME ": No memory!\n"); 737 424 return NULL; 738 425 } … … 762 449 763 450 /* 764 * Get descriptors, parse descriptors and save endpoints. 765 */ 451 * will need all descriptors: 452 * 1) choose one configuration from configuration descriptors 453 * (set it to the device) 454 * 2) set endpoints from endpoint descriptors 455 */ 456 457 // TODO: get descriptors, parse descriptors and save endpoints 766 458 usb_endpoint_pipe_start_session(&kbd_dev->ctrl_pipe); 767 459 //usb_request_set_configuration(&kbd_dev->ctrl_pipe, 1); 768 460 rc = usbkbd_process_descriptors(kbd_dev); 769 770 461 usb_endpoint_pipe_end_session(&kbd_dev->ctrl_pipe); 771 462 if (rc != EOK) { 772 463 goto error_leave; 773 464 } 774 775 // save the size of the report (boot protocol report by default) 776 kbd_dev->keycode_count = BOOTP_REPORT_SIZE; 777 kbd_dev->keycodes = (uint8_t *)calloc( 778 kbd_dev->keycode_count, sizeof(uint8_t)); 779 780 if (kbd_dev->keycodes == NULL) { 781 usb_log_fatal("No memory!\n"); 782 goto error_leave; 783 } 784 785 kbd_dev->modifiers = 0; 786 kbd_dev->mods = DEFAULT_ACTIVE_MODS; 787 kbd_dev->lock_keys = 0; 788 789 // set boot protocol 790 usbkbd_req_set_protocol(kbd_dev, USB_HID_PROTOCOL_BOOT); 791 792 // set LEDs according to internal setup (NUM LOCK enabled) 793 usbkbd_set_led(kbd_dev); 794 465 795 466 return kbd_dev; 796 467 … … 805 476 usb_hid_report_in_callbacks_t *callbacks = 806 477 (usb_hid_report_in_callbacks_t *)malloc( 807 478 sizeof(usb_hid_report_in_callbacks_t)); 808 479 callbacks->keyboard = usbkbd_process_keycodes; 809 480 810 481 //usb_hid_parse_report(kbd_dev->parser, buffer, actual_size, callbacks, 811 482 // NULL); 812 /*usb_log_debug2("Calling usb_hid_boot_keyboard_input_report() with size"813 " %zu\n", actual_size);*/483 printf("Calling usb_hid_boot_keyboard_input_report() with size %zu\n", 484 actual_size); 814 485 //dump_buffer("bufffer: ", buffer, actual_size); 815 int rc = usb_hid_boot_keyboard_input_report(buffer, actual_size, 816 callbacks, kbd_dev); 817 818 if (rc != EOK) { 819 usb_log_warning("Error in usb_hid_boot_keyboard_input_report():" 820 "%s\n", str_error(rc)); 486 int rc = usb_hid_boot_keyboard_input_report(buffer, actual_size, callbacks, 487 NULL); 488 if (rc != EOK) { 489 printf("Error in usb_hid_boot_keyboard_input_report(): %d\n", rc); 821 490 } 822 491 } … … 828 497 size_t actual_size; 829 498 830 usb_log_info("Polling keyboard...\n");499 printf("Polling keyboard...\n"); 831 500 832 501 while (true) { … … 835 504 sess_rc = usb_endpoint_pipe_start_session(&kbd_dev->poll_pipe); 836 505 if (sess_rc != EOK) { 837 usb_log_warning("Failed to start a session: %s.\n",506 printf("Failed to start a session: %s.\n", 838 507 str_error(sess_rc)); 839 508 continue; … … 845 514 846 515 if (rc != EOK) { 847 usb_log_warning("Error polling the keyboard: %s.\n",516 printf("Error polling the keyboard: %s.\n", 848 517 str_error(rc)); 849 518 continue; … … 851 520 852 521 if (sess_rc != EOK) { 853 usb_log_warning("Error closing session: %s.\n",522 printf("Error closing session: %s.\n", 854 523 str_error(sess_rc)); 855 524 continue; … … 861 530 */ 862 531 if (actual_size == 0) { 863 usb_log_debug("Keyboard returned NAK\n");532 printf("Keyboard returned NAK\n"); 864 533 continue; 865 534 } … … 868 537 * TODO: Process pressed keys. 869 538 */ 870 usb_log_debug("Calling usbkbd_process_interrupt_in()\n");539 printf("Calling usbkbd_process_interrupt_in()\n"); 871 540 usbkbd_process_interrupt_in(kbd_dev, buffer, actual_size); 872 541 } … … 878 547 static int usbkbd_fibril_device(void *arg) 879 548 { 549 printf("!!! USB device fibril\n"); 550 880 551 if (arg == NULL) { 881 usb_log_error("No device!\n");552 printf("No device!\n"); 882 553 return -1; 883 554 } 884 885 usb_hid_dev_kbd_t *kbd_dev = (usb_hid_dev_kbd_t *)arg; 555 556 ddf_dev_t *dev = (ddf_dev_t *)arg; 557 558 // initialize device (get and process descriptors, get address, etc.) 559 usb_hid_dev_kbd_t *kbd_dev = usbkbd_init_device(dev); 560 if (kbd_dev == NULL) { 561 printf("Error while initializing device.\n"); 562 return -1; 563 } 886 564 887 565 usbkbd_poll_keyboard(kbd_dev); … … 892 570 static int usbkbd_add_device(ddf_dev_t *dev) 893 571 { 572 /* For now, fail immediately. */ 573 //return ENOTSUP; 574 575 /* 576 * When everything is okay, connect to "our" HC. 577 * 578 * Not supported yet, skip.. 579 */ 580 // int phone = usb_drv_hc_connect_auto(dev, 0); 581 // if (phone < 0) { 582 // /* 583 // * Connecting to HC failed, roll-back and announce 584 // * failure. 585 // */ 586 // return phone; 587 // } 588 589 // dev->parent_phone = phone; 590 894 591 /* 895 592 * Create default function. … … 904 601 rc = ddf_fun_add_to_class(kbd_fun, "keyboard"); 905 602 assert(rc == EOK); 906 907 /* 908 * Initialize device (get and process descriptors, get address, etc.) 909 */ 910 usb_hid_dev_kbd_t *kbd_dev = usbkbd_init_device(dev); 911 if (kbd_dev == NULL) { 912 usb_log_error("Error while initializing device.\n"); 913 return -1; 914 } 915 916 usb_log_info("Device initialized.\n"); 917 603 918 604 /* 919 605 * Create new fibril for handling this keyboard 920 606 */ 921 fid_t fid = fibril_create(usbkbd_fibril_device, kbd_dev);607 fid_t fid = fibril_create(usbkbd_fibril_device, dev); 922 608 if (fid == 0) { 923 usb_log_error("Failed to start fibril for HID device\n");609 printf("%s: failed to start fibril for HID device\n", NAME); 924 610 return ENOMEM; 925 611 } … … 948 634 int main(int argc, char *argv[]) 949 635 { 950 usb_log_enable(USB_LOG_LEVEL_INFO, NAME);636 usb_log_enable(USB_LOG_LEVEL_INFO, "usbhid"); 951 637 return ddf_driver_main(&kbd_driver); 952 638 } -
uspace/drv/usbhub/main.c
r51b46f2 r0e3505a 34 34 #include <errno.h> 35 35 #include <async.h> 36 #include <stdio.h>37 36 38 37 #include "usbhub.h" … … 52 51 }; 53 52 53 int usb_hub_control_loop(void * noparam){ 54 while(true){ 55 usb_hub_check_hub_changes(); 56 async_usleep(1000 * 1000 );/// \TODO proper number once 57 } 58 return 0; 59 } 60 61 54 62 int main(int argc, char *argv[]) 55 63 { 56 64 usb_log_enable(USB_LOG_LEVEL_DEBUG, NAME); 57 dprintf(USB_LOG_LEVEL_INFO, "starting hub driver"); 58 59 //this is probably not needed anymore 65 60 66 fibril_mutex_initialize(&usb_hub_list_lock); 61 67 fibril_mutex_lock(&usb_hub_list_lock); 62 68 usb_lst_init(&usb_hub_list); 63 69 fibril_mutex_unlock(&usb_hub_list_lock); 64 70 71 fid_t fid = fibril_create(usb_hub_control_loop, NULL); 72 if (fid == 0) { 73 fprintf(stderr, NAME ": failed to start monitoring fibril," \ 74 " driver aborting.\n"); 75 return ENOMEM; 76 } 77 fibril_add_ready(fid); 78 65 79 return ddf_driver_main(&hub_driver); 66 80 } -
uspace/drv/usbhub/port_status.h
r51b46f2 r0e3505a 177 177 } 178 178 179 /**180 * set the device request to be a port disable request181 * @param request182 * @param port183 */184 static inline void usb_hub_unset_power_port_request(185 usb_device_request_setup_packet_t * request, uint16_t port186 ){187 request->index = port;188 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE;189 request->request = USB_HUB_REQUEST_CLEAR_FEATURE;190 request->value = USB_HUB_FEATURE_PORT_POWER;191 request->length = 0;192 }193 194 179 /** get i`th bit of port status */ 195 180 static inline bool usb_port_get_bit(usb_port_status_t * status, int idx) -
uspace/drv/usbhub/usbhub.c
r51b46f2 r0e3505a 44 44 #include <usb/request.h> 45 45 #include <usb/classes/hub.h> 46 #include <stdio.h>47 46 48 47 #include "usbhub.h" … … 57 56 }; 58 57 59 /** Hub status-change endpoint description 60 * 61 * For more see usb hub specification in 11.15.1 of 62 */ 58 /** Hub status-change endpoint description */ 63 59 static usb_endpoint_description_t status_change_endpoint_description = { 64 60 .transfer_type = USB_TRANSFER_INTERRUPT, 65 61 .direction = USB_DIRECTION_IN, 66 62 .interface_class = USB_CLASS_HUB, 67 .interface_subclass = 0,68 .interface_protocol = 0,69 63 .flags = 0 70 64 }; 71 72 int usb_hub_control_loop(void * hub_info_param){73 usb_hub_info_t * hub_info = (usb_hub_info_t*)hub_info_param;74 while(true){75 usb_hub_check_hub_changes(hub_info);76 async_usleep(1000 * 1000 );/// \TODO proper number once77 }78 return 0;79 }80 65 81 66 … … 150 135 151 136 //configuration descriptor 152 /// \TODO check other configurations ?137 /// \TODO check other configurations 153 138 usb_standard_configuration_descriptor_t config_descriptor; 154 139 opResult = usb_request_get_bare_configuration_descriptor( … … 194 179 } 195 180 181 /** 182 * Initialize the interrupt in endpoint. 183 * \TODO this code should be checked... 184 */ 196 185 usb_endpoint_mapping_t endpoint_mapping[1] = { 197 186 { … … 221 210 return EOK; 222 211 212 213 // Initialize the interrupt(=status change) endpoint. 214 /*usb_endpoint_pipe_initialize( 215 &result->endpoints->status_change, 216 &result->device_connection, );USB_TRANSFER_INTERRUPT 217 USB_DIRECTION_IN*/ 218 223 219 } 224 220 … … 253 249 usb_endpoint_pipe_start_session(&result->endpoints.control); 254 250 opResult = usb_request_get_descriptor(&result->endpoints.control, 255 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_DEVICE, 256 USB_DESCTYPE_HUB, 257 0, 0, serialized_descriptor, 251 USB_REQUEST_TYPE_CLASS, 252 USB_DESCTYPE_HUB, 0, 0, serialized_descriptor, 258 253 USB_HUB_MAX_DESCRIPTOR_SIZE, &received_size); 259 254 usb_endpoint_pipe_end_session(&result->endpoints.control); … … 272 267 } 273 268 269 274 270 dprintf(USB_LOG_LEVEL_INFO, "setting port count to %d",descriptor->ports_count); 275 271 result->port_count = descriptor->ports_count; … … 333 329 334 330 //add the hub to list 335 //is this needed now?336 331 fibril_mutex_lock(&usb_hub_list_lock); 337 332 usb_lst_append(&usb_hub_list, hub_info); 338 333 fibril_mutex_unlock(&usb_hub_list_lock); 334 339 335 dprintf(USB_LOG_LEVEL_DEBUG, "hub info added to list"); 340 341 dprintf(USB_LOG_LEVEL_DEBUG, "adding to ddf");342 ddf_fun_t *hub_fun = ddf_fun_create(dev, fun_exposed, "hub");343 assert(hub_fun != NULL);344 hub_fun->ops = NULL;345 346 int rc = ddf_fun_bind(hub_fun);347 assert(rc == EOK);348 rc = ddf_fun_add_to_class(hub_fun, "hub");349 assert(rc == EOK);350 351 fid_t fid = fibril_create(usb_hub_control_loop, hub_info);352 if (fid == 0) {353 dprintf(USB_LOG_LEVEL_ERROR,354 ": failed to start monitoring fibril for new hub");355 return ENOMEM;356 }357 fibril_add_ready(fid);358 359 dprintf(USB_LOG_LEVEL_DEBUG, "hub fibril created");360 336 //(void)hub_info; 361 //usb_hub_check_hub_changes();337 usb_hub_check_hub_changes(); 362 338 363 339 dprintf(USB_LOG_LEVEL_INFO, "hub dev added"); … … 392 368 //opResult = usb_drv_reserve_default_address(hc); 393 369 opResult = usb_hc_reserve_default_address(&hub->connection, USB_SPEED_LOW); 394 395 if (opResult != EOK) { 396 dprintf(USB_LOG_LEVEL_WARNING, 397 "cannot assign default address, it is probably used %d",opResult); 370 371 if (opResult != EOK) { 372 dprintf(USB_LOG_LEVEL_WARNING, "cannot assign default address, it is probably used"); 398 373 return; 399 374 } … … 406 381 ); 407 382 if (opResult != EOK) { 408 dprintf(USB_LOG_LEVEL_ERROR, 409 "something went wrong when reseting a port %d",opResult); 383 dprintf(USB_LOG_LEVEL_ERROR, "something went wrong when reseting a port"); 410 384 //usb_hub_release_default_address(hc); 411 385 usb_hc_release_default_address(&hub->connection); … … 420 394 */ 421 395 static void usb_hub_finalize_add_device( usb_hub_info_t * hub, 422 uint16_t port , bool isLowSpeed) {396 uint16_t port) { 423 397 424 398 int opResult; … … 443 417 &new_device_connection); 444 418 /// \TODO get highspeed info 445 usb_speed_t speed = isLowSpeed?USB_SPEED_LOW:USB_SPEED_FULL; 419 420 421 446 422 447 423 … … 449 425 usb_address_t new_device_address = usb_hc_request_address( 450 426 &hub->connection, 451 speed/// \TODO fullspeed??427 USB_SPEED_LOW/// \TODO fullspeed?? 452 428 ); 453 429 if (new_device_address < 0) { … … 460 436 //opResult = usb_drv_req_set_address(hc, USB_ADDRESS_DEFAULT, 461 437 // new_device_address); 462 usb_endpoint_pipe_start_session(&new_device_pipe);463 438 opResult = usb_request_set_address(&new_device_pipe,new_device_address); 464 usb_endpoint_pipe_end_session(&new_device_pipe); 465 if (opResult != EOK) { 466 dprintf(USB_LOG_LEVEL_ERROR, 467 "could not set address for new device %d",opResult); 439 440 if (opResult != EOK) { 441 dprintf(USB_LOG_LEVEL_ERROR, "could not set address for new device"); 468 442 usb_hc_release_default_address(&hub->connection); 469 443 return; … … 484 458 485 459 if (opResult != EOK) { 486 dprintf(USB_LOG_LEVEL_ERROR, 487 "could not start driver for new device %d",opResult); 460 dprintf(USB_LOG_LEVEL_ERROR, "could not start driver for new device"); 488 461 return; 489 462 } … … 496 469 &hub->attached_devs[port]); 497 470 if (opResult != EOK) { 498 dprintf(USB_LOG_LEVEL_ERROR, 499 "could not assign address of device in hcd %d",opResult); 471 dprintf(USB_LOG_LEVEL_ERROR, "could not assign address of device in hcd"); 500 472 return; 501 473 } … … 539 511 } 540 512 541 542 /**543 *Process over current condition on port.544 *545 * Turn off the power on the port.546 *547 * @param hub548 * @param port549 */550 static void usb_hub_over_current( usb_hub_info_t * hub,551 uint16_t port){552 int opResult;553 opResult = usb_hub_clear_port_feature(&hub->endpoints.control,554 port, USB_HUB_FEATURE_PORT_POWER);555 if(opResult!=EOK){556 dprintf(USB_LOG_LEVEL_ERROR, "cannot power off port %d; %d",557 port, opResult);558 }559 }560 561 513 /** 562 514 * Process interrupts on given hub port … … 570 522 //determine type of change 571 523 usb_endpoint_pipe_t *pipe = &hub->endpoints.control; 524 int opResult = usb_endpoint_pipe_start_session(pipe); 572 525 573 int opResult; 526 if(opResult != EOK){ 527 dprintf(USB_LOG_LEVEL_ERROR, "cannot open pipe %d", opResult); 528 } 529 530 /* 531 usb_target_t target; 532 target.address=address; 533 target.endpoint=0; 534 */ 574 535 575 536 usb_port_status_t status; … … 586 547 ); 587 548 if (opResult != EOK) { 588 dprintf(USB_LOG_LEVEL_ERROR, " could not get port status");549 dprintf(USB_LOG_LEVEL_ERROR, "ERROR: could not get port status"); 589 550 return; 590 551 } 591 552 if (rcvd_size != sizeof (usb_port_status_t)) { 592 dprintf(USB_LOG_LEVEL_ERROR, " received status has incorrect size");553 dprintf(USB_LOG_LEVEL_ERROR, "ERROR: received status has incorrect size"); 593 554 return; 594 555 } … … 605 566 } 606 567 } 607 //over current608 if (usb_port_overcurrent_change(&status)) {609 //check if it was not auto-resolved610 if(usb_port_over_current(&status)){611 usb_hub_over_current(hub,port);612 }else{613 dprintf(USB_LOG_LEVEL_INFO,614 "over current condition was auto-resolved on port %d",port);615 }616 }617 568 //port reset 618 569 if (usb_port_reset_completed(&status)) { 619 570 dprintf(USB_LOG_LEVEL_INFO, "port reset complete"); 620 571 if (usb_port_enabled(&status)) { 621 usb_hub_finalize_add_device(hub, port , usb_port_low_speed(&status));572 usb_hub_finalize_add_device(hub, port); 622 573 } else { 623 dprintf(USB_LOG_LEVEL_WARNING, " port reset, but port still not enabled");574 dprintf(USB_LOG_LEVEL_WARNING, "ERROR: port reset, but port still not enabled"); 624 575 } 625 576 } … … 634 585 } 635 586 /// \TODO handle other changes 636 } 637 638 /** 639 * Check changes on particular hub 640 * @param hub_info_param 641 */ 642 void usb_hub_check_hub_changes(usb_hub_info_t * hub_info){ 643 int opResult; 644 opResult = usb_endpoint_pipe_start_session(&hub_info->endpoints.status_change); 645 if(opResult != EOK){ 646 dprintf(USB_LOG_LEVEL_ERROR, 647 "could not initialize communication for hub; %d", opResult); 648 return; 649 } 650 651 size_t port_count = hub_info->port_count; 652 653 /// FIXME: count properly 654 size_t byte_length = ((port_count+1) / 8) + 1; 587 /// \TODO debug log for various situations 588 usb_endpoint_pipe_end_session(pipe); 589 590 591 } 592 593 /** 594 * Check changes on all known hubs. 595 */ 596 void usb_hub_check_hub_changes(void) { 597 /* 598 * Iterate through all hubs. 599 */ 600 usb_general_list_t * lst_item; 601 fibril_mutex_lock(&usb_hub_list_lock); 602 for (lst_item = usb_hub_list.next; 603 lst_item != &usb_hub_list; 604 lst_item = lst_item->next) { 605 fibril_mutex_unlock(&usb_hub_list_lock); 606 usb_hub_info_t * hub_info = ((usb_hub_info_t*)lst_item->data); 607 int opResult; 608 609 opResult = usb_endpoint_pipe_start_session(&hub_info->endpoints.status_change); 610 if(opResult != EOK){ 611 continue; 612 } 613 /* 614 * Check status change pipe of this hub. 615 */ 616 /* 617 usb_target_t target; 618 target.address = hub_info->address; 619 target.endpoint = 1;/// \TODO get from endpoint descriptor 620 dprintf(USB_LOG_LEVEL_INFO, "checking changes for hub at addr %d", 621 target.address); 622 */ 623 size_t port_count = hub_info->port_count; 624 625 /* 626 * Connect to respective HC. 627 * 628 int hc = usb_drv_hc_connect_auto(hub_info->device, 0); 629 if (hc < 0) { 630 continue; 631 }*/ 632 633 /// FIXME: count properly 634 size_t byte_length = ((port_count+1) / 8) + 1; 635 655 636 void *change_bitmap = malloc(byte_length); 656 size_t actual_size; 657 658 /* 659 * Send the request. 660 */ 661 opResult = usb_endpoint_pipe_read( 662 &hub_info->endpoints.status_change, 663 change_bitmap, byte_length, &actual_size 664 ); 665 666 if (opResult != EOK) { 637 size_t actual_size; 638 //usb_handle_t handle; 639 640 /* 641 * Send the request. 642 */ 643 opResult = usb_endpoint_pipe_read( 644 &hub_info->endpoints.status_change, 645 change_bitmap, byte_length, &actual_size 646 ); 647 648 //usb_drv_async_wait_for(handle); 649 650 if (opResult != EOK) { 651 free(change_bitmap); 652 dprintf(USB_LOG_LEVEL_WARNING, "something went wrong while getting status of hub"); 653 continue; 654 } 655 unsigned int port; 656 for (port = 1; port < port_count+1; ++port) { 657 bool interrupt = 658 (((uint8_t*) change_bitmap)[port / 8] >> (port % 8)) % 2; 659 if (interrupt) { 660 usb_hub_process_interrupt( 661 hub_info, port); 662 } 663 } 664 usb_endpoint_pipe_end_session(&hub_info->endpoints.status_change); 667 665 free(change_bitmap); 668 dprintf(USB_LOG_LEVEL_WARNING, "something went wrong while getting status of hub"); 669 usb_endpoint_pipe_end_session(&hub_info->endpoints.status_change); 670 return; 671 } 672 unsigned int port; 673 opResult = usb_endpoint_pipe_start_session(&hub_info->endpoints.control); 674 if(opResult!=EOK){ 675 dprintf(USB_LOG_LEVEL_ERROR, "could not start control pipe session %d", 676 opResult); 677 usb_endpoint_pipe_end_session(&hub_info->endpoints.status_change); 678 return; 679 } 680 opResult = usb_hc_connection_open(&hub_info->connection); 681 if(opResult!=EOK){ 682 dprintf(USB_LOG_LEVEL_ERROR, "could not start host controller session %d", 683 opResult); 684 usb_endpoint_pipe_end_session(&hub_info->endpoints.control); 685 usb_endpoint_pipe_end_session(&hub_info->endpoints.status_change); 686 return; 687 } 688 689 ///todo, opresult check, pre obe konekce 690 for (port = 1; port < port_count+1; ++port) { 691 bool interrupt = 692 (((uint8_t*) change_bitmap)[port / 8] >> (port % 8)) % 2; 693 if (interrupt) { 694 usb_hub_process_interrupt( 695 hub_info, port); 696 } 697 } 698 usb_hc_connection_close(&hub_info->connection); 699 usb_endpoint_pipe_end_session(&hub_info->endpoints.control); 700 usb_endpoint_pipe_end_session(&hub_info->endpoints.status_change); 701 free(change_bitmap); 702 } 666 667 668 //async_hangup(hc); 669 fibril_mutex_lock(&usb_hub_list_lock); 670 } 671 fibril_mutex_unlock(&usb_hub_list_lock); 672 } 673 674 703 675 704 676 -
uspace/drv/usbhub/usbhub.h
r51b46f2 r0e3505a 75 75 /** 76 76 * function running the hub-controlling loop. 77 * @param hub_info_param hub info pointer77 * @param noparam fundtion does not need any parameters 78 78 */ 79 int usb_hub_control_loop(void * hub_info_param);79 int usb_hub_control_loop(void * noparam); 80 80 81 81 /** Callback when new hub device is detected. … … 87 87 88 88 /** 89 * check changes on specified hub 90 * @param hub_info_param pointer to usb_hub_info_t structure 89 * check changes on all registered hubs 91 90 */ 92 void usb_hub_check_hub_changes( usb_hub_info_t * hub_info_param);91 void usb_hub_check_hub_changes(void); 93 92 94 93 94 //int usb_add_hub_device(device_t *); 95 95 96 96 -
uspace/lib/usb/include/usb/classes/hid.h
r51b46f2 r0e3505a 51 51 } usb_hid_request_t; 52 52 53 typedef enum {54 USB_HID_REPORT_TYPE_INPUT = 1,55 USB_HID_REPORT_TYPE_OUTPUT = 2,56 USB_HID_REPORT_TYPE_FEATURE = 357 } usb_hid_report_type_t;58 59 typedef enum {60 USB_HID_PROTOCOL_BOOT = 0,61 USB_HID_PROTOCOL_REPORT = 162 } usb_hid_protocol_t;63 64 53 /** USB/HID subclass constants. */ 65 54 typedef enum { … … 73 62 USB_HID_PROTOCOL_KEYBOARD = 1, 74 63 USB_HID_PROTOCOL_MOUSE = 2 75 } usb_hid_ iface_protocol_t;64 } usb_hid_protocol_t; 76 65 77 66 /** Part of standard USB HID descriptor specifying one class descriptor. -
uspace/lib/usb/include/usb/classes/hidparser.h
r51b46f2 r0e3505a 70 70 } usb_hid_report_in_callbacks_t; 71 71 72 73 typedef enum { 74 USB_HID_MOD_LCTRL = 0x01, 75 USB_HID_MOD_LSHIFT = 0x02, 76 USB_HID_MOD_LALT = 0x04, 77 USB_HID_MOD_LGUI = 0x08, 78 USB_HID_MOD_RCTRL = 0x10, 79 USB_HID_MOD_RSHIFT = 0x20, 80 USB_HID_MOD_RALT = 0x40, 81 USB_HID_MOD_RGUI = 0x80, 82 USB_HID_MOD_COUNT = 8 83 } usb_hid_modifiers_t; 84 85 typedef enum { 86 USB_HID_LED_NUM_LOCK = 0x1, 87 USB_HID_LED_CAPS_LOCK = 0x2, 88 USB_HID_LED_SCROLL_LOCK = 0x4, 89 USB_HID_LED_COMPOSE = 0x8, 90 USB_HID_LED_KANA = 0x10, 91 USB_HID_LED_COUNT = 5 92 } usb_hid_led_t; 93 94 static const usb_hid_modifiers_t 95 usb_hid_modifiers_consts[USB_HID_MOD_COUNT] = { 96 USB_HID_MOD_LCTRL, 97 USB_HID_MOD_LSHIFT, 98 USB_HID_MOD_LALT, 99 USB_HID_MOD_LGUI, 100 USB_HID_MOD_RCTRL, 101 USB_HID_MOD_RSHIFT, 102 USB_HID_MOD_RALT, 103 USB_HID_MOD_RGUI 104 }; 105 106 //static const usb_hid_led_t usb_hid_led_consts[USB_HID_LED_COUNT] = { 107 // USB_HID_LED_NUM_LOCK, 108 // USB_HID_LED_CAPS_LOCK, 109 // USB_HID_LED_SCROLL_LOCK, 110 // USB_HID_LED_COMPOSE, 111 // USB_HID_LED_KANA 112 //}; 113 114 //#define USB_HID_BOOT_KEYBOARD_NUM_LOCK 0x01 115 //#define USB_HID_BOOT_KEYBOARD_CAPS_LOCK 0x02 116 //#define USB_HID_BOOT_KEYBOARD_SCROLL_LOCK 0x04 117 //#define USB_HID_BOOT_KEYBOARD_COMPOSE 0x08 118 //#define USB_HID_BOOT_KEYBOARD_KANA 0x10 72 #define USB_HID_BOOT_KEYBOARD_NUM_LOCK 0x01 73 #define USB_HID_BOOT_KEYBOARD_CAPS_LOCK 0x02 74 #define USB_HID_BOOT_KEYBOARD_SCROLL_LOCK 0x04 75 #define USB_HID_BOOT_KEYBOARD_COMPOSE 0x08 76 #define USB_HID_BOOT_KEYBOARD_KANA 0x10 119 77 120 78 /* -
uspace/lib/usb/include/usb/request.h
r51b46f2 r0e3505a 96 96 int usb_request_set_address(usb_endpoint_pipe_t *, usb_address_t); 97 97 int usb_request_get_descriptor(usb_endpoint_pipe_t *, usb_request_type_t, 98 usb_request_recipient_t, uint8_t, uint8_t, uint16_t, void *, size_t, 99 size_t *); 98 uint8_t, uint8_t, uint16_t, void *, size_t, size_t *); 100 99 int usb_request_get_descriptor_alloc(usb_endpoint_pipe_t *, usb_request_type_t, 101 u sb_request_recipient_t, uint8_t, uint8_t, uint16_t, void **, size_t *);100 uint8_t, uint8_t, uint16_t, void **, size_t *); 102 101 int usb_request_get_device_descriptor(usb_endpoint_pipe_t *, 103 102 usb_standard_device_descriptor_t *); -
uspace/lib/usb/src/hidparser.c
r51b46f2 r0e3505a 144 144 int usb_hid_boot_keyboard_output_report(uint8_t leds, uint8_t *data, size_t size) 145 145 { 146 if (size <1){146 if(size != 1){ 147 147 return -1; 148 148 } 149 149 150 data[0] = leds; 150 /* used only first five bits, others are only padding*/ 151 *data = leds; 151 152 return EOK; 152 153 } -
uspace/lib/usb/src/request.c
r51b46f2 r0e3505a 36 36 #include <errno.h> 37 37 #include <assert.h> 38 #include <usb/debug.h>39 38 40 39 #define MAX_DATA_LENGTH ((size_t)(0xFFFF)) … … 210 209 */ 211 210 int usb_request_get_descriptor(usb_endpoint_pipe_t *pipe, 212 usb_request_type_t request_type, usb_request_recipient_t recipient,211 usb_request_type_t request_type, 213 212 uint8_t descriptor_type, uint8_t descriptor_index, 214 213 uint16_t language, … … 225 224 226 225 return usb_control_request_get(pipe, 227 request_type, recipient,226 request_type, USB_REQUEST_RECIPIENT_DEVICE, 228 227 USB_DEVREQ_GET_DESCRIPTOR, 229 228 wValue, language, … … 243 242 */ 244 243 int usb_request_get_descriptor_alloc(usb_endpoint_pipe_t * pipe, 245 usb_request_type_t request_type, usb_request_recipient_t recipient,244 usb_request_type_t request_type, 246 245 uint8_t descriptor_type, uint8_t descriptor_index, 247 246 uint16_t language, … … 259 258 uint8_t tmp_buffer[1]; 260 259 size_t bytes_transfered; 261 rc = usb_request_get_descriptor(pipe, request_type, recipient,260 rc = usb_request_get_descriptor(pipe, request_type, 262 261 descriptor_type, descriptor_index, language, 263 262 &tmp_buffer, 1, &bytes_transfered); … … 284 283 } 285 284 286 rc = usb_request_get_descriptor(pipe, request_type, recipient,285 rc = usb_request_get_descriptor(pipe, request_type, 287 286 descriptor_type, descriptor_index, language, 288 287 buffer, size, &bytes_transfered); … … 321 320 usb_standard_device_descriptor_t descriptor_tmp; 322 321 int rc = usb_request_get_descriptor(pipe, 323 USB_REQUEST_TYPE_STANDARD, USB_ REQUEST_RECIPIENT_DEVICE,324 USB_DESCTYPE_DEVICE,0, 0,322 USB_REQUEST_TYPE_STANDARD, USB_DESCTYPE_DEVICE, 323 0, 0, 325 324 &descriptor_tmp, sizeof(descriptor_tmp), 326 325 &actually_transferred); … … 367 366 usb_standard_configuration_descriptor_t descriptor_tmp; 368 367 int rc = usb_request_get_descriptor(pipe, 369 USB_REQUEST_TYPE_STANDARD, USB_ REQUEST_RECIPIENT_DEVICE,370 USB_DESCTYPE_CONFIGURATION,index, 0,368 USB_REQUEST_TYPE_STANDARD, USB_DESCTYPE_CONFIGURATION, 369 index, 0, 371 370 &descriptor_tmp, sizeof(descriptor_tmp), 372 371 &actually_transferred); … … 407 406 408 407 return usb_request_get_descriptor(pipe, 409 USB_REQUEST_TYPE_STANDARD, USB_ REQUEST_RECIPIENT_DEVICE,410 USB_DESCTYPE_CONFIGURATION,index, 0,408 USB_REQUEST_TYPE_STANDARD, USB_DESCTYPE_CONFIGURATION, 409 index, 0, 411 410 descriptor, descriptor_size, actual_size); 412 411 } … … 453 452 size_t string_descriptor_size = 0; 454 453 rc = usb_request_get_descriptor_alloc(pipe, 455 USB_REQUEST_TYPE_STANDARD, USB_REQUEST_RECIPIENT_DEVICE, 456 USB_DESCTYPE_STRING, 0, 0, 454 USB_REQUEST_TYPE_STANDARD, USB_DESCTYPE_STRING, 0, 0, 457 455 (void **) &string_descriptor, &string_descriptor_size); 458 456 if (rc != EOK) { … … 537 535 size_t string_size; 538 536 rc = usb_request_get_descriptor_alloc(pipe, 539 USB_REQUEST_TYPE_STANDARD, USB_ REQUEST_RECIPIENT_DEVICE,540 USB_DESCTYPE_STRING,index, uint16_host2usb(lang),537 USB_REQUEST_TYPE_STANDARD, USB_DESCTYPE_STRING, 538 index, uint16_host2usb(lang), 541 539 (void **) &string, &string_size); 542 540 if (rc != EOK) {
Note:
See TracChangeset
for help on using the changeset viewer.