lsadb-0.1.3/0000755000175000017500000000000010342342656013055 5ustar grimmgrimm00000000000000lsadb-0.1.3/Makefile0000644000175000017500000000010307427770715014522 0ustar grimmgrimm00000000000000 lsadb: lsadb.c lsadb.h gcc -Wall -O2 -o $@ $< && strip $@ lsadb-0.1.3/README0000644000175000017500000001037510342342317013735 0ustar grimmgrimm00000000000000 README ====== lsadb is a small utility to scan the devices on the ADB-Bus and print out some information about the devices found. This tool is not very usefull on computers without an ADB-Bus. That are mostly Apple Macintosh Computers. So please don't try to use this utillity on an i386 machine. LEGAL NOTICE ============ Copyright 2002-2005 Matthias Grimm (matthiasgrimm@users.sourceforge.net). This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. INSTALL ======= First of all the program has to be compiled. This is a rather simple job because it is a simple program. It needs no libraries other than the standard ones comming with a working gcc. 1. unpack the archive in an directory of your choice with following commands: tar -xvf lsadb.tgz After that you will find following files in the same directory: lsadb.c - The programm code lsadb.h - Some header information needed by lsadb.c lsadb.1 - the man page (Thanks to Viral ) Makefile - Makefile to compile the programm README - This text 2. Now type: make 3. After some seconds you will find another executable file lsadb in your directory 4. Copy the manfile lsadb.1 to /usr/local/man/man1 5. That's it. That wasn't very difficult, was it. HOW IT WORKS ============ lsadb opens the device file /dev/adb, which has to be user read/writable if you want to execute this program with normal user rights and you always should. It is bad style and sometimes a little bit dangerous to work as root. After the /dev/adb has been opened, each device on the bus is tested and every returned information with additional comments is printed in the terminal window. The output should look like something like the following, depending on your devices at the ADB-Bus. This is the output from my PowerBook G3 (Pismo): Devices connected to the ADB-Bus: (PMU: 12) D R raw data decoded data ------------------------------------------------------------------------------------- 2.3: [62 c4] Encode Device Apple Macintosh PowerBook G3 Keyboard (ISO layout) Exceptional Event enabled Service Request enabled 2: [ff ff] Qualifier: (not all must be supported) Fn-key Delete Caps-Lock Reset Control Shift Option Apple Num-Lock Scroll-Lock Scroll-Lock-LED Caps-Lock-LED Num-Lock-LED 1: [05 01] Special keys need Fn Key 0: [a4 ff] scancode0 24 released scancode1 7f released 3.3: [23 04] Relative-Position Device Extended Mouse Protokoll Exceptional Event disabled Service Request enabled 2: [08 44 03 00 00 00 00 00] 1: [74 70 61 64 01 90 03 02] Mouse type: tpad resolution: 400 dpi Device class: Trackpad buttons: 2 0: 7.3: [67 1f] Misc. Device Powerbook G3 (Pismo) Button Device Exceptional Event enabled Service Request enabled 2: 1: 0: FUTURE DEVELOPMENT ================== At the moment the program has often difficulties to identify devices by name. It is not easy to get all the nessecary information about type, name and special features. So I ask for your help to bann the text "unknown device" from this program. If you are willing to push Linux forward, please send me (to joker@cymes.de) the output of the program on your machine and a short description of the not identified devices. So I could complete the database and release new versions. I will only use the sent information for this purpose, nothing else. Thank you and enjoy Matthias Grimm lsadb-0.1.3/lsadb.10000644000175000017500000000260110342337336014222 0ustar grimmgrimm00000000000000.\" Hey, EMACS: -*- nroff -*- .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .TH LSADB 1 "November 27, 2005" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME lsadb \- A utility to scan devices on the Apple ADB bus. .SH SYNOPSIS .B lsadb [\-hv] .SH DESCRIPTION \fBlsadb\fP is a utility to scan the devices on the Apple ADB bus and to print out some information about the devices found. This makes it useful only on computers with an ADB bus. Usually, this means that it is useful only on Macintosh computers. .SH OPTIONS \fBlsadb\fP accepts the following options: .TP .B \-h, \-\-help Show summary of options. .TP .B \-v, \-\-version Show version of \fBlsadb\fP. .SH AUTHOR This manual page was written by Viral , for the Debian GNU/Linux system (but may be used by others). Lsadb was written by Matthias Grimm . lsadb-0.1.3/lsadb.c0000644000175000017500000002157310342337036014312 0ustar grimmgrimm00000000000000/* * lsadb.c * Copyright 2001-2005 by Matthias Grimm * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * * Please be so kind to send me a copy of your modifications to * Matthias Grimm * * Thanks to Jimi Xenidis for his programm fnset.c */ #include #include #include #include #include #include #include #include #include #include #include #include #include "lsadb.h" #define PMU_GET_VERSION 0xea /* get pmu firmware version # */ #define ADB_BUFSIZE 16 /* Size of the ADB buffer */ const char *prog; int ReadADBReg(int fd, unsigned char ADBBuffer[], int dev, int reg) { int n; ADBBuffer[0] = ADB_PACKET; ADBBuffer[1] = ADB_READREG(dev, reg); n = write(fd, ADBBuffer, 2); if (n != 2) { if (n == -1) fprintf(stderr, "%s: write(): %s\n", prog, strerror(errno)); else fprintf(stderr, "%s: write(): expected 2 Bytes, got %d\n", prog, n); return -1; } n = read(fd, ADBBuffer, ADB_BUFSIZE); if (n == -1) fprintf(stderr, "%s: read(): %s\n", prog, strerror(errno)); ADBBuffer[0] = n; /* replace the ADB command with data length */ return n; } int ReadPMUVer(int fd) { int n; unsigned char ADBBuffer[32]; ADBBuffer[0] = PMU_PACKET; ADBBuffer[1] = PMU_GET_VERSION; n = write(fd, ADBBuffer, 2); if (n != 2) { if (n == -1) fprintf(stderr, "%s: write(): %s\n", prog, strerror(errno)); else fprintf(stderr, "%s: write(): expected 2 Bytes, got %d\n", prog, n); return -1; } n = read(fd, ADBBuffer, sizeof(ADBBuffer)); if (n != 2) { if (n == -1) fprintf(stderr, "%s: read(): %s\n", prog, strerror(errno)); else fprintf(stderr, "%s: read(): expected 2 Bytes, got %d\n", prog, n); return -1; } return ADBBuffer[1]; } int usecsleep(int usecs) { struct timeval tv; tv.tv_sec = 0; tv.tv_usec = usecs; return select(0, NULL, NULL, NULL, &tv); } struct ADBDev *identify_device(int devtype, int devhandler) { int i; struct ADBDev *Ident = &ADBDevices[0]; for (i=1; i < sizeof(ADBDevices) / sizeof(struct ADBDev); i++) { if(ADBDevices[i].devicetype == devtype) { if(ADBDevices[i].handler_id == devhandler) return &ADBDevices[i]; else if(ADBDevices[i].handler_id == 0) Ident = &ADBDevices[i]; } } return Ident; } void PrintRAWData(unsigned char data[]) { int i, j = 8; fprintf(stdout, "["); for (i=1; i < data[0]; i++) { if (i != 1) fprintf(stdout, " "); fprintf(stdout, "%02x", data[i]); j--; } fprintf(stdout, "]"); for (; j > 0; j--) fprintf (stdout, " "); } void regx_raw(unsigned char data[]) { PrintRAWData(data); } void reg0_stdkbd(unsigned char data[]) { struct adbreg0_stdkbd *reg; reg = (struct adbreg0_stdkbd*) &data[1]; PrintRAWData(data); fprintf(stdout, " scancode0 %02x %s\n scancode1 %02x %s", reg->keycode0, reg->keyup0 ? "released" : "pressed", reg->keycode1, reg->keyup1 ? "released" : "pressed"); } void reg1_extmouse(unsigned char data[]) { int i, dc; unsigned char mousetype[5]; for(i=0 ; i<4 ; i++) mousetype[i] = data[i+1]; mousetype[4] = 0; dc = data[7]; if (dc > MAXDEVICECLASS) dc = 0; /* unknown */ else dc += 1; PrintRAWData(data); fprintf(stdout, " Mouse type: %s\n"\ " resolution: %d dpi\n"\ " Device class: %s\n"\ " buttons: %d", mousetype, data[5]*256+data[6], deviceclasses[dc], data[8]); } void reg1_pbg3kbd(unsigned char data[]) { struct adbreg1_pbg3kbd *reg; reg = (struct adbreg1_pbg3kbd*) &data[1]; PrintRAWData(data); fprintf(stdout, " %s need Fn Key", reg->primfkeys ? "Special keys" : "Function keys"); } void reg2_stdkbd(unsigned char data[]) { struct adbreg2_stdkbd *reg; reg = (struct adbreg2_stdkbd*) &data[1]; PrintRAWData(data); fprintf(stdout, " Qualifier: (not all must be supported)\n"\ " %sFn-key%s %sDelete%s %sCaps-Lock%s %sReset%s %sControl%s\n"\ " %sShift%s %sOption%s %sApple%s %sNum-Lock%s %sScroll-Lock%s\n"\ " %sScroll-Lock-LED%s %sCaps-Lock-LED%s %sNum-Lock-LED%s", reg->fnkey ? " " : "[", reg->fnkey ? " " : "]", reg->deletekey ? " " : "[", reg->deletekey ? " " : "]", reg->capslockkey ? " " : "[", reg->capslockkey ? " " : "]", reg->resetkey ? " " : "[", reg->resetkey ? " " : "]", reg->controlkey ? " " : "[", reg->controlkey ? " " : "]", reg->shiftkey ? " " : "[", reg->shiftkey ? " " : "]", reg->optionkey ? " " : "[", reg->optionkey ? " " : "]", reg->applekey ? " " : "[", reg->applekey ? " " : "]", reg->numlockkey ? " " : "[", reg->numlockkey ? " " : "]", reg->scrolllockkey ? " " : "[", reg->scrolllockkey ? " " : "]", reg->scrolllockled ? " " : "[", reg->scrolllockled ? " " : "]", reg->capslockled ? " " : "[", reg->capslockled ? " " : "]", reg->numlockled ? " " : "[", reg->numlockled ? " " : "]"); } void PrintDevID(struct ADBDev *dev, struct adbreg3 *reg, unsigned char data[]) { PrintRAWData(data); fprintf(stdout, " %s\n"\ " %s %s\n"\ " Exceptional Event %s\n"\ " Service Request %s\n", devicetypes[dev->devicetype], dev->name, kbdlayouts[dev->layout], reg->exev ? "enabled" : "disabled", reg->sre ? "enabled" : "disabled"); }; int evaluate_args(int argc, char *argv[]) { struct option const long_options[] = { {"help", no_argument, 0, ARG_HELP}, {"version", no_argument, 0, ARG_VERSION}, {NULL, 0, NULL, 0} }; char *prgname; int c; if((prgname = strrchr(argv[0],'/')) == NULL) prgname = argv[0]; else prgname++; /* ignore first slash*/ argv[0] = prgname; while ((c = getopt_long (argc, argv, ARG_ALL, long_options, (int *) 0)) != EOF) { switch (c) { case ARG_VERSION: printf("%s, version %s, (c) 2002-2005 Matthias Grimm\n", PACKAGE, VERSION); return 1; case ARG_HELP: default: printf("%s - scans the ADB bus for devices.\n", prgname); printf("Usage: %s [OPTION]\n", prgname); printf ("Options:\n" " -%c, --help display this help text and exit\n" " -%c, --version display version information and exit\n", ARG_HELP, ARG_VERSION); return 1; } } return 0; } int main(int argc, char *argv[]) { const char *adb = "/dev/adb"; unsigned char data[ADB_BUFSIZE]; struct ADBDev *DevID; struct adbreg3 *Reg03; int dev, reg, pmu; int fd; int n; if ((evaluate_args(argc, argv)) == 1) return 0; /* help text printed, we are finish here */ prog = argv[0]; /* name of programm, which was executed */ fd = open(adb, O_RDWR); if (fd < 0) { fprintf(stderr, "%s: open(%s): %s\n", prog, adb, strerror(errno)); return 1; } pmu = ReadPMUVer(fd); fprintf(stdout, "\nDevices connected to the ADB-Bus: (PMU: %d)\n\n", pmu); fprintf(stdout, " D R raw data decoded data\n"); fprintf(stdout, "-------------------------------------------------------------------------------------\n"); usecsleep(100000); /* desync with keyboard, so that no keycode was robbed */ for (dev = 1; dev < 16; dev++) { n = ReadADBReg(fd, data, dev, 3); if (n > 0) { Reg03 = (struct adbreg3*) &data[1]; /* data[0] = ADB command, we could ignore it */ DevID = identify_device(dev & 7, Reg03->devhandler); fprintf(stdout, " %2d.%d: ", dev, 3); PrintDevID(DevID, Reg03, data); for (reg=2; reg >= 0 ; reg--) { fprintf(stdout, " %d: ", reg); n = ReadADBReg(fd, data, dev, reg); if (n > 0) { switch (reg) { case 2: if (DevID->REG2_decode) (*DevID->REG2_decode)(data); break; case 1: if (DevID->REG1_decode) (*DevID->REG1_decode)(data); break; case 0: if (DevID->REG0_decode) (*DevID->REG0_decode)(data); } } fprintf(stdout, "\n"); /* close register output with linefeed */ } fprintf(stdout, "\n"); } } close(fd); return 0; } lsadb-0.1.3/lsadb.h0000644000175000017500000002457110342337102014312 0ustar grimmgrimm00000000000000/* * lsadb.h, needed by lsadb.c * Copyright 2001-2005 by Matthias Grimm * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. * * Please be so kind to send me a copy of your modifications to * Matthias Grimm * * Thanks to Jimi Xenidis for his programm fnset.c */ #define PACKAGE "lsadb" #define VERSION "0.1.3" /* short options for optarg */ #define ARG_ALL "hv" #define ARG_HELP 'h' #define ARG_VERSION 'v' void regx_raw(unsigned char data[]); void reg0_stdkbd(unsigned char data[]); void reg1_pbg3kbd(unsigned char data[]); void reg2_stdkbd(unsigned char data[]); void reg1_extmouse(unsigned char data[]); /* ------------------------ */ enum KBDLayout { none, unknown=0, domestic, iso, japanese }; /* existing keyboard layouts */ const char *kbdlayouts[] = { "", "(domestic layout)", "(ISO layout)", "(japanese layout)" }; /* Definition of one ADB device. The two first integers identify the device. There is no dynamic function to decode register 3 because this register is well defined through Apple and identically for all devices. */ struct ADBDev { int devicetype; int handler_id; char *name; enum KBDLayout layout; void (*REG0_decode)(unsigned char data[]); void (*REG1_decode)(unsigned char data[]); void (*REG2_decode)(unsigned char data[]); }; struct adbreg0_stdkbd { unsigned int keyup0:1; /* Key pressed/released */ unsigned int keycode0:7; /* Scancode */ unsigned int keyup1:1; unsigned int keycode1:7; }; struct adbreg1_pbg3kbd { unsigned int :8; /* unknown, perhaps keboard revision */ unsigned int :7; /* unknown, perhaps flags */ unsigned int primfkeys:1; /* primary function keys */ }; struct adbreg2_stdkbd { unsigned int fnkey:1; /* Fn key pressed */ unsigned int deletekey:1; /* Delete pressed */ unsigned int capslockkey:1; /* Caps Lock pressed */ unsigned int resetkey:1; /* Reset pressed */ unsigned int controlkey:1; /* Control pressed */ unsigned int shiftkey:1; /* Shift pressed */ unsigned int optionkey:1; /* Option key pressed */ unsigned int applekey:1; /* Apple/command key pressed */ unsigned int numlockkey:1; /* Num Lock presed */ unsigned int scrolllockkey:1; /* Scroll Lock pressed */ unsigned int reserved:3; unsigned int scrolllockled:1; /* Scroll Lock LED on */ unsigned int capslockled:1; /* Caps Lock LED on */ unsigned int numlockled:1; /* Num Lock LED on */ }; struct adbreg3 { unsigned int :1; /* always zero */ unsigned int exev:1; /* Exeptional Event */ unsigned int sre:1; /* Service Request Enable */ unsigned int :1; /* reserved */ unsigned int devtype:4; /* device address */ unsigned int devhandler:8; /* device handler id */ }; const char *devicetypes[] = { /* 0 */ "Computer", /* 1 */ "Protection Device", /* 2 */ "Encode Device", /* 3 */ "Relative-Position Device", /* 4 */ "Absolute-Position Device", /* 5 */ "Data Transfer Device", /* 6 */ "Reserved", /* 7 */ "Misc. Device", /* 8 */ "Couldn't investigate device type, device was shifted", /* 9 */ "Couldn't investigate device type, device was shifted", /* 10 */ "Couldn't investigate device type, device was shifted", /* 11 */ "Couldn't investigate device type, device was shifted", /* 12 */ "Couldn't investigate device type, device was shifted", /* 13 */ "Couldn't investigate device type, device was shifted", /* 14 */ "Couldn't investigate device type, device was shifted", /* 15 */ "Couldn't investigate device type, device was shifted" }; #define MAXDEVICECLASS 3 /* count of classes definitions in the following array */ const char *deviceclasses[] = { "Unknown", /* 0 */ "Tablet (absolute)", /* 1 */ "Mouse", /* 2 */ "Trackball", /* 3 */ "Trackpad" }; /* The high bit of the trackpad deviceclass is a program mode identifier. If set to 1 reg 2 contains completely different data at next read. This shadow register needs to be implemented in lsadb */ /* unsolved keyboard riddles: 1. In Apple technote hw/hw_01.html you can find the following keyboard definition: "259 Small Macintosh 512K Keyboard (no keypad; ISO layout)" This is an impossible Handler ID because there is only one Byte defined for that information. 2. Regarding the Document ADBManager from Apple support the Apple Extended Keyboard (Device ID 0x02) also the Handler ID 0x03. Switched to that ID is would send seperate Keycodes for left and right shift keys. This collides with the following description for Handler ID 0x03, found in several documents from developer.apple.com. */ #define ADB_DUMMY 0 /* supplement to definitions in adb.h */ struct ADBDev ADBDevices[] = { { ADB_DUMMY , 0, "Unknown", unknown, regx_raw, regx_raw, regx_raw }, { ADB_KEYBOARD, 1, "Apple Keyboard or Keyboard II", domestic, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 2, "Apple Extended Keyboard or Extended Keyboard II", domestic, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 3, "Small Macintosh 512K Keyboard without keypad", domestic, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 4, "Apple Standard Keyboard", iso, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 5, "Apple Extended Keyboard II", iso, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 6, "Apple Macintosh Portable Keyboard", domestic, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 7, "Apple Macintosh Portable Keyboard", iso, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 8, "Apple Macintosh Keyboard II", domestic, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 9, "Apple Macintosh Keyboard II", iso, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 11, "Macintosh Plus Keyboard with the built-in keypad", unknown, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 12, "Macintosh PowerBook Keyboard", domestic, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 13, "Macintosh PowerBook Keyboard", iso, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 14, "Apple adjustible Keypad", unknown, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 16, "Apple adjustible Keyboard", domestic, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 17, "Apple adjustible Keyboard", iso, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 18, "Apple adjustible Keyboard", japanese, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 20, "Unknown Keyboard", iso, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 21, "Unknown Keyboard", japanese, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 22, "Unknown Keyboard", japanese, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 23, "Unknown Keyboard", japanese, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 24, "Powerbook 3400 Keyboard", domestic, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 25, "Unknown Keyboard", iso, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 26, "Unknown Keyboard", japanese, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 27, "Unknown Keyboard", domestic, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 28, "Unknown Keyboard", domestic, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 29, "Unknown Keyboard", iso, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 30, "Unknown Keyboard", japanese, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 192, "Unknown Keyboard", domestic, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 193, "Unknown Keyboard", iso, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 194, "Unknown Keyboard", japanese, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 195, "Apple Macintosh Powerbook G3 Keyboard", domestic, reg0_stdkbd, reg1_pbg3kbd, reg2_stdkbd }, { ADB_KEYBOARD, 196, "Apple Macintosh PowerBook G3 Keyboard", iso, reg0_stdkbd, reg1_pbg3kbd, reg2_stdkbd }, { ADB_KEYBOARD, 197, "Unknown Keyboard", japanese, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 198, "Unknown Keyboard", domestic, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 199, "Unknown Keyboard", iso, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 200, "Unknown Keyboard", japanese, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_KEYBOARD, 201, "Unknown Keyboard", japanese, reg0_stdkbd, regx_raw, reg2_stdkbd }, { ADB_MOUSE, 1, "Standard Apple Mouse Protokoll 100 dpi", none, regx_raw, regx_raw, regx_raw }, { ADB_MOUSE, 2, "Standard Apple Mouse Protokoll 200 dpi", none, regx_raw, regx_raw, regx_raw }, { ADB_MOUSE, 4, "Extended Mouse Protokoll", none, regx_raw, reg1_extmouse,regx_raw }, { ADB_MISC, 2, "Adjustible Button Device", none, regx_raw, regx_raw, regx_raw }, { ADB_MISC, 31, "Powerbook G3 (Pismo) Button Device", none, regx_raw, regx_raw, regx_raw } };