From fd655b48391bd717390c35a6d70284db09474c84 Mon Sep 17 00:00:00 2001 From: pepepper Date: Mon, 4 Jan 2021 23:04:16 +0900 Subject: [PATCH] add new key scanner for SH3 --- README.md | 3 +- read_keys_SH3.c | 226 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 read_keys_SH3.c diff --git a/README.md b/README.md index 282bb9e..913c3f2 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,8 @@ - [read_keys.py](read_keys.py) Initialize the keyboard MCU and poll key code - - [read_keys_SH3.py](read_keys_SH3.py) Scan key matrix and return key name + - [read_keys_SH3.py](read_keys_SH3.py) Scan key matrix and return key name(deprecated) + - [read_keys_SH3.c](read_keys_SH3.c) Scan key matrix and return key name rewritten with C. nice performance ### License diff --git a/read_keys_SH3.c b/read_keys_SH3.c new file mode 100644 index 0000000..e406b77 --- /dev/null +++ b/read_keys_SH3.c @@ -0,0 +1,226 @@ +#include +#include +#include +#include +#include +#include + +#define PINCTRL_REG_BASE 0x80018000 + +#define PINCTRL_BANK2_PULLUP_REG 0x620 +#define PINCTRL_BANK4_PULLUP_REG 0x640 + +#define PINCTRL_DRIVE10_REG 0x3A0 +#define PINCTRL_DRIVE17_REG 0x410 + +#define PINCTRL_BANK2_OUTPUT_REG 0x720 +#define PINCTRL_BANK4_OUTPUT_REG 0x740 + +#define PINCTRL_BANK2_OUTPUT_ENABLE_REG 0xB20 +#define PINCTRL_BANK4_OUTPUT_ENABLE_REG 0xB40 + +#define PINCTRL_BANK4_INPUT_REG 0x940 + +#define REG_SET 0x4 +#define REG_CLR 0x8 + +void keyread(void *mapped_addr, char *keys) { + unsigned int in; + struct timespec wait = {0, 100000}; + // Bank2 Pin16~21 + for (int i = 0; i < 7; i++) { + *(volatile unsigned int *)(mapped_addr + PINCTRL_BANK2_OUTPUT_REG + REG_SET) = 0x10000 << i; + nanosleep(&wait, NULL); + in = *(volatile unsigned int *)(mapped_addr + PINCTRL_BANK4_INPUT_REG); + in = ~((in ^ (in >> 1)) & 0x1f ^ (in >> 1)) & 0x7f; + *(volatile unsigned int *)(mapped_addr + PINCTRL_BANK2_OUTPUT_REG + REG_CLR) = 0x10000 << i; + nanosleep(&wait, NULL); + keys[i] = (char)in; + } + // Bank4 Pin8 + *(volatile unsigned int *)(mapped_addr + PINCTRL_BANK4_OUTPUT_REG + REG_SET) = 0x100; + nanosleep(&wait, NULL); + in = *(volatile unsigned int *)(mapped_addr + PINCTRL_BANK4_INPUT_REG); + in = ~((in ^ (in >> 1)) & 0x1f ^ (in >> 1)) & 0x7f; + *(volatile unsigned int *)(mapped_addr + PINCTRL_BANK4_OUTPUT_REG + REG_CLR) = 0x100; + nanosleep(&wait, NULL); + keys[6] = (char)in; +} + +int main() { + /* init */ + int fd = open("/dev/mem", O_RDWR | O_SYNC); + if (fd < 0) { + printf("failed to open /dev/mem"); + return -1; + } + + void *mapped_addr = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, PINCTRL_REG_BASE); + if (mapped_addr == MAP_FAILED) { + printf("failed to mapping addr"); + close(fd); + return -1; + } + + /* GPIO setup */ + *(volatile unsigned int *)(mapped_addr + PINCTRL_DRIVE10_REG + REG_SET) = 0x00444444; + *(volatile unsigned int *)(mapped_addr + PINCTRL_DRIVE17_REG + REG_SET) = 0x44444444; + *(volatile unsigned int *)(mapped_addr + PINCTRL_BANK2_PULLUP_REG + REG_SET) = 0x003F03FF; + *(volatile unsigned int *)(mapped_addr + PINCTRL_BANK2_OUTPUT_REG + REG_SET) = 0x00000000; + *(volatile unsigned int *)(mapped_addr + PINCTRL_BANK4_OUTPUT_REG + REG_SET) = 0x00000000; + *(volatile unsigned int *)(mapped_addr + PINCTRL_BANK2_OUTPUT_ENABLE_REG + REG_SET) = + 0x0F3FF5FF; + *(volatile unsigned int *)(mapped_addr + PINCTRL_BANK4_OUTPUT_ENABLE_REG + REG_SET) = + 0x0001FF20; + + /* read */ + char keys[7], oldkeys[7] = {0}; + while (1) { + keyread(mapped_addr, keys); + if (memcmp(keys, oldkeys, sizeof(keys))) { + memcpy(oldkeys, keys, sizeof(keys)); + continue; + } + unsigned char temp = 0; + for (int i = 0; i < 7; i++) { + temp |= keys[i]; + } + if (temp == 0) + continue; + // key decode + if (temp & 0x1) + for (int i = 0; i < 7; i++) + if ((keys[i] & 0x1) == 0) { + if (i == 0) + printf("英和和英 "); + if (i == 1) + printf("調べる "); + if (i == 2) + printf("国語漢字 "); + if (i == 3) + printf("My辞書 "); + if (i == 4) + printf("履歴/しおり "); + if (i == 5) + printf("マーカーテスト "); + if (i == 6) + printf("HOME "); + } + if (temp & 0x2) + for (int i = 0; i < 7; i++) + if ((keys[i] & 0x2) == 0) { + if (i == 0) + printf("Q "); + if (i == 1) + printf("W "); + if (i == 2) + printf("E "); + if (i == 3) + printf("T "); + if (i == 4) + printf("Y "); + if (i == 5) + printf("U "); + if (i == 6) + printf("I "); + } + if (temp & 0x4) + for (int i = 0; i < 7; i++) + if ((keys[i] & 0x4) == 0) { + if (i == 0) + printf("A "); + if (i == 1) + printf("S "); + if (i == 2) + printf("D "); + if (i == 3) + printf("G "); + if (i == 4) + printf("H "); + if (i == 5) + printf("O "); + if (i == 6) + printf("P "); + } + if (temp & 0x8) + for (int i = 0; i < 7; i++) + if ((keys[i] & 0x8) == 0) { + if (i == 0) + printf("Z "); + if (i == 1) + printf("X "); + if (i == 2) + printf("C "); + if (i == 3) + printf("B "); + if (i == 4) + printf("J "); + if (i == 5) + printf("K "); + if (i == 6) + printf("L "); + } + if (temp & 0x10) + for (int i = 0; i < 7; i++) + if ((keys[i] & 0x10) == 0) { + if (i == 0) + printf("Shift "); + if (i == 1) + printf("R "); + if (i == 2) + printf("F "); + if (i == 3) + printf("記号 "); + if (i == 4) + printf("N "); + if (i == 5) + printf("M "); + if (i == 6) + printf("- "); + } + if (temp & 0x20) + for (int i = 0; i < 7; i++) + if ((keys[i] & 0x20) == 0) { + if (i == 0) + printf("V "); + if (i == 1) + printf("PageUp "); + if (i == 2) + printf("Space "); + if (i == 3) + printf("Left "); + if (i == 4) + printf("Up "); + if (i == 5) + printf("Down "); + if (i == 6) + printf("Right "); + } + if (temp & 0x40) + for (int i = 0; i < 7; i++) + if ((keys[i] & 0x40) == 0) { + if (i == 0) + printf("文字切替 "); + if (i == 1) + printf("PageDown "); + if (i == 2) + printf("ツール "); + if (i == 3) + printf("Esc "); + if (i == 4) + printf("Enter "); + if (i == 5) + printf("? "); + if (i == 6) + printf("BackSpace "); + } + printf("\nkeys = 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x\n", keys[0], keys[1], + keys[2], keys[3], keys[4], keys[5], keys[6]); + memcpy(oldkeys, keys, sizeof(keys)); + } + + /* deinit */ + munmap(mapped_addr, 4096); + close(fd); + return 0; +}