Changeset 3c79afe in mainline for kernel/genarch/src/drivers/z8530


Ignore:
Timestamp:
2009-03-12T17:54:24Z (17 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
3a1c048
Parents:
a0e1b48
Message:

update for the new scheme of wiring device drivers to keyboard/serial modules

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/genarch/src/drivers/z8530/z8530.c

    ra0e1b48 r3c79afe  
    2727 */
    2828
    29 /** @addtogroup genarch 
     29/** @addtogroup genarch
    3030 * @{
    3131 */
    3232/**
    3333 * @file
    34  * @brief       Zilog 8530 serial controller driver.
     34 * @brief Zilog 8530 serial controller driver.
    3535 */
    3636
     
    4141#include <mm/slab.h>
    4242
     43indev_operations_t kbrdin_ops = {
     44        .poll = NULL
     45};
     46
    4347static inline void z8530_write(ioport8_t *ctl, uint8_t reg, uint8_t val)
    4448{
     
    4751         * command as their bit 3 is 1.
    4852         */
    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 */
    5155}
    5256
     
    5761         * command as their bit 3 is 1.
    5862         */
    59         pio_write_8(ctl, reg);  /* select register */
     63        pio_write_8(ctl, reg);   /* Select register */
    6064        return pio_read_8(ctl);
    6165}
    6266
     67static 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
     78static 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
    6389/** 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)
     90indev_t *z8530_init(z8530_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg)
    6791{
    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);
    7194        if (!instance)
    7295                return false;
    73 
     96       
     97        indev_initialize("z8530", &instance->kbrdin, &kbrdin_ops);
     98       
    7499        instance->devno = devno;
    75100        instance->z8530 = dev;
    76         instance->devout = devout;
    77 
     101       
    78102        irq_initialize(&instance->irq);
    79103        instance->irq.devno = devno;
     
    85109        instance->irq.cir_arg = cir_arg;
    86110        irq_register(&instance->irq);
    87 
     111       
    88112        (void) z8530_read(&dev->ctl_a, RR8);
    89 
     113       
    90114        /*
    91115         * Clear any pending TX interrupts or we never manage
     
    93117         */
    94118        z8530_write(&dev->ctl_a, WR0, WR0_TX_IP_RST);
    95 
     119       
    96120        /* interrupt on all characters */
    97121        z8530_write(&dev->ctl_a, WR1, WR1_IARCSC);
    98 
     122       
    99123        /* 8 bits per character and enable receiver */
    100124        z8530_write(&dev->ctl_a, WR3, WR3_RX8BITSCH | WR3_RX_ENABLE);
     
    102126        /* Master Interrupt Enable. */
    103127        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;
    130130}
    131131
Note: See TracChangeset for help on using the changeset viewer.