Rev 4339 | Rev 4345 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4339 | Rev 4344 | ||
---|---|---|---|
Line 45... | Line 45... | ||
45 | #include <arch/mm/page.h> |
45 | #include <arch/mm/page.h> |
46 | #include <arch/types.h> |
46 | #include <arch/types.h> |
47 | #include <align.h> |
47 | #include <align.h> |
48 | #include <func.h> |
48 | #include <func.h> |
49 | #include <print.h> |
49 | #include <print.h> |
- | 50 | #include <sysinfo/sysinfo.h> |
|
50 | 51 | ||
51 | kbd_type_t kbd_type = KBD_UNKNOWN; |
52 | kbd_type_t kbd_type = KBD_UNKNOWN; |
52 | 53 | ||
53 | /** Initialize keyboard. |
54 | /** Initialize keyboard. |
54 | * |
55 | * |
Line 63... | Line 64... | ||
63 | uintptr_t aligned_addr; |
64 | uintptr_t aligned_addr; |
64 | ofw_tree_property_t *prop; |
65 | ofw_tree_property_t *prop; |
65 | const char *name; |
66 | const char *name; |
66 | cir_t cir; |
67 | cir_t cir; |
67 | void *cir_arg; |
68 | void *cir_arg; |
- | 69 | ||
- | 70 | #ifdef CONFIG_NS16550 |
|
- | 71 | ns16550_t *ns16550; |
|
- | 72 | #endif |
|
- | 73 | #ifdef CONFIG_Z8530 |
|
- | 74 | z8530_t *z8530; |
|
- | 75 | #endif |
|
68 | 76 | ||
69 | name = ofw_tree_node_name(node); |
77 | name = ofw_tree_node_name(node); |
70 | 78 | ||
71 | /* |
79 | /* |
72 | * Determine keyboard serial controller type. |
80 | * Determine keyboard serial controller type. |
Line 97... | Line 105... | ||
97 | if ((!prop) || (!prop->value)) |
105 | if ((!prop) || (!prop->value)) |
98 | panic("Cannot find 'reg' property."); |
106 | panic("Cannot find 'reg' property."); |
99 | 107 | ||
100 | uintptr_t pa; |
108 | uintptr_t pa; |
101 | size_t size; |
109 | size_t size; |
- | 110 | devno_t devno; |
|
102 | inr_t inr; |
111 | inr_t inr; |
103 | 112 | ||
104 | switch (kbd_type) { |
113 | switch (kbd_type) { |
105 | case KBD_Z8530: |
114 | case KBD_Z8530: |
106 | size = ((ofw_fhc_reg_t *) prop->value)->size; |
115 | size = ((ofw_fhc_reg_t *) prop->value)->size; |
Line 129... | Line 138... | ||
129 | &cir_arg)) { |
138 | &cir_arg)) { |
130 | printf("Failed to determine keyboard interrupt.\n"); |
139 | printf("Failed to determine keyboard interrupt.\n"); |
131 | return; |
140 | return; |
132 | }; |
141 | }; |
133 | break; |
142 | break; |
134 | - | ||
135 | default: |
143 | default: |
136 | panic("Unexpected keyboard type."); |
144 | panic("Unexpected keyboard type."); |
137 | } |
145 | } |
138 | 146 | ||
139 | /* |
147 | /* |
Line 146... | Line 154... | ||
146 | offset = pa - aligned_addr; |
154 | offset = pa - aligned_addr; |
147 | 155 | ||
148 | switch (kbd_type) { |
156 | switch (kbd_type) { |
149 | #ifdef CONFIG_Z8530 |
157 | #ifdef CONFIG_Z8530 |
150 | case KBD_Z8530: |
158 | case KBD_Z8530: |
151 | z8530_init(device_assign_devno(), |
159 | devno = device_assign_devno(); |
152 | hw_map(aligned_addr, offset + size) + offset, inr, cir, cir_arg); |
160 | z8530 = (z8530_t *) hw_map(aligned_addr, offset + size) + |
- | 161 | offset; |
|
- | 162 | (void) z8530_init(z8530, devno, inr, cir, cir_arg); |
|
- | 163 | ||
- | 164 | /* |
|
- | 165 | * This is the necessary evil until the userspace drivers are |
|
- | 166 | * entirely self-sufficient. |
|
- | 167 | */ |
|
- | 168 | sysinfo_set_item_val("kbd", NULL, true); |
|
- | 169 | sysinfo_set_item_val("kbd.type", NULL, KBD_Z8530); |
|
- | 170 | sysinfo_set_item_val("kbd.devno", NULL, devno); |
|
- | 171 | sysinfo_set_item_val("kbd.inr", NULL, inr); |
|
- | 172 | sysinfo_set_item_val("kbd.address.virtual", NULL, |
|
- | 173 | (uintptr_t) z8530); |
|
- | 174 | sysinfo_set_item_val("kbd.address.physical", NULL, pa); |
|
153 | break; |
175 | break; |
154 | #endif |
176 | #endif |
155 | #ifdef CONFIG_NS16550 |
177 | #ifdef CONFIG_NS16550 |
156 | case KBD_NS16550: |
178 | case KBD_NS16550: |
157 | ns16550_init(device_assign_devno(), |
179 | devno = device_assign_devno(); |
158 | (ioport_t) (hw_map(aligned_addr, offset + size) + offset), inr, cir, cir_arg); |
180 | ns16550 = (ns16550_t *) hw_map(aligned_addr, offset + size) + |
- | 181 | offset; |
|
- | 182 | (void) ns16550_init(ns16550, devno, inr, cir, cir_arg); |
|
- | 183 | ||
- | 184 | /* |
|
- | 185 | * This is the necessary evil until the userspace driver is |
|
- | 186 | * entirely self-sufficient. |
|
- | 187 | */ |
|
- | 188 | sysinfo_set_item_val("kbd", NULL, true); |
|
- | 189 | sysinfo_set_item_val("kbd.type", NULL, KBD_NS16550); |
|
- | 190 | sysinfo_set_item_val("kbd.devno", NULL, devno); |
|
- | 191 | sysinfo_set_item_val("kbd.inr", NULL, inr); |
|
- | 192 | sysinfo_set_item_val("kbd.address.virtual", NULL, |
|
- | 193 | (uintptr_t) ns16550); |
|
- | 194 | sysinfo_set_item_val("kbd.address.physical", NULL, pa); |
|
159 | break; |
195 | break; |
160 | #endif |
196 | #endif |
161 | default: |
197 | default: |
162 | printf("Kernel is not compiled with the necessary keyboard " |
198 | printf("Kernel is not compiled with the necessary keyboard " |
163 | "driver this machine requires.\n"); |
199 | "driver this machine requires.\n"); |