Move kbc_event to board code

This commit is contained in:
Jeremy Soller 2019-11-07 13:57:33 -07:00
parent 3d1e1aaae5
commit 053a689276
No known key found for this signature in database
GPG Key ID: E988B49EE78A7FB1
4 changed files with 89 additions and 16 deletions

View File

@ -5,4 +5,6 @@
void kbc_init(void);
void kbc_event(struct Kbc * kbc);
#endif // _BOARD_KBC_H

View File

@ -1,6 +1,93 @@
#include <stdio.h>
#include <board/kbc.h>
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;
}
}
}
}

View File

@ -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;

View File

@ -1,5 +1,3 @@
#include <stdio.h>
#include <ec/kbc.h>
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);
}
}
}