archimedes: Add mouse support

This commit is contained in:
tmk 2023-10-25 17:56:58 +09:00
parent 06f1bded16
commit f61b50395a
3 changed files with 90 additions and 12 deletions

View file

@ -26,6 +26,7 @@ SOFTWARE.
#include "matrix.h" #include "matrix.h"
#include "wait.h" #include "wait.h"
#include "timer.h" #include "timer.h"
#include "host.h"
#include "debug.h" #include "debug.h"
#include "print.h" #include "print.h"
@ -47,6 +48,10 @@ SOFTWARE.
#define SMAK 0x33 #define SMAK 0x33
#define KDDA 0xC0 #define KDDA 0xC0
#define KUDA 0xD0 #define KUDA 0xD0
// mouse data: 0b0xxx xxxx(0x00 - 0x7F)
// mouse delta: -64 - 63
#define MDAT_MIN 0x00
#define MDAT_MAX 0x7F
// Archimedes LED // Archimedes LED
#define ARC_LED_CAPS_LOCK 0 #define ARC_LED_CAPS_LOCK 0
@ -84,6 +89,8 @@ void matrix_init(void)
{ {
//debug_enable = true; //debug_enable = true;
//debug_matrix = true; //debug_matrix = true;
//debug_keyboard = true;
//debug_mouse = true;
matrix_clear(); matrix_clear();
serial_init(); serial_init();
@ -105,6 +112,7 @@ static enum {
INIT, INIT,
SCAN, SCAN,
WAIT_KEY_COL, WAIT_KEY_COL,
WAIT_MDAT_Y,
} state = INIT; } state = INIT;
static int16_t check_reply(void) static int16_t check_reply(void)
@ -121,14 +129,18 @@ static int16_t check_reply(void)
static void send_cmd(uint8_t cmd) static void send_cmd(uint8_t cmd)
{ {
xprintf("s%02X ", cmd); xprintf("s%02X ", cmd);
uint8_t sreg = SREG;
cli(); cli();
serial_send(cmd); serial_send(cmd);
sei(); SREG = sreg;
} }
uint8_t matrix_scan(void) uint8_t matrix_scan(void)
{ {
static uint8_t key; static uint8_t key;
static uint8_t mouse_btn = 0;
static int8_t mouse_x = 0;
static int8_t mouse_y = 0;
switch (state) { switch (state) {
case INIT: case INIT:
@ -184,6 +196,14 @@ uint8_t matrix_scan(void)
send_cmd(BACK); send_cmd(BACK);
state = WAIT_KEY_COL; state = WAIT_KEY_COL;
break; break;
case MDAT_MIN ... MDAT_MAX:
// sign bit for int8_t
if (d & 0x40) d |= 0x80;
mouse_x = d;
// ack
send_cmd(BACK);
state = WAIT_MDAT_Y;
break;
default: default:
state = INIT; state = INIT;
break; break;
@ -208,11 +228,38 @@ uint8_t matrix_scan(void)
send_cmd(SMAK); send_cmd(SMAK);
state = SCAN; state = SCAN;
// TODO: make/brak key
if (key & 0x80) { if (key & 0x80) {
// break
switch (key & 0x7F) {
case 0x70: // mouse SW1
case 0x71: // mouse SW2
case 0x72: // mouse SW3
mouse_btn &= ~(1 << (key & 3));
report_mouse_t mouse_report = {};
mouse_report.buttons = mouse_btn;
host_mouse_send(&mouse_report);
break;
default:
matrix[ROW(key)] &= ~(1 << COL(key)); matrix[ROW(key)] &= ~(1 << COL(key));
break;
}
} else { } else {
// make
switch (key & 0x7F) {
case 0x70: // mouse SW1
case 0x71: // mouse SW2
case 0x72: // mouse SW3
mouse_btn |= (1 << (key & 3));
report_mouse_t mouse_report = {};
mouse_report.buttons = mouse_btn;
host_mouse_send(&mouse_report);
break;
default:
matrix[ROW(key)] |= (1 << COL(key)); matrix[ROW(key)] |= (1 << COL(key));
break;
}
} }
xprintf("[k%02X] ", key); xprintf("[k%02X] ", key);
break; break;
@ -223,6 +270,37 @@ uint8_t matrix_scan(void)
} }
break; break;
} }
case WAIT_MDAT_Y: {
int16_t d;
d = check_reply();
switch (d) {
case -1:
// no reply
break;
case MDAT_MIN ... MDAT_MAX:
// sign bit for int8_t
if (d & 0x40) d |= 0x80;
mouse_y = d;
xprintf("[m%02d,%02d] ", mouse_x, mouse_y);
report_mouse_t mouse_report = {};
mouse_report.buttons = mouse_btn;
// TODO: move direction is not confirmed
mouse_report.x = mouse_x;
mouse_report.y = mouse_y;
host_mouse_send(&mouse_report);
// ack
wait_us(100);
send_cmd(SMAK);
state = SCAN;
break;
default:
state = INIT;
break;
}
break;
}
} }
// DEBUG // DEBUG
@ -245,5 +323,5 @@ void led_set(uint8_t usb_led)
if (usb_led & (1<<USB_LED_NUM_LOCK)) arc_led |= (1<<ARC_LED_NUM_LOCK); if (usb_led & (1<<USB_LED_NUM_LOCK)) arc_led |= (1<<ARC_LED_NUM_LOCK);
if (usb_led & (1<<USB_LED_CAPS_LOCK)) arc_led |= (1<<ARC_LED_CAPS_LOCK); if (usb_led & (1<<USB_LED_CAPS_LOCK)) arc_led |= (1<<ARC_LED_CAPS_LOCK);
if (usb_led & (1<<USB_LED_SCROLL_LOCK)) arc_led |= (1<<ARC_LED_SCROLL_LOCK); if (usb_led & (1<<USB_LED_SCROLL_LOCK)) arc_led |= (1<<ARC_LED_SCROLL_LOCK);
xprintf("LED:%02X:%02X ", usb_led, arc_led); xprintf("[LED:%02X:%02X] ", usb_led, arc_led);
} }

View file

@ -24,9 +24,9 @@ const action_t actionmaps[][UNIMAP_ROWS][UNIMAP_COLS] PROGMEM = {
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,
GRV, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, GRV, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,
ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS,
CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, INS, TRNS, TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, CAPS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,PSCR,SLCK,PAUS,UP, INS, TRNS, TRNS,TRNS,TRNS, TRNS,MS_U,TRNS,TRNS,
TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,TRNS,TRNS,HOME,PGUP,LEFT,RGHT, TRNS,TRNS, TRNS,TRNS,TRNS,TRNS, TRNS,VOLD,VOLU,MUTE,TRNS,TRNS,TRNS,TRNS,HOME,PGUP,LEFT,RGHT, TRNS,TRNS, MS_L,TRNS,MS_R,TRNS,
TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,END, PGDN,DOWN, TRNS,TRNS, PGUP, TRNS,TRNS,TRNS,TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,TRNS,END, PGDN,DOWN, TRNS,TRNS, PGUP, TRNS,MS_D,TRNS,BTN3,
TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, HOME,PGDN,END, TRNS,TRNS,TRNS TRNS,TRNS,TRNS,TRNS, TRNS, TRNS,TRNS,TRNS,TRNS,TRNS,TRNS, HOME,PGDN,END, BTN1,BTN2,TRNS
), ),
}; };

View file

@ -30,9 +30,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
* |-----------------------------------------------------------| |-----------| |---------------| * |-----------------------------------------------------------| |-----------| |---------------|
* |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|Cpy|PgD| | 7| 8| 9| -| * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| \ | |Del|Cpy|PgD| | 7| 8| 9| -|
* |-----------------------------------------------------------| `-----------' |---------------| * |-----------------------------------------------------------| `-----------' |---------------|
* |CapsL | A| S| D| F| G| H| J| K| L| ;| '| ^a|Entr| | 4| 5| 6| +| * |CapsL | A| S| D| F| G| H| J| K| L| ;| '| Enter | | 4| 5| 6| +|
* |-----------------------------------------------------------| ,---. |---------------| * |-----------------------------------------------------------| ,---. |---------------|
* |Shift | Z| X| C| V| B| N| M| ,| .| /| RO|Shift | |Up | | 1| 2| 3| | * |Shift | Z| X| C| V| B| N| M| ,| .| /| Shift | |Up | | 1| 2| 3| |
* |-----------------------------------------------------------| ,-----------. |-----------|Ent| * |-----------------------------------------------------------| ,-----------. |-----------|Ent|
* | Ctrl| | Alt | Space | Alt | | Ctrl| |Lef|Dow|Rig| | 0| .| | * | Ctrl| | Alt | Space | Alt | | Ctrl| |Lef|Dow|Rig| | 0| .| |
* `-----' `---------------------------------------' `-----' `-----------' `---------------' * `-----' `---------------------------------------' `-----' `-----------' `---------------'
@ -67,7 +67,7 @@ const uint8_t PROGMEM unimap_trans[MATRIX_ROWS][MATRIX_COLS] = {
UNIMAP_RSFT, UNIMAP_UP, UNIMAP_P1, UNIMAP_P2, UNIMAP_P3, UNIMAP_CAPS, UNIMAP_LALT, UNIMAP_SPC }, /* 58-5F */ UNIMAP_RSFT, UNIMAP_UP, UNIMAP_P1, UNIMAP_P2, UNIMAP_P3, UNIMAP_CAPS, UNIMAP_LALT, UNIMAP_SPC }, /* 58-5F */
{ UNIMAP_RALT, UNIMAP_RCTL, UNIMAP_LEFT, UNIMAP_DOWN, UNIMAP_RIGHT,UNIMAP_P0, UNIMAP_PDOT, UNIMAP_PENT, /* 60-67 */ { UNIMAP_RALT, UNIMAP_RCTL, UNIMAP_LEFT, UNIMAP_DOWN, UNIMAP_RIGHT,UNIMAP_P0, UNIMAP_PDOT, UNIMAP_PENT, /* 60-67 */
UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* 68-6F */ UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* 68-6F */
{ UNIMAP_VOLD, UNIMAP_VOLU, UNIMAP_MUTE, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, /* 70-77 */ { UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, /* 70-77 */
UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* 78-7F */ UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO, UNIMAP_NO }, /* 78-7F */
}; };