Subversion Repositories HelenOS

Rev

Rev 3934 | Rev 3941 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3934 Rev 3938
Line 102... Line 102...
102
 */
102
 */
103
bool
103
bool
104
ns16550_init(ns16550_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg)
104
ns16550_init(ns16550_t *dev, devno_t devno, inr_t inr, cir_t cir, void *cir_arg)
105
{
105
{
106
    ns16550_instance_t *instance;
106
    ns16550_instance_t *instance;
107
    irq_t *irq;
-
 
108
 
107
 
109
    chardev_initialize("ns16550_kbd", &kbrd, &ops);
108
    chardev_initialize("ns16550_kbd", &kbrd, &ops);
110
    stdin = &kbrd;
109
    stdin = &kbrd;
111
   
110
   
112
    instance = malloc(sizeof(ns16550_instance_t), FRAME_ATOMIC);
111
    instance = malloc(sizeof(ns16550_instance_t), FRAME_ATOMIC);
113
    if (!instance)
112
    if (!instance)
114
        return false;
113
        return false;
115
 
114
 
116
    irq = malloc(sizeof(irq_t), FRAME_ATOMIC);
-
 
117
    if (!irq) {
-
 
118
        free(instance);
-
 
119
        return false;
-
 
120
    }
-
 
121
 
-
 
122
    instance->devno = devno;
115
    instance->devno = devno;
123
    instance->ns16550 = dev;
116
    instance->ns16550 = dev;
124
    instance->irq = irq;
-
 
125
   
117
   
126
    irq_initialize(irq);
118
    irq_initialize(&instance->irq);
127
    irq->devno = devno;
119
    instance->irq.devno = devno;
128
    irq->inr = inr;
120
    instance->irq.inr = inr;
129
    irq->claim = ns16550_claim;
121
    instance->irq.claim = ns16550_claim;
130
    irq->handler = ns16550_irq_handler;
122
    instance->irq.handler = ns16550_irq_handler;
131
    irq->instance = instance;
123
    instance->irq.instance = instance;
132
    irq->cir = cir;
124
    instance->irq.cir = cir;
133
    irq->cir_arg = cir_arg;
125
    instance->irq.cir_arg = cir_arg;
134
    irq_register(irq);
126
    irq_register(&instance->irq);
135
 
127
 
136
    ns16550_irq = irq;  /* TODO: remove me soon */
128
    ns16550_irq = &instance->irq;   /* TODO: remove me soon */
137
   
129
   
138
    while ((pio_read_8(&dev->lsr) & LSR_DATA_READY))
130
    while ((pio_read_8(&dev->lsr) & LSR_DATA_READY))
139
        (void) pio_read_8(&dev->rbr);
131
        (void) pio_read_8(&dev->rbr);
140
   
132
   
141
    sysinfo_set_item_val("kbd", NULL, true);
133
    sysinfo_set_item_val("kbd", NULL, true);
142
    sysinfo_set_item_val("kbd.type", NULL, KBD_NS16550);
134
    sysinfo_set_item_val("kbd.type", NULL, KBD_NS16550);
143
    sysinfo_set_item_val("kbd.devno", NULL, devno);
135
    sysinfo_set_item_val("kbd.devno", NULL, devno);