Changeset c2417bc in mainline for kernel/genarch/src/drivers/ns16550/ns16550.c
- Timestamp:
- 2009-04-21T12:46:26Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- f2d2c7ba
- Parents:
- 44b7783
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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
Note:
See TracChangeset
for help on using the changeset viewer.