Send keypresses over ps2
This commit is contained in:
@ -1,8 +1,12 @@
|
|||||||
#ifndef _BOARD_KBSCAN_H
|
#ifndef _BOARD_KBSCAN_H
|
||||||
#define _BOARD_KBSCAN_H
|
#define _BOARD_KBSCAN_H
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include <ec/kbscan.h>
|
#include <ec/kbscan.h>
|
||||||
|
|
||||||
|
extern bool kbscan_enabled;
|
||||||
|
|
||||||
void kbscan_init(void);
|
void kbscan_init(void);
|
||||||
void kbscan_event(void);
|
void kbscan_event(void);
|
||||||
|
|
||||||
|
@ -3,6 +3,13 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
// Keymap output pins
|
||||||
|
#define KM_OUT 16
|
||||||
|
// Keymap input pins
|
||||||
|
#define KM_IN 8
|
||||||
|
// Keymap layers (normal, Fn)
|
||||||
|
#define KM_LAY 2
|
||||||
|
|
||||||
uint16_t keymap(int output, int input, int layer);
|
uint16_t keymap(int output, int input, int layer);
|
||||||
|
|
||||||
// See http://www.techtoys.com.hk/Downloads/Download/Microchip/PS2_driver/ScanCode.pdf
|
// See http://www.techtoys.com.hk/Downloads/Download/Microchip/PS2_driver/ScanCode.pdf
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <board/kbc.h>
|
#include <board/kbc.h>
|
||||||
|
#include <board/kbscan.h>
|
||||||
|
|
||||||
void kbc_init(void) {
|
void kbc_init(void) {
|
||||||
*(KBC.irq) = 0;
|
*(KBC.irq) = 0;
|
||||||
@ -77,16 +78,17 @@ void kbc_event(struct Kbc * kbc) {
|
|||||||
break;
|
break;
|
||||||
case 0xF4:
|
case 0xF4:
|
||||||
printf(" enable scanning\n");
|
printf(" enable scanning\n");
|
||||||
|
kbscan_enabled = true;
|
||||||
kbc_keyboard(kbc, 0xFA);
|
kbc_keyboard(kbc, 0xFA);
|
||||||
break;
|
break;
|
||||||
case 0xF5:
|
case 0xF5:
|
||||||
printf(" disable scanning\n");
|
printf(" disable scanning\n");
|
||||||
|
kbscan_enabled = false;
|
||||||
kbc_keyboard(kbc, 0xFA);
|
kbc_keyboard(kbc, 0xFA);
|
||||||
break;
|
break;
|
||||||
case 0xFF:
|
case 0xFF:
|
||||||
printf(" self test\n");
|
printf(" self test\n");
|
||||||
kbc_keyboard(kbc, 0xFA);
|
kbc_keyboard(kbc, 0xFA);
|
||||||
while (kbc_status(kbc) & KBC_STS_OBF) {}
|
|
||||||
// Yep, everything is still good, I promise
|
// Yep, everything is still good, I promise
|
||||||
kbc_keyboard(kbc, 0xAA);
|
kbc_keyboard(kbc, 0xAA);
|
||||||
break;
|
break;
|
||||||
|
@ -1,59 +1,79 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <arch/delay.h>
|
#include <arch/delay.h>
|
||||||
|
#include <board/kbc.h>
|
||||||
#include <board/kbscan.h>
|
#include <board/kbscan.h>
|
||||||
#include <board/keymap.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) {
|
void kbscan_init(void) {
|
||||||
KSOCTRL = 0x05;
|
KSOCTRL = 0x05;
|
||||||
KSICTRLR = 0x04;
|
KSICTRLR = 0x04;
|
||||||
|
|
||||||
// Set all outputs to GPIO mode and low
|
// Set all outputs to GPIO mode and low
|
||||||
KSOH2 = 0;
|
|
||||||
KSOH1 = 0;
|
|
||||||
KSOL = 0;
|
KSOL = 0;
|
||||||
KSOHGCTRL = 0xFF;
|
KSOH1 = 0;
|
||||||
KSOHGOEN = 0xFF;
|
KSOH2 = 0;
|
||||||
KSOLGCTRL = 0xFF;
|
KSOLGCTRL = 0xFF;
|
||||||
KSOLGOEN = 0xFF;
|
KSOLGOEN = 0xFF;
|
||||||
|
KSOHGCTRL = 0xFF;
|
||||||
|
KSOHGOEN = 0xFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
void kbscan_event(void) {
|
void kbscan_event(void) {
|
||||||
static int layer = 0;
|
int i;
|
||||||
|
for (i = 0; i < KM_OUT; i++) {
|
||||||
static uint8_t last = 0xFF;
|
KSOL = 0xFF;
|
||||||
uint8_t new = KSI;
|
KSOH1 = 0xFF;
|
||||||
if (new != last) {
|
KSOH2 = 0xFF;
|
||||||
printf("KSI %02X\n", new);
|
if (i < 8) {
|
||||||
|
KSOL = ~(1 << i);
|
||||||
int i;
|
} else if (i < 16) {
|
||||||
for (i = 0; i <= 15; i++) {
|
KSOH1 = ~(1 << (i - 8));
|
||||||
if (i < 8) {
|
} else if (i < 24) {
|
||||||
KSOL = ~(1 << i);
|
KSOH2 = ~(1 << (i - 16));
|
||||||
KSOH1 = 0xFF;
|
|
||||||
} else {
|
|
||||||
KSOL = 0xFF;
|
|
||||||
KSOH1 = ~(1 << (i - 8));
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: figure out optimal delay
|
|
||||||
delay_ms(1);
|
|
||||||
|
|
||||||
uint8_t ksi = KSI;
|
|
||||||
|
|
||||||
int j;
|
|
||||||
for (j = 0; j < 8; j++) {
|
|
||||||
if (!(ksi & (1 << j))) {
|
|
||||||
uint16_t key = keymap(i, j, layer);
|
|
||||||
printf(" %d, %d, %d = 0x%04X\n", i, j, layer, key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
KSOL = 0;
|
// TODO: figure out optimal delay
|
||||||
KSOH1 = 0;
|
delay_ticks(1);
|
||||||
|
|
||||||
delay_ms(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(" %d, %d, %d = 0x%04X, %d\n", i, j, kbscan_layer, key, new_b);
|
||||||
|
if (kbscan_enabled && key) {
|
||||||
|
switch (key & 0xFF00) {
|
||||||
|
case K_E0:
|
||||||
|
kbc_keyboard(&KBC, 0xE0);
|
||||||
|
// Fall through
|
||||||
|
case 0x00:
|
||||||
|
if (!new_b) {
|
||||||
|
kbc_keyboard(&KBC, 0xF0);
|
||||||
|
}
|
||||||
|
kbc_keyboard(&KBC, (uint8_t)key);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
kbscan_last[i] = new;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
last = new;
|
|
||||||
|
KSOL = 0;
|
||||||
|
KSOH1 = 0;
|
||||||
|
KSOH2 = 0;
|
||||||
|
|
||||||
|
// TODO: figure out optimal delay
|
||||||
|
delay_ticks(1);
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,5 @@
|
|||||||
#include <board/keymap.h>
|
#include <board/keymap.h>
|
||||||
|
|
||||||
// Keymap output pins
|
|
||||||
#define KM_OUT 16
|
|
||||||
// Keymap input pins
|
|
||||||
#define KM_IN 8
|
|
||||||
// Keymap layers (normal, Fn)
|
|
||||||
#define KM_LAY 2
|
|
||||||
|
|
||||||
uint16_t __code KEYMAP[KM_OUT][KM_IN][KM_LAY] = {
|
uint16_t __code KEYMAP[KM_OUT][KM_IN][KM_LAY] = {
|
||||||
{ // 0
|
{ // 0
|
||||||
{0, 0}, // 0
|
{0, 0}, // 0
|
||||||
|
@ -18,9 +18,13 @@ 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) {
|
||||||
|
//TODO: use timeout
|
||||||
|
while (kbc_status(kbc) & KBC_STS_OBF) {}
|
||||||
*(kbc->keyboard_out) = data;
|
*(kbc->keyboard_out) = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void kbc_mouse(struct Kbc * kbc, uint8_t data) {
|
void kbc_mouse(struct Kbc * kbc, uint8_t data) {
|
||||||
|
//TODO: use timeout
|
||||||
|
while (kbc_status(kbc) & KBC_STS_OBF) {}
|
||||||
*(kbc->mouse_out) = data;
|
*(kbc->mouse_out) = data;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user