40 lines
849 B
C
40 lines
849 B
C
#include <ec/kbc.h>
|
|
|
|
struct Kbc __code KBC = {
|
|
.control = &KBHICR,
|
|
.irq = &KBIRQR,
|
|
.status = &KBHISR,
|
|
.keyboard_out = &KBHIKDOR,
|
|
.mouse_out = &KBHIMDOR,
|
|
.data_in = &KBHIDIR,
|
|
};
|
|
|
|
uint8_t kbc_status(struct Kbc * kbc) {
|
|
return *(kbc->status);
|
|
}
|
|
|
|
uint8_t kbc_read(struct Kbc * kbc) {
|
|
return *(kbc->data_in);
|
|
}
|
|
|
|
|
|
static bool kbc_wait(struct Kbc * kbc, int timeout) {
|
|
while (kbc_status(kbc) & KBC_STS_OBF) {
|
|
if (timeout == 0) return false;
|
|
timeout -= 1;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool kbc_keyboard(struct Kbc * kbc, uint8_t data, int timeout) {
|
|
if (!kbc_wait(kbc, timeout)) return false;
|
|
*(kbc->keyboard_out) = data;
|
|
return true;
|
|
}
|
|
|
|
bool kbc_mouse(struct Kbc * kbc, uint8_t data, int timeout) {
|
|
if (!kbc_wait(kbc, timeout)) return false;
|
|
*(kbc->mouse_out) = data;
|
|
return true;
|
|
}
|