Changeset c2417bc in mainline for kernel/genarch/src
- 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
- Location:
- kernel/genarch/src
- Files:
-
- 6 edited
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
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
Note:
See TracChangeset
for help on using the changeset viewer.