Changeset 411b6a6 in mainline for kernel/genarch/src
- Timestamp:
- 2009-03-07T16:08:40Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 4c84368e
- Parents:
- e06da7e
- Location:
- kernel/genarch/src
- Files:
-
- 1 added
- 1 deleted
- 5 moved
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/drivers/i8042/i8042.c
re06da7e r411b6a6 32 32 /** 33 33 * @file 34 * @brief i8042 processor driver .34 * @brief i8042 processor driver 35 35 * 36 * It takes care of low-level keyboard functions.36 * It takes care of the i8042 serial communication. 37 37 */ 38 38 39 #include <genarch/kbd/i8042.h> 40 #include <arch/drivers/kbd.h> 41 #include <genarch/kbd/key.h> 42 #include <genarch/kbd/scanc.h> 43 #include <genarch/kbd/scanc_pc.h> 39 #include <genarch/drivers/i8042/i8042.h> 44 40 #include <genarch/drivers/legacy/ia32/io.h> 45 #include <cpu.h>46 41 #include <arch/asm.h> 47 #include <arch.h>48 42 #include <console/chardev.h> 49 #include <console/console.h> 50 #include <interrupt.h> 51 52 /* Keyboard commands. */ 53 #define KBD_ENABLE 0xf4 54 #define KBD_DISABLE 0xf5 55 #define KBD_ACK 0xfa 56 57 /* 58 * 60 Write 8042 Command Byte: next data byte written to port 60h is 59 * placed in 8042 command register. Format: 60 * 61 * |7|6|5|4|3|2|1|0|8042 Command Byte 62 * | | | | | | | `---- 1=enable output register full interrupt 63 * | | | | | | `----- should be 0 64 * | | | | | `------ 1=set status register system, 0=clear 65 * | | | | `------- 1=override keyboard inhibit, 0=allow inhibit 66 * | | | `-------- disable keyboard I/O by driving clock line low 67 * | | `--------- disable auxiliary device, drives clock line low 68 * | `---------- IBM scancode translation 0=AT, 1=PC/XT 69 * `----------- reserved, should be 0 70 */ 43 #include <mm/slab.h> 71 44 72 45 #define i8042_SET_COMMAND 0x60 … … 75 48 #define i8042_BUFFER_FULL_MASK 0x01 76 49 #define i8042_WAIT_MASK 0x02 77 #define i8042_MOUSE_DATA 0x2078 79 static void i8042_suspend(chardev_t *);80 static void i8042_resume(chardev_t *);81 82 static chardev_operations_t ops = {83 .suspend = i8042_suspend,84 .resume = i8042_resume,85 };86 50 87 51 static irq_ownership_t i8042_claim(irq_t *irq) … … 106 70 data = pio_read_8(&dev->data); 107 71 108 if ((status & i8042_MOUSE_DATA)) 109 return; 110 111 if (data & KEY_RELEASE) 112 key_released(data ^ KEY_RELEASE); 113 else 114 key_pressed(data); 72 if (instance->devout) 73 chardev_push_character(instance->devout, data); 115 74 } 116 75 } … … 118 77 /** Initialize i8042. */ 119 78 bool 120 i8042_init(i8042_t *dev, devno_t devno, inr_t inr )79 i8042_init(i8042_t *dev, devno_t devno, inr_t inr, chardev_t *devout) 121 80 { 122 81 i8042_instance_t *instance; 123 82 124 chardev_initialize("i8042_kbd", &kbrd, &ops);125 stdin = &kbrd;126 127 83 instance = malloc(sizeof(i8042_instance_t), FRAME_ATOMIC); 128 84 if (!instance) … … 131 87 instance->devno = devno; 132 88 instance->i8042 = dev; 89 instance->devout = devout; 133 90 134 91 irq_initialize(&instance->irq); … … 139 96 instance->irq.instance = instance; 140 97 irq_register(&instance->irq); 141 142 trap_virtual_enable_irqs(1 << inr);143 98 144 99 /* … … 151 106 } 152 107 153 /* Called from getc(). */154 void i8042_resume(chardev_t *d)155 {156 }157 158 /* Called from getc(). */159 void i8042_suspend(chardev_t *d)160 {161 }162 163 108 /** @} 164 109 */ -
kernel/genarch/src/drivers/ns16550/ns16550.c
re06da7e r411b6a6 32 32 /** 33 33 * @file 34 * @brief NS 16550 serial port / keyboarddriver.34 * @brief NS 16550 serial controller driver. 35 35 */ 36 36 37 #include <genarch/kbd/ns16550.h> 38 #include <genarch/kbd/key.h> 39 #include <genarch/kbd/scanc.h> 40 #include <genarch/kbd/scanc_sun.h> 41 #include <arch/drivers/kbd.h> 37 #include <genarch/drivers/ns16550/ns16550.h> 42 38 #include <ddi/irq.h> 43 #include <cpu.h>44 39 #include <arch/asm.h> 45 #include <arch.h>46 40 #include <console/chardev.h> 47 #include <console/console.h>48 #include <interrupt.h>49 #include <arch/interrupt.h>50 #include <synch/spinlock.h>51 41 #include <mm/slab.h> 52 42 53 43 #define LSR_DATA_READY 0x01 54 55 /*56 * These codes read from ns16550 data register are silently ignored.57 */58 #define IGNORE_CODE 0x7f /* all keys up */59 60 static void ns16550_suspend(chardev_t *);61 static void ns16550_resume(chardev_t *);62 63 static chardev_operations_t ops = {64 .suspend = ns16550_suspend,65 .resume = ns16550_resume,66 };67 44 68 45 /** Initialize ns16550. … … 73 50 * @param cir Clear interrupt function. 74 51 * @param cir_arg First argument to cir. 52 * @param devout Output character device. 75 53 * 76 54 * @return True on success, false on failure. 77 55 */ 78 56 bool 79 ns16550_init(ns16550_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg) 57 ns16550_init(ns16550_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg, 58 chardev_t *devout) 80 59 { 81 60 ns16550_instance_t *instance; 82 83 chardev_initialize("ns16550_kbd", &kbrd, &ops);84 stdin = &kbrd;85 61 86 62 instance = malloc(sizeof(ns16550_instance_t), FRAME_ATOMIC); … … 90 66 instance->devno = devno; 91 67 instance->ns16550 = dev; 68 instance->devout = devout; 92 69 93 70 irq_initialize(&instance->irq); … … 111 88 } 112 89 113 /* Called from getc(). */114 void ns16550_resume(chardev_t *d)115 {116 }117 118 /* Called from getc(). */119 void ns16550_suspend(chardev_t *d)120 {121 }122 123 90 irq_ownership_t ns16550_claim(irq_t *irq) 124 91 { 125 ns16550_instance_t * ns16550_instance = irq->instance;126 ns16550_t *dev = ns16550_instance->ns16550;92 ns16550_instance_t *instance = irq->instance; 93 ns16550_t *dev = instance->ns16550; 127 94 128 95 if (pio_read_8(&dev->lsr) & LSR_DATA_READY) … … 134 101 void ns16550_irq_handler(irq_t *irq) 135 102 { 136 ns16550_instance_t * ns16550_instance = irq->instance;137 ns16550_t *dev = ns16550_instance->ns16550;103 ns16550_instance_t *instance = irq->instance; 104 ns16550_t *dev = instance->ns16550; 138 105 139 106 if (pio_read_8(&dev->lsr) & LSR_DATA_READY) { … … 141 108 142 109 x = pio_read_8(&dev->rbr); 143 144 if (x != IGNORE_CODE) { 145 if (x & KEY_RELEASE) 146 key_released(x ^ KEY_RELEASE); 147 else 148 key_pressed(x); 149 } 110 if (instance->devout) 111 chardev_push_character(instance->devout, x); 150 112 } 151 152 113 } 153 114 -
kernel/genarch/src/drivers/z8530/z8530.c
re06da7e r411b6a6 32 32 /** 33 33 * @file 34 * @brief Zilog 8530 serial portdriver.34 * @brief Zilog 8530 serial controller driver. 35 35 */ 36 36 37 #include <genarch/kbd/z8530.h> 38 #include <genarch/kbd/key.h> 39 #include <genarch/kbd/scanc.h> 40 #include <genarch/kbd/scanc_sun.h> 41 #include <arch/drivers/kbd.h> 42 #include <console/console.h> 37 #include <genarch/drivers/z8530/z8530.h> 43 38 #include <console/chardev.h> 44 39 #include <ddi/irq.h> … … 66 61 } 67 62 68 /*69 * These codes read from z8530 data register are silently ignored.70 */71 #define IGNORE_CODE 0x7f /* all keys up */72 73 static void z8530_suspend(chardev_t *);74 static void z8530_resume(chardev_t *);75 76 static chardev_operations_t ops = {77 .suspend = z8530_suspend,78 .resume = z8530_resume,79 };80 81 63 /** Initialize z8530. */ 82 64 bool 83 z8530_init(z8530_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg) 65 z8530_init(z8530_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg, 66 chardev_t *devout) 84 67 { 85 68 z8530_instance_t *instance; 86 87 chardev_initialize("z8530_kbd", &kbrd, &ops);88 stdin = &kbrd;89 69 90 70 instance = malloc(sizeof(z8530_instance_t), FRAME_ATOMIC); … … 94 74 instance->devno = devno; 95 75 instance->z8530 = dev; 76 instance->devout = devout; 96 77 97 78 irq_initialize(&instance->irq); … … 125 106 } 126 107 127 /* Called from getc(). */128 void z8530_resume(chardev_t *d)129 {130 }131 132 /* Called from getc(). */133 void z8530_suspend(chardev_t *d)134 {135 }136 137 108 irq_ownership_t z8530_claim(irq_t *irq) 138 109 { … … 140 111 z8530_t *dev = instance->z8530; 141 112 142 return (z8530_read(&dev->ctl_a, RR0) & RR0_RCA); 113 if (z8530_read(&dev->ctl_a, RR0) & RR0_RCA) 114 return IRQ_ACCEPT; 115 else 116 return IRQ_DECLINE; 143 117 } 144 118 … … 151 125 if (z8530_read(&dev->ctl_a, RR0) & RR0_RCA) { 152 126 x = z8530_read(&dev->ctl_a, RR8); 153 if (x != IGNORE_CODE) { 154 if (x & KEY_RELEASE) 155 key_released(x ^ KEY_RELEASE); 156 else 157 key_pressed(x); 158 } 127 if (instance->devout) 128 chardev_push_character(instance->devout, x); 159 129 } 160 130 } -
kernel/genarch/src/kbrd/scanc_pc.c
re06da7e r411b6a6 35 35 */ 36 36 37 #include <genarch/kb d/scanc.h>37 #include <genarch/kbrd/scanc.h> 38 38 39 39 /** Primary meaning of scancodes. */ -
kernel/genarch/src/kbrd/scanc_sun.c
re06da7e r411b6a6 35 35 */ 36 36 37 #include <genarch/kb d/scanc.h>37 #include <genarch/kbrd/scanc.h> 38 38 39 39 /** Primary meaning of scancodes. */
Note:
See TracChangeset
for help on using the changeset viewer.