Changeset 28ecadb in mainline for kernel/arch/sparc64/src/drivers/kbd.c
- Timestamp:
- 2006-09-22T21:44:54Z (18 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 5d684e4
- Parents:
- 16529d5
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/sparc64/src/drivers/kbd.c
r16529d5 r28ecadb 34 34 35 35 #include <arch/drivers/kbd.h> 36 #include <genarch/ofw/ofw_tree.h> 36 37 #ifdef CONFIG_Z8530 37 38 #include <genarch/kbd/z8530.h> … … 41 42 #endif 42 43 43 #include <arch/boot/boot.h>44 44 #include <arch/mm/page.h> 45 45 #include <arch/types.h> 46 46 #include <typedefs.h> 47 47 #include <align.h> 48 #include <func.h> 49 #include <print.h> 48 50 49 51 volatile uint8_t *kbd_virt_address = NULL; 50 52 51 void kbd_init() 53 kbd_type_t kbd_type = KBD_UNKNOWN; 54 55 /** Initialize keyboard. 56 * 57 * Traverse OpenFirmware device tree in order to find necessary 58 * info about the keyboard device. 59 * 60 * @param node Keyboard device node. 61 */ 62 void kbd_init(ofw_tree_node_t *node) 52 63 { 53 64 size_t offset; 54 65 uintptr_t aligned_addr; 55 56 /* FIXME: supply value read from OpenFirmware */ 57 bootinfo.keyboard.size = 8; 58 66 ofw_tree_property_t *prop; 67 const char *name; 68 69 name = ofw_tree_node_name(node); 70 71 if (strcmp(name, "zs") == 0) 72 kbd_type = KBD_Z8530; 73 else if (strcmp(name, "su") == 0) 74 kbd_type = KBD_NS16550; 75 76 if (kbd_type == KBD_UNKNOWN) { 77 printf("Unknown keyboard device.\n"); 78 return; 79 } 80 81 prop = ofw_tree_getprop(node, "reg"); 82 if (!prop) 83 panic("Can't find \"reg\" property.\n"); 84 85 uintptr_t pa; 86 size_t size; 87 88 switch (kbd_type) { 89 case KBD_Z8530: 90 size = ((ofw_fhc_reg_t *) prop->value)->size; 91 if (!ofw_fhc_apply_ranges(node->parent, ((ofw_fhc_reg_t *) prop->value) , &pa)) { 92 printf("Failed to determine keyboard address.\n"); 93 return; 94 } 95 break; 96 case KBD_NS16550: 97 size = ((ofw_ebus_reg_t *) prop->value)->size; 98 if (!ofw_ebus_apply_ranges(node->parent, ((ofw_ebus_reg_t *) prop->value) , &pa)) { 99 printf("Failed to determine keyboard address.\n"); 100 return; 101 } 102 break; 103 default: 104 panic("Unexpected type.\n"); 105 } 106 59 107 /* 60 108 * We need to pass aligned address to hw_map(). 61 109 * However, the physical keyboard address can 62 * be pretty much unaligned on some systems63 * (e.g. Ultra 5, Ultra 60).110 * be pretty much unaligned, depending on the 111 * underlying controller. 64 112 */ 65 aligned_addr = ALIGN_DOWN( bootinfo.keyboard.addr, PAGE_SIZE);66 offset = bootinfo.keyboard.addr- aligned_addr;67 kbd_virt_address = (uint8_t *) hw_map(aligned_addr, offset + bootinfo.keyboard.size) + offset;113 aligned_addr = ALIGN_DOWN(pa, PAGE_SIZE); 114 offset = pa - aligned_addr; 115 kbd_virt_address = (uint8_t *) hw_map(aligned_addr, offset + size) + offset; 68 116 117 switch (kbd_type) { 69 118 #ifdef CONFIG_Z8530 70 z8530_init(); 119 case KBD_Z8530: 120 z8530_init(); 121 break; 71 122 #endif 72 123 #ifdef CONFIG_NS16550 73 ns16550_init(); 124 case KBD_NS16550: 125 ns16550_init(); 126 break; 74 127 #endif 128 default: 129 printf("Kernel is not compiled with the necessary keyboard driver this machine requires.\n"); 130 } 75 131 } 76 132
Note:
See TracChangeset
for help on using the changeset viewer.