Changes in / [917a8c8:27bdfa5] in mainline
- Files:
-
- 202 added
- 36 edited
Legend:
- Unmodified
- Added
- Removed
-
HelenOS.config
r917a8c8 r27bdfa5 550 550 551 551 % Launch (devman) test drivers 552 ! [CONFIG_DEBUG=y] CONFIG_TEST_DRIVERS (y/n) 553 552 ! [CONFIG_DEBUG=y] CONFIG_TEST_DRIVERS (n/y) 553 554 % Start virtual USB host controller 555 ! CONFIG_RUN_VIRTUAL_USB_HC (n/y) 556 557 % Polling UHCI & OHCI (no interrupts) 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 -
Makefile
r917a8c8 r27bdfa5 106 106 $(MAKE) -C uspace clean 107 107 $(MAKE) -C boot clean 108 109 -include Makefile.local -
boot/Makefile.common
r917a8c8 r27bdfa5 139 139 $(USPACE_PATH)/app/ping/ping \ 140 140 $(USPACE_PATH)/app/stats/stats \ 141 $(USPACE_PATH)/app/sysinfo/sysinfo \ 142 $(USPACE_PATH)/app/tasks/tasks \ 141 143 $(USPACE_PATH)/app/top/top \ 142 $(USPACE_PATH)/app/sysinfo/sysinfo \ 144 $(USPACE_PATH)/app/usbinfo/usbinfo \ 145 $(USPACE_PATH)/app/virtusbkbd/vuk \ 146 $(USPACE_PATH)/app/virtusbhub/vuh \ 143 147 $(USPACE_PATH)/app/websrv/websrv 144 148 -
boot/arch/amd64/Makefile.inc
r917a8c8 r27bdfa5 42 42 pciintel \ 43 43 isa \ 44 ns8250 44 ns8250 \ 45 ehci-hcd \ 46 ohci \ 47 uhci-hcd \ 48 uhci-rhd \ 49 usbflbk \ 50 usbhub \ 51 usbkbd \ 52 usbmid \ 53 usbmouse \ 54 vhc 45 55 46 56 RD_DRV_CFG += \ -
kernel/generic/include/mm/page.h
r917a8c8 r27bdfa5 37 37 38 38 #include <typedefs.h> 39 #include <proc/task.h> 39 40 #include <mm/as.h> 40 41 #include <memstr.h> … … 62 63 extern uintptr_t hw_map(uintptr_t, size_t); 63 64 65 extern sysarg_t sys_page_find_mapping(uintptr_t, uintptr_t *); 66 64 67 #endif 65 68 -
kernel/generic/include/syscall/syscall.h
r917a8c8 r27bdfa5 61 61 SYS_AS_GET_UNMAPPED_AREA, 62 62 63 SYS_PAGE_FIND_MAPPING, 64 63 65 SYS_IPC_CALL_SYNC_FAST, 64 66 SYS_IPC_CALL_SYNC_SLOW, -
kernel/generic/src/console/console.c
r917a8c8 r27bdfa5 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
r917a8c8 r27bdfa5 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; -
kernel/generic/src/mm/page.c
r917a8c8 r27bdfa5 60 60 61 61 #include <mm/page.h> 62 #include <genarch/mm/page_ht.h> 63 #include <genarch/mm/page_pt.h> 62 64 #include <arch/mm/page.h> 63 65 #include <arch/mm/asid.h> … … 70 72 #include <debug.h> 71 73 #include <arch.h> 74 #include <syscall/copy.h> 75 #include <errno.h> 72 76 73 77 /** Virtual operations for page subsystem. */ … … 173 177 } 174 178 179 /** Syscall wrapper for getting mapping of a virtual page. 180 * 181 * @retval EOK Everything went find, @p uspace_frame and @p uspace_node 182 * contains correct values. 183 * @retval ENOENT Virtual address has no mapping. 184 */ 185 sysarg_t sys_page_find_mapping(uintptr_t virt_address, 186 uintptr_t *uspace_frame) 187 { 188 mutex_lock(&AS->lock); 189 190 pte_t *pte = page_mapping_find(AS, virt_address); 191 if (!PTE_VALID(pte) || !PTE_PRESENT(pte)) { 192 mutex_unlock(&AS->lock); 193 194 return (sysarg_t) ENOENT; 195 } 196 197 uintptr_t phys_address = PTE_GET_FRAME(pte); 198 199 mutex_unlock(&AS->lock); 200 201 int rc = copy_to_uspace(uspace_frame, 202 &phys_address, sizeof(phys_address)); 203 if (rc != EOK) { 204 return (sysarg_t) rc; 205 } 206 207 return EOK; 208 } 209 175 210 /** @} 176 211 */ -
kernel/generic/src/syscall/syscall.c
r917a8c8 r27bdfa5 41 41 #include <proc/program.h> 42 42 #include <mm/as.h> 43 #include <mm/page.h> 43 44 #include <print.h> 44 45 #include <arch.h> … … 145 146 (syshandler_t) sys_as_get_unmapped_area, 146 147 148 /* Page mapping related syscalls. */ 149 (syshandler_t) sys_page_find_mapping, 150 147 151 /* IPC related syscalls. */ 148 152 (syshandler_t) sys_ipc_call_sync_fast, -
uspace/Makefile
r917a8c8 r27bdfa5 50 50 app/trace \ 51 51 app/top \ 52 app/usbinfo \ 53 app/virtusbkbd \ 54 app/virtusbhub \ 52 55 app/netecho \ 53 56 app/nettest1 \ … … 113 116 drv/ns8250 \ 114 117 srv/hw/irc/apic \ 115 srv/hw/irc/i8259 118 srv/hw/irc/i8259 \ 119 drv/ehci-hcd \ 120 drv/ohci \ 121 drv/uhci-hcd \ 122 drv/uhci-rhd \ 123 drv/usbflbk \ 124 drv/usbkbd \ 125 drv/usbhub \ 126 drv/usbmid \ 127 drv/usbmouse \ 128 drv/vhc 116 129 endif 117 130 … … 123 136 drv/ns8250 \ 124 137 srv/hw/irc/apic \ 125 srv/hw/irc/i8259 138 srv/hw/irc/i8259 \ 139 drv/ehci-hcd \ 140 drv/ohci \ 141 drv/uhci-hcd \ 142 drv/uhci-rhd \ 143 drv/usbflbk \ 144 drv/usbkbd \ 145 drv/usbhub \ 146 drv/usbmid \ 147 drv/usbmouse \ 148 drv/vhc 126 149 endif 127 150 … … 150 173 lib/net 151 174 175 ifeq ($(UARCH),amd64) 176 LIBS += lib/usb 177 LIBS += lib/usbvirt 178 endif 179 180 ifeq ($(UARCH),ia32) 181 LIBS += lib/usb 182 LIBS += lib/usbvirt 183 endif 184 152 185 LIBC_BUILD = $(addsuffix .build,$(LIBC)) 153 186 LIBS_BUILD = $(addsuffix .build,$(LIBS)) -
uspace/Makefile.common
r917a8c8 r27bdfa5 86 86 LIBCLUI_PREFIX = $(LIB_PREFIX)/clui 87 87 88 89 LIBUSB_PREFIX = $(LIB_PREFIX)/usb 90 LIBUSBVIRT_PREFIX = $(LIB_PREFIX)/usbvirt 88 91 LIBDRV_PREFIX = $(LIB_PREFIX)/drv 89 92 LIBPACKET_PREFIX = $(LIB_PREFIX)/packet -
uspace/app/init/init.c
r917a8c8 r27bdfa5 313 313 getterm("term/vc5", "/app/bdsh", false); 314 314 getterm("term/vc6", "/app/klog", false); 315 315 316 #ifdef CONFIG_DEVMAN_EARLY_LAUNCH 317 spawn("/srv/devman"); 318 #else 319 getterm("term/vc7", "/srv/devman", false); 320 #endif 321 316 322 return 0; 317 323 } -
uspace/app/klog/klog.c
r917a8c8 r27bdfa5 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/app/tester/Makefile
r917a8c8 r27bdfa5 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 \ … … 49 53 loop/loop1.c \ 50 54 mm/malloc1.c \ 55 mm/mapping1.c \ 51 56 hw/misc/virtchar1.c \ 52 57 hw/serial/serial1.c -
uspace/app/tester/tester.c
r917a8c8 r27bdfa5 62 62 #include "loop/loop1.def" 63 63 #include "mm/malloc1.def" 64 #include "mm/mapping1.def" 64 65 #include "hw/serial/serial1.def" 66 #include "adt/usbaddrkeep.def" 65 67 #include "hw/misc/virtchar1.def" 66 68 {NULL, NULL, NULL, false} -
uspace/app/tester/tester.h
r917a8c8 r27bdfa5 78 78 extern const char *test_loop1(void); 79 79 extern const char *test_malloc1(void); 80 extern const char *test_mapping1(void); 80 81 extern const char *test_serial1(void); 82 extern const char *test_usbaddrkeep(void); 81 83 extern const char *test_virtchar1(void); 82 84 -
uspace/doc/doxygroups.h
r917a8c8 r27bdfa5 150 150 * @endcond 151 151 */ 152 152 153 153 /** 154 154 * @defgroup emul Emulation Libraries … … 165 165 * @ingroup emul 166 166 */ 167 168 /** 169 * @defgroup usb USB 170 * @ingroup uspace 171 * @brief USB support for HelenOS. 172 */ 173 /** 174 * @defgroup libusb USB library 175 * @ingroup usb 176 * @brief Library for creating USB devices drivers. 177 */ 178 179 /** 180 * @defgroup usbvirt USB virtualization 181 * @ingroup usb 182 * @brief Support for virtual USB devices. 183 */ 184 185 /** 186 * @defgroup libusbvirt USB virtualization library 187 * @ingroup usbvirt 188 * @brief Library for creating virtual USB devices. 189 */ 190 191 /** 192 * @defgroup drvusbvhc Virtual USB host controller 193 * @ingroup usbvirt 194 * @brief Driver simulating work of USB host controller. 195 */ 196 197 /** 198 * @defgroup usbvirthub Virtual USB hub 199 * @ingroup usbvirt 200 * @brief Extra virtual USB hub for virtual host controller. 201 * @details 202 * Some of the sources are shared with virtual host controller, 203 * see @ref drvusbvhc for the rest of the files. 204 */ 205 206 /** 207 * @defgroup usbvirtkbd Virtual USB keybaord 208 * @ingroup usbvirt 209 * @brief Virtual USB keyboard for virtual host controller. 210 */ 211 212 /** 213 * @defgroup usbinfo USB info application 214 * @ingroup usb 215 * @brief Application for querying USB devices. 216 * @details 217 * The intended usage of this application is to query new USB devices 218 * for their descriptors etc. to simplify driver writing. 219 */ 220 221 /** 222 * @defgroup drvusbmid USB multi interface device driver 223 * @ingroup usb 224 * @brief USB multi interface device driver 225 * @details 226 * This driver serves as a mini hub (or bus) driver for devices 227 * that have the class defined at interface level (those devices 228 * usually have several interfaces). 229 * 230 * The term multi interface device driver (MID) was borrowed 231 * Solaris operating system. 232 */ 233 234 /** 235 * @defgroup drvusbhub USB hub driver 236 * @ingroup usb 237 * @brief USB hub driver. 238 */ 239 240 /** 241 * @defgroup drvusbhid USB HID driver 242 * @ingroup usb 243 * @brief USB driver for HID devices. 244 */ 245 246 /** 247 * @defgroup drvusbmouse USB mouse driver 248 * @ingroup usb 249 * @brief USB driver for mouse with boot protocol. 250 */ 251 252 /** 253 * @defgroup drvusbuhci UHCI driver 254 * @ingroup usb 255 * @brief Drivers for USB UHCI host controller and root hub. 256 */ 257 258 /** 259 * @defgroup drvusbuhcirh UHCI root hub driver 260 * @ingroup drvusbuhci 261 * @brief Driver for UHCI complaint root hub. 262 */ 263 264 /** 265 * @defgroup drvusbuhcihc UHCI host controller driver 266 * @ingroup drvusbuhci 267 * @brief Driver for UHCI complaint USB host controller. 268 */ 269 270 /** 271 * @defgroup drvusbehci EHCI driver 272 * @ingroup usb 273 * @brief Driver for EHCI host controller. 274 */ 275 276 /** 277 * @defgroup drvusbfallback USB fallback driver. 278 * @ingroup usb 279 * @brief Fallback driver for any USB device. 280 * @details 281 * The purpose of this driver is to simplify querying of unknown 282 * devices from within HelenOS (without a driver, no node at all 283 * may appear under /dev/devices). 284 */ 285 286 -
uspace/drv/pciintel/pci.c
r917a8c8 r27bdfa5 51 51 #include <ipc/devman.h> 52 52 #include <ipc/dev_iface.h> 53 #include <ipc/irc.h> 54 #include <ipc/ns.h> 55 #include <ipc/services.h> 56 #include <sysinfo.h> 53 57 #include <ops/hw_res.h> 54 58 #include <device/hw_res.h> 55 59 #include <ddi.h> 56 60 #include <libarch/ddi.h> 61 #include <pci_dev_iface.h> 57 62 58 63 #include "pci.h" … … 83 88 static bool pciintel_enable_interrupt(ddf_fun_t *fnode) 84 89 { 85 /* TODO */ 86 87 return false; 90 /* This is an old ugly way, copied from ne2000 driver */ 91 assert(fnode); 92 pci_fun_t *dev_data = (pci_fun_t *) fnode->driver_data; 93 94 sysarg_t apic; 95 sysarg_t i8259; 96 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 104 if (irc_phone < 0) { 105 return false; 106 } 107 108 size_t i; 109 for (i = 0; i < dev_data->hw_resources.count; i++) { 110 if (dev_data->hw_resources.resources[i].type == INTERRUPT) { 111 int irq = dev_data->hw_resources.resources[i].res.interrupt.irq; 112 int rc = async_req_1_0(irc_phone, IRC_ENABLE_INTERRUPT, irq); 113 if (rc != EOK) { 114 async_hangup(irc_phone); 115 return false; 116 } 117 } 118 } 119 120 async_hangup(irc_phone); 121 return true; 122 } 123 124 static int pci_config_space_write_32( 125 ddf_fun_t *fun, uint32_t address, uint32_t data) 126 { 127 if (address > 252) 128 return EINVAL; 129 pci_conf_write_32(PCI_FUN(fun), address, data); 130 return EOK; 131 } 132 133 static int pci_config_space_write_16( 134 ddf_fun_t *fun, uint32_t address, uint16_t data) 135 { 136 if (address > 254) 137 return EINVAL; 138 pci_conf_write_16(PCI_FUN(fun), address, data); 139 return EOK; 140 } 141 142 static int pci_config_space_write_8( 143 ddf_fun_t *fun, uint32_t address, uint8_t data) 144 { 145 if (address > 255) 146 return EINVAL; 147 pci_conf_write_8(PCI_FUN(fun), address, data); 148 return EOK; 149 } 150 151 static int pci_config_space_read_32( 152 ddf_fun_t *fun, uint32_t address, uint32_t *data) 153 { 154 if (address > 252) 155 return EINVAL; 156 *data = pci_conf_read_32(PCI_FUN(fun), address); 157 return EOK; 158 } 159 160 static int pci_config_space_read_16( 161 ddf_fun_t *fun, uint32_t address, uint16_t *data) 162 { 163 if (address > 254) 164 return EINVAL; 165 *data = pci_conf_read_16(PCI_FUN(fun), address); 166 return EOK; 167 } 168 169 static int pci_config_space_read_8( 170 ddf_fun_t *fun, uint32_t address, uint8_t *data) 171 { 172 if (address > 255) 173 return EINVAL; 174 *data = pci_conf_read_8(PCI_FUN(fun), address); 175 return EOK; 88 176 } 89 177 … … 93 181 }; 94 182 95 static ddf_dev_ops_t pci_fun_ops; 183 static pci_dev_iface_t pci_dev_ops = { 184 .config_space_read_8 = &pci_config_space_read_8, 185 .config_space_read_16 = &pci_config_space_read_16, 186 .config_space_read_32 = &pci_config_space_read_32, 187 .config_space_write_8 = &pci_config_space_write_8, 188 .config_space_write_16 = &pci_config_space_write_16, 189 .config_space_write_32 = &pci_config_space_write_32 190 }; 191 192 static ddf_dev_ops_t pci_fun_ops = { 193 .interfaces[HW_RES_DEV_IFACE] = &pciintel_hw_res_ops, 194 .interfaces[PCI_DEV_IFACE] = &pci_dev_ops 195 }; 96 196 97 197 static int pci_add_device(ddf_dev_t *); … … 287 387 /* Get the value of the BAR. */ 288 388 val = pci_conf_read_32(fun, addr); 389 390 #define IO_MASK (~0x3) 391 #define MEM_MASK (~0xf) 289 392 290 393 io = (bool) (val & 1); 291 394 if (io) { 292 395 addrw64 = false; 396 mask = IO_MASK; 293 397 } else { 398 mask = MEM_MASK; 294 399 switch ((val >> 1) & 3) { 295 400 case 0: … … 307 412 /* Get the address mask. */ 308 413 pci_conf_write_32(fun, addr, 0xffffffff); 309 mask = pci_conf_read_32(fun, addr);414 mask &= pci_conf_read_32(fun, addr); 310 415 311 416 /* Restore the original value. */ … … 555 660 { 556 661 pci_fun_ops.interfaces[HW_RES_DEV_IFACE] = &pciintel_hw_res_ops; 662 pci_fun_ops.interfaces[PCI_DEV_IFACE] = &pci_dev_ops; 557 663 } 558 664 … … 626 732 size_t pci_bar_mask_to_size(uint32_t mask) 627 733 { 628 return ((mask & 0xfffffff0) ^ 0xffffffff) + 1; 734 size_t size = mask & ~(mask - 1); 735 return size; 629 736 } 630 737 -
uspace/drv/rootvirt/devices.def
r917a8c8 r27bdfa5 22 22 }, 23 23 #endif 24 #ifdef CONFIG_RUN_VIRTUAL_USB_HC 25 /* Virtual USB host controller. */ 26 { 27 .name = "usbhc", 28 .match_id = "usb&hc=vhc" 29 }, 30 #endif -
uspace/lib/c/Makefile
r917a8c8 r27bdfa5 65 65 generic/str.c \ 66 66 generic/str_error.c \ 67 generic/l18n/langs.c \ 67 68 generic/fibril.c \ 68 69 generic/fibril_synch.c \ -
uspace/lib/c/generic/as.c
r917a8c8 r27bdfa5 35 35 #include <as.h> 36 36 #include <libc.h> 37 #include <errno.h> 37 38 #include <unistd.h> 38 39 #include <align.h> … … 114 115 } 115 116 117 /** Find mapping to physical address. 118 * 119 * @param address Virtual address in question (virtual). 120 * @param[out] frame Frame address (physical). 121 * @return Error code. 122 * @retval EOK No error, @p frame holds the translation. 123 * @retval ENOENT Mapping not found. 124 */ 125 int as_get_physical_mapping(void *address, uintptr_t *frame) 126 { 127 uintptr_t tmp_frame; 128 uintptr_t virt = (uintptr_t) address; 129 130 int rc = (int) __SYSCALL2(SYS_PAGE_FIND_MAPPING, 131 (sysarg_t) virt, (sysarg_t) &tmp_frame); 132 if (rc != EOK) { 133 return rc; 134 } 135 136 if (frame != NULL) { 137 *frame = tmp_frame; 138 } 139 140 return EOK; 141 } 142 116 143 /** @} 117 144 */ -
uspace/lib/c/generic/async.c
r917a8c8 r27bdfa5 1567 1567 } 1568 1568 1569 /** Start IPC_M_DATA_READ using the async framework. 1570 * 1571 * @param phoneid Phone that will be used to contact the receiving side. 1572 * @param dst Address of the beginning of the destination buffer. 1573 * @param size Size of the destination buffer (in bytes). 1574 * @param dataptr Storage of call data (arg 2 holds actual data size). 1575 * @return Hash of the sent message or 0 on error. 1576 */ 1577 aid_t async_data_read(int phoneid, void *dst, size_t size, ipc_call_t *dataptr) 1578 { 1579 return async_send_2(phoneid, IPC_M_DATA_READ, (sysarg_t) dst, 1580 (sysarg_t) size, dataptr); 1581 } 1582 1569 1583 /** Wrapper for IPC_M_DATA_READ calls using the async framework. 1570 1584 * -
uspace/lib/c/generic/malloc.c
r917a8c8 r27bdfa5 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/generic/str_error.c
r917a8c8 r27bdfa5 33 33 */ 34 34 35 #include <errno.h> 35 36 #include <str_error.h> 36 37 #include <stdio.h> … … 63 64 static fibril_local char noerr[NOERR_LEN]; 64 65 65 const char *str_error(const int e rrno)66 const char *str_error(const int e) 66 67 { 67 if ((e rrno <= 0) && (errno>= MIN_ERRNO))68 return err_desc[-e rrno];68 if ((e <= 0) && (e >= MIN_ERRNO)) 69 return err_desc[-e]; 69 70 70 snprintf(noerr, NOERR_LEN, "Unkown error code %d", errno); 71 /* Ad hoc descriptions of error codes interesting for USB. */ 72 switch (e) { 73 case EBADCHECKSUM: 74 return "Bad checksum"; 75 case ESTALL: 76 return "Operation stalled"; 77 case EAGAIN: 78 return "Resource temporarily unavailable"; 79 case EEMPTY: 80 return "Resource is empty"; 81 default: 82 break; 83 } 84 85 snprintf(noerr, NOERR_LEN, "Unkown error code %d", e); 71 86 return noerr; 72 87 } -
uspace/lib/c/include/as.h
r917a8c8 r27bdfa5 60 60 extern void *set_maxheapsize(size_t mhs); 61 61 extern void * as_get_mappable_page(size_t sz); 62 extern int as_get_physical_mapping(void *address, uintptr_t *frame); 62 63 63 64 #endif -
uspace/lib/c/include/async.h
r917a8c8 r27bdfa5 340 340 (arg4), (answer)) 341 341 342 extern aid_t async_data_read(int, void *, size_t, ipc_call_t *); 342 343 extern int async_data_read_start(int, void *, size_t); 343 344 extern bool async_data_read_receive(ipc_callid_t *, size_t *); -
uspace/lib/c/include/errno.h
r917a8c8 r27bdfa5 56 56 #define EMLINK (-266) 57 57 58 /** Bad checksum. */ 59 #define EBADCHECKSUM (-300) 60 61 /** USB: stalled operation. */ 62 #define ESTALL (-301) 63 64 /** Empty resource (no data). */ 65 #define EEMPTY (-302) 66 58 67 /** An API function is called while another blocking function is in progress. */ 59 68 #define EINPROGRESS (-10036) -
uspace/lib/c/include/ipc/dev_iface.h
r917a8c8 r27bdfa5 37 37 HW_RES_DEV_IFACE = 0, 38 38 CHAR_DEV_IFACE, 39 40 /** Interface provided by any PCI device. */ 41 PCI_DEV_IFACE, 42 43 /** Interface provided by any USB device. */ 44 USB_DEV_IFACE, 45 /** Interface provided by USB host controller. */ 46 USBHC_DEV_IFACE, 47 39 48 DEV_IFACE_MAX 40 49 } dev_inferface_idx_t; … … 48 57 DEV_IFACE_ID(DEV_FIRST_CUSTOM_METHOD_IDX) 49 58 59 /* 60 * The first argument is actually method (as the "real" method is used 61 * for indexing into interfaces. 62 */ 63 64 #define DEV_IPC_GET_ARG1(call) IPC_GET_ARG2((call)) 65 #define DEV_IPC_GET_ARG2(call) IPC_GET_ARG3((call)) 66 #define DEV_IPC_GET_ARG3(call) IPC_GET_ARG4((call)) 67 #define DEV_IPC_GET_ARG4(call) IPC_GET_ARG5((call)) 68 50 69 51 70 #endif -
uspace/lib/c/include/ipc/kbd.h
r917a8c8 r27bdfa5 39 39 40 40 #include <ipc/common.h> 41 #include <ipc/dev_iface.h> 41 42 42 43 typedef enum { 43 KBD_YIELD = IPC_FIRST_USER_METHOD,44 KBD_YIELD = DEV_FIRST_CUSTOM_METHOD, 44 45 KBD_RECLAIM 45 46 } kbd_request_t; -
uspace/lib/drv/Makefile
r917a8c8 r27bdfa5 29 29 30 30 USPACE_PREFIX = ../.. 31 EXTRA_CFLAGS = -Iinclude 31 EXTRA_CFLAGS = -Iinclude -I$(LIBUSB_PREFIX)/include 32 32 LIBRARY = libdrv 33 33 … … 35 35 generic/driver.c \ 36 36 generic/dev_iface.c \ 37 generic/remote_char_dev.c \ 37 38 generic/remote_hw_res.c \ 38 generic/remote_char_dev.c 39 generic/remote_usb.c \ 40 generic/remote_pci.c \ 41 generic/remote_usbhc.c 39 42 40 43 include $(USPACE_PREFIX)/Makefile.common -
uspace/lib/drv/generic/dev_iface.c
r917a8c8 r27bdfa5 41 41 #include "remote_hw_res.h" 42 42 #include "remote_char_dev.h" 43 #include "remote_usb.h" 44 #include "remote_usbhc.h" 45 #include "remote_pci.h" 43 46 44 47 static iface_dipatch_table_t remote_ifaces = { 45 48 .ifaces = { 46 49 &remote_hw_res_iface, 47 &remote_char_dev_iface 50 &remote_char_dev_iface, 51 &remote_pci_iface, 52 &remote_usb_iface, 53 &remote_usbhc_iface 48 54 } 49 55 }; -
uspace/srv/devman/devman.c
r917a8c8 r27bdfa5 148 148 printf(NAME": the '%s' driver was added to the list of available " 149 149 "drivers.\n", drv->name); 150 151 printf(NAME ": match ids:"); 152 link_t *cur; 153 for (cur = drv->match_ids.ids.next; cur != &drv->match_ids.ids; cur = cur->next) { 154 match_id_t *match_id = list_get_instance(cur, match_id_t, link); 155 printf(" %d:%s", match_id->score, match_id->id); 156 } 157 printf("\n"); 150 158 } 151 159 -
uspace/srv/devman/main.c
r917a8c8 r27bdfa5 513 513 514 514 if (driver == NULL) { 515 printf(NAME ": devman_forward error - the device is not in %" PRIun 516 " usable state.\n", handle); 515 printf(NAME ": devman_forward error - the device %" PRIun \ 516 " (%s) is not in usable state.\n", 517 handle, dev->pfun->pathname); 517 518 async_answer_0(iid, ENOENT); 518 519 return; -
uspace/srv/fs/fat/fat_dentry.c
r917a8c8 r27bdfa5 42 42 static bool is_d_char(const char ch) 43 43 { 44 if (isalnum(ch) || ch == '_' )44 if (isalnum(ch) || ch == '_' || ch == '-') 45 45 return true; 46 46 else -
uspace/srv/hid/console/console.c
r917a8c8 r27bdfa5 41 41 #include <ipc/ns.h> 42 42 #include <errno.h> 43 #include <str_error.h> 43 44 #include <ipc/console.h> 44 45 #include <unistd.h> … … 64 65 #define NAME "console" 65 66 #define NAMESPACE "term" 67 /** Interval for checking for new keyboard (1/4s). */ 68 #define HOTPLUG_WATCH_INTERVAL (1000 * 250) 66 69 67 70 /** Phone to the keyboard driver. */ … … 317 320 static void change_console(console_t *cons) 318 321 { 319 if (cons == active_console) 322 if (cons == active_console) { 320 323 return; 324 } 321 325 322 326 fb_pending_flush(); … … 458 462 if (IPC_GET_ARG1(call) == 1) { 459 463 int newcon = gcons_mouse_btn((bool) IPC_GET_ARG2(call)); 460 if (newcon != -1) 464 if (newcon != -1) { 461 465 change_console(&consoles[newcon]); 466 } 462 467 } 463 468 retval = 0; … … 710 715 } 711 716 717 static int connect_keyboard_or_mouse(const char *devname, 718 async_client_conn_t handler, const char *path) 719 { 720 int fd = open(path, O_RDONLY); 721 if (fd < 0) { 722 return fd; 723 } 724 725 int phone = fd_phone(fd); 726 if (phone < 0) { 727 printf(NAME ": Failed to connect to input device\n"); 728 return phone; 729 } 730 731 int rc = async_connect_to_me(phone, SERVICE_CONSOLE, 0, 0, handler); 732 if (rc != EOK) { 733 printf(NAME ": " \ 734 "Failed to create callback from input device: %s.\n", 735 str_error(rc)); 736 return rc; 737 } 738 739 printf(NAME ": found %s \"%s\".\n", devname, path); 740 741 return phone; 742 } 743 744 static int connect_keyboard(const char *path) 745 { 746 return connect_keyboard_or_mouse("keyboard", keyboard_events, path); 747 } 748 749 static int connect_mouse(const char *path) 750 { 751 return connect_keyboard_or_mouse("mouse", mouse_events, path); 752 } 753 754 struct hid_class_info { 755 char *classname; 756 int (*connection_func)(const char *); 757 }; 758 759 /** Periodically check for new keyboards in /dev/class/. 760 * 761 * @param arg Class name. 762 * @return This function should never exit. 763 */ 764 static int check_new_device_fibril(void *arg) 765 { 766 struct hid_class_info *dev_info = arg; 767 768 size_t index = 1; 769 770 while (true) { 771 async_usleep(HOTPLUG_WATCH_INTERVAL); 772 char *path; 773 int rc = asprintf(&path, "/dev/class/%s\\%zu", 774 dev_info->classname, index); 775 if (rc < 0) { 776 continue; 777 } 778 rc = 0; 779 rc = dev_info->connection_func(path); 780 if (rc > 0) { 781 /* We do not allow unplug. */ 782 index++; 783 } 784 785 free(path); 786 } 787 788 return EOK; 789 } 790 791 792 /** Start a fibril monitoring hot-plugged keyboards. 793 */ 794 static void check_new_devices_in_background(int (*connection_func)(const char *), 795 const char *classname) 796 { 797 struct hid_class_info *dev_info = malloc(sizeof(struct hid_class_info)); 798 if (dev_info == NULL) { 799 printf(NAME ": " \ 800 "out of memory, will not start hot-plug-watch fibril.\n"); 801 return; 802 } 803 int rc; 804 805 rc = asprintf(&dev_info->classname, "%s", classname); 806 if (rc < 0) { 807 printf(NAME ": failed to format classname: %s.\n", 808 str_error(rc)); 809 return; 810 } 811 dev_info->connection_func = connection_func; 812 813 fid_t fid = fibril_create(check_new_device_fibril, (void *)dev_info); 814 if (!fid) { 815 printf(NAME 816 ": failed to create hot-plug-watch fibril for %s.\n", 817 classname); 818 return; 819 } 820 fibril_add_ready(fid); 821 } 822 712 823 static bool console_init(char *input) 713 824 { 714 825 /* Connect to input device */ 715 int input_fd = open(input, O_RDONLY); 716 if (input_fd < 0) { 717 printf(NAME ": Failed opening %s\n", input); 826 kbd_phone = connect_keyboard(input); 827 if (kbd_phone < 0) { 718 828 return false; 719 829 } 720 721 kbd_phone = fd_phone(input_fd); 722 if (kbd_phone < 0) { 723 printf(NAME ": Failed to connect to input device\n"); 724 return false; 725 } 726 727 /* NB: The callback connection is slotted for removal */ 728 if (async_connect_to_me(kbd_phone, SERVICE_CONSOLE, 0, 0, keyboard_events) 729 != 0) { 730 printf(NAME ": Failed to create callback from input device\n"); 731 return false; 732 } 733 734 /* Connect to mouse device */ 735 mouse_phone = -1; 736 int mouse_fd = open("/dev/hid_in/mouse", O_RDONLY); 737 738 if (mouse_fd < 0) { 739 printf(NAME ": Notice - failed opening %s\n", "/dev/hid_in/mouse"); 740 goto skip_mouse; 741 } 742 743 mouse_phone = fd_phone(mouse_fd); 830 831 mouse_phone = connect_mouse("/dev/hid_in/mouse"); 744 832 if (mouse_phone < 0) { 745 printf(NAME ": Failed to connect to mouse device\n"); 746 goto skip_mouse; 747 } 748 749 if (async_connect_to_me(mouse_phone, SERVICE_CONSOLE, 0, 0, mouse_events) 750 != 0) { 751 printf(NAME ": Failed to create callback from mouse device\n"); 752 mouse_phone = -1; 753 goto skip_mouse; 754 } 755 756 skip_mouse: 833 printf(NAME ": Failed to connect to mouse device: %s.\n", 834 str_error(mouse_phone)); 835 } 757 836 758 837 /* Connect to framebuffer driver */ … … 837 916 printf(NAME ": Error registering kconsole notifications\n"); 838 917 918 /* Start fibril for checking on hot-plugged keyboards. */ 919 check_new_devices_in_background(connect_keyboard, "keyboard"); 920 check_new_devices_in_background(connect_mouse, "mouse"); 921 839 922 return true; 840 923 } … … 856 939 if (!console_init(argv[1])) 857 940 return -1; 858 941 859 942 printf(NAME ": Accepting connections\n"); 860 943 async_manager();
Note:
See TracChangeset
for help on using the changeset viewer.