2019-11-08 10:57:15 -07:00

83 lines
2.2 KiB
C

#include <stdio.h>
#include <arch/delay.h>
#include <board/kbc.h>
#include <board/kbscan.h>
#include <board/keymap.h>
bool kbscan_enabled = false;
uint8_t kbscan_layer = 0;
uint8_t __pdata kbscan_last[KM_OUT] = { 0 };
void kbscan_init(void) {
KSOCTRL = 0x05;
KSICTRLR = 0x04;
// Set all outputs to GPIO mode and low
KSOL = 0;
KSOH1 = 0;
KSOH2 = 0;
KSOLGCTRL = 0xFF;
KSOLGOEN = 0xFF;
KSOHGCTRL = 0xFF;
KSOHGOEN = 0xFF;
}
void kbscan_event(void) {
int i;
for (i = 0; i < KM_OUT; i++) {
KSOL = 0xFF;
KSOH1 = 0xFF;
KSOH2 = 0xFF;
if (i < 8) {
KSOL = ~(1 << i);
} else if (i < 16) {
KSOH1 = ~(1 << (i - 8));
} else if (i < 24) {
KSOH2 = ~(1 << (i - 16));
}
// TODO: figure out optimal delay
delay_ticks(1);
uint8_t new = ~KSI;
uint8_t last = kbscan_last[i];
if (new != last) {
int j;
for (j = 0; j < 8; j++) {
bool new_b = new & (1 << j);
bool last_b = last & (1 << j);
if (new_b != last_b) {
uint16_t key = keymap(i, j, kbscan_layer);
printf("KB %d, %d, %d = 0x%04X, %d\n", i, j, kbscan_layer, key, new_b);
if (kbscan_enabled && key) {
switch (key & 0xFF00) {
case K_E0:
printf(" E0\n");
kbc_keyboard(&KBC, 0xE0);
// Fall through
case 0x00:
if (!new_b) {
printf(" F0\n");
kbc_keyboard(&KBC, 0xF0);
}
printf(" %02X\n", (uint8_t)key);
kbc_keyboard(&KBC, (uint8_t)key);
break;
}
}
}
}
kbscan_last[i] = new;
}
}
KSOL = 0;
KSOH1 = 0;
KSOH2 = 0;
// TODO: figure out optimal delay
delay_ticks(1);
}