Changeset 3c79afe in mainline for kernel/genarch/src/drivers/z8530
- Timestamp:
- 2009-03-12T17:54:24Z (17 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 3a1c048
- Parents:
- a0e1b48
- File:
-
- 1 edited
-
kernel/genarch/src/drivers/z8530/z8530.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/drivers/z8530/z8530.c
ra0e1b48 r3c79afe 27 27 */ 28 28 29 /** @addtogroup genarch 29 /** @addtogroup genarch 30 30 * @{ 31 31 */ 32 32 /** 33 33 * @file 34 * @brief Zilog 8530 serial controller driver.34 * @brief Zilog 8530 serial controller driver. 35 35 */ 36 36 … … 41 41 #include <mm/slab.h> 42 42 43 indev_operations_t kbrdin_ops = { 44 .poll = NULL 45 }; 46 43 47 static inline void z8530_write(ioport8_t *ctl, uint8_t reg, uint8_t val) 44 48 { … … 47 51 * command as their bit 3 is 1. 48 52 */ 49 pio_write_8(ctl, reg); /* select register */50 pio_write_8(ctl, val); /* write value */53 pio_write_8(ctl, reg); /* Select register */ 54 pio_write_8(ctl, val); /* Write value */ 51 55 } 52 56 … … 57 61 * command as their bit 3 is 1. 58 62 */ 59 pio_write_8(ctl, reg); /* select register */63 pio_write_8(ctl, reg); /* Select register */ 60 64 return pio_read_8(ctl); 61 65 } 62 66 67 static irq_ownership_t z8530_claim(irq_t *irq) 68 { 69 z8530_instance_t *instance = irq->instance; 70 z8530_t *dev = instance->z8530; 71 72 if (z8530_read(&dev->ctl_a, RR0) & RR0_RCA) 73 return IRQ_ACCEPT; 74 else 75 return IRQ_DECLINE; 76 } 77 78 static void z8530_irq_handler(irq_t *irq) 79 { 80 z8530_instance_t *instance = irq->instance; 81 z8530_t *dev = instance->z8530; 82 83 if (z8530_read(&dev->ctl_a, RR0) & RR0_RCA) { 84 uint8_t x = z8530_read(&dev->ctl_a, RR8); 85 chardev_push_character(&instance->kbrdin, x); 86 } 87 } 88 63 89 /** Initialize z8530. */ 64 bool 65 z8530_init(z8530_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg, 66 chardev_t *devout) 90 indev_t *z8530_init(z8530_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg) 67 91 { 68 z8530_instance_t *instance; 69 70 instance = malloc(sizeof(z8530_instance_t), FRAME_ATOMIC); 92 z8530_instance_t *instance 93 = malloc(sizeof(z8530_instance_t), FRAME_ATOMIC); 71 94 if (!instance) 72 95 return false; 73 96 97 indev_initialize("z8530", &instance->kbrdin, &kbrdin_ops); 98 74 99 instance->devno = devno; 75 100 instance->z8530 = dev; 76 instance->devout = devout; 77 101 78 102 irq_initialize(&instance->irq); 79 103 instance->irq.devno = devno; … … 85 109 instance->irq.cir_arg = cir_arg; 86 110 irq_register(&instance->irq); 87 111 88 112 (void) z8530_read(&dev->ctl_a, RR8); 89 113 90 114 /* 91 115 * Clear any pending TX interrupts or we never manage … … 93 117 */ 94 118 z8530_write(&dev->ctl_a, WR0, WR0_TX_IP_RST); 95 119 96 120 /* interrupt on all characters */ 97 121 z8530_write(&dev->ctl_a, WR1, WR1_IARCSC); 98 122 99 123 /* 8 bits per character and enable receiver */ 100 124 z8530_write(&dev->ctl_a, WR3, WR3_RX8BITSCH | WR3_RX_ENABLE); … … 102 126 /* Master Interrupt Enable. */ 103 127 z8530_write(&dev->ctl_a, WR9, WR9_MIE); 104 105 return true; 106 } 107 108 irq_ownership_t z8530_claim(irq_t *irq) 109 { 110 z8530_instance_t *instance = irq->instance; 111 z8530_t *dev = instance->z8530; 112 113 if (z8530_read(&dev->ctl_a, RR0) & RR0_RCA) 114 return IRQ_ACCEPT; 115 else 116 return IRQ_DECLINE; 117 } 118 119 void z8530_irq_handler(irq_t *irq) 120 { 121 z8530_instance_t *instance = irq->instance; 122 z8530_t *dev = instance->z8530; 123 uint8_t x; 124 125 if (z8530_read(&dev->ctl_a, RR0) & RR0_RCA) { 126 x = z8530_read(&dev->ctl_a, RR8); 127 if (instance->devout) 128 chardev_push_character(instance->devout, x); 129 } 128 129 return &instance->kbrdin; 130 130 } 131 131
Note:
See TracChangeset
for help on using the changeset viewer.
