Changeset 6bbe470 in mainline for kernel/genarch/src/drivers/ns16550/ns16550.c
- Timestamp:
- 2012-10-29T22:56:18Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 21b6307
- Parents:
- 5030acad
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/drivers/ns16550/ns16550.c
r5030acad r6bbe470 41 41 #include <mm/slab.h> 42 42 #include <ddi/device.h> 43 #include <str.h> 43 44 44 45 #define LSR_DATA_READY 0x01 46 #define LSR_TH_READY 0x20 45 47 46 48 static irq_ownership_t ns16550_claim(irq_t *irq) … … 62 64 if (pio_read_8(&dev->lsr) & LSR_DATA_READY) { 63 65 uint8_t data = pio_read_8(&dev->rbr); 64 indev_push_character(instance-> kbrdin, data);66 indev_push_character(instance->input, data); 65 67 } 66 68 } … … 72 74 (void) pio_read_8(&dev->rbr); 73 75 } 76 77 static void ns16550_sendb(ns16550_t *dev, uint8_t byte) 78 { 79 while (!(pio_read_8(&dev->lsr) & LSR_TH_READY)) 80 ; 81 pio_write_8(&dev->thr, byte); 82 } 83 84 static void ns16550_putchar(outdev_t *dev, wchar_t ch) 85 { 86 ns16550_instance_t *instance = (ns16550_instance_t *) dev->data; 87 88 if ((!instance->parea.mapped) || (console_override)) { 89 if (ascii_check(ch)) 90 ns16550_sendb(instance->ns16550, (uint8_t) ch); 91 else 92 ns16550_sendb(instance->ns16550, U_SPECIAL); 93 } 94 } 95 96 static outdev_operations_t ns16550_ops = { 97 .write = ns16550_putchar, 98 .redraw = NULL 99 }; 74 100 75 101 /** Initialize ns16550. … … 90 116 if (instance) { 91 117 instance->ns16550 = dev; 92 instance->kbrdin = NULL; 118 instance->input = NULL; 119 instance->output = NULL; 93 120 94 121 irq_initialize(&instance->irq); … … 100 127 instance->irq.cir = cir; 101 128 instance->irq.cir_arg = cir_arg; 129 130 instance->parea.pbase = (uintptr_t) dev; 131 instance->parea.frames = 1; 132 instance->parea.unpriv = false; 133 instance->parea.mapped = false; 134 ddi_parea_register(&instance->parea); 102 135 } 103 136 … … 105 138 } 106 139 107 void ns16550_wire(ns16550_instance_t *instance, indev_t * kbrdin)140 void ns16550_wire(ns16550_instance_t *instance, indev_t *input) 108 141 { 109 142 ASSERT(instance); 110 ASSERT( kbrdin);143 ASSERT(input); 111 144 112 instance-> kbrdin = kbrdin;145 instance->input = input; 113 146 irq_register(&instance->irq); 114 147 … … 120 153 } 121 154 155 outdev_t *ns16550_output(ns16550_instance_t *instance) 156 { 157 ASSERT(instance); 158 159 if (instance->output == NULL) { 160 instance->output = malloc(sizeof(outdev_t), 161 FRAME_ATOMIC); 162 if (instance->output) { 163 outdev_initialize("ns16550", instance->output, 164 &ns16550_ops); 165 instance->output->data = instance; 166 } 167 } 168 169 return instance->output; 170 } 171 122 172 /** @} 123 173 */
Note:
See TracChangeset
for help on using the changeset viewer.