X-Git-Url: https://git.friedersdorff.com/?a=blobdiff_plain;f=converter%2Fadb_usb%2Fmatrix.c;h=abcc0cc9c3c645615a5a72d5fb2090e1b4539dff;hb=3fe8e1c238fc8e15dacda1b03c0c1745a7b8e8e7;hp=dad71758bce9946b6f29486fae46c607eba04051;hpb=b47a88f4a5c3e054539f4113cdf13cf8d2c65545;p=max%2Ftmk_keyboard.git diff --git a/converter/adb_usb/matrix.c b/converter/adb_usb/matrix.c index dad71758..abcc0cc9 100644 --- a/converter/adb_usb/matrix.c +++ b/converter/adb_usb/matrix.c @@ -39,6 +39,7 @@ along with this program. If not, see . #endif +static bool is_iso_layout = false; static bool is_modified = false; static report_mouse_t mouse_report = {}; @@ -72,6 +73,21 @@ void matrix_init(void) adb_host_init(); // wait for keyboard to boot up and receive command _delay_ms(1000); + + // Determine ISO keyboard by handle id + // http://lxr.free-electrons.com/source/drivers/macintosh/adbhid.c?v=4.4#L815 + uint16_t handle_id = adb_host_talk(ADB_ADDR_KEYBOARD, 3); + switch (handle_id) { + case 0x04: case 0x05: case 0x07: case 0x09: case 0x0D: + case 0x11: case 0x14: case 0x19: case 0x1D: case 0xC1: + case 0xC4: case 0xC7: + is_iso_layout = true; + break; + default: + is_iso_layout = false; + break; + } + // Enable keyboard left/right modifier distinction // Addr:Keyboard(0010), Cmd:Listen(10), Register3(11) // upper byte: reserved bits 0000, device address 0010 @@ -92,6 +108,9 @@ void matrix_init(void) _delay_ms(500); DDRD |= (1<<6); PORTD &= ~(1<<6); + uint16_t handle_id2 = adb_host_talk(ADB_ADDR_KEYBOARD, 3); + xprintf("handle_id: %02X -> %02X\n", handle_id&0xff, handle_id2&0xff); + return; } @@ -106,10 +125,10 @@ void adb_mouse_task(void) { uint16_t codes; int16_t x, y; - static int8_t mouseacc; + static int8_t mouseacc; _delay_ms(12); // delay for preventing overload of poor ADB keyboard controller codes = adb_host_mouse_recv(); - // If nothing received reset mouse acceleration, and quit. + // If nothing received reset mouse acceleration, and quit. if (!codes) { mouseacc = 1; return; @@ -119,12 +138,12 @@ void adb_mouse_task(void) mouse_report.buttons |= MOUSE_BTN1; if (codes & (1 << 15)) mouse_report.buttons &= ~MOUSE_BTN1; - // lower seven bits are movement, as signed int_7. - // low byte is X-axis, high byte is Y. + // lower seven bits are movement, as signed int_7. + // low byte is X-axis, high byte is Y. y = (codes>>8 & 0x3F); x = (codes>>0 & 0x3F); // bit seven and fifteen is negative - // usb does not use int_8, but int_7 (measuring distance) with sign-bit. + // usb does not use int_8, but int_7 (measuring distance) with sign-bit. if (codes & (1 << 6)) x = (x-0x40); if (codes & (1 << 14)) @@ -132,7 +151,7 @@ void adb_mouse_task(void) // Accelerate mouse. (They weren't meant to be used on screens larger than 320x200). x *= mouseacc; y *= mouseacc; - // Cap our two bytes per axis to one byte. + // Cap our two bytes per axis to one byte. // Easier with a MIN-function, but since -MAX(-a,-b) = MIN(a,b)... // I.E. MIN(MAX(x,-127),127) = -MAX(-MAX(x, -127), -127) = MIN(-MIN(-x,127),127) mouse_report.x = -MAX(-MAX(x, -127), -127); @@ -145,7 +164,7 @@ void adb_mouse_task(void) print_decs(mouse_report.x); print(" "); print_decs(mouse_report.y); print("]\n"); } - // Send result by usb. + // Send result by usb. host_mouse_send(&mouse_report); // increase acceleration of mouse mouseacc += ( mouseacc < ADB_MOUSE_MAXACC ? 1 : 0 ); @@ -190,8 +209,49 @@ uint8_t matrix_scan(void) register_key(0xFF); } else if (key0 == 0xFF) { // error xprintf("adb_host_kbd_recv: ERROR(%d)\n", codes); + // something wrong or plug-in + matrix_init(); return key1; } else { + /* Swap codes for ISO keyboard + * + * ANSI + * ,----------- ----------. + * | *a| 1| 2 =|Backspa| + * |----------- ----------| + * |Tab | Q| | ]| *c| + * |----------- ----------| + * |CapsLo| A| '|Return | + * |----------- ----------| + * |Shift | Shift | + * `----------- ----------' + * + * ISO + * ,----------- ----------. + * | *a| 1| 2 =|Backspa| + * |----------- ----------| + * |Tab | Q| | ]|Retur| + * |----------- -----` | + * |CapsLo| A| '| *c| | + * |----------- ----------| + * |Shif| *b| Shift | + * `----------- ----------' + * + * ADB scan code USB usage + * ------------- --------- + * Key ANSI ISO ANSI ISO + * --------------------------------------------- + * *a 0x32 0x0A 0x35 0x35 + * *b ---- 0x32 ---- 0x64 + * *c 0x2A 0x2A 0x31 0x31(or 0x32) + */ + if (is_iso_layout) { + if (key0 == 0x32) { + key0 = 0x0A; + } else if (key0 == 0x0A) { + key0 = 0x32; + } + } register_key(key0); if (key1 != 0xFF) // key1 is 0xFF when no second key. extra_key = key1<<8 | 0xFF; // process in a separate call