Changes in / [9e195e2c:456aea3] in mainline
- Files:
-
- 63 added
- 64 deleted
- 81 edited
Legend:
- Unmodified
- Added
- Removed
-
.bzrignore
r9e195e2c r456aea3 49 49 ./uspace/app/killall/killall 50 50 ./uspace/app/klog/klog 51 ./uspace/app/lsusb/lsusb52 51 ./uspace/app/mkfat/mkfat 53 52 ./uspace/app/netstart/netstart -
boot/Makefile.common
r9e195e2c r456aea3 128 128 $(USPACE_PATH)/app/killall/killall \ 129 129 $(USPACE_PATH)/app/mkfat/mkfat \ 130 $(USPACE_PATH)/app/lsusb/lsusb \131 130 $(USPACE_PATH)/app/sbi/sbi \ 132 131 $(USPACE_PATH)/app/redir/redir \ … … 141 140 $(USPACE_PATH)/app/stats/stats \ 142 141 $(USPACE_PATH)/app/sysinfo/sysinfo \ 142 $(USPACE_PATH)/app/tasks/tasks \ 143 143 $(USPACE_PATH)/app/top/top \ 144 144 $(USPACE_PATH)/app/usbinfo/usbinfo \ 145 $(USPACE_PATH)/app/virtusbkbd/vuk \ 145 146 $(USPACE_PATH)/app/vuhid/vuh \ 146 147 $(USPACE_PATH)/app/websrv/websrv -
uspace/Makefile
r9e195e2c r456aea3 41 41 app/killall \ 42 42 app/klog \ 43 app/lsusb \44 43 app/mkfat \ 45 44 app/redir \ … … 52 51 app/top \ 53 52 app/usbinfo \ 53 app/virtusbkbd \ 54 54 app/vuhid \ 55 55 app/netecho \ … … 177 177 ifeq ($(UARCH),amd64) 178 178 LIBS += lib/usb 179 LIBS += lib/usbhost180 LIBS += lib/usbdev181 LIBS += lib/usbhid182 179 LIBS += lib/usbvirt 183 180 endif … … 185 182 ifeq ($(UARCH),ia32) 186 183 LIBS += lib/usb 187 LIBS += lib/usbhost188 LIBS += lib/usbdev189 LIBS += lib/usbhid190 184 LIBS += lib/usbvirt 191 185 endif -
uspace/Makefile.common
r9e195e2c r456aea3 88 88 89 89 LIBUSB_PREFIX = $(LIB_PREFIX)/usb 90 LIBUSBHOST_PREFIX = $(LIB_PREFIX)/usbhost91 LIBUSBDEV_PREFIX = $(LIB_PREFIX)/usbdev92 LIBUSBHID_PREFIX = $(LIB_PREFIX)/usbhid93 90 LIBUSBVIRT_PREFIX = $(LIB_PREFIX)/usbvirt 94 91 LIBDRV_PREFIX = $(LIB_PREFIX)/drv -
uspace/app/tester/Makefile
r9e195e2c r456aea3 31 31 BINARY = tester 32 32 33 LIBS += $(LIBUSB_PREFIX)/libusb.a 34 EXTRA_CFLAGS += -I$(LIBUSB_PREFIX)/include 35 33 36 SOURCES = \ 34 37 tester.c \ 38 adt/usbaddrkeep.c \ 35 39 thread/thread1.c \ 36 40 print/print1.c \ -
uspace/app/tester/tester.c
r9e195e2c r456aea3 64 64 #include "mm/mapping1.def" 65 65 #include "hw/serial/serial1.def" 66 #include "adt/usbaddrkeep.def" 66 67 #include "hw/misc/virtchar1.def" 67 68 #include "devs/devman1.def" -
uspace/app/tester/tester.h
r9e195e2c r456aea3 80 80 extern const char *test_mapping1(void); 81 81 extern const char *test_serial1(void); 82 extern const char *test_usbaddrkeep(void); 82 83 extern const char *test_virtchar1(void); 83 84 extern const char *test_devman1(void); -
uspace/app/usbinfo/Makefile
r9e195e2c r456aea3 30 30 BINARY = usbinfo 31 31 32 LIBS = \ 33 $(LIBUSBDEV_PREFIX)/libusbdev.a \ 34 $(LIBUSB_PREFIX)/libusb.a \ 35 $(LIBDRV_PREFIX)/libdrv.a 36 EXTRA_CFLAGS = \ 37 -I$(LIBUSB_PREFIX)/include \ 38 -I$(LIBUSBDEV_PREFIX)/include \ 39 -I$(LIBDRV_PREFIX)/include 32 LIBS = $(LIBUSB_PREFIX)/libusb.a $(LIBDRV_PREFIX)/libdrv.a 33 EXTRA_CFLAGS = -I$(LIBUSB_PREFIX)/include -I$(LIBDRV_PREFIX)/include 40 34 41 35 SOURCES = \ -
uspace/app/usbinfo/dev.c
r9e195e2c r456aea3 40 40 #include "usbinfo.h" 41 41 42 usbinfo_device_t *prepare_device( const char *name,43 devman_handle_t hc_handle,usb_address_t dev_addr)42 usbinfo_device_t *prepare_device(devman_handle_t hc_handle, 43 usb_address_t dev_addr) 44 44 { 45 45 usbinfo_device_t *dev = malloc(sizeof(usbinfo_device_t)); … … 55 55 if (rc != EOK) { 56 56 fprintf(stderr, 57 NAME ": failed to create connection to device %s: %s.\n",58 name,str_error(rc));57 NAME ": failed to create connection to the device: %s.\n", 58 str_error(rc)); 59 59 goto leave; 60 60 } … … 64 64 if (rc != EOK) { 65 65 fprintf(stderr, 66 NAME ": failed to create default control pipe to %s: %s.\n",67 name,str_error(rc));66 NAME ": failed to create default control pipe: %s.\n", 67 str_error(rc)); 68 68 goto leave; 69 69 } … … 71 71 rc = usb_pipe_probe_default_control(&dev->ctrl_pipe); 72 72 if (rc != EOK) { 73 if (rc == ENOENT) { 74 fprintf(stderr, NAME ": " \ 75 "device %s not present or malfunctioning.\n", 76 name); 77 } else { 78 fprintf(stderr, NAME ": " \ 79 "probing default control pipe of %s failed: %s.\n", 80 name, str_error(rc)); 81 } 73 fprintf(stderr, 74 NAME ": probing default control pipe failed: %s.\n", 75 str_error(rc)); 82 76 goto leave; 83 77 } … … 90 84 if (rc != EOK) { 91 85 fprintf(stderr, 92 NAME ": failed to retrieve device descriptor of %s: %s.\n",93 name,str_error(rc));86 NAME ": failed to retrieve device descriptor: %s.\n", 87 str_error(rc)); 94 88 goto leave; 95 89 } … … 99 93 &dev->full_configuration_descriptor_size); 100 94 if (rc != EOK) { 101 fprintf(stderr, NAME ": " \102 "failed to retrieve configuration descriptor of %s: %s.\n",103 name,str_error(rc));95 fprintf(stderr, 96 NAME ": failed to retrieve configuration descriptor: %s.\n", 97 str_error(rc)); 104 98 goto leave; 105 99 } -
uspace/app/usbinfo/info.c
r9e195e2c r456aea3 41 41 #include <usb/request.h> 42 42 #include <usb/classes/classes.h> 43 #include <usb/classes/hid.h> 43 44 #include <usb/classes/hub.h> 44 45 #include "usbinfo.h" -
uspace/app/usbinfo/main.c
r9e195e2c r456aea3 45 45 #include <usb/usbdevice.h> 46 46 #include <usb/pipes.h> 47 #include <usb/host.h>48 #include <usb/driver.h>49 47 #include "usbinfo.h" 50 51 static bool try_parse_class_and_address(const char *path,52 devman_handle_t *out_hc_handle, usb_address_t *out_device_address)53 {54 size_t class_index;55 size_t address;56 int rc;57 char *ptr;58 59 rc = str_size_t(path, &ptr, 10, false, &class_index);60 if (rc != EOK) {61 return false;62 }63 if ((*ptr == ':') || (*ptr == '.')) {64 ptr++;65 } else {66 return false;67 }68 rc = str_size_t(ptr, NULL, 10, true, &address);69 if (rc != EOK) {70 return false;71 }72 rc = usb_ddf_get_hc_handle_by_class(class_index, out_hc_handle);73 if (rc != EOK) {74 return false;75 }76 if (out_device_address != NULL) {77 *out_device_address = (usb_address_t) address;78 }79 return true;80 }81 48 82 49 static bool resolve_hc_handle_and_dev_addr(const char *devpath, … … 93 60 if (str_cmp(devpath, "virt") == 0) { 94 61 devpath = "/virt/usbhc/usb00_a1/usb00_a2"; 95 }96 97 if (try_parse_class_and_address(devpath,98 out_hc_handle, out_device_address)) {99 return true;100 62 } 101 63 … … 309 271 } 310 272 311 usbinfo_device_t *dev = prepare_device(devpath, 312 hc_handle, dev_addr); 273 usbinfo_device_t *dev = prepare_device(hc_handle, dev_addr); 313 274 if (dev == NULL) { 314 275 continue; -
uspace/app/usbinfo/usbinfo.h
r9e195e2c r456aea3 71 71 } 72 72 73 usbinfo_device_t *prepare_device( const char *,devman_handle_t, usb_address_t);73 usbinfo_device_t *prepare_device(devman_handle_t, usb_address_t); 74 74 void destroy_device(usbinfo_device_t *); 75 75 -
uspace/app/vuhid/Makefile
r9e195e2c r456aea3 34 34 LIBS = \ 35 35 $(LIBUSBVIRT_PREFIX)/libusbvirt.a \ 36 $(LIBUSBHID_PREFIX)/libusbhid.a \37 $(LIBUSBDEV_PREFIX)/libusbdev.a \38 36 $(LIBUSB_PREFIX)/libusb.a 39 37 EXTRA_CFLAGS = \ 40 38 -I$(LIBUSB_PREFIX)/include \ 41 -I$(LIBUSBDEV_PREFIX)/include \42 -I$(LIBUSBHID_PREFIX)/include \43 39 -I$(LIBUSBVIRT_PREFIX)/include \ 44 40 -I$(LIBDRV_PREFIX)/include -
uspace/app/vuhid/device.c
r9e195e2c r456aea3 77 77 { 78 78 vuhid_interface_t *iface = arg; 79 vuhid_data_t *hid_data = iface->vuhid_data;80 79 81 80 if (iface->live != NULL) { 82 81 iface->live(iface); 83 82 } 84 85 fibril_mutex_lock(&hid_data->iface_count_mutex);86 hid_data->iface_died_count++;87 fibril_condvar_broadcast(&hid_data->iface_count_cv);88 fibril_mutex_unlock(&hid_data->iface_count_mutex);89 83 90 84 return EOK; … … 116 110 if ((iface->in_data_size == 0) && (iface->out_data_size == 0)) { 117 111 return EEMPTY; 118 }119 120 // FIXME - we shall set vuhid_data to NULL in the main() rather121 // than to depend on individual interfaces122 /* Already used interface. */123 if (iface->vuhid_data != NULL) {124 return EEXISTS;125 112 } 126 113 … … 265 252 266 253 /* Launch the "life" fibril. */ 267 iface->vuhid_data = hid_data;268 254 fid_t life_fibril = fibril_create(interface_life_fibril, iface); 269 255 if (life_fibril == 0) { … … 324 310 += total_descr_size; 325 311 326 hid_data->iface_count++;327 312 fibril_add_ready(life_fibril); 328 313 … … 346 331 } 347 332 348 void wait_for_interfaces_death(usbvirt_device_t *dev)349 {350 vuhid_data_t *hid_data = dev->device_data;351 352 fibril_mutex_lock(&hid_data->iface_count_mutex);353 while (hid_data->iface_died_count < hid_data->iface_count) {354 fibril_condvar_wait(&hid_data->iface_count_cv,355 &hid_data->iface_count_mutex);356 }357 fibril_mutex_unlock(&hid_data->iface_count_mutex);358 }359 333 360 334 /** @} -
uspace/app/vuhid/hids/bootkbd.c
r9e195e2c r456aea3 39 39 #include <usb/classes/hidut.h> 40 40 41 #include "../ report.h"41 #include "../../virtusbkbd/report.h" 42 42 43 43 uint8_t report_descriptor[] = { … … 169 169 .on_data_out = on_data_out, 170 170 171 .live = live, 172 173 .vuhid_data = NULL 171 .live = live 174 172 }; 175 173 -
uspace/app/vuhid/main.c
r9e195e2c r456aea3 132 132 .in_endpoint_first_free = 1, 133 133 .out_endpoints_mapping = { NULL }, 134 .out_endpoint_first_free = 1, 135 136 .iface_count = 0, 137 .iface_died_count = 0 138 // mutex and CV must be initialized elsewhere 134 .out_endpoint_first_free = 1 139 135 }; 140 141 136 142 137 /** Keyboard device. … … 156 151 157 152 usb_log_enable(USB_LOG_LEVEL_DEBUG2, "vusbhid"); 158 159 fibril_mutex_initialize(&vuhid_data.iface_count_mutex);160 fibril_condvar_initialize(&vuhid_data.iface_count_cv);161 153 162 154 /* Determine which interfaces to initialize. */ … … 190 182 printf("Connected to VHCD...\n"); 191 183 192 wait_for_interfaces_death(&hid_dev); 184 while (true) { 185 async_usleep(10 * 1000 * 1000); 186 } 193 187 194 188 printf("Terminating...\n"); 195 189 196 usbvirt_device_unplug(&hid_dev);197 198 190 return 0; 199 191 } -
uspace/app/vuhid/virthid.h
r9e195e2c r456aea3 38 38 #include <usb/usb.h> 39 39 #include <usbvirt/device.h> 40 #include <fibril_synch.h>41 40 42 41 #define VUHID_ENDPOINT_MAX USB11_ENDPOINT_MAX … … 44 43 45 44 typedef struct vuhid_interface vuhid_interface_t; 46 47 typedef struct {48 vuhid_interface_t *in_endpoints_mapping[VUHID_ENDPOINT_MAX];49 size_t in_endpoint_first_free;50 vuhid_interface_t *out_endpoints_mapping[VUHID_ENDPOINT_MAX];51 size_t out_endpoint_first_free;52 vuhid_interface_t *interface_mapping[VUHID_INTERFACE_MAX];53 54 fibril_mutex_t iface_count_mutex;55 fibril_condvar_t iface_count_cv;56 size_t iface_count;57 size_t iface_died_count;58 } vuhid_data_t;59 45 60 46 struct vuhid_interface { … … 77 63 78 64 void *interface_data; 65 }; 79 66 80 vuhid_data_t *vuhid_data; 81 }; 67 typedef struct { 68 vuhid_interface_t *in_endpoints_mapping[VUHID_ENDPOINT_MAX]; 69 size_t in_endpoint_first_free; 70 vuhid_interface_t *out_endpoints_mapping[VUHID_ENDPOINT_MAX]; 71 size_t out_endpoint_first_free; 72 vuhid_interface_t *interface_mapping[VUHID_INTERFACE_MAX]; 73 } vuhid_data_t; 82 74 83 75 typedef struct { … … 92 84 93 85 int add_interface_by_id(vuhid_interface_t **, const char *, usbvirt_device_t *); 94 void wait_for_interfaces_death(usbvirt_device_t *);95 86 96 87 #endif -
uspace/doc/doxygroups.h
r9e195e2c r456aea3 220 220 221 221 /** 222 * @defgroup lsusb HelenOS version of lsusb command223 * @ingroup usb224 * @brief Application for listing USB host controllers.225 * @details226 * List all found host controllers.227 */228 229 /**230 222 * @defgroup drvusbmid USB multi interface device driver 231 223 * @ingroup usb -
uspace/drv/ehci-hcd/Makefile
r9e195e2c r456aea3 28 28 29 29 USPACE_PREFIX = ../.. 30 31 LIBS = \ 32 $(LIBUSBHOST_PREFIX)/libusbhost.a \ 33 $(LIBUSB_PREFIX)/libusb.a \ 34 $(LIBDRV_PREFIX)/libdrv.a 35 EXTRA_CFLAGS += \ 36 -I$(LIBUSB_PREFIX)/include \ 37 -I$(LIBUSBHOST_PREFIX)/include \ 38 -I$(LIBDRV_PREFIX)/include 39 30 LIBS = $(LIBDRV_PREFIX)/libdrv.a $(LIBUSB_PREFIX)/libusb.a 31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -I$(LIBUSB_PREFIX)/include -I. 40 32 BINARY = ehci-hcd 41 33 -
uspace/drv/ehci-hcd/hc_iface.c
r9e195e2c r456aea3 106 106 } 107 107 108 /** Find device handle by USB address.109 *110 * @param[in] fun DDF function that was called.111 * @param[in] address Address in question.112 * @param[out] handle Where to store device handle if found.113 * @return Error code.114 */115 static int find_by_address(ddf_fun_t *fun, usb_address_t address,116 devman_handle_t *handle)117 {118 UNSUPPORTED("find_by_address");119 120 return ENOTSUP;121 }122 123 108 /** Release previously requested address. 124 109 * … … 336 321 .request_address = request_address, 337 322 .bind_address = bind_address, 338 .find_by_address = find_by_address,339 323 .release_address = release_address, 340 324 -
uspace/drv/ehci-hcd/main.c
r9e195e2c r456aea3 97 97 } 98 98 hc_fun->ops = &hc_ops; 99 ret = ddf_fun_bind(hc_fun); 99 100 100 ret = ddf_fun_bind(hc_fun);101 101 CHECK_RET_RETURN(ret, 102 102 "Failed to bind EHCI function: %s.\n", 103 str_error(ret));104 ret = ddf_fun_add_to_class(hc_fun, USB_HC_DDF_CLASS_NAME);105 CHECK_RET_RETURN(ret,106 "Failed to add EHCI to HC class: %s.\n",107 103 str_error(ret)); 108 104 -
uspace/drv/ehci-hcd/pci.c
r9e195e2c r456aea3 54 54 55 55 #define CMD_OFFSET 0x0 56 #define STS_OFFSET 0x4 57 #define CFG_OFFSET 0x40 56 #define CONFIGFLAG_OFFSET 0x40 58 57 59 58 #define USBCMD_RUN 1 … … 265 264 * It would prevent pre-OS code from interfering. */ 266 265 ret = async_req_3_0(parent_phone, DEV_IFACE_ID(PCI_DEV_IFACE), 267 IPC_M_CONFIG_SPACE_WRITE_32, eecp + USBLEGCTLSTS_OFFSET, 268 0xe0000000); 266 IPC_M_CONFIG_SPACE_WRITE_32, eecp + USBLEGCTLSTS_OFFSET, 0); 269 267 CHECK_RET_HANGUP_RETURN(ret, "Failed(%d) zero USBLEGCTLSTS.\n", ret); 268 usb_log_debug("Zeroed USBLEGCTLSTS register.\n"); 270 269 271 270 /* Read again Legacy Support and Control register */ … … 292 291 volatile uint32_t *usbcmd = 293 292 (uint32_t*)((uint8_t*)registers + operation_offset + CMD_OFFSET); 294 volatile uint32_t *usbsts =295 (uint32_t*)((uint8_t*)registers + operation_offset + STS_OFFSET);296 293 volatile uint32_t *usbconfigured = 297 (uint32_t*)((uint8_t*)registers + operation_offset + CFG_OFFSET); 294 (uint32_t*)((uint8_t*)registers + operation_offset 295 + CONFIGFLAG_OFFSET); 298 296 usb_log_debug("USBCMD value: %x.\n", *usbcmd); 299 297 if (*usbcmd & USBCMD_RUN) { 300 298 *usbcmd = 0; 301 while (!(*usbsts & (1 << 12))); /*wait until hc is halted */302 299 *usbconfigured = 0; 303 300 usb_log_info("EHCI turned off.\n"); … … 305 302 usb_log_info("EHCI was not running.\n"); 306 303 } 307 usb_log_debug("Registers: %x(0x00080000):%x(0x00001000):%x(0x0).\n",308 *usbcmd, *usbsts, *usbconfigured);309 304 310 305 async_hangup(parent_phone); -
uspace/drv/ohci/Makefile
r9e195e2c r456aea3 28 28 29 29 USPACE_PREFIX = ../.. 30 31 LIBS = \ 32 $(LIBUSBHOST_PREFIX)/libusbhost.a \ 33 $(LIBUSBDEV_PREFIX)/libusbdev.a \ 34 $(LIBUSB_PREFIX)/libusb.a \ 35 $(LIBDRV_PREFIX)/libdrv.a 36 EXTRA_CFLAGS += \ 37 -I$(LIBUSB_PREFIX)/include \ 38 -I$(LIBUSBDEV_PREFIX)/include \ 39 -I$(LIBUSBHOST_PREFIX)/include \ 40 -I$(LIBDRV_PREFIX)/include 41 30 LIBS = $(LIBDRV_PREFIX)/libdrv.a $(LIBUSB_PREFIX)/libusb.a 31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -I$(LIBUSB_PREFIX)/include -I. 42 32 BINARY = ohci 43 33 -
uspace/drv/ohci/hc.c
r9e195e2c r456aea3 40 40 #include <usb/usb.h> 41 41 #include <usb/ddfiface.h> 42 #include <usb/usbdevice.h> 42 43 43 44 #include "hc.h" … … 48 49 static int interrupt_emulator(hc_t *instance); 49 50 static void hc_gain_control(hc_t *instance); 51 static void hc_init_hw(hc_t *instance); 50 52 static int hc_init_transfer_lists(hc_t *instance); 51 53 static int hc_init_memory(hc_t *instance); … … 90 92 usb_log_error("Failed add root hub match-id.\n"); 91 93 } 92 ret = ddf_fun_bind(hub_fun);93 94 return ret; 94 95 } 95 96 /*----------------------------------------------------------------------------*/ 96 int hc_init(hc_t *instance, uintptr_t regs, size_t reg_size, bool interrupts) 97 int hc_init(hc_t *instance, ddf_fun_t *fun, ddf_dev_t *dev, 98 uintptr_t regs, size_t reg_size, bool interrupts) 97 99 { 98 100 assert(instance); … … 109 111 ret, str_error(ret)); 110 112 111 list_initialize(&instance->pending_batches);112 113 usb_device_keeper_init(&instance->manager); 113 114 ret = usb_endpoint_manager_init(&instance->ep_manager, … … 116 117 str_error(ret)); 117 118 119 hc_gain_control(instance); 118 120 ret = hc_init_memory(instance); 119 121 CHECK_RET_RETURN(ret, "Failed to create OHCI memory structures: %s.\n", 120 122 str_error(ret)); 121 #undef CHECK_RET_RETURN 122 123 124 // hc_init_hw(instance); 125 hc_gain_control(instance); 123 hc_init_hw(instance); 126 124 fibril_mutex_initialize(&instance->guard); 127 125 … … 134 132 } 135 133 134 list_initialize(&instance->pending_batches); 135 #undef CHECK_RET_RETURN 136 136 return EOK; 137 137 } … … 287 287 { 288 288 assert(instance); 289 usb_log_debug("OHCI (%p) interrupt: %x.\n", instance, status);289 usb_log_debug("OHCI interrupt: %x.\n", status); 290 290 if ((status & ~I_SF) == 0) /* ignore sof status */ 291 291 return; … … 339 339 (uint32_t*)((char*)instance->registers + 0x100); 340 340 usb_log_debug("OHCI legacy register %p: %x.\n", 341 ohci_emulation_reg, *ohci_emulation_reg); 342 /* Do not change A20 state */ 343 *ohci_emulation_reg &= 0x100; 344 usb_log_debug("OHCI legacy register %p: %x.\n", 345 ohci_emulation_reg, *ohci_emulation_reg); 341 ohci_emulation_reg, *ohci_emulation_reg); 342 *ohci_emulation_reg &= ~0x1; 346 343 347 344 /* Interrupt routing enabled => smm driver is active */ … … 353 350 } 354 351 usb_log_info("SMM driver: Ownership taken.\n"); 355 instance->registers->control &= (C_HCFS_RESET << C_HCFS_SHIFT);356 async_usleep(50000);357 352 return; 358 353 } … … 380 375 } 381 376 /*----------------------------------------------------------------------------*/ 382 void hc_ start_hw(hc_t *instance)377 void hc_init_hw(hc_t *instance) 383 378 { 384 379 /* OHCI guide page 42 */ … … 479 474 { 480 475 assert(instance); 481 482 bzero(&instance->rh, sizeof(instance->rh));483 476 /* Init queues */ 484 477 hc_init_transfer_lists(instance); -
uspace/drv/ohci/hc.h
r9e195e2c r456aea3 77 77 int hc_register_hub(hc_t *instance, ddf_fun_t *hub_fun); 78 78 79 int hc_init(hc_t *instance, uintptr_t regs, size_t reg_size, bool interrupts); 80 81 void hc_start_hw(hc_t *instance); 79 int hc_init(hc_t *instance, ddf_fun_t *fun, ddf_dev_t *dev, 80 uintptr_t regs, size_t reg_size, bool interrupts); 82 81 83 82 /** Safely dispose host controller internal structures -
uspace/drv/ohci/hw_struct/endpoint_descriptor.h
r9e195e2c r456aea3 40 40 #include <usb/host/endpoint.h> 41 41 42 #include " ../utils/malloc32.h"42 #include "utils/malloc32.h" 43 43 #include "transfer_descriptor.h" 44 44 -
uspace/drv/ohci/hw_struct/transfer_descriptor.c
r9e195e2c r456aea3 33 33 */ 34 34 #include <usb/usb.h> 35 #include "utils/malloc32.h" 36 35 37 #include "transfer_descriptor.h" 36 38 -
uspace/drv/ohci/hw_struct/transfer_descriptor.h
r9e195e2c r456aea3 37 37 #include <bool.h> 38 38 #include <stdint.h> 39 #include " ../utils/malloc32.h"39 #include "utils/malloc32.h" 40 40 41 41 #include "completion_codes.h" -
uspace/drv/ohci/iface.c
r9e195e2c r456aea3 122 122 return EOK; 123 123 } 124 125 126 /** Find device handle by address interface function.127 *128 * @param[in] fun DDF function that was called.129 * @param[in] address Address in question.130 * @param[out] handle Where to store device handle if found.131 * @return Error code.132 */133 static int find_by_address(ddf_fun_t *fun, usb_address_t address,134 devman_handle_t *handle)135 {136 assert(fun);137 hc_t *hc = fun_to_hc(fun);138 assert(hc);139 bool found =140 usb_device_keeper_find_by_address(&hc->manager, address, handle);141 return found ? EOK : ENOENT;142 }143 144 124 /*----------------------------------------------------------------------------*/ 145 125 /** Release address interface function … … 422 402 .request_address = request_address, 423 403 .bind_address = bind_address, 424 .find_by_address = find_by_address,425 404 .release_address = release_address, 426 405 -
uspace/drv/ohci/main.c
r9e195e2c r456aea3 43 43 #define NAME "ohci" 44 44 45 /** Initializes a new ddf driver instance of OHCI hcd. 46 * 47 * @param[in] device DDF instance of the device to initialize. 48 * @return Error code. 49 */ 50 static int ohci_add_device(ddf_dev_t *device) 51 { 52 usb_log_debug("ohci_add_device() called\n"); 53 assert(device); 54 55 int ret = device_setup_ohci(device); 56 if (ret != EOK) { 57 usb_log_error("Failed to initialize OHCI driver: %s.\n", 58 str_error(ret)); 59 return ret; 60 } 61 usb_log_info("Controlling new OHCI device '%s'.\n", device->name); 62 63 return EOK; 64 } 45 static int ohci_add_device(ddf_dev_t *device); 65 46 /*----------------------------------------------------------------------------*/ 66 47 static driver_ops_t ohci_driver_ops = { … … 72 53 .driver_ops = &ohci_driver_ops 73 54 }; 55 /*----------------------------------------------------------------------------*/ 56 /** Initializes a new ddf driver instance of OHCI hcd. 57 * 58 * @param[in] device DDF instance of the device to initialize. 59 * @return Error code. 60 */ 61 int ohci_add_device(ddf_dev_t *device) 62 { 63 usb_log_debug("ohci_add_device() called\n"); 64 assert(device); 65 ohci_t *ohci = malloc(sizeof(ohci_t)); 66 if (ohci == NULL) { 67 usb_log_error("Failed to allocate OHCI driver.\n"); 68 return ENOMEM; 69 } 70 71 int ret = ohci_init(ohci, device); 72 if (ret != EOK) { 73 usb_log_error("Failed to initialize OHCI driver: %s.\n", 74 str_error(ret)); 75 return ret; 76 } 77 device->driver_data = ohci; 78 79 usb_log_info("Controlling new OHCI device `%s'.\n", device->name); 80 81 return EOK; 82 } 74 83 /*----------------------------------------------------------------------------*/ 75 84 /** Initializes global driver structures (NONE). … … 84 93 { 85 94 usb_log_enable(USB_LOG_LEVEL_DEFAULT, NAME); 95 sleep(5); 86 96 return ddf_driver_main(&ohci_driver); 87 97 } -
uspace/drv/ohci/ohci.c
r9e195e2c r456aea3 44 44 #include "iface.h" 45 45 #include "pci.h" 46 #include "hc.h"47 #include "root_hub.h"48 49 typedef struct ohci {50 ddf_fun_t *hc_fun;51 ddf_fun_t *rh_fun;52 53 hc_t hc;54 rh_t rh;55 } ohci_t;56 57 static inline ohci_t * dev_to_ohci(ddf_dev_t *dev)58 {59 assert(dev);60 assert(dev->driver_data);61 return dev->driver_data;62 }63 46 64 47 /** IRQ handling callback, identifies device … … 70 53 static void irq_handler(ddf_dev_t *dev, ipc_callid_t iid, ipc_call_t *call) 71 54 { 72 hc_t *hc = &dev_to_ohci(dev)->hc; 55 assert(dev); 56 hc_t *hc = &((ohci_t*)dev->driver_data)->hc; 57 uint16_t status = IPC_GET_ARG1(*call); 73 58 assert(hc); 74 const uint16_t status = IPC_GET_ARG1(*call);75 59 hc_interrupt(hc, status); 76 60 } … … 86 70 { 87 71 assert(fun); 88 usb_device_keeper_t *manager = & dev_to_ohci(fun->dev)->hc.manager;72 usb_device_keeper_t *manager = &((ohci_t*)fun->dev->driver_data)->hc.manager; 89 73 90 74 usb_address_t addr = usb_device_keeper_find(manager, handle); … … 109 93 ddf_fun_t *fun, devman_handle_t *handle) 110 94 { 111 assert(fun); 112 ddf_fun_t *hc_fun = dev_to_ohci(fun->dev)->hc_fun; 113 assert(hc_fun); 114 115 if (handle != NULL) 116 *handle = hc_fun->handle; 95 assert(handle); 96 ddf_fun_t *hc_fun = ((ohci_t*)fun->dev->driver_data)->hc_fun; 97 assert(hc_fun != NULL); 98 99 *handle = hc_fun->handle; 117 100 return EOK; 118 101 } 119 102 /*----------------------------------------------------------------------------*/ 120 /** Root hub USB interface*/103 /** This iface is generic for both RH and HC. */ 121 104 static usb_iface_t usb_iface = { 122 105 .get_hc_handle = usb_iface_get_hc_handle, … … 124 107 }; 125 108 /*----------------------------------------------------------------------------*/ 126 /** Standard USB HC options (HC interface) */127 109 static ddf_dev_ops_t hc_ops = { 128 110 .interfaces[USBHC_DEV_IFACE] = &hc_iface, /* see iface.h/c */ 129 111 }; 130 112 /*----------------------------------------------------------------------------*/ 131 /** Standard USB RH options (RH interface) */132 113 static ddf_dev_ops_t rh_ops = { 133 114 .interfaces[USB_DEV_IFACE] = &usb_iface, … … 136 117 /** Initialize hc and rh ddf structures and their respective drivers. 137 118 * 119 * @param[in] instance OHCI structure to use. 138 120 * @param[in] device DDF instance of the device to use. 139 * @param[in] instance OHCI structure to use.140 121 * 141 122 * This function does all the preparatory work for hc and rh drivers: … … 145 126 * - registers interrupt handler 146 127 */ 147 int device_setup_ohci(ddf_dev_t *device) 148 { 149 ohci_t *instance = malloc(sizeof(ohci_t)); 150 if (instance == NULL) { 151 usb_log_error("Failed to allocate OHCI driver.\n"); 152 return ENOMEM; 153 } 154 155 #define CHECK_RET_DEST_FREE_RETURN(ret, message...) \ 128 int ohci_init(ohci_t *instance, ddf_dev_t *device) 129 { 130 assert(instance); 131 instance->hc_fun = NULL; 132 instance->rh_fun = NULL; 133 #define CHECK_RET_DEST_FUN_RETURN(ret, message...) \ 156 134 if (ret != EOK) { \ 157 if (instance->hc_fun) { \ 158 instance->hc_fun->ops = NULL; \ 159 instance->hc_fun->driver_data = NULL; \ 135 usb_log_error(message); \ 136 if (instance->hc_fun) \ 160 137 ddf_fun_destroy(instance->hc_fun); \ 161 } \ 162 if (instance->rh_fun) { \ 163 instance->rh_fun->ops = NULL; \ 164 instance->rh_fun->driver_data = NULL; \ 138 if (instance->rh_fun) \ 165 139 ddf_fun_destroy(instance->rh_fun); \ 166 } \167 free(instance); \168 usb_log_error(message); \169 140 return ret; \ 170 } else (void)0 171 172 instance->rh_fun = NULL; 173 instance->hc_fun = ddf_fun_create(device, fun_exposed, "ohci-hc"); 174 int ret = instance->hc_fun ? EOK : ENOMEM; 175 CHECK_RET_DEST_FREE_RETURN(ret, "Failed to create OHCI HC function.\n"); 176 instance->hc_fun->ops = &hc_ops; 177 instance->hc_fun->driver_data = &instance->hc; 178 179 instance->rh_fun = ddf_fun_create(device, fun_inner, "ohci-rh"); 180 ret = instance->rh_fun ? EOK : ENOMEM; 181 CHECK_RET_DEST_FREE_RETURN(ret, "Failed to create OHCI RH function.\n"); 182 instance->rh_fun->ops = &rh_ops; 183 184 uintptr_t reg_base = 0; 185 size_t reg_size = 0; 141 } 142 143 uintptr_t mem_reg_base = 0; 144 size_t mem_reg_size = 0; 186 145 int irq = 0; 187 146 188 ret = pci_get_my_registers(device, ®_base, ®_size, &irq); 189 CHECK_RET_DEST_FREE_RETURN(ret, 147 int ret = 148 pci_get_my_registers(device, &mem_reg_base, &mem_reg_size, &irq); 149 CHECK_RET_DEST_FUN_RETURN(ret, 190 150 "Failed to get memory addresses for %" PRIun ": %s.\n", 191 151 device->handle, str_error(ret)); 192 152 usb_log_debug("Memory mapped regs at %p (size %zu), IRQ %d.\n", 193 (void *) reg_base, reg_size, irq); 153 (void *) mem_reg_base, mem_reg_size, irq); 154 155 ret = pci_disable_legacy(device); 156 CHECK_RET_DEST_FUN_RETURN(ret, 157 "Failed(%d) to disable legacy USB: %s.\n", ret, str_error(ret)); 194 158 195 159 bool interrupts = false; 196 160 #ifdef CONFIG_USBHC_NO_INTERRUPTS 197 usb_log_warning("Interrupts disabled in OS config, " 161 usb_log_warning("Interrupts disabled in OS config, " \ 198 162 "falling back to polling.\n"); 199 163 #else … … 202 166 usb_log_warning("Failed to enable interrupts: %s.\n", 203 167 str_error(ret)); 204 usb_log_info("HW interrupts not available, " 168 usb_log_info("HW interrupts not available, " \ 205 169 "falling back to polling.\n"); 206 170 } else { … … 210 174 #endif 211 175 212 ret = hc_init(&instance->hc, reg_base, reg_size, interrupts); 213 CHECK_RET_DEST_FREE_RETURN(ret, "Failed(%d) to init ohci-hcd.\n", ret); 176 instance->hc_fun = ddf_fun_create(device, fun_exposed, "ohci-hc"); 177 ret = (instance->hc_fun == NULL) ? ENOMEM : EOK; 178 CHECK_RET_DEST_FUN_RETURN(ret, 179 "Failed(%d) to create HC function.\n", ret); 180 181 ret = hc_init(&instance->hc, instance->hc_fun, device, 182 mem_reg_base, mem_reg_size, interrupts); 183 CHECK_RET_DEST_FUN_RETURN(ret, "Failed(%d) to init ohci-hcd.\n", ret); 184 instance->hc_fun->ops = &hc_ops; 185 instance->hc_fun->driver_data = &instance->hc; 186 ret = ddf_fun_bind(instance->hc_fun); 187 CHECK_RET_DEST_FUN_RETURN(ret, 188 "Failed(%d) to bind OHCI device function: %s.\n", 189 ret, str_error(ret)); 190 #undef CHECK_RET_HC_RETURN 214 191 215 192 #define CHECK_RET_FINI_RETURN(ret, message...) \ 216 193 if (ret != EOK) { \ 194 usb_log_error(message); \ 195 if (instance->hc_fun) \ 196 ddf_fun_destroy(instance->hc_fun); \ 197 if (instance->rh_fun) \ 198 ddf_fun_destroy(instance->rh_fun); \ 217 199 hc_fini(&instance->hc); \ 218 CHECK_RET_DEST_FREE_RETURN(ret, message); \219 } else (void)0200 return ret; \ 201 } 220 202 221 203 /* It does no harm if we register this on polling */ … … 225 207 "Failed(%d) to register interrupt handler.\n", ret); 226 208 227 ret = ddf_fun_bind(instance->hc_fun); 209 instance->rh_fun = ddf_fun_create(device, fun_inner, "ohci-rh"); 210 ret = (instance->rh_fun == NULL) ? ENOMEM : EOK; 228 211 CHECK_RET_FINI_RETURN(ret, 229 "Failed(%d) to bind OHCI device function: %s.\n", 230 ret, str_error(ret)); 231 232 ret = ddf_fun_add_to_class(instance->hc_fun, USB_HC_DDF_CLASS_NAME); 212 "Failed(%d) to create root hub function.\n", ret); 213 214 hc_register_hub(&instance->hc, instance->rh_fun); 215 216 instance->rh_fun->ops = &rh_ops; 217 instance->rh_fun->driver_data = NULL; 218 ret = ddf_fun_bind(instance->rh_fun); 233 219 CHECK_RET_FINI_RETURN(ret, 234 "Failed to add OHCI to HC class: %s.\n", str_error(ret)); 235 236 device->driver_data = instance; 237 238 hc_start_hw(&instance->hc); 239 hc_register_hub(&instance->hc, instance->rh_fun); 220 "Failed(%d) to register OHCI root hub.\n", ret); 221 240 222 return EOK; 241 242 #undef CHECK_RET_DEST_FUN_RETURN243 223 #undef CHECK_RET_FINI_RETURN 244 224 } -
uspace/drv/ohci/ohci.h
r9e195e2c r456aea3 38 38 #include <ddf/driver.h> 39 39 40 int device_setup_ohci(ddf_dev_t *device); 40 #include "hc.h" 41 #include "root_hub.h" 42 43 typedef struct ohci { 44 ddf_fun_t *hc_fun; 45 ddf_fun_t *rh_fun; 46 47 hc_t hc; 48 rh_t rh; 49 } ohci_t; 50 51 int ohci_init(ohci_t *instance, ddf_dev_t *device); 41 52 42 53 #endif -
uspace/drv/ohci/pci.c
r9e195e2c r456aea3 58 58 uintptr_t *mem_reg_address, size_t *mem_reg_size, int *irq_no) 59 59 { 60 assert(dev); 61 assert(mem_reg_address); 62 assert(mem_reg_size); 63 assert(irq_no); 60 assert(dev != NULL); 64 61 65 62 int parent_phone = devman_parent_device_connect(dev->handle, … … 139 136 return enabled ? EOK : EIO; 140 137 } 138 /*----------------------------------------------------------------------------*/ 139 /** Implements BIOS handoff routine as decribed in OHCI spec 140 * 141 * @param[in] device Device asking for interrupts 142 * @return Error code. 143 */ 144 int pci_disable_legacy(ddf_dev_t *device) 145 { 146 /* TODO: implement */ 147 return EOK; 148 } 149 /*----------------------------------------------------------------------------*/ 141 150 /** 142 151 * @} -
uspace/drv/ohci/root_hub.c
r9e195e2c r456aea3 45 45 46 46 /** 47 * 47 * standart device descriptor for ohci root hub 48 48 */ 49 49 static const usb_standard_device_descriptor_t ohci_rh_device_descriptor = { … … 69 69 */ 70 70 static const usb_standard_configuration_descriptor_t ohci_rh_conf_descriptor = { 71 /// \TODO some values are default or guessed 71 72 .attributes = 1 << 7, 72 73 .configuration_number = 1, … … 86 87 .endpoint_count = 1, 87 88 .interface_class = USB_CLASS_HUB, 89 /// \TODO is this correct? 88 90 .interface_number = 1, 89 91 .interface_protocol = 0, … … 105 107 }; 106 108 107 /**108 * bitmask of hub features that are valid to be cleared109 */110 109 static const uint32_t hub_clear_feature_valid_mask = 111 110 (1 << USB_HUB_FEATURE_C_HUB_LOCAL_POWER) | 112 111 (1 << USB_HUB_FEATURE_C_HUB_OVER_CURRENT); 113 112 114 /**115 * bitmask of hub features that are cleared by writing 1 (and not 0)116 */117 113 static const uint32_t hub_clear_feature_by_writing_one_mask = 118 1 << USB_HUB_FEATURE_C_HUB_LOCAL_POWER; 119 120 /** 121 * bitmask of hub features that are valid to be set 122 */ 114 1 << USB_HUB_FEATURE_C_HUB_LOCAL_POWER; 115 123 116 static const uint32_t hub_set_feature_valid_mask = 124 117 (1 << USB_HUB_FEATURE_C_HUB_OVER_CURRENT) | 125 118 (1 << USB_HUB_FEATURE_C_HUB_LOCAL_POWER); 126 119 127 /** 128 * bitmask of hub features that are set by writing 1 and cleared by writing 0 129 */ 120 130 121 static const uint32_t hub_set_feature_direct_mask = 131 (1 << USB_HUB_FEATURE_C_HUB_OVER_CURRENT); 132 133 /** 134 * bitmask of port features that are valid to be set 135 */ 122 (1 << USB_HUB_FEATURE_C_HUB_OVER_CURRENT); 123 136 124 static const uint32_t port_set_feature_valid_mask = 137 125 (1 << USB_HUB_FEATURE_PORT_ENABLE) | 138 126 (1 << USB_HUB_FEATURE_PORT_SUSPEND) | 139 127 (1 << USB_HUB_FEATURE_PORT_RESET) | 140 128 (1 << USB_HUB_FEATURE_PORT_POWER); 141 129 142 /**143 * bitmask of port features that can be cleared144 */145 130 static const uint32_t port_clear_feature_valid_mask = 146 131 (1 << USB_HUB_FEATURE_PORT_CONNECTION) | 147 132 (1 << USB_HUB_FEATURE_PORT_SUSPEND) | 148 133 (1 << USB_HUB_FEATURE_PORT_OVER_CURRENT) | … … 156 141 //USB_HUB_FEATURE_PORT_LOW_SPEED 157 142 158 /**159 * bitmask with port status changes160 */161 143 static const uint32_t port_status_change_mask = 162 (1<< USB_HUB_FEATURE_C_PORT_CONNECTION) |163 (1 164 (1 165 (1 166 (1 144 (1<< USB_HUB_FEATURE_C_PORT_CONNECTION) | 145 (1<< USB_HUB_FEATURE_C_PORT_ENABLE) | 146 (1<< USB_HUB_FEATURE_C_PORT_OVER_CURRENT) | 147 (1<< USB_HUB_FEATURE_C_PORT_RESET) | 148 (1<< USB_HUB_FEATURE_C_PORT_SUSPEND); 167 149 168 150 … … 172 154 173 155 static int process_get_port_status_request(rh_t *instance, uint16_t port, 174 156 usb_transfer_batch_t * request); 175 157 176 158 static int process_get_hub_status_request(rh_t *instance, 177 159 usb_transfer_batch_t * request); 178 160 179 161 static int process_get_status_request(rh_t *instance, 180 162 usb_transfer_batch_t * request); 181 163 182 164 static void create_interrupt_mask_in_instance(rh_t *instance); 183 165 184 166 static int process_get_descriptor_request(rh_t *instance, 185 167 usb_transfer_batch_t *request); 186 168 187 169 static int process_get_configuration_request(rh_t *instance, 188 170 usb_transfer_batch_t *request); 189 171 190 172 static int process_hub_feature_set_request(rh_t *instance, uint16_t feature); 191 173 192 174 static int process_hub_feature_clear_request(rh_t *instance, 193 175 uint16_t feature); 194 176 195 177 static int process_port_feature_set_request(rh_t *instance, 196 178 uint16_t feature, uint16_t port); 197 179 198 180 static int process_port_feature_clear_request(rh_t *instance, 199 181 uint16_t feature, uint16_t port); 200 182 201 183 static int process_address_set_request(rh_t *instance, 202 184 uint16_t address); 203 185 204 186 static int process_request_with_output(rh_t *instance, 205 187 usb_transfer_batch_t *request); 206 188 207 189 static int process_request_with_input(rh_t *instance, 208 190 usb_transfer_batch_t *request); 209 191 210 192 static int process_request_without_data(rh_t *instance, 211 193 usb_transfer_batch_t *request); 212 194 213 195 static int process_ctrl_request(rh_t *instance, usb_transfer_batch_t *request); … … 216 198 217 199 static bool is_zeros(void * buffer, size_t size); 200 201 218 202 219 203 /** Root hub initialization … … 226 210 (instance->registers->rh_desc_a >> RHDA_NDS_SHIFT) & RHDA_NDS_MASK; 227 211 int opResult = rh_init_descriptors(instance); 228 if (opResult != EOK){212 if(opResult != EOK){ 229 213 return opResult; 230 214 } … … 232 216 instance->registers->rh_desc_a |= RHDA_NPS_FLAG; 233 217 instance->unfinished_interrupt_transfer = NULL; 234 instance->interrupt_mask_size = (instance->port_count + 8) /8;218 instance->interrupt_mask_size = (instance->port_count + 8)/8; 235 219 instance->interrupt_buffer = malloc(instance->interrupt_mask_size); 236 if 220 if(!instance->interrupt_buffer) 237 221 return ENOMEM; 238 239 usb_log_info("OHCI root hub with %zu ports initialized.\n", 240 instance->port_count); 241 222 223 224 usb_log_info("OHCI root hub with %d ports.\n", instance->port_count); 242 225 return EOK; 243 226 } … … 262 245 usb_log_info("Root hub got INTERRUPT packet\n"); 263 246 create_interrupt_mask_in_instance(instance); 264 if 265 instance->interrupt_mask_size)) 247 if(is_zeros(instance->interrupt_buffer, 248 instance->interrupt_mask_size)){ 266 249 usb_log_debug("no changes..\n"); 267 250 instance->unfinished_interrupt_transfer = request; 268 251 //will be finished later 269 } else{252 }else{ 270 253 usb_log_debug("processing changes..\n"); 271 254 process_interrupt_mask_in_instance(instance, request); … … 273 256 opResult = EOK; 274 257 } else { 275 276 258 opResult = EINVAL; 277 259 usb_transfer_batch_finish_error(request, opResult); … … 289 271 */ 290 272 void rh_interrupt(rh_t *instance) { 291 if (!instance->unfinished_interrupt_transfer){273 if(!instance->unfinished_interrupt_transfer){ 292 274 return; 293 275 } … … 310 292 static int create_serialized_hub_descriptor(rh_t *instance) { 311 293 size_t size = 7 + 312 ((instance->port_count + 7)/ 8) * 2;313 size_t var_size = (instance->port_count + 7)/ 8;294 ((instance->port_count +7 )/ 8) * 2; 295 size_t var_size = (instance->port_count +7 )/ 8; 314 296 uint8_t * result = (uint8_t*) malloc(size); 315 if 297 if(!result) return ENOMEM; 316 298 317 299 bzero(result, size); … … 323 305 uint32_t hub_desc_reg = instance->registers->rh_desc_a; 324 306 result[3] = 325 326 327 328 329 307 ((hub_desc_reg >> 8) % 2) + 308 (((hub_desc_reg >> 9) % 2) << 1) + 309 (((hub_desc_reg >> 10) % 2) << 2) + 310 (((hub_desc_reg >> 11) % 2) << 3) + 311 (((hub_desc_reg >> 12) % 2) << 4); 330 312 result[4] = 0; 331 313 result[5] = /*descriptor->pwr_on_2_good_time*/ 50; 332 314 result[6] = 50; 333 315 334 size_t port;316 int port; 335 317 for (port = 1; port <= instance->port_count; ++port) { 336 318 uint8_t is_non_removable = 337 319 instance->registers->rh_desc_b >> port % 2; 338 320 result[7 + port / 8] += 339 321 is_non_removable << (port % 8); 340 322 } 341 323 size_t i; … … 345 327 instance->hub_descriptor = result; 346 328 instance->descriptor_size = size; 347 348 329 return EOK; 349 330 } … … 359 340 static int rh_init_descriptors(rh_t *instance) { 360 341 memcpy(&instance->descriptors.device, &ohci_rh_device_descriptor, 361 362 342 sizeof (ohci_rh_device_descriptor) 343 ); 363 344 usb_standard_configuration_descriptor_t descriptor; 364 345 memcpy(&descriptor, &ohci_rh_conf_descriptor, 365 346 sizeof (ohci_rh_conf_descriptor)); 366 347 367 348 int opResult = create_serialized_hub_descriptor(instance); 368 if (opResult != EOK){349 if(opResult != EOK){ 369 350 return opResult; 370 351 } 371 352 descriptor.total_length = 372 373 374 375 353 sizeof (usb_standard_configuration_descriptor_t) + 354 sizeof (usb_standard_endpoint_descriptor_t) + 355 sizeof (usb_standard_interface_descriptor_t) + 356 instance->descriptor_size; 376 357 377 358 uint8_t * full_config_descriptor = 378 379 if (!full_config_descriptor){359 (uint8_t*) malloc(descriptor.total_length); 360 if(!full_config_descriptor){ 380 361 return ENOMEM; 381 362 } 382 363 memcpy(full_config_descriptor, &descriptor, sizeof (descriptor)); 383 364 memcpy(full_config_descriptor + sizeof (descriptor), 384 365 &ohci_rh_iface_descriptor, sizeof (ohci_rh_iface_descriptor)); 385 366 memcpy(full_config_descriptor + sizeof (descriptor) + 386 387 367 sizeof (ohci_rh_iface_descriptor), 368 &ohci_rh_ep_descriptor, sizeof (ohci_rh_ep_descriptor)); 388 369 memcpy(full_config_descriptor + sizeof (descriptor) + 389 390 391 392 370 sizeof (ohci_rh_iface_descriptor) + 371 sizeof (ohci_rh_ep_descriptor), 372 instance->hub_descriptor, instance->descriptor_size); 373 393 374 instance->descriptors.configuration = full_config_descriptor; 394 375 instance->descriptors.configuration_size = descriptor.total_length; 395 396 376 return EOK; 397 377 } … … 409 389 */ 410 390 static int process_get_port_status_request(rh_t *instance, uint16_t port, 411 391 usb_transfer_batch_t * request) { 412 392 if (port < 1 || port > instance->port_count) 413 393 return EINVAL; … … 418 398 int i; 419 399 for (i = 0; i < instance->port_count; ++i) { 420 421 400 usb_log_debug("port status %d,x%x\n", 422 423 401 instance->registers->rh_port_status[i], 402 instance->registers->rh_port_status[i]); 424 403 } 425 404 #endif … … 438 417 */ 439 418 static int process_get_hub_status_request(rh_t *instance, 440 419 usb_transfer_batch_t * request) { 441 420 uint32_t * uint32_buffer = (uint32_t*) request->data_buffer; 442 421 request->transfered_size = 4; … … 444 423 uint32_t mask = 1 | (1 << 1) | (1 << 16) | (1 << 17); 445 424 uint32_buffer[0] = mask & instance->registers->rh_status; 446 447 425 return EOK; 448 426 } … … 459 437 */ 460 438 static int process_get_status_request(rh_t *instance, 461 439 usb_transfer_batch_t * request) { 462 440 size_t buffer_size = request->buffer_size; 463 441 usb_device_request_setup_packet_t * request_packet = 464 465 442 (usb_device_request_setup_packet_t*) 443 request->setup_buffer; 466 444 467 445 usb_hub_bm_request_type_t request_type = request_packet->request_type; … … 475 453 if (request_type == USB_HUB_REQ_TYPE_GET_PORT_STATUS) 476 454 return process_get_port_status_request(instance, 477 request_packet->index, 478 request); 479 455 request_packet->index, 456 request); 480 457 return ENOTSUP; 481 458 } … … 495 472 uint8_t * bitmap = (uint8_t*) (instance->interrupt_buffer); 496 473 uint32_t mask = (1 << (USB_HUB_FEATURE_C_HUB_LOCAL_POWER + 16)) 497 474 | (1 << (USB_HUB_FEATURE_C_HUB_OVER_CURRENT + 16)); 498 475 bzero(bitmap, instance->interrupt_mask_size); 499 476 if (instance->registers->rh_status & mask) { 500 477 bitmap[0] = 1; 501 478 } 502 size_t port;479 int port; 503 480 mask = port_status_change_mask; 504 481 for (port = 1; port <= instance->port_count; ++port) { 505 482 if (mask & instance->registers->rh_port_status[port - 1]) { 506 507 483 bitmap[(port) / 8] += 1 << (port % 8); 508 484 } … … 521 497 */ 522 498 static int process_get_descriptor_request(rh_t *instance, 523 499 usb_transfer_batch_t *request) { 524 500 usb_device_request_setup_packet_t * setup_request = 525 501 (usb_device_request_setup_packet_t*) request->setup_buffer; 526 502 size_t size; 527 503 const void * result_descriptor = NULL; … … 567 543 { 568 544 usb_log_debug("USB_DESCTYPE_EINVAL %d \n", 569 545 setup_request->value); 570 546 usb_log_debug("\ttype %d\n\trequest %d\n\tvalue " 571 572 573 574 575 576 577 547 "%d\n\tindex %d\n\tlen %d\n ", 548 setup_request->request_type, 549 setup_request->request, 550 setup_request_value, 551 setup_request->index, 552 setup_request->length 553 ); 578 554 return EINVAL; 579 555 } … … 584 560 request->transfered_size = size; 585 561 memcpy(request->data_buffer, result_descriptor, size); 586 587 562 return EOK; 588 563 } … … 598 573 */ 599 574 static int process_get_configuration_request(rh_t *instance, 600 575 usb_transfer_batch_t *request) { 601 576 //set and get configuration requests do not have any meaning, only dummy 602 577 //values are returned … … 605 580 request->data_buffer[0] = 1; 606 581 request->transfered_size = 1; 607 608 582 return EOK; 609 583 } … … 618 592 */ 619 593 static int process_hub_feature_set_request(rh_t *instance, 620 594 uint16_t feature) { 621 595 if (!((1 << feature) & hub_set_feature_valid_mask)) 622 596 return EINVAL; 623 if 597 if(feature == USB_HUB_FEATURE_C_HUB_LOCAL_POWER) 624 598 feature = USB_HUB_FEATURE_C_HUB_LOCAL_POWER << 16; 625 599 instance->registers->rh_status = 626 (instance->registers->rh_status | (1 << feature)) 627 & (~hub_clear_feature_by_writing_one_mask); 628 600 (instance->registers->rh_status | (1 << feature)) 601 & (~hub_clear_feature_by_writing_one_mask); 629 602 return EOK; 630 603 } … … 639 612 */ 640 613 static int process_hub_feature_clear_request(rh_t *instance, 641 614 uint16_t feature) { 642 615 if (!((1 << feature) & hub_clear_feature_valid_mask)) 643 616 return EINVAL; … … 645 618 if ((1 << feature) & hub_set_feature_direct_mask) { 646 619 instance->registers->rh_status = 647 648 620 (instance->registers->rh_status & (~(1 << feature))) 621 & (~hub_clear_feature_by_writing_one_mask); 649 622 } else {//the feature is cleared by writing '1' 650 651 623 instance->registers->rh_status = 652 653 654 624 (instance->registers->rh_status 625 & (~hub_clear_feature_by_writing_one_mask)) 626 | (1 << feature); 655 627 } 656 628 return EOK; … … 668 640 */ 669 641 static int process_port_feature_set_request(rh_t *instance, 670 642 uint16_t feature, uint16_t port) { 671 643 if (!((1 << feature) & port_set_feature_valid_mask)) 672 644 return EINVAL; … … 674 646 return EINVAL; 675 647 instance->registers->rh_port_status[port - 1] = 676 677 648 (instance->registers->rh_port_status[port - 1] | (1 << feature)) 649 & (~port_clear_feature_valid_mask); 678 650 /// \TODO any error? 679 680 651 return EOK; 681 652 } … … 692 663 */ 693 664 static int process_port_feature_clear_request(rh_t *instance, 694 665 uint16_t feature, uint16_t port) { 695 666 if (!((1 << feature) & port_clear_feature_valid_mask)) 696 667 return EINVAL; … … 702 673 feature = USB_HUB_FEATURE_PORT_OVER_CURRENT; 703 674 instance->registers->rh_port_status[port - 1] = 704 705 706 675 (instance->registers->rh_port_status[port - 1] 676 & (~port_clear_feature_valid_mask)) 677 | (1 << feature); 707 678 /// \TODO any error? 708 709 679 return EOK; 710 680 } … … 719 689 */ 720 690 static int process_address_set_request(rh_t *instance, 721 691 uint16_t address) { 722 692 instance->address = address; 723 724 693 return EOK; 725 694 } … … 736 705 */ 737 706 static int process_request_with_output(rh_t *instance, 738 707 usb_transfer_batch_t *request) { 739 708 usb_device_request_setup_packet_t * setup_request = 740 709 (usb_device_request_setup_packet_t*) request->setup_buffer; 741 710 if (setup_request->request == USB_DEVREQ_GET_STATUS) { 742 711 usb_log_debug("USB_DEVREQ_GET_STATUS\n"); … … 749 718 if (setup_request->request == USB_DEVREQ_GET_CONFIGURATION) { 750 719 usb_log_debug("USB_DEVREQ_GET_CONFIGURATION\n"); 751 752 720 return process_get_configuration_request(instance, request); 753 721 } … … 766 734 */ 767 735 static int process_request_with_input(rh_t *instance, 768 736 usb_transfer_batch_t *request) { 769 737 usb_device_request_setup_packet_t * setup_request = 770 738 (usb_device_request_setup_packet_t*) request->setup_buffer; 771 739 request->transfered_size = 0; 772 740 if (setup_request->request == USB_DEVREQ_SET_DESCRIPTOR) { … … 776 744 //set and get configuration requests do not have any meaning, 777 745 //only dummy values are returned 778 779 746 return EOK; 780 747 } … … 793 760 */ 794 761 static int process_request_without_data(rh_t *instance, 795 762 usb_transfer_batch_t *request) { 796 763 usb_device_request_setup_packet_t * setup_request = 797 764 (usb_device_request_setup_packet_t*) request->setup_buffer; 798 765 request->transfered_size = 0; 799 766 if (setup_request->request == USB_DEVREQ_CLEAR_FEATURE) { … … 801 768 usb_log_debug("USB_HUB_REQ_TYPE_SET_HUB_FEATURE\n"); 802 769 return process_hub_feature_clear_request(instance, 803 770 setup_request->value); 804 771 } 805 772 if (setup_request->request_type == USB_HUB_REQ_TYPE_SET_PORT_FEATURE) { 806 773 usb_log_debug("USB_HUB_REQ_TYPE_SET_PORT_FEATURE\n"); 807 774 return process_port_feature_clear_request(instance, 808 809 775 setup_request->value, 776 setup_request->index); 810 777 } 811 778 usb_log_debug("USB_HUB_REQ_TYPE_INVALID %d\n", 812 779 setup_request->request_type); 813 780 return EINVAL; 814 781 } … … 817 784 usb_log_debug("USB_HUB_REQ_TYPE_SET_HUB_FEATURE\n"); 818 785 return process_hub_feature_set_request(instance, 819 786 setup_request->value); 820 787 } 821 788 if (setup_request->request_type == USB_HUB_REQ_TYPE_SET_PORT_FEATURE) { 822 789 usb_log_debug("USB_HUB_REQ_TYPE_SET_PORT_FEATURE\n"); 823 790 return process_port_feature_set_request(instance, 824 825 791 setup_request->value, 792 setup_request->index); 826 793 } 827 794 usb_log_debug("USB_HUB_REQ_TYPE_INVALID %d\n", 828 795 setup_request->request_type); 829 796 return EINVAL; 830 797 } … … 832 799 usb_log_debug("USB_DEVREQ_SET_ADDRESS\n"); 833 800 return process_address_set_request(instance, 834 801 setup_request->value); 835 802 } 836 803 usb_log_debug("USB_DEVREQ_SET_ENOTSUP %d\n", 837 setup_request->request_type); 838 804 setup_request->request_type); 839 805 return ENOTSUP; 840 806 } … … 870 836 } 871 837 usb_log_info("CTRL packet: %s.\n", 872 873 838 usb_debug_str_buffer( 839 (const uint8_t *) request->setup_buffer, 8, 8)); 874 840 usb_device_request_setup_packet_t * setup_request = 875 876 841 (usb_device_request_setup_packet_t*) 842 request->setup_buffer; 877 843 switch (setup_request->request) { 878 844 case USB_DEVREQ_GET_STATUS: … … 881 847 usb_log_debug("processing request with output\n"); 882 848 opResult = process_request_with_output( 883 849 instance, request); 884 850 break; 885 851 case USB_DEVREQ_CLEAR_FEATURE: … … 887 853 case USB_DEVREQ_SET_ADDRESS: 888 854 usb_log_debug("processing request without " 889 855 "additional data\n"); 890 856 opResult = process_request_without_data( 891 857 instance, request); 892 858 break; 893 859 case USB_DEVREQ_SET_DESCRIPTOR: 894 860 case USB_DEVREQ_SET_CONFIGURATION: 895 861 usb_log_debug("processing request with " 896 862 "input\n"); 897 863 opResult = process_request_with_input( 898 instance, request); 899 864 instance, request); 900 865 break; 901 866 default: 902 867 usb_log_warning("received unsuported request: " 903 904 905 868 "%d\n", 869 setup_request->request 870 ); 906 871 opResult = ENOTSUP; 907 872 } … … 923 888 * @return 924 889 */ 925 static int process_interrupt_mask_in_instance(rh_t *instance, usb_transfer_batch_t * request) 890 static int process_interrupt_mask_in_instance(rh_t *instance, usb_transfer_batch_t * request){ 926 891 memcpy(request->data_buffer, instance->interrupt_buffer, 927 892 instance->interrupt_mask_size); … … 929 894 instance->unfinished_interrupt_transfer = NULL; 930 895 usb_transfer_batch_finish_error(request, EOK); 931 932 896 return EOK; 933 897 } … … 943 907 * @return 944 908 */ 945 static bool is_zeros(void * buffer, size_t size) 946 if 947 if 909 static bool is_zeros(void * buffer, size_t size){ 910 if(!buffer) return true; 911 if(!size) return true; 948 912 size_t i; 949 for (i = 0; i < size; ++i){950 if (((char*)buffer)[i])913 for(i=0;i<size;++i){ 914 if(((char*)buffer)[i]) 951 915 return false; 952 916 } -
uspace/drv/ohci/root_hub.h
r9e195e2c r456aea3 51 51 usb_address_t address; 52 52 /** hub port count */ 53 size_t port_count;53 int port_count; 54 54 /** hubs descriptors */ 55 55 usb_device_descriptors_t descriptors; -
uspace/drv/uhci-hcd/Makefile
r9e195e2c r456aea3 28 28 29 29 USPACE_PREFIX = ../.. 30 31 LIBS = \ 32 $(LIBUSBHOST_PREFIX)/libusbhost.a \ 33 $(LIBUSB_PREFIX)/libusb.a \ 34 $(LIBDRV_PREFIX)/libdrv.a 35 EXTRA_CFLAGS += \ 36 -I$(LIBUSB_PREFIX)/include \ 37 -I$(LIBUSBHOST_PREFIX)/include \ 38 -I$(LIBDRV_PREFIX)/include 39 30 LIBS = $(LIBDRV_PREFIX)/libdrv.a $(LIBUSB_PREFIX)/libusb.a 31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -I$(LIBUSB_PREFIX)/include -I. 40 32 BINARY = uhci-hcd 41 33 -
uspace/drv/uhci-hcd/hc.c
r9e195e2c r456aea3 60 60 * 61 61 * @param[in] instance Memory place to initialize. 62 * @param[in] fun DDF function. 62 63 * @param[in] regs Address of I/O control registers. 63 64 * @param[in] size Size of I/O control registers. … … 68 69 * interrupt fibrils. 69 70 */ 70 int hc_init(hc_t *instance, void *regs, size_t reg_size, bool interrupts) 71 int hc_init(hc_t *instance, ddf_fun_t *fun, 72 void *regs, size_t reg_size, bool interrupts) 71 73 { 72 74 assert(reg_size >= sizeof(regs_t)); -
uspace/drv/uhci-hcd/hc.h
r9e195e2c r456aea3 136 136 } hc_t; 137 137 138 int hc_init(hc_t *instance, void *regs, size_t reg_size, bool interupts); 138 int hc_init(hc_t *instance, ddf_fun_t *fun, 139 void *regs, size_t reg_size, bool interupts); 139 140 140 141 int hc_schedule(hc_t *instance, usb_transfer_batch_t *batch); -
uspace/drv/uhci-hcd/hw_struct/queue_head.h
r9e195e2c r456aea3 38 38 #include "link_pointer.h" 39 39 #include "transfer_descriptor.h" 40 #include " ../utils/malloc32.h"40 #include "utils/malloc32.h" 41 41 42 42 /** This structure is defined in UHCI design guide p. 31 */ -
uspace/drv/uhci-hcd/hw_struct/transfer_descriptor.c
r9e195e2c r456aea3 36 36 37 37 #include "transfer_descriptor.h" 38 #include " ../utils/malloc32.h"38 #include "utils/malloc32.h" 39 39 40 40 /** Initialize Transfer Descriptor -
uspace/drv/uhci-hcd/iface.c
r9e195e2c r456aea3 122 122 return EOK; 123 123 } 124 125 /** Find device handle by address interface function.126 *127 * @param[in] fun DDF function that was called.128 * @param[in] address Address in question.129 * @param[out] handle Where to store device handle if found.130 * @return Error code.131 */132 static int find_by_address(ddf_fun_t *fun, usb_address_t address,133 devman_handle_t *handle)134 {135 assert(fun);136 hc_t *hc = fun_to_hc(fun);137 assert(hc);138 bool found =139 usb_device_keeper_find_by_address(&hc->manager, address, handle);140 return found ? EOK : ENOENT;141 }142 143 124 /*----------------------------------------------------------------------------*/ 144 125 /** Release address interface function … … 371 352 .request_address = request_address, 372 353 .bind_address = bind_address, 373 .find_by_address = find_by_address,374 354 .release_address = release_address, 375 355 -
uspace/drv/uhci-hcd/main.c
r9e195e2c r456aea3 64 64 assert(device); 65 65 66 int ret = device_setup_uhci(device); 66 uhci_t *uhci = malloc(sizeof(uhci_t)); 67 if (uhci == NULL) { 68 usb_log_error("Failed to allocate UHCI driver.\n"); 69 return ENOMEM; 70 } 71 72 int ret = uhci_init(uhci, device); 67 73 if (ret != EOK) { 68 74 usb_log_error("Failed to initialize UHCI driver: %s.\n", … … 70 76 return ret; 71 77 } 78 device->driver_data = uhci; 79 72 80 usb_log_info("Controlling new UHCI device '%s'.\n", device->name); 73 81 -
uspace/drv/uhci-hcd/uhci.c
r9e195e2c r456aea3 44 44 #include "pci.h" 45 45 46 #include "hc.h"47 #include "root_hub.h"48 49 /** Structure representing both functions of UHCI hc, USB host controller50 * and USB root hub */51 typedef struct uhci {52 /** Pointer to DDF represenation of UHCI host controller */53 ddf_fun_t *hc_fun;54 /** Pointer to DDF represenation of UHCI root hub */55 ddf_fun_t *rh_fun;56 57 /** Internal driver's represenation of UHCI host controller */58 hc_t hc;59 /** Internal driver's represenation of UHCI root hub */60 rh_t rh;61 } uhci_t;62 63 static inline uhci_t * dev_to_uhci(ddf_dev_t *dev)64 {65 assert(dev);66 assert(dev->driver_data);67 return dev->driver_data;68 }69 /*----------------------------------------------------------------------------*/70 46 /** IRQ handling callback, forward status from call to diver structure. 71 47 * … … 93 69 { 94 70 assert(fun); 95 usb_device_keeper_t *manager = &dev_to_uhci(fun->dev)->hc.manager; 71 usb_device_keeper_t *manager = 72 &((uhci_t*)fun->dev->driver_data)->hc.manager; 73 96 74 usb_address_t addr = usb_device_keeper_find(manager, handle); 97 98 75 if (addr < 0) { 99 76 return addr; … … 116 93 ddf_fun_t *fun, devman_handle_t *handle) 117 94 { 118 assert(fun); 119 ddf_fun_t *hc_fun = dev_to_uhci(fun->dev)->hc_fun; 120 assert(hc_fun); 121 122 if (handle != NULL) 123 *handle = hc_fun->handle; 95 assert(handle); 96 ddf_fun_t *hc_fun = ((uhci_t*)fun->dev->driver_data)->hc_fun; 97 assert(hc_fun != NULL); 98 99 *handle = hc_fun->handle; 124 100 return EOK; 125 101 } … … 150 126 static hw_res_ops_t hw_res_iface = { 151 127 .get_resource_list = get_resource_list, 152 .enable_interrupt = NULL ,128 .enable_interrupt = NULL 153 129 }; 154 130 /*----------------------------------------------------------------------------*/ … … 170 146 * - registers interrupt handler 171 147 */ 172 int device_setup_uhci(ddf_dev_t *device) 173 { 174 assert(device); 175 uhci_t *instance = malloc(sizeof(uhci_t)); 176 if (instance == NULL) { 177 usb_log_error("Failed to allocate OHCI driver.\n"); 178 return ENOMEM; 179 } 180 181 #define CHECK_RET_DEST_FREE_RETURN(ret, message...) \ 148 int uhci_init(uhci_t *instance, ddf_dev_t *device) 149 { 150 assert(instance); 151 instance->hc_fun = NULL; 152 instance->rh_fun = NULL; 153 #define CHECK_RET_DEST_FUN_RETURN(ret, message...) \ 182 154 if (ret != EOK) { \ 155 usb_log_error(message); \ 183 156 if (instance->hc_fun) \ 184 instance->hc_fun->ops = NULL; \185 instance->hc_fun->driver_data = NULL; \186 157 ddf_fun_destroy(instance->hc_fun); \ 187 if (instance->rh_fun) {\ 188 instance->rh_fun->ops = NULL; \ 189 instance->rh_fun->driver_data = NULL; \ 158 if (instance->rh_fun) \ 190 159 ddf_fun_destroy(instance->rh_fun); \ 191 } \192 free(instance); \193 usb_log_error(message); \194 160 return ret; \ 195 } else (void)0 196 197 instance->rh_fun = NULL; 198 instance->hc_fun = ddf_fun_create(device, fun_exposed, "uhci-hc"); 199 int ret = (instance->hc_fun == NULL) ? ENOMEM : EOK; 200 CHECK_RET_DEST_FREE_RETURN(ret, "Failed to create UHCI HC function.\n"); 201 instance->hc_fun->ops = &hc_ops; 202 instance->hc_fun->driver_data = &instance->hc; 203 204 instance->rh_fun = ddf_fun_create(device, fun_inner, "uhci-rh"); 205 ret = (instance->rh_fun == NULL) ? ENOMEM : EOK; 206 CHECK_RET_DEST_FREE_RETURN(ret, "Failed to create UHCI RH function.\n"); 207 instance->rh_fun->ops = &rh_ops; 208 instance->rh_fun->driver_data = &instance->rh; 209 210 uintptr_t reg_base = 0; 211 size_t reg_size = 0; 161 } 162 163 uintptr_t io_reg_base = 0; 164 size_t io_reg_size = 0; 212 165 int irq = 0; 213 166 214 ret = pci_get_my_registers(device, ®_base, ®_size, &irq); 215 CHECK_RET_DEST_FREE_RETURN(ret, 167 int ret = 168 pci_get_my_registers(device, &io_reg_base, &io_reg_size, &irq); 169 CHECK_RET_DEST_FUN_RETURN(ret, 216 170 "Failed to get I/O addresses for %" PRIun ": %s.\n", 217 171 device->handle, str_error(ret)); 218 172 usb_log_debug("I/O regs at 0x%p (size %zu), IRQ %d.\n", 219 (void *) reg_base,reg_size, irq);173 (void *) io_reg_base, io_reg_size, irq); 220 174 221 175 ret = pci_disable_legacy(device); 222 CHECK_RET_DEST_F REE_RETURN(ret,176 CHECK_RET_DEST_FUN_RETURN(ret, 223 177 "Failed(%d) to disable legacy USB: %s.\n", ret, str_error(ret)); 224 178 … … 240 194 #endif 241 195 242 243 ret = hc_init(&instance->hc, (void*)reg_base, reg_size, interrupts); 244 CHECK_RET_DEST_FREE_RETURN(ret, 196 instance->hc_fun = ddf_fun_create(device, fun_exposed, "uhci-hc"); 197 ret = (instance->hc_fun == NULL) ? ENOMEM : EOK; 198 CHECK_RET_DEST_FUN_RETURN(ret, 199 "Failed(%d) to create HC function: %s.\n", ret, str_error(ret)); 200 201 ret = hc_init(&instance->hc, instance->hc_fun, 202 (void*)io_reg_base, io_reg_size, interrupts); 203 CHECK_RET_DEST_FUN_RETURN(ret, 245 204 "Failed(%d) to init uhci-hcd: %s.\n", ret, str_error(ret)); 205 206 instance->hc_fun->ops = &hc_ops; 207 instance->hc_fun->driver_data = &instance->hc; 208 ret = ddf_fun_bind(instance->hc_fun); 209 CHECK_RET_DEST_FUN_RETURN(ret, 210 "Failed(%d) to bind UHCI device function: %s.\n", 211 ret, str_error(ret)); 212 #undef CHECK_RET_HC_RETURN 246 213 247 214 #define CHECK_RET_FINI_RETURN(ret, message...) \ 248 215 if (ret != EOK) { \ 216 usb_log_error(message); \ 217 if (instance->hc_fun) \ 218 ddf_fun_destroy(instance->hc_fun); \ 219 if (instance->rh_fun) \ 220 ddf_fun_destroy(instance->rh_fun); \ 249 221 hc_fini(&instance->hc); \ 250 CHECK_RET_DEST_FREE_RETURN(ret, message); \251 222 return ret; \ 252 } else (void)0223 } 253 224 254 225 /* It does no harm if we register this on polling */ … … 259 230 ret, str_error(ret)); 260 231 261 ret = ddf_fun_bind(instance->hc_fun); 262 CHECK_RET_FINI_RETURN(ret, 263 "Failed(%d) to bind UHCI device function: %s.\n", 232 instance->rh_fun = ddf_fun_create(device, fun_inner, "uhci-rh"); 233 ret = (instance->rh_fun == NULL) ? ENOMEM : EOK; 234 CHECK_RET_FINI_RETURN(ret, 235 "Failed(%d) to create root hub function: %s.\n", 264 236 ret, str_error(ret)); 265 266 ret = ddf_fun_add_to_class(instance->hc_fun, USB_HC_DDF_CLASS_NAME);267 CHECK_RET_FINI_RETURN(ret,268 "Failed to add UHCI to HC class: %s.\n", str_error(ret));269 237 270 238 ret = rh_init(&instance->rh, instance->rh_fun, … … 273 241 "Failed(%d) to setup UHCI root hub: %s.\n", ret, str_error(ret)); 274 242 243 instance->rh_fun->ops = &rh_ops; 244 instance->rh_fun->driver_data = &instance->rh; 275 245 ret = ddf_fun_bind(instance->rh_fun); 276 246 CHECK_RET_FINI_RETURN(ret, 277 247 "Failed(%d) to register UHCI root hub: %s.\n", ret, str_error(ret)); 278 248 279 device->driver_data = instance;280 249 return EOK; 281 250 #undef CHECK_RET_FINI_RETURN -
uspace/drv/uhci-hcd/uhci.h
r9e195e2c r456aea3 38 38 #include <ddf/driver.h> 39 39 40 int device_setup_uhci(ddf_dev_t *device); 40 #include "hc.h" 41 #include "root_hub.h" 42 43 /** Structure representing both functions of UHCI hc, USB host controller 44 * and USB root hub */ 45 typedef struct uhci { 46 /** Pointer to DDF represenation of UHCI host controller */ 47 ddf_fun_t *hc_fun; 48 /** Pointer to DDF represenation of UHCI root hub */ 49 ddf_fun_t *rh_fun; 50 51 /** Internal driver's represenation of UHCI host controller */ 52 hc_t hc; 53 /** Internal driver's represenation of UHCI root hub */ 54 rh_t rh; 55 } uhci_t; 56 57 int uhci_init(uhci_t *instance, ddf_dev_t *device); 41 58 #endif 42 59 /** -
uspace/drv/uhci-rhd/Makefile
r9e195e2c r456aea3 28 28 29 29 USPACE_PREFIX = ../.. 30 31 LIBS = \ 32 $(LIBUSBDEV_PREFIX)/libusbdev.a \ 33 $(LIBUSB_PREFIX)/libusb.a \ 34 $(LIBDRV_PREFIX)/libdrv.a 35 EXTRA_CFLAGS += \ 36 -I$(LIBUSB_PREFIX)/include \ 37 -I$(LIBUSBDEV_PREFIX)/include \ 38 -I$(LIBDRV_PREFIX)/include 39 30 LIBS = $(LIBDRV_PREFIX)/libdrv.a $(LIBUSB_PREFIX)/libusb.a 31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -I$(LIBUSB_PREFIX)/include -I. 40 32 BINARY = uhci-rhd 41 33 -
uspace/drv/uhci-rhd/port.c
r9e195e2c r456aea3 32 32 * @brief UHCI root hub port routines 33 33 */ 34 #include <libarch/ddi.h> /* pio_read and pio_write */ 35 #include <fibril_synch.h> /* async_usleep */ 34 #include <libarch/ddi.h> /* pio_read and pio_write */ 36 35 #include <errno.h> 37 36 #include <str_error.h> 37 #include <fibril_synch.h> 38 38 39 39 #include <usb/usb.h> /* usb_address_t */ 40 #include <usb/hub.h> /* usb_hc_new_device_wrapper */40 #include <usb/hub.h> 41 41 #include <usb/debug.h> 42 42 … … 212 212 213 213 /* 214 * Resets from root ports should be nominally 50ms (USB spec 7.1.7.3) 214 * The host then waits for at least 100 ms to allow completion of 215 * an insertion process and for power at the device to become stable. 216 */ 217 async_usleep(100000); 218 219 /* 220 * Resets from root ports should be nominally 50ms 215 221 */ 216 222 { … … 223 229 port_status &= ~STATUS_IN_RESET; 224 230 uhci_port_write_status(port, port_status); 225 while (uhci_port_read_status(port) & STATUS_IN_RESET);226 // TODO: find a better way to waste time (it should be less than227 // 10ms, if we reschedule it takes too much time (random 228 // interrupts can be solved by multiple attempts).229 usb_log_debug2("%s: Reset Signal stop.\n", port->id_string);230 } 231 usb_log_debug("%s: Reset Signal stop.\n", port->id_string); 232 } 233 234 /* the reset recovery time 10ms */ 235 async_usleep(10000); 236 231 237 /* Enable the port. */ 232 238 uhci_port_set_enabled(port, true); 233 234 /* Reset recovery period,235 * devices do not have to respond during this period236 */237 async_usleep(10000);238 239 return EOK; 239 240 } … … 254 255 usb_log_debug("%s: Detected new device.\n", port->id_string); 255 256 256 int ret, count = 0;257 257 usb_address_t dev_addr; 258 do { 259 ret = usb_hc_new_device_wrapper(port->rh, &port->hc_connection, 260 speed, uhci_port_reset_enable, port->number, port, 261 &dev_addr, &port->attached_device, NULL, NULL, NULL); 262 } while (ret != EOK && ++count < 4); 258 int ret = usb_hc_new_device_wrapper(port->rh, &port->hc_connection, 259 speed, uhci_port_reset_enable, port->number, port, 260 &dev_addr, &port->attached_device, NULL, NULL, NULL); 263 261 264 262 if (ret != EOK) { … … 315 313 /* Wait for port to become enabled */ 316 314 do { 315 async_usleep(1000); 317 316 port_status = uhci_port_read_status(port); 318 317 } while ((port_status & STATUS_CONNECTED) && -
uspace/drv/usbflbk/Makefile
r9e195e2c r456aea3 28 28 29 29 USPACE_PREFIX = ../.. 30 31 LIBS = \ 32 $(LIBUSBDEV_PREFIX)/libusbdev.a \ 33 $(LIBUSB_PREFIX)/libusb.a \ 34 $(LIBDRV_PREFIX)/libdrv.a 35 EXTRA_CFLAGS += \ 36 -I$(LIBUSB_PREFIX)/include \ 37 -I$(LIBUSBDEV_PREFIX)/include \ 38 -I$(LIBDRV_PREFIX)/include 39 30 LIBS = $(LIBDRV_PREFIX)/libdrv.a $(LIBUSB_PREFIX)/libusb.a 31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -I$(LIBUSB_PREFIX)/include 40 32 BINARY = usbflbk 41 33 -
uspace/drv/usbhid/Makefile
r9e195e2c r456aea3 28 28 29 29 USPACE_PREFIX = ../.. 30 31 LIBS = \ 32 $(LIBUSBHID_PREFIX)/libusbhid.a \ 33 $(LIBUSBDEV_PREFIX)/libusbdev.a \ 34 $(LIBUSB_PREFIX)/libusb.a \ 35 $(LIBDRV_PREFIX)/libdrv.a 36 EXTRA_CFLAGS += \ 37 -I. \ 38 -I$(LIBUSB_PREFIX)/include \ 39 -I$(LIBUSBDEV_PREFIX)/include \ 40 -I$(LIBUSBHID_PREFIX)/include \ 41 -I$(LIBDRV_PREFIX)/include 42 30 LIBS = $(LIBDRV_PREFIX)/libdrv.a $(LIBUSB_PREFIX)/libusb.a 31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -I$(LIBUSB_PREFIX)/include -I. 43 32 BINARY = usbhid 44 33 -
uspace/drv/usbhid/mouse/mousedev.c
r9e195e2c r456aea3 309 309 * Wheel 310 310 */ 311 int wheel = 0;311 int wheel; 312 312 313 313 path = usb_hid_report_path(); -
uspace/drv/usbhub/Makefile
r9e195e2c r456aea3 28 28 29 29 USPACE_PREFIX = ../.. 30 31 LIBS = \ 32 $(LIBUSBDEV_PREFIX)/libusbdev.a \ 33 $(LIBUSB_PREFIX)/libusb.a \ 34 $(LIBDRV_PREFIX)/libdrv.a 35 EXTRA_CFLAGS += \ 36 -I$(LIBUSB_PREFIX)/include \ 37 -I$(LIBUSBDEV_PREFIX)/include \ 38 -I$(LIBDRV_PREFIX)/include 39 30 LIBS = $(LIBDRV_PREFIX)/libdrv.a $(LIBUSB_PREFIX)/libusb.a 31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -I$(LIBUSB_PREFIX)/include 40 32 BINARY = usbhub 41 33 -
uspace/drv/usbhub/ports.c
r9e195e2c r456aea3 53 53 size_t port; 54 54 usb_speed_t speed; 55 };56 57 /**58 * count of port status changes that are not explicitly handled by59 * any function here and must be cleared by hand60 */61 static const unsigned int non_handled_changes_count = 2;62 63 /**64 * port status changes that are not explicitly handled by65 * any function here and must be cleared by hand66 */67 static const int non_handled_changes[] = {68 USB_HUB_FEATURE_C_PORT_ENABLE,69 USB_HUB_FEATURE_C_PORT_SUSPEND70 55 }; 71 56 … … 146 131 &status, USB_HUB_FEATURE_C_PORT_CONNECTION,false); 147 132 usb_port_status_set_bit( 133 &status, USB_HUB_FEATURE_PORT_RESET,false); 134 usb_port_status_set_bit( 148 135 &status, USB_HUB_FEATURE_C_PORT_RESET,false); 149 136 usb_port_status_set_bit( 150 137 &status, USB_HUB_FEATURE_C_PORT_OVER_CURRENT,false); 151 152 //clearing not yet handled changes 153 unsigned int feature_idx; 154 for(feature_idx = 0;feature_idx<non_handled_changes_count; 155 ++feature_idx){ 156 unsigned int bit_idx = non_handled_changes[feature_idx]; 157 if(status & (1<<bit_idx)){ 158 usb_log_info( 159 "there was not yet handled change on port %d: %d" 160 ";clearing it\n", 161 port, bit_idx); 162 int opResult = usb_hub_clear_port_feature( 163 hub->control_pipe, 164 port, bit_idx); 165 if (opResult != EOK) { 166 usb_log_warning( 167 "could not clear port flag %d: %d\n", 168 bit_idx, opResult 169 ); 170 } 171 usb_port_status_set_bit( 172 &status, bit_idx,false); 173 } 174 } 175 if(status>>16){ 176 usb_log_info("there is still some unhandled change %X\n", 177 status); 138 /// \TODO what about port power change? 139 if (status >> 16) { 140 usb_log_info("there was unsupported change on port %d: %X\n", 141 port, status); 142 178 143 } 179 144 } … … 257 222 "Port %zu reset complete but port not enabled.\n", 258 223 (size_t) port); 259 }260 /* Clear the port reset change. */261 int rc = usb_hub_clear_port_feature(hub->control_pipe,262 port, USB_HUB_FEATURE_C_PORT_RESET);263 if (rc != EOK) {264 usb_log_error("Failed to clear port %d reset feature: %s.\n",265 port, str_error(rc));266 224 } 267 225 } … … 361 319 fibril_mutex_unlock(&my_port->reset_mutex); 362 320 321 /* Clear the port reset change. */ 322 rc = usb_hub_clear_port_feature(hub->control_pipe, 323 port_no, USB_HUB_FEATURE_C_PORT_RESET); 324 if (rc != EOK) { 325 usb_log_error("Failed to clear port %d reset feature: %s.\n", 326 port_no, str_error(rc)); 327 return rc; 328 } 329 363 330 if (my_port->reset_okay) { 364 331 return EOK; -
uspace/drv/usbmast/Makefile
r9e195e2c r456aea3 28 28 29 29 USPACE_PREFIX = ../.. 30 31 LIBS = \ 32 $(LIBUSBDEV_PREFIX)/libusbdev.a \ 33 $(LIBUSB_PREFIX)/libusb.a \ 34 $(LIBDRV_PREFIX)/libdrv.a 35 EXTRA_CFLAGS += \ 36 -I$(LIBUSB_PREFIX)/include \ 37 -I$(LIBUSBDEV_PREFIX)/include \ 38 -I$(LIBDRV_PREFIX)/include 39 30 LIBS = $(LIBDRV_PREFIX)/libdrv.a $(LIBUSB_PREFIX)/libusb.a 31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -I$(LIBUSB_PREFIX)/include 40 32 BINARY = usbmast 41 33 42 34 SOURCES = \ 43 inquiry.c \44 35 main.c \ 45 36 mast.c -
uspace/drv/usbmast/main.c
r9e195e2c r456aea3 75 75 }; 76 76 77 #define BITS_GET_MASK(type, bitcount) (((type)(1 << (bitcount)))-1) 78 #define BITS_GET_MID_MASK(type, bitcount, offset) \ 79 ((type)( BITS_GET_MASK(type, (bitcount) + (offset)) - BITS_GET_MASK(type, bitcount) )) 80 #define BITS_GET(type, number, bitcount, offset) \ 81 ((type)( (number) & (BITS_GET_MID_MASK(type, bitcount, offset)) ) >> (offset)) 82 83 #define INQUIRY_RESPONSE_LENGTH 35 84 85 static void try_inquiry(usb_device_t *dev) 86 { 87 scsi_cmd_inquiry_t inquiry = { 88 .op_code = 0x12, 89 .lun_evpd = 0, 90 .page_code = 0, 91 .alloc_length = INQUIRY_RESPONSE_LENGTH, 92 .ctrl = 0 93 }; 94 size_t response_len; 95 uint8_t response[INQUIRY_RESPONSE_LENGTH]; 96 97 int rc; 98 99 rc = usb_massstor_data_in(GET_BULK_IN(dev), GET_BULK_OUT(dev), 100 0xDEADBEEF, 0, (uint8_t *) &inquiry, sizeof(inquiry), 101 response, INQUIRY_RESPONSE_LENGTH, &response_len); 102 103 if (rc != EOK) { 104 usb_log_error("Failed to probe device %s using %s: %s.\n", 105 dev->ddf_dev->name, "SCSI:INQUIRY", str_error(rc)); 106 return; 107 } 108 109 if (response_len < 8) { 110 usb_log_error("The SCSI response is too short.\n"); 111 return; 112 } 113 114 /* 115 * This is an ugly part of the code. We will parse the returned 116 * data by hand and try to get as many useful data as possible. 117 */ 118 int device_type = BITS_GET(uint8_t, response[0], 5, 0); 119 int removable = BITS_GET(uint8_t, response[1], 1, 7); 120 121 usb_log_info("SCSI information for device `%s':\n", dev->ddf_dev->name); 122 usb_log_info(" - peripheral device type: %d\n", device_type); 123 usb_log_info(" - removable: %s\n", removable ? "yes" : "no"); 124 125 if (response_len < 32) { 126 return; 127 } 128 129 char dev_vendor[9]; 130 str_ncpy(dev_vendor, 9, (const char *) &response[8], 8); 131 usb_log_info(" - vendor: '%s'\n", dev_vendor); 132 133 char dev_product[9]; 134 str_ncpy(dev_product, 9, (const char *) &response[16], 8); 135 usb_log_info(" - product: '%s'\n", dev_vendor); 136 } 137 77 138 /** Callback when new device is attached and recognized as a mass storage. 78 139 * … … 107 168 (size_t) dev->pipes[BULK_OUT_EP].descriptor->max_packet_size); 108 169 109 size_t lun_count = usb_masstor_get_lun_count(dev); 110 111 usb_massstor_inquiry_result_t inquiry; 112 rc = usb_massstor_inquiry(dev, BULK_IN_EP, BULK_OUT_EP, &inquiry); 113 if (rc != EOK) { 114 usb_log_warning("Failed to inquiry device `%s': %s.\n", 115 dev->ddf_dev->name, str_error(rc)); 116 return EOK; 117 } 118 119 usb_log_info("Mass storage `%s': " \ 120 "`%s' by `%s' is %s (%s), %zu LUN(s).\n", 121 dev->ddf_dev->name, 122 inquiry.product_and_revision, inquiry.vendor_id, 123 usb_str_masstor_scsi_peripheral_device_type(inquiry.peripheral_device_type), 124 inquiry.removable ? "removable" : "non-removable", 125 lun_count); 170 try_inquiry(dev); 126 171 127 172 return EOK; -
uspace/drv/usbmast/mast.c
r9e195e2c r456aea3 40 40 #include <str_error.h> 41 41 #include <usb/debug.h> 42 #include <usb/request.h>43 42 44 43 bool usb_mast_verbose = true; … … 64 63 * @return Error code. 65 64 */ 66 int usb_massstor_data_in(usb_device_t *dev, 67 size_t bulk_in_pipe_index, size_t bulk_out_pipe_index, 65 int usb_massstor_data_in(usb_pipe_t *bulk_in_pipe, usb_pipe_t *bulk_out_pipe, 68 66 uint32_t tag, uint8_t lun, void *cmd, size_t cmd_size, 69 67 void *in_buffer, size_t in_buffer_size, size_t *received_size) … … 71 69 int rc; 72 70 size_t act_size; 73 usb_pipe_t *bulk_in_pipe = dev->pipes[bulk_in_pipe_index].pipe;74 usb_pipe_t *bulk_out_pipe = dev->pipes[bulk_out_pipe_index].pipe;75 71 76 72 /* Prepare CBW - command block wrapper */ … … 139 135 } 140 136 141 /** Perform bulk-only mass storage reset.142 *143 * @param dev Device to be reseted.144 * @return Error code.145 */146 int usb_massstor_reset(usb_device_t *dev)147 {148 return usb_control_request_set(&dev->ctrl_pipe,149 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE,150 0xFF, 0, dev->interface_no, NULL, 0);151 }152 153 /** Perform complete reset recovery of bulk-only mass storage.154 *155 * Notice that no error is reported because if this fails, the error156 * would reappear on next transaction somehow.157 *158 * @param dev Device to be reseted.159 * @param bulk_in_idx Index of bulk in pipe.160 * @param bulk_out_idx Index of bulk out pipe.161 */162 void usb_massstor_reset_recovery(usb_device_t *dev,163 size_t bulk_in_idx, size_t bulk_out_idx)164 {165 /* We would ignore errors here because if this fails166 * we are doomed anyway and any following transaction would fail.167 */168 usb_massstor_reset(dev);169 usb_pipe_clear_halt(&dev->ctrl_pipe, dev->pipes[bulk_in_idx].pipe);170 usb_pipe_clear_halt(&dev->ctrl_pipe, dev->pipes[bulk_out_idx].pipe);171 }172 173 /** Get max LUN of a mass storage device.174 *175 * @see usb_masstor_get_lun_count176 *177 * @warning Error from this command does not necessarily indicate malfunction178 * of the device. Device does not need to support this request.179 * You shall rather use usb_masstor_get_lun_count.180 *181 * @param dev Mass storage device.182 * @return Error code of maximum LUN (index, not count).183 */184 int usb_massstor_get_max_lun(usb_device_t *dev)185 {186 uint8_t max_lun;187 size_t data_recv_len;188 int rc = usb_control_request_get(&dev->ctrl_pipe,189 USB_REQUEST_TYPE_CLASS, USB_REQUEST_RECIPIENT_INTERFACE,190 0xFE, 0, dev->interface_no, &max_lun, 1, &data_recv_len);191 if (rc != EOK) {192 return rc;193 }194 if (data_recv_len != 1) {195 return EEMPTY;196 }197 return (int) max_lun;198 }199 200 /** Get number of LUNs supported by mass storage device.201 *202 * @warning This function hides any error during the request203 * (typically that shall not be a problem).204 *205 * @param dev Mass storage device.206 * @return Number of LUNs.207 */208 size_t usb_masstor_get_lun_count(usb_device_t *dev)209 {210 int max_lun = usb_massstor_get_max_lun(dev);211 if (max_lun < 0) {212 max_lun = 1;213 } else {214 max_lun++;215 }216 217 return (size_t) max_lun;218 }219 220 137 /** 221 138 * @} -
uspace/drv/usbmast/mast.h
r9e195e2c r456aea3 40 40 #include <usb/usb.h> 41 41 #include <usb/pipes.h> 42 #include <usb/devdrv.h>43 42 44 /** Result of SCSI INQUIRY command. 45 * This is already parsed structure, not the original buffer returned by 46 * the device. 47 */ 48 typedef struct { 49 /** SCSI peripheral device type. */ 50 int peripheral_device_type; 51 /** Whether the device is removable. */ 52 bool removable; 53 /** Vendor ID string. */ 54 char vendor_id[9]; 55 /** Product ID and product revision string. */ 56 char product_and_revision[12]; 57 } usb_massstor_inquiry_result_t; 58 59 int usb_massstor_data_in(usb_device_t *dev, size_t, size_t, 60 uint32_t, uint8_t, void *, size_t, void *, size_t, size_t *); 61 int usb_massstor_reset(usb_device_t *); 62 void usb_massstor_reset_recovery(usb_device_t *, size_t, size_t); 63 int usb_massstor_get_max_lun(usb_device_t *); 64 size_t usb_masstor_get_lun_count(usb_device_t *); 65 int usb_massstor_inquiry(usb_device_t *, size_t, size_t, 66 usb_massstor_inquiry_result_t *); 67 const char *usb_str_masstor_scsi_peripheral_device_type(int); 43 int usb_massstor_data_in(usb_pipe_t *, usb_pipe_t *, uint32_t, uint8_t, 44 void *, size_t, void *, size_t, size_t *); 68 45 69 46 #endif -
uspace/drv/usbmid/Makefile
r9e195e2c r456aea3 28 28 29 29 USPACE_PREFIX = ../.. 30 31 LIBS = \ 32 $(LIBUSBDEV_PREFIX)/libusbdev.a \ 33 $(LIBUSB_PREFIX)/libusb.a \ 34 $(LIBDRV_PREFIX)/libdrv.a 35 EXTRA_CFLAGS += \ 36 -I$(LIBUSB_PREFIX)/include \ 37 -I$(LIBUSBDEV_PREFIX)/include \ 38 -I$(LIBDRV_PREFIX)/include 39 30 LIBS = $(LIBDRV_PREFIX)/libdrv.a $(LIBUSB_PREFIX)/libusb.a 31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -I$(LIBUSB_PREFIX)/include 40 32 BINARY = usbmid 41 33 -
uspace/drv/usbmouse/Makefile
r9e195e2c r456aea3 28 28 29 29 USPACE_PREFIX = ../.. 30 31 LIBS = \ 32 $(LIBUSBHID_PREFIX)/libusbhid.a \ 33 $(LIBUSBDEV_PREFIX)/libusbdev.a \ 34 $(LIBUSB_PREFIX)/libusb.a \ 35 $(LIBDRV_PREFIX)/libdrv.a 36 EXTRA_CFLAGS += \ 37 -I$(LIBUSB_PREFIX)/include \ 38 -I$(LIBUSBDEV_PREFIX)/include \ 39 -I$(LIBUSBHID_PREFIX)/include \ 40 -I$(LIBDRV_PREFIX)/include 30 LIBS = $(LIBDRV_PREFIX)/libdrv.a $(LIBUSB_PREFIX)/libusb.a 31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -I$(LIBUSB_PREFIX)/include -I. 41 32 42 33 BINARY = usbmouse -
uspace/drv/vhc/Makefile
r9e195e2c r456aea3 29 29 USPACE_PREFIX = ../.. 30 30 LIBS = \ 31 $(LIBUSBDEV_PREFIX)/libusbdev.a \32 $(LIBUSBHOST_PREFIX)/libusbhost.a \33 31 $(LIBUSB_PREFIX)/libusb.a \ 34 32 $(LIBUSBVIRT_PREFIX)/libusbvirt.a \ … … 36 34 EXTRA_CFLAGS += \ 37 35 -I$(LIBUSBVIRT_PREFIX)/include \ 38 -I$(LIBUSBDEV_PREFIX)/include \39 -I$(LIBUSBHOST_PREFIX)/include \40 36 -I$(LIBUSB_PREFIX)/include \ 41 37 -I$(LIBDRV_PREFIX)/include -
uspace/drv/vhc/connhost.c
r9e195e2c r456aea3 94 94 } 95 95 96 /** Find device handle by address interface function.97 *98 * @param[in] fun DDF function that was called.99 * @param[in] address Address in question.100 * @param[out] handle Where to store device handle if found.101 * @return Error code.102 */103 static int find_by_address(ddf_fun_t *fun, usb_address_t address,104 devman_handle_t *handle)105 {106 VHC_DATA(vhc, fun);107 bool found =108 usb_device_keeper_find_by_address(&vhc->dev_keeper, address, handle);109 return found ? EOK : ENOENT;110 }111 112 96 /** Release previously requested address. 113 97 * … … 460 444 .request_address = request_address, 461 445 .bind_address = bind_address, 462 .find_by_address = find_by_address,463 446 .release_address = release_address, 464 447 -
uspace/drv/vhc/main.c
r9e195e2c r456aea3 104 104 } 105 105 106 rc = ddf_fun_add_to_class(hc, USB_HC_DDF_CLASS_NAME); 107 if (rc != EOK) { 108 usb_log_fatal("Failed to add function to HC class: %s.\n", 109 str_error(rc)); 110 free(data); 111 return rc; 112 } 106 ddf_fun_add_to_class(hc, "usbhc"); 113 107 114 108 virtual_hub_device_init(hc); -
uspace/drv/vhc/transfer.c
r9e195e2c r456aea3 135 135 if (transfer->direction == USB_DIRECTION_IN) { 136 136 rc = usbvirt_ipc_send_control_read(phone, 137 transfer->endpoint, 137 138 transfer->setup_buffer, transfer->setup_buffer_size, 138 139 transfer->data_buffer, transfer->data_buffer_size, … … 141 142 assert(transfer->direction == USB_DIRECTION_OUT); 142 143 rc = usbvirt_ipc_send_control_write(phone, 144 transfer->endpoint, 143 145 transfer->setup_buffer, transfer->setup_buffer_size, 144 146 transfer->data_buffer, transfer->data_buffer_size); -
uspace/lib/c/generic/devman.c
r9e195e2c r456aea3 374 374 } 375 375 376 int devman_get_device_path(devman_handle_t handle, char *path, size_t path_size)377 {378 int phone = devman_get_phone(DEVMAN_CLIENT, 0);379 380 if (phone < 0)381 return phone;382 383 async_serialize_start();384 385 ipc_call_t answer;386 aid_t req = async_send_1(phone, DEVMAN_DEVICE_GET_DEVICE_PATH,387 handle, &answer);388 389 ipc_call_t data_request_call;390 aid_t data_request = async_data_read(phone, path, path_size,391 &data_request_call);392 if (data_request == 0) {393 async_wait_for(req, NULL);394 async_serialize_end();395 return ENOMEM;396 }397 398 sysarg_t data_request_rc;399 sysarg_t opening_request_rc;400 async_wait_for(data_request, &data_request_rc);401 async_wait_for(req, &opening_request_rc);402 403 async_serialize_end();404 405 if (data_request_rc != EOK) {406 /* Prefer the return code of the opening request. */407 if (opening_request_rc != EOK) {408 return (int) opening_request_rc;409 } else {410 return (int) data_request_rc;411 }412 }413 if (opening_request_rc != EOK) {414 return (int) opening_request_rc;415 }416 417 path[path_size - 1] = 0;418 419 if (IPC_GET_ARG2(data_request_call) >= path_size) {420 return ELIMIT;421 }422 423 return EOK;424 }425 426 376 427 377 /** @} -
uspace/lib/c/include/devman.h
r9e195e2c r456aea3 55 55 extern int devman_device_get_handle_by_class(const char *, const char *, 56 56 devman_handle_t *, unsigned int); 57 extern int devman_get_device_path(devman_handle_t, char *, size_t);58 57 59 58 extern int devman_add_device_to_class(devman_handle_t, const char *); -
uspace/lib/c/include/ipc/devman.h
r9e195e2c r456aea3 149 149 typedef enum { 150 150 DEVMAN_DEVICE_GET_HANDLE = IPC_FIRST_USER_METHOD, 151 DEVMAN_DEVICE_GET_HANDLE_BY_CLASS, 152 DEVMAN_DEVICE_GET_DEVICE_PATH 151 DEVMAN_DEVICE_GET_HANDLE_BY_CLASS 153 152 } client_to_devman_t; 154 153 -
uspace/lib/drv/generic/remote_usbhc.c
r9e195e2c r456aea3 52 52 static void remote_usbhc_request_address(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 53 53 static void remote_usbhc_bind_address(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 54 static void remote_usbhc_find_by_address(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *);55 54 static void remote_usbhc_release_address(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); 56 55 static void remote_usbhc_register_endpoint(ddf_fun_t *, void *, ipc_callid_t, ipc_call_t *); … … 62 61 remote_usbhc_request_address, 63 62 remote_usbhc_bind_address, 64 remote_usbhc_find_by_address,65 63 remote_usbhc_release_address, 66 64 … … 165 163 } 166 164 167 void remote_usbhc_find_by_address(ddf_fun_t *fun, void *iface,168 ipc_callid_t callid, ipc_call_t *call)169 {170 usbhc_iface_t *usb_iface = (usbhc_iface_t *) iface;171 172 if (!usb_iface->find_by_address) {173 async_answer_0(callid, ENOTSUP);174 return;175 }176 177 usb_address_t address = (usb_address_t) DEV_IPC_GET_ARG1(*call);178 devman_handle_t handle;179 int rc = usb_iface->find_by_address(fun, address, &handle);180 181 if (rc == EOK) {182 async_answer_1(callid, EOK, handle);183 } else {184 async_answer_0(callid, rc);185 }186 }187 188 165 void remote_usbhc_release_address(ddf_fun_t *fun, void *iface, 189 166 ipc_callid_t callid, ipc_call_t *call) … … 325 302 async_transaction_t *trans = async_transaction_create(callid); 326 303 if (trans == NULL) { 327 async_answer_0(data_callid, ENOMEM);328 304 async_answer_0(callid, ENOMEM); 329 305 return; … … 338 314 339 315 if (rc != EOK) { 340 async_answer_0(data_callid, rc);341 316 async_answer_0(callid, rc); 342 317 async_transaction_destroy(trans); … … 485 460 async_transaction_t *trans = async_transaction_create(callid); 486 461 if (trans == NULL) { 487 async_answer_0(data_callid, ENOMEM);488 462 async_answer_0(callid, ENOMEM); 489 463 free(setup_packet); … … 495 469 trans->buffer = malloc(data_len); 496 470 if (trans->buffer == NULL) { 497 async_answer_0(data_callid, ENOMEM);498 471 async_answer_0(callid, ENOMEM); 499 472 async_transaction_destroy(trans); … … 507 480 508 481 if (rc != EOK) { 509 async_answer_0(data_callid, rc);510 482 async_answer_0(callid, rc); 511 483 async_transaction_destroy(trans); -
uspace/lib/drv/include/usb_iface.h
r9e195e2c r456aea3 49 49 * - arbitrary error code if returned by remote implementation 50 50 * - EOK - handle found, first parameter contains the USB address 51 *52 * The handle must be the one used for binding USB address with53 * it (IPC_M_USBHC_BIND_ADDRESS), otherwise the host controller54 * (that this request would eventually reach) would not be able55 * to find it.56 * The problem is that this handle is actually assigned to the57 * function inside driver of the parent device (usually hub driver).58 * To bypass this problem, the initial caller specify handle as59 * zero and the first parent assigns the actual value.60 * See usb_iface_get_address_hub_child_impl() implementation61 * that could be assigned to device ops of a child device of in a62 * hub driver.63 * For example, the USB multi interface device driver (MID)64 * passes this initial zero without any modification because the65 * handle must be resolved by its parent.66 51 */ 67 52 IPC_M_USB_GET_ADDRESS, -
uspace/lib/drv/include/usbhc_iface.h
r9e195e2c r456aea3 105 105 IPC_M_USBHC_BIND_ADDRESS, 106 106 107 /** Get handle binded with given USB address.108 * Parameters109 * - USB address110 * Answer:111 * - EOK - address binded, first parameter is the devman handle112 * - ENOENT - address is not in use at the moment113 */114 IPC_M_USBHC_GET_HANDLE_BY_ADDRESS,115 116 107 /** Release address in use. 117 108 * Arguments: … … 216 207 int (*request_address)(ddf_fun_t *, usb_speed_t, usb_address_t *); 217 208 int (*bind_address)(ddf_fun_t *, usb_address_t, devman_handle_t); 218 int (*find_by_address)(ddf_fun_t *, usb_address_t, devman_handle_t *);219 209 int (*release_address)(ddf_fun_t *, usb_address_t); 220 210 -
uspace/lib/usb/Makefile
r9e195e2c r456aea3 29 29 USPACE_PREFIX = ../.. 30 30 LIBRARY = libusb 31 EXTRA_CFLAGS += \ 32 -I$(LIBDRV_PREFIX)/include \ 33 -Iinclude 31 LIBS = $(LIBDRV_PREFIX)/libdrv.a 32 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -Iinclude 34 33 35 34 SOURCES = \ 35 src/addrkeep.c \ 36 src/altiface.c \ 36 37 src/class.c \ 37 38 src/ddfiface.c \ 38 39 src/debug.c \ 39 src/driver.c \ 40 src/devdrv.c \ 41 src/devpoll.c \ 42 src/dp.c \ 40 43 src/dump.c \ 41 src/host.c \ 42 src/usb.c 44 src/hidiface.c \ 45 src/hidpath.c \ 46 src/hidparser.c \ 47 src/hiddescriptor.c \ 48 src/hub.c \ 49 src/pipepriv.c \ 50 src/pipes.c \ 51 src/pipesinit.c \ 52 src/pipesio.c \ 53 src/recognise.c \ 54 src/request.c \ 55 src/usb.c \ 56 src/usbdevice.c \ 57 src/hidreq.c \ 58 src/hidreport.c \ 59 src/host/device_keeper.c \ 60 src/host/batch.c \ 61 src/host/endpoint.c \ 62 src/host/usb_endpoint_manager.c 43 63 44 64 include $(USPACE_PREFIX)/Makefile.common -
uspace/lib/usb/include/usb/ddfiface.h
r9e195e2c r456aea3 37 37 38 38 #include <sys/types.h> 39 #include <usb/usbdevice.h> 39 40 #include <usb_iface.h> 40 41 -
uspace/lib/usb/include/usb/descriptor.h
r9e195e2c r456aea3 167 167 } __attribute__ ((packed)) usb_standard_endpoint_descriptor_t; 168 168 169 /** Part of standard USB HID descriptor specifying one class descriptor.170 *171 * (See HID Specification, p.22)172 */173 typedef struct {174 /** Type of class-specific descriptor (Report or Physical). */175 uint8_t type;176 /** Length of class-specific descriptor in bytes. */177 uint16_t length;178 } __attribute__ ((packed)) usb_standard_hid_class_descriptor_info_t;179 180 /** Standard USB HID descriptor.181 *182 * (See HID Specification, p.22)183 *184 * It is actually only the "header" of the descriptor, it does not contain185 * the last two mandatory fields (type and length of the first class-specific186 * descriptor).187 */188 typedef struct {189 /** Total size of this descriptor in bytes.190 *191 * This includes all class-specific descriptor info - type + length192 * for each descriptor.193 */194 uint8_t length;195 /** Descriptor type (USB_DESCTYPE_HID). */196 uint8_t descriptor_type;197 /** HID Class Specification release. */198 uint16_t spec_release;199 /** Country code of localized hardware. */200 uint8_t country_code;201 /** Total number of class-specific (i.e. Report and Physical)202 * descriptors.203 *204 * @note There is always only one Report descriptor.205 */206 uint8_t class_desc_count;207 /** First mandatory class descriptor (Report) info. */208 usb_standard_hid_class_descriptor_info_t report_desc_info;209 } __attribute__ ((packed)) usb_standard_hid_descriptor_t;210 211 169 #endif 212 170 /** -
uspace/lib/usb/include/usb/usb.h
r9e195e2c r456aea3 172 172 } usb_packet_id; 173 173 174 /** Class name for USB host controllers. */175 #define USB_HC_DDF_CLASS_NAME "usbhc"176 177 174 #endif 178 175 /** -
uspace/lib/usb/src/ddfiface.c
r9e195e2c r456aea3 37 37 #include <async.h> 38 38 #include <usb/ddfiface.h> 39 #include <usb/driver.h>40 39 #include <usb/debug.h> 41 40 #include <errno.h> -
uspace/lib/usb/src/dump.c
r9e195e2c r456aea3 41 41 #include <usb/descriptor.h> 42 42 #include <usb/classes/classes.h> 43 #include <usb/classes/hid.h> 43 44 44 45 /** Mapping between descriptor id and dumping function. */ -
uspace/lib/usbvirt/Makefile
r9e195e2c r456aea3 30 30 LIBRARY = libusbvirt 31 31 32 EXTRA_CFLAGS = \ 33 -I$(LIBDRV_PREFIX)/include \ 34 -I$(LIBUSB_PREFIX)/include \ 35 -I$(LIBUSBDEV_PREFIX)/include \ 36 -Iinclude 32 EXTRA_CFLAGS = -I$(LIBUSB_PREFIX)/include -I$(LIBDRV_PREFIX)/include -Iinclude 37 33 38 34 SOURCES = \ 35 src/ipc.c \ 39 36 src/ctrltransfer.c \ 40 src/device.c \41 src/ipc_dev.c \42 src/ipc_hc.c \43 37 src/stdreq.c \ 44 38 src/transfer.c -
uspace/lib/usbvirt/include/usbvirt/device.h
r9e195e2c r456aea3 31 31 */ 32 32 /** @file 33 * Virtual USB device.33 * @brief Virtual USB device. 34 34 */ 35 35 #ifndef LIBUSBVIRT_DEVICE_H_ … … 39 39 #include <usb/request.h> 40 40 41 /** Maximum number of endpoints supported by virtual USB. */42 41 #define USBVIRT_ENDPOINT_MAX 16 43 42 44 43 typedef struct usbvirt_device usbvirt_device_t; 45 44 46 /** Callback for data to device (OUT transaction). 47 * 48 * @param dev Virtual device to which the transaction belongs. 49 * @param endpoint Target endpoint number. 50 * @param transfer_type Transfer type. 51 * @param buffer Data buffer. 52 * @param buffer_size Size of the buffer in bytes. 53 * @return Error code. 54 */ 55 typedef int (*usbvirt_on_data_to_device_t)(usbvirt_device_t *dev, 56 usb_endpoint_t endpoint, usb_transfer_type_t transfer_type, 57 void *buffer, size_t buffer_size); 45 typedef int (*usbvirt_on_data_to_device_t)(usbvirt_device_t *, usb_endpoint_t, 46 usb_transfer_type_t, void *, size_t); 47 typedef int (*usbvirt_on_data_from_device_t)(usbvirt_device_t *, usb_endpoint_t, 48 usb_transfer_type_t, void *, size_t, size_t *); 49 typedef int (*usbvirt_on_control_t)(usbvirt_device_t *, 50 const usb_device_request_setup_packet_t *, uint8_t *, size_t *); 58 51 59 /** Callback for data from device (IN transaction).60 *61 * @param dev Virtual device to which the transaction belongs.62 * @param endpoint Target endpoint number.63 * @param transfer_type Transfer type.64 * @param buffer Data buffer to write answer to.65 * @param buffer_size Size of the buffer in bytes.66 * @param act_buffer_size Write here how many bytes were actually written.67 * @return Error code.68 */69 typedef int (*usbvirt_on_data_from_device_t)(usbvirt_device_t *dev,70 usb_endpoint_t endpoint, usb_transfer_type_t transfer_type,71 void *buffer, size_t buffer_size, size_t *act_buffer_size);72 73 /** Callback for control transfer on endpoint zero.74 *75 * Notice that size of the data buffer is expected to be read from the76 * setup packet.77 *78 * @param dev Virtual device to which the transaction belongs.79 * @param setup_packet Standard setup packet.80 * @param data Data (might be NULL).81 * @param act_data_size Size of returned data in bytes.82 * @return Error code.83 */84 typedef int (*usbvirt_on_control_t)(usbvirt_device_t *dev,85 const usb_device_request_setup_packet_t *setup_packet,86 uint8_t *data, size_t *act_data_size);87 88 /** Callback for control request on a virtual USB device.89 *90 * See usbvirt_control_reply_helper() for simple way of answering91 * control read requests.92 */93 52 typedef struct { 94 /** Request direction (in or out). */95 53 usb_direction_t req_direction; 96 /** Request recipient (device, interface or endpoint). */97 54 usb_request_recipient_t req_recipient; 98 /** Request type (standard, class or vendor). */99 55 usb_request_type_t req_type; 100 /** Actual request code. */101 56 uint8_t request; 102 /** Request handler name for debugging purposes. */103 57 const char *name; 104 /** Callback to be executed on matching request. */105 58 usbvirt_on_control_t callback; 106 59 } usbvirt_control_request_handler_t; … … 124 77 } usbvirt_device_configuration_t; 125 78 126 /** Standard USB descriptors for virtual device. */79 /** Standard USB descriptors. */ 127 80 typedef struct { 128 81 /** Standard device descriptor. … … 149 102 } usbvirt_device_state_t; 150 103 151 /** Ops structure for virtual USB device. */152 104 typedef struct { 153 /** Callbacks for data to device.154 * Index zero is ignored.155 */156 105 usbvirt_on_data_to_device_t data_out[USBVIRT_ENDPOINT_MAX]; 157 /** Callbacks for data from device.158 * Index zero is ignored.159 */160 106 usbvirt_on_data_from_device_t data_in[USBVIRT_ENDPOINT_MAX]; 161 /** Array of control handlers.162 * Last handler is expected to have the @c callback field set to NULL163 */164 107 usbvirt_control_request_handler_t *control; 165 /** Callback when device changes state.166 *167 * The value of @c state attribute of @p dev device is not168 * defined during call of this function.169 *170 * @param dev The virtual USB device.171 * @param old_state Old device state.172 * @param new_state New device state.173 */174 108 void (*state_changed)(usbvirt_device_t *dev, 175 109 usbvirt_device_state_t old_state, usbvirt_device_state_t new_state); 176 110 } usbvirt_device_ops_t; 177 111 178 /** Virtual USB device. */179 112 struct usbvirt_device { 180 /** Name for debugging purposes. */181 113 const char *name; 182 /** Custom device data. */183 114 void *device_data; 184 /** Device ops. */185 115 usbvirt_device_ops_t *ops; 186 /** Device descriptors. */187 116 usbvirt_descriptors_t *descriptors; 188 /** Current device address.189 * You shall treat this field as read only in your code.190 */191 117 usb_address_t address; 192 /** Current device state.193 * You shall treat this field as read only in your code.194 */195 118 usbvirt_device_state_t state; 196 /** Phone to the host controller.197 * You shall treat this field as read only in your code.198 */199 int vhc_phone;200 119 }; 201 120 202 121 int usbvirt_device_plug(usbvirt_device_t *, const char *); 203 void usbvirt_device_unplug(usbvirt_device_t *);204 122 205 123 void usbvirt_control_reply_helper(const usb_device_request_setup_packet_t *, -
uspace/lib/usbvirt/include/usbvirt/ipc.h
r9e195e2c r456aea3 1 1 /* 2 * Copyright (c) 201 1Vojtech Horky2 * Copyright (c) 2010 Vojtech Horky 3 3 * All rights reserved. 4 4 * … … 31 31 */ 32 32 /** @file 33 * IPC wrappers for virtual USB.33 * @brief Virtual USB device. 34 34 */ 35 35 #ifndef LIBUSBVIRT_IPC_H_ … … 40 40 #include <bool.h> 41 41 42 /** IPC methods communication between host controller and virtual device. */43 42 typedef enum { 44 43 IPC_M_USBVIRT_GET_NAME = IPC_FIRST_USER_METHOD + 80, … … 46 45 IPC_M_USBVIRT_CONTROL_WRITE, 47 46 IPC_M_USBVIRT_INTERRUPT_IN, 48 IPC_M_USBVIRT_INTERRUPT_OUT, 49 IPC_M_USBVIRT_BULK_IN, 50 IPC_M_USBVIRT_BULK_OUT 51 } usbvirt_hc_to_device_method_t; 47 IPC_M_USBVIRT_INTERRUPT_OUT 48 } usbvirt_ipc_t; 52 49 53 int usbvirt_ipc_send_control_read(int, void *, size_t,50 int usbvirt_ipc_send_control_read(int, usb_endpoint_t, void *, size_t, 54 51 void *, size_t, size_t *); 55 int usbvirt_ipc_send_control_write(int, void *, size_t,52 int usbvirt_ipc_send_control_write(int, usb_endpoint_t, void *, size_t, 56 53 void *, size_t); 57 54 int usbvirt_ipc_send_data_in(int, usb_endpoint_t, usb_transfer_type_t, -
uspace/lib/usbvirt/src/ctrltransfer.c
r9e195e2c r456aea3 1 /*2 * Copyright (c) 2011 Vojtech Horky3 * All rights reserved.4 *5 * Redistribution and use in source and binary forms, with or without6 * modification, are permitted provided that the following conditions7 * are met:8 *9 * - Redistributions of source code must retain the above copyright10 * notice, this list of conditions and the following disclaimer.11 * - Redistributions in binary form must reproduce the above copyright12 * notice, this list of conditions and the following disclaimer in the13 * documentation and/or other materials provided with the distribution.14 * - The name of the author may not be used to endorse or promote products15 * derived from this software without specific prior written permission.16 *17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.27 */28 29 /** @addtogroup libusbvirt30 * @{31 */32 /** @file33 * Control transfer handling.34 */35 1 #include "private.h" 36 2 #include <usb/request.h> … … 39 5 #include <errno.h> 40 6 41 /** Find and execute control transfer handler for virtual USB device.42 *43 * @param dev Target virtual device.44 * @param control_handlers Array of control request handlers.45 * @param setup Setup packet.46 * @param data Extra data.47 * @param data_sent_size Size of extra data in bytes.48 * @return Error code.49 * @retval EFORWARD No suitable handler found.50 */51 7 int process_control_transfer(usbvirt_device_t *dev, 52 8 usbvirt_control_request_handler_t *control_handlers, … … 96 52 return EFORWARD; 97 53 } 98 99 100 /**101 * @}102 */ -
uspace/lib/usbvirt/src/private.h
r9e195e2c r456aea3 1 /*2 * Copyright (c) 2011 Vojtech Horky3 * All rights reserved.4 *5 * Redistribution and use in source and binary forms, with or without6 * modification, are permitted provided that the following conditions7 * are met:8 *9 * - Redistributions of source code must retain the above copyright10 * notice, this list of conditions and the following disclaimer.11 * - Redistributions in binary form must reproduce the above copyright12 * notice, this list of conditions and the following disclaimer in the13 * documentation and/or other materials provided with the distribution.14 * - The name of the author may not be used to endorse or promote products15 * derived from this software without specific prior written permission.16 *17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.27 */28 29 /** @addtogroup libusbvirt30 * @{31 */32 /** @file33 * Private definitions.34 */35 #ifndef USBVIRT_PRIVATE_H_36 #define USBVIRT_PRIVATE_H_37 38 1 #include <usbvirt/device.h> 39 2 … … 44 7 45 8 extern usbvirt_control_request_handler_t library_handlers[]; 46 47 #endif48 /**49 * @}50 */ -
uspace/lib/usbvirt/src/stdreq.c
r9e195e2c r456aea3 1 /*2 * Copyright (c) 2011 Vojtech Horky3 * All rights reserved.4 *5 * Redistribution and use in source and binary forms, with or without6 * modification, are permitted provided that the following conditions7 * are met:8 *9 * - Redistributions of source code must retain the above copyright10 * notice, this list of conditions and the following disclaimer.11 * - Redistributions in binary form must reproduce the above copyright12 * notice, this list of conditions and the following disclaimer in the13 * documentation and/or other materials provided with the distribution.14 * - The name of the author may not be used to endorse or promote products15 * derived from this software without specific prior written permission.16 *17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.27 */28 29 /** @addtogroup libusbvirt30 * @{31 */32 /** @file33 * Standard control request handlers.34 */35 1 #include "private.h" 36 2 #include <usb/request.h> … … 38 4 #include <errno.h> 39 5 40 /** Helper for replying to control read transfer from virtual USB device.41 *42 * This function takes care of copying data to answer buffer taking care43 * of buffer sizes properly.44 *45 * @param setup_packet The setup packet.46 * @param data Data buffer to write to.47 * @param act_size Where to write actual size of returned data.48 * @param actual_data Data to be returned.49 * @param actual_data_size Size of answer data (@p actual_data) in bytes.50 */51 6 void usbvirt_control_reply_helper(const usb_device_request_setup_packet_t *setup_packet, 52 7 uint8_t *data, size_t *act_size, … … 189 144 } 190 145 191 /** Standard request handlers. */192 146 usbvirt_control_request_handler_t library_handlers[] = { 193 147 { … … 219 173 }; 220 174 221 /**222 * @}223 */ -
uspace/lib/usbvirt/src/transfer.c
r9e195e2c r456aea3 31 31 */ 32 32 /** @file 33 * Transfer handling.33 * 34 34 */ 35 35 #include <usbvirt/device.h> … … 39 39 #include "private.h" 40 40 41 /** Process a control transfer to the virtual USB device.42 *43 * @param dev Target device.44 * @param setup Setup packet data.45 * @param setup_size Size of setup packet.46 * @param data Extra data (DATA stage).47 * @param data_size Size of extra data in bytes.48 * @param data_size_sent Number of actually send bytes during the transfer49 * (only used for READ transfers).50 * @return Error code.51 */52 41 static int usbvirt_control_transfer(usbvirt_device_t *dev, 53 42 void *setup, size_t setup_size, … … 89 78 } 90 79 91 /** Issue a control write transfer to virtual USB device.92 *93 * @see usbvirt_control_transfer94 *95 * @param dev Target virtual device.96 * @param setup Setup data.97 * @param setup_size Size of setup packet.98 * @param data Extra data (DATA stage).99 * @param data_size Size of extra data buffer in bytes.100 * @return Error code.101 */102 80 int usbvirt_control_write(usbvirt_device_t *dev, void *setup, size_t setup_size, 103 81 void *data, size_t data_size) … … 107 85 } 108 86 109 /** Issue a control read transfer to virtual USB device.110 *111 * @see usbvirt_control_transfer112 *113 * @param dev Target virtual device.114 * @param setup Setup data.115 * @param setup_size Size of setup packet.116 * @param data Extra data (DATA stage).117 * @param data_size Size of extra data buffer in bytes.118 * @param data_size_sent Number of actually send bytes during the transfer.119 * @return Error code.120 */121 87 int usbvirt_control_read(usbvirt_device_t *dev, void *setup, size_t setup_size, 122 88 void *data, size_t data_size, size_t *data_size_sent) … … 126 92 } 127 93 128 /** Send data to virtual USB device.129 *130 * @param dev Target virtual device.131 * @param transf_type Transfer type (interrupt, bulk).132 * @param endpoint Endpoint number.133 * @param data Data sent from the driver to the device.134 * @param data_size Size of the @p data buffer in bytes.135 * @return Error code.136 */137 94 int usbvirt_data_out(usbvirt_device_t *dev, usb_transfer_type_t transf_type, 138 95 usb_endpoint_t endpoint, void *data, size_t data_size) … … 151 108 } 152 109 153 /** Request data from virtual USB device.154 *155 * @param dev Target virtual device.156 * @param transf_type Transfer type (interrupt, bulk).157 * @param endpoint Endpoint number.158 * @param data Where to stored data the device returns to the driver.159 * @param data_size Size of the @p data buffer in bytes.160 * @param data_size_sent Number of actually written bytes.161 * @return Error code.162 */163 110 int usbvirt_data_in(usbvirt_device_t *dev, usb_transfer_type_t transf_type, 164 111 usb_endpoint_t endpoint, void *data, size_t data_size, size_t *data_size_sent) -
uspace/srv/devman/main.c
r9e195e2c r456aea3 515 515 } 516 516 517 /** Find device path by its handle. */518 static void devman_get_device_path_by_handle(ipc_callid_t iid,519 ipc_call_t *icall)520 {521 devman_handle_t handle = IPC_GET_ARG1(*icall);522 523 fun_node_t *fun = find_fun_node(&device_tree, handle);524 if (fun == NULL) {525 async_answer_0(iid, ENOMEM);526 return;527 }528 529 ipc_callid_t data_callid;530 size_t data_len;531 if (!async_data_read_receive(&data_callid, &data_len)) {532 async_answer_0(iid, EINVAL);533 return;534 }535 536 void *buffer = malloc(data_len);537 if (buffer == NULL) {538 async_answer_0(data_callid, ENOMEM);539 async_answer_0(iid, ENOMEM);540 return;541 }542 543 size_t sent_length = str_size(fun->pathname);544 if (sent_length > data_len) {545 sent_length = data_len;546 }547 548 async_data_read_finalize(data_callid, fun->pathname, sent_length);549 async_answer_0(iid, EOK);550 551 free(buffer);552 }553 554 517 555 518 /** Function for handling connections from a client to the device manager. */ … … 573 536 case DEVMAN_DEVICE_GET_HANDLE_BY_CLASS: 574 537 devman_function_get_handle_by_class(callid, &call); 575 break;576 case DEVMAN_DEVICE_GET_DEVICE_PATH:577 devman_get_device_path_by_handle(callid, &call);578 538 break; 579 539 default:
Note:
See TracChangeset
for help on using the changeset viewer.