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"); |