Changeset 79e1abd in mainline
- Timestamp:
- 2011-03-29T12:09:15Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- d012590
- Parents:
- 841e6e5 (diff), 51e5608 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - Files:
-
- 4 added
- 3 deleted
- 54 edited
Legend:
- Unmodified
- Added
- Removed
-
HelenOS.config
r841e6e5 r79e1abd 417 417 ! [(CONFIG_HID_IN=generic|CONFIG_HID_IN=keyboard)&PLATFORM=ia64&MACHINE=i460GX] CONFIG_PC_KBD (y/n) 418 418 419 % PC keyboard support 420 ! [(CONFIG_HID_IN=generic|CONFIG_HID_IN=keyboard)&PLATFORM=arm32&MACHINE=integratorcp] CONFIG_PC_KBD (y/n) 421 419 422 % Support for msim/GXemul keyboard 420 423 ! [CONFIG_HID_IN=generic&PLATFORM=mips32] CONFIG_MIPS_KBD (y/n) … … 554 557 % Polling UHCI & OHCI (no interrupts) 555 558 ! [PLATFORM=ia32|PLATFORM=amd64] CONFIG_USBHC_NO_INTERRUPTS (y/n) 559 560 % Run devman in kconsole (not recommended) 561 ! CONFIG_DEVMAN_EARLY_LAUNCH (n/y) 562 -
kernel/arch/arm32/src/mach/integratorcp/integratorcp.c
r841e6e5 r79e1abd 292 292 .y = 480, 293 293 .scan = 2560, 294 .visual = VISUAL_ BGR_0_8_8_8,294 .visual = VISUAL_RGB_8_8_8_0, 295 295 }; 296 296 -
kernel/arch/mips32/include/cp0.h
r841e6e5 r79e1abd 70 70 { \ 71 71 uint32_t retval; \ 72 asm ("mfc0 %0, $" #reg : "=r"(retval)); \72 asm volatile ("mfc0 %0, $" #reg : "=r"(retval)); \ 73 73 return retval; \ 74 74 } … … 76 76 #define GEN_WRITE_CP0(nm,reg) static inline void cp0_ ##nm##_write(uint32_t val) \ 77 77 { \ 78 asm ("mtc0 %0, $" #reg : : "r"(val) ); \78 asm volatile ("mtc0 %0, $" #reg : : "r"(val) ); \ 79 79 } 80 80 -
kernel/arch/sparc64/src/smp/sun4v/smp.c
r841e6e5 r79e1abd 1 1 /* 2 2 * Copyright (c) 2006 Jakub Jermar 3 * Copyright (c) 2009 Pavel Rimsky 3 * Copyright (c) 2009 Pavel Rimsky 4 4 * All rights reserved. 5 5 * … … 439 439 if (waitq_sleep_timeout(&ap_completion_wq, 10000000, SYNCH_FLAGS_NONE) == 440 440 ESYNCH_TIMEOUT) 441 printf("%s: waiting for processor (cpuid = %" PRIu 32") timed out\n",441 printf("%s: waiting for processor (cpuid = %" PRIu64 ") timed out\n", 442 442 __func__, cpuid); 443 443 -
kernel/arch/sparc64/src/sun4v/start.S
r841e6e5 r79e1abd 296 296 * Create the first stack frame. 297 297 */ 298 save %sp, -(STACK_WIND WO_SAVE_AREA_SIZE + STACK_ARG_SAVE_AREA_SIZE), %sp298 save %sp, -(STACK_WINDOW_SAVE_AREA_SIZE + STACK_ARG_SAVE_AREA_SIZE), %sp 299 299 flushw 300 300 add %g0, -STACK_BIAS, %fp -
kernel/arch/sparc64/src/trap/sun4v/interrupt.c
r841e6e5 r79e1abd 111 111 ((void (*)(void)) data1)(); 112 112 } else { 113 printf("Spurious interrupt on % d, data = %" PRIx64 ".\n",113 printf("Spurious interrupt on %" PRIu64 ", data = %" PRIx64 ".\n", 114 114 CPU->arch.id, data1); 115 115 } -
kernel/genarch/Makefile.inc
r841e6e5 r79e1abd 122 122 endif 123 123 124 ifeq ($(CONFIG_PL050),y)125 GENARCH_SOURCES += \126 genarch/src/kbrd/kbrd_pl050.c \127 genarch/src/kbrd/scanc_pl050.c128 endif129 130 124 ifeq ($(CONFIG_MAC_KBD),y) 131 125 GENARCH_SOURCES += \ -
kernel/generic/src/console/console.c
r841e6e5 r79e1abd 53 53 #include <str.h> 54 54 55 /* 56 * devman produces a lot of output and by giving so many pages 57 * we to allow /app/klog to catch-up. 58 */ 59 #ifdef CONFIG_DEVMAN_EARLY_LAUNCH 60 #define KLOG_PAGES 64 61 #else 55 62 #define KLOG_PAGES 4 63 #endif 64 56 65 #define KLOG_LENGTH (KLOG_PAGES * PAGE_SIZE / sizeof(wchar_t)) 57 66 #define KLOG_LATENCY 8 -
kernel/generic/src/mm/as.c
r841e6e5 r79e1abd 1949 1949 sysarg_t sys_as_area_create(uintptr_t address, size_t size, unsigned int flags) 1950 1950 { 1951 if (as_area_create(AS, flags | AS_AREA_CACHEABLE, size, address,1951 if (as_area_create(AS, flags, size, address, 1952 1952 AS_AREA_ATTR_NONE, &anon_backend, NULL)) 1953 1953 return (sysarg_t) address; -
uspace/app/bdsh/cmds/modules/cat/cat.c
r841e6e5 r79e1abd 1 1 /* Copyright (c) 2008, Tim Post <tinkertim@gmail.com> 2 * Copyright (c) 2011, Martin Sucha 2 3 * All rights reserved. 3 4 * … … 35 36 #include <str.h> 36 37 #include <fcntl.h> 38 #include <io/console.h> 39 #include <io/color.h> 40 #include <io/style.h> 41 #include <io/keycode.h> 42 #include <errno.h> 43 #include <vfs/vfs.h> 44 #include <assert.h> 37 45 38 46 #include "config.h" … … 48 56 49 57 static const char *cat_oops = "That option is not yet supported\n"; 58 static const char *hexchars = "0123456789abcdef"; 59 60 static bool paging_enabled = false; 61 static size_t chars_remaining = 0; 62 static size_t lines_remaining = 0; 63 static sysarg_t console_cols = 0; 64 static sysarg_t console_rows = 0; 65 static bool should_quit = false; 50 66 51 67 static struct option const long_options[] = { … … 56 72 { "buffer", required_argument, 0, 'b' }, 57 73 { "more", no_argument, 0, 'm' }, 74 { "hex", no_argument, 0, 'x' }, 58 75 { 0, 0, 0, 0 } 59 76 }; … … 75 92 " -b, --buffer ## Set the read buffer size to ##\n" 76 93 " -m, --more Pause after each screen full\n" 94 " -x, --hex Print bytes as hex values\n" 77 95 "Currently, %s is under development, some options don't work.\n", 78 96 cmdname, cmdname); … … 82 100 } 83 101 84 static unsigned int cat_file(const char *fname, size_t blen) 102 static void waitprompt() 103 { 104 console_set_pos(fphone(stdout), 0, console_rows-1); 105 console_set_color(fphone(stdout), COLOR_BLUE, COLOR_WHITE, 0); 106 printf("ENTER/SPACE/PAGE DOWN - next page, " 107 "ESC/Q - quit, C - continue unpaged"); 108 fflush(stdout); 109 console_set_style(fphone(stdout), STYLE_NORMAL); 110 } 111 112 static void waitkey() 113 { 114 console_event_t ev; 115 116 while (true) { 117 if (!console_get_event(fphone(stdin), &ev)) { 118 return; 119 } 120 if (ev.type == KEY_PRESS) { 121 if (ev.key == KC_ESCAPE || ev.key == KC_Q) { 122 should_quit = true; 123 return; 124 } 125 if (ev.key == KC_C) { 126 paging_enabled = false; 127 return; 128 } 129 if (ev.key == KC_ENTER || ev.key == KC_SPACE || 130 ev.key == KC_PAGE_DOWN) { 131 return; 132 } 133 } 134 } 135 assert(false); 136 } 137 138 static void newpage() 139 { 140 console_clear(fphone(stdout)); 141 chars_remaining = console_cols; 142 lines_remaining = console_rows-1; 143 } 144 145 static void paged_char(wchar_t c) 146 { 147 putchar(c); 148 if (paging_enabled) { 149 chars_remaining--; 150 if (c == '\n' || chars_remaining == 0) { 151 chars_remaining = console_cols; 152 lines_remaining--; 153 } 154 if (lines_remaining == 0) { 155 fflush(stdout); 156 waitprompt(); 157 waitkey(); 158 newpage(); 159 } 160 } 161 } 162 163 static unsigned int cat_file(const char *fname, size_t blen, bool hex) 85 164 { 86 165 int fd, bytes = 0, count = 0, reads = 0; 87 166 off64_t total = 0; 88 167 char *buff = NULL; 168 int i; 169 size_t offset = 0; 89 170 90 171 fd = open(fname, O_RDONLY); … … 109 190 count += bytes; 110 191 buff[bytes] = '\0'; 111 printf("%s", buff); 192 offset = 0; 193 for (i = 0; i < bytes && !should_quit; i++) { 194 if (hex) { 195 paged_char(hexchars[((uint8_t)buff[i])/16]); 196 paged_char(hexchars[((uint8_t)buff[i])%16]); 197 } 198 else { 199 wchar_t c = str_decode(buff, &offset, bytes); 200 if (c == 0) { 201 // reached end of string 202 break; 203 } 204 paged_char(c); 205 } 206 207 } 112 208 reads++; 113 209 } 114 } while (bytes > 0 );210 } while (bytes > 0 && !should_quit); 115 211 116 212 close(fd); … … 131 227 unsigned int argc, i, ret = 0, buffer = 0; 132 228 int c, opt_ind; 229 bool hex = false; 230 bool more = false; 231 sysarg_t rows, cols; 232 int rc; 233 234 // reset global state 235 // TODO: move to structure? 236 paging_enabled = false; 237 chars_remaining = 0; 238 lines_remaining = 0; 239 console_cols = 0; 240 console_rows = 0; 241 should_quit = false; 133 242 134 243 argc = cli_count_args(argv); 135 244 136 245 for (c = 0, optind = 0, opt_ind = 0; c != -1;) { 137 c = getopt_long(argc, argv, " hvmH:t:b:", long_options, &opt_ind);246 c = getopt_long(argc, argv, "xhvmH:t:b:", long_options, &opt_ind); 138 247 switch (c) { 139 248 case 'h': … … 153 262 break; 154 263 case 'm': 155 printf("%s", cat_oops); 156 return CMD_FAILURE; 264 more = true; 265 break; 266 case 'x': 267 hex = true; 268 break; 157 269 } 158 270 } … … 168 280 if (buffer <= 0) 169 281 buffer = CAT_DEFAULT_BUFLEN; 170 171 for (i = optind; argv[i] != NULL; i++) 172 ret += cat_file(argv[i], buffer); 282 283 if (more) { 284 rc = console_get_size(fphone(stdout), &cols, &rows); 285 if (rc != EOK) { 286 printf("%s - cannot get console size\n", cmdname); 287 return CMD_FAILURE; 288 } 289 console_cols = cols; 290 console_rows = rows; 291 paging_enabled = true; 292 newpage(); 293 } 294 295 for (i = optind; argv[i] != NULL && !should_quit; i++) 296 ret += cat_file(argv[i], buffer, hex); 173 297 174 298 if (ret) -
uspace/app/bdsh/cmds/modules/cat/cat.h
r841e6e5 r79e1abd 4 4 /* Prototypes for the cat command, excluding entry points */ 5 5 6 static unsigned int cat_file(const char *, size_t );6 static unsigned int cat_file(const char *, size_t, bool); 7 7 8 8 #endif /* CAT_H */ -
uspace/app/bdsh/cmds/modules/cp/cp.c
r841e6e5 r79e1abd 108 108 for (;;) { 109 109 ssize_t res; 110 size_t written = 0; 110 111 111 112 bytes = read(fd1, buff, blen); … … 120 121 * returned less data than requested. 121 122 */ 122 bytes = write(fd2, buff , res);123 bytes = write(fd2, buff + written, res); 123 124 if (bytes < 0) 124 125 goto err; 126 written += bytes; 125 127 res -= bytes; 126 128 } while (res > 0); -
uspace/app/bdsh/cmds/modules/rm/rm.c
r841e6e5 r79e1abd 101 101 } 102 102 103 static unsigned int rm_recursive_not_empty_dirs(const char *path) 104 { 105 DIR *dirp; 106 struct dirent *dp; 107 char buff[PATH_MAX]; 108 unsigned int scope; 109 unsigned int ret = 0; 110 111 dirp = opendir(path); 112 if (!dirp) { 113 /* May have been deleted between scoping it and opening it */ 114 cli_error(CL_EFAIL, "Could not open %s", path); 115 return ret; 116 } 117 118 memset(buff, 0, sizeof(buff)); 119 while ((dp = readdir(dirp))) { 120 snprintf(buff, PATH_MAX - 1, "%s/%s", path, dp->d_name); 121 scope = rm_scope(buff); 122 switch (scope) { 123 case RM_BOGUS: 124 break; 125 case RM_FILE: 126 ret += rm_single(buff); 127 break; 128 case RM_DIR: 129 ret += rm_recursive(buff); 130 break; 131 } 132 } 133 134 return ret; 135 } 136 103 137 static unsigned int rm_recursive(const char *path) 104 138 { 105 139 int rc; 140 unsigned int ret = 0; 106 141 107 142 /* First see if it will just go away */ … … 111 146 112 147 /* Its not empty, recursively scan it */ 113 cli_error(CL_ENOTSUP, 114 "Can not remove %s, directory not empty", path); 115 return 1; 148 ret = rm_recursive_not_empty_dirs(path); 149 150 /* Delete directory */ 151 rc = rmdir(path); 152 if (rc == 0) 153 return ret; 154 155 cli_error(CL_ENOTSUP, "Can not remove %s", path); 156 157 return ret + 1; 116 158 } 117 159 -
uspace/app/init/init.c
r841e6e5 r79e1abd 313 313 getterm("term/vc5", "/app/bdsh", false); 314 314 getterm("term/vc6", "/app/klog", false); 315 316 #ifdef CONFIG_DEVMAN_EARLY_LAUNCH 317 spawn("/srv/devman"); 318 #else 315 319 getterm("term/vc7", "/srv/devman", false); 316 320 #endif 321 317 322 return 0; 318 323 } -
uspace/app/klog/klog.c
r841e6e5 r79e1abd 44 44 #include <io/klog.h> 45 45 #include <sysinfo.h> 46 #include <fibril_synch.h> 46 47 47 48 #define NAME "klog" … … 54 55 static FILE *log; 55 56 57 /* Serialize the output a bit. This will not avoid messed-up log completely 58 but chances for are pretty high (experimentally confirmed). */ 59 static FIBRIL_MUTEX_INITIALIZE(log_mutex); 60 56 61 static void interrupt_received(ipc_callid_t callid, ipc_call_t *call) 57 62 { 63 fibril_mutex_lock(&log_mutex); 64 58 65 size_t klog_start = (size_t) IPC_GET_ARG1(*call); 59 66 size_t klog_len = (size_t) IPC_GET_ARG2(*call); … … 74 81 fsync(fileno(log)); 75 82 } 83 84 fibril_mutex_unlock(&log_mutex); 76 85 } 77 86 -
uspace/drv/ohci/Makefile
r841e6e5 r79e1abd 37 37 main.c \ 38 38 hc.c \ 39 ohci.c \ 39 40 root_hub.c \ 40 41 pci.c -
uspace/drv/ohci/hc.c
r841e6e5 r79e1abd 39 39 #include <usb/debug.h> 40 40 #include <usb/usb.h> 41 #include <usb/hub.h>42 41 #include <usb/ddfiface.h> 43 42 #include <usb/usbdevice.h> … … 45 44 #include "hc.h" 46 45 47 static int dummy_reset(int foo, void *arg);48 46 static int interrupt_emulator(hc_t *instance); 47 /*----------------------------------------------------------------------------*/ 48 int hc_register_hub(hc_t *instance, ddf_fun_t *hub_fun) 49 { 50 assert(instance); 51 assert(hub_fun); 52 53 usb_address_t hub_address = 54 device_keeper_get_free_address(&instance->manager, USB_SPEED_FULL); 55 instance->rh.address = hub_address; 56 usb_device_keeper_bind( 57 &instance->manager, hub_address, hub_fun->handle); 58 59 char *match_str = NULL; 60 int ret = asprintf(&match_str, "usb&mid"); 61 ret = (match_str == NULL) ? ret : EOK; 62 if (ret < 0) { 63 usb_log_error("Failed to create root hub match-id string.\n"); 64 return ret; 65 } 66 67 ret = ddf_fun_add_match_id(hub_fun, match_str, 100); 68 if (ret != EOK) { 69 usb_log_error("Failed add create root hub match-id.\n"); 70 } 71 return ret; 72 } 49 73 /*----------------------------------------------------------------------------*/ 50 74 int hc_init(hc_t *instance, ddf_fun_t *fun, ddf_dev_t *dev, … … 68 92 } 69 93 94 rh_init(&instance->rh, dev, instance->registers); 70 95 71 rh_init(&instance->rh, dev, instance->registers);72 96 /* TODO: implement */ 73 return EOK;74 }75 /*----------------------------------------------------------------------------*/76 int hc_register_hub(hc_t *instance)77 {78 async_usleep(1000000);79 #define CHECK_RET_RETURN(ret, msg...) \80 if (ret != EOK) { \81 usb_log_error(msg); \82 return ret; \83 } else (void)084 assert(instance);85 assert(instance->ddf_instance);86 assert(instance->ddf_instance->handle);87 ddf_dev_t *dev = instance->rh.device;88 int ret = EOK;89 90 usb_hc_connection_t conn;91 ret =92 usb_hc_connection_initialize(&conn, instance->ddf_instance->handle);93 CHECK_RET_RETURN(ret, "Failed to initialize hc connection.\n");94 95 ret = usb_hc_connection_open(&conn);96 CHECK_RET_RETURN(ret, "Failed to open hc connection.\n");97 98 usb_address_t address;99 devman_handle_t handle;100 ret = usb_hc_new_device_wrapper(dev, &conn, USB_SPEED_FULL, dummy_reset,101 0, instance, &address, &handle, NULL, NULL, NULL);102 if (ret != EOK) {103 usb_log_error("Failed to add rh device.\n");104 instance->rh.address = -1;105 return ret;106 }107 108 ret = usb_hc_connection_close(&conn);109 CHECK_RET_RETURN(ret, "Failed to close hc connection.\n");110 97 return EOK; 111 98 } … … 134 121 } 135 122 /*----------------------------------------------------------------------------*/ 136 static int dummy_reset(int foo, void *arg) 137 { 138 hc_t *hc = (hc_t*)arg; 139 assert(hc); 140 hc->rh.address = 0; 141 return EOK; 142 } 143 /*----------------------------------------------------------------------------*/ 144 static int interrupt_emulator(hc_t *instance) 123 int interrupt_emulator(hc_t *instance) 145 124 { 146 125 assert(instance); -
uspace/drv/ohci/hc.h
r841e6e5 r79e1abd 57 57 } hc_t; 58 58 59 int hc_register_hub(hc_t *instance, ddf_fun_t *hub_fun); 60 59 61 int hc_init(hc_t *instance, ddf_fun_t *fun, ddf_dev_t *dev, 60 62 uintptr_t regs, size_t reg_size, bool interrupts); 61 62 int hc_register_hub(hc_t *instance);63 63 64 64 int hc_schedule(hc_t *instance, usb_transfer_batch_t *batch); -
uspace/drv/ohci/iface.h
r841e6e5 r79e1abd 33 33 * Common OHCI definitions. 34 34 */ 35 #ifndef DRV_OHCI_ OHCI_H36 #define DRV_OHCI_ OHCI_H35 #ifndef DRV_OHCI_IFACE_H 36 #define DRV_OHCI_IFACE_H 37 37 38 38 #include <usbhc_iface.h> 39 40 #define NAME "ohci"41 39 42 40 extern usbhc_iface_t hc_iface; -
uspace/drv/ohci/main.c
r841e6e5 r79e1abd 34 34 */ 35 35 #include <ddf/driver.h> 36 #include <ddf/interrupt.h>37 #include <device/hw_res.h>38 36 #include <errno.h> 39 37 #include <str_error.h> 40 38 41 #include <usb_iface.h>42 #include <usb/ddfiface.h>43 39 #include <usb/debug.h> 44 40 45 #include " pci.h"46 #include "iface.h" 47 # include "hc.h"41 #include "ohci.h" 42 43 #define NAME "ohci" 48 44 49 45 static int ohci_add_device(ddf_dev_t *device); 50 static int get_hc_handle(ddf_fun_t *fun, devman_handle_t *handle)51 {52 assert(handle);53 assert(fun != NULL);54 55 *handle = fun->handle;56 return EOK;57 }58 /*----------------------------------------------------------------------------*/59 static int get_address(60 ddf_fun_t *fun, devman_handle_t handle, usb_address_t *address)61 {62 assert(fun);63 usb_device_keeper_t *manager = &fun_to_hc(fun)->manager;64 usb_address_t addr = usb_device_keeper_find(manager, handle);65 if (addr < 0) {66 return addr;67 }68 69 if (address != NULL) {70 *address = addr;71 }72 73 return EOK;74 }75 /*----------------------------------------------------------------------------*/76 /** IRQ handling callback, identifies device77 *78 * @param[in] dev DDF instance of the device to use.79 * @param[in] iid (Unused).80 * @param[in] call Pointer to the call that represents interrupt.81 */82 static void irq_handler(ddf_dev_t *dev, ipc_callid_t iid, ipc_call_t *call)83 {84 assert(dev);85 hc_t *hc = (hc_t*)dev->driver_data;86 assert(hc);87 hc_interrupt(hc, 0);88 }89 46 /*----------------------------------------------------------------------------*/ 90 47 static driver_ops_t ohci_driver_ops = { … … 97 54 }; 98 55 /*----------------------------------------------------------------------------*/ 99 static usb_iface_t hc_usb_iface = {100 .get_address = get_address,101 .get_hc_handle = get_hc_handle,102 };103 /*----------------------------------------------------------------------------*/104 static ddf_dev_ops_t hc_ops = {105 .interfaces[USB_DEV_IFACE] = &hc_usb_iface,106 .interfaces[USBHC_DEV_IFACE] = &hc_iface,107 };108 /*----------------------------------------------------------------------------*/109 56 /** Initializes a new ddf driver instance of OHCI hcd. 110 57 * … … 112 59 * @return Error code. 113 60 */ 114 staticint ohci_add_device(ddf_dev_t *device)61 int ohci_add_device(ddf_dev_t *device) 115 62 { 63 usb_log_debug("ohci_add_device() called\n"); 116 64 assert(device); 117 #define CHECK_RET_RETURN(ret, message...) \ 118 if (ret != EOK) { \ 119 usb_log_error(message); \ 120 return ret; \ 121 } 122 123 uintptr_t mem_reg_base = 0; 124 size_t mem_reg_size = 0; 125 int irq = 0; 126 127 int ret = 128 pci_get_my_registers(device, &mem_reg_base, &mem_reg_size, &irq); 129 CHECK_RET_RETURN(ret, 130 "Failed(%d) to get memory addresses:.\n", ret, device->handle); 131 usb_log_info("Memory mapped regs at 0x%X (size %zu), IRQ %d.\n", 132 mem_reg_base, mem_reg_size, irq); 133 134 ret = pci_disable_legacy(device); 135 CHECK_RET_RETURN(ret, 136 "Failed(%d) disable legacy USB: %s.\n", ret, str_error(ret)); 137 138 hc_t *hcd = malloc(sizeof(hc_t)); 139 if (hcd == NULL) { 65 ohci_t *ohci = malloc(sizeof(ohci_t)); 66 if (ohci == NULL) { 140 67 usb_log_error("Failed to allocate OHCI driver.\n"); 141 68 return ENOMEM; 142 69 } 143 70 144 ddf_fun_t *hc_fun = ddf_fun_create(device, fun_exposed, "ohci-hc"); 145 if (hc_fun == NULL) { 146 usb_log_error("Failed to create OHCI function.\n"); 147 free(hcd); 148 return ENOMEM; 149 } 150 151 152 bool interrupts = false; 153 #ifdef CONFIG_USBHC_NO_INTERRUPTS 154 usb_log_warning("Interrupts disabled in OS config, " \ 155 "falling back to polling.\n"); 156 #else 157 ret = pci_enable_interrupts(device); 71 int ret = ohci_init(ohci, device); 158 72 if (ret != EOK) { 159 usb_log_ warning("Failed to enable interrupts: %s.\n",73 usb_log_error("Failed to initialize OHCI driver: %s.\n", 160 74 str_error(ret)); 161 usb_log_info("HW interrupts not available, " \162 "falling back to polling.\n");163 } else {164 usb_log_debug("Hw interrupts enabled.\n");165 interrupts = true;166 }167 #endif168 169 ret = hc_init(hcd, hc_fun, device, mem_reg_base, mem_reg_size, interrupts);170 if (ret != EOK) {171 usb_log_error("Failed to initialize OHCI driver.\n");172 free(hcd);173 75 return ret; 174 76 } 77 device->driver_data = ohci; 175 78 176 ret = register_interrupt_handler(device, irq, irq_handler, NULL); 177 178 hc_fun->ops = &hc_ops; 179 ret = ddf_fun_bind(hc_fun); 180 if (ret != EOK) { 181 usb_log_error("Failed to bind OHCI function.\n"); 182 ddf_fun_destroy(hc_fun); 183 free(hcd); 184 return ret; 185 } 186 hc_fun->driver_data = hcd; 187 188 fid_t later = fibril_create((int(*)(void*))hc_register_hub, hcd); 189 fibril_add_ready(later); 190 191 usb_log_info("Controlling new OHCI device `%s' (handle %llu).\n", 192 device->name, device->handle); 79 usb_log_info("Controlling new OHCI device `%s'.\n", device->name); 193 80 194 81 return EOK; 195 #undef CHECK_RET_RETURN196 82 } 197 83 /*----------------------------------------------------------------------------*/ -
uspace/drv/ohci/root_hub.c
r841e6e5 r79e1abd 39 39 40 40 #include "root_hub.h" 41 #include "usb/classes/classes.h" 42 #include <usb/request.h> 43 #include <usb/classes/hub.h> 44 45 /** 46 * standart device descriptor for ohci root hub 47 */ 48 static const usb_standard_device_descriptor_t ohci_rh_device_descriptor = 49 { 50 .configuration_count = 1, 51 .descriptor_type = USB_DESCTYPE_DEVICE, 52 .device_class = USB_CLASS_HUB, 53 .device_protocol = 0, 54 .device_subclass = 0, 55 .device_version = 0, 56 .length = sizeof(usb_standard_device_descriptor_t), 57 /// \TODO this value is guessed 58 .max_packet_size = 8, 59 .vendor_id = 0x16db, 60 .product_id = 0x0001, 61 /// \TODO these values migt be different 62 .str_serial_number = 0, 63 .usb_spec_version = 0, 64 }; 65 66 /** 67 * standart configuration descriptor with filled common values 68 * for ohci root hubs 69 */ 70 static const usb_standard_configuration_descriptor_t ohci_rh_conf_descriptor = 71 { 72 /// \TODO some values are default or guessed 73 .attributes = 1<<7, 74 .configuration_number = 1, 75 .descriptor_type = USB_DESCTYPE_CONFIGURATION, 76 .interface_count = 1, 77 .length = sizeof(usb_standard_configuration_descriptor_t), 78 .max_power = 100, 79 .str_configuration = 0, 80 }; 81 82 /** 83 * standart ohci root hub interface descriptor 84 */ 85 static const usb_standard_interface_descriptor_t ohci_rh_iface_descriptor = 86 { 87 .alternate_setting = 0, 88 .descriptor_type = USB_DESCTYPE_INTERFACE, 89 .endpoint_count = 1, 90 .interface_class = USB_CLASS_HUB, 91 /// \TODO is this correct? 92 .interface_number = 1, 93 .interface_protocol = 0, 94 .interface_subclass = 0, 95 .length = sizeof(usb_standard_interface_descriptor_t), 96 .str_interface = 0, 97 }; 98 99 /** 100 * standart ohci root hub endpoint descriptor 101 */ 102 static const usb_standard_endpoint_descriptor_t ohci_rh_ep_descriptor = 103 { 104 .attributes = USB_TRANSFER_INTERRUPT, 105 .descriptor_type = USB_DESCTYPE_ENDPOINT, 106 .endpoint_address = 1 + (1<<7), 107 .length = sizeof(usb_standard_endpoint_descriptor_t), 108 .max_packet_size = 8, 109 .poll_interval = 255, 110 }; 41 111 42 112 /** Root hub initialization … … 50 120 instance->device = dev; 51 121 122 52 123 usb_log_info("OHCI root hub with %d ports.\n", regs->rh_desc_a & 0xff); 53 124 125 //start generic usb hub driver 126 54 127 /* TODO: implement */ 55 128 return EOK; 56 129 } 57 130 /*----------------------------------------------------------------------------*/ 131 132 /** 133 * create answer to port status_request 134 * 135 * Copy content of corresponding port status register to answer buffer. 136 * 137 * @param instance root hub instance 138 * @param port port number, counted from 1 139 * @param request structure containing both request and response information 140 * @return error code 141 */ 142 static int process_get_port_status_request(rh_t *instance, uint16_t port, 143 usb_transfer_batch_t * request){ 144 if(port<1 || port>instance->port_count) 145 return EINVAL; 146 uint32_t * uint32_buffer = (uint32_t*)request->buffer; 147 request->transfered_size = 4; 148 uint32_buffer[0] = instance->registers->rh_port_status[port -1]; 149 return EOK; 150 } 151 152 /** 153 * create answer to port status_request 154 * 155 * Copy content of hub status register to answer buffer. 156 * 157 * @param instance root hub instance 158 * @param request structure containing both request and response information 159 * @return error code 160 */ 161 static int process_get_hub_status_request(rh_t *instance, 162 usb_transfer_batch_t * request){ 163 uint32_t * uint32_buffer = (uint32_t*)request->buffer; 164 //bits, 0,1,16,17 165 request->transfered_size = 4; 166 uint32_t mask = 1 & (1<<1) & (1<<16) & (1<<17); 167 uint32_buffer[0] = mask & instance->registers->rh_status; 168 return EOK; 169 170 } 171 172 /** 173 * Create hub descriptor used in hub-driver <-> hub communication 174 * 175 * This means creating byt array from data in root hub registers. For more 176 * info see usb hub specification. 177 * 178 * @param instance root hub instance 179 * @param@out out_result pointer to resultant serialized descriptor 180 * @param@out out_size size of serialized descriptor 181 */ 182 static void usb_create_serialized_hub_descriptor(rh_t *instance, 183 uint8_t ** out_result, 184 size_t * out_size) { 185 //base size 186 size_t size = 7; 187 //variable size according to port count 188 size_t var_size = instance->port_count / 8 + 189 ((instance->port_count % 8 > 0) ? 1 : 0); 190 size += 2 * var_size; 191 uint8_t * result = (uint8_t*) malloc(size); 192 bzero(result,size); 193 //size 194 result[0] = size; 195 //descriptor type 196 result[1] = USB_DESCTYPE_HUB; 197 result[2] = instance->port_count; 198 uint32_t hub_desc_reg = instance->registers->rh_desc_a; 199 result[3] = 200 ((hub_desc_reg >> 8) %2) + 201 (((hub_desc_reg >> 9) %2) << 1) + 202 (((hub_desc_reg >> 10) %2) << 2) + 203 (((hub_desc_reg >> 11) %2) << 3) + 204 (((hub_desc_reg >> 12) %2) << 4); 205 result[4] = 0; 206 result[5] = /*descriptor->pwr_on_2_good_time*/ 50; 207 result[6] = 50; 208 209 int port; 210 for (port = 1; port <= instance->port_count; ++port) { 211 result[7 + port/8] += 212 ((instance->registers->rh_desc_b >> port)%2) << (port%8); 213 } 214 size_t i; 215 for (i = 0; i < var_size; ++i) { 216 result[7 + var_size + i] = 255; 217 } 218 (*out_result) = result; 219 (*out_size) = size; 220 } 221 222 223 /** 224 * create answer to status request 225 * 226 * This might be either hub status or port status request. If neither, 227 * ENOTSUP is returned. 228 * @param instance root hub instance 229 * @param request structure containing both request and response information 230 * @return error code 231 */ 232 static int process_get_status_request(rh_t *instance, 233 usb_transfer_batch_t * request) 234 { 235 size_t buffer_size = request->buffer_size; 236 usb_device_request_setup_packet_t * request_packet = 237 (usb_device_request_setup_packet_t*) 238 request->setup_buffer; 239 240 usb_hub_bm_request_type_t request_type = request_packet->request_type; 241 if(buffer_size<4/*request_packet->length*/){///\TODO 242 usb_log_warning("requested more data than buffer size\n"); 243 return EINVAL; 244 } 245 246 if(request_type == USB_HUB_REQ_TYPE_GET_HUB_STATUS) 247 return process_get_hub_status_request(instance, request); 248 if(request_type == USB_HUB_REQ_TYPE_GET_PORT_STATUS) 249 return process_get_port_status_request(instance, request_packet->index, 250 request); 251 return ENOTSUP; 252 } 253 254 /** 255 * create answer to status interrupt consisting of change bitmap 256 * 257 * Result contains bitmap where bit 0 indicates change on hub and 258 * bit i indicates change on i`th port (i>0). For more info see 259 * Hub and Port status bitmap specification in USB specification. 260 * @param instance root hub instance 261 * @param@out buffer pointer to created interrupt mas 262 * @param@out buffer_size size of created interrupt mask 263 */ 264 static void create_interrupt_mask(rh_t *instance, void ** buffer, 265 size_t * buffer_size){ 266 int bit_count = instance->port_count + 1; 267 (*buffer_size) = (bit_count / 8) + (bit_count%8==0)?0:1; 268 (*buffer) = malloc(*buffer_size); 269 uint8_t * bitmap = (uint8_t*)(*buffer); 270 uint32_t mask = (1<<16) + (1<<17); 271 bzero(bitmap,(*buffer_size)); 272 if(instance->registers->rh_status & mask){ 273 bitmap[0] = 1; 274 } 275 int port; 276 mask = 0; 277 int i; 278 for(i=16;i<=20;++i) 279 mask += 1<<i; 280 for(port = 1; port<=instance->port_count;++port){ 281 if(mask & instance->registers->rh_port_status[port-1]){ 282 bitmap[(port+1)/8] += 1<<(port%8); 283 } 284 } 285 } 286 287 /** 288 * create standart configuration descriptor for the root hub instance 289 * @param instance root hub instance 290 * @return newly allocated descriptor 291 */ 292 static usb_standard_configuration_descriptor_t * 293 usb_ohci_rh_create_standart_configuration_descriptor(rh_t *instance){ 294 usb_standard_configuration_descriptor_t * descriptor = 295 malloc(sizeof(usb_standard_configuration_descriptor_t)); 296 memcpy(descriptor, &ohci_rh_conf_descriptor, 297 sizeof(usb_standard_configuration_descriptor_t)); 298 /// \TODO should this include device descriptor? 299 const size_t hub_descriptor_size = 7 + 300 2* (instance->port_count / 8 + 301 ((instance->port_count % 8 > 0) ? 1 : 0)); 302 descriptor->total_length = 303 sizeof(usb_standard_configuration_descriptor_t)+ 304 sizeof(usb_standard_endpoint_descriptor_t)+ 305 sizeof(usb_standard_interface_descriptor_t)+ 306 hub_descriptor_size; 307 return descriptor; 308 } 309 310 /** 311 * create answer to a descriptor request 312 * 313 * This might be a request for standard (configuration, device, endpoint or 314 * interface) or device specific (hub) descriptor. 315 * @param instance root hub instance 316 * @param request structure containing both request and response information 317 * @return error code 318 */ 319 static int process_get_descriptor_request(rh_t *instance, 320 usb_transfer_batch_t *request){ 321 usb_device_request_setup_packet_t * setup_request = 322 (usb_device_request_setup_packet_t*)request->setup_buffer; 323 size_t size; 324 const void * result_descriptor = NULL; 325 const uint16_t setup_request_value = setup_request->value_high; 326 //(setup_request->value_low << 8); 327 bool del = false; 328 switch (setup_request_value) 329 { 330 case USB_DESCTYPE_HUB: { 331 uint8_t * descriptor; 332 usb_create_serialized_hub_descriptor( 333 instance, &descriptor, &size); 334 result_descriptor = descriptor; 335 if(result_descriptor) del = true; 336 break; 337 } 338 case USB_DESCTYPE_DEVICE: { 339 usb_log_debug("USB_DESCTYPE_DEVICE\n"); 340 result_descriptor = &ohci_rh_device_descriptor; 341 size = sizeof(ohci_rh_device_descriptor); 342 break; 343 } 344 case USB_DESCTYPE_CONFIGURATION: { 345 usb_log_debug("USB_DESCTYPE_CONFIGURATION\n"); 346 usb_standard_configuration_descriptor_t * descriptor = 347 usb_ohci_rh_create_standart_configuration_descriptor( 348 instance); 349 result_descriptor = descriptor; 350 size = sizeof(usb_standard_configuration_descriptor_t); 351 del = true; 352 break; 353 } 354 case USB_DESCTYPE_INTERFACE: { 355 usb_log_debug("USB_DESCTYPE_INTERFACE\n"); 356 result_descriptor = &ohci_rh_iface_descriptor; 357 size = sizeof(ohci_rh_iface_descriptor); 358 break; 359 } 360 case USB_DESCTYPE_ENDPOINT: { 361 usb_log_debug("USB_DESCTYPE_ENDPOINT\n"); 362 result_descriptor = &ohci_rh_ep_descriptor; 363 size = sizeof(ohci_rh_ep_descriptor); 364 break; 365 } 366 default: { 367 usb_log_debug("USB_DESCTYPE_EINVAL %d \n",setup_request->value); 368 usb_log_debug("\ttype %d\n\trequest %d\n\tvalue %d\n\tindex %d\n\tlen %d\n ", 369 setup_request->request_type, 370 setup_request->request, 371 setup_request_value, 372 setup_request->index, 373 setup_request->length 374 ); 375 return EINVAL; 376 } 377 } 378 if(request->buffer_size < size){ 379 size = request->buffer_size; 380 } 381 request->transfered_size = size; 382 memcpy(request->buffer,result_descriptor,size); 383 if (del) 384 free(result_descriptor); 385 return EOK; 386 } 387 388 /** 389 * answer to get configuration request 390 * 391 * Root hub works independently on the configuration. 392 * @param instance root hub instance 393 * @param request structure containing both request and response information 394 * @return error code 395 */ 396 static int process_get_configuration_request(rh_t *instance, 397 usb_transfer_batch_t *request){ 398 //set and get configuration requests do not have any meaning, only dummy 399 //values are returned 400 if(request->buffer_size != 1) 401 return EINVAL; 402 request->buffer[0] = 1; 403 request->transfered_size = 1; 404 return EOK; 405 } 406 407 /** 408 * process feature-enabling/disabling request on hub 409 * 410 * @param instance root hub instance 411 * @param feature feature selector 412 * @param enable enable or disable specified feature 413 * @return error code 414 */ 415 static int process_hub_feature_set_request(rh_t *instance, 416 uint16_t feature, bool enable){ 417 if(feature > USB_HUB_FEATURE_C_HUB_OVER_CURRENT) 418 return EINVAL; 419 instance->registers->rh_status = 420 enable ? 421 (instance->registers->rh_status | (1<<feature)) 422 : 423 (instance->registers->rh_status & (~(1<<feature))); 424 /// \TODO any error? 425 return EOK; 426 } 427 428 /** 429 * process feature-enabling/disabling request on hub 430 * 431 * @param instance root hub instance 432 * @param feature feature selector 433 * @param port port number, counted from 1 434 * @param enable enable or disable the specified feature 435 * @return error code 436 */ 437 static int process_port_feature_set_request(rh_t *instance, 438 uint16_t feature, uint16_t port, bool enable){ 439 if(feature > USB_HUB_FEATURE_C_PORT_RESET) 440 return EINVAL; 441 if(port<1 || port>instance->port_count) 442 return EINVAL; 443 instance->registers->rh_port_status[port - 1] = 444 enable ? 445 (instance->registers->rh_port_status[port - 1] | (1<<feature)) 446 : 447 (instance->registers->rh_port_status[port - 1] & (~(1<<feature))); 448 /// \TODO any error? 449 return EOK; 450 } 451 452 /** 453 * register address to this device 454 * 455 * @param instance root hub instance 456 * @param address new address 457 * @return error code 458 */ 459 static int process_address_set_request(rh_t *instance, 460 uint16_t address){ 461 instance->address = address; 462 return EOK; 463 } 464 465 /** 466 * process one of requests that requere output data 467 * 468 * Request can be one of USB_DEVREQ_GET_STATUS, USB_DEVREQ_GET_DESCRIPTOR or 469 * USB_DEVREQ_GET_CONFIGURATION. 470 * @param instance root hub instance 471 * @param request structure containing both request and response information 472 * @return error code 473 */ 474 static int process_request_with_output(rh_t *instance, 475 usb_transfer_batch_t *request){ 476 usb_device_request_setup_packet_t * setup_request = 477 (usb_device_request_setup_packet_t*)request->setup_buffer; 478 if(setup_request->request == USB_DEVREQ_GET_STATUS){ 479 usb_log_debug("USB_DEVREQ_GET_STATUS\n"); 480 return process_get_status_request(instance, request); 481 } 482 if(setup_request->request == USB_DEVREQ_GET_DESCRIPTOR){ 483 usb_log_debug("USB_DEVREQ_GET_DESCRIPTOR\n"); 484 return process_get_descriptor_request(instance, request); 485 } 486 if(setup_request->request == USB_DEVREQ_GET_CONFIGURATION){ 487 usb_log_debug("USB_DEVREQ_GET_CONFIGURATION\n"); 488 return process_get_configuration_request(instance, request); 489 } 490 return ENOTSUP; 491 } 492 493 /** 494 * process one of requests that carry input data 495 * 496 * Request can be one of USB_DEVREQ_SET_DESCRIPTOR or 497 * USB_DEVREQ_SET_CONFIGURATION. 498 * @param instance root hub instance 499 * @param request structure containing both request and response information 500 * @return error code 501 */ 502 static int process_request_with_input(rh_t *instance, 503 usb_transfer_batch_t *request){ 504 usb_device_request_setup_packet_t * setup_request = 505 (usb_device_request_setup_packet_t*)request->setup_buffer; 506 request->transfered_size = 0; 507 if(setup_request->request == USB_DEVREQ_SET_DESCRIPTOR){ 508 return ENOTSUP; 509 } 510 if(setup_request->request == USB_DEVREQ_SET_CONFIGURATION){ 511 //set and get configuration requests do not have any meaning, 512 //only dummy values are returned 513 return EOK; 514 } 515 return ENOTSUP; 516 } 517 518 /** 519 * process one of requests that do not request nor carry additional data 520 * 521 * Request can be one of USB_DEVREQ_CLEAR_FEATURE, USB_DEVREQ_SET_FEATURE or 522 * USB_DEVREQ_SET_ADDRESS. 523 * @param instance root hub instance 524 * @param request structure containing both request and response information 525 * @return error code 526 */ 527 static int process_request_without_data(rh_t *instance, 528 usb_transfer_batch_t *request){ 529 usb_device_request_setup_packet_t * setup_request = 530 (usb_device_request_setup_packet_t*)request->setup_buffer; 531 request->transfered_size = 0; 532 if(setup_request->request == USB_DEVREQ_CLEAR_FEATURE 533 || setup_request->request == USB_DEVREQ_SET_FEATURE){ 534 if(setup_request->request_type == USB_HUB_REQ_TYPE_SET_HUB_FEATURE){ 535 usb_log_debug("USB_HUB_REQ_TYPE_SET_HUB_FEATURE\n"); 536 return process_hub_feature_set_request(instance, setup_request->value, 537 setup_request->request == USB_DEVREQ_SET_FEATURE); 538 } 539 if(setup_request->request_type == USB_HUB_REQ_TYPE_SET_PORT_FEATURE){ 540 usb_log_debug("USB_HUB_REQ_TYPE_SET_PORT_FEATURE\n"); 541 return process_port_feature_set_request(instance, setup_request->value, 542 setup_request->index, 543 setup_request->request == USB_DEVREQ_SET_FEATURE); 544 } 545 usb_log_debug("USB_HUB_REQ_TYPE_INVALID %d\n",setup_request->request_type); 546 return EINVAL; 547 } 548 if(setup_request->request == USB_DEVREQ_SET_ADDRESS){ 549 usb_log_debug("USB_DEVREQ_SET_ADDRESS\n"); 550 return process_address_set_request(instance, setup_request->value); 551 } 552 usb_log_debug("USB_DEVREQ_SET_ENOTSUP %d\n",setup_request->request_type); 553 return ENOTSUP; 554 } 555 556 /** 557 * process hub control request 558 * 559 * If needed, writes answer into the request structure. 560 * Request can be one of 561 * USB_DEVREQ_GET_STATUS, 562 * USB_DEVREQ_GET_DESCRIPTOR, 563 * USB_DEVREQ_GET_CONFIGURATION, 564 * USB_DEVREQ_CLEAR_FEATURE, 565 * USB_DEVREQ_SET_FEATURE, 566 * USB_DEVREQ_SET_ADDRESS, 567 * USB_DEVREQ_SET_DESCRIPTOR or 568 * USB_DEVREQ_SET_CONFIGURATION. 569 * 570 * @param instance root hub instance 571 * @param request structure containing both request and response information 572 * @return error code 573 */ 574 static int process_ctrl_request(rh_t *instance, usb_transfer_batch_t *request){ 575 int opResult; 576 if (request->setup_buffer) { 577 if(sizeof(usb_device_request_setup_packet_t)>request->setup_size){ 578 usb_log_error("setup packet too small\n"); 579 return EINVAL; 580 } 581 usb_log_info("CTRL packet: %s.\n", 582 usb_debug_str_buffer((const uint8_t *)request->setup_buffer, 8, 8)); 583 usb_device_request_setup_packet_t * setup_request = 584 (usb_device_request_setup_packet_t*)request->setup_buffer; 585 if( 586 setup_request->request == USB_DEVREQ_GET_STATUS 587 || setup_request->request == USB_DEVREQ_GET_DESCRIPTOR 588 || setup_request->request == USB_DEVREQ_GET_CONFIGURATION 589 ){ 590 usb_log_debug("processing request with output\n"); 591 opResult = process_request_with_output(instance,request); 592 }else if( 593 setup_request->request == USB_DEVREQ_CLEAR_FEATURE 594 || setup_request->request == USB_DEVREQ_SET_FEATURE 595 || setup_request->request == USB_DEVREQ_SET_ADDRESS 596 ){ 597 usb_log_debug("processing request without additional data\n"); 598 opResult = process_request_without_data(instance,request); 599 }else if(setup_request->request == USB_DEVREQ_SET_DESCRIPTOR 600 || setup_request->request == USB_DEVREQ_SET_CONFIGURATION 601 ){ 602 usb_log_debug("processing request with input\n"); 603 opResult = process_request_with_input(instance,request); 604 }else{ 605 usb_log_warning("received unsuported request: %d\n", 606 setup_request->request 607 ); 608 opResult = ENOTSUP; 609 } 610 }else{ 611 usb_log_error("root hub received empty transaction?"); 612 opResult = EINVAL; 613 } 614 return opResult; 615 } 616 617 /** 618 * process root hub request 619 * 620 * @param instance root hub instance 621 * @param request structure containing both request and response information 622 * @return error code 623 */ 58 624 int rh_request(rh_t *instance, usb_transfer_batch_t *request) 59 625 { 60 626 assert(instance); 61 627 assert(request); 62 /* TODO: implement */ 63 if (request->setup_buffer) { 64 usb_log_info("Root hub got SETUP packet: %s.\n", 65 usb_debug_str_buffer((const uint8_t *)request->setup_buffer, 8, 8)); 66 } 67 usb_log_error("Root hub request processing not implemented.\n"); 68 usb_transfer_batch_finish(request, ENOTSUP); 628 int opResult; 629 if(request->transfer_type == USB_TRANSFER_CONTROL){ 630 usb_log_info("Root hub got CONTROL packet\n"); 631 opResult = process_ctrl_request(instance,request); 632 }else if(request->transfer_type == USB_TRANSFER_INTERRUPT){ 633 usb_log_info("Root hub got INTERRUPT packet\n"); 634 void * buffer; 635 create_interrupt_mask(instance, &buffer, 636 &(request->transfered_size)); 637 memcpy(request->transport_buffer,buffer, request->transfered_size); 638 opResult = EOK; 639 }else{ 640 opResult = EINVAL; 641 } 642 usb_transfer_batch_finish(request, opResult); 69 643 return EOK; 70 644 } 71 645 /*----------------------------------------------------------------------------*/ 646 647 72 648 void rh_interrupt(rh_t *instance) 73 649 { 74 usb_log_ error("Root hub interrupt not implemented.\n");75 /* TODO: implement */650 usb_log_info("Whoa whoa wait, I`m not supposed to receive any interrupts, am I?\n"); 651 /* TODO: implement? */ 76 652 } 77 653 /** -
uspace/drv/ohci/root_hub.h
r841e6e5 r79e1abd 41 41 #include "batch.h" 42 42 43 /** 44 * ohci root hub representation 45 */ 43 46 typedef struct rh { 47 /** pointer to ohci driver registers */ 44 48 ohci_regs_t *registers; 49 /** usb address of the root hub */ 45 50 usb_address_t address; 51 /** ddf device information */ 46 52 ddf_dev_t *device; 53 /** hub port count */ 54 int port_count; 47 55 } rh_t; 48 56 -
uspace/drv/pciintel/pci.c
r841e6e5 r79e1abd 95 95 sysarg_t i8259; 96 96 97 int irc_phone = -1; 98 int irc_service = -1; 99 100 if ((sysinfo_get_value("apic", &apic) == EOK) && (apic)) { 101 irc_service = SERVICE_APIC; 102 } else if ((sysinfo_get_value("i8259", &i8259) == EOK) && (i8259)) { 103 irc_service = SERVICE_I8259; 104 } 105 106 if (irc_service == -1) { 107 return false; 108 } 109 110 irc_phone = service_connect_blocking(irc_service, 0, 0); 97 int irc_phone = ENOTSUP; 98 99 if (((sysinfo_get_value("apic", &apic) == EOK) && (apic)) 100 || ((sysinfo_get_value("i8259", &i8259) == EOK) && (i8259))) { 101 irc_phone = service_connect_blocking(SERVICE_IRC, 0, 0); 102 } 103 111 104 if (irc_phone < 0) { 112 105 return false; -
uspace/drv/uhci-hcd/Makefile
r841e6e5 r79e1abd 40 40 root_hub.c \ 41 41 hw_struct/transfer_descriptor.c \ 42 utils/slab.c \ 42 43 pci.c \ 43 44 batch.c -
uspace/drv/uhci-hcd/hc.c
r841e6e5 r79e1abd 223 223 ret = instance ? EOK : ENOMEM; 224 224 CHECK_RET_DEST_CMDS_RETURN(ret, "Failed to get frame list page.\n"); 225 usb_log_debug("Initialized frame list .\n");225 usb_log_debug("Initialized frame list at %p.\n", instance->frame_list); 226 226 227 227 /* Set all frames to point to the first queue head */ … … 336 336 instance->transfers[batch->speed][batch->transfer_type]; 337 337 assert(list); 338 if (batch->transfer_type == USB_TRANSFER_CONTROL) { 339 usb_device_keeper_use_control( 340 &instance->manager, batch->target.address); 341 } 338 342 transfer_list_add_batch(list, batch); 339 343 … … 357 361 /* Lower 2 bits are transaction error and transaction complete */ 358 362 if (status & 0x3) { 359 transfer_list_remove_finished(&instance->transfers_interrupt); 360 transfer_list_remove_finished(&instance->transfers_control_slow); 361 transfer_list_remove_finished(&instance->transfers_control_full); 362 transfer_list_remove_finished(&instance->transfers_bulk_full); 363 LIST_INITIALIZE(done); 364 transfer_list_remove_finished( 365 &instance->transfers_interrupt, &done); 366 transfer_list_remove_finished( 367 &instance->transfers_control_slow, &done); 368 transfer_list_remove_finished( 369 &instance->transfers_control_full, &done); 370 transfer_list_remove_finished( 371 &instance->transfers_bulk_full, &done); 372 373 while (!list_empty(&done)) { 374 link_t *item = done.next; 375 list_remove(item); 376 usb_transfer_batch_t *batch = 377 list_get_instance(item, usb_transfer_batch_t, link); 378 if (batch->transfer_type == USB_TRANSFER_CONTROL) { 379 usb_device_keeper_release_control( 380 &instance->manager, batch->target.address); 381 } 382 batch->next_step(batch); 383 } 363 384 } 364 385 /* bits 4 and 5 indicate hc error */ -
uspace/drv/uhci-hcd/root_hub.c
r841e6e5 r79e1abd 48 48 * @return Error code. 49 49 */ 50 int rh_init( 51 rh_t *instance, ddf_fun_t *fun, uintptr_t reg_addr, size_t reg_size) 50 int rh_init(rh_t *instance, ddf_fun_t *fun, uintptr_t reg_addr, size_t reg_size) 52 51 { 53 52 assert(fun); -
uspace/drv/uhci-hcd/transfer_list.c
r841e6e5 r79e1abd 58 58 } 59 59 instance->queue_head_pa = addr_to_phys(instance->queue_head); 60 usb_log_debug2("Transfer list %s setup with QH: %p(%p).\n", 61 name, instance->queue_head, instance->queue_head_pa); 60 62 61 63 qh_init(instance->queue_head); … … 118 120 qh_set_next_qh(last_qh, pa); 119 121 122 asm volatile ("": : :"memory"); 123 120 124 /* Add to the driver list */ 121 125 list_append(&batch->link, &instance->batch_list); … … 137 141 * this transfer list leading to the deadlock if its done inline. 138 142 */ 139 void transfer_list_remove_finished(transfer_list_t *instance) 140 { 141 assert(instance); 142 143 LIST_INITIALIZE(done); 143 void transfer_list_remove_finished(transfer_list_t *instance, link_t *done) 144 { 145 assert(instance); 146 assert(done); 144 147 145 148 fibril_mutex_lock(&instance->guard); … … 153 156 /* Save for post-processing */ 154 157 transfer_list_remove_batch(instance, batch); 155 list_append(current, &done);158 list_append(current, done); 156 159 } 157 160 current = next; … … 159 162 fibril_mutex_unlock(&instance->guard); 160 163 161 while (!list_empty(&done)) {162 link_t *item = done.next;163 list_remove(item);164 usb_transfer_batch_t *batch =165 list_get_instance(item, usb_transfer_batch_t, link);166 batch->next_step(batch);167 }168 164 } 169 165 /*----------------------------------------------------------------------------*/ … … 222 218 qpos = "NOT FIRST"; 223 219 } 220 asm volatile ("": : :"memory"); 224 221 /* Remove from the batch list */ 225 222 list_remove(&batch->link); -
uspace/drv/uhci-hcd/transfer_list.h
r841e6e5 r79e1abd 67 67 void transfer_list_add_batch(transfer_list_t *instance, usb_transfer_batch_t *batch); 68 68 69 void transfer_list_remove_finished(transfer_list_t *instance );69 void transfer_list_remove_finished(transfer_list_t *instance, link_t *done); 70 70 71 71 void transfer_list_abort_all(transfer_list_t *instance); -
uspace/drv/uhci-hcd/uhci.c
r841e6e5 r79e1abd 44 44 #include "pci.h" 45 45 46 47 46 /** IRQ handling callback, identifies device 48 47 * … … 108 107 /*----------------------------------------------------------------------------*/ 109 108 static ddf_dev_ops_t hc_ops = { 110 .interfaces[USB_DEV_IFACE] = &usb_iface,109 // .interfaces[USB_DEV_IFACE] = &usb_iface, 111 110 .interfaces[USBHC_DEV_IFACE] = &hc_iface, /* see iface.h/c */ 112 111 }; -
uspace/drv/uhci-hcd/utils/malloc32.h
r841e6e5 r79e1abd 40 40 #include <as.h> 41 41 42 #include "slab.h" 43 42 44 #define UHCI_STRCUTURES_ALIGNMENT 16 43 45 #define UHCI_REQUIRED_PAGE_SIZE 4096 46 44 47 45 48 /** Get physical address translation … … 54 57 55 58 uintptr_t result; 56 int ret = as_get_physical_mapping(addr, &result); 59 const int ret = as_get_physical_mapping(addr, &result); 60 assert(ret == EOK); 57 61 58 62 if (ret != EOK) … … 66 70 * @return Address of the alligned and big enough memory place, NULL on failure. 67 71 */ 68 static inline void * malloc32(size_t size) 69 { return memalign(UHCI_STRCUTURES_ALIGNMENT, size); } 72 static inline void * malloc32(size_t size) { 73 if (size <= SLAB_ELEMENT_SIZE) 74 return slab_malloc_g(); 75 assert(false); 76 return memalign(UHCI_STRCUTURES_ALIGNMENT, size); 77 } 70 78 /*----------------------------------------------------------------------------*/ 71 79 /** Physical mallocator simulator … … 73 81 * @param[in] addr Address of the place allocated by malloc32 74 82 */ 75 static inline void free32(void *addr) 76 { if (addr) free(addr); } 83 static inline void free32(void *addr) { 84 if (!addr) 85 return; 86 if (slab_in_range_g(addr)) 87 return slab_free_g(addr); 88 free(addr); 89 } 77 90 /*----------------------------------------------------------------------------*/ 78 91 /** Create 4KB page mapping … … 82 95 static inline void * get_page(void) 83 96 { 84 void * 85 assert(free_address); 97 void *free_address = as_get_mappable_page(UHCI_REQUIRED_PAGE_SIZE); 98 assert(free_address); /* TODO: remove this assert */ 86 99 if (free_address == 0) 87 100 return NULL; 88 void* ret = 89 as_area_create(free_address, UHCI_REQUIRED_PAGE_SIZE, 101 void *ret = as_area_create(free_address, UHCI_REQUIRED_PAGE_SIZE, 90 102 AS_AREA_READ | AS_AREA_WRITE); 91 103 if (ret != free_address) -
uspace/drv/usbhub/port_status.h
r841e6e5 r79e1abd 30 30 */ 31 31 32 #ifndef PORT_STATUS_H33 #define PORT_STATUS_H32 #ifndef HUB_PORT_STATUS_H 33 #define HUB_PORT_STATUS_H 34 34 35 35 #include <bool.h> … … 79 79 80 80 /** 81 * set the device request to be a port feature enable request 82 * @param request 83 * @param port 84 * @param feature_selector 85 */ 86 static inline void usb_hub_set_enable_port_feature_request( 87 usb_device_request_setup_packet_t * request, uint16_t port, 88 uint16_t feature_selector 89 ){ 90 request->index = port; 91 request->request_type = USB_HUB_REQ_TYPE_SET_PORT_FEATURE; 92 request->request = USB_HUB_REQUEST_SET_FEATURE; 93 request->value = feature_selector; 94 request->length = 0; 95 } 96 97 98 /** 81 99 * set the device request to be a port enable request 82 100 * @param request … … 191 209 request->length = 0; 192 210 } 211 193 212 194 213 /** get i`th bit of port status */ … … 335 354 336 355 337 #endif /* PORT_STATUS_H */356 #endif /* HUB_PORT_STATUS_H */ 338 357 339 358 /** -
uspace/drv/usbhub/usbhub.c
r841e6e5 r79e1abd 53 53 #include "usb/classes/classes.h" 54 54 55 56 static void usb_hub_init_add_device(usb_hub_info_t * hub, uint16_t port, 57 usb_speed_t speed); 58 59 static int usb_hub_trigger_connecting_non_removable_devices( 60 usb_hub_info_t * hub, usb_hub_descriptor_t * descriptor); 61 62 /** 63 * control loop running in hub`s fibril 64 * 65 * Hub`s fibril periodically asks for changes on hub and if needded calls 66 * change handling routine. 67 * @warning currently hub driver asks for changes once a second 68 * @param hub_info_param hub representation pointer 69 * @return zero 70 */ 55 71 int usb_hub_control_loop(void * hub_info_param){ 56 72 usb_hub_info_t * hub_info = (usb_hub_info_t*)hub_info_param; … … 91 107 92 108 /** 93 * Load hub-specific information into hub_info structure .109 * Load hub-specific information into hub_info structure and process if needed 94 110 * 95 111 * Particularly read port count and initialize structure holding port 96 * information. 112 * information. If there are non-removable devices, start initializing them. 97 113 * This function is hub-specific and should be run only after the hub is 98 114 * configured using usb_hub_set_configuration function. 99 * @param hub_info pointer to structure with usb hub data115 * @param hub_info hub representation 100 116 * @return error code 101 117 */ 102 static int usb_hub_ get_hub_specific_info(usb_hub_info_t * hub_info){118 static int usb_hub_process_hub_specific_info(usb_hub_info_t * hub_info){ 103 119 // get hub descriptor 104 120 usb_log_debug("creating serialized descriptor\n"); … … 107 123 108 124 /* this was one fix of some bug, should not be needed anymore 125 * these lines allow to reset hub once more, it can be used as 126 * brute-force initialization for non-removable devices 109 127 int opResult = usb_request_set_configuration(&result->endpoints.control, 1); 110 128 if(opResult!=EOK){ … … 141 159 hub_info->attached_devs[i].address=0; 142 160 } 161 //handle non-removable devices 162 usb_hub_trigger_connecting_non_removable_devices(hub_info, descriptor); 143 163 usb_log_debug2("freeing data\n"); 144 164 free(serialized_descriptor); … … 152 172 * Check whether there is at least one configuration and sets the first one. 153 173 * This function should be run prior to running any hub-specific action. 154 * @param hub_info 155 * @return 174 * @param hub_info hub representation 175 * @return error code 156 176 */ 157 177 static int usb_hub_set_configuration(usb_hub_info_t * hub_info){ … … 162 182 std_descriptor->configuration_count); 163 183 if(std_descriptor->configuration_count<1){ 164 usb_log_error("THERE ARE NO CONFIGURATIONS AVAILABLE\n"); 165 //shouldn`t I return? 166 //definitely 184 usb_log_error("there are no configurations available\n"); 167 185 return EINVAL; 168 186 } … … 220 238 } 221 239 //get port count and create attached_devs 222 opResult = usb_hub_ get_hub_specific_info(hub_info);240 opResult = usb_hub_process_hub_specific_info(hub_info); 223 241 if(opResult!=EOK){ 224 242 usb_log_error("could not set hub configuration, errno %d\n",opResult); … … 258 276 //********************************************* 259 277 // 260 // hub driver code, main loop 278 // hub driver code, main loop and port handling 261 279 // 262 280 //********************************************* 281 282 /** 283 * triggers actions to connect non0removable devices 284 * 285 * This will trigger operations leading to activated non-removable device. 286 * Control pipe of the hub must be open fo communication. 287 * @param hub hub representation 288 * @param descriptor usb hub descriptor 289 * @return error code 290 */ 291 static int usb_hub_trigger_connecting_non_removable_devices(usb_hub_info_t * hub, 292 usb_hub_descriptor_t * descriptor) 293 { 294 usb_log_info("attaching non-removable devices(if any)\n"); 295 usb_device_request_setup_packet_t request; 296 int opResult; 297 size_t rcvd_size; 298 usb_port_status_t status; 299 uint8_t * non_removable_dev_bitmap = descriptor->devices_removable; 300 int port; 301 for(port=1;port<=descriptor->ports_count;++port){ 302 bool is_non_removable = 303 ((non_removable_dev_bitmap[port/8]) >> (port%8)) %2; 304 if(is_non_removable){ 305 usb_log_debug("non-removable device on port %d\n",port); 306 usb_hub_set_port_status_request(&request, port); 307 opResult = usb_pipe_control_read( 308 hub->control_pipe, 309 &request, sizeof(usb_device_request_setup_packet_t), 310 &status, 4, &rcvd_size 311 ); 312 if (opResult != EOK) { 313 usb_log_error("could not get port status of port %d errno:%d\n", 314 port, opResult); 315 return opResult; 316 } 317 //set the status change bit, so it will be noticed in driver loop 318 if(usb_port_dev_connected(&status)){ 319 usb_hub_set_enable_port_feature_request(&request, port, 320 USB_HUB_FEATURE_C_PORT_CONNECTION); 321 opResult = usb_pipe_control_read( 322 hub->control_pipe, 323 &request, sizeof(usb_device_request_setup_packet_t), 324 &status, 4, &rcvd_size 325 ); 326 if (opResult != EOK) { 327 usb_log_warning( 328 "could not set port change on port %d errno:%d\n", 329 port, opResult); 330 } 331 } 332 } 333 } 334 return EOK; 335 } 336 263 337 264 338 /** … … 282 356 /** 283 357 * Reset the port with new device and reserve the default address. 284 * @param h c285 * @param port 286 * @param target358 * @param hub hub representation 359 * @param port port number, starting from 1 360 * @param speed transfer speed of attached device, one of low, full or high 287 361 */ 288 362 static void usb_hub_init_add_device(usb_hub_info_t * hub, uint16_t port, … … 317 391 if (opResult != EOK) { 318 392 usb_log_error("something went wrong when reseting a port %d\n",opResult); 319 //usb_hub_release_default_address(hc);320 393 usb_hub_release_default_address(hub); 321 394 } … … 325 398 /** 326 399 * Finalize adding new device after port reset 327 * @param hc 328 * @param port 329 * @param target 400 * 401 * Set device`s address and start it`s driver. 402 * @param hub hub representation 403 * @param port port number, starting from 1 404 * @param speed transfer speed of attached device, one of low, full or high 330 405 */ 331 406 static void usb_hub_finalize_add_device( usb_hub_info_t * hub, … … 377 452 } 378 453 379 380 454 //opResult = usb_hub_release_default_address(hc); 381 455 opResult = usb_hub_release_default_address(hub); … … 412 486 413 487 /** 414 * Unregister device address in hc 415 * @param hc 416 * @param port 417 * @param target 488 * routine called when a device on port has been removed 489 * 490 * If the device on port had default address, it releases default address. 491 * Otherwise does not do anything, because DDF does not allow to remove device 492 * from it`s device tree. 493 * @param hub hub representation 494 * @param port port number, starting from 1 418 495 */ 419 496 static void usb_hub_removed_device( … … 454 531 * Turn off the power on the port. 455 532 * 456 * @param hub 457 * @param port 533 * @param hub hub representation 534 * @param port port number, starting from 1 458 535 */ 459 536 static void usb_hub_over_current( usb_hub_info_t * hub, … … 470 547 /** 471 548 * Process interrupts on given hub port 472 * @param hc 473 * @param port 474 * @param target 549 * 550 * Accepts connection, over current and port reset change. 551 * @param hub hub representation 552 * @param port port number, starting from 1 475 553 */ 476 554 static void usb_hub_process_interrupt(usb_hub_info_t * hub, … … 543 621 544 622 /** 545 * Check changes on particular hub 546 * @param hub_info_param pointer to usb_hub_info_t structure 547 * @return error code if there is problem when initializing communication with 548 * hub, EOK otherwise 623 * check changes on hub 624 * 625 * Handles changes on each port with a status change. 626 * @param hub_info hub representation 627 * @return error code 549 628 */ 550 629 int usb_hub_check_hub_changes(usb_hub_info_t * hub_info){ -
uspace/drv/usbmid/explore.c
r841e6e5 r79e1abd 40 40 #include <usb/request.h> 41 41 #include <usb/dp.h> 42 #include <usb/ddfiface.h> 42 43 #include "usbmid.h" 44 45 /** Operations of the device itself. */ 46 static ddf_dev_ops_t mid_device_ops = { 47 .interfaces[USB_DEV_IFACE] = &usb_iface_hub_impl 48 }; 43 49 44 50 /** Find starting indexes of all interface descriptors in a configuration. … … 105 111 * @return Whether to accept this device from devman. 106 112 */ 107 bool usbmid_explore_device(usb mid_device_t *dev)113 bool usbmid_explore_device(usb_device_t *dev) 108 114 { 109 usb_standard_device_descriptor_t device_descriptor; 110 int rc = usb_request_get_device_descriptor(&dev->ctrl_pipe, 111 &device_descriptor); 112 if (rc != EOK) { 113 usb_log_error("Getting device descriptor failed: %s.\n", 114 str_error(rc)); 115 return false; 116 } 117 118 if (device_descriptor.device_class != USB_CLASS_USE_INTERFACE) { 115 int rc; 116 117 int dev_class = dev->descriptors.device.device_class; 118 if (dev_class != USB_CLASS_USE_INTERFACE) { 119 119 usb_log_warning( 120 120 "Device class: %d (%s), but expected class 0.\n", 121 device_descriptor.device_class, 122 usb_str_class(device_descriptor.device_class)); 121 dev_class, usb_str_class(dev_class)); 123 122 usb_log_error("Not multi interface device, refusing.\n"); 124 123 return false; 125 124 } 126 125 127 size_t config_descriptor_size; 128 uint8_t *config_descriptor_raw = NULL; 129 rc = usb_request_get_full_configuration_descriptor_alloc( 130 &dev->ctrl_pipe, 0, 131 (void **) &config_descriptor_raw, &config_descriptor_size); 132 if (rc != EOK) { 133 usb_log_error("Failed getting full config descriptor: %s.\n", 134 str_error(rc)); 135 return false; 136 } 137 138 usb_standard_configuration_descriptor_t *config_descriptor 139 = (usb_standard_configuration_descriptor_t *) config_descriptor_raw; 126 /* Short cuts to save on typing ;-). */ 127 uint8_t *config_descriptor_raw = dev->descriptors.configuration; 128 size_t config_descriptor_size = dev->descriptors.configuration_size; 129 usb_standard_configuration_descriptor_t *config_descriptor = 130 (usb_standard_configuration_descriptor_t *) config_descriptor_raw; 140 131 141 132 size_t *interface_descriptors … … 154 145 if (interface_descriptors_count == (size_t) -1) { 155 146 usb_log_error("Problem parsing configuration descriptor.\n"); 156 free(config_descriptor_raw);157 147 free(interface_descriptors); 158 148 return false; … … 165 155 usb_log_error("Failed to set device configuration: %s.\n", 166 156 str_error(rc)); 167 free(config_descriptor_raw);168 157 free(interface_descriptors); 169 158 return false; … … 172 161 173 162 /* Create control function */ 174 ddf_fun_t *ctl_fun = ddf_fun_create(dev->d ev, fun_exposed, "ctl");163 ddf_fun_t *ctl_fun = ddf_fun_create(dev->ddf_dev, fun_exposed, "ctl"); 175 164 if (ctl_fun == NULL) { 176 165 usb_log_error("Failed to create control function.\n"); 177 free(config_descriptor_raw); 178 free(interface_descriptors); 179 return false; 180 } 166 free(interface_descriptors); 167 return false; 168 } 169 170 ctl_fun->ops = &mid_device_ops; 171 181 172 rc = ddf_fun_bind(ctl_fun); 182 173 if (rc != EOK) { 183 174 usb_log_error("Failed to bind control function: %s.\n", 184 175 str_error(rc)); 185 free(config_descriptor_raw);186 176 free(interface_descriptors); 187 177 return false; … … 199 189 (int) interface->interface_number, 200 190 usb_str_class(interface->interface_class)); 201 rc = usbmid_spawn_interface_child(dev, &dev ice_descriptor,191 rc = usbmid_spawn_interface_child(dev, &dev->descriptors.device, 202 192 interface); 203 193 if (rc != EOK) { … … 207 197 } 208 198 209 free(config_descriptor_raw);210 211 199 return true; 212 200 } -
uspace/drv/usbmid/main.c
r841e6e5 r79e1abd 49 49 * @return Error code. 50 50 */ 51 static int usbmid_add_device( ddf_dev_t *gen_dev)51 static int usbmid_add_device(usb_device_t *dev) 52 52 { 53 usbmid_device_t *dev = usbmid_device_create(gen_dev); 54 if (dev == NULL) { 55 return ENOMEM; 56 } 57 58 usb_log_info("Taking care of new MID: addr %d (HC %zu)\n", 59 dev->wire.address, dev->wire.hc_handle); 53 usb_log_info("Taking care of new MID `%s'.\n", dev->ddf_dev->name); 60 54 61 55 int rc; … … 65 59 usb_log_error("Failed to start session on control pipe: %s.\n", 66 60 str_error(rc)); 67 goto error_leave;61 return rc; 68 62 } 69 63 … … 77 71 78 72 if (!accept) { 79 rc = ENOTSUP; 80 goto error_leave; 73 return ENOTSUP; 81 74 } 82 75 83 gen_dev->driver_data = dev;84 85 76 return EOK; 86 87 88 error_leave:89 free(dev);90 return rc;91 77 } 92 78 93 79 /** USB MID driver ops. */ 94 static driver_ops_t mid_driver_ops = {80 static usb_driver_ops_t mid_driver_ops = { 95 81 .add_device = usbmid_add_device, 96 82 }; 97 83 98 84 /** USB MID driver. */ 99 static driver_t mid_driver = {85 static usb_driver_t mid_driver = { 100 86 .name = NAME, 101 .driver_ops = &mid_driver_ops 87 .ops = &mid_driver_ops, 88 .endpoints = NULL 102 89 }; 103 90 … … 107 94 108 95 usb_log_enable(USB_LOG_LEVEL_DEFAULT, NAME); 109 return ddf_driver_main(&mid_driver); 96 97 return usb_driver_main(&mid_driver); 110 98 } 111 99 -
uspace/drv/usbmid/usbmid.c
r841e6e5 r79e1abd 79 79 }; 80 80 81 /** Operations of the device itself. */82 static ddf_dev_ops_t mid_device_ops = {83 .interfaces[USB_DEV_IFACE] = &usb_iface_hub_impl84 };85 86 /** Create new USB multi interface device.87 *88 * @param dev Backing generic DDF device.89 * @return New USB MID device.90 * @retval NULL Error occured.91 */92 usbmid_device_t *usbmid_device_create(ddf_dev_t *dev)93 {94 usbmid_device_t *mid = malloc(sizeof(usbmid_device_t));95 if (mid == NULL) {96 usb_log_error("Out of memory (wanted %zu bytes).\n",97 sizeof(usbmid_device_t));98 return NULL;99 }100 101 int rc;102 rc = usb_device_connection_initialize_from_device(&mid->wire, dev);103 if (rc != EOK) {104 usb_log_error("Failed to initialize `USB wire': %s.\n",105 str_error(rc));106 free(mid);107 return NULL;108 }109 110 rc = usb_pipe_initialize_default_control(&mid->ctrl_pipe,111 &mid->wire);112 if (rc != EOK) {113 usb_log_error("Failed to initialize control pipe: %s.\n",114 str_error(rc));115 free(mid);116 return NULL;117 }118 rc = usb_pipe_probe_default_control(&mid->ctrl_pipe);119 if (rc != EOK) {120 usb_log_error("Probing default control pipe failed: %s.\n",121 str_error(rc));122 free(mid);123 return NULL;124 }125 126 mid->dev = dev;127 (void) &mid_device_ops;128 129 return mid;130 }131 132 81 /** Create new interface for USB MID device. 133 82 * … … 160 109 * @return Error code. 161 110 */ 162 int usbmid_spawn_interface_child(usb mid_device_t *parent,111 int usbmid_spawn_interface_child(usb_device_t *parent, 163 112 const usb_standard_device_descriptor_t *device_descriptor, 164 113 const usb_standard_interface_descriptor_t *interface_descriptor) … … 182 131 183 132 /* Create the device. */ 184 child = ddf_fun_create(parent->d ev, fun_inner, child_name);133 child = ddf_fun_create(parent->ddf_dev, fun_inner, child_name); 185 134 if (child == NULL) { 186 135 rc = ENOMEM; -
uspace/drv/usbmid/usbmid.h
r841e6e5 r79e1abd 41 41 #include <usb/pipes.h> 42 42 #include <usb/debug.h> 43 #include <usb/devdrv.h> 43 44 44 45 #define NAME "usbmid" 45 46 /** USB MID device container. */47 typedef struct {48 /** Device container. */49 ddf_dev_t *dev;50 51 /** Representation of USB wire. */52 usb_device_connection_t wire;53 /** Default control pipe. */54 usb_pipe_t ctrl_pipe;55 } usbmid_device_t;56 57 46 58 47 /** Container for single interface in a MID device. */ … … 65 54 } usbmid_interface_t; 66 55 67 usbmid_device_t *usbmid_device_create(ddf_dev_t *);68 56 usbmid_interface_t *usbmid_interface_create(ddf_fun_t *, int); 69 bool usbmid_explore_device(usb mid_device_t *);70 int usbmid_spawn_interface_child(usb mid_device_t *,57 bool usbmid_explore_device(usb_device_t *); 58 int usbmid_spawn_interface_child(usb_device_t *, 71 59 const usb_standard_device_descriptor_t *, 72 60 const usb_standard_interface_descriptor_t *); -
uspace/lib/c/generic/malloc.c
r841e6e5 r79e1abd 240 240 size_t asize = ALIGN_UP(size, PAGE_SIZE); 241 241 242 astart = as_area_create(astart, asize, AS_AREA_WRITE | AS_AREA_READ );242 astart = as_area_create(astart, asize, AS_AREA_WRITE | AS_AREA_READ | AS_AREA_CACHEABLE); 243 243 if (astart == (void *) -1) 244 244 return false; -
uspace/lib/c/include/ipc/services.h
r841e6e5 r79e1abd 47 47 SERVICE_DEVMAP, 48 48 SERVICE_DEVMAN, 49 SERVICE_FHC, 50 SERVICE_OBIO, 51 SERVICE_APIC, 52 SERVICE_I8259, 49 SERVICE_IRC, 53 50 SERVICE_CLIPBOARD, 54 51 SERVICE_NETWORKING, -
uspace/lib/fs/libfs.c
r841e6e5 r79e1abd 391 391 if (lflag & L_CREATE) 392 392 (void) ops->destroy(fn); 393 else 394 (void) ops->node_put(fn); 393 395 async_answer_0(rid, rc); 394 396 } else { … … 473 475 if (lflag & L_CREATE) 474 476 (void) ops->destroy(fn); 477 else 478 (void) ops->node_put(fn); 475 479 async_answer_0(rid, rc); 476 480 } else { -
uspace/lib/usb/include/usb/host/device_keeper.h
r841e6e5 r79e1abd 51 51 usb_speed_t speed; 52 52 bool occupied; 53 bool control_used; 53 54 uint16_t toggle_status[2]; 54 55 devman_handle_t handle; … … 61 62 struct usb_device_info devices[USB_ADDRESS_COUNT]; 62 63 fibril_mutex_t guard; 63 fibril_condvar_t default_address_occupied;64 fibril_condvar_t change; 64 65 usb_address_t last_address; 65 66 } usb_device_keeper_t; … … 97 98 usb_address_t address); 98 99 100 void usb_device_keeper_use_control(usb_device_keeper_t *instance, 101 usb_address_t address); 102 103 void usb_device_keeper_release_control(usb_device_keeper_t *instance, 104 usb_address_t address); 105 99 106 #endif 100 107 /** -
uspace/lib/usb/src/host/device_keeper.c
r841e6e5 r79e1abd 49 49 assert(instance); 50 50 fibril_mutex_initialize(&instance->guard); 51 fibril_condvar_initialize(&instance-> default_address_occupied);51 fibril_condvar_initialize(&instance->change); 52 52 instance->last_address = 0; 53 53 unsigned i = 0; 54 54 for (; i < USB_ADDRESS_COUNT; ++i) { 55 55 instance->devices[i].occupied = false; 56 instance->devices[i].control_used = false; 56 57 instance->devices[i].handle = 0; 57 58 instance->devices[i].toggle_status[0] = 0; … … 71 72 fibril_mutex_lock(&instance->guard); 72 73 while (instance->devices[USB_ADDRESS_DEFAULT].occupied) { 73 fibril_condvar_wait(&instance->default_address_occupied, 74 &instance->guard); 74 fibril_condvar_wait(&instance->change, &instance->guard); 75 75 } 76 76 instance->devices[USB_ADDRESS_DEFAULT].occupied = true; … … 90 90 instance->devices[USB_ADDRESS_DEFAULT].occupied = false; 91 91 fibril_mutex_unlock(&instance->guard); 92 fibril_condvar_signal(&instance-> default_address_occupied);92 fibril_condvar_signal(&instance->change); 93 93 } 94 94 /*----------------------------------------------------------------------------*/ … … 309 309 return instance->devices[address].speed; 310 310 } 311 311 /*----------------------------------------------------------------------------*/ 312 void usb_device_keeper_use_control(usb_device_keeper_t *instance, 313 usb_address_t address) 314 { 315 assert(instance); 316 fibril_mutex_lock(&instance->guard); 317 while (instance->devices[address].control_used) { 318 fibril_condvar_wait(&instance->change, &instance->guard); 319 } 320 instance->devices[address].control_used = true; 321 fibril_mutex_unlock(&instance->guard); 322 } 323 /*----------------------------------------------------------------------------*/ 324 void usb_device_keeper_release_control(usb_device_keeper_t *instance, 325 usb_address_t address) 326 { 327 assert(instance); 328 fibril_mutex_lock(&instance->guard); 329 instance->devices[address].control_used = false; 330 fibril_mutex_unlock(&instance->guard); 331 fibril_condvar_signal(&instance->change); 332 } 312 333 /** 313 334 * @} -
uspace/srv/hid/kbd/Makefile
r841e6e5 r79e1abd 78 78 SOURCES += \ 79 79 port/pl050.c \ 80 ctl/p l050.c80 ctl/pc.c 81 81 endif 82 82 endif -
uspace/srv/hid/kbd/generic/kbd.c
r841e6e5 r79e1abd 67 67 static unsigned lock_keys; 68 68 69 int cir_service = 0;70 int cir_phone = -1;69 bool irc_service = false; 70 int irc_phone = -1; 71 71 72 72 #define NUM_LAYOUTS 3 … … 216 216 sysarg_t obio; 217 217 218 if ((sysinfo_get_value("kbd.cir.fhc", &fhc) == EOK) && (fhc)) 219 cir_service = SERVICE_FHC; 220 else if ((sysinfo_get_value("kbd.cir.obio", &obio) == EOK) && (obio)) 221 cir_service = SERVICE_OBIO; 222 223 if (cir_service) { 224 while (cir_phone < 0) 225 cir_phone = service_connect_blocking(cir_service, 0, 0); 218 if (((sysinfo_get_value("kbd.cir.fhc", &fhc) == EOK) && (fhc)) 219 || ((sysinfo_get_value("kbd.cir.obio", &obio) == EOK) && (obio))) 220 irc_service = true; 221 222 if (irc_service) { 223 while (irc_phone < 0) 224 irc_phone = service_connect_blocking(SERVICE_IRC, 0, 0); 226 225 } 227 226 -
uspace/srv/hid/kbd/include/kbd.h
r841e6e5 r79e1abd 38 38 #define KBD_KBD_H_ 39 39 40 extern int cir_service; 41 extern int cir_phone; 40 #include <bool.h> 41 42 extern bool irc_service; 43 extern int irc_phone; 42 44 43 45 extern void kbd_push_scancode(int); -
uspace/srv/hid/kbd/port/ns16550.c
r841e6e5 r79e1abd 120 120 kbd_push_scancode(scan_code); 121 121 122 if ( cir_service)123 async_msg_1( cir_phone, IRC_CLEAR_INTERRUPT,122 if (irc_service) 123 async_msg_1(irc_phone, IRC_CLEAR_INTERRUPT, 124 124 IPC_GET_IMETHOD(*call)); 125 125 } -
uspace/srv/hid/kbd/port/z8530.c
r841e6e5 r79e1abd 108 108 kbd_push_scancode(scan_code); 109 109 110 if ( cir_service)111 async_msg_1( cir_phone, IRC_CLEAR_INTERRUPT,110 if (irc_service) 111 async_msg_1(irc_phone, IRC_CLEAR_INTERRUPT, 112 112 IPC_GET_IMETHOD(*call)); 113 113 } -
uspace/srv/hw/irc/apic/apic.c
r841e6e5 r79e1abd 54 54 #define NAME "apic" 55 55 56 static bool apic_found = false;57 58 56 static int apic_enable_irq(sysarg_t irq) 59 57 { … … 81 79 callid = async_get_call(&call); 82 80 83 sysarg_t method = IPC_GET_IMETHOD(call); 84 if (method == IPC_M_PHONE_HUNGUP) { 85 return; 86 } 87 88 if (!apic_found) { 89 async_answer_0(callid, ENOTSUP); 90 break; 91 } 92 93 switch (method) { 81 switch (IPC_GET_IMETHOD(call)) { 94 82 case IRC_ENABLE_INTERRUPT: 95 83 async_answer_0(callid, apic_enable_irq(IPC_GET_ARG1(call))); … … 109 97 * 110 98 */ 111 static voidapic_init(void)99 static bool apic_init(void) 112 100 { 113 101 sysarg_t apic; 114 102 115 apic_found = sysinfo_get_value("apic", &apic) && apic;116 if (!apic_found) {117 printf(NAME ": Warning: no APIC found\n");103 if ((sysinfo_get_value("apic", &apic) != EOK) || (!apic)) { 104 printf(NAME ": No APIC found\n"); 105 return false; 118 106 } 119 107 120 108 async_set_client_connection(apic_connection); 121 service_register(SERVICE_APIC); 109 service_register(SERVICE_IRC); 110 111 return true; 122 112 } 123 113 … … 126 116 printf(NAME ": HelenOS APIC driver\n"); 127 117 128 apic_init(); 129 118 if (!apic_init()) 119 return -1; 120 130 121 printf(NAME ": Accepting connections\n"); 131 122 async_manager(); -
uspace/srv/hw/irc/fhc/fhc.c
r841e6e5 r79e1abd 136 136 137 137 async_set_client_connection(fhc_connection); 138 service_register(SERVICE_ FHC);138 service_register(SERVICE_IRC); 139 139 140 140 return true; -
uspace/srv/hw/irc/i8259/i8259.c
r841e6e5 r79e1abd 149 149 150 150 async_set_client_connection(i8259_connection); 151 service_register(SERVICE_I 8259);151 service_register(SERVICE_IRC); 152 152 153 153 return true; -
uspace/srv/hw/irc/obio/obio.c
r841e6e5 r79e1abd 137 137 138 138 async_set_client_connection(obio_connection); 139 service_register(SERVICE_ OBIO);139 service_register(SERVICE_IRC); 140 140 141 141 return true; -
uspace/srv/hw/netif/ne2000/ne2000.c
r841e6e5 r79e1abd 75 75 #define IRQ_GET_TSR(call) ((int) IPC_GET_ARG3(call)) 76 76 77 static int irc_service = 0;77 static bool irc_service = false; 78 78 static int irc_phone = -1; 79 79 … … 383 383 sysarg_t i8259; 384 384 385 if ((sysinfo_get_value("apic", &apic) == EOK) && (apic)) 386 irc_service = SERVICE_APIC; 387 else if ((sysinfo_get_value("i8259", &i8259) == EOK) && (i8259)) 388 irc_service = SERVICE_I8259; 385 if (((sysinfo_get_value("apic", &apic) == EOK) && (apic)) 386 || ((sysinfo_get_value("i8259", &i8259) == EOK) && (i8259))) 387 irc_service = true; 389 388 390 389 if (irc_service) { 391 390 while (irc_phone < 0) 392 irc_phone = service_connect_blocking( irc_service, 0, 0);391 irc_phone = service_connect_blocking(SERVICE_IRC, 0, 0); 393 392 } 394 393 -
uspace/srv/net/net/net.c
r841e6e5 r79e1abd 289 289 if (rc != EOK) 290 290 return rc; 291 291 292 rc = add_module(NULL, &net_globals.modules, (uint8_t *) NE2000_NAME, 292 293 (uint8_t *) NE2000_FILENAME, SERVICE_NE2000, 0, connect_to_service); 293 294 if (rc != EOK) 294 295 return rc; 296 295 297 rc = add_module(NULL, &net_globals.modules, (uint8_t *) ETHERNET_NAME, 296 298 (uint8_t *) ETHERNET_FILENAME, SERVICE_ETHERNET, 0, connect_to_service); 297 299 if (rc != EOK) 298 300 return rc; 301 299 302 rc = add_module(NULL, &net_globals.modules, (uint8_t *) NILDUMMY_NAME, 300 303 (uint8_t *) NILDUMMY_FILENAME, SERVICE_NILDUMMY, 0, connect_to_service); … … 590 593 rc = start_device(netif); 591 594 if (rc != EOK) { 592 printf("%s: Error startinginterface %s (%s)\n", NAME,595 printf("%s: Ignoring failed interface %s (%s)\n", NAME, 593 596 netif->name, str_error(rc)); 594 597 measured_strings_destroy(&netif->configuration); 595 598 netifs_exclude_index(&net_globals.netifs, index); 596 597 return rc; 599 continue; 598 600 } 599 601 -
uspace/srv/vfs/vfs_ops.c
r841e6e5 r79e1abd 1234 1234 if (!parentc) { 1235 1235 fibril_rwlock_write_unlock(&namespace_rwlock); 1236 vfs_node_put(old_node); 1236 1237 async_answer_0(rid, rc); 1237 1238 free(old); … … 1251 1252 if (rc != EOK) { 1252 1253 fibril_rwlock_write_unlock(&namespace_rwlock); 1254 vfs_node_put(old_node); 1253 1255 async_answer_0(rid, rc); 1254 1256 free(old); … … 1261 1263 (old_node->devmap_handle != new_par_lr.triplet.devmap_handle)) { 1262 1264 fibril_rwlock_write_unlock(&namespace_rwlock); 1265 vfs_node_put(old_node); 1263 1266 async_answer_0(rid, EXDEV); /* different file systems */ 1264 1267 free(old); … … 1279 1282 if (!new_node) { 1280 1283 fibril_rwlock_write_unlock(&namespace_rwlock); 1284 vfs_node_put(old_node); 1281 1285 async_answer_0(rid, ENOMEM); 1282 1286 free(old); … … 1290 1294 default: 1291 1295 fibril_rwlock_write_unlock(&namespace_rwlock); 1296 vfs_node_put(old_node); 1292 1297 async_answer_0(rid, ENOTEMPTY); 1293 1298 free(old); … … 1300 1305 if (rc != EOK) { 1301 1306 fibril_rwlock_write_unlock(&namespace_rwlock); 1307 vfs_node_put(old_node); 1302 1308 if (new_node) 1303 1309 vfs_node_put(new_node); -
version
r841e6e5 r79e1abd 37 37 VERSION = 0 38 38 PATCHLEVEL = 4 39 SUBLEVEL = 239 SUBLEVEL = 3 40 40 41 41 ifdef EXTRAVERSION … … 45 45 endif 46 46 47 NAME = S kewer47 NAME = Sashimi
Note:
See TracChangeset
for help on using the changeset viewer.