Subversion Repositories HelenOS

Rev

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

Rev 1920 Rev 1921
Line 47... Line 47...
47
#include <typedefs.h>
47
#include <typedefs.h>
48
#include <align.h>
48
#include <align.h>
49
#include <func.h>
49
#include <func.h>
50
#include <print.h>
50
#include <print.h>
51
 
51
 
52
volatile uint8_t *kbd_virt_address = NULL;
-
 
53
 
-
 
54
kbd_type_t kbd_type = KBD_UNKNOWN;
52
kbd_type_t kbd_type = KBD_UNKNOWN;
55
 
53
 
56
static irq_t kbd_irq;
-
 
57
 
-
 
58
/** Initialize keyboard.
54
/** Initialize keyboard.
59
 *
55
 *
60
 * Traverse OpenFirmware device tree in order to find necessary
56
 * Traverse OpenFirmware device tree in order to find necessary
61
 * info about the keyboard device.
57
 * info about the keyboard device.
62
 *
58
 *
Line 100... Line 96...
100
    if (!prop || !prop->value)
96
    if (!prop || !prop->value)
101
        panic("Can't find \"reg\" property.\n");
97
        panic("Can't find \"reg\" property.\n");
102
   
98
   
103
    uintptr_t pa;
99
    uintptr_t pa;
104
    size_t size;
100
    size_t size;
105
    int inr;
101
    inr_t inr;
106
   
-
 
107
    irq_initialize(&kbd_irq);
102
    devno_t devno = device_assign_devno();
108
   
103
   
109
    switch (kbd_type) {
104
    switch (kbd_type) {
110
    case KBD_Z8530:
105
    case KBD_Z8530:
111
        size = ((ofw_fhc_reg_t *) prop->value)->size;
106
        size = ((ofw_fhc_reg_t *) prop->value)->size;
112
        if (!ofw_fhc_apply_ranges(node->parent, ((ofw_fhc_reg_t *) prop->value) , &pa)) {
107
        if (!ofw_fhc_apply_ranges(node->parent, ((ofw_fhc_reg_t *) prop->value) , &pa)) {
Line 114... Line 109...
114
            return;
109
            return;
115
        }
110
        }
116
        if (!ofw_fhc_map_interrupt(node->parent, ((ofw_fhc_reg_t *) prop->value), interrupts, &inr)) {
111
        if (!ofw_fhc_map_interrupt(node->parent, ((ofw_fhc_reg_t *) prop->value), interrupts, &inr)) {
117
            printf("Failed to determine keyboard interrupt.\n");
112
            printf("Failed to determine keyboard interrupt.\n");
118
            return;
113
            return;
119
        } else {
-
 
120
            kbd_irq.inr = inr;
-
 
121
            kbd_irq.devno = device_assign_devno();
-
 
122
            kbd_irq.trigger = IRQ_TRIGGER_LEVEL;
-
 
123
            kbd_irq.claim = z8530_claim;
-
 
124
            kbd_irq.handler = z8530_irq_handler;
-
 
125
            irq_register(&kbd_irq);
-
 
126
        }
114
        }
127
        break;
115
        break;
128
       
116
       
129
    case KBD_NS16550:
117
    case KBD_NS16550:
130
        size = ((ofw_ebus_reg_t *) prop->value)->size;
118
        size = ((ofw_ebus_reg_t *) prop->value)->size;
Line 133... Line 121...
133
            return;
121
            return;
134
        }
122
        }
135
        if (!ofw_ebus_map_interrupt(node->parent, ((ofw_ebus_reg_t *) prop->value), interrupts, &inr)) {
123
        if (!ofw_ebus_map_interrupt(node->parent, ((ofw_ebus_reg_t *) prop->value), interrupts, &inr)) {
136
            printf("Failed to determine keyboard interrupt.\n");
124
            printf("Failed to determine keyboard interrupt.\n");
137
            return;
125
            return;
138
        } else {
-
 
139
            kbd_irq.inr = inr;
-
 
140
            kbd_irq.devno = device_assign_devno();
-
 
141
            kbd_irq.trigger = IRQ_TRIGGER_LEVEL;
-
 
142
            kbd_irq.claim = ns16550_claim;
-
 
143
            kbd_irq.handler = ns16550_irq_handler;
-
 
144
            irq_register(&kbd_irq);
-
 
145
        }
126
        };
146
        break;
127
        break;
147
 
128
 
148
    default:
129
    default:
149
        panic("Unexpected type.\n");
130
        panic("Unexpected type.\n");
150
    }
131
    }
Line 155... Line 136...
155
     * be pretty much unaligned, depending on the
136
     * be pretty much unaligned, depending on the
156
     * underlying controller.
137
     * underlying controller.
157
     */
138
     */
158
    aligned_addr = ALIGN_DOWN(pa, PAGE_SIZE);
139
    aligned_addr = ALIGN_DOWN(pa, PAGE_SIZE);
159
    offset = pa - aligned_addr;
140
    offset = pa - aligned_addr;
160
    kbd_virt_address = (uint8_t *) hw_map(aligned_addr, offset + size) + offset;
141
    uintptr_t vaddr = hw_map(aligned_addr, offset + size) + offset;
161
 
142
 
162
    switch (kbd_type) {
143
    switch (kbd_type) {
163
#ifdef CONFIG_Z8530
144
#ifdef CONFIG_Z8530
164
    case KBD_Z8530:
145
    case KBD_Z8530:
165
        z8530_init();
146
        z8530_init(devno, inr, vaddr);
166
        break;
147
        break;
167
#endif
148
#endif
168
#ifdef CONFIG_NS16550
149
#ifdef CONFIG_NS16550
169
    case KBD_NS16550:
150
    case KBD_NS16550:
170
        ns16550_init();
151
        ns16550_init(devno, inr, vaddr);
171
        break;
152
        break;
172
#endif
153
#endif
173
    default:
154
    default:
174
        printf("Kernel is not compiled with the necessary keyboard driver this machine requires.\n");
155
        printf("Kernel is not compiled with the necessary keyboard driver this machine requires.\n");
175
    }
156
    }