Changeset c2417bc in mainline
- Timestamp:
- 2009-04-21T12:46:26Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f2d2c7ba
- Parents:
- 44b7783
- Files:
-
- 4 deleted
- 34 edited
- 4 moved
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/amd64/src/amd64.c
r44b7783 rc2417bc 198 198 * module and connect it to i8042. Enable keyboard interrupts. 199 199 */ 200 indev_t *kbrdin = i8042_init((i8042_t *) I8042_BASE, IRQ_KBD); 201 if (kbrdin) { 202 kbrd_init(kbrdin); 203 trap_virtual_enable_irqs(1 << IRQ_KBD); 200 i8042_instance_t *i8042_instance = i8042_init((i8042_t *) I8042_BASE, IRQ_KBD); 201 if (i8042_instance) { 202 kbrd_instance_t *kbrd_instance = kbrd_init(); 203 if (kbrd_instance) { 204 indev_t *sink = stdin_wire(); 205 indev_t *kbrd = kbrd_wire(kbrd_instance, sink); 206 i8042_wire(i8042_instance, kbrd); 207 trap_virtual_enable_irqs(1 << IRQ_KBD); 208 } 204 209 } 205 210 -
kernel/arch/arm32/Makefile.inc
r44b7783 rc2417bc 52 52 arch/$(KARCH)/src/ddi/ddi.c \ 53 53 arch/$(KARCH)/src/interrupt.c \ 54 arch/$(KARCH)/src/console.c \55 54 arch/$(KARCH)/src/exception.c \ 56 55 arch/$(KARCH)/src/userspace.c \ -
kernel/arch/arm32/src/arm32.c
r44b7783 rc2417bc 36 36 #include <arch.h> 37 37 #include <config.h> 38 #include <arch/console.h>39 38 #include <genarch/fb/fb.h> 40 39 #include <genarch/fb/visuals.h> … … 43 42 #include <genarch/srln/srln.h> 44 43 #include <sysinfo/sysinfo.h> 44 #include <console/console.h> 45 45 #include <ddi/irq.h> 46 46 #include <arch/drivers/gxemul.h> … … 130 130 /* 131 131 * Initialize the GXemul keyboard port. Then initialize the serial line 132 * module and connect it to the GXemul keyboard. Enable keyboard interrupts.132 * module and connect it to the GXemul keyboard. 133 133 */ 134 indev_t *kbrdin = dsrlnin_init((dsrlnin_t *) gxemul_kbd, GXEMUL_KBD_IRQ); 135 if (kbrdin) 136 srln_init(kbrdin); 134 dsrlnin_instance_t *dsrlnin_instance 135 = dsrlnin_init((dsrlnin_t *) gxemul_kbd, GXEMUL_KBD_IRQ); 136 if (dsrlnin_instance) { 137 srln_instance_t *srln_instance = srln_init(); 138 if (srln_instance) { 139 indev_t *sink = stdin_wire(); 140 indev_t *srln = srln_wire(srln_instance, sink); 141 dsrlnin_wire(dsrlnin_instance, srln); 142 } 143 } 137 144 138 145 /* … … 202 209 } 203 210 211 /** Acquire console back for kernel. */ 212 void arch_grab_console(void) 213 { 214 #ifdef CONFIG_FB 215 fb_redraw(); 216 #endif 217 } 218 219 /** Return console to userspace. */ 220 void arch_release_console(void) 221 { 222 } 223 204 224 /** @} 205 225 */ -
kernel/arch/ia32/src/ia32.c
r44b7783 rc2417bc 81 81 { 82 82 /* Parse multiboot information obtained from the bootloader. */ 83 multiboot_info_parse(signature, mi); 83 multiboot_info_parse(signature, mi); 84 84 85 85 #ifdef CONFIG_SMP … … 156 156 * module and connect it to i8042. Enable keyboard interrupts. 157 157 */ 158 indev_t *kbrdin = i8042_init((i8042_t *) I8042_BASE, IRQ_KBD); 159 if (kbrdin) { 160 kbrd_init(kbrdin); 161 trap_virtual_enable_irqs(1 << IRQ_KBD); 158 i8042_instance_t *i8042_instance = i8042_init((i8042_t *) I8042_BASE, IRQ_KBD); 159 if (i8042_instance) { 160 kbrd_instance_t *kbrd_instance = kbrd_init(); 161 if (kbrd_instance) { 162 indev_t *sink = stdin_wire(); 163 indev_t *kbrd = kbrd_wire(kbrd_instance, sink); 164 i8042_wire(i8042_instance, kbrd); 165 trap_virtual_enable_irqs(1 << IRQ_KBD); 166 } 162 167 } 163 168 -
kernel/arch/ia64/Makefile.inc
r44b7783 rc2417bc 65 65 66 66 ifeq ($(MACHINE),ski) 67 ARCH_SOURCES += arch/$(KARCH)/src/ski/ski.c 68 DEFS += -DSKI 67 ARCH_SOURCES += arch/$(KARCH)/src/drivers/ski.c 69 68 BFD = binary 70 69 endif -
kernel/arch/ia64/include/arch.h
r44b7783 rc2417bc 27 27 */ 28 28 29 /** @addtogroup ia64 29 /** @addtogroup ia64 30 30 * @{ 31 31 */ … … 38 38 #define LOADED_PROG_STACK_PAGES_NO 2 39 39 40 #include <arch/ ski/ski.h>40 #include <arch/drivers/ski.h> 41 41 42 42 extern void arch_pre_main(void); -
kernel/arch/ia64/include/drivers/ski.h
r44b7783 rc2417bc 27 27 */ 28 28 29 /** @addtogroup ia64 29 /** @addtogroup ia64 30 30 * @{ 31 31 */ … … 37 37 38 38 #include <console/chardev.h> 39 #include <proc/thread.h> 39 40 40 #define SKI_INIT_CONSOLE 20 41 #define SKI_GETCHAR 21 42 #define SKI_PUTCHAR 31 41 typedef struct { 42 thread_t *thread; 43 indev_t *srlnin; 44 } ski_instance_t; 43 45 44 extern indev_t *skiin_init(void);45 46 extern void skiout_init(void); 47 48 extern ski_instance_t *skiin_init(void); 49 extern void skiin_wire(ski_instance_t *, indev_t *); 46 50 extern void ski_kbd_grab(void); 47 51 extern void ski_kbd_release(void); -
kernel/arch/ia64/src/drivers/ski.c
r44b7783 rc2417bc 33 33 */ 34 34 35 #include <arch/ ski/ski.h>35 #include <arch/drivers/ski.h> 36 36 #include <console/console.h> 37 37 #include <console/chardev.h> … … 45 45 #include <arch.h> 46 46 47 static indev_t skiin; /**< Ski input device. */ 48 static outdev_t skiout; /**< Ski output device. */ 49 50 static bool kbd_disabled; 47 #define POLL_INTERVAL 10000 /* 10 ms */ 48 49 #define SKI_INIT_CONSOLE 20 50 #define SKI_GETCHAR 21 51 #define SKI_PUTCHAR 31 52 53 static void ski_putchar(outdev_t *, const wchar_t, bool); 54 55 static outdev_operations_t skiout_ops = { 56 .write = ski_putchar 57 }; 58 59 static outdev_t skiout; /**< Ski output device. */ 60 static bool initialized = false; 61 static bool kbd_disabled = false; 62 63 /** Initialize debug console 64 * 65 * Issue SSC (Simulator System Call) to 66 * to open debug console. 67 * 68 */ 69 static void ski_init(void) 70 { 71 if (initialized) 72 return; 73 74 asm volatile ( 75 "mov r15 = %0\n" 76 "break 0x80000\n" 77 : 78 : "i" (SKI_INIT_CONSOLE) 79 : "r15", "r8" 80 ); 81 82 initialized = true; 83 } 51 84 52 85 static void ski_do_putchar(const wchar_t ch) … … 55 88 "mov r15 = %[cmd]\n" 56 89 "mov r32 = %[ch]\n" /* r32 is in0 */ 57 "break 0x80000\n" /* modifies r8 */90 "break 0x80000\n" /* modifies r8 */ 58 91 : 59 92 : [cmd] "i" (SKI_PUTCHAR), [ch] "r" (ch) … … 67 100 * display character on debug console. 68 101 * 69 * @param d Character device. 70 * @param ch Character to be printed. 71 */ 72 static void ski_putchar(outdev_t *d, const wchar_t ch, bool silent) 102 * @param dev Character device. 103 * @param ch Character to be printed. 104 * @param silent Whether the output should be silenced. 105 * 106 */ 107 static void ski_putchar(outdev_t *dev, const wchar_t ch, bool silent) 73 108 { 74 109 if (!silent) { … … 79 114 ski_do_putchar(ch); 80 115 } else 81 ski_do_putchar( SPECIAL);116 ski_do_putchar(U_SPECIAL); 82 117 } 83 118 } 84 119 85 static indev_operations_t skiin_ops = { 86 .poll = NULL 87 }; 88 89 static outdev_operations_t skiout_ops = { 90 .write = ski_putchar 91 }; 120 void skiout_init(void) 121 { 122 ski_init(); 123 124 outdev_initialize("skiout", &skiout, &skiout_ops); 125 stdout = &skiout; 126 127 sysinfo_set_item_val("fb", NULL, false); 128 } 92 129 93 130 /** Ask debug console if a key was pressed. … … 99 136 * 100 137 * @return ASCII code of pressed key or 0 if no key pressed. 101 */ 102 static int32_t ski_getchar(void) 138 * 139 */ 140 static wchar_t ski_getchar(void) 103 141 { 104 142 uint64_t ch; … … 106 144 asm volatile ( 107 145 "mov r15 = %1\n" 108 "break 0x80000;;\n" 109 "mov %0 = r8;;\n" 110 146 "break 0x80000;;\n" /* modifies r8 */ 147 "mov %0 = r8;;\n" 148 111 149 : "=r" (ch) 112 150 : "i" (SKI_GETCHAR) 113 151 : "r15", "r8" 114 152 ); 115 116 return ( int32_t) ch;153 154 return (wchar_t) ch; 117 155 } 118 156 119 157 /** Ask keyboard if a key was pressed. */ 120 static void poll_keyboard(void) 121 { 122 char ch; 123 158 static void poll_keyboard(ski_instance_t *instance) 159 { 124 160 if (kbd_disabled) 125 161 return; 126 ch = ski_getchar(); 127 if(ch == '\r') 128 ch = '\n'; 129 if (ch) { 130 indev_push_character(&skiin, ch); 131 return; 132 } 133 } 134 135 #define POLL_INTERVAL 10000 /* 10 ms */ 162 163 wchar_t ch = ski_getchar(); 164 165 if (ch != 0) 166 indev_push_character(instance->srlnin, ch); 167 } 136 168 137 169 /** Kernel thread for polling keyboard. */ 138 static void kkbdpoll(void *arg) 139 { 140 while (1) { 141 if (!silent) { 142 poll_keyboard(); 143 } 170 static void kskipoll(void *arg) 171 { 172 ski_instance_t *instance = (ski_instance_t *) arg; 173 174 while (true) { 175 if (!silent) 176 poll_keyboard(instance); 177 144 178 thread_usleep(POLL_INTERVAL); 145 179 } 146 180 } 147 181 148 /** Initialize debug console 149 * 150 * Issue SSC (Simulator System Call) to 151 * to open debug console. 152 */ 153 static void ski_init(void) 154 { 155 static bool initialized; 156 157 if (initialized) 158 return; 159 160 asm volatile ( 161 "mov r15 = %0\n" 162 "break 0x80000\n" 163 : 164 : "i" (SKI_INIT_CONSOLE) 165 : "r15", "r8" 166 ); 167 168 initialized = true; 169 } 170 171 indev_t *skiin_init(void) 182 ski_instance_t *skiin_init(void) 172 183 { 173 184 ski_init(); 174 175 indev_initialize("skiin", &skiin, &skiin_ops); 176 thread_t *t = thread_create(kkbdpoll, NULL, TASK, 0, "kkbdpoll", true); 177 if (t) 178 thread_ready(t); 179 else 180 return NULL; 181 185 186 ski_instance_t *instance 187 = malloc(sizeof(ski_instance_t), FRAME_ATOMIC); 188 189 if (instance) { 190 instance->thread = thread_create(kskipoll, (void *) instance, TASK, 0, "kskipoll", true); 191 192 if (!instance->thread) { 193 free(instance); 194 return NULL; 195 } 196 197 instance->srlnin = NULL; 198 } 199 200 return instance; 201 } 202 203 void skiin_wire(ski_instance_t *instance, indev_t *srlnin) 204 { 205 ASSERT(instance); 206 ASSERT(srlnin); 207 208 instance->srlnin = srlnin; 209 thread_ready(instance->thread); 210 182 211 sysinfo_set_item_val("kbd", NULL, true); 183 212 sysinfo_set_item_val("kbd.type", NULL, KBD_SKI); 184 185 return &skiin;186 }187 188 189 void skiout_init(void)190 {191 ski_init();192 193 outdev_initialize("skiout", &skiout, &skiout_ops);194 stdout = &skiout;195 196 sysinfo_set_item_val("fb", NULL, false);197 213 } 198 214 -
kernel/arch/ia64/src/ia64.c
r44b7783 rc2417bc 34 34 35 35 #include <arch.h> 36 #include <arch/ ski/ski.h>36 #include <arch/drivers/ski.h> 37 37 #include <arch/drivers/it.h> 38 38 #include <arch/interrupt.h> … … 149 149 void arch_post_smp_init(void) 150 150 { 151 #ifdef SKI 152 indev_t *in; 153 in = skiin_init(); 154 if (in) 155 srln_init(in); 151 #ifdef MACHINE_ski 152 ski_instance_t *ski_instance = skiin_init(); 153 if (ski_instance) { 154 srln_instance_t *srln_instance = srln_init(); 155 if (srln_instance) { 156 indev_t *sink = stdin_wire(); 157 indev_t *srln = srln_wire(srln_instance, sink); 158 skiin_wire(ski_instance, srln); 159 } 160 } 161 156 162 skiout_init(); 157 163 #endif … … 162 168 163 169 #ifdef CONFIG_NS16550 164 indev_t *kbrdin_ns16550170 ns16550_instance_t *ns16550_instance 165 171 = ns16550_init((ns16550_t *) NS16550_BASE, NS16550_IRQ, NULL, NULL); 166 if (kbrdin_ns16550) 167 srln_init(kbrdin_ns16550); 172 if (ns16550_instance) { 173 srln_instance_t *srln_instance = srln_init(); 174 if (srln_instance) { 175 indev_t *sink = stdin_wire(); 176 indev_t *srln = srln_wire(srln_instance, sink); 177 ns16550_wire(ns16550_instance, srln); 178 } 179 } 168 180 169 181 sysinfo_set_item_val("kbd", NULL, true); … … 177 189 178 190 #ifdef CONFIG_I8042 179 indev_t *kbrdin_i8042 = i8042_init((i8042_t *) I8042_BASE, IRQ_KBD); 180 if (kbrdin_i8042) 181 kbrd_init(kbrdin_i8042); 191 i8042_instance_t *i8042_instance = i8042_init((i8042_t *) I8042_BASE, IRQ_KBD); 192 if (i8042_instance) { 193 kbrd_instance_t *kbrd_instance = kbrd_init(); 194 if (kbrd_instance) { 195 indev_t *sink = stdin_wire(); 196 indev_t *kbrd = kbrd_wire(kbrd_instance, sink); 197 i8042_wire(i8042_instance, kbrd); 198 } 199 } 182 200 183 201 sysinfo_set_item_val("kbd", NULL, true); … … 239 257 void arch_grab_console(void) 240 258 { 241 #ifdef SKI259 #ifdef MACHINE_ski 242 260 ski_kbd_grab(); 243 261 #endif … … 249 267 void arch_release_console(void) 250 268 { 251 #ifdef SKI269 #ifdef MACHINE_ski 252 270 ski_kbd_release(); 253 271 #endif -
kernel/arch/ia64/src/smp/smp.c
r44b7783 rc2417bc 34 34 35 35 #include <arch.h> 36 #include <arch/ ski/ski.h>36 #include <arch/drivers/ski.h> 37 37 #include <arch/drivers/it.h> 38 38 #include <arch/interrupt.h> -
kernel/arch/mips32/Makefile.inc
r44b7783 rc2417bc 61 61 arch/$(KARCH)/src/panic.S \ 62 62 arch/$(KARCH)/src/mips32.c \ 63 arch/$(KARCH)/src/console.c \64 63 arch/$(KARCH)/src/asm.S \ 65 64 arch/$(KARCH)/src/exception.c \ -
kernel/arch/mips32/src/mips32.c
r44b7783 rc2417bc 37 37 #include <arch/exception.h> 38 38 #include <mm/as.h> 39 40 39 #include <userspace.h> 41 #include <arch/console.h>42 40 #include <memstr.h> 43 41 #include <proc/thread.h> 44 42 #include <proc/uarg.h> 45 43 #include <print.h> 44 #include <console/console.h> 46 45 #include <syscall/syscall.h> 47 46 #include <sysinfo/sysinfo.h> 48 49 47 #include <arch/interrupt.h> 50 48 #include <console/chardev.h> … … 60 58 #include <string.h> 61 59 #include <arch/drivers/msim.h> 62 63 60 #include <arch/asm/regname.h> 64 61 … … 170 167 * module and connect it to the msim/GXemul keyboard. Enable keyboard interrupts. 171 168 */ 172 indev_t *kbrdin = dsrlnin_init((dsrlnin_t *) MSIM_KBD_ADDRESS, MSIM_KBD_IRQ); 173 if (kbrdin) { 174 srln_init(kbrdin); 175 cp0_unmask_int(MSIM_KBD_IRQ); 169 dsrlnin_instance_t *dsrlnin_instance 170 = dsrlnin_init((dsrlnin_t *) MSIM_KBD_ADDRESS, MSIM_KBD_IRQ); 171 if (dsrlnin_instance) { 172 srln_instance_t *srln_instance = srln_init(); 173 if (srln_instance) { 174 indev_t *sink = stdin_wire(); 175 indev_t *srln = srln_wire(srln_instance, sink); 176 dsrlnin_wire(dsrlnin_instance, srln); 177 cp0_unmask_int(MSIM_KBD_IRQ); 178 } 176 179 } 177 180 … … 249 252 } 250 253 254 void arch_grab_console(void) 255 { 256 #ifdef CONFIG_FB 257 fb_redraw(); 258 #endif 259 } 260 261 /** Return console to userspace 262 * 263 */ 264 void arch_release_console(void) 265 { 266 } 267 251 268 /** @} 252 269 */ -
kernel/arch/ppc32/Makefile.inc
r44b7783 rc2417bc 55 55 arch/$(KARCH)/src/proc/scheduler.c \ 56 56 arch/$(KARCH)/src/ddi/ddi.c \ 57 arch/$(KARCH)/src/drivers/cuda.c \58 57 arch/$(KARCH)/src/mm/as.c \ 59 58 arch/$(KARCH)/src/mm/frame.c \ -
kernel/arch/ppc32/include/drivers/pic.h
r44b7783 rc2417bc 27 27 */ 28 28 29 /** @addtogroup ppc32 29 /** @addtogroup ppc32 30 30 * @{ 31 31 */ … … 37 37 38 38 #include <arch/types.h> 39 #include <ddi/irq.h> 39 40 40 41 #define PIC_PENDING_LOW 8 … … 45 46 #define PIC_ACK_HIGH 6 46 47 47 void pic_init(uintptr_t base, size_t size);48 void pic_enable_interrupt(int intnum);49 void pic_disable_interrupt(int intnum);50 void pic_ack_interrupt(int intnum);51 int pic_get_pending(void);48 extern void pic_init(uintptr_t base, size_t size, cir_t *cir, void **cir_arg); 49 extern void pic_enable_interrupt(inr_t intnum); 50 extern void pic_disable_interrupt(inr_t intnum); 51 extern void pic_ack_interrupt(void *arg, inr_t intnum); 52 extern int pic_get_pending(void); 52 53 53 54 #endif -
kernel/arch/ppc32/src/drivers/pic.c
r44b7783 rc2417bc 27 27 */ 28 28 29 /** @addtogroup ppc32 29 /** @addtogroup ppc32 30 30 * @{ 31 31 */ … … 41 41 static volatile uint32_t *pic = NULL; 42 42 43 void pic_init(uintptr_t base, size_t size )43 void pic_init(uintptr_t base, size_t size, cir_t *cir, void **cir_arg) 44 44 { 45 45 pic = (uint32_t *) hw_map(base, size); 46 *cir = pic_ack_interrupt; 47 *cir_arg = NULL; 46 48 } 47 49 48 void pic_enable_interrupt(in t intnum)50 void pic_enable_interrupt(inr_t intnum) 49 51 { 50 52 if (pic) { … … 57 59 } 58 60 59 void pic_disable_interrupt(in t intnum)61 void pic_disable_interrupt(inr_t intnum) 60 62 { 61 63 if (pic) { … … 67 69 } 68 70 69 void pic_ack_interrupt( int intnum)71 void pic_ack_interrupt(void *arg, inr_t intnum) 70 72 { 71 73 if (pic) { -
kernel/arch/ppc32/src/dummy.s
r44b7783 rc2417bc 31 31 .global asm_delay_loop 32 32 .global sys_tls_set 33 .global cpu_halt 33 34 34 35 sys_tls_set: … … 37 38 asm_delay_loop: 38 39 blr 40 41 cpu_halt: 42 b cpu_halt -
kernel/arch/ppc32/src/interrupt.c
r44b7783 rc2417bc 61 61 62 62 while ((inum = pic_get_pending()) != -1) { 63 bool ack = false;64 63 irq_t *irq = irq_dispatch_and_lock(inum); 65 64 if (irq) { … … 70 69 if (irq->preack) { 71 70 /* Acknowledge the interrupt before processing */ 72 pic_ack_interrupt(inum);73 ack = true;71 if (irq->cir) 72 irq->cir(irq->cir_arg, irq->inr); 74 73 } 75 74 76 75 irq->handler(irq); 76 77 if (!irq->preack) { 78 if (irq->cir) 79 irq->cir(irq->cir_arg, irq->inr); 80 } 81 77 82 spinlock_unlock(&irq->lock); 78 83 } else { … … 84 89 #endif 85 90 } 86 87 if (!ack)88 pic_ack_interrupt(inum);89 91 } 90 92 } -
kernel/arch/ppc32/src/ppc32.c
r44b7783 rc2417bc 36 36 #include <arch.h> 37 37 #include <arch/boot/boot.h> 38 #include < arch/drivers/cuda.h>38 #include <genarch/drivers/via-cuda/cuda.h> 39 39 #include <arch/interrupt.h> 40 40 #include <genarch/fb/fb.h> … … 45 45 #include <ddi/irq.h> 46 46 #include <arch/drivers/pic.h> 47 #include <align.h> 47 48 #include <macros.h> 48 49 #include <string.h> 49 50 50 51 #define IRQ_COUNT 64 52 #define IRQ_CUDA 10 51 53 52 54 bootinfo_t bootinfo; … … 118 120 if (bootinfo.macio.addr) { 119 121 /* Initialize PIC */ 120 pic_init(bootinfo.macio.addr, PAGE_SIZE); 122 cir_t cir; 123 void *cir_arg; 124 pic_init(bootinfo.macio.addr, PAGE_SIZE, &cir, &cir_arg); 125 126 #ifdef CONFIG_VIA_CUDA 127 uintptr_t pa = bootinfo.macio.addr + 0x16000; 128 uintptr_t aligned_addr = ALIGN_DOWN(pa, PAGE_SIZE); 129 size_t offset = pa - aligned_addr; 130 size_t size = 2 * PAGE_SIZE; 131 132 cuda_t *cuda = (cuda_t *) 133 (hw_map(aligned_addr, offset + size) + offset); 121 134 122 135 /* Initialize I/O controller */ 123 cuda_init(bootinfo.macio.addr + 0x16000, 2 * PAGE_SIZE); 136 cuda_instance_t *cuda_instance = 137 cuda_init(cuda, IRQ_CUDA, cir, cir_arg); 138 if (cuda_instance) { 139 indev_t *sink = stdin_wire(); 140 cuda_wire(cuda_instance, sink); 141 } 142 #endif 124 143 } 125 144 … … 187 206 } 188 207 208 void arch_reboot(void) 209 { 210 // TODO 211 while (1); 212 } 213 189 214 /** @} 190 215 */ -
kernel/arch/sparc64/include/drivers/kbd.h
r44b7783 rc2417bc 27 27 */ 28 28 29 /** @addtogroup sparc64 29 /** @addtogroup sparc64 30 30 * @{ 31 31 */ … … 39 39 #include <genarch/ofw/ofw_tree.h> 40 40 41 typedef enum {42 KBD_UNKNOWN,43 KBD_Z8530,44 KBD_NS16550,45 KBD_SGCN46 } kbd_type_t;47 48 extern kbd_type_t kbd_type;49 50 41 extern void kbd_init(ofw_tree_node_t *node); 51 42 -
kernel/arch/sparc64/src/console.c
r44b7783 rc2417bc 27 27 */ 28 28 29 /** @addtogroup sparc64 29 /** @addtogroup sparc64 30 30 * @{ 31 31 */ … … 136 136 #endif 137 137 138 switch (kbd_type) {139 138 #ifdef CONFIG_SGCN_KBD 140 case KBD_SGCN: 141 sgcn_grab(); 142 break; 139 sgcn_grab(); 143 140 #endif 144 default:145 break;146 }147 141 } 148 142 … … 152 146 void arch_release_console(void) 153 147 { 154 switch (kbd_type) {155 148 #ifdef CONFIG_SGCN_KBD 156 case KBD_SGCN: 157 sgcn_release(); 158 break; 149 sgcn_release(); 159 150 #endif 160 default:161 break;162 }163 151 } 164 152 -
kernel/arch/sparc64/src/drivers/kbd.c
r44b7783 rc2417bc 55 55 #include <sysinfo/sysinfo.h> 56 56 57 kbd_type_t kbd_type = KBD_UNKNOWN;58 59 57 #ifdef CONFIG_SUN_KBD 60 58 61 /** Initialize keyboard. 62 * 63 * Traverse OpenFirmware device tree in order to find necessary 64 * info about the keyboard device. 65 * 66 * @param node Keyboard device node. 67 */ 68 void kbd_init(ofw_tree_node_t *node) 59 #ifdef CONFIG_Z8530 60 61 static bool kbd_z8530_init(ofw_tree_node_t *node) 69 62 { 70 size_t offset; 71 uintptr_t aligned_addr; 72 ofw_tree_property_t *prop; 73 const char *name; 63 const char *name = ofw_tree_node_name(node); 64 65 if (str_cmp(name, "zs") != 0) 66 return false; 67 68 /* 69 * Read 'interrupts' property. 70 */ 71 ofw_tree_property_t *prop = ofw_tree_getprop(node, "interrupts"); 72 if ((!prop) || (!prop->value)) { 73 printf("z8530: Unable to find interrupts property\n"); 74 return false; 75 } 76 77 uint32_t interrupts = *((uint32_t *) prop->value); 78 79 /* 80 * Read 'reg' property. 81 */ 82 prop = ofw_tree_getprop(node, "reg"); 83 if ((!prop) || (!prop->value)) { 84 printf("z8530: Unable to find reg property\n"); 85 return false; 86 } 87 88 size_t size = ((ofw_fhc_reg_t *) prop->value)->size; 89 90 uintptr_t pa; 91 if (!ofw_fhc_apply_ranges(node->parent, 92 ((ofw_fhc_reg_t *) prop->value), &pa)) { 93 printf("z8530: Failed to determine address\n"); 94 return false; 95 } 96 97 inr_t inr; 74 98 cir_t cir; 75 99 void *cir_arg; 76 77 #ifdef CONFIG_NS16550 78 ns16550_t *ns16550; 79 #endif 80 #ifdef CONFIG_Z8530 81 z8530_t *z8530; 82 #endif 83 84 name = ofw_tree_node_name(node); 85 86 /* 87 * Determine keyboard serial controller type. 88 */ 89 if (str_cmp(name, "zs") == 0) 90 kbd_type = KBD_Z8530; 91 else if (str_cmp(name, "su") == 0) 92 kbd_type = KBD_NS16550; 93 94 if (kbd_type == KBD_UNKNOWN) { 95 printf("Unknown keyboard device.\n"); 96 return; 97 } 98 99 /* 100 * Read 'interrupts' property. 101 */ 102 uint32_t interrupts; 103 prop = ofw_tree_getprop(node, "interrupts"); 104 if ((!prop) || (!prop->value)) 105 panic("Cannot find 'interrupt' property."); 106 interrupts = *((uint32_t *) prop->value); 107 108 /* 109 * Read 'reg' property. 110 */ 111 prop = ofw_tree_getprop(node, "reg"); 112 if ((!prop) || (!prop->value)) 113 panic("Cannot find 'reg' property."); 114 115 uintptr_t pa; 116 size_t size; 117 inr_t inr; 118 119 switch (kbd_type) { 120 case KBD_Z8530: 121 size = ((ofw_fhc_reg_t *) prop->value)->size; 122 if (!ofw_fhc_apply_ranges(node->parent, 123 ((ofw_fhc_reg_t *) prop->value), &pa)) { 124 printf("Failed to determine keyboard address.\n"); 125 return; 126 } 127 if (!ofw_fhc_map_interrupt(node->parent, 128 ((ofw_fhc_reg_t *) prop->value), interrupts, &inr, &cir, 129 &cir_arg)) { 130 printf("Failed to determine keyboard interrupt.\n"); 131 return; 132 } 133 break; 134 135 case KBD_NS16550: 136 size = ((ofw_ebus_reg_t *) prop->value)->size; 137 if (!ofw_ebus_apply_ranges(node->parent, 138 ((ofw_ebus_reg_t *) prop->value), &pa)) { 139 printf("Failed to determine keyboard address.\n"); 140 return; 141 } 142 if (!ofw_ebus_map_interrupt(node->parent, 143 ((ofw_ebus_reg_t *) prop->value), interrupts, &inr, &cir, 144 &cir_arg)) { 145 printf("Failed to determine keyboard interrupt.\n"); 146 return; 147 }; 148 break; 149 default: 150 panic("Unexpected keyboard type."); 100 if (!ofw_fhc_map_interrupt(node->parent, 101 ((ofw_fhc_reg_t *) prop->value), interrupts, &inr, &cir, 102 &cir_arg)) { 103 printf("z8530: Failed to determine interrupt\n"); 104 return false; 151 105 } 152 106 … … 157 111 * underlying controller. 158 112 */ 159 aligned_addr = ALIGN_DOWN(pa, PAGE_SIZE); 160 offset = pa - aligned_addr; 161 162 switch (kbd_type) { 113 uintptr_t aligned_addr = ALIGN_DOWN(pa, PAGE_SIZE); 114 size_t offset = pa - aligned_addr; 115 116 z8530_t *z8530 = (z8530_t *) 117 (hw_map(aligned_addr, offset + size) + offset); 118 119 z8530_instance_t *z8530_instance = z8530_init(z8530, inr, cir, cir_arg); 120 if (z8530_instance) { 121 kbrd_instance_t *kbrd_instance = kbrd_init(); 122 if (kbrd_instance) { 123 indev_t *sink = stdin_wire(); 124 indev_t *kbrd = kbrd_wire(kbrd_instance, sink); 125 z8530_wire(z8530_instance, kbrd); 126 } 127 } 128 129 /* 130 * This is the necessary evil until the userspace drivers are 131 * entirely self-sufficient. 132 */ 133 sysinfo_set_item_val("kbd", NULL, true); 134 sysinfo_set_item_val("kbd.inr", NULL, inr); 135 sysinfo_set_item_val("kbd.address.kernel", NULL, 136 (uintptr_t) z8530); 137 sysinfo_set_item_val("kbd.address.physical", NULL, pa); 138 sysinfo_set_item_val("kbd.type.z8530", NULL, true); 139 140 return true; 141 } 142 143 #endif /* CONFIG_Z8530 */ 144 145 #ifdef CONFIG_NS16550 146 147 static bool kbd_ns16550_init(ofw_tree_node_t *node) 148 { 149 const char *name = ofw_tree_node_name(node); 150 151 if (str_cmp(name, "su") != 0) 152 return false; 153 154 /* 155 * Read 'interrupts' property. 156 */ 157 ofw_tree_property_t *prop = ofw_tree_getprop(node, "interrupts"); 158 if ((!prop) || (!prop->value)) { 159 printf("ns16550: Unable to find interrupts property\n"); 160 return false; 161 } 162 163 uint32_t interrupts = *((uint32_t *) prop->value); 164 165 /* 166 * Read 'reg' property. 167 */ 168 prop = ofw_tree_getprop(node, "reg"); 169 if ((!prop) || (!prop->value)) { 170 printf("ns16550: Unable to find reg property\n"); 171 return false; 172 } 173 174 size_t size = ((ofw_ebus_reg_t *) prop->value)->size; 175 176 uintptr_t pa; 177 if (!ofw_ebus_apply_ranges(node->parent, 178 ((ofw_ebus_reg_t *) prop->value), &pa)) { 179 printf("ns16550: Failed to determine address\n"); 180 return false; 181 } 182 183 inr_t inr; 184 cir_t cir; 185 void *cir_arg; 186 if (!ofw_ebus_map_interrupt(node->parent, 187 ((ofw_ebus_reg_t *) prop->value), interrupts, &inr, &cir, 188 &cir_arg)) { 189 printf("ns16550: Failed to determine interrupt\n"); 190 return false; 191 } 192 193 /* 194 * We need to pass aligned address to hw_map(). 195 * However, the physical keyboard address can 196 * be pretty much unaligned, depending on the 197 * underlying controller. 198 */ 199 uintptr_t aligned_addr = ALIGN_DOWN(pa, PAGE_SIZE); 200 size_t offset = pa - aligned_addr; 201 202 ns16550_t *ns16550 = (ns16550_t *) 203 (hw_map(aligned_addr, offset + size) + offset); 204 205 ns16550_instance_t *ns16550_instance = ns16550_init(ns16550, inr, cir, cir_arg); 206 if (ns16550_instance) { 207 kbrd_instance_t *kbrd_instance = kbrd_init(); 208 if (kbrd_instance) { 209 indev_t *sink = stdin_wire(); 210 indev_t *kbrd = kbrd_wire(kbrd_instance, sink); 211 ns16550_wire(ns16550_instance, kbrd); 212 } 213 } 214 215 /* 216 * This is the necessary evil until the userspace drivers are 217 * entirely self-sufficient. 218 */ 219 sysinfo_set_item_val("kbd", NULL, true); 220 sysinfo_set_item_val("kbd.inr", NULL, inr); 221 sysinfo_set_item_val("kbd.address.kernel", NULL, 222 (uintptr_t) ns16550); 223 sysinfo_set_item_val("kbd.address.physical", NULL, pa); 224 sysinfo_set_item_val("kbd.type.ns16550", NULL, true); 225 226 return true; 227 } 228 229 #endif /* CONFIG_NS16550 */ 230 231 /** Initialize keyboard. 232 * 233 * Traverse OpenFirmware device tree in order to find necessary 234 * info about the keyboard device. 235 * 236 * @param node Keyboard device node. 237 * 238 */ 239 void kbd_init(ofw_tree_node_t *node) 240 { 163 241 #ifdef CONFIG_Z8530 164 case KBD_Z8530: 165 z8530 = (z8530_t *) 166 (hw_map(aligned_addr, offset + size) + offset); 167 168 indev_t *kbrdin_z8530 = z8530_init(z8530, inr, cir, cir_arg); 169 if (kbrdin_z8530) 170 kbrd_init(kbrdin_z8530); 171 172 /* 173 * This is the necessary evil until the userspace drivers are 174 * entirely self-sufficient. 175 */ 176 sysinfo_set_item_val("kbd", NULL, true); 177 sysinfo_set_item_val("kbd.type", NULL, KBD_Z8530); 178 sysinfo_set_item_val("kbd.inr", NULL, inr); 179 sysinfo_set_item_val("kbd.address.kernel", NULL, 180 (uintptr_t) z8530); 181 sysinfo_set_item_val("kbd.address.physical", NULL, pa); 182 break; 183 #endif 242 kbd_z8530_init(node); 243 #endif 244 184 245 #ifdef CONFIG_NS16550 185 case KBD_NS16550: 186 ns16550 = (ns16550_t *) 187 (hw_map(aligned_addr, offset + size) + offset); 188 189 indev_t *kbrdin_ns16550 = ns16550_init(ns16550, inr, cir, cir_arg); 190 if (kbrdin_ns16550) 191 kbrd_init(kbrdin_ns16550); 192 193 /* 194 * This is the necessary evil until the userspace driver is 195 * entirely self-sufficient. 196 */ 197 sysinfo_set_item_val("kbd", NULL, true); 198 sysinfo_set_item_val("kbd.type", NULL, KBD_NS16550); 199 sysinfo_set_item_val("kbd.inr", NULL, inr); 200 sysinfo_set_item_val("kbd.address.kernel", NULL, 201 (uintptr_t) ns16550); 202 sysinfo_set_item_val("kbd.address.physical", NULL, pa); 203 break; 204 #endif 205 default: 206 printf("Kernel is not compiled with the necessary keyboard " 207 "driver this machine requires.\n"); 208 } 246 kbd_ns16550_init(node); 247 #endif 209 248 } 210 249 211 #endif 250 #endif /* CONFIG_SUN_KBD */ 212 251 213 252 /** @} -
kernel/arch/sparc64/src/drivers/sgcn.c
r44b7783 rc2417bc 101 101 /** Returns a pointer to the console buffer header. */ 102 102 #define SGCN_BUFFER_HEADER (SGCN_BUFFER(sgcn_buffer_header_t, 0)) 103 104 /** defined in drivers/kbd.c */105 extern kbd_type_t kbd_type;106 103 107 104 /** starting address of SRAM, will be set by the init_sram_begin function */ … … 354 351 sgcn_buffer_begin_init(); 355 352 356 kbd_type = KBD_SGCN;357 358 353 sysinfo_set_item_val("kbd", NULL, true); 359 sysinfo_set_item_val("kbd.type", NULL, KBD_SGCN);360 354 361 355 thread_t *t = thread_create(kkbdpoll, NULL, TASK, 0, "kkbdpoll", true); -
kernel/genarch/Makefile.inc
r44b7783 rc2417bc 94 94 endif 95 95 96 ifeq ($(CONFIG_VIA_CUDA),y) 97 GENARCH_SOURCES += \ 98 genarch/src/drivers/via-cuda/cuda.c 99 endif 100 96 101 ifeq ($(CONFIG_PC_KBD),y) 97 102 GENARCH_SOURCES += \ -
kernel/genarch/include/drivers/dsrln/dsrlnin.h
r44b7783 rc2417bc 50 50 irq_t irq; 51 51 dsrlnin_t *dsrlnin; 52 indev_t kbrdin;52 indev_t *srlnin; 53 53 } dsrlnin_instance_t; 54 54 55 extern indev_t *dsrlnin_init(dsrlnin_t *, inr_t); 55 extern dsrlnin_instance_t *dsrlnin_init(dsrlnin_t *, inr_t); 56 extern void dsrlnin_wire(dsrlnin_instance_t *, indev_t *); 56 57 57 58 #endif -
kernel/genarch/include/drivers/i8042/i8042.h
r44b7783 rc2417bc 50 50 irq_t irq; 51 51 i8042_t *i8042; 52 indev_t kbrdin;52 indev_t *kbrdin; 53 53 } i8042_instance_t; 54 54 55 extern indev_t *i8042_init(i8042_t *, inr_t); 55 extern i8042_instance_t *i8042_init(i8042_t *, inr_t); 56 extern void i8042_wire(i8042_instance_t *, indev_t *); 56 57 extern void i8042_cpu_reset(i8042_t *); 57 58 -
kernel/genarch/include/drivers/ns16550/ns16550.h
r44b7783 rc2417bc 63 63 /** Structure representing the ns16550 device. */ 64 64 typedef struct { 65 irq_t irq; 65 66 ns16550_t *ns16550; 66 irq_t irq; 67 indev_t kbrdin; 67 indev_t *kbrdin; 68 68 } ns16550_instance_t; 69 69 70 extern indev_t *ns16550_init(ns16550_t *, inr_t, cir_t, void *); 70 extern ns16550_instance_t *ns16550_init(ns16550_t *, inr_t, cir_t, void *); 71 extern void ns16550_wire(ns16550_instance_t *, indev_t *); 71 72 72 73 #endif -
kernel/genarch/include/drivers/via-cuda/cuda.h
r44b7783 rc2417bc 27 27 */ 28 28 29 /** @addtogroup ppc3229 /** @addtogroup genarch 30 30 * @{ 31 31 */ … … 33 33 */ 34 34 35 #ifndef KERN_ ppc32_CUDA_H_36 #define KERN_ ppc32_CUDA_H_35 #ifndef KERN_CUDA_H_ 36 #define KERN_CUDA_H_ 37 37 38 #include <ddi/irq.h> 38 39 #include <arch/types.h> 39 #include < typedefs.h>40 #include <console/chardev.h> 40 41 41 extern void cuda_init(uintptr_t base, size_t size); 42 extern int cuda_get_scancode(void); 42 typedef struct { 43 } cuda_t; 44 45 typedef struct { 46 irq_t irq; 47 cuda_t *cuda; 48 indev_t *kbrdin; 49 } cuda_instance_t; 50 51 extern cuda_instance_t *cuda_init(cuda_t *, inr_t, cir_t, void *); 52 extern void cuda_wire(cuda_instance_t *, indev_t *); 43 53 44 54 #endif -
kernel/genarch/include/drivers/z8530/z8530.h
r44b7783 rc2417bc 117 117 irq_t irq; 118 118 z8530_t *z8530; 119 indev_t kbrdin;119 indev_t *kbrdin; 120 120 } z8530_instance_t; 121 121 122 extern indev_t *z8530_init(z8530_t *, inr_t, cir_t, void *); 122 extern z8530_instance_t *z8530_init(z8530_t *, inr_t, cir_t, void *); 123 extern void z8530_wire(z8530_instance_t *, indev_t *); 123 124 124 125 #endif -
kernel/genarch/include/kbrd/kbrd.h
r44b7783 rc2417bc 38 38 39 39 #include <console/chardev.h> 40 #include <proc/thread.h> 41 #include <synch/spinlock.h> 40 42 41 extern void kbrd_init(indev_t *devin); 43 typedef struct { 44 thread_t *thread; 45 46 indev_t *sink; 47 indev_t raw; 48 49 SPINLOCK_DECLARE(keylock); /**< keylock protects keyflags and lockflags. */ 50 volatile unsigned int keyflags; /**< Tracking of multiple keypresses. */ 51 volatile unsigned int lockflags; /**< Tracking of multiple keys lockings. */ 52 } kbrd_instance_t; 53 54 extern kbrd_instance_t *kbrd_init(void); 55 extern indev_t *kbrd_wire(kbrd_instance_t *, indev_t *); 42 56 43 57 #endif -
kernel/genarch/include/srln/srln.h
r44b7783 rc2417bc 38 38 39 39 #include <console/chardev.h> 40 #include <proc/thread.h> 40 41 41 extern void srln_init(indev_t *devin); 42 typedef struct { 43 thread_t *thread; 44 45 indev_t *sink; 46 indev_t raw; 47 } srln_instance_t; 48 49 extern srln_instance_t *srln_init(void); 50 extern indev_t *srln_wire(srln_instance_t *, indev_t *); 42 51 43 52 #endif -
kernel/genarch/src/drivers/dsrln/dsrlnin.c
r44b7783 rc2417bc 41 41 #include <ddi/device.h> 42 42 43 static indev_operations_t kbrdin_ops = {44 .poll = NULL45 };46 47 43 static irq_ownership_t dsrlnin_claim(irq_t *irq) 48 44 { … … 55 51 dsrlnin_t *dev = instance->dsrlnin; 56 52 57 indev_push_character( &instance->kbrdin, pio_read_8(&dev->data));53 indev_push_character(instance->srlnin, pio_read_8(&dev->data)); 58 54 } 59 55 60 indev_t *dsrlnin_init(dsrlnin_t *dev, inr_t inr)56 dsrlnin_instance_t *dsrlnin_init(dsrlnin_t *dev, inr_t inr) 61 57 { 62 58 dsrlnin_instance_t *instance 63 59 = malloc(sizeof(dsrlnin_instance_t), FRAME_ATOMIC); 64 if (!instance) 65 return NULL; 60 if (instance) { 61 instance->dsrlnin = dev; 62 instance->srlnin = NULL; 63 64 irq_initialize(&instance->irq); 65 instance->irq.devno = device_assign_devno(); 66 instance->irq.inr = inr; 67 instance->irq.claim = dsrlnin_claim; 68 instance->irq.handler = dsrlnin_irq_handler; 69 instance->irq.instance = instance; 70 } 66 71 67 indev_initialize("dsrlnin", &instance->kbrdin, &kbrdin_ops); 72 return instance; 73 } 74 75 void dsrlnin_wire(dsrlnin_instance_t *instance, indev_t *srlnin) 76 { 77 ASSERT(instance); 78 ASSERT(srlnin); 68 79 69 instance->dsrlnin = dev; 70 71 irq_initialize(&instance->irq); 72 instance->irq.devno = device_assign_devno(); 73 instance->irq.inr = inr; 74 instance->irq.claim = dsrlnin_claim; 75 instance->irq.handler = dsrlnin_irq_handler; 76 instance->irq.instance = instance; 80 instance->srlnin = srlnin; 77 81 irq_register(&instance->irq); 78 79 return &instance->kbrdin;80 82 } 81 83 -
kernel/genarch/src/drivers/i8042/i8042.c
r44b7783 rc2417bc 45 45 #include <ddi/device.h> 46 46 47 static indev_operations_t kbrdin_ops = {48 .poll = NULL49 };50 51 47 #define i8042_SET_COMMAND 0x60 52 48 #define i8042_COMMAND 0x69 … … 75 71 if (((status = pio_read_8(&dev->status)) & i8042_BUFFER_FULL_MASK)) { 76 72 uint8_t data = pio_read_8(&dev->data); 77 indev_push_character( &instance->kbrdin, data);73 indev_push_character(instance->kbrdin, data); 78 74 } 79 75 } 80 76 77 /**< Clear input buffer. */ 78 static void i8042_clear_buffer(i8042_t *dev) 79 { 80 while (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK) 81 (void) pio_read_8(&dev->data); 82 } 83 81 84 /** Initialize i8042. */ 82 i ndev_t *i8042_init(i8042_t *dev, inr_t inr)85 i8042_instance_t *i8042_init(i8042_t *dev, inr_t inr) 83 86 { 84 87 i8042_instance_t *instance 85 88 = malloc(sizeof(i8042_instance_t), FRAME_ATOMIC); 86 if (!instance) 87 return NULL; 89 if (instance) { 90 instance->i8042 = dev; 91 instance->kbrdin = NULL; 92 93 irq_initialize(&instance->irq); 94 instance->irq.devno = device_assign_devno(); 95 instance->irq.inr = inr; 96 instance->irq.claim = i8042_claim; 97 instance->irq.handler = i8042_irq_handler; 98 instance->irq.instance = instance; 99 100 } 88 101 89 indev_initialize("i8042", &instance->kbrdin, &kbrdin_ops); 102 return instance; 103 } 104 105 void i8042_wire(i8042_instance_t *instance, indev_t *kbrdin) 106 { 107 ASSERT(instance); 108 ASSERT(kbrdin); 90 109 91 instance->i8042 = dev; 92 93 irq_initialize(&instance->irq); 94 instance->irq.devno = device_assign_devno(); 95 instance->irq.inr = inr; 96 instance->irq.claim = i8042_claim; 97 instance->irq.handler = i8042_irq_handler; 98 instance->irq.instance = instance; 110 instance->kbrdin = kbrdin; 99 111 irq_register(&instance->irq); 100 101 /* Clear input buffer */ 102 while (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK) 103 (void) pio_read_8(&dev->data); 104 105 return &instance->kbrdin; 112 i8042_clear_buffer(instance->i8042); 106 113 } 107 114 … … 111 118 interrupts_disable(); 112 119 113 /* Clear input buffer */ 114 while (pio_read_8(&dev->status) & i8042_BUFFER_FULL_MASK) 115 (void) pio_read_8(&dev->data); 120 i8042_clear_buffer(dev); 116 121 117 122 /* Reset CPU */ -
kernel/genarch/src/drivers/ns16550/ns16550.c
r44b7783 rc2417bc 44 44 #define LSR_DATA_READY 0x01 45 45 46 static indev_operations_t kbrdin_ops = {47 .poll = NULL48 };49 50 46 static irq_ownership_t ns16550_claim(irq_t *irq) 51 47 { … … 65 61 66 62 if (pio_read_8(&dev->lsr) & LSR_DATA_READY) { 67 uint8_t x= pio_read_8(&dev->rbr);68 indev_push_character( &instance->kbrdin, x);63 uint8_t data = pio_read_8(&dev->rbr); 64 indev_push_character(instance->kbrdin, data); 69 65 } 66 } 67 68 /**< Clear input buffer. */ 69 static void ns16550_clear_buffer(ns16550_t *dev) 70 { 71 while ((pio_read_8(&dev->lsr) & LSR_DATA_READY)) 72 (void) pio_read_8(&dev->rbr); 70 73 } 71 74 … … 78 81 * @param cir_arg First argument to cir. 79 82 * 80 * @return Keyboard device pointeror NULL on failure.83 * @return Keyboard instance or NULL on failure. 81 84 * 82 85 */ 83 indev_t *ns16550_init(ns16550_t *dev, inr_t inr, cir_t cir, void *cir_arg)86 ns16550_instance_t *ns16550_init(ns16550_t *dev, inr_t inr, cir_t cir, void *cir_arg) 84 87 { 85 88 ns16550_instance_t *instance 86 89 = malloc(sizeof(ns16550_instance_t), FRAME_ATOMIC); 87 if (!instance) 88 return NULL; 90 if (instance) { 91 instance->ns16550 = dev; 92 instance->kbrdin = NULL; 93 94 irq_initialize(&instance->irq); 95 instance->irq.devno = device_assign_devno(); 96 instance->irq.inr = inr; 97 instance->irq.claim = ns16550_claim; 98 instance->irq.handler = ns16550_irq_handler; 99 instance->irq.instance = instance; 100 instance->irq.cir = cir; 101 instance->irq.cir_arg = cir_arg; 102 } 89 103 90 indev_initialize("ns16550", &instance->kbrdin, &kbrdin_ops); 104 return instance; 105 } 106 107 void ns16550_wire(ns16550_instance_t *instance, indev_t *kbrdin) 108 { 109 ASSERT(instance); 110 ASSERT(kbrdin); 91 111 92 instance->ns16550 = dev; 93 94 irq_initialize(&instance->irq); 95 instance->irq.devno = device_assign_devno(); 96 instance->irq.inr = inr; 97 instance->irq.claim = ns16550_claim; 98 instance->irq.handler = ns16550_irq_handler; 99 instance->irq.instance = instance; 100 instance->irq.cir = cir; 101 instance->irq.cir_arg = cir_arg; 112 instance->kbrdin = kbrdin; 102 113 irq_register(&instance->irq); 103 114 104 while ((pio_read_8(&dev->lsr) & LSR_DATA_READY)) 105 (void) pio_read_8(&dev->rbr); 115 ns16550_clear_buffer(instance->ns16550); 106 116 107 117 /* Enable interrupts */ 108 pio_write_8(&dev->ier, IER_ERBFI); 109 pio_write_8(&dev->mcr, MCR_OUT2); 110 111 return &instance->kbrdin; 118 pio_write_8(&instance->ns16550->ier, IER_ERBFI); 119 pio_write_8(&instance->ns16550->mcr, MCR_OUT2); 112 120 } 113 121 -
kernel/genarch/src/drivers/via-cuda/cuda.c
r44b7783 rc2417bc 1 1 /* 2 * Copyright (c) 200 7 Michal Kebrt2 * Copyright (c) 2006 Martin Decky 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 /** @addtogroup arm3229 /** @addtogroup genarch 30 30 * @{ 31 31 */ 32 32 /** @file 33 * @brief Console.34 33 */ 35 34 36 #include <console/console.h> 37 #include <arch/console.h> 38 #include <genarch/fb/fb.h> 35 #include <genarch/drivers/via-cuda/cuda.h> 36 #include <console/chardev.h> 37 #include <ddi/irq.h> 38 #include <arch/asm.h> 39 #include <mm/slab.h> 40 #include <ddi/device.h> 39 41 40 /** Acquire console back for kernel. */ 41 void arch_grab_console(void) 42 static irq_ownership_t cuda_claim(irq_t *irq) 42 43 { 43 #ifdef CONFIG_FB 44 fb_redraw(); 45 #endif 44 return IRQ_DECLINE; 46 45 } 47 46 48 /** Return console to userspace. */ 49 void arch_release_console(void) 47 static void cuda_irq_handler(irq_t *irq) 50 48 { 51 49 } 52 50 51 cuda_instance_t *cuda_init(cuda_t *dev, inr_t inr, cir_t cir, void *cir_arg) 52 { 53 cuda_instance_t *instance 54 = malloc(sizeof(cuda_instance_t), FRAME_ATOMIC); 55 if (instance) { 56 instance->cuda = dev; 57 instance->kbrdin = NULL; 58 59 irq_initialize(&instance->irq); 60 instance->irq.devno = device_assign_devno(); 61 instance->irq.inr = inr; 62 instance->irq.claim = cuda_claim; 63 instance->irq.handler = cuda_irq_handler; 64 instance->irq.instance = instance; 65 instance->irq.cir = cir; 66 instance->irq.cir_arg = cir_arg; 67 } 68 69 return instance; 70 } 71 72 void cuda_wire(cuda_instance_t *instance, indev_t *kbrdin) 73 { 74 } 75 76 53 77 /** @} 54 78 */ -
kernel/genarch/src/drivers/z8530/z8530.c
r44b7783 rc2417bc 42 42 #include <ddi/device.h> 43 43 44 static indev_operations_t kbrdin_ops = {45 .poll = NULL46 };47 48 44 static inline void z8530_write(ioport8_t *ctl, uint8_t reg, uint8_t val) 49 45 { … … 83 79 84 80 if (z8530_read(&dev->ctl_a, RR0) & RR0_RCA) { 85 uint8_t x= z8530_read(&dev->ctl_a, RR8);86 indev_push_character( &instance->kbrdin, x);81 uint8_t data = z8530_read(&dev->ctl_a, RR8); 82 indev_push_character(instance->kbrdin, data); 87 83 } 88 84 } 89 85 90 86 /** Initialize z8530. */ 91 indev_t *z8530_init(z8530_t *dev, inr_t inr, cir_t cir, void *cir_arg)87 z8530_instance_t *z8530_init(z8530_t *dev, inr_t inr, cir_t cir, void *cir_arg) 92 88 { 93 89 z8530_instance_t *instance 94 90 = malloc(sizeof(z8530_instance_t), FRAME_ATOMIC); 95 if (!instance) 96 return false; 91 if (instance) { 92 instance->z8530 = dev; 93 instance->kbrdin = NULL; 94 95 irq_initialize(&instance->irq); 96 instance->irq.devno = device_assign_devno(); 97 instance->irq.inr = inr; 98 instance->irq.claim = z8530_claim; 99 instance->irq.handler = z8530_irq_handler; 100 instance->irq.instance = instance; 101 instance->irq.cir = cir; 102 instance->irq.cir_arg = cir_arg; 103 } 97 104 98 indev_initialize("z8530", &instance->kbrdin, &kbrdin_ops); 105 return instance; 106 } 107 108 void z8530_wire(z8530_instance_t *instance, indev_t *kbrdin) 109 { 110 ASSERT(instance); 111 ASSERT(kbrdin); 99 112 100 instance-> z8530 = dev;113 instance->kbrdin = kbrdin; 101 114 102 irq_initialize(&instance->irq);103 instance->irq.devno = device_assign_devno();104 instance->irq.inr = inr;105 instance->irq.claim = z8530_claim;106 instance->irq.handler = z8530_irq_handler;107 instance->irq.instance = instance;108 instance->irq.cir = cir;109 instance->irq.cir_arg = cir_arg;110 115 irq_register(&instance->irq); 111 116 112 (void) z8530_read(& dev->ctl_a, RR8);117 (void) z8530_read(&instance->z8530->ctl_a, RR8); 113 118 114 119 /* … … 116 121 * to set FHC UART interrupt state to idle. 117 122 */ 118 z8530_write(& dev->ctl_a, WR0, WR0_TX_IP_RST);123 z8530_write(&instance->z8530->ctl_a, WR0, WR0_TX_IP_RST); 119 124 120 125 /* interrupt on all characters */ 121 z8530_write(& dev->ctl_a, WR1, WR1_IARCSC);126 z8530_write(&instance->z8530->ctl_a, WR1, WR1_IARCSC); 122 127 123 128 /* 8 bits per character and enable receiver */ 124 z8530_write(& dev->ctl_a, WR3, WR3_RX8BITSCH | WR3_RX_ENABLE);129 z8530_write(&instance->z8530->ctl_a, WR3, WR3_RX8BITSCH | WR3_RX_ENABLE); 125 130 126 131 /* Master Interrupt Enable. */ 127 z8530_write(&dev->ctl_a, WR9, WR9_MIE); 128 129 return &instance->kbrdin; 132 z8530_write(&instance->z8530->ctl_a, WR9, WR9_MIE); 130 133 } 131 134 -
kernel/genarch/src/kbrd/kbrd.c
r44b7783 rc2417bc 60 60 #define LOCKED_CAPSLOCK (1 << 0) 61 61 62 static indev_t kbrdout; 63 64 indev_operations_t kbrdout_ops = { 62 static indev_operations_t kbrd_raw_ops = { 65 63 .poll = NULL 66 64 }; 67 68 SPINLOCK_INITIALIZE(keylock); /**< keylock protects keyflags and lockflags. */69 static volatile int keyflags; /**< Tracking of multiple keypresses. */70 static volatile int lockflags; /**< Tracking of multiple keys lockings. */71 65 72 66 /** Process release of key. … … 74 68 * @param sc Scancode of the key being released. 75 69 */ 76 static void key_released( wchar_t sc)70 static void key_released(kbrd_instance_t *instance, wchar_t sc) 77 71 { 78 spinlock_lock(&keylock); 72 spinlock_lock(&instance->keylock); 73 79 74 switch (sc) { 80 75 case SC_LSHIFT: 81 76 case SC_RSHIFT: 82 keyflags &= ~PRESSED_SHIFT;77 instance->keyflags &= ~PRESSED_SHIFT; 83 78 break; 84 79 case SC_CAPSLOCK: 85 keyflags &= ~PRESSED_CAPSLOCK;86 if ( lockflags & LOCKED_CAPSLOCK)87 lockflags &= ~LOCKED_CAPSLOCK;80 instance->keyflags &= ~PRESSED_CAPSLOCK; 81 if (instance->lockflags & LOCKED_CAPSLOCK) 82 instance->lockflags &= ~LOCKED_CAPSLOCK; 88 83 else 89 lockflags |= LOCKED_CAPSLOCK;84 instance->lockflags |= LOCKED_CAPSLOCK; 90 85 break; 91 86 default: 92 87 break; 93 88 } 94 spinlock_unlock(&keylock); 89 90 spinlock_unlock(&instance->keylock); 95 91 } 96 92 … … 99 95 * @param sc Scancode of the key being pressed. 100 96 */ 101 static void key_pressed( wchar_t sc)97 static void key_pressed(kbrd_instance_t *instance, wchar_t sc) 102 98 { 103 99 bool letter; … … 105 101 bool capslock; 106 102 107 spinlock_lock(&keylock); 103 spinlock_lock(&instance->keylock); 104 108 105 switch (sc) { 109 106 case SC_LSHIFT: 110 107 case SC_RSHIFT: 111 keyflags |= PRESSED_SHIFT;108 instance->keyflags |= PRESSED_SHIFT; 112 109 break; 113 110 case SC_CAPSLOCK: 114 keyflags |= PRESSED_CAPSLOCK;111 instance->keyflags |= PRESSED_CAPSLOCK; 115 112 break; 116 113 case SC_SCAN_ESCAPE: … … 118 115 default: 119 116 letter = islower(sc_primary_map[sc]); 120 shift = keyflags & PRESSED_SHIFT;121 capslock = ( keyflags & PRESSED_CAPSLOCK) ||122 ( lockflags & LOCKED_CAPSLOCK);117 shift = instance->keyflags & PRESSED_SHIFT; 118 capslock = (instance->keyflags & PRESSED_CAPSLOCK) || 119 (instance->lockflags & LOCKED_CAPSLOCK); 123 120 124 121 if ((letter) && (capslock)) … … 126 123 127 124 if (shift) 128 indev_push_character( stdin, sc_secondary_map[sc]);125 indev_push_character(instance->sink, sc_secondary_map[sc]); 129 126 else 130 indev_push_character( stdin, sc_primary_map[sc]);127 indev_push_character(instance->sink, sc_primary_map[sc]); 131 128 break; 132 129 } 133 spinlock_unlock(&keylock); 130 131 spinlock_unlock(&instance->keylock); 134 132 } 135 133 136 134 static void kkbrd(void *arg) 137 135 { 138 indev_t *in = (indev_t *) arg;136 kbrd_instance_t *instance = (kbrd_instance_t *) arg; 139 137 140 138 while (true) { 141 wchar_t sc = _getc(in);139 wchar_t sc = indev_pop_character(&instance->raw); 142 140 143 141 if (sc == IGNORE_CODE) … … 145 143 146 144 if (sc & KEY_RELEASE) 147 key_released( (sc ^ KEY_RELEASE) & 0x7f);145 key_released(instance, (sc ^ KEY_RELEASE) & 0x7f); 148 146 else 149 key_pressed( sc & 0x7f);147 key_pressed(instance, sc & 0x7f); 150 148 } 151 149 } 152 150 153 void kbrd_init(indev_t *devin)151 kbrd_instance_t *kbrd_init(void) 154 152 { 155 indev_initialize("kbrd", &kbrdout, &kbrdout_ops); 156 thread_t *thread 157 = thread_create(kkbrd, devin, TASK, 0, "kkbrd", false); 153 kbrd_instance_t *instance 154 = malloc(sizeof(kbrd_instance_t), FRAME_ATOMIC); 155 if (instance) { 156 instance->thread 157 = thread_create(kkbrd, (void *) instance, TASK, 0, "kkbrd", false); 158 159 if (!instance->thread) { 160 free(instance); 161 return NULL; 162 } 163 164 instance->sink = NULL; 165 indev_initialize("kbrd", &instance->raw, &kbrd_raw_ops); 166 167 spinlock_initialize(&instance->keylock, "instance_keylock"); 168 instance->keyflags = 0; 169 instance->lockflags = 0; 170 } 158 171 159 if (thread) { 160 stdin = &kbrdout; 161 thread_ready(thread); 162 } 172 return instance; 173 } 174 175 indev_t *kbrd_wire(kbrd_instance_t *instance, indev_t *sink) 176 { 177 ASSERT(instance); 178 ASSERT(sink); 179 180 instance->sink = sink; 181 thread_ready(instance->thread); 182 183 return &instance->raw; 163 184 } 164 185 -
kernel/genarch/src/srln/srln.c
r44b7783 rc2417bc 42 42 #include <string.h> 43 43 44 static indev_t srlnout; 45 46 indev_operations_t srlnout_ops = { 44 static indev_operations_t srln_raw_ops = { 47 45 .poll = NULL 48 46 }; … … 50 48 static void ksrln(void *arg) 51 49 { 52 indev_t *in = (indev_t *) arg;50 srln_instance_t *instance = (srln_instance_t *) arg; 53 51 bool cr = false; 54 52 uint32_t escape = 0; 55 53 56 54 while (true) { 57 wchar_t ch = _getc(in);55 wchar_t ch = indev_pop_character(&instance->raw); 58 56 59 57 /* ANSI escape sequence processing */ … … 123 121 ch = '\b'; 124 122 125 indev_push_character( stdin, ch);123 indev_push_character(instance->sink, ch); 126 124 } 127 125 } 128 126 129 void srln_init(indev_t *devin)127 srln_instance_t *srln_init(void) 130 128 { 131 indev_initialize("srln", &srlnout, &srlnout_ops); 132 thread_t *thread 133 = thread_create(ksrln, devin, TASK, 0, "ksrln", false); 129 srln_instance_t *instance 130 = malloc(sizeof(srln_instance_t), FRAME_ATOMIC); 131 if (instance) { 132 instance->thread 133 = thread_create(ksrln, (void *) instance, TASK, 0, "ksrln", false); 134 135 if (!instance->thread) { 136 free(instance); 137 return NULL; 138 } 139 140 instance->sink = NULL; 141 indev_initialize("srln", &instance->raw, &srln_raw_ops); 142 } 134 143 135 if (thread) { 136 stdin = &srlnout; 137 thread_ready(thread); 138 } 144 return instance; 145 } 146 147 indev_t *srln_wire(srln_instance_t *instance, indev_t *sink) 148 { 149 ASSERT(instance); 150 ASSERT(sink); 151 152 instance->sink = sink; 153 thread_ready(instance->thread); 154 155 return &instance->raw; 139 156 } 140 157 -
uspace/srv/kbd/port/sun.c
r44b7783 rc2417bc 40 40 #include <sysinfo.h> 41 41 42 typedef enum {43 KBD_UNKNOWN,44 KBD_Z8530,45 KBD_NS16550,46 KBD_SGCN47 } kbd_type_t;48 49 42 /** Sun keyboard virtual port driver. 50 43 * … … 57 50 int kbd_port_init(void) 58 51 { 59 if (sysinfo_value("kbd.type") == KBD_Z8530) 60 return z8530_port_init(); 61 else if (sysinfo_value("kbd.type") == KBD_NS16550) 62 return ns16550_port_init(); 52 if (sysinfo_value("kbd.type.z8530")) { 53 if (z8530_port_init() == 0) 54 return 0; 55 } 56 57 if (sysinfo_value("kbd.type.ns16550")) { 58 if (ns16550_port_init() == 0) 59 return 0; 60 } 63 61 64 62 return -1;
Note:
See TracChangeset
for help on using the changeset viewer.