Changeset 3e53ab7 in mainline for kernel/genarch
- Timestamp:
- 2008-11-28T19:33:10Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 7905360
- Parents:
- 4c4ddbe9
- Location:
- kernel/genarch
- Files:
-
- 2 edited
-
include/kbd/ns16550.h (modified) (2 diffs)
-
src/kbd/ns16550.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
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
Note:
See TracChangeset
for help on using the changeset viewer.
