Author: blueswirl
Date: 2009-01-04 21:39:50 +0100 (Sun, 04 Jan 2009)
New Revision: 350
Added:
openbios-devel/drivers/adb_bus.c
openbios-devel/drivers/adb_bus.h
openbios-devel/drivers/adb_kbd.c
openbios-devel/drivers/adb_kbd.h
openbios-devel/drivers/adb_mouse.c
openbios-devel/drivers/adb_mouse.h
Removed:
openbios-devel/drivers/adb.c
openbios-devel/drivers/adb.h
Modified:
openbios-devel/drivers/build.xml
openbios-devel/drivers/cuda.c
openbios-devel/drivers/cuda.h
Log:
ADB cleanup (Laurent Vivier)
Split adb.[ch] and part of cuda.c to adb_bus.[ch], adb_kbd.[ch] and
adb_mouse.[ch].
Deleted: openbios-devel/drivers/adb.c
===================================================================
--- openbios-devel/drivers/adb.c 2009-01-04 19:25:41 UTC (rev 349)
+++ openbios-devel/drivers/adb.c 2009-01-04 20:39:50 UTC (rev 350)
@@ -1,631 +0,0 @@
-/*
- * <adbkbd.c>
- *
- * Open Hack'Ware BIOS ADB keyboard support, ported to OpenBIOS
- *
- * Copyright (c) 2005 Jocelyn Mayer
- * Copyright (c) 2005 Stefan Reinauer
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License V2
- * as published by the Free Software Foundation
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
- */
-
-
-#include "openbios/config.h"
-#include "openbios/bindings.h"
-#include "asm/types.h"
-#include "adb.h"
-#include "kbd.h"
-#include "cuda.h"
-#include "libc/byteorder.h"
-#include "libc/vsprintf.h"
-
-//#define DEBUG_ADB 1
-
-#ifdef DEBUG_ADB
-#define ADB_DPRINTF(fmt, args...) \
-do { printk("ADB - %s: " fmt, __func__ , ##args); } while (0)
-#else
-#define ADB_DPRINTF(fmt, args...) do { } while (0)
-#endif
-
-DECLARE_UNNAMED_NODE( keyboard, INSTALL_OPEN, sizeof(int));
-
-static void
-keyboard_open(int *idx)
-{
- RET(-1);
-}
-
-static void
-keyboard_close(int *idx)
-{
-}
-
-static void keyboard_read(void);
-
-NODE_METHODS( keyboard ) = {
- { "open", keyboard_open },
- { "close", keyboard_close },
- { "read", keyboard_read },
-};
-
-/* ADB US keyboard translation map
- * XXX: for now, only shift modifier is defined
- */
-
-
-static const keymap_t ADB_kbd_us[] = {
- /* 0x00 */
- { KBD_SH_CAPS, { 0x61, 0x41, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x73, 0x53, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x64, 0x44, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x66, 0x46, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x68, 0x48, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x67, 0x47, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x7A, 0x5A, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x78, 0x58, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- /* 0x08 */
- { KBD_SH_CAPS, { 0x63, 0x43, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x76, 0x56, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x60, 0x40, -1, -1, -1, -1, -1, -1, /* ? */
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x62, 0x42, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x71, 0x51, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x77, 0x57, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x65, 0x45, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x72, 0x52, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- /* 0x10 */
- { KBD_SH_CAPS, { 0x79, 0x59, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x74, 0x54, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x31, 0x21, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x32, 0x40, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x33, 0x23, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x34, 0x24, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x36, 0x5E, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x35, 0x25, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- /* 0x18 */
- { KBD_SH_CAPS, { 0x3D, 0x2B, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x39, 0x28, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x37, 0x26, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x2D, 0x5F, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x38, 0x2A, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x30, 0x29, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x5D, 0x7D, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x6F, 0x4F, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- /* 0x20 */
- { KBD_SH_CAPS, { 0x75, 0x55, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x5B, 0x7B, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x69, 0x49, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x70, 0x50, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_MOD_MAP(0x0D), },
- { KBD_SH_CAPS, { 0x6C, 0x4C, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x6A, 0x4A, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x27, 0x22, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- /* 0x28 */
- { KBD_SH_CAPS, { 0x6B, 0x4B, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x3B, 0x3A, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x5C, 0x7C, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x2C, 0x3C, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x2F, 0x3F, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x6E, 0x4E, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x6D, 0x4D, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_CAPS, { 0x2E, 0x3E, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- /* 0x30 : tab */
- { KBD_MOD_MAP(0x09), },
- /* 0x31 : space */
- { KBD_MOD_MAP(0x20), },
- /* 0x32 : '<' '>' */
- { KBD_SH_CAPS, { 0x3C, 0x3E, -1, -1, -1, -1, -1, -1, /* ? */
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- /* 0x33 : backspace */
- { KBD_MOD_MAP(0x08), },
- { KBD_MAP_NONE, },
- /* 0x35 : ESC */
- { KBD_MOD_MAP(0x1B), },
- /* 0x36 : control */
- { KBD_MOD_MAP_LCTRL, },
- /* 0x37 : command */
- { KBD_MOD_MAP_LCMD, },
- /* 0x38 : left shift */
- { KBD_MOD_MAP_LSHIFT, },
- /* 0x39 : caps-lock */
- { KBD_MOD_MAP_CAPS, },
- /* 0x3A : option */
- { KBD_MOD_MAP_LOPT, },
- /* 0x3B : left */
- { KBD_MAP_NONE, },
- /* 0x3C : right */
- { KBD_MAP_NONE, },
- /* 0x3D : down */
- { KBD_MAP_NONE, },
- /* 0x3E : up */
- { KBD_MAP_NONE, },
- { KBD_MAP_NONE, },
- /* 0x40 */
- { KBD_MAP_NONE, },
- { KBD_SH_NUML, { 0x7F, 0x2E, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_MAP_NONE, },
- { KBD_SH_NONE, { 0x2A, 0x2A, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_MAP_NONE, },
- { KBD_SH_NONE, { 0x2B, 0x2B, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_MAP_NONE, },
- { KBD_MOD_MAP(0x7F), },
- /* 0x48 */
- { KBD_MAP_NONE, },
- { KBD_MAP_NONE, },
- { KBD_MAP_NONE, },
- { KBD_SH_NONE, { 0x2F, 0x2F, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_MOD_MAP(0x0D), },
- { KBD_MAP_NONE, },
- { KBD_SH_NONE, { 0x2D, 0x2D, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_MAP_NONE, },
- /* 0x50 */
- { KBD_MAP_NONE, },
- { KBD_SH_NONE, { 0x3D, 0x3D, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_NUML, { -1, 0x30, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_NUML, { -1, 0x31, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_NUML, { -1, 0x32, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_NUML, { -1, 0x33, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_NUML, { -1, 0x34, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_NUML, { -1, 0x35, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- /* 0x58 */
- { KBD_SH_NUML, { -1, 0x36, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_NUML, { -1, 0x37, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_MAP_NONE, },
- { KBD_SH_NUML, { -1, 0x38, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_SH_NUML, { -1, 0x39, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1, }, },
- { KBD_MAP_NONE, },
- { KBD_MOD_MAP(0x2F), },
- { KBD_MAP_NONE, },
- /* 0x60 : F5 */
- { KBD_MAP_NONE, },
- /* 0x61 : F6 */
- { KBD_MAP_NONE, },
- /* 0x62 : F7 */
- { KBD_MAP_NONE, },
- /* 0x63 : F3 */
- { KBD_MAP_NONE, },
- /* 0x64 : F8 */
- { KBD_MAP_NONE, },
- /* 0x65 : F9 */
- { KBD_MAP_NONE, },
- { KBD_MAP_NONE, },
- /* 0x67 : F11 */
- { KBD_MAP_NONE, },
- /* 0x68 */
- { KBD_MAP_NONE, },
- /* 0x69 : F13 */
- { KBD_MAP_NONE, },
- { KBD_MAP_NONE, },
- /* 0x6B : F14 */
- { KBD_MAP_NONE, },
- { KBD_MAP_NONE, },
- /* 0x6D : F10 */
- { KBD_MAP_NONE, },
- { KBD_MAP_NONE, },
- /* 0x6F : F12 */
- { KBD_MAP_NONE, },
- /* 0x70 */
- { KBD_MAP_NONE, },
- /* 0x71 : F15 */
- { KBD_MAP_NONE, },
- /* 0x72 : help */
- { KBD_MAP_NONE, },
- /* 0x73 : home */
- { KBD_MAP_NONE, },
- /* 0x74 : page up */
- { KBD_MAP_NONE, },
- /* 0x75 : del */
- { KBD_MAP_NONE, },
- /* 0x76 : F4 */
- { KBD_MAP_NONE, },
- /* 0x77 : end */
- { KBD_MAP_NONE, },
- /* 0x78 : F2 */
- { KBD_MAP_NONE, },
- /* 0x79 : page down */
- { KBD_MAP_NONE, },
- /* 0x7A : F1 */
- { KBD_MAP_NONE, },
- /* 0x7B : right shift */
- { KBD_MOD_MAP_RSHIFT, },
- /* 0x7C : right option */
- { KBD_MOD_MAP_ROPT, },
- /* 0x7D : right control */
- { KBD_MOD_MAP_RCTRL, },
- { KBD_MAP_NONE, },
- /* 0x7F : power */
- { KBD_MAP_NONE, },
-};
-
-typedef struct adb_kbd_t adb_kbd_t;
-struct adb_kbd_t {
- kbd_t kbd;
- int next_key;
-};
-
-static adb_dev_t *my_adb_dev = NULL;
-
-static int adb_kbd_read (void *private)
-{
- uint8_t buffer[ADB_BUF_SIZE];
- adb_dev_t *dev = private;
- adb_kbd_t *kbd;
- int key;
- int ret;
-
- kbd = (void *)dev->state;
- /* Get saved state */
- ret = -1;
- for (key = -1; key == -1; ) {
- if (kbd->next_key != -1) {
- key = kbd->next_key;
- kbd->next_key = -1;
- } else {
- if (adb_reg_get(dev, 0, buffer) != 2)
- break;
- kbd->next_key = buffer[1] == 0xFF ? -1 : buffer[1];
- key = buffer[0];
- }
- ret = kbd_translate_key(&kbd->kbd, key & 0x7F, key >> 7);
- ADB_DPRINTF("Translated %d (%02x) into %d (%02x)\n",
- key, key, ret, ret);
- }
-
- return ret;
-}
-
-
-void *adb_kbd_new (char *path, void *private)
-{
- char buf[64];
- int props[1];
- phandle_t ph, aliases;
- adb_kbd_t *kbd;
- adb_dev_t *dev = private;
- kbd = (adb_kbd_t*)malloc(sizeof(adb_kbd_t));
- if (kbd != NULL) {
- memset(kbd, 0, sizeof(adb_kbd_t));
- kbd_set_keymap(&kbd->kbd, sizeof(ADB_kbd_us) / sizeof(keymap_t),
- ADB_kbd_us);
- kbd->next_key = -1;
- dev->state = (int32_t)kbd;
- my_adb_dev = dev;
- }
-
- snprintf(buf, sizeof(buf), "%s/keyboard", path);
- REGISTER_NAMED_NODE( keyboard, buf);
-
- ph = find_dev(buf);
-
- set_property(ph, "device_type", "keyboard", 9);
- props[0] = __cpu_to_be32(dev->addr);
- set_property(ph, "reg", (char *)&props, sizeof(props));
-
- aliases = find_dev("/aliases");
- set_property(aliases, "adb-keyboard", buf, strlen(buf) + 1);
-
- return kbd;
-}
-
-/* ( addr len -- actual ) */
-static void keyboard_read(void)
-{
- char *addr;
- int len, key, i;
- len=POP();
- addr=(char *)POP();
-
- for (i = 0; i < len; i++) {
- key = adb_kbd_read(my_adb_dev);
- if (key == -1 || key == -2)
- break;
- *addr++ = (char)key;
- }
- PUSH(i);
-}
-
-DECLARE_UNNAMED_NODE( mouse, INSTALL_OPEN, sizeof(int));
-
-static void
-mouse_open(int *idx)
-{
- RET(-1);
-}
-
-static void
-mouse_close(int *idx)
-{
-}
-
-NODE_METHODS( mouse ) = {
- { "open", mouse_open },
- { "close", mouse_close },
-};
-
-void adb_mouse_new (char *path, void *private)
-{
- char buf[64];
- int props[1];
- phandle_t ph, aliases;
- adb_dev_t *dev = private;
-
- snprintf(buf, sizeof(buf), "%s/mouse", path);
- REGISTER_NAMED_NODE( mouse, buf);
-
- ph = find_dev(buf);
-
- set_property(ph, "device_type", "mouse", 6);
- props[0] = __cpu_to_be32(dev->addr);
- set_property(ph, "reg", (char *)&props, sizeof(props));
- set_int_property(ph, "#buttons", 3);
-
- aliases = find_dev("/aliases");
- set_property(aliases, "adb-mouse", buf, strlen(buf) + 1);
-}
-
-
-int adb_cmd (adb_dev_t *dev, uint8_t cmd, uint8_t reg,
- uint8_t *buf, int len)
-{
- uint8_t adb_send[ADB_BUF_SIZE], adb_rcv[ADB_BUF_SIZE];
-
- //ADB_DPRINTF("cmd: %d reg: %d len: %d\n", cmd, reg, len);
- if (dev->bus == NULL || dev->bus->req == NULL) {
- ADB_DPRINTF("ERROR: invalid bus !\n");
- for (;;);
- }
- /* Sanity checks */
- if (cmd != ADB_LISTEN && len != 0) {
- /* No buffer transmitted but for LISTEN command */
- ADB_DPRINTF("in buffer for cmd %d\n", cmd);
- return -1;
- }
- if (cmd == ADB_LISTEN && ((len < 2 || len > 8) || buf == NULL)) {
- /* Need a buffer with a regular register size for LISTEN command */
- ADB_DPRINTF("no/invalid buffer for ADB_LISTEN (%d)\n", len);
- return -1;
- }
- if ((cmd == ADB_TALK || cmd == ADB_LISTEN) && reg > 3) {
- /* Need a valid register number for LISTEN and TALK commands */
- ADB_DPRINTF("invalid reg for TALK/LISTEN command (%d %d)\n", cmd, reg);
- return -1;
- }
- switch (cmd) {
- case ADB_SEND_RESET:
- adb_send[0] = ADB_SEND_RESET;
- break;
- case ADB_FLUSH:
- adb_send[0] = (dev->addr << 4) | ADB_FLUSH;
- break;
- case ADB_LISTEN:
- memcpy(adb_send + 1, buf, len);
- /* No break here */
- case ADB_TALK:
- adb_send[0] = (dev->addr << 4) | cmd | reg;
- break;
- }
- memset(adb_rcv, 0, ADB_BUF_SIZE);
- len = (*dev->bus->req)(dev->bus->host, adb_send, len + 1, adb_rcv);
-#ifdef DEBUG_ADB
- //printk("%x %x %x %x\n", adb_rcv[0], adb_rcv[1], adb_rcv[2], adb_rcv[3]);
-#endif
- switch (len) {
- case 0:
- /* No data */
- break;
- case 2 ... 8:
- /* Register transmitted */
- if (buf != NULL)
- memcpy(buf, adb_rcv, len);
- break;
- default:
- /* Should never happen */
- //ADB_DPRINTF("Cmd %d returned %d bytes !\n", cmd, len);
- return -1;
- }
- //ADB_DPRINTF("retlen: %d\n", len);
-
- return len;
-}
Deleted: openbios-devel/drivers/adb.h
===================================================================
--- openbios-devel/drivers/adb.h 2009-01-04 19:25:41 UTC (rev 349)
+++ openbios-devel/drivers/adb.h 2009-01-04 20:39:50 UTC (rev 350)
@@ -1,106 +0,0 @@
-/*
- * ADB bus definitions for Open Hack'Ware
- *
- * Copyright (c) 2004-2005 Jocelyn Mayer
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License V2
- * as published by the Free Software Foundation
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
- */
-
-#if !defined(__OHW_ADB_H__)
-#define __OHW_ADB_H__
-
-typedef struct adb_bus_t adb_bus_t;
-typedef struct adb_dev_t adb_dev_t;
-
-#define ADB_BUF_SIZE 8
-struct adb_bus_t {
- void *host;
- int (*req)(void *host, const uint8_t *snd_buf, int len, uint8_t *rcv_buf);
- adb_dev_t *devices;
-};
-
-struct adb_dev_t {
- adb_dev_t *next;
- adb_bus_t *bus;
- uint8_t addr;
- uint8_t type;
- uint32_t state;
-};
-
-#define ADB_BUF_SIZE 8
-
-/* ADB commands */
-enum {
- ADB_SEND_RESET = 0x00,
- ADB_FLUSH = 0x01,
- ADB_LISTEN = 0x08,
- ADB_TALK = 0x0C,
-};
-/* ADB default IDs before relocation */
-enum {
- ADB_PROTECT = 0x01,
- ADB_KEYBD = 0x02,
- ADB_MOUSE = 0x03,
- ADB_ABS = 0x04,
- ADB_MODEM = 0x05,
- ADB_RES = 0x06,
- ADB_MISC = 0x07,
-};
-/* ADB special device handlers IDs */
-enum {
- ADB_CHADDR = 0x00,
- ADB_CHADDR_ACTIV = 0xFD,
- ADB_CHADDR_NOCOLL = 0xFE,
- ADB_SELF_TEST = 0xFF,
-};
-
-int adb_cmd (adb_dev_t *dev, uint8_t cmd, uint8_t reg,
- uint8_t *buf, int len);
-void adb_bus_reset (adb_bus_t *bus);
-adb_bus_t *adb_bus_new (void *host,
- int (*req)(void *host, const uint8_t *snd_buf,
- int len, uint8_t *rcv_buf));
-int adb_bus_init (char *path, adb_bus_t *bus);
-
-static inline int adb_reset (adb_bus_t *bus)
-{
- adb_dev_t fake_device;
-
- memset(&fake_device, 0, sizeof(adb_dev_t));
- fake_device.bus = bus;
-
- return adb_cmd(&fake_device, ADB_SEND_RESET, 0, NULL, 0);
-}
-
-static inline int adb_flush (adb_dev_t *dev)
-{
- return adb_cmd(dev, ADB_FLUSH, 0, NULL, 0);
-}
-
-static inline int adb_reg_get (adb_dev_t *dev, uint8_t reg, uint8_t *buf)
-{
- return adb_cmd(dev, ADB_TALK, reg, buf, 0);
-}
-
-static inline int adb_reg_set (adb_dev_t *dev, uint8_t reg,
- uint8_t *buf, int len)
-{
- return adb_cmd(dev, ADB_LISTEN, reg, buf, len);
-}
-
-void *adb_kbd_new (char *path, void *private);
-
-void adb_mouse_new (char *path, void *private);
-
-#endif /* !defined(__OHW_ADB_H__) */
Added: openbios-devel/drivers/adb_bus.c
===================================================================
--- openbios-devel/drivers/adb_bus.c (rev 0)
+++ openbios-devel/drivers/adb_bus.c 2009-01-04 20:39:50 UTC (rev 350)
@@ -0,0 +1,257 @@
+/*
+ *
+ * Open Hack'Ware BIOS ADB bus support, ported to OpenBIOS
+ *
+ * Copyright (c) 2005 Jocelyn Mayer
+ * Copyright (c) 2005 Stefan Reinauer
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License V2
+ * as published by the Free Software Foundation
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
+ */
+
+#include "openbios/config.h"
+#include "openbios/bindings.h"
+#include "libc/vsprintf.h"
+
+#include "adb_bus.h"
+#include "adb_kbd.h"
+#include "adb_mouse.h"
+
+DECLARE_UNNAMED_NODE( adb, INSTALL_OPEN, sizeof(int));
+
+static void
+adb_initialize (int *idx)
+{
+ phandle_t ph=get_cur_dev();
+
+ push_str("adb");
+ fword("device-type");
+
+ set_property(ph, "compatible", "adb", 4);
+ set_int_property(ph, "#address-cells", 1);
+ set_int_property(ph, "#size-cells", 0);
+}
+
+static void
+adb_open(int *idx)
+{
+ RET(-1);
+}
+
+static void
+adb_close(int *idx)
+{
+}
+
+NODE_METHODS( adb ) = {
+ { NULL, adb_initialize },
+ { "open", adb_open },
+ { "close", adb_close },
+};
+
+adb_bus_t *adb_bus_new (void *host,
+ int (*req)(void *host, const uint8_t *snd_buf,
+ int len, uint8_t *rcv_buf))
+{
+ adb_bus_t *new;
+
+ new = malloc(sizeof(adb_bus_t));
+ if (new == NULL)
+ return NULL;
+ new->host = host;
+ new->req = req;
+
+ return new;
+}
+
+/* Check and relocate all ADB devices as suggested in
+ * ADB_manager Apple documentation
+ */
+
+int adb_bus_init (char *path, adb_bus_t *bus)
+{
+ char buf[64];
+ uint8_t buffer[ADB_BUF_SIZE];
+ uint8_t adb_addresses[16] =
+ { 8, 9, 10, 11, 12, 13, 14, -1, -1, -1, -1, -1, -1, -1, 0, };
+ adb_dev_t tmp_device, **cur;
+ int address;
+ int reloc = 0, next_free = 7;
+ int keep;
+
+ snprintf(buf, sizeof(buf), "%s/adb", path);
+ REGISTER_NAMED_NODE( adb, buf);
+ /* Reset the bus */
+ // ADB_DPRINTF("\n");
+ adb_reset(bus);
+ cur = &bus->devices;
+ memset(&tmp_device, 0, sizeof(adb_dev_t));
+ tmp_device.bus = bus;
+ for (address = 1; address < 8 && adb_addresses[reloc] > 0;) {
+ if (address == ADB_RES) {
+ /* Reserved */
+ address++;
+ continue;
+ }
+ //ADB_DPRINTF("Check device on ADB address %d\n", address);
+ tmp_device.addr = address;
+ switch (adb_reg_get(&tmp_device, 3, buffer)) {
+ case 0:
+ //ADB_DPRINTF("No device on ADB address %d\n", address);
+ /* Register this address as free */
+ if (adb_addresses[next_free] != 0)
+ adb_addresses[next_free++] = address;
+ /* Check next ADB address */
+ address++;
+ break;
+ case 2:
+ /* One device answered :
+ * make it available and relocate it to a free address
+ */
+ if (buffer[0] == ADB_CHADDR) {
+ /* device self test failed */
+ ADB_DPRINTF("device on ADB address %d self-test failed "
+ "%02x %02x %02x\n", address,
+ buffer[0], buffer[1], buffer[2]);
+ keep = 0;
+ } else {
+ //ADB_DPRINTF("device on ADB address %d self-test OK\n",
+ // address);
+ keep = 1;
+ }
+ ADB_DPRINTF("Relocate device on ADB address %d to %d (%d)\n",
+ address, adb_addresses[reloc], reloc);
+ buffer[0] = ((buffer[0] & 0x40) & ~0x90) | adb_addresses[reloc];
+ if (keep == 1)
+ buffer[0] |= 0x20;
+ buffer[1] = ADB_CHADDR_NOCOLL;
+ if (adb_reg_set(&tmp_device, 3, buffer, 2) < 0) {
+ ADB_DPRINTF("ADB device relocation failed\n");
+ return -1;
+ }
+ if (keep == 1) {
+ *cur = malloc(sizeof(adb_dev_t));
+ if (*cur == NULL) {
+ return -1;
+ }
+ (*cur)->type = address;
+ (*cur)->bus = bus;
+ (*cur)->addr = adb_addresses[reloc++];
+ /* Flush buffers */
+ adb_flush(*cur);
+ switch ((*cur)->type) {
+ case ADB_PROTECT:
+ ADB_DPRINTF("Found one protected device\n");
+ break;
+ case ADB_KEYBD:
+ ADB_DPRINTF("Found one keyboard on address %d\n", address);
+ adb_kbd_new(buf, *cur);
+ break;
+ case ADB_MOUSE:
+ ADB_DPRINTF("Found one mouse on address %d\n", address);
+ adb_mouse_new(buf, *cur);
+ break;
+ case ADB_ABS:
+ ADB_DPRINTF("Found one absolute positioning device\n");
+ break;
+ case ADB_MODEM:
+ ADB_DPRINTF("Found one modem\n");
+ break;
+ case ADB_RES:
+ ADB_DPRINTF("Found one ADB res device\n");
+ break;
+ case ADB_MISC:
+ ADB_DPRINTF("Found one ADB misc device\n");
+ break;
+ }
+ cur = &((*cur)->next);
+ }
+ break;
+ case 1:
+ case 3 ... 7:
+ /* SHOULD NOT HAPPEN : register 3 is always two bytes long */
+ ADB_DPRINTF("Invalid returned len for ADB register 3\n");
+ return -1;
+ case -1:
+ /* ADB ERROR */
+ ADB_DPRINTF("error gettting ADB register 3\n");
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+int adb_cmd (adb_dev_t *dev, uint8_t cmd, uint8_t reg,
+ uint8_t *buf, int len)
+{
+ uint8_t adb_send[ADB_BUF_SIZE], adb_rcv[ADB_BUF_SIZE];
+
+ //ADB_DPRINTF("cmd: %d reg: %d len: %d\n", cmd, reg, len);
+ if (dev->bus == NULL || dev->bus->req == NULL) {
+ ADB_DPRINTF("ERROR: invalid bus !\n");
+ for (;;);
+ }
+ /* Sanity checks */
+ if (cmd != ADB_LISTEN && len != 0) {
+ /* No buffer transmitted but for LISTEN command */
+ ADB_DPRINTF("in buffer for cmd %d\n", cmd);
+ return -1;
+ }
+ if (cmd == ADB_LISTEN && ((len < 2 || len > 8) || buf == NULL)) {
+ /* Need a buffer with a regular register size for LISTEN command */
+ ADB_DPRINTF("no/invalid buffer for ADB_LISTEN (%d)\n", len);
+ return -1;
+ }
+ if ((cmd == ADB_TALK || cmd == ADB_LISTEN) && reg > 3) {
+ /* Need a valid register number for LISTEN and TALK commands */
+ ADB_DPRINTF("invalid reg for TALK/LISTEN command (%d %d)\n", cmd, reg);
+ return -1;
+ }
+ switch (cmd) {
+ case ADB_SEND_RESET:
+ adb_send[0] = ADB_SEND_RESET;
+ break;
+ case ADB_FLUSH:
+ adb_send[0] = (dev->addr << 4) | ADB_FLUSH;
+ break;
+ case ADB_LISTEN:
+ memcpy(adb_send + 1, buf, len);
+ /* No break here */
+ case ADB_TALK:
+ adb_send[0] = (dev->addr << 4) | cmd | reg;
+ break;
+ }
+ memset(adb_rcv, 0, ADB_BUF_SIZE);
+ len = (*dev->bus->req)(dev->bus->host, adb_send, len + 1, adb_rcv);
+#ifdef DEBUG_ADB
+ //printk("%x %x %x %x\n", adb_rcv[0], adb_rcv[1], adb_rcv[2], adb_rcv[3]);
+#endif
+ switch (len) {
+ case 0:
+ /* No data */
+ break;
+ case 2 ... 8:
+ /* Register transmitted */
+ if (buf != NULL)
+ memcpy(buf, adb_rcv, len);
+ break;
+ default:
+ /* Should never happen */
+ //ADB_DPRINTF("Cmd %d returned %d bytes !\n", cmd, len);
+ return -1;
+ }
+ //ADB_DPRINTF("retlen: %d\n", len);
+
+ return len;
+}
Added: openbios-devel/drivers/adb_bus.h
===================================================================
--- openbios-devel/drivers/adb_bus.h (rev 0)
+++ openbios-devel/drivers/adb_bus.h 2009-01-04 20:39:50 UTC (rev 350)
@@ -0,0 +1,104 @@
+/*
+ * ADB bus definitions for Open Hack'Ware
+ *
+ * Copyright (c) 2004-2005 Jocelyn Mayer
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License V2
+ * as published by the Free Software Foundation
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
+ */
+
+typedef struct adb_bus_t adb_bus_t;
+typedef struct adb_dev_t adb_dev_t;
+
+#define ADB_BUF_SIZE 8
+struct adb_bus_t {
+ void *host;
+ int (*req)(void *host, const uint8_t *snd_buf, int len, uint8_t *rcv_buf);
+ adb_dev_t *devices;
+};
+
+struct adb_dev_t {
+ adb_dev_t *next;
+ adb_bus_t *bus;
+ uint8_t addr;
+ uint8_t type;
+ uint32_t state;
+};
+
+#define ADB_BUF_SIZE 8
+
+/* ADB commands */
+enum {
+ ADB_SEND_RESET = 0x00,
+ ADB_FLUSH = 0x01,
+ ADB_LISTEN = 0x08,
+ ADB_TALK = 0x0C,
+};
+/* ADB default IDs before relocation */
+enum {
+ ADB_PROTECT = 0x01,
+ ADB_KEYBD = 0x02,
+ ADB_MOUSE = 0x03,
+ ADB_ABS = 0x04,
+ ADB_MODEM = 0x05,
+ ADB_RES = 0x06,
+ ADB_MISC = 0x07,
+};
+/* ADB special device handlers IDs */
+enum {
+ ADB_CHADDR = 0x00,
+ ADB_CHADDR_ACTIV = 0xFD,
+ ADB_CHADDR_NOCOLL = 0xFE,
+ ADB_SELF_TEST = 0xFF,
+};
+
+int adb_cmd (adb_dev_t *dev, uint8_t cmd, uint8_t reg,
+ uint8_t *buf, int len);
+void adb_bus_reset (adb_bus_t *bus);
+adb_bus_t *adb_bus_new (void *host,
+ int (*req)(void *host, const uint8_t *snd_buf,
+ int len, uint8_t *rcv_buf));
+int adb_bus_init (char *path, adb_bus_t *bus);
+
+static inline int adb_reset (adb_bus_t *bus)
+{
+ adb_dev_t fake_device;
+
+ memset(&fake_device, 0, sizeof(adb_dev_t));
+ fake_device.bus = bus;
+
+ return adb_cmd(&fake_device, ADB_SEND_RESET, 0, NULL, 0);
+}
+
+static inline int adb_flush (adb_dev_t *dev)
+{
+ return adb_cmd(dev, ADB_FLUSH, 0, NULL, 0);
+}
+
+static inline int adb_reg_get (adb_dev_t *dev, uint8_t reg, uint8_t *buf)
+{
+ return adb_cmd(dev, ADB_TALK, reg, buf, 0);
+}
+
+static inline int adb_reg_set (adb_dev_t *dev, uint8_t reg,
+ uint8_t *buf, int len)
+{
+ return adb_cmd(dev, ADB_LISTEN, reg, buf, len);
+}
+
+#ifdef DEBUG_ADB
+#define ADB_DPRINTF(fmt, args...) \
+do { printk("ADB - %s: " fmt, __func__ , ##args); } while (0)
+#else
+#define ADB_DPRINTF(fmt, args...) do { } while (0)
+#endif
Added: openbios-devel/drivers/adb_kbd.c
===================================================================
--- openbios-devel/drivers/adb_kbd.c (rev 0)
+++ openbios-devel/drivers/adb_kbd.c 2009-01-04 20:39:50 UTC (rev 350)
@@ -0,0 +1,516 @@
+/*
+ *
+ * Open Hack'Ware BIOS ADB keyboard support, ported to OpenBIOS
+ *
+ * Copyright (c) 2005 Jocelyn Mayer
+ * Copyright (c) 2005 Stefan Reinauer
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License V2
+ * as published by the Free Software Foundation
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
+ */
+
+#include "openbios/config.h"
+#include "openbios/bindings.h"
+#include "libc/byteorder.h"
+#include "libc/vsprintf.h"
+#include "kbd.h"
+
+#include "adb_bus.h"
+#include "adb_kbd.h"
+
+DECLARE_UNNAMED_NODE( keyboard, INSTALL_OPEN, sizeof(int));
+
+static void
+keyboard_open(int *idx)
+{
+ RET(-1);
+}
+
+static void
+keyboard_close(int *idx)
+{
+}
+
+static void keyboard_read(void);
+
+NODE_METHODS( keyboard ) = {
+ { "open", keyboard_open },
+ { "close", keyboard_close },
+ { "read", keyboard_read },
+};
+
+/* ADB US keyboard translation map
+ * XXX: for now, only shift modifier is defined
+ */
+
+
+static const keymap_t ADB_kbd_us[] = {
+ /* 0x00 */
+ { KBD_SH_CAPS, { 0x61, 0x41, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x73, 0x53, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x64, 0x44, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x66, 0x46, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x68, 0x48, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x67, 0x47, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x7A, 0x5A, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x78, 0x58, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ /* 0x08 */
+ { KBD_SH_CAPS, { 0x63, 0x43, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x76, 0x56, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x60, 0x40, -1, -1, -1, -1, -1, -1, /* ? */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x62, 0x42, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x71, 0x51, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x77, 0x57, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x65, 0x45, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x72, 0x52, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ /* 0x10 */
+ { KBD_SH_CAPS, { 0x79, 0x59, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x74, 0x54, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x31, 0x21, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x32, 0x40, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x33, 0x23, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x34, 0x24, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x36, 0x5E, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x35, 0x25, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ /* 0x18 */
+ { KBD_SH_CAPS, { 0x3D, 0x2B, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x39, 0x28, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x37, 0x26, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x2D, 0x5F, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x38, 0x2A, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x30, 0x29, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x5D, 0x7D, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x6F, 0x4F, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ /* 0x20 */
+ { KBD_SH_CAPS, { 0x75, 0x55, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x5B, 0x7B, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x69, 0x49, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x70, 0x50, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_MOD_MAP(0x0D), },
+ { KBD_SH_CAPS, { 0x6C, 0x4C, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x6A, 0x4A, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x27, 0x22, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ /* 0x28 */
+ { KBD_SH_CAPS, { 0x6B, 0x4B, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x3B, 0x3A, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x5C, 0x7C, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x2C, 0x3C, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x2F, 0x3F, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x6E, 0x4E, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x6D, 0x4D, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_CAPS, { 0x2E, 0x3E, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ /* 0x30 : tab */
+ { KBD_MOD_MAP(0x09), },
+ /* 0x31 : space */
+ { KBD_MOD_MAP(0x20), },
+ /* 0x32 : '<' '>' */
+ { KBD_SH_CAPS, { 0x3C, 0x3E, -1, -1, -1, -1, -1, -1, /* ? */
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ /* 0x33 : backspace */
+ { KBD_MOD_MAP(0x08), },
+ { KBD_MAP_NONE, },
+ /* 0x35 : ESC */
+ { KBD_MOD_MAP(0x1B), },
+ /* 0x36 : control */
+ { KBD_MOD_MAP_LCTRL, },
+ /* 0x37 : command */
+ { KBD_MOD_MAP_LCMD, },
+ /* 0x38 : left shift */
+ { KBD_MOD_MAP_LSHIFT, },
+ /* 0x39 : caps-lock */
+ { KBD_MOD_MAP_CAPS, },
+ /* 0x3A : option */
+ { KBD_MOD_MAP_LOPT, },
+ /* 0x3B : left */
+ { KBD_MAP_NONE, },
+ /* 0x3C : right */
+ { KBD_MAP_NONE, },
+ /* 0x3D : down */
+ { KBD_MAP_NONE, },
+ /* 0x3E : up */
+ { KBD_MAP_NONE, },
+ { KBD_MAP_NONE, },
+ /* 0x40 */
+ { KBD_MAP_NONE, },
+ { KBD_SH_NUML, { 0x7F, 0x2E, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_MAP_NONE, },
+ { KBD_SH_NONE, { 0x2A, 0x2A, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_MAP_NONE, },
+ { KBD_SH_NONE, { 0x2B, 0x2B, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_MAP_NONE, },
+ { KBD_MOD_MAP(0x7F), },
+ /* 0x48 */
+ { KBD_MAP_NONE, },
+ { KBD_MAP_NONE, },
+ { KBD_MAP_NONE, },
+ { KBD_SH_NONE, { 0x2F, 0x2F, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_MOD_MAP(0x0D), },
+ { KBD_MAP_NONE, },
+ { KBD_SH_NONE, { 0x2D, 0x2D, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_MAP_NONE, },
+ /* 0x50 */
+ { KBD_MAP_NONE, },
+ { KBD_SH_NONE, { 0x3D, 0x3D, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_NUML, { -1, 0x30, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_NUML, { -1, 0x31, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_NUML, { -1, 0x32, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_NUML, { -1, 0x33, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_NUML, { -1, 0x34, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_NUML, { -1, 0x35, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ /* 0x58 */
+ { KBD_SH_NUML, { -1, 0x36, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_NUML, { -1, 0x37, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_MAP_NONE, },
+ { KBD_SH_NUML, { -1, 0x38, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_SH_NUML, { -1, 0x39, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1, -1, -1, }, },
+ { KBD_MAP_NONE, },
+ { KBD_MOD_MAP(0x2F), },
+ { KBD_MAP_NONE, },
+ /* 0x60 : F5 */
+ { KBD_MAP_NONE, },
+ /* 0x61 : F6 */
+ { KBD_MAP_NONE, },
+ /* 0x62 : F7 */
+ { KBD_MAP_NONE, },
+ /* 0x63 : F3 */
+ { KBD_MAP_NONE, },
+ /* 0x64 : F8 */
+ { KBD_MAP_NONE, },
+ /* 0x65 : F9 */
+ { KBD_MAP_NONE, },
+ { KBD_MAP_NONE, },
+ /* 0x67 : F11 */
+ { KBD_MAP_NONE, },
+ /* 0x68 */
+ { KBD_MAP_NONE, },
+ /* 0x69 : F13 */
+ { KBD_MAP_NONE, },
+ { KBD_MAP_NONE, },
+ /* 0x6B : F14 */
+ { KBD_MAP_NONE, },
+ { KBD_MAP_NONE, },
+ /* 0x6D : F10 */
+ { KBD_MAP_NONE, },
+ { KBD_MAP_NONE, },
+ /* 0x6F : F12 */
+ { KBD_MAP_NONE, },
+ /* 0x70 */
+ { KBD_MAP_NONE, },
+ /* 0x71 : F15 */
+ { KBD_MAP_NONE, },
+ /* 0x72 : help */
+ { KBD_MAP_NONE, },
+ /* 0x73 : home */
+ { KBD_MAP_NONE, },
+ /* 0x74 : page up */
+ { KBD_MAP_NONE, },
+ /* 0x75 : del */
+ { KBD_MAP_NONE, },
+ /* 0x76 : F4 */
+ { KBD_MAP_NONE, },
+ /* 0x77 : end */
+ { KBD_MAP_NONE, },
+ /* 0x78 : F2 */
+ { KBD_MAP_NONE, },
+ /* 0x79 : page down */
+ { KBD_MAP_NONE, },
+ /* 0x7A : F1 */
+ { KBD_MAP_NONE, },
+ /* 0x7B : right shift */
+ { KBD_MOD_MAP_RSHIFT, },
+ /* 0x7C : right option */
+ { KBD_MOD_MAP_ROPT, },
+ /* 0x7D : right control */
+ { KBD_MOD_MAP_RCTRL, },
+ { KBD_MAP_NONE, },
+ /* 0x7F : power */
+ { KBD_MAP_NONE, },
+};
+
+typedef struct adb_kbd_t adb_kbd_t;
+struct adb_kbd_t {
+ kbd_t kbd;
+ int next_key;
+};
+
+static adb_dev_t *my_adb_dev = NULL;
+
+static int adb_kbd_read (void *private)
+{
+ uint8_t buffer[ADB_BUF_SIZE];
+ adb_dev_t *dev = private;
+ adb_kbd_t *kbd;
+ int key;
+ int ret;
+
+ kbd = (void *)dev->state;
+ /* Get saved state */
+ ret = -1;
+ for (key = -1; key == -1; ) {
+ if (kbd->next_key != -1) {
+ key = kbd->next_key;
+ kbd->next_key = -1;
+ } else {
+ if (adb_reg_get(dev, 0, buffer) != 2)
+ break;
+ kbd->next_key = buffer[1] == 0xFF ? -1 : buffer[1];
+ key = buffer[0];
+ }
+ ret = kbd_translate_key(&kbd->kbd, key & 0x7F, key >> 7);
+ ADB_DPRINTF("Translated %d (%02x) into %d (%02x)\n",
+ key, key, ret, ret);
+ }
+
+ return ret;
+}
+
+
+void *adb_kbd_new (char *path, void *private)
+{
+ char buf[64];
+ int props[1];
+ phandle_t ph, aliases;
+ adb_kbd_t *kbd;
+ adb_dev_t *dev = private;
+ kbd = (adb_kbd_t*)malloc(sizeof(adb_kbd_t));
+ if (kbd != NULL) {
+ memset(kbd, 0, sizeof(adb_kbd_t));
+ kbd_set_keymap(&kbd->kbd, sizeof(ADB_kbd_us) / sizeof(keymap_t),
+ ADB_kbd_us);
+ kbd->next_key = -1;
+ dev->state = (int32_t)kbd;
+ my_adb_dev = dev;
+ }
+
+ snprintf(buf, sizeof(buf), "%s/keyboard", path);
+ REGISTER_NAMED_NODE( keyboard, buf);
+
+ ph = find_dev(buf);
+
+ set_property(ph, "device_type", "keyboard", 9);
+ props[0] = __cpu_to_be32(dev->addr);
+ set_property(ph, "reg", (char *)&props, sizeof(props));
+
+ aliases = find_dev("/aliases");
+ set_property(aliases, "adb-keyboard", buf, strlen(buf) + 1);
+
+ return kbd;
+}
+
+/* ( addr len -- actual ) */
+static void keyboard_read(void)
+{
+ char *addr;
+ int len, key, i;
+ len=POP();
+ addr=(char *)POP();
+
+ for (i = 0; i < len; i++) {
+ key = adb_kbd_read(my_adb_dev);
+ if (key == -1 || key == -2)
+ break;
+ *addr++ = (char)key;
+ }
+ PUSH(i);
+}
Added: openbios-devel/drivers/adb_kbd.h
===================================================================
--- openbios-devel/drivers/adb_kbd.h (rev 0)
+++ openbios-devel/drivers/adb_kbd.h 2009-01-04 20:39:50 UTC (rev 350)
@@ -0,0 +1,22 @@
+/*
+ *
+ * Open Hack'Ware BIOS ADB keyboard support, ported to OpenBIOS
+ *
+ * Copyright (c) 2005 Jocelyn Mayer
+ * Copyright (c) 2005 Stefan Reinauer
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License V2
+ * as published by the Free Software Foundation
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
+ */
+
+void *adb_kbd_new (char *path, void *private);
Added: openbios-devel/drivers/adb_mouse.c
===================================================================
--- openbios-devel/drivers/adb_mouse.c (rev 0)
+++ openbios-devel/drivers/adb_mouse.c 2009-01-04 20:39:50 UTC (rev 350)
@@ -0,0 +1,67 @@
+/*
+ *
+ * Open Hack'Ware BIOS ADB mouse support, ported to OpenBIOS
+ *
+ * Copyright (c) 2005 Jocelyn Mayer
+ * Copyright (c) 2005 Stefan Reinauer
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License V2
+ * as published by the Free Software Foundation
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
+ */
+
+#include "openbios/config.h"
+#include "openbios/bindings.h"
+#include "libc/byteorder.h"
+#include "libc/vsprintf.h"
+
+#include "adb_bus.h"
+#include "adb_mouse.h"
+
+DECLARE_UNNAMED_NODE( mouse, INSTALL_OPEN, sizeof(int));
+
+static void
+mouse_open(int *idx)
+{
+ RET(-1);
+}
+
+static void
+mouse_close(int *idx)
+{
+}
+
+NODE_METHODS( mouse ) = {
+ { "open", mouse_open },
+ { "close", mouse_close },
+};
+
+void adb_mouse_new (char *path, void *private)
+{
+ char buf[64];
+ int props[1];
+ phandle_t ph, aliases;
+ adb_dev_t *dev = private;
+
+ snprintf(buf, sizeof(buf), "%s/mouse", path);
+ REGISTER_NAMED_NODE( mouse, buf);
+
+ ph = find_dev(buf);
+
+ set_property(ph, "device_type", "mouse", 6);
+ props[0] = __cpu_to_be32(dev->addr);
+ set_property(ph, "reg", (char *)&props, sizeof(props));
+ set_int_property(ph, "#buttons", 3);
+
+ aliases = find_dev("/aliases");
+ set_property(aliases, "adb-mouse", buf, strlen(buf) + 1);
+}
Added: openbios-devel/drivers/adb_mouse.h
===================================================================
--- openbios-devel/drivers/adb_mouse.h (rev 0)
+++ openbios-devel/drivers/adb_mouse.h 2009-01-04 20:39:50 UTC (rev 350)
@@ -0,0 +1,22 @@
+/*
+ *
+ * Open Hack'Ware BIOS ADB mouse support, ported to OpenBIOS
+ *
+ * Copyright (c) 2005 Jocelyn Mayer
+ * Copyright (c) 2005 Stefan Reinauer
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License V2
+ * as published by the Free Software Foundation
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA, 02110-1301 USA
+ */
+
+void adb_mouse_new (char *path, void *private);
Modified: openbios-devel/drivers/build.xml
===================================================================
--- openbios-devel/drivers/build.xml 2009-01-04 19:25:41 UTC (rev 349)
+++ openbios-devel/drivers/build.xml 2009-01-04 20:39:50 UTC (rev 350)
@@ -6,7 +6,9 @@
<object source="ide.c" condition="DRIVER_IDE"/>
<object source="timer.c" condition="DRIVER_IDE"/>
<object source="kbd.c" condition="DRIVER_ADB"/>
- <object source="adb.c" condition="DRIVER_ADB"/>
+ <object source="adb_bus.c" condition="DRIVER_ADB"/>
+ <object source="adb_kbd.c" condition="DRIVER_ADB"/>
+ <object source="adb_mouse.c" condition="DRIVER_ADB"/>
<object source="cuda.c" condition="DRIVER_ADB"/>
<object source="floppy.c" condition="DRIVER_FLOPPY"/>
<object source="iommu.c" condition="DRIVER_SBUS"/>
Modified: openbios-devel/drivers/cuda.c
===================================================================
--- openbios-devel/drivers/cuda.c 2009-01-04 19:25:41 UTC (rev 349)
+++ openbios-devel/drivers/cuda.c 2009-01-04 20:39:50 UTC (rev 350)
@@ -3,9 +3,6 @@
#include "libc/byteorder.h"
#include "libc/vsprintf.h"
-#include "adb.h"
-
-
#include "cuda.h"
//#define DEBUG_CUDA
#ifdef DEBUG_CUDA
@@ -14,7 +11,6 @@
#else
#define CUDA_DPRINTF(fmt, args...) do { } while (0)
#endif
-#define ADB_DPRINTF CUDA_DPRINTF
#define IO_CUDA_OFFSET 0x00016000
#define IO_CUDA_SIZE 0x00002000
@@ -305,170 +301,3 @@
return cuda;
}
-
-#ifdef CONFIG_DRIVER_ADB
-
-DECLARE_UNNAMED_NODE( adb, INSTALL_OPEN, sizeof(int));
-
-static void
-adb_initialize (int *idx)
-{
- phandle_t ph=get_cur_dev();
-
- push_str("adb");
- fword("device-type");
-
- set_property(ph, "compatible", "adb", 4);
- set_int_property(ph, "#address-cells", 1);
- set_int_property(ph, "#size-cells", 0);
-}
-
-static void
-adb_open(int *idx)
-{
- RET(-1);
-}
-
-static void
-adb_close(int *idx)
-{
-}
-
-NODE_METHODS( adb ) = {
- { NULL, adb_initialize },
- { "open", adb_open },
- { "close", adb_close },
-};
-
-adb_bus_t *adb_bus_new (void *host,
- int (*req)(void *host, const uint8_t *snd_buf,
- int len, uint8_t *rcv_buf))
-{
- adb_bus_t *new;
-
- new = malloc(sizeof(adb_bus_t));
- if (new == NULL)
- return NULL;
- new->host = host;
- new->req = req;
-
- return new;
-}
-
-/* Check and relocate all ADB devices as suggested in
- * * ADB_manager Apple documentation
- * */
-int adb_bus_init (char *path, adb_bus_t *bus)
-{
- char buf[64];
- uint8_t buffer[ADB_BUF_SIZE];
- uint8_t adb_addresses[16] =
- { 8, 9, 10, 11, 12, 13, 14, -1, -1, -1, -1, -1, -1, -1, 0, };
- adb_dev_t tmp_device, **cur;
- int address;
- int reloc = 0, next_free = 7;
- int keep;
-
- snprintf(buf, sizeof(buf), "%s/adb", path);
- REGISTER_NAMED_NODE( adb, buf);
- /* Reset the bus */
- // ADB_DPRINTF("\n");
- adb_reset(bus);
- cur = &bus->devices;
- memset(&tmp_device, 0, sizeof(adb_dev_t));
- tmp_device.bus = bus;
- for (address = 1; address < 8 && adb_addresses[reloc] > 0;) {
- if (address == ADB_RES) {
- /* Reserved */
- address++;
- continue;
- }
- //ADB_DPRINTF("Check device on ADB address %d\n", address);
- tmp_device.addr = address;
- switch (adb_reg_get(&tmp_device, 3, buffer)) {
- case 0:
- //ADB_DPRINTF("No device on ADB address %d\n", address);
- /* Register this address as free */
- if (adb_addresses[next_free] != 0)
- adb_addresses[next_free++] = address;
- /* Check next ADB address */
- address++;
- break;
- case 2:
- /* One device answered :
- * make it available and relocate it to a free address
- */
- if (buffer[0] == ADB_CHADDR) {
- /* device self test failed */
- ADB_DPRINTF("device on ADB address %d self-test failed "
- "%02x %02x %02x\n", address,
- buffer[0], buffer[1], buffer[2]);
- keep = 0;
- } else {
- //ADB_DPRINTF("device on ADB address %d self-test OK\n",
- // address);
- keep = 1;
- }
- ADB_DPRINTF("Relocate device on ADB address %d to %d (%d)\n",
- address, adb_addresses[reloc], reloc);
- buffer[0] = ((buffer[0] & 0x40) & ~0x90) | adb_addresses[reloc];
- if (keep == 1)
- buffer[0] |= 0x20;
- buffer[1] = ADB_CHADDR_NOCOLL;
- if (adb_reg_set(&tmp_device, 3, buffer, 2) < 0) {
- ADB_DPRINTF("ADB device relocation failed\n");
- return -1;
- }
- if (keep == 1) {
- *cur = malloc(sizeof(adb_dev_t));
- if (*cur == NULL) {
- return -1;
- }
- (*cur)->type = address;
- (*cur)->bus = bus;
- (*cur)->addr = adb_addresses[reloc++];
- /* Flush buffers */
- adb_flush(*cur);
- switch ((*cur)->type) {
- case ADB_PROTECT:
- ADB_DPRINTF("Found one protected device\n");
- break;
- case ADB_KEYBD:
- ADB_DPRINTF("Found one keyboard on address %d\n", address);
- adb_kbd_new(buf, *cur);
- break;
- case ADB_MOUSE:
- ADB_DPRINTF("Found one mouse on address %d\n", address);
- adb_mouse_new(buf, *cur);
- break;
- case ADB_ABS:
- ADB_DPRINTF("Found one absolute positioning device\n");
- break;
- case ADB_MODEM:
- ADB_DPRINTF("Found one modem\n");
- break;
- case ADB_RES:
- ADB_DPRINTF("Found one ADB res device\n");
- break;
- case ADB_MISC:
- ADB_DPRINTF("Found one ADB misc device\n");
- break;
- }
- cur = &((*cur)->next);
- }
- break;
- case 1:
- case 3 ... 7:
- /* SHOULD NOT HAPPEN : register 3 is always two bytes long */
- ADB_DPRINTF("Invalid returned len for ADB register 3\n");
- return -1;
- case -1:
- /* ADB ERROR */
- ADB_DPRINTF("error gettting ADB register 3\n");
- return -1;
- }
- }
-
- return 0;
-}
-#endif
Modified: openbios-devel/drivers/cuda.h
===================================================================
--- openbios-devel/drivers/cuda.h 2009-01-04 19:25:41 UTC (rev 349)
+++ openbios-devel/drivers/cuda.h 2009-01-04 20:39:50 UTC (rev 350)
@@ -1,4 +1,4 @@
-#include "adb.h"
+#include "adb_bus.h"
struct cuda_t {
uint32_t base;