Changeset 411b6a6 in mainline for kernel/genarch/src/drivers/ns16550/ns16550.c
- Timestamp:
- 2009-03-07T16:08:40Z (15 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 4c84368e
- Parents:
- e06da7e
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/drivers/ns16550/ns16550.c
re06da7e r411b6a6 32 32 /** 33 33 * @file 34 * @brief NS 16550 serial port / keyboarddriver.34 * @brief NS 16550 serial controller driver. 35 35 */ 36 36 37 #include <genarch/kbd/ns16550.h> 38 #include <genarch/kbd/key.h> 39 #include <genarch/kbd/scanc.h> 40 #include <genarch/kbd/scanc_sun.h> 41 #include <arch/drivers/kbd.h> 37 #include <genarch/drivers/ns16550/ns16550.h> 42 38 #include <ddi/irq.h> 43 #include <cpu.h>44 39 #include <arch/asm.h> 45 #include <arch.h>46 40 #include <console/chardev.h> 47 #include <console/console.h>48 #include <interrupt.h>49 #include <arch/interrupt.h>50 #include <synch/spinlock.h>51 41 #include <mm/slab.h> 52 42 53 43 #define LSR_DATA_READY 0x01 54 55 /*56 * These codes read from ns16550 data register are silently ignored.57 */58 #define IGNORE_CODE 0x7f /* all keys up */59 60 static void ns16550_suspend(chardev_t *);61 static void ns16550_resume(chardev_t *);62 63 static chardev_operations_t ops = {64 .suspend = ns16550_suspend,65 .resume = ns16550_resume,66 };67 44 68 45 /** Initialize ns16550. … … 73 50 * @param cir Clear interrupt function. 74 51 * @param cir_arg First argument to cir. 52 * @param devout Output character device. 75 53 * 76 54 * @return True on success, false on failure. 77 55 */ 78 56 bool 79 ns16550_init(ns16550_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg) 57 ns16550_init(ns16550_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg, 58 chardev_t *devout) 80 59 { 81 60 ns16550_instance_t *instance; 82 83 chardev_initialize("ns16550_kbd", &kbrd, &ops);84 stdin = &kbrd;85 61 86 62 instance = malloc(sizeof(ns16550_instance_t), FRAME_ATOMIC); … … 90 66 instance->devno = devno; 91 67 instance->ns16550 = dev; 68 instance->devout = devout; 92 69 93 70 irq_initialize(&instance->irq); … … 111 88 } 112 89 113 /* Called from getc(). */114 void ns16550_resume(chardev_t *d)115 {116 }117 118 /* Called from getc(). */119 void ns16550_suspend(chardev_t *d)120 {121 }122 123 90 irq_ownership_t ns16550_claim(irq_t *irq) 124 91 { 125 ns16550_instance_t * ns16550_instance = irq->instance;126 ns16550_t *dev = ns16550_instance->ns16550;92 ns16550_instance_t *instance = irq->instance; 93 ns16550_t *dev = instance->ns16550; 127 94 128 95 if (pio_read_8(&dev->lsr) & LSR_DATA_READY) … … 134 101 void ns16550_irq_handler(irq_t *irq) 135 102 { 136 ns16550_instance_t * ns16550_instance = irq->instance;137 ns16550_t *dev = ns16550_instance->ns16550;103 ns16550_instance_t *instance = irq->instance; 104 ns16550_t *dev = instance->ns16550; 138 105 139 106 if (pio_read_8(&dev->lsr) & LSR_DATA_READY) { … … 141 108 142 109 x = pio_read_8(&dev->rbr); 143 144 if (x != IGNORE_CODE) { 145 if (x & KEY_RELEASE) 146 key_released(x ^ KEY_RELEASE); 147 else 148 key_pressed(x); 149 } 110 if (instance->devout) 111 chardev_push_character(instance->devout, x); 150 112 } 151 152 113 } 153 114
Note:
See TracChangeset
for help on using the changeset viewer.