Move kbc_event to board code
This commit is contained in:
parent
3d1e1aaae5
commit
053a689276
@ -5,4 +5,6 @@
|
|||||||
|
|
||||||
void kbc_init(void);
|
void kbc_init(void);
|
||||||
|
|
||||||
|
void kbc_event(struct Kbc * kbc);
|
||||||
|
|
||||||
#endif // _BOARD_KBC_H
|
#endif // _BOARD_KBC_H
|
||||||
|
@ -1,6 +1,93 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <board/kbc.h>
|
#include <board/kbc.h>
|
||||||
|
|
||||||
void kbc_init(void) {
|
void kbc_init(void) {
|
||||||
*(KBC.irq) = 0;
|
*(KBC.irq) = 0;
|
||||||
*(KBC.control) = 0x48;
|
*(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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -31,8 +31,6 @@ uint8_t kbc_read(struct Kbc * kbc);
|
|||||||
void kbc_keyboard(struct Kbc * kbc, uint8_t data);
|
void kbc_keyboard(struct Kbc * kbc, uint8_t data);
|
||||||
void kbc_mouse(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(0x1300) KBHICR;
|
||||||
volatile uint8_t __xdata __at(0x1302) KBIRQR;
|
volatile uint8_t __xdata __at(0x1302) KBIRQR;
|
||||||
volatile uint8_t __xdata __at(0x1304) KBHISR;
|
volatile uint8_t __xdata __at(0x1304) KBHISR;
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include <ec/kbc.h>
|
#include <ec/kbc.h>
|
||||||
|
|
||||||
struct Kbc __code KBC = {
|
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) {
|
void kbc_mouse(struct Kbc * kbc, uint8_t data) {
|
||||||
*(kbc->mouse_out) = 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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user