Changeset 3e53ab7 in mainline
- Timestamp:
- 2008-11-28T19:33:10Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 7905360
- Parents:
- 4c4ddbe9
- Location:
- kernel
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/Makefile
r4c4ddbe9 r3e53ab7 125 125 ifeq ($(CONFIG_NS16550),y) 126 126 DEFS += -DCONFIG_NS16550 127 endif 128 129 ifeq ($(CONFIG_NS16550_INTERRUPT_DRIVEN),y) 130 DEFS += -DCONFIG_NS16550_INTERRUPT_DRIVEN 127 131 endif 128 132 -
kernel/arch/sparc64/src/console.c
r4c4ddbe9 r3e53ab7 113 113 #endif 114 114 115 #ifdef CONFIG_NS16550 116 #ifdef CONFIG_NS16550_INTERRUPT_DRIVEN 117 if (kbd_type == KBD_NS16550) { 118 /* 119 * The ns16550 driver is interrupt-driven. 120 */ 121 return; 122 } 123 #endif 124 #endif 115 125 while (1) { 116 126 #ifdef CONFIG_NS16550 127 #ifndef CONFIG_NS16550_INTERRUPT_DRIVEN 117 128 if (kbd_type == KBD_NS16550) 118 129 ns16550_poll(); 130 #endif 119 131 #endif 120 132 thread_usleep(KEYBOARD_POLL_PAUSE); -
kernel/arch/sparc64/src/drivers/kbd.c
r4c4ddbe9 r3e53ab7 104 104 case KBD_Z8530: 105 105 size = ((ofw_fhc_reg_t *) prop->value)->size; 106 if (!ofw_fhc_apply_ranges(node->parent, ((ofw_fhc_reg_t *) prop->value) , &pa)) { 106 if (!ofw_fhc_apply_ranges(node->parent, 107 ((ofw_fhc_reg_t *) prop->value), &pa)) { 107 108 printf("Failed to determine keyboard address.\n"); 108 109 return; 109 110 } 110 if (!ofw_fhc_map_interrupt(node->parent, ((ofw_fhc_reg_t *) prop->value), interrupts, &inr)) { 111 if (!ofw_fhc_map_interrupt(node->parent, 112 ((ofw_fhc_reg_t *) prop->value), interrupts, &inr)) { 111 113 printf("Failed to determine keyboard interrupt.\n"); 112 114 return; … … 116 118 case KBD_NS16550: 117 119 size = ((ofw_ebus_reg_t *) prop->value)->size; 118 if (!ofw_ebus_apply_ranges(node->parent, ((ofw_ebus_reg_t *) prop->value) , &pa)) { 120 if (!ofw_ebus_apply_ranges(node->parent, 121 ((ofw_ebus_reg_t *) prop->value), &pa)) { 119 122 printf("Failed to determine keyboard address.\n"); 120 123 return; 121 124 } 122 if (!ofw_ebus_map_interrupt(node->parent, ((ofw_ebus_reg_t *) prop->value), interrupts, &inr)) { 125 if (!ofw_ebus_map_interrupt(node->parent, 126 ((ofw_ebus_reg_t *) prop->value), interrupts, &inr)) { 123 127 printf("Failed to determine keyboard interrupt.\n"); 124 128 return; … … 152 156 #endif 153 157 default: 154 printf("Kernel is not compiled with the necessary keyboard driver this machine requires.\n"); 158 printf("Kernel is not compiled with the necessary keyboard " 159 "driver this machine requires.\n"); 155 160 } 156 161 } -
kernel/genarch/include/kbd/ns16550.h
r4c4ddbe9 r3e53ab7 59 59 #define FCR_REG 2 /** FIFO control register (write). */ 60 60 #define LCR_REG 3 /** Line Control register. */ 61 #define MCR_REG 4 /** Modem Control Register. */ 61 62 #define LSR_REG 5 /** Line Status Register. */ 62 63 … … 65 66 #define LCR_DLAB 0x80 /** Divisor Latch Access bit. */ 66 67 68 #define MCR_OUT2 0x08 /** OUT2. */ 69 67 70 /** Structure representing the ns16550 device. */ 68 71 typedef struct { 69 72 devno_t devno; 70 volatile ioport_t io_port; /** Memory mapped registers of the ns16550. */ 73 /** Memory mapped registers of the ns16550. */ 74 volatile ioport_t io_port; 71 75 } ns16550_t; 72 76 73 77 static inline uint8_t ns16550_rbr_read(ns16550_t *dev) 74 78 { 75 return inb(dev->io_port +RBR_REG);79 return inb(dev->io_port + RBR_REG); 76 80 } 77 81 static inline void ns16550_rbr_write(ns16550_t *dev, uint8_t v) 78 82 { 79 outb(dev->io_port +RBR_REG,v);83 outb(dev->io_port + RBR_REG, v); 80 84 } 81 85 82 86 static inline uint8_t ns16550_ier_read(ns16550_t *dev) 83 87 { 84 return inb(dev->io_port +IER_REG);88 return inb(dev->io_port + IER_REG); 85 89 } 86 90 87 91 static inline void ns16550_ier_write(ns16550_t *dev, uint8_t v) 88 92 { 89 outb(dev->io_port +IER_REG,v);93 outb(dev->io_port + IER_REG, v); 90 94 } 91 95 92 96 static inline uint8_t ns16550_iir_read(ns16550_t *dev) 93 97 { 94 return inb(dev->io_port +IIR_REG);98 return inb(dev->io_port + IIR_REG); 95 99 } 96 100 97 101 static inline void ns16550_fcr_write(ns16550_t *dev, uint8_t v) 98 102 { 99 outb(dev->io_port +FCR_REG,v);103 outb(dev->io_port + FCR_REG, v); 100 104 } 101 105 102 106 static inline uint8_t ns16550_lcr_read(ns16550_t *dev) 103 107 { 104 return inb(dev->io_port +LCR_REG);108 return inb(dev->io_port + LCR_REG); 105 109 } 106 110 107 111 static inline void ns16550_lcr_write(ns16550_t *dev, uint8_t v) 108 112 { 109 outb(dev->io_port +LCR_REG,v);113 outb(dev->io_port + LCR_REG, v); 110 114 } 111 115 112 116 static inline uint8_t ns16550_lsr_read(ns16550_t *dev) 113 117 { 114 return inb(dev->io_port +LSR_REG);118 return inb(dev->io_port + LSR_REG); 115 119 } 116 120 121 static inline uint8_t ns16550_mcr_read(ns16550_t *dev) 122 { 123 return inb(dev->io_port + MCR_REG); 124 } 117 125 126 static inline void ns16550_mcr_write(ns16550_t *dev, uint8_t v) 127 { 128 outb(dev->io_port + MCR_REG, v); 129 } 118 130 119 131 #endif -
kernel/genarch/src/kbd/ns16550.c
r4c4ddbe9 r3e53ab7 135 135 sysinfo_set_item_val("kbd.address.virtual", NULL, port); 136 136 137 #ifdef CONFIG_NS16550_INTERRUPT_DRIVEN 138 /* Enable interrupts */ 139 ns16550_ier_write(&ns16550, IER_ERBFI); 140 ns16550_mcr_write(&ns16550, MCR_OUT2); 141 #endif 142 137 143 #ifdef ia64 138 144 uint8_t c; … … 150 156 void ns16550_interrupt(void) 151 157 { 152 /* TODO 153 * 154 * ns16550 works in the polled mode so far. 155 */ 158 ns16550_poll(); 156 159 } 157 160 … … 202 205 void ns16550_poll(void) 203 206 { 207 #ifndef CONFIG_NS16550_INTERRUPT_DRIVEN 204 208 ipl_t ipl; 205 209 … … 221 225 spinlock_unlock(&ns16550_irq.lock); 222 226 interrupts_restore(ipl); 227 #endif 223 228 224 229 while (ns16550_lsr_read(&ns16550) & LSR_DATA_READY) { … … 252 257 void ns16550_irq_handler(irq_t *irq, void *arg, ...) 253 258 { 254 panic("Not yet implemented, ns16550 works in polled mode.\n"); 259 if (irq->notif_cfg.notify && irq->notif_cfg.answerbox) 260 ipc_irq_send_notif(irq); 261 else 262 ns16550_interrupt(); 255 263 } 256 264 -
kernel/kernel.config
r4c4ddbe9 r3e53ab7 142 142 ! [ARCH=sparc64|ARCH=ia64] CONFIG_NS16550 (y/n) 143 143 144 # Interrupt-driven driver for NS16550? 145 ! [CONFIG_NS16550=y] CONFIG_NS16550_INTERRUPT_DRIVEN (n/y) 144 146 145 147 # Virtually indexed D-cache support
Note:
See TracChangeset
for help on using the changeset viewer.