From 8b0c6010066830cf7aaa9f8e875111a57f563146 Mon Sep 17 00:00:00 2001 From: jean-marcharvengt Date: Fri, 28 Feb 2020 21:53:43 +0100 Subject: [PATCH] fix joyswapped with I2C keyboard issue --- .../pcb_t4/mcumev4minkeys7789.kicad_pcb | 21 +- MCUME_teensy/teensy5200/emuapi.cpp | 2 +- MCUME_teensy/teensy64/emuapi.cpp | 8 +- MCUME_teensy/teensy800/emuapi.cpp | 2 +- MCUME_teensy/teensy8086/emuapi.cpp | 2 +- MCUME_teensy/teensy81/emuapi.cpp | 2 +- MCUME_teensy/teensycastaway/emuapi.cpp | 15 +- MCUME_teensy/teensycastaway/emuapi.h | 4 +- MCUME_teensy/teensycolem/emuapi.cpp | 2 +- MCUME_teensy/teensygen/emuapi.cpp | 2 +- MCUME_teensy/teensygnuboy/emuapi.cpp | 2 +- MCUME_teensy/teensylogo/emuapi.cpp | 2 +- MCUME_teensy/teensync/emuapi.cpp | 2 +- MCUME_teensy/teensynofrendo/emuapi.cpp | 2 +- MCUME_teensy/teensyo2em/emuapi.cpp | 2 +- MCUME_teensy/teensypce/emuapi.cpp | 2 +- MCUME_teensy/teensysms/emuapi.cpp | 2 +- MCUME_teensy/teensyspeccy/emuapi.cpp | 2 +- MCUME_teensy/teensyvcs/emuapi.cpp | 2 +- MCUME_teensy/teensyvectrex/emuapi.cpp | 2 +- .../atmegai2ckeyboardV1.ino} | 4 +- i2ckeyboard/atmegai2ckeyboardV2/.DS_Store | Bin 0 -> 6148 bytes .../atmegai2ckeyboardV2.ino | 187 +++++++++++++ i2ckeyboard/keybV2rev.hex | 251 ++++++++++++++++++ i2ckeyboard/pinout.txt | 38 ++- i2ckeyboard/program_at328.sh | 2 +- 26 files changed, 507 insertions(+), 55 deletions(-) rename i2ckeyboard/{atmegai2ckeyboard/atmegai2ckeyboard.ino => atmegai2ckeyboardV1/atmegai2ckeyboardV1.ino} (96%) create mode 100644 i2ckeyboard/atmegai2ckeyboardV2/.DS_Store create mode 100644 i2ckeyboard/atmegai2ckeyboardV2/atmegai2ckeyboardV2.ino create mode 100644 i2ckeyboard/keybV2rev.hex diff --git a/MCUME_teensy/pcb_t4/mcumev4minkeys7789.kicad_pcb b/MCUME_teensy/pcb_t4/mcumev4minkeys7789.kicad_pcb index 1570835..17fd7cb 100644 --- a/MCUME_teensy/pcb_t4/mcumev4minkeys7789.kicad_pcb +++ b/MCUME_teensy/pcb_t4/mcumev4minkeys7789.kicad_pcb @@ -3,7 +3,7 @@ (general (thickness 1.6) (drawings 12) - (tracks 1128) + (tracks 1131) (zones 0) (modules 1) (nets 1) @@ -909,8 +909,8 @@ (segment (start 151.003 28.956) (end 151.003 27.686) (width 0.8) (layer B.Cu) (net 0)) (via (at 135.636 45.466) (size 1.8) (drill 0.4) (layers F.Cu B.Cu) (net 0)) (via (at 133.604 45.466) (size 1.8) (drill 0.4) (layers F.Cu B.Cu) (net 0)) - (via (at 138.43 52.07) (size 1.8) (drill 0.4) (layers F.Cu B.Cu) (net 0)) - (via (at 138.43 54.61) (size 1.8) (drill 0.4) (layers F.Cu B.Cu) (net 0)) + (via (at 138.43 51.435) (size 1.8) (drill 0.4) (layers F.Cu B.Cu) (net 0)) + (via (at 138.43 55.245) (size 1.8) (drill 0.4) (layers F.Cu B.Cu) (net 0)) (segment (start 151.003 44.196) (end 151.003 42.926) (width 0.8) (layer B.Cu) (net 0)) (segment (start 148.463 44.196) (end 148.463 42.926) (width 0.8) (layer B.Cu) (net 0)) (segment (start 47.371 94.234) (end 48.768 94.234) (width 0.6) (layer B.Cu) (net 0)) @@ -1104,7 +1104,6 @@ (segment (start 146.685 49.53) (end 146.685 51.689) (width 0.59944) (layer B.Cu) (net 0)) (segment (start 164.465 49.53) (end 164.465 48.257208) (width 0.59944) (layer B.Cu) (net 0)) (segment (start 164.465 48.257208) (end 163.832792 47.625) (width 0.59944) (layer B.Cu) (net 0)) - (segment (start 145.415 47.625) (end 144.653 48.387) (width 0.59944) (layer B.Cu) (net 0)) (segment (start 172.085 57.658) (end 172.085 57.404) (width 0.59944) (layer B.Cu) (net 0)) (via (at 166.243 30.734) (size 1.8) (drill 0.4) (layers F.Cu B.Cu) (net 0)) (via (at 168.783 30.734) (size 1.8) (drill 0.4) (layers F.Cu B.Cu) (net 0)) @@ -1322,13 +1321,8 @@ (segment (start 182.499 55.88) (end 184.15 55.88) (width 0.59944) (layer B.Cu) (net 0)) (segment (start 184.15 50.8) (end 185.166 50.8) (width 0.59944) (layer F.Cu) (net 0)) (segment (start 184.15 53.34) (end 185.293 53.34) (width 0.59944) (layer F.Cu) (net 0)) - (segment (start 145.415 47.625) (end 138.43 54.61) (width 0.59944) (layer B.Cu) (net 0)) (segment (start 131.318 47.498) (end 131.318 46.609) (width 0.59944) (layer B.Cu) (net 0)) - (segment (start 138.43 54.61) (end 131.318 47.498) (width 0.59944) (layer B.Cu) (net 0)) (segment (start 131.318 46.609) (end 131.318 33.274) (width 0.59944) (layer B.Cu) (net 0)) - (segment (start 137.530001 51.170001) (end 133.604 47.244) (width 0.59944) (layer B.Cu) (net 0)) - (segment (start 138.43 52.07) (end 137.530001 51.170001) (width 0.59944) (layer B.Cu) (net 0)) - (segment (start 133.604 45.466) (end 133.604 47.244) (width 0.59944) (layer B.Cu) (net 0)) (segment (start 180.467 31.623) (end 180.477999 31.633999) (width 0.59944) (layer B.Cu) (net 0)) (segment (start 152.677584 26.010136) (end 152.677584 26.011416) (width 0.59944) (layer B.Cu) (net 0)) (segment (start 148.59 32.258) (end 172.085 32.258) (width 0.59944) (layer B.Cu) (net 0)) @@ -1354,5 +1348,14 @@ (segment (start 172.974 27.432) (end 173.736 27.432) (width 0.59944) (layer B.Cu) (net 0)) (segment (start 178.977583 28.098791) (end 177.421792 26.543) (width 0.59944) (layer B.Cu) (net 0)) (segment (start 178.977583 28.920137) (end 178.977583 28.098791) (width 0.59944) (layer B.Cu) (net 0)) + (segment (start 133.604 47.244) (end 133.604 45.466) (width 0.59944) (layer B.Cu) (net 0)) + (segment (start 136.895001 50.535001) (end 133.604 47.244) (width 0.59944) (layer B.Cu) (net 0)) + (segment (start 137.530001 50.535001) (end 136.895001 50.535001) (width 0.59944) (layer B.Cu) (net 0)) + (segment (start 138.43 51.435) (end 137.530001 50.535001) (width 0.59944) (layer B.Cu) (net 0)) + (segment (start 131.318 48.133) (end 131.318 47.498) (width 0.59944) (layer B.Cu) (net 0)) + (segment (start 138.43 55.245) (end 131.318 48.133) (width 0.59944) (layer B.Cu) (net 0)) + (segment (start 144.907 48.768) (end 144.907 48.133) (width 0.59944) (layer B.Cu) (net 0)) + (segment (start 138.43 55.245) (end 144.907 48.768) (width 0.59944) (layer B.Cu) (net 0)) + (segment (start 145.415 47.625) (end 144.907 48.133) (width 0.59944) (layer B.Cu) (net 0)) ) diff --git a/MCUME_teensy/teensy5200/emuapi.cpp b/MCUME_teensy/teensy5200/emuapi.cpp index e205cd3..7f0967f 100644 --- a/MCUME_teensy/teensy5200/emuapi.cpp +++ b/MCUME_teensy/teensy5200/emuapi.cpp @@ -350,7 +350,7 @@ int emu_SwapJoysticks(int statusOnly) { int emu_GetPad(void) { - return(keypadval|((joySwapped?1:0)<<7)); + return(keypadval/*|((joySwapped?1:0)<<7)*/); } int emu_ReadKeys(void) diff --git a/MCUME_teensy/teensy64/emuapi.cpp b/MCUME_teensy/teensy64/emuapi.cpp index ac2d42e..d36f925 100644 --- a/MCUME_teensy/teensy64/emuapi.cpp +++ b/MCUME_teensy/teensy64/emuapi.cpp @@ -350,7 +350,7 @@ int emu_SwapJoysticks(int statusOnly) { int emu_GetPad(void) { - return(keypadval|((joySwapped?1:0)<<7)); + return(keypadval/*|((joySwapped?1:0)<<7)*/); } int emu_ReadKeys(void) @@ -479,9 +479,9 @@ int emu_ReadI2CKeyboard(void) { if (b != 0xff) hitindex=i; msg[i++] = b; } - + if (hitindex >=0 ) { - /* + /* Serial.println(msg[0], BIN); Serial.println(msg[1], BIN); Serial.println(msg[2], BIN); @@ -491,7 +491,7 @@ int emu_ReadI2CKeyboard(void) { Serial.println(msg[6], BIN); */ unsigned short match = (~msg[hitindex])&0x00FF | (hitindex<<8); - //Serial.println(match,HEX); + Serial.println(match,HEX); for (i=0; i=0 ) { /* Serial.println(msg[0], BIN); @@ -1411,10 +1411,11 @@ void emu_init(void) emu_InitJoysticks(); #ifdef SWAP_JOYSTICK - joySwapped = true; + joySwapped = true; #else - joySwapped = false; -#endif + joySwapped = false; +#endif + readCallibration(); if ((tft.isTouching()) || (emu_ReadKeys() & MASK_JOY2_BTN) ) { @@ -1442,7 +1443,7 @@ void emu_init(void) Serial.println(msg[4], BIN); Serial.println(msg[5], BIN); Serial.println(msg[6], BIN); - */ + */ if ( (msg[0] == 0xff) && (msg[1] == 0xff) && (msg[2] == 0xff) && (msg[3] == 0xff) && (msg[4] == 0xff) && (msg[5] == 0xff) && (msg[6] == 0xff)) { diff --git a/MCUME_teensy/teensycastaway/emuapi.h b/MCUME_teensy/teensycastaway/emuapi.h index 0a7973b..b6e5071 100644 --- a/MCUME_teensy/teensycastaway/emuapi.h +++ b/MCUME_teensy/teensycastaway/emuapi.h @@ -10,8 +10,8 @@ #define EXTRA_HEAP 0x10 -// Title: < > -#define TITLE " AtariST Emulator " +// Title: < > +#define TITLE " AtariST Emulator " #define ROMSDIR "/st" #define emu_Init(ROM) {ast_Init(); ast_Start(ROM);} diff --git a/MCUME_teensy/teensycolem/emuapi.cpp b/MCUME_teensy/teensycolem/emuapi.cpp index e205cd3..7f0967f 100644 --- a/MCUME_teensy/teensycolem/emuapi.cpp +++ b/MCUME_teensy/teensycolem/emuapi.cpp @@ -350,7 +350,7 @@ int emu_SwapJoysticks(int statusOnly) { int emu_GetPad(void) { - return(keypadval|((joySwapped?1:0)<<7)); + return(keypadval/*|((joySwapped?1:0)<<7)*/); } int emu_ReadKeys(void) diff --git a/MCUME_teensy/teensygen/emuapi.cpp b/MCUME_teensy/teensygen/emuapi.cpp index e205cd3..7f0967f 100644 --- a/MCUME_teensy/teensygen/emuapi.cpp +++ b/MCUME_teensy/teensygen/emuapi.cpp @@ -350,7 +350,7 @@ int emu_SwapJoysticks(int statusOnly) { int emu_GetPad(void) { - return(keypadval|((joySwapped?1:0)<<7)); + return(keypadval/*|((joySwapped?1:0)<<7)*/); } int emu_ReadKeys(void) diff --git a/MCUME_teensy/teensygnuboy/emuapi.cpp b/MCUME_teensy/teensygnuboy/emuapi.cpp index e205cd3..7f0967f 100644 --- a/MCUME_teensy/teensygnuboy/emuapi.cpp +++ b/MCUME_teensy/teensygnuboy/emuapi.cpp @@ -350,7 +350,7 @@ int emu_SwapJoysticks(int statusOnly) { int emu_GetPad(void) { - return(keypadval|((joySwapped?1:0)<<7)); + return(keypadval/*|((joySwapped?1:0)<<7)*/); } int emu_ReadKeys(void) diff --git a/MCUME_teensy/teensylogo/emuapi.cpp b/MCUME_teensy/teensylogo/emuapi.cpp index f922015..7569ab7 100644 --- a/MCUME_teensy/teensylogo/emuapi.cpp +++ b/MCUME_teensy/teensylogo/emuapi.cpp @@ -350,7 +350,7 @@ int emu_SwapJoysticks(int statusOnly) { int emu_GetPad(void) { - return(keypadval|((joySwapped?1:0)<<7)); + return(keypadval/*|((joySwapped?1:0)<<7)*/); } int emu_ReadKeys(void) diff --git a/MCUME_teensy/teensync/emuapi.cpp b/MCUME_teensy/teensync/emuapi.cpp index efac4e2..169b76b 100644 --- a/MCUME_teensy/teensync/emuapi.cpp +++ b/MCUME_teensy/teensync/emuapi.cpp @@ -118,7 +118,7 @@ int emu_SwapJoysticks(int statusOnly) { int emu_GetPad(void) { - return(keypadval|((joySwapped?1:0)<<7)); + return(keypadval/*|((joySwapped?1:0)<<7)*/); } int emu_ReadKeys(void) diff --git a/MCUME_teensy/teensynofrendo/emuapi.cpp b/MCUME_teensy/teensynofrendo/emuapi.cpp index e205cd3..7f0967f 100644 --- a/MCUME_teensy/teensynofrendo/emuapi.cpp +++ b/MCUME_teensy/teensynofrendo/emuapi.cpp @@ -350,7 +350,7 @@ int emu_SwapJoysticks(int statusOnly) { int emu_GetPad(void) { - return(keypadval|((joySwapped?1:0)<<7)); + return(keypadval/*|((joySwapped?1:0)<<7)*/); } int emu_ReadKeys(void) diff --git a/MCUME_teensy/teensyo2em/emuapi.cpp b/MCUME_teensy/teensyo2em/emuapi.cpp index e205cd3..7f0967f 100644 --- a/MCUME_teensy/teensyo2em/emuapi.cpp +++ b/MCUME_teensy/teensyo2em/emuapi.cpp @@ -350,7 +350,7 @@ int emu_SwapJoysticks(int statusOnly) { int emu_GetPad(void) { - return(keypadval|((joySwapped?1:0)<<7)); + return(keypadval/*|((joySwapped?1:0)<<7)*/); } int emu_ReadKeys(void) diff --git a/MCUME_teensy/teensypce/emuapi.cpp b/MCUME_teensy/teensypce/emuapi.cpp index e205cd3..7f0967f 100644 --- a/MCUME_teensy/teensypce/emuapi.cpp +++ b/MCUME_teensy/teensypce/emuapi.cpp @@ -350,7 +350,7 @@ int emu_SwapJoysticks(int statusOnly) { int emu_GetPad(void) { - return(keypadval|((joySwapped?1:0)<<7)); + return(keypadval/*|((joySwapped?1:0)<<7)*/); } int emu_ReadKeys(void) diff --git a/MCUME_teensy/teensysms/emuapi.cpp b/MCUME_teensy/teensysms/emuapi.cpp index e205cd3..7f0967f 100644 --- a/MCUME_teensy/teensysms/emuapi.cpp +++ b/MCUME_teensy/teensysms/emuapi.cpp @@ -350,7 +350,7 @@ int emu_SwapJoysticks(int statusOnly) { int emu_GetPad(void) { - return(keypadval|((joySwapped?1:0)<<7)); + return(keypadval/*|((joySwapped?1:0)<<7)*/); } int emu_ReadKeys(void) diff --git a/MCUME_teensy/teensyspeccy/emuapi.cpp b/MCUME_teensy/teensyspeccy/emuapi.cpp index e205cd3..7f0967f 100644 --- a/MCUME_teensy/teensyspeccy/emuapi.cpp +++ b/MCUME_teensy/teensyspeccy/emuapi.cpp @@ -350,7 +350,7 @@ int emu_SwapJoysticks(int statusOnly) { int emu_GetPad(void) { - return(keypadval|((joySwapped?1:0)<<7)); + return(keypadval/*|((joySwapped?1:0)<<7)*/); } int emu_ReadKeys(void) diff --git a/MCUME_teensy/teensyvcs/emuapi.cpp b/MCUME_teensy/teensyvcs/emuapi.cpp index e205cd3..7f0967f 100644 --- a/MCUME_teensy/teensyvcs/emuapi.cpp +++ b/MCUME_teensy/teensyvcs/emuapi.cpp @@ -350,7 +350,7 @@ int emu_SwapJoysticks(int statusOnly) { int emu_GetPad(void) { - return(keypadval|((joySwapped?1:0)<<7)); + return(keypadval/*|((joySwapped?1:0)<<7)*/); } int emu_ReadKeys(void) diff --git a/MCUME_teensy/teensyvectrex/emuapi.cpp b/MCUME_teensy/teensyvectrex/emuapi.cpp index 4f2ee2e..1b89ab0 100644 --- a/MCUME_teensy/teensyvectrex/emuapi.cpp +++ b/MCUME_teensy/teensyvectrex/emuapi.cpp @@ -350,7 +350,7 @@ int emu_SwapJoysticks(int statusOnly) { int emu_GetPad(void) { - return(keypadval|((joySwapped?1:0)<<7)); + return(keypadval/*|((joySwapped?1:0)<<7)*/); } int emu_ReadKeys(void) diff --git a/i2ckeyboard/atmegai2ckeyboard/atmegai2ckeyboard.ino b/i2ckeyboard/atmegai2ckeyboardV1/atmegai2ckeyboardV1.ino similarity index 96% rename from i2ckeyboard/atmegai2ckeyboard/atmegai2ckeyboard.ino rename to i2ckeyboard/atmegai2ckeyboardV1/atmegai2ckeyboardV1.ino index 2b5cd43..b61f793 100644 --- a/i2ckeyboard/atmegai2ckeyboard/atmegai2ckeyboard.ino +++ b/i2ckeyboard/atmegai2ckeyboardV1/atmegai2ckeyboardV1.ino @@ -5,8 +5,8 @@ static byte msg[7]; // rows are inputs -//static byte rows[] = {11, 10, 9, 12, 13, 8, 7, 6, 5, 4}; // {2,3,4}; -static byte rows[] = {4, 5, 6, 7, 8, 13, 12, 9, 10, 11}; // {2,3,4}; +// VERI OLD static byte rows[] = {11, 10, 9, 12, 13, 8, 7, 6, 5, 4}; // VERI OLD +static byte rows[] = {4, 5, 6, 7, 8, 13, 12, 9, 10, 11}; // Teensy4 ILI 9341 + keyboard const int rowCount = sizeof(rows) / sizeof(rows[0]); // cols are outputs diff --git a/i2ckeyboard/atmegai2ckeyboardV2/.DS_Store b/i2ckeyboard/atmegai2ckeyboardV2/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 zcmeH~Jr2S!425mzP>H1@V-^m;4Wg<&0T*E43hX&L&p$$qDprKhvt+--jT7}7np#A3 zem<@ulZcFPQ@L2!n>{z**++&mCkOWA81W14cNZlEfg7;MkzE(HCqgga^y>{tEnwC%0;vJ&^%eQ zLs35+`xjp>T0 + +static byte msg[7]; + +// VERI OLD static byte rows[] = {11, 10, 9, 12, 13, 8, 7, 6, 5, 4}; // VERI OLD +// ILI 9341 static byte rows[] = {4, 5, 6, 7, 8, 13, 12, 9, 10, 11}; // Teensy4 ILI 9341 + keyboard +#define REV_DIODE 1 + +#ifdef REV_DIODE +// rows are inputs +static byte rows[] = {A3, A2, A1, A0, 3}; //{8,9,10,11}; +const int rowCount = sizeof(rows) / sizeof(rows[0]); +// cols are outputs +static byte cols[] = {9, 10, 8, 7, 6, 5, 4, 2, 1, 0 }; // Teensy4 ST7789 + keyboard +const int colCount = sizeof(cols) / sizeof(cols[0]); +#else +// rows are inputs +static byte rows[] = {9, 10, 8, 7, 6, 5, 4, 2, 1, 0 }; // Teensy4 ST7789 + keyboard +const int rowCount = sizeof(rows) / sizeof(rows[0]); +// cols are outputs +static byte cols[] = {A3, A2, A1, A0, 3}; //{8,9,10,11}; +const int colCount = sizeof(cols) / sizeof(cols[0]); +#endif + +#ifdef REV_DIODE +static byte keys[rowCount][colCount]; +#else +static byte keys[colCount][rowCount]; +#endif + + +void setup() { + //Serial.begin(115200); + + Wire.begin(8); // join i2c bus with address #8 + Wire.onRequest(requestEvent); // register event + + // input + for (int x = 0; x < rowCount; x++) { + pinMode(rows[x], INPUT_PULLUP); + } + + // output + for (int x = 0; x < colCount; x++) { + pinMode(cols[x], OUTPUT); + digitalWrite(cols[x], HIGH); + } +} + +void readMatrix() { + // iterate the columns + for (int colIndex = 0; colIndex < colCount; colIndex++) { + // col: set to output to low + byte curCol = cols[colIndex]; + //pinMode(curCol, OUTPUT); + +#ifdef REV_DIODE + digitalWrite(curCol, LOW); +#endif + // row: interate through the rows + for (int rowIndex = 0; rowIndex < rowCount; rowIndex++) { + byte rowCol = rows[rowIndex]; +#ifdef REV_DIODE + keys[rowIndex][colIndex] = digitalRead(rowCol); +#else + digitalWrite(curCol, LOW); + keys[colIndex][rowIndex] = digitalRead(rowCol); + digitalWrite(curCol, HIGH); +#endif + } +#ifdef REV_DIODE + digitalWrite(curCol, HIGH); +#endif; + } + byte * pt = &msg[0]; + byte v = 0; + v |= (keys[0][0] ? 0x80 : 0); + v |= (keys[1][0] ? 0x40 : 0); + v |= (keys[2][0] ? 0x20 : 0); + v |= (keys[3][0] ? 0x10 : 0); + v |= (keys[0][1] ? 0x08 : 0); + v |= (keys[1][1] ? 0x04 : 0); + v |= (keys[2][1] ? 0x02 : 0); + v |= (keys[3][1] ? 0x01 : 0); + *pt++ = v; + v = 0; + v |= (keys[0][2] ? 0x80 : 0); + v |= (keys[1][2] ? 0x40 : 0); + v |= (keys[2][2] ? 0x20 : 0); + v |= (keys[3][2] ? 0x10 : 0); + v |= (keys[0][3] ? 0x08 : 0); + v |= (keys[1][3] ? 0x04 : 0); + v |= (keys[2][3] ? 0x02 : 0); + v |= (keys[3][3] ? 0x01 : 0); + *pt++ = v; + v = 0; + v |= (keys[0][4] ? 0x80 : 0); + v |= (keys[1][4] ? 0x40 : 0); + v |= (keys[2][4] ? 0x20 : 0); + v |= (keys[3][4] ? 0x10 : 0); + v |= (keys[0][5] ? 0x08 : 0); + v |= (keys[1][5] ? 0x04 : 0); + v |= (keys[2][5] ? 0x02 : 0); + v |= (keys[3][5] ? 0x01 : 0); + *pt++ = v; + v = 0; + v |= (keys[0][6] ? 0x80 : 0); + v |= (keys[1][6] ? 0x40 : 0); + v |= (keys[2][6] ? 0x20 : 0); + v |= (keys[3][6] ? 0x10 : 0); + v |= (keys[0][7] ? 0x08 : 0); + v |= (keys[1][7] ? 0x04 : 0); + v |= (keys[2][7] ? 0x02 : 0); + v |= (keys[3][7] ? 0x01 : 0); + *pt++ = v; + v = 0; + v |= (keys[0][8] ? 0x80 : 0); + v |= (keys[1][8] ? 0x40 : 0); + v |= (keys[2][8] ? 0x20 : 0); + v |= (keys[3][8] ? 0x10 : 0); + v |= (keys[0][9] ? 0x08 : 0); + v |= (keys[1][9] ? 0x04 : 0); + v |= (keys[2][9] ? 0x02 : 0); + v |= (keys[3][9] ? 0x01 : 0); + *pt++ = v; + v = 0; + v |= (keys[4][0] ? 0x80 : 0); + v |= (keys[4][1] ? 0x40 : 0); + v |= (keys[4][2] ? 0x20 : 0); + v |= (keys[4][3] ? 0x10 : 0); + v |= (keys[4][4] ? 0x08 : 0); + v |= (keys[4][5] ? 0x04 : 0); + v |= (keys[4][6] ? 0x02 : 0); + v |= (keys[4][7] ? 0x01 : 0); + *pt++ = v; + v = 0x3F; + v |= (keys[4][8] ? 0x80 : 0); + v |= (keys[4][9] ? 0x40 : 0); + *pt++ = v; +} + +void printMatrix() { + + for (int rowIndex=0; rowIndex < rowCount; rowIndex++) { + if (rowIndex < 10) Serial.print(F("0")); + Serial.print(rowIndex); Serial.print(F(": ")); + for (int colIndex=0; colIndex < colCount; colIndex++) { +#ifdef REV_DIODE + Serial.print(keys[rowIndex][colIndex]); +#else + Serial.print(keys[colIndex][rowIndex]); +#endif + if (colIndex < colCount) Serial.print(F(", ")); + } + Serial.println(""); + } + Serial.println(""); + Serial.println(""); + Serial.println(""); + + /* + Serial.println(msg[0], BIN); + Serial.println(msg[1], BIN); + Serial.println(msg[2], BIN); + Serial.println(msg[3], BIN); + Serial.println(msg[4], BIN); + Serial.println(""); + Serial.println(""); + Serial.println(""); + */ +} + +void loop() { + readMatrix(); + //printMatrix(); + delay(2); +} + + +// function that executes whenever data is requested by master +// this function is registered as an event, see setup() +void requestEvent() { + Wire.write(msg, 7); + //Wire.write("hello "); // respond with message of 6 bytes +} + diff --git a/i2ckeyboard/keybV2rev.hex b/i2ckeyboard/keybV2rev.hex new file mode 100644 index 0000000..31d3569 --- /dev/null +++ b/i2ckeyboard/keybV2rev.hex @@ -0,0 +1,251 @@ +:100000000C9462000C948A000C948A000C948A0070 +:100010000C948A000C948A000C948A000C948A0038 +:100020000C948A000C948A000C948A000C948A0028 +:100030000C948A000C948A000C948A000C948A0018 +:100040000C942F030C948A000C94FD020C94D7029C +:100050000C948A000C948A000C948A000C948A00F8 +:100060000C9479030C948A000000000025002800FD +:100070002B0000000000240027002A0000000000E0 +:1000800023002600290004040404040404040202DA +:100090000202020203030303030301020408102007 +:1000A0004080010204081020010204081020000012 +:1000B0000008000201000003040700000000000027 +:1000C0000000A70411241FBECFEFD8E0DEBFCDBFD4 +:1000D00011E0A0E0B1E0ECE5FFE002C005900D9278 +:1000E000A433B107D9F722E0A4E3B1E001C01D9227 +:1000F000A53BB207E1F710E0C2E6D0E004C02197CB +:10010000FE010E94A107C136D107C9F70E94E00491 +:100110000C94AC070C940000FC01538D448D252FEA +:1001200030E0842F90E0821B930B541710F0CF9691 +:10013000089501970895FC01918D828D981761F0C3 +:10014000828DDF01A80FB11D5D968C91928D9F5F0E +:100150009F73928F90E008958FEF9FEF0895FC01B9 +:10016000918D828D981731F0828DE80FF11D858D6C +:1001700090E008958FEF9FEF0895FC01918D228DFF +:10018000892F90E0805C9F4F821B91098F73992784 +:100190000895FC01848DDF01A80FB11DA35ABF4F44 +:1001A0002C91848D90E001968F739927848FA68976 +:1001B000B7892C93A089B1898C9180648C93938D9D +:1001C000848D981306C00288F389E02D80818F7D8D +:1001D00080830895EF92FF920F931F93CF93DF9345 +:1001E000EC0181E0888F9B8D8C8D981305C0E88988 +:1001F000F989808185FD24C0F62E0B8D10E00F5FFC +:100200001F4F0F731127E02E8C8DE8120CC00FB614 +:1002100007FCFACFE889F989808185FFF5CFCE0107 +:100220000E94C900F1CF8B8DFE01E80FF11DE35A4A +:10023000FF4FF0820B8FEA89FB898081806207C0C3 +:10024000EE89FF896083E889F989808180648083F1 +:1002500081E090E0DF91CF911F910F91FF90EF909F +:100260000895CF93DF93EC01888D8823C9F0EA8944 +:10027000FB89808185FD05C0A889B9898C9186FD9F +:100280000FC00FB607FCF5CF808185FFF2CFA8899C +:10029000B9898C9185FFEDCFCE010E94C900E7CFCF +:1002A000DF91CF9108958CE092E00E94BD0021E0A3 +:1002B000892B09F420E0822F089580E090E0892BBB +:1002C00029F00E94530181110C9400000895E091DF +:1002D000D101F091D201309729F01092CA01109209 +:1002E000C90109940895CF93DF93AC01E0915401C3 +:1002F000F09155013097F1F09091CC018091CB01B4 +:100300009817C0F090E0292F30E02617370754F4F3 +:10031000D901AC5CBE4FEA01C20FD31F88818C9318 +:100320009F5FF1CF1092CC016093CB01CB01DF91A5 +:10033000CF910994DF91CF910895CF92DF92EF9200 +:10034000FF920F931F93CF93DF936C017A018B0180 +:10035000C0E0D0E0CE15DF0589F0D8016D918D01A8 +:10036000D601ED91FC910190F081E02DC601099537 +:10037000892B11F47E0102C02196ECCFC701DF91D9 +:10038000CF911F910F91FF90EF90DF90CF90089544 +:10039000833081F028F4813099F08230A1F0089503 +:1003A0008730A9F08830B9F08430D1F48091800092 +:1003B0008F7D03C0809180008F77809380000895A7 +:1003C00084B58F7702C084B58F7D84BD08958091F8 +:1003D000B0008F7703C08091B0008F7D8093B00014 +:1003E00008951F93CF93DF93282F30E0F901E25552 +:1003F000FF4F8491F901E656FF4FD491F901EA5776 +:10040000FF4FC491CC23C9F0162F81110E94C8015F +:10041000EC2FF0E0EE0FFF1FE859FF4FA591B491CC +:100420008FB7F894111105C09C91ED2FE095E92349 +:1004300002C0EC91ED2BEC938FBFDF91CF911F9118 +:1004400008953FB7F8948091C2019091C301A091A3 +:10045000C401B091C50126B5A89B05C02F3F19F076 +:100460000196A11DB11D3FBFBA2FA92F982F882734 +:10047000820F911DA11DB11DBC01CD0142E0660F8F +:10048000771F881F991F4A95D1F7089585ED8093AE +:10049000BC008091BC0084FDFCCF1092C80108957F +:1004A00040917601262F30E0240F311D2132310595 +:1004B000DCF42091C8012430C9F4FC0180E090E014 +:1004C000861758F4309176012191DC01AA5ABE4F6B +:1004D000A30FB11D2C930196F3CF80917601680F85 +:1004E0006093760180E0089581E0089582E00895A8 +:1004F0000895E091CC018091CB01E81730F4F0E051 +:10050000EC5CFE4F808190E008958FEF9FEF08959F +:100510009091CC018091CB01981750F4E92FF0E035 +:10052000EC5CFE4F208130E09F5F9093CC0102C0D5 +:100530002FEF3FEFC90108958091CB0190E020910A +:10054000CC01821B91090895CF93DF9300D0CDB7E2 +:10055000DEB7CB01642F49835A830E945002498140 +:10056000842F5A81952F0F900F90DF91CF9108958E +:1005700047E050E063ED71E089EA92E00C94A40258 +:10058000CF93DF931F92CDB7DEB7698361E0CE01D1 +:1005900001960E94500281E090E00F90DF91CF9190 +:1005A0000895089580E090E008950E94A7071F92A3 +:1005B0000F920FB60F9211242F933F934F935F9397 +:1005C0006F937F938F939F93AF93BF93EF93FF931B +:1005D0008CE092E00E94C900FF91EF91BF91AF9132 +:1005E0009F918F917F916F915F914F913F912F914B +:1005F0000F900FBE0F901F9018951F920F920FB67D +:100600000F9211242F938F939F93EF93FF93E09179 +:100610001C02F0911D028081E0912202F0912302E0 +:1006200082FD12C09081809125028F5F8F7320918F +:100630002602821751F0E0912502F0E0E45FFD4FC1 +:10064000958F8093250201C08081FF91EF919F914A +:100650008F912F910F900FBE0F901F9018951F92A2 +:100660000F920FB60F9211242F933F938F939F9366 +:10067000AF93BF938091BE019091BF01A091C00143 +:10068000B091C1013091BD0123E0230F2D3720F43B +:100690000196A11DB11D05C026E8230F0296A11DDC +:1006A000B11D2093BD018093BE019093BF01A09323 +:1006B000C001B093C1018091C2019091C301A0918A +:1006C000C401B091C5010196A11DB11D8093C20165 +:1006D0009093C301A093C401B093C501BF91AF91A2 +:1006E0009F918F913F912F910F900FBE0F901F9070 +:1006F00018951F920F920FB60F9211242F933F93CC +:100700004F935F936F937F938F939F93AF93BF9319 +:10071000EF93FF938091B900887F803609F49CC0E5 +:1007200068F5883209F45BC090F4803109F454C054 +:1007300038F4882309F4F6C0883009F44DC0F6C0B7 +:10074000883109F44CC0803209F45DC0EFC08034B8 +:1007500009F468C048F4803309F455C0883309F0BF +:10076000E5C080939901D8C0803509F44FC0883521 +:1007700009F45DC0883409F0D9C0D6C0883909F4BD +:10078000C7C0A8F4883709F467C038F4883609F47C +:1007900063C0803709F460C0C9C0883809F4B8C0A4 +:1007A000803909F45FC0803809F0C0C05BC0803B6D +:1007B00009F486C038F4803A09F466C0883A09F42E +:1007C0007FC0B4C0803C09F4A7C0883C09F4A4C031 +:1007D000883B09F48AC0AAC08091BC0110C09091E6 +:1007E000BB018091BA01981770F5E091BB0181E0DF +:1007F0008E0F8093BB01F0E0E656FE4F8081809320 +:10080000BB0085EC86C0809399018EC0E091BB014E +:1008100081E08E0F8093BB018091BB00F0E0E65633 +:10082000FE4F80839091BB018091BA016EC0E09130 +:10083000BB0181E08E0F8093BB018091BB00F0E093 +:10084000E656FE4F80838091C70181116DC081E023 +:100850008093C60184EA61C083E08093C80110924E +:100860009801CFCF80919801803208F051C0E0917B +:10087000980181E08E0F809398018091BB00F0E099 +:10088000E858FE4F8083BDCF85EC8093BC0010926A +:10089000C80180919801803230F4E0919801F0E035 +:1008A000E858FE4F10826091980170E0E091CD0110 +:1008B000F091CE0188E791E009951092980136C039 +:1008C00084E08093C8011092770110927601E09144 +:1008D000CF01F091D001099580917601811105C079 +:1008E00081E08093760110925601E091770181E0DA +:1008F0008E0F80937701F0E0EA5AFE4F808180935B +:10090000BB009091770180917601981708F479CF18 +:1009100085E88093BC000AC085EC8093BC001092EF +:10092000C80104C0109299010E944602FF91EF9104 +:10093000BF91AF919F918F917F916F915F914F91F7 +:100940003F912F910F900FBE0F901F901895ECE0E4 +:10095000F2E01382128288EE93E0A0E0B0E084839C +:100960009583A683B78323E131E03183208325EC8F +:1009700030E03587248724EC30E03787268720EC69 +:1009800030E0318B208B21EC30E0338B228B22EC5A +:1009900030E0358B248B26EC30E0378B268B118EA4 +:1009A000128E138E148EE9EAF2E01382128284838F +:1009B0009583A683B78385E291E091838083089530 +:1009C000789484B5826084BD84B5816084BD85B52A +:1009D000826085BD85B5816085BD80916E00816036 +:1009E00080936E00109281008091810082608093DC +:1009F00081008091810081608093810080918000DE +:100A00008160809380008091B10084608093B10008 +:100A10008091B00081608093B00080917A00846002 +:100A200080937A0080917A00826080937A0080912E +:100A30007A00816080937A0080917A008068809348 +:100A40007A001092C10080E18093BA0087E691E0BD +:100A50009093D0018093CF0183E791E09093CE01F2 +:100A60008093CD011092CC011092CB011092CA015B +:100A70001092C9011092C80181E08093C7011092C1 +:100A8000C60161E082E10E94F10161E083E10E9420 +:100A9000F1018091B9008E7F8093B9008091B900F7 +:100AA0008D7F8093B90088E48093B80085E48093BB +:100AB000BC0088EB92E09093D2018093D101A0E03A +:100AC000B1E08D9190E0FC01E656FF4F2491FC01CE +:100AD000EA57FF4F84918823C9F090E0880F991F4F +:100AE000FC01EE58FF4F45915491FC01E859FF4F2E +:100AF000C591D4919FB7F894FA013081822F8095E7 +:100B000083238083E8812E2B28839FBFF1E0A530CB +:100B1000BF07B9F6C5E0D1E0DE01888190E0FC01B5 +:100B2000E656FF4F2491FC01EA57FF4F849188233A +:100B3000A1F090E0880F991FFC01EE58FF4F4591FE +:100B40005491FC01E859FF4F859194918FB7F89427 +:100B5000FA019081922B90838FBF219661E08C9156 +:100B60000E94F101F1E0CF30DF07B1F60AED11E0AC +:100B7000C5E0D1E0B99060E08B2D0E94F10130E03A +:100B8000E32E31E0F32EC12CD12CF70121917F010E +:100B900030E0F901E255FF4F8491F901E656FF4F2D +:100BA0009490F901EA57FF4FA490AA2079F081119F +:100BB0000E94C801EA2DF0E0EE0FFF1FE458FF4F3E +:100BC000A591B491EC919E2281E009F480E0F801B6 +:100BD000EC0DFD1D8083FAE0CF0ED11C22E3C2167E +:100BE000D10499F661E08B2D0E94F1010F5F1F4F38 +:100BF00081E0CF30D80709F0BDCF8091DA018111B3 +:100C000002C070E001C070E88091E401811102C06F +:100C100050E001C050E48091EE01811102C040E03B +:100C200001C040E28091F801811102C030E001C0B2 +:100C300030E18091DB01811102C020E001C028E099 +:100C40008091E501811102C090E001C094E08091A3 +:100C5000EF01811182E061E0E091F901E11101C051 +:100C600060E0672B562B452B342B232B922B892BA3 +:100C70008093D3018091DC01811102C070E001C03A +:100C800070E88091E601811102C050E001C050E49B +:100C90008091F001811102C040E001C040E28091EA +:100CA000FA01811102C030E001C030E18091DD0124 +:100CB000811102C020E001C028E08091E70181118C +:100CC00002C090E001C094E08091F101811182E0C6 +:100CD00061E0E091FB01E11101C060E0672B562B60 +:100CE000452B342B232B922B892B8093D40180917D +:100CF000DE01811102C070E001C070E88091E8015E +:100D0000811102C050E001C050E48091F2018111D4 +:100D100002C040E001C040E28091FC01811102C0AC +:100D200030E001C030E18091DF01811102C020E09C +:100D300001C028E08091E901811102C090E001C06A +:100D400094E08091F301811182E061E0E091FD0186 +:100D5000E11101C060E0672B562B452B342B232B70 +:100D6000922B892B8093D5018091E001811102C0E3 +:100D700070E001C070E88091EA01811102C050E08A +:100D800001C050E48091F401811102C040E001C033 +:100D900040E28091FE01811102C030E001C030E1EB +:100DA0008091E101811102C020E001C028E0809122 +:100DB000EB01811102C090E001C094E08091F50147 +:100DC000811182E061E0E091FF01E11101C060E08A +:100DD000672B562B452B342B232B922B892B80935F +:100DE000D6018091E201811102C070E001C070E87B +:100DF0008091EC01811102C050E001C050E480916B +:100E0000F601811102C040E001C040E28091000281 +:100E1000811102C030E001C030E18091E301811115 +:100E200002C020E001C028E08091ED01811102C0E4 +:100E300090E001C094E08091F701811182E061E0CF +:100E4000E0910102E11101C060E0672B562B452BB8 +:100E5000342B232B922B892B8093D7018091020274 +:100E6000811102C070E001C070E88091030281111D +:100E700002C050E001C050E480910402811102C020 +:100E800040E001C040E280910502811102C030E0E3 +:100E900001C030E180910602811102C020E001C052 +:100EA00028E080910702811102C090E001C094E027 +:100EB00080910802811182E061E0E0910902E11174 +:100EC00001C060E0672B562B452B342B232B922B34 +:100ED000892B8093D80180910A02811180E8982F94 +:100EE0009F6380910B02811180E4892B8093D9014B +:100EF0000E9421026B017C0192E0892E912CA12C91 +:100F0000B12C0E942102DC01CB018C199D09AE0994 +:100F1000BF09883E9340A105B10598F3E8EECE0ED7 +:100F2000E3E0DE1EE11CF11C8A9489288A288B28C4 +:100F300029F0812C912C54018394E3CF0E945D0110 +:100F400015CEEE0FFF1F0590F491E02D099481E07E +:0C0F500090E0F8940C94AC07F894FFCFEC +:100F5C0011100F0E03090A08070605040201000010 +:100F6C00000000EA009D018C003101BD009B00AF28 +:100F7C000000000000C002A402D20278029C028889 +:040F8C0002790200E4 +:00000001FF diff --git a/i2ckeyboard/pinout.txt b/i2ckeyboard/pinout.txt index 61c405f..1fe4235 100644 --- a/i2ckeyboard/pinout.txt +++ b/i2ckeyboard/pinout.txt @@ -1,18 +1,28 @@ pinout Atmega328p (2x14 pins) as I2C keyboard slave --------------------------------------------------- + V2 V1 V1 V2 + RESET 01 28 I2C SCL + 9 02 x 27 I2C SDA + 8 03 x 26 3 ROW OUT 3 + 7 04 x 24 2 ROW OUT 2 + 4 ROW OUT 4 05 25 1 ROW OUT 1 + 6 COL IN 9 06 x 23 0 ROW OUT 0 + V3.3v 07 22 GND + GND 08 21 + 09 20 + 10 19 4 COL IN + 5 COL IN 8 11 x 18 3 COL IN + 4 COL IN 7 12 x 17 0 COL IN + 3 COL IN 6 13 x x 16 1 COL IN 1 + 2 COL IN 5 14 x x 15 2 COL IN 0 - RESET 01 28 I2C SCL - 02 x 27 I2C SDA - 03 x 26 A3 COL3 OUT (kbd row0) - 04 x 24 A2 COL2 OUT (kbd row1) - COL4 OUT (kbd row4)05 25 A1 COL1 OUT (kbd row2) -9 ROW9 IN (kbd col9) 06 x 23 A0 COL0 OUT (kbd row3) - V3.3v 07 22 GND - GND 08 21 - 09 20 - 10 19 4 ROW4 IN (kbd col4) -8 ROW8 IN (kbd col8) 11 x 18 3 ROW3 IN (kbd col3) -7 ROW7 IN (kbd col7) 12 x 17 0 ROW0 IN (kbd col0) -6 ROW6 IN (kbd col6) 13 x x 16 1 ROW1 IN (kbd col1) -5 ROW5 IN (kbd col5) 14 x x 15 2 ROW2 IN (kbd col2) + +ROW and COLUMNS numbers (for V1 and V2): + + 0 1 2 3 4 5 6 7 8 9 +0 x x x x x x x x x x +1 x x x x x x x x x x +2 x x x x x x x x x x +3 x x x x x x x x x x +4 x x x x x x x x x x \ No newline at end of file diff --git a/i2ckeyboard/program_at328.sh b/i2ckeyboard/program_at328.sh index 4c5a687..7edb693 100755 --- a/i2ckeyboard/program_at328.sh +++ b/i2ckeyboard/program_at328.sh @@ -1,2 +1,2 @@ #./avrdude -C avrdude.conf -P /dev/cu.usbmodemFD1441 -c stk500 -p m328p -U flash:w:prog.hex -./avrdude -C avrdude.conf -P /dev/cu.usbmodemFA1221 -c stk500 -p m328p -U flash:w:keybrev.hex +./avrdude -C avrdude.conf -P /dev/cu.usbmodemFA1221 -c stk500 -p m328p -U flash:w:keybV2rev.hex