#include <realmode.h>
#include <ipxe/console.h>
#include <ipxe/ansiesc.h>
+#include <ipxe/keymap.h>
#define ATTR_BOLD 0x08
return NULL;
}
+/**
+ * Map a key
+ *
+ * @v character Character read from console
+ * @ret character Mapped character
+ */
+static int bios_keymap ( unsigned int character ) {
+ struct key_mapping *mapping;
+
+ for_each_table_entry ( mapping, KEYMAP ) {
+ if ( mapping->from == character )
+ return mapping->to;
+ }
+ return character;
+}
+
/**
* Get character from BIOS console
*
: "=a" ( keypress ) : "a" ( 0x1000 ) );
character = ( keypress & 0xff );
- /* If it's a normal character, just return it */
+ /* If it's a normal character, just map and return it */
if ( character && ( character < 0x80 ) )
- return character;
+ return bios_keymap ( character );
/* Otherwise, check for a special key that we know about */
if ( ( ansi_seq = scancode_to_ansi_seq ( keypress >> 8 ) ) ) {
--- /dev/null
+#ifndef _IPXE_KEYMAP_H
+#define _IPXE_KEYMAP_H
+
+/**
+ * @file
+ *
+ * Keyboard mappings
+ *
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+#include <stdint.h>
+#include <ipxe/tables.h>
+
+/** A keyboard mapping */
+struct key_mapping {
+ /** Character read from keyboard */
+ uint8_t from;
+ /** Character to be used instead */
+ uint8_t to;
+} __attribute__ (( packed ));
+
+/** Keyboard mapping table */
+#define KEYMAP __table ( struct key_mapping, "keymap" )
+
+/** Define a keyboard mapping */
+#define __keymap __table_entry ( KEYMAP, 01 )
+
+#endif /* _IPXE_KEYMAP_H */