Changeset aec2ad4 in mainline for uspace/drv
- Timestamp:
- 2011-02-04T11:48:33Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 103a3626
- Parents:
- ba5ab09 (diff), 3597dab (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- uspace/drv
- Files:
-
- 5 added
- 11 edited
- 8 moved
-
uhci/Makefile (modified) (1 diff)
-
uhci/main.c (modified) (2 diffs)
-
uhci/pci.c (added)
-
uhci/uhci.h (modified) (2 diffs)
-
usbhid/Makefile (moved) (moved from uspace/drv/usbkbd/Makefile ) (2 diffs)
-
usbhid/conv.c (added)
-
usbhid/conv.h (added)
-
usbhid/descdump.c (moved) (moved from uspace/drv/usbkbd/descdump.c ) (1 diff)
-
usbhid/descdump.h (moved) (moved from uspace/drv/usbkbd/descdump.h ) (1 diff)
-
usbhid/descparser.c (moved) (moved from uspace/drv/usbkbd/descparser.c ) (1 diff)
-
usbhid/descparser.h (moved) (moved from uspace/drv/usbkbd/descparser.h ) (2 diffs)
-
usbhid/hid.h (added)
-
usbhid/kbd.h (added)
-
usbhid/layout.h (moved) (moved from uspace/drv/vhc/debug.c ) (2 diffs)
-
usbhid/main.c (moved) (moved from uspace/drv/usbkbd/main.c ) (15 diffs)
-
usbhid/usbhid.ma (moved) (moved from uspace/drv/usbkbd/usbkbd.ma )
-
vhc/Makefile (modified) (1 diff)
-
vhc/conndev.c (modified) (2 diffs)
-
vhc/connhost.c (modified) (9 diffs)
-
vhc/devices.c (modified) (2 diffs)
-
vhc/hc.c (modified) (7 diffs)
-
vhc/hcd.c (modified) (2 diffs)
-
vhc/hub.c (modified) (2 diffs)
-
vhc/vhcd.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/uhci/Makefile
rba5ab09 raec2ad4 34 34 SOURCES = \ 35 35 main.c \ 36 pci.c \ 36 37 transfers.c 37 38 -
uspace/drv/uhci/main.c
rba5ab09 raec2ad4 30 30 #include <usb/debug.h> 31 31 #include <errno.h> 32 #include <str_error.h> 32 33 #include <driver.h> 33 34 #include "uhci.h" … … 55 56 usb_dprintf(NAME, 1, "uhci_add_device() called\n"); 56 57 device->ops = &uhci_ops; 58 59 uintptr_t io_reg_base; 60 size_t io_reg_size; 61 int irq; 62 63 int rc = pci_get_my_registers(device, 64 &io_reg_base, &io_reg_size, &irq); 65 66 if (rc != EOK) { 67 fprintf(stderr, 68 NAME ": failed to get I/O registers addresses: %s.\n", 69 str_error(rc)); 70 return rc; 71 } 72 73 usb_dprintf(NAME, 2, "I/O regs at 0x%X (size %zu), IRQ %d.\n", 74 io_reg_base, io_reg_size, irq); 57 75 58 76 /* -
uspace/drv/uhci/uhci.h
rba5ab09 raec2ad4 27 27 */ 28 28 29 /** @addtogroup usb29 /** @addtogroup drvusbuhci 30 30 * @{ 31 31 */ … … 42 42 usbhc_iface_t uhci_iface; 43 43 44 int pci_get_my_registers(device_t *, uintptr_t *, size_t *, int *); 45 44 46 #endif 45 47 /** -
uspace/drv/usbhid/Makefile
rba5ab09 raec2ad4 1 1 # 2 # Copyright (c) 2010 Vojtech Horky2 # Copyright (c) 2010-2011 Vojtech Horky 3 3 # All rights reserved. 4 4 # … … 29 29 USPACE_PREFIX = ../.. 30 30 LIBS = $(LIBDRV_PREFIX)/libdrv.a $(LIBUSB_PREFIX)/libusb.a 31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -I$(LIBUSB_PREFIX)/include 32 BINARY = usbkbd 31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -I$(LIBUSB_PREFIX)/include -I. 32 BINARY = usbhid 33 34 STOLEN_LAYOUT_SOURCES = \ 35 layout/us_qwerty.c \ 36 layout/us_dvorak.c \ 37 layout/cz.c 33 38 34 39 SOURCES = \ 35 40 main.c \ 36 41 descparser.c \ 37 descdump.c 42 descdump.c \ 43 conv.c \ 44 $(STOLEN_LAYOUT_SOURCES) 45 46 EXTRA_CLEAN = $(STOLEN_LAYOUT_SOURCES) 47 48 SRV_KBD = $(USPACE_PREFIX)/srv/hid/kbd 38 49 39 50 include $(USPACE_PREFIX)/Makefile.common 51 52 layout/%.c: $(SRV_KBD)/layout/%.c 53 ln -sfn ../$< $@ -
uspace/drv/usbhid/descdump.c
rba5ab09 raec2ad4 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 28 29 /** @addtogroup drvusbhid 29 30 * @{ 31 */ 32 /** @file 33 * Descriptor dumping. 30 34 */ 31 35 -
uspace/drv/usbhid/descdump.h
rba5ab09 raec2ad4 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 28 29 /** @addtogroup drvusbhid 29 30 * @{ 30 31 */ 32 /** @file 33 * Descriptor dumping. 34 */ 35 31 36 #ifndef USBHID_DESCDUMP_H_ 32 37 #define USBHID_DESCDUMP_H_ 33 38 34 #include <usb/classes/hid.h>39 #include "hid.h" 35 40 36 41 void dump_standard_configuration_descriptor( -
uspace/drv/usbhid/descparser.c
rba5ab09 raec2ad4 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 28 29 /** @addtogroup drvusbhid 29 30 * @{ 31 */ 32 /** @file 33 * Descriptor parser. 30 34 */ 31 35 -
uspace/drv/usbhid/descparser.h
rba5ab09 raec2ad4 26 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 27 */ 28 28 29 /** @addtogroup drvusbhid 29 30 * @{ 31 */ 32 /** @file 33 * Descriptor parser. 30 34 */ 31 35 … … 33 37 #define USBHID_DESCPARSER_H_ 34 38 35 #include <usb/classes/hid.h>39 #include "hid.h" 36 40 37 41 int usbkbd_parse_descriptors(const uint8_t *data, size_t size, -
uspace/drv/usbhid/layout.h
rba5ab09 raec2ad4 1 1 /* 2 * Copyright (c) 2010 Vojtech Horky 2 * Copyright (c) 2009 Jiri Svoboda 3 * Copyright (c) 2011 Lubos Slovak 4 * (copied from /uspace/srv/hid/kbd/include/layout.h) 3 5 * All rights reserved. 4 6 * … … 27 29 */ 28 30 29 /** @addtogroup drvusb vhc31 /** @addtogroup drvusbhid 30 32 * @{ 31 33 */ 32 34 /** @file 33 * @brief Debugging support.35 * Keyboard layout. 34 36 */ 35 #include <stdio.h>36 #include <ipc/ipc.h>37 #include <usb/debug.h>38 37 39 #include "vhcd.h" 38 #ifndef USBHID_LAYOUT_H_ 39 #define USBHID_LAYOUT_H_ 40 40 41 #include <sys/types.h> 42 #include <io/console.h> 41 43 42 /** Debug print informing of invalid call. 43 */ 44 void dprintf_inval_call(int level, ipc_call_t call, sysarg_t phone_hash) 45 { 46 dprintf(level, "phone%#x: invalid call [%u (%u, %u, %u, %u, %u)]", 47 phone_hash, 48 IPC_GET_IMETHOD(call), 49 IPC_GET_ARG1(call), IPC_GET_ARG2(call), IPC_GET_ARG3(call), 50 IPC_GET_ARG4(call), IPC_GET_ARG5(call)); 51 } 44 typedef struct { 45 void (*reset)(void); 46 wchar_t (*parse_ev)(console_event_t *); 47 } layout_op_t; 48 49 extern layout_op_t us_qwerty_op; 50 extern layout_op_t us_dvorak_op; 51 extern layout_op_t cz_op; 52 53 #endif 52 54 53 55 /** -
uspace/drv/usbhid/main.c
rba5ab09 raec2ad4 1 1 /* 2 2 * Copyright (c) 2010 Vojtech Horky 3 * Copyright (c) 2011 Lubos Slovak 3 4 * All rights reserved. 4 5 * … … 26 27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28 */ 29 28 30 /** @addtogroup drvusbhid 29 31 * @{ 30 32 */ 33 /** 34 * @file 35 * Main routines of USB HID driver. 36 */ 37 31 38 #include <usb/usbdrv.h> 32 39 #include <driver.h> … … 36 43 #include <io/console.h> 37 44 #include <errno.h> 45 #include <str_error.h> 38 46 #include <fibril.h> 39 47 #include <usb/classes/hid.h> 40 48 #include <usb/classes/hidparser.h> 41 #include <usb/ devreq.h>49 #include <usb/request.h> 42 50 #include <usb/descriptor.h> 51 #include <io/console.h> 52 #include "hid.h" 43 53 #include "descparser.h" 44 54 #include "descdump.h" 55 #include "conv.h" 56 #include "layout.h" 45 57 46 58 #define BUFFER_SIZE 32 47 #define NAME "usb kbd"59 #define NAME "usbhid" 48 60 49 61 #define GUESSED_POLL_ENDPOINT 1 … … 91 103 92 104 /* 105 * TODO: Move somewhere else 106 */ 107 /* 108 #define BYTES_PER_LINE 12 109 110 static void dump_buffer(const char *msg, const uint8_t *buffer, size_t length) 111 { 112 printf("%s\n", msg); 113 114 size_t i; 115 for (i = 0; i < length; i++) { 116 printf(" 0x%02X", buffer[i]); 117 if (((i > 0) && (((i+1) % BYTES_PER_LINE) == 0)) 118 || (i + 1 == length)) { 119 printf("\n"); 120 } 121 } 122 } 123 */ 124 /* 125 * Copy-paste from srv/hid/kbd/generic/kbd.c 126 */ 127 128 /** Currently active modifiers. 129 * 130 * TODO: put to device? 131 */ 132 static unsigned mods = KM_NUM_LOCK; 133 134 /** Currently pressed lock keys. We track these to tackle autorepeat. 135 * 136 * TODO: put to device? 137 */ 138 static unsigned lock_keys; 139 140 #define NUM_LAYOUTS 3 141 142 static layout_op_t *layout[NUM_LAYOUTS] = { 143 &us_qwerty_op, 144 &us_dvorak_op, 145 &cz_op 146 }; 147 148 static int active_layout = 0; 149 150 static void kbd_push_ev(int type, unsigned int key) 151 { 152 console_event_t ev; 153 unsigned mod_mask; 154 155 // TODO: replace by our own parsing?? or are the key codes identical?? 156 switch (key) { 157 case KC_LCTRL: mod_mask = KM_LCTRL; break; 158 case KC_RCTRL: mod_mask = KM_RCTRL; break; 159 case KC_LSHIFT: mod_mask = KM_LSHIFT; break; 160 case KC_RSHIFT: mod_mask = KM_RSHIFT; break; 161 case KC_LALT: mod_mask = KM_LALT; break; 162 case KC_RALT: mod_mask = KM_RALT; break; 163 default: mod_mask = 0; break; 164 } 165 166 if (mod_mask != 0) { 167 if (type == KEY_PRESS) 168 mods = mods | mod_mask; 169 else 170 mods = mods & ~mod_mask; 171 } 172 173 switch (key) { 174 case KC_CAPS_LOCK: mod_mask = KM_CAPS_LOCK; break; 175 case KC_NUM_LOCK: mod_mask = KM_NUM_LOCK; break; 176 case KC_SCROLL_LOCK: mod_mask = KM_SCROLL_LOCK; break; 177 default: mod_mask = 0; break; 178 } 179 180 if (mod_mask != 0) { 181 if (type == KEY_PRESS) { 182 /* 183 * Only change lock state on transition from released 184 * to pressed. This prevents autorepeat from messing 185 * up the lock state. 186 */ 187 mods = mods ^ (mod_mask & ~lock_keys); 188 lock_keys = lock_keys | mod_mask; 189 190 /* Update keyboard lock indicator lights. */ 191 // TODO 192 //kbd_ctl_set_ind(mods); 193 } else { 194 lock_keys = lock_keys & ~mod_mask; 195 } 196 } 197 /* 198 printf("type: %d\n", type); 199 printf("mods: 0x%x\n", mods); 200 printf("keycode: %u\n", key); 201 */ 202 203 if (type == KEY_PRESS && (mods & KM_LCTRL) && 204 key == KC_F1) { 205 active_layout = 0; 206 layout[active_layout]->reset(); 207 return; 208 } 209 210 if (type == KEY_PRESS && (mods & KM_LCTRL) && 211 key == KC_F2) { 212 active_layout = 1; 213 layout[active_layout]->reset(); 214 return; 215 } 216 217 if (type == KEY_PRESS && (mods & KM_LCTRL) && 218 key == KC_F3) { 219 active_layout = 2; 220 layout[active_layout]->reset(); 221 return; 222 } 223 224 ev.type = type; 225 ev.key = key; 226 ev.mods = mods; 227 228 ev.c = layout[active_layout]->parse_ev(&ev); 229 230 printf("Sending key %d to the console\n", ev.key); 231 assert(console_callback_phone != -1); 232 async_msg_4(console_callback_phone, KBD_EVENT, ev.type, ev.key, ev.mods, ev.c); 233 } 234 /* 235 * End of copy-paste 236 */ 237 238 /* 239 * TODO: 240 * 1) key press / key release - how does the keyboard notify about release? 241 * 2) layouts (use the already defined), not important now 242 * 3) 243 */ 244 245 /* 93 246 * Callbacks for parser 94 247 */ 95 248 static void usbkbd_process_keycodes(const uint8_t *key_codes, size_t count, 96 uint8_t modifiers, void *arg)249 uint8_t modifiers, void *arg) 97 250 { 98 251 printf("Got keys: "); … … 100 253 for (i = 0; i < count; ++i) { 101 254 printf("%d ", key_codes[i]); 255 // TODO: Key press / release 256 257 // TODO: NOT WORKING 258 unsigned int key = usbkbd_parse_scancode(key_codes[i]); 259 kbd_push_ev(KEY_PRESS, key); 102 260 } 103 261 printf("\n"); … … 122 280 123 281 // get the descriptor from the device 124 int rc = usb_drv_req_get_descriptor(kbd_dev->device->parent_phone, 125 kbd_dev->address, USB_REQUEST_TYPE_CLASS, USB_DESCTYPE_HID_REPORT, 126 0, i, kbd_dev->conf->interfaces[i].report_desc, length, 282 int rc = usb_request_get_descriptor(&kbd_dev->ctrl_pipe, 283 USB_REQUEST_TYPE_CLASS, USB_DESCTYPE_HID_REPORT, 284 i, 0, 285 kbd_dev->conf->interfaces[i].report_desc, length, 127 286 &actual_size); 128 287 … … 145 304 usb_standard_configuration_descriptor_t config_desc; 146 305 147 int rc = usb_drv_req_get_bare_configuration_descriptor( 148 kbd_dev->device->parent_phone, kbd_dev->address, 0, &config_desc); 306 int rc; 307 rc = usb_request_get_bare_configuration_descriptor(&kbd_dev->ctrl_pipe, 308 0, &config_desc); 149 309 150 310 if (rc != EOK) { … … 160 320 size_t transferred = 0; 161 321 // get full configuration descriptor 162 rc = usb_ drv_req_get_full_configuration_descriptor(163 kbd_dev->device->parent_phone, kbd_dev->address,0, descriptors,322 rc = usb_request_get_full_configuration_descriptor(&kbd_dev->ctrl_pipe, 323 0, descriptors, 164 324 config_desc.total_length, &transferred); 165 325 … … 208 368 static usb_hid_dev_kbd_t *usbkbd_init_device(device_t *dev) 209 369 { 370 int rc; 371 210 372 usb_hid_dev_kbd_t *kbd_dev = (usb_hid_dev_kbd_t *)calloc(1, 211 373 sizeof(usb_hid_dev_kbd_t)); … … 218 380 kbd_dev->device = dev; 219 381 220 // get phone to my HC and save it as my parent's phone 221 // TODO: maybe not a good idea if DDF will use parent_phone 222 int rc = kbd_dev->device->parent_phone = usb_drv_hc_connect_auto(dev, 0); 223 if (rc < 0) { 224 printf("Problem setting phone to HC.\n"); 225 free(kbd_dev); 226 return NULL; 227 } 228 229 rc = kbd_dev->address = usb_drv_get_my_address(dev->parent_phone, dev); 230 if (rc < 0) { 231 printf("Problem getting address of the device.\n"); 232 free(kbd_dev); 233 return NULL; 234 } 235 236 // doesn't matter now that we have no address 237 // if (kbd_dev->address < 0) { 238 // fprintf(stderr, NAME ": No device address!\n"); 239 // free(kbd_dev); 240 // return NULL; 241 // } 242 243 // default endpoint 244 kbd_dev->poll_endpoint = GUESSED_POLL_ENDPOINT; 245 382 /* 383 * Initialize the backing connection to the host controller. 384 */ 385 rc = usb_device_connection_initialize_from_device(&kbd_dev->wire, dev); 386 if (rc != EOK) { 387 printf("Problem initializing connection to device: %s.\n", 388 str_error(rc)); 389 goto error_leave; 390 } 391 392 /* 393 * Initialize device pipes. 394 */ 395 rc = usb_endpoint_pipe_initialize_default_control(&kbd_dev->ctrl_pipe, 396 &kbd_dev->wire); 397 if (rc != EOK) { 398 printf("Failed to initialize default control pipe: %s.\n", 399 str_error(rc)); 400 goto error_leave; 401 } 402 403 rc = usb_endpoint_pipe_initialize(&kbd_dev->poll_pipe, &kbd_dev->wire, 404 GUESSED_POLL_ENDPOINT, USB_TRANSFER_INTERRUPT, USB_DIRECTION_IN); 405 if (rc != EOK) { 406 printf("Failed to initialize interrupt in pipe: %s.\n", 407 str_error(rc)); 408 goto error_leave; 409 } 410 246 411 /* 247 412 * will need all descriptors: 248 * 1) choose one configuration from configuration descriptors 413 * 1) choose one configuration from configuration descriptors 249 414 * (set it to the device) 250 415 * 2) set endpoints from endpoint descriptors … … 252 417 253 418 // TODO: get descriptors, parse descriptors and save endpoints 419 usb_endpoint_pipe_start_session(&kbd_dev->ctrl_pipe); 254 420 usbkbd_process_descriptors(kbd_dev); 421 usb_endpoint_pipe_end_session(&kbd_dev->ctrl_pipe); 255 422 256 423 return kbd_dev; 424 425 error_leave: 426 free(kbd_dev); 427 return NULL; 257 428 } 258 429 … … 267 438 //usb_hid_parse_report(kbd_dev->parser, buffer, actual_size, callbacks, 268 439 // NULL); 269 printf("Calling usb_hid_boot_keyboard_input_report()...\n)"); 270 usb_hid_boot_keyboard_input_report(buffer, actual_size, callbacks, NULL); 440 printf("Calling usb_hid_boot_keyboard_input_report() with size %zu\n", 441 actual_size); 442 //dump_buffer("bufffer: ", buffer, actual_size); 443 int rc = usb_hid_boot_keyboard_input_report(buffer, actual_size, callbacks, 444 NULL); 445 if (rc != EOK) { 446 printf("Error in usb_hid_boot_keyboard_input_report(): %d\n", rc); 447 } 271 448 } 272 449 273 450 static void usbkbd_poll_keyboard(usb_hid_dev_kbd_t *kbd_dev) 274 451 { 275 return; 276 277 int rc; 278 usb_handle_t handle; 452 int rc, sess_rc; 279 453 uint8_t buffer[BUFFER_SIZE]; 280 454 size_t actual_size; 281 //usb_endpoint_t poll_endpoint = 1; 282 283 // usb_address_t my_address = usb_drv_get_my_address(dev->parent_phone, 284 // dev); 285 // if (my_address < 0) { 286 // return; 287 // } 288 289 usb_target_t poll_target = { 290 .address = kbd_dev->address, 291 .endpoint = kbd_dev->poll_endpoint 292 }; 455 456 printf("Polling keyboard...\n"); 293 457 294 458 while (true) { 295 async_usleep(1000 * 1000); 296 rc = usb_drv_async_interrupt_in(kbd_dev->device->parent_phone, 297 poll_target, buffer, BUFFER_SIZE, &actual_size, &handle); 459 async_usleep(1000 * 1000 * 2); 460 461 sess_rc = usb_endpoint_pipe_start_session(&kbd_dev->poll_pipe); 462 if (sess_rc != EOK) { 463 printf("Failed to start a session: %s.\n", 464 str_error(sess_rc)); 465 continue; 466 } 467 468 rc = usb_endpoint_pipe_read(&kbd_dev->poll_pipe, buffer, 469 BUFFER_SIZE, &actual_size); 470 sess_rc = usb_endpoint_pipe_end_session(&kbd_dev->poll_pipe); 298 471 299 472 if (rc != EOK) { 473 printf("Error polling the keyboard: %s.\n", 474 str_error(rc)); 300 475 continue; 301 476 } 302 477 303 rc = usb_drv_async_wait_for(handle); 304 if (rc != EOK) { 478 if (sess_rc != EOK) { 479 printf("Error closing session: %s.\n", 480 str_error(sess_rc)); 305 481 continue; 306 482 } … … 311 487 */ 312 488 if (actual_size == 0) { 489 printf("Keyboard returned NAK\n"); 313 490 continue; 314 491 } … … 317 494 * TODO: Process pressed keys. 318 495 */ 496 printf("Calling usbkbd_process_interrupt_in()\n"); 319 497 usbkbd_process_interrupt_in(kbd_dev, buffer, actual_size); 320 498 } … … 337 515 // initialize device (get and process descriptors, get address, etc.) 338 516 usb_hid_dev_kbd_t *kbd_dev = usbkbd_init_device(dev); 517 if (kbd_dev == NULL) { 518 printf("Error while initializing device.\n"); 519 return -1; 520 } 339 521 340 522 usbkbd_poll_keyboard(kbd_dev); -
uspace/drv/vhc/Makefile
rba5ab09 raec2ad4 44 44 conndev.c \ 45 45 connhost.c \ 46 debug.c \47 46 devices.c \ 48 47 hc.c \ -
uspace/drv/vhc/conndev.c
rba5ab09 raec2ad4 99 99 int rc = get_device_name(callback, devname, DEVICE_NAME_MAXLENGTH); 100 100 101 dprintf(0, "virtual device connected (name: %s, id: %x)",101 usb_log_info("New virtual device `%s' (id = %x).\n", 102 102 rc == EOK ? devname : "<unknown>", dev->id); 103 103 … … 122 122 } 123 123 124 dprintf(0, "virtual device disconnected (id: %x)", dev->id);124 usb_log_info("Virtual device disconnected (id = %x).\n", dev->id); 125 125 virtdev_destroy_device(dev); 126 126 } -
uspace/drv/vhc/connhost.c
rba5ab09 raec2ad4 42 42 #include "hc.h" 43 43 44 44 45 typedef struct { 45 46 usb_direction_t direction; … … 47 48 usbhc_iface_transfer_in_callback_t in_callback; 48 49 device_t *dev; 50 size_t reported_size; 49 51 void *arg; 50 52 } transfer_info_t; 51 53 54 typedef struct { 55 usb_direction_t direction; 56 usb_target_t target; 57 usbhc_iface_transfer_out_callback_t out_callback; 58 usbhc_iface_transfer_in_callback_t in_callback; 59 device_t *dev; 60 void *arg; 61 void *data_buffer; 62 size_t data_buffer_size; 63 } control_transfer_info_t; 64 52 65 static void universal_callback(void *buffer, size_t size, 53 66 usb_transaction_outcome_t outcome, void *arg) 54 67 { 55 68 transfer_info_t *transfer = (transfer_info_t *) arg; 69 70 if (transfer->reported_size != (size_t) -1) { 71 size = transfer->reported_size; 72 } 56 73 57 74 switch (transfer->direction) { … … 84 101 transfer->arg = arg; 85 102 transfer->dev = dev; 103 transfer->reported_size = (size_t) -1; 104 105 return transfer; 106 } 107 108 static void control_abort_prematurely(control_transfer_info_t *transfer, 109 size_t size, usb_transaction_outcome_t outcome) 110 { 111 switch (transfer->direction) { 112 case USB_DIRECTION_IN: 113 transfer->in_callback(transfer->dev, 114 outcome, size, 115 transfer->arg); 116 break; 117 case USB_DIRECTION_OUT: 118 transfer->out_callback(transfer->dev, 119 outcome, 120 transfer->arg); 121 break; 122 default: 123 assert(false && "unreachable"); 124 break; 125 } 126 } 127 128 static void control_callback_two(void *buffer, size_t size, 129 usb_transaction_outcome_t outcome, void *arg) 130 { 131 control_transfer_info_t *ctrl_transfer = (control_transfer_info_t *) arg; 132 133 if (outcome != USB_OUTCOME_OK) { 134 control_abort_prematurely(ctrl_transfer, outcome, size); 135 free(ctrl_transfer); 136 return; 137 } 138 139 transfer_info_t *transfer = create_transfer_info(ctrl_transfer->dev, 140 ctrl_transfer->direction, ctrl_transfer->arg); 141 transfer->out_callback = ctrl_transfer->out_callback; 142 transfer->in_callback = ctrl_transfer->in_callback; 143 transfer->reported_size = size; 144 145 switch (ctrl_transfer->direction) { 146 case USB_DIRECTION_IN: 147 hc_add_transaction_to_device(false, ctrl_transfer->target, 148 USB_TRANSFER_CONTROL, 149 NULL, 0, 150 universal_callback, transfer); 151 break; 152 case USB_DIRECTION_OUT: 153 hc_add_transaction_from_device(ctrl_transfer->target, 154 USB_TRANSFER_CONTROL, 155 NULL, 0, 156 universal_callback, transfer); 157 break; 158 default: 159 assert(false && "unreachable"); 160 break; 161 } 162 163 free(ctrl_transfer); 164 } 165 166 static void control_callback_one(void *buffer, size_t size, 167 usb_transaction_outcome_t outcome, void *arg) 168 { 169 control_transfer_info_t *transfer = (control_transfer_info_t *) arg; 170 171 if (outcome != USB_OUTCOME_OK) { 172 control_abort_prematurely(transfer, outcome, size); 173 free(transfer); 174 return; 175 } 176 177 switch (transfer->direction) { 178 case USB_DIRECTION_IN: 179 hc_add_transaction_from_device(transfer->target, 180 USB_TRANSFER_CONTROL, 181 transfer->data_buffer, transfer->data_buffer_size, 182 control_callback_two, transfer); 183 break; 184 case USB_DIRECTION_OUT: 185 hc_add_transaction_to_device(false, transfer->target, 186 USB_TRANSFER_CONTROL, 187 transfer->data_buffer, transfer->data_buffer_size, 188 control_callback_two, transfer); 189 break; 190 default: 191 assert(false && "unreachable"); 192 break; 193 } 194 } 195 196 static control_transfer_info_t *create_control_transfer_info(device_t *dev, 197 usb_direction_t direction, usb_target_t target, 198 void *data_buffer, size_t data_buffer_size, 199 void *arg) 200 { 201 control_transfer_info_t *transfer 202 = malloc(sizeof(control_transfer_info_t)); 203 204 transfer->direction = direction; 205 transfer->target = target; 206 transfer->in_callback = NULL; 207 transfer->out_callback = NULL; 208 transfer->arg = arg; 209 transfer->dev = dev; 210 transfer->data_buffer = data_buffer; 211 transfer->data_buffer_size = data_buffer_size; 86 212 87 213 return transfer; … … 93 219 usbhc_iface_transfer_out_callback_t callback, void *arg) 94 220 { 95 dprintf(3, "transfer OUT [%d.%d (%s); %zu]",221 usb_log_debug2("Transfer OUT [%d.%d (%s); %zu].\n", 96 222 target.address, target.endpoint, 97 223 usb_str_transfer_type(transfer_type), … … 113 239 usbhc_iface_transfer_out_callback_t callback, void *arg) 114 240 { 115 dprintf(3, "transfer SETUP [%d.%d (%s); %zu]",241 usb_log_debug2("Transfer SETUP [%d.%d (%s); %zu].\n", 116 242 target.address, target.endpoint, 117 243 usb_str_transfer_type(transfer_type), … … 133 259 usbhc_iface_transfer_in_callback_t callback, void *arg) 134 260 { 135 dprintf(3, "transfer IN [%d.%d (%s); %zu]",261 usb_log_debug2("Transfer IN [%d.%d (%s); %zu].\n", 136 262 target.address, target.endpoint, 137 263 usb_str_transfer_type(transfer_type), … … 193 319 } 194 320 321 static int control_write(device_t *dev, usb_target_t target, 322 void *setup_packet, size_t setup_packet_size, 323 void *data, size_t data_size, 324 usbhc_iface_transfer_out_callback_t callback, void *arg) 325 { 326 control_transfer_info_t *transfer 327 = create_control_transfer_info(dev, USB_DIRECTION_OUT, target, 328 data, data_size, arg); 329 transfer->out_callback = callback; 330 331 hc_add_transaction_to_device(true, target, USB_TRANSFER_CONTROL, 332 setup_packet, setup_packet_size, 333 control_callback_one, transfer); 334 335 return EOK; 336 } 337 195 338 static int control_read_setup(device_t *dev, usb_target_t target, 196 339 void *data, size_t size, … … 217 360 NULL, 0, 218 361 callback, arg); 362 } 363 364 static int control_read(device_t *dev, usb_target_t target, 365 void *setup_packet, size_t setup_packet_size, 366 void *data, size_t data_size, 367 usbhc_iface_transfer_in_callback_t callback, void *arg) 368 { 369 control_transfer_info_t *transfer 370 = create_control_transfer_info(dev, USB_DIRECTION_IN, target, 371 data, data_size, arg); 372 transfer->in_callback = callback; 373 374 hc_add_transaction_to_device(true, target, USB_TRANSFER_CONTROL, 375 setup_packet, setup_packet_size, 376 control_callback_one, transfer); 377 378 return EOK; 219 379 } 220 380 … … 290 450 .control_write_status = control_write_status, 291 451 452 .control_write = control_write, 453 292 454 .control_read_setup = control_read_setup, 293 455 .control_read_data = control_read_data, 294 .control_read_status = control_read_status 456 .control_read_status = control_read_status, 457 458 .control_read = control_read 295 459 }; 296 460 -
uspace/drv/vhc/devices.c
rba5ab09 raec2ad4 196 196 if (virtual_hub_device.address == transaction->target.address) { 197 197 size_t tmp; 198 dprintf(1, "sending `%s' transaction to hub",198 usb_log_debug2("Sending `%s' transaction to hub.\n", 199 199 usbvirt_str_transaction_type(transaction->type)); 200 200 switch (transaction->type) { … … 222 222 break; 223 223 } 224 dprintf(4, "transaction on hub processed...");225 224 outcome = USB_OUTCOME_OK; 226 225 } -
uspace/drv/vhc/hc.c
rba5ab09 raec2ad4 92 92 usb_transaction_outcome_t outcome) 93 93 { 94 dprintf(3, "transaction " TRANSACTION_FORMAT " done, outcome: %s",94 usb_log_debug2("Transaction " TRANSACTION_FORMAT " done: %s.\n", 95 95 TRANSACTION_PRINTF(*transaction), 96 96 usb_str_transaction_outcome(outcome)); … … 108 108 static unsigned int seed = 4573; 109 109 110 printf("%s: transaction processor ready.\n", NAME);110 usb_log_info("Transaction processor ready.\n"); 111 111 112 112 while (true) { … … 125 125 list_remove(first_transaction_link); 126 126 127 128 dprintf(0, "about to process " TRANSACTION_FORMAT " [%s]", 127 usb_log_debug("Processing " TRANSACTION_FORMAT " [%s].\n", 129 128 TRANSACTION_PRINTF(*transaction), ports); 130 129 131 dprintf(3, "processing transaction " TRANSACTION_FORMAT "",132 TRANSACTION_PRINTF(*transaction));133 134 130 usb_transaction_outcome_t outcome; 135 131 outcome = virtdev_send_to_all(transaction); … … 148 144 fid_t fid = fibril_create(hc_manager_fibril, NULL); 149 145 if (fid == 0) { 150 printf(NAME ": failed to start HC manager fibril\n");146 usb_log_fatal("Failed to start HC manager fibril.\n"); 151 147 return; 152 148 } … … 172 168 transaction->callback = callback; 173 169 transaction->callback_arg = arg; 174 175 dprintf(3, "creating transaction " TRANSACTION_FORMAT, 170 171 return transaction; 172 } 173 174 static void hc_add_transaction(transaction_t *transaction) 175 { 176 usb_log_debug("Adding transaction " TRANSACTION_FORMAT ".\n", 176 177 TRANSACTION_PRINTF(*transaction)); 177 178 return transaction; 178 list_append(&transaction->link, &transaction_list); 179 179 } 180 180 … … 190 190 target, transfer_type, 191 191 buffer, len, callback, arg); 192 list_append(&transaction->link, &transaction_list);192 hc_add_transaction(transaction); 193 193 } 194 194 … … 203 203 target, transfer_type, 204 204 buffer, len, callback, arg); 205 list_append(&transaction->link, &transaction_list);205 hc_add_transaction(transaction); 206 206 } 207 207 -
uspace/drv/vhc/hcd.c
rba5ab09 raec2ad4 94 94 virtual_hub_device_init(dev); 95 95 96 printf("%s: virtual USB host controller ready.\n", NAME); 96 usb_log_info("Virtual USB host controller ready (id = %zu).\n", 97 (size_t) dev->handle); 97 98 98 99 return EOK; … … 117 118 sleep(5); 118 119 119 usb_ dprintf_enable(NAME, -1);120 usb_log_enable(USB_LOG_LEVEL_INFO, NAME); 120 121 121 122 printf(NAME ": virtual USB host controller driver.\n"); -
uspace/drv/vhc/hub.c
rba5ab09 raec2ad4 63 63 = fibril_create(hub_register_in_devman_fibril, hc_dev); 64 64 if (root_hub_registration == 0) { 65 printf(NAME ": failed to register root hub\n");65 usb_log_fatal("Failed to create hub registration fibril.\n"); 66 66 return; 67 67 } … … 79 79 device_t *hc_dev = (device_t *) arg; 80 80 81 int hc = usb_drv_hc_connect(hc_dev, hc_dev->handle, IPC_FLAG_BLOCKING);82 if (hc < 0){83 printf(NAME ": failed to register root hub\n");84 return hc;85 } 81 int hc; 82 do { 83 hc = usb_drv_hc_connect(hc_dev, hc_dev->handle, 84 IPC_FLAG_BLOCKING); 85 } while (hc < 0); 86 86 87 87 usb_drv_reserve_default_address(hc); -
uspace/drv/vhc/vhcd.h
rba5ab09 raec2ad4 45 45 #define DEVMAP_PATH_DEV NAMESPACE "/" NAME_DEV 46 46 47 #define dprintf(level, format, ...) \ 48 usb_dprintf(NAME, (level), format "\n", ##__VA_ARGS__)49 void dprintf_inval_call(int, ipc_call_t, sysarg_t);47 //#define dprintf(level, format, ...) 48 // usb_dprintf(NAME, (level), format "\n", ##__VA_ARGS__) 49 //void dprintf_inval_call(int, ipc_call_t, sysarg_t); 50 50 51 51 #endif
Note:
See TracChangeset
for help on using the changeset viewer.
