diff --git a/src/board/system76/galp3-c/include/board/kbc.h b/src/board/system76/galp3-c/include/board/kbc.h index 0e6283a..c9d6bb7 100644 --- a/src/board/system76/galp3-c/include/board/kbc.h +++ b/src/board/system76/galp3-c/include/board/kbc.h @@ -5,4 +5,6 @@ void kbc_init(void); +void kbc_event(struct Kbc * kbc); + #endif // _BOARD_KBC_H diff --git a/src/board/system76/galp3-c/kbc.c b/src/board/system76/galp3-c/kbc.c index d8a1609..0a9b8c4 100644 --- a/src/board/system76/galp3-c/kbc.c +++ b/src/board/system76/galp3-c/kbc.c @@ -1,6 +1,93 @@ +#include + #include void kbc_init(void) { *(KBC.irq) = 0; *(KBC.control) = 0x48; } + +enum KbcState { + KBC_STATE_NORMAL, + KBC_STATE_WRITE_CONFIG, + KBC_STATE_SET_LEDS, +}; + +void kbc_event(struct Kbc * kbc) { + // TODO: state per KBC (we only have one KBC so low priority) + static enum KbcState state = KBC_STATE_NORMAL; + + uint8_t sts = kbc_status(kbc); + if (sts & KBC_STS_IBF) { + uint8_t data = kbc_read(kbc); + if (sts & KBC_STS_CMD) { + printf("kbc cmd: %02X\n", data); + + state = KBC_STATE_NORMAL; + switch (data) { + case 0x60: + printf(" write configuration byte\n"); + state = KBC_STATE_WRITE_CONFIG; + break; + case 0xA7: + printf(" disable second port\n"); + break; + case 0xA8: + printf(" enable second port\n"); + break; + case 0xAA: + printf(" test controller\n"); + // Why not pass the test? + kbc_keyboard(kbc, 0x55); + break; + case 0xAB: + printf(" test first port\n"); + // We _ARE_ the keyboard, so everything is good. + kbc_keyboard(kbc, 0x00); + break; + case 0xAD: + printf(" disable first port\n"); + break; + case 0xAE: + printf(" enable first port\n"); + break; + } + } else { + printf("kbc data: %02X\n", data); + + switch (state) { + case KBC_STATE_NORMAL: + printf(" keyboard command\n"); + switch (data) { + case 0xED: + printf(" set leds\n"); + state = KBC_STATE_SET_LEDS; + break; + case 0xF4: + printf(" enable scanning\n"); + kbc_keyboard(kbc, 0xFA); + break; + case 0xF5: + printf(" disable scanning\n"); + kbc_keyboard(kbc, 0xFA); + break; + case 0xFF: + printf(" self test\n"); + // Yep, everything is still good, I promise + kbc_keyboard(kbc, 0xAA); + break; + } + break; + case KBC_STATE_WRITE_CONFIG: + printf(" write configuration byte\n"); + state = KBC_STATE_NORMAL; + break; + case KBC_STATE_SET_LEDS: + printf(" set leds\n"); + state = KBC_STATE_NORMAL; + kbc_keyboard(kbc, 0xFA); + break; + } + } + } +} diff --git a/src/ec/it8587e/include/ec/kbc.h b/src/ec/it8587e/include/ec/kbc.h index 9dfb114..1a681fc 100644 --- a/src/ec/it8587e/include/ec/kbc.h +++ b/src/ec/it8587e/include/ec/kbc.h @@ -31,8 +31,6 @@ uint8_t kbc_read(struct Kbc * kbc); void kbc_keyboard(struct Kbc * kbc, uint8_t data); void kbc_mouse(struct Kbc * kbc, uint8_t data); -void kbc_event(struct Kbc * kbc); - volatile uint8_t __xdata __at(0x1300) KBHICR; volatile uint8_t __xdata __at(0x1302) KBIRQR; volatile uint8_t __xdata __at(0x1304) KBHISR; diff --git a/src/ec/it8587e/kbc.c b/src/ec/it8587e/kbc.c index 339d736..a8c73bb 100644 --- a/src/ec/it8587e/kbc.c +++ b/src/ec/it8587e/kbc.c @@ -1,5 +1,3 @@ -#include - #include struct Kbc __code KBC = { @@ -26,15 +24,3 @@ void kbc_keyboard(struct Kbc * kbc, uint8_t data) { void kbc_mouse(struct Kbc * kbc, uint8_t data) { *(kbc->mouse_out) = data; } - -void kbc_event(struct Kbc * kbc) { - uint8_t sts = kbc_status(kbc); - if (sts & KBC_STS_IBF) { - uint8_t data = kbc_read(kbc); - if (sts & KBC_STS_CMD) { - printf("kbc cmd: %02X\n", data); - } else { - printf("kbc data: %02X\n", data); - } - } -}