Changeset 3c79afe in mainline for kernel/genarch/src/drivers/ns16550/ns16550.c
- Timestamp:
- 2009-03-12T17:54:24Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 3a1c048
- Parents:
- a0e1b48
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/drivers/ns16550/ns16550.c
ra0e1b48 r3c79afe 27 27 */ 28 28 29 /** @addtogroup genarch 29 /** @addtogroup genarch 30 30 * @{ 31 31 */ 32 32 /** 33 33 * @file 34 * @brief 34 * @brief NS 16550 serial controller driver. 35 35 */ 36 36 … … 41 41 #include <mm/slab.h> 42 42 43 #define LSR_DATA_READY 0x01 43 #define LSR_DATA_READY 0x01 44 45 indev_operations_t kbrdin_ops = { 46 .poll = NULL 47 }; 48 49 static irq_ownership_t ns16550_claim(irq_t *irq) 50 { 51 ns16550_instance_t *instance = irq->instance; 52 ns16550_t *dev = instance->ns16550; 53 54 if (pio_read_8(&dev->lsr) & LSR_DATA_READY) 55 return IRQ_ACCEPT; 56 else 57 return IRQ_DECLINE; 58 } 59 60 static void ns16550_irq_handler(irq_t *irq) 61 { 62 ns16550_instance_t *instance = irq->instance; 63 ns16550_t *dev = instance->ns16550; 64 65 if (pio_read_8(&dev->lsr) & LSR_DATA_READY) { 66 uint8_t x = pio_read_8(&dev->rbr); 67 chardev_push_character(&instance->kbrdin, x); 68 } 69 } 44 70 45 71 /** Initialize ns16550. 46 72 * 47 * @param dev Addrress of the beginning of the device in I/O space. 48 * @param devno Device number. 49 * @param inr Interrupt number. 50 * @param cir Clear interrupt function. 51 * @param cir_arg First argument to cir. 52 * @param devout Output character device. 73 * @param dev Addrress of the beginning of the device in I/O space. 74 * @param devno Device number. 75 * @param inr Interrupt number. 76 * @param cir Clear interrupt function. 77 * @param cir_arg First argument to cir. 53 78 * 54 * @return True on success, false on failure. 79 * @return Keyboard device pointer or NULL on failure. 80 * 55 81 */ 56 bool 57 ns16550_init(ns16550_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg, 58 chardev_t *devout) 82 indev_t *ns16550_init(ns16550_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg) 59 83 { 60 ns16550_instance_t *instance; 84 ns16550_instance_t *instance 85 = malloc(sizeof(ns16550_instance_t), FRAME_ATOMIC); 86 if (!instance) 87 return NULL; 61 88 62 instance = malloc(sizeof(ns16550_instance_t), FRAME_ATOMIC); 63 if (!instance) 64 return false; 65 89 indev_initialize("ns16550", &instance->kbrdin, &kbrdin_ops); 90 66 91 instance->devno = devno; 67 92 instance->ns16550 = dev; 68 instance->devout = devout;69 93 70 94 irq_initialize(&instance->irq); … … 77 101 instance->irq.cir_arg = cir_arg; 78 102 irq_register(&instance->irq); 79 103 80 104 while ((pio_read_8(&dev->lsr) & LSR_DATA_READY)) 81 105 (void) pio_read_8(&dev->rbr); … … 85 109 pio_write_8(&dev->mcr, MCR_OUT2); 86 110 87 return true; 88 } 89 90 irq_ownership_t ns16550_claim(irq_t *irq) 91 { 92 ns16550_instance_t *instance = irq->instance; 93 ns16550_t *dev = instance->ns16550; 94 95 if (pio_read_8(&dev->lsr) & LSR_DATA_READY) 96 return IRQ_ACCEPT; 97 else 98 return IRQ_DECLINE; 99 } 100 101 void ns16550_irq_handler(irq_t *irq) 102 { 103 ns16550_instance_t *instance = irq->instance; 104 ns16550_t *dev = instance->ns16550; 105 106 if (pio_read_8(&dev->lsr) & LSR_DATA_READY) { 107 uint8_t x; 108 109 x = pio_read_8(&dev->rbr); 110 if (instance->devout) 111 chardev_push_character(instance->devout, x); 112 } 111 return &instance->kbrdin; 113 112 } 114 113
Note:
See TracChangeset
for help on using the changeset viewer.