Browse Source

ch376: increased rate of keyboard scanining and considers all keycodes state transmitted

pull/592/head
Dean Netherton 1 year ago
parent
commit
ca6979d97e
  1. 44
      Source/HBIOS/ch376-native/base-drv/usb-init.c.s
  2. 140
      Source/HBIOS/ch376-native/keyboard/kyb-init.c.s
  3. 2
      Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h
  4. 12
      Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c
  5. 13
      Source/HBIOS/ch376kyb.asm

44
Source/HBIOS/ch376-native/base-drv/usb-init.c.s

@ -104,7 +104,7 @@ __chnative_init:
call _ch_cmd_reset_all call _ch_cmd_reset_all
;source-doc/base-drv/usb-init.c:30: delay_medium(); ;source-doc/base-drv/usb-init.c:30: delay_medium();
call _delay_medium call _delay_medium
;source-doc/base-drv/usb-init.c:32: if(forced) {
;source-doc/base-drv/usb-init.c:32: if (forced) {
bit 0,(ix+4) bit 0,(ix+4)
jr Z,l__chnative_init_00110 jr Z,l__chnative_init_00110
;source-doc/base-drv/usb-init.c:33: bool indicator = true; ;source-doc/base-drv/usb-init.c:33: bool indicator = true;
@ -112,7 +112,7 @@ __chnative_init:
;source-doc/base-drv/usb-init.c:34: print_string("\r\nCH376: *$"); ;source-doc/base-drv/usb-init.c:34: print_string("\r\nCH376: *$");
ld hl,usb_init_str_0 ld hl,usb_init_str_0
call _print_string call _print_string
;source-doc/base-drv/usb-init.c:35: while(!ch_probe()) {
;source-doc/base-drv/usb-init.c:35: while (!ch_probe()) {
l__chnative_init_00104: l__chnative_init_00104:
call _ch_probe call _ch_probe
ld a, l ld a, l
@ -143,30 +143,30 @@ l__chnative_init_00106:
call _print_string call _print_string
jr l__chnative_init_00111 jr l__chnative_init_00111
l__chnative_init_00110: l__chnative_init_00110:
;source-doc/base-drv/usb-init.c:48: if (!ch_probe()) {
;source-doc/base-drv/usb-init.c:47: if (!ch_probe()) {
call _ch_probe call _ch_probe
ld a, l ld a, l
or a or a
jr NZ,l__chnative_init_00108 jr NZ,l__chnative_init_00108
;source-doc/base-drv/usb-init.c:49: print_string("\r\nCH376: NOT PRESENT$");
;source-doc/base-drv/usb-init.c:48: print_string("\r\nCH376: NOT PRESENT$");
ld hl,usb_init_str_4 ld hl,usb_init_str_4
call _print_string call _print_string
;source-doc/base-drv/usb-init.c:50: return;
;source-doc/base-drv/usb-init.c:49: return;
jr l__chnative_init_00118 jr l__chnative_init_00118
l__chnative_init_00108: l__chnative_init_00108:
;source-doc/base-drv/usb-init.c:53: print_string("\r\nCH376: PRESENT (VER $");
;source-doc/base-drv/usb-init.c:52: print_string("\r\nCH376: PRESENT (VER $");
ld hl,usb_init_str_5 ld hl,usb_init_str_5
call _print_string call _print_string
l__chnative_init_00111: l__chnative_init_00111:
;source-doc/base-drv/usb-init.c:56: print_hex(ch_cmd_get_ic_version());
;source-doc/base-drv/usb-init.c:55: print_hex(ch_cmd_get_ic_version());
call _ch_cmd_get_ic_version call _ch_cmd_get_ic_version
call _print_hex call _print_hex
;source-doc/base-drv/usb-init.c:57: print_string("); $");
;source-doc/base-drv/usb-init.c:56: print_string("); $");
ld hl,usb_init_str_6 ld hl,usb_init_str_6
call _print_string call _print_string
;source-doc/base-drv/usb-init.c:59: usb_host_bus_reset();
;source-doc/base-drv/usb-init.c:58: usb_host_bus_reset();
call _usb_host_bus_reset call _usb_host_bus_reset
;source-doc/base-drv/usb-init.c:61: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) {
;source-doc/base-drv/usb-init.c:60: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) {
ld c,0x00 ld c,0x00
l__chnative_init_00116: l__chnative_init_00116:
bit 0,(ix+4) bit 0,(ix+4)
@ -186,31 +186,31 @@ l__chnative_init_00121:
xor 0x80 xor 0x80
l__chnative_init_00185: l__chnative_init_00185:
jp P, l__chnative_init_00114 jp P, l__chnative_init_00114
;source-doc/base-drv/usb-init.c:62: const uint8_t r = ch_very_short_wait_int_and_get_();
;source-doc/base-drv/usb-init.c:61: const uint8_t r = ch_very_short_wait_int_and_get_();
push bc push bc
call _ch_very_short_wait_int_and_get call _ch_very_short_wait_int_and_get
ld a, l ld a, l
pop bc pop bc
;source-doc/base-drv/usb-init.c:64: if (r == USB_INT_CONNECT) {
;source-doc/base-drv/usb-init.c:63: if (r == USB_INT_CONNECT) {
sub 0x81 sub 0x81
jr NZ,l__chnative_init_00117 jr NZ,l__chnative_init_00117
;source-doc/base-drv/usb-init.c:65: print_string("USB: CONNECTED$");
;source-doc/base-drv/usb-init.c:64: print_string("USB: CONNECTED$");
ld hl,usb_init_str_7 ld hl,usb_init_str_7
call _print_string call _print_string
;source-doc/base-drv/usb-init.c:67: enumerate_all_devices();
;source-doc/base-drv/usb-init.c:66: enumerate_all_devices();
call _enumerate_all_devices call _enumerate_all_devices
;source-doc/base-drv/usb-init.c:69: return;
;source-doc/base-drv/usb-init.c:68: return;
jr l__chnative_init_00118 jr l__chnative_init_00118
l__chnative_init_00117: l__chnative_init_00117:
;source-doc/base-drv/usb-init.c:61: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) {
;source-doc/base-drv/usb-init.c:60: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) {
inc c inc c
jr l__chnative_init_00116 jr l__chnative_init_00116
l__chnative_init_00114: l__chnative_init_00114:
;source-doc/base-drv/usb-init.c:73: print_string("USB: DISCONNECTED$");
;source-doc/base-drv/usb-init.c:72: print_string("USB: DISCONNECTED$");
ld hl,usb_init_str_8 ld hl,usb_init_str_8
call _print_string call _print_string
l__chnative_init_00118: l__chnative_init_00118:
;source-doc/base-drv/usb-init.c:74: }
;source-doc/base-drv/usb-init.c:73: }
inc sp inc sp
pop ix pop ix
ret ret
@ -250,29 +250,25 @@ usb_init_str_7:
usb_init_str_8: usb_init_str_8:
DEFM "USB: DISCONNECTED$" DEFM "USB: DISCONNECTED$"
DEFB 0x00 DEFB 0x00
;source-doc/base-drv/usb-init.c:77: void chnative_init_force(void) {
;source-doc/base-drv/usb-init.c:75: void chnative_init_force(void) { _chnative_init(true); }
; --------------------------------- ; ---------------------------------
; Function chnative_init_force ; Function chnative_init_force
; --------------------------------- ; ---------------------------------
_chnative_init_force: _chnative_init_force:
;source-doc/base-drv/usb-init.c:78: _chnative_init(true);
ld a,0x01 ld a,0x01
push af push af
inc sp inc sp
call __chnative_init call __chnative_init
inc sp inc sp
;source-doc/base-drv/usb-init.c:79: }
ret ret
;source-doc/base-drv/usb-init.c:81: void chnative_init(void) {
;source-doc/base-drv/usb-init.c:77: void chnative_init(void) { _chnative_init(false); }
; --------------------------------- ; ---------------------------------
; Function chnative_init ; Function chnative_init
; --------------------------------- ; ---------------------------------
_chnative_init: _chnative_init:
;source-doc/base-drv/usb-init.c:82: _chnative_init(false);
xor a xor a
push af push af
inc sp inc sp
call __chnative_init call __chnative_init
inc sp inc sp
;source-doc/base-drv/usb-init.c:83: }
ret ret

140
Source/HBIOS/ch376-native/keyboard/kyb-init.c.s

@ -41,6 +41,8 @@ _write_index:
DEFS 1 DEFS 1
_read_index: _read_index:
DEFS 1 DEFS 1
_previous_keyCodes:
DEFS 6
_active: _active:
DEFS 1 DEFS 1
_report: _report:
@ -145,7 +147,7 @@ kyb_init_str_2:
DEFB 0x0a DEFB 0x0a
DEFM "USB: KEYBOARD: NOT FOUND$" DEFM "USB: KEYBOARD: NOT FOUND$"
DEFB 0x00 DEFB 0x00
;source-doc/keyboard/kyb-init.c:47:
;source-doc/keyboard/kyb-init.c:49:
; --------------------------------- ; ---------------------------------
; Function keyboard_buf_put ; Function keyboard_buf_put
; --------------------------------- ; ---------------------------------
@ -153,24 +155,42 @@ _keyboard_buf_put:
push ix push ix
ld ix,0 ld ix,0
add ix,sp add ix,sp
;source-doc/keyboard/kyb-init.c:48: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) {
;source-doc/keyboard/kyb-init.c:50: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) {
ld a,(ix+5) ld a,(ix+5)
sub 0x80 sub 0x80
jr NC,l_keyboard_buf_put_00106
jr NC,l_keyboard_buf_put_00112
ld a,(ix+5) ld a,(ix+5)
or a or a
;source-doc/keyboard/kyb-init.c:49: if (key_code >= 0x80 || key_code == 0)
jr Z,l_keyboard_buf_put_00106
;source-doc/keyboard/kyb-init.c:51:
;source-doc/keyboard/kyb-init.c:51: if (key_code >= 0x80 || key_code == 0)
;source-doc/keyboard/kyb-init.c:54: // if already reported, just skip it
jr Z,l_keyboard_buf_put_00112
ld c,0x00
l_keyboard_buf_put_00110:
ld a, c
sub 0x06
jr NC,l_keyboard_buf_put_00106
;source-doc/keyboard/kyb-init.c:55: for (uint8_t i = 0; i < 6; i++)
ld b,0x00
ld hl,_previous_keyCodes
add hl, bc
ld a,(ix+5)
sub (hl)
;source-doc/keyboard/kyb-init.c:56: if (previous_keyCodes[i] == key_code)
jr Z,l_keyboard_buf_put_00112
;source-doc/keyboard/kyb-init.c:54: // if already reported, just skip it
inc c
jr l_keyboard_buf_put_00110
l_keyboard_buf_put_00106:
;source-doc/keyboard/kyb-init.c:58:
ld a,(_write_index) ld a,(_write_index)
inc a inc a
and 0x07 and 0x07
ld c, a ld c, a
;source-doc/keyboard/kyb-init.c:52: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK;
;source-doc/keyboard/kyb-init.c:59: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK;
ld a,(_read_index) ld a,(_read_index)
sub c sub c
jr Z,l_keyboard_buf_put_00106
;source-doc/keyboard/kyb-init.c:53: if (next_write_index != read_index) { // Check if buffer is not full
jr Z,l_keyboard_buf_put_00112
;source-doc/keyboard/kyb-init.c:60: if (next_write_index != read_index) { // Check if buffer is not full
ld de,_buffer+0 ld de,_buffer+0
ld hl,(_write_index) ld hl,(_write_index)
ld h,0x00 ld h,0x00
@ -178,7 +198,7 @@ _keyboard_buf_put:
add hl, de add hl, de
ld a,(ix+4) ld a,(ix+4)
ld (hl), a ld (hl), a
;source-doc/keyboard/kyb-init.c:54: buffer[write_index].modifier_keys = modifier_keys;
;source-doc/keyboard/kyb-init.c:61: buffer[write_index].modifier_keys = modifier_keys;
ld hl,(_write_index) ld hl,(_write_index)
ld h,0x00 ld h,0x00
add hl, hl add hl, hl
@ -187,30 +207,30 @@ _keyboard_buf_put:
inc de inc de
ld a,(ix+5) ld a,(ix+5)
ld (de), a ld (de), a
;source-doc/keyboard/kyb-init.c:55: buffer[write_index].key_code = key_code;
;source-doc/keyboard/kyb-init.c:62: buffer[write_index].key_code = key_code;
ld hl,_write_index ld hl,_write_index
ld (hl), c ld (hl), c
l_keyboard_buf_put_00106:
;source-doc/keyboard/kyb-init.c:57: }
l_keyboard_buf_put_00112:
;source-doc/keyboard/kyb-init.c:64: }
pop ix pop ix
ret ret
;source-doc/keyboard/kyb-init.c:59:
;source-doc/keyboard/kyb-init.c:66:
; --------------------------------- ; ---------------------------------
; Function keyboard_buf_size ; Function keyboard_buf_size
; --------------------------------- ; ---------------------------------
_keyboard_buf_size: _keyboard_buf_size:
;source-doc/keyboard/kyb-init.c:60: uint8_t keyboard_buf_size() __sdcccall(1) {
;source-doc/keyboard/kyb-init.c:67: uint8_t keyboard_buf_size() __sdcccall(1) {
ld a,(_write_index) ld a,(_write_index)
ld hl,_read_index ld hl,_read_index
sub (hl) sub (hl)
jr C,l_keyboard_buf_size_00102 jr C,l_keyboard_buf_size_00102
;source-doc/keyboard/kyb-init.c:61: if (write_index >= read_index)
;source-doc/keyboard/kyb-init.c:68: if (write_index >= read_index)
ld a,(_write_index) ld a,(_write_index)
ld hl,_read_index ld hl,_read_index
sub (hl) sub (hl)
jr l_keyboard_buf_size_00103 jr l_keyboard_buf_size_00103
l_keyboard_buf_size_00102: l_keyboard_buf_size_00102:
;source-doc/keyboard/kyb-init.c:63:
;source-doc/keyboard/kyb-init.c:70:
ld hl,_read_index ld hl,_read_index
ld c, (hl) ld c, (hl)
ld a,0x08 ld a,0x08
@ -219,9 +239,9 @@ l_keyboard_buf_size_00102:
ld c, (hl) ld c, (hl)
add a, c add a, c
l_keyboard_buf_size_00103: l_keyboard_buf_size_00103:
;source-doc/keyboard/kyb-init.c:64: return KEYBOARD_BUFFER_SIZE - read_index + write_index;
;source-doc/keyboard/kyb-init.c:71: return KEYBOARD_BUFFER_SIZE - read_index + write_index;
ret ret
;source-doc/keyboard/kyb-init.c:66:
;source-doc/keyboard/kyb-init.c:73:
; --------------------------------- ; ---------------------------------
; Function keyboard_buf_get_next ; Function keyboard_buf_get_next
; --------------------------------- ; ---------------------------------
@ -231,41 +251,41 @@ _keyboard_buf_get_next:
add ix,sp add ix,sp
push af push af
push af push af
;source-doc/keyboard/kyb-init.c:67: uint32_t keyboard_buf_get_next() {
;source-doc/keyboard/kyb-init.c:74: uint32_t keyboard_buf_get_next() {
ld a,(_write_index) ld a,(_write_index)
ld hl,_read_index ld hl,_read_index
sub (hl) sub (hl)
jr NZ,l_keyboard_buf_get_next_00102 jr NZ,l_keyboard_buf_get_next_00102
;source-doc/keyboard/kyb-init.c:68: if (write_index == read_index) // Check if buffer is empty
;source-doc/keyboard/kyb-init.c:75: if (write_index == read_index) // Check if buffer is empty
ld hl,0xff00 ld hl,0xff00
ld e, h ld e, h
ld d, h ld d, h
jr l_keyboard_buf_get_next_00103 jr l_keyboard_buf_get_next_00103
l_keyboard_buf_get_next_00102: l_keyboard_buf_get_next_00102:
;source-doc/keyboard/kyb-init.c:70:
;source-doc/keyboard/kyb-init.c:77:
ld bc,_buffer+0 ld bc,_buffer+0
ld hl,(_read_index) ld hl,(_read_index)
ld h,0x00 ld h,0x00
add hl, hl add hl, hl
add hl, bc add hl, bc
ld b, (hl) ld b, (hl)
;source-doc/keyboard/kyb-init.c:71: const uint8_t modifier_key = buffer[read_index].modifier_keys;
;source-doc/keyboard/kyb-init.c:78: const uint8_t modifier_key = buffer[read_index].modifier_keys;
inc hl inc hl
ld c, (hl) ld c, (hl)
;source-doc/keyboard/kyb-init.c:72: const uint8_t key_code = buffer[read_index].key_code;
;source-doc/keyboard/kyb-init.c:79: const uint8_t key_code = buffer[read_index].key_code;
ld hl,_read_index ld hl,_read_index
ld a, (hl) ld a, (hl)
inc a inc a
and 0x07 and 0x07
ld (hl), a ld (hl), a
;source-doc/keyboard/kyb-init.c:73: read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK;
;source-doc/keyboard/kyb-init.c:80: read_index = (read_index + 1) & KEYBOARD_BUFFER_SIZE_MASK;
push bc push bc
ld l, c ld l, c
ld a, b ld a, b
call _scancode_to_char call _scancode_to_char
ld e, a ld e, a
pop bc pop bc
;source-doc/keyboard/kyb-init.c:75: /* D = modifier, e-> char, H = 0, L=>code */
;source-doc/keyboard/kyb-init.c:82: /* D = modifier, e-> char, H = 0, L=>code */
xor a xor a
ld (ix-1),b ld (ix-1),b
xor a xor a
@ -282,34 +302,34 @@ l_keyboard_buf_get_next_00102:
pop hl pop hl
push hl push hl
l_keyboard_buf_get_next_00103: l_keyboard_buf_get_next_00103:
;source-doc/keyboard/kyb-init.c:76: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code;
;source-doc/keyboard/kyb-init.c:83: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code;
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
;source-doc/keyboard/kyb-init.c:78:
;source-doc/keyboard/kyb-init.c:85:
; --------------------------------- ; ---------------------------------
; Function keyboard_buf_flush ; Function keyboard_buf_flush
; --------------------------------- ; ---------------------------------
_keyboard_buf_flush: _keyboard_buf_flush:
;source-doc/keyboard/kyb-init.c:79: void keyboard_buf_flush() {
;source-doc/keyboard/kyb-init.c:86: void keyboard_buf_flush() {
ld hl,_write_index ld hl,_write_index
ld (hl),0x00 ld (hl),0x00
;source-doc/keyboard/kyb-init.c:80: write_index = 0;
;source-doc/keyboard/kyb-init.c:87: write_index = 0;
ld hl,_read_index ld hl,_read_index
ld (hl),0x00 ld (hl),0x00
;source-doc/keyboard/kyb-init.c:81: read_index = 0;
;source-doc/keyboard/kyb-init.c:88: read_index = 0;
ret ret
;source-doc/keyboard/kyb-init.c:87:
;source-doc/keyboard/kyb-init.c:94:
; --------------------------------- ; ---------------------------------
; Function keyboard_tick ; Function keyboard_tick
; --------------------------------- ; ---------------------------------
_keyboard_tick: _keyboard_tick:
;source-doc/keyboard/kyb-init.c:88: void keyboard_tick(void) {
;source-doc/keyboard/kyb-init.c:95: void keyboard_tick(void) {
ld hl,_in_critical_usb_section ld hl,_in_critical_usb_section
ld a, (hl) ld a, (hl)
or a or a
;source-doc/keyboard/kyb-init.c:89: if (is_in_critical_section())
ret NZ
;source-doc/keyboard/kyb-init.c:96: if (is_in_critical_section())
jr NZ,l_keyboard_tick_00111
;././source-doc/base-drv//ch376.h:110: #endif ;././source-doc/base-drv//ch376.h:110: #endif
ld l,0x0b ld l,0x0b
call _ch_command call _ch_command
@ -321,8 +341,8 @@ _keyboard_tick:
ld a,0x1f ld a,0x1f
ld bc,_CH376_DATA_PORT ld bc,_CH376_DATA_PORT
out (c),a out (c),a
;source-doc/keyboard/kyb-init.c:92: ch_configure_nak_retry_disable();
ld bc,_report
;source-doc/keyboard/kyb-init.c:99: ch_configure_nak_retry_disable();
ld bc,_report+0
ld hl, (_keyboard_config) ld hl, (_keyboard_config)
ld a,0x08 ld a,0x08
push af push af
@ -346,20 +366,47 @@ _keyboard_tick:
ld a,0xdf ld a,0xdf
ld bc,_CH376_DATA_PORT ld bc,_CH376_DATA_PORT
out (c),a out (c),a
;source-doc/keyboard/kyb-init.c:94: ch_configure_nak_retry_3s();
;source-doc/keyboard/kyb-init.c:101: ch_configure_nak_retry_3s();
ld hl,_result ld hl,_result
ld a, (hl) ld a, (hl)
;source-doc/keyboard/kyb-init.c:102: if (result == 0)
or a or a
ret NZ
;source-doc/keyboard/kyb-init.c:95: if (result == 0)
ld a, (_report + 2)
jr NZ,l_keyboard_tick_00111
ld c,a
l_keyboard_tick_00109:
ld a, c
sub 0x06
ret NC
;source-doc/keyboard/kyb-init.c:103: for (uint8_t i = 0; i < 6; i++) {
ld a,+((_report+2) & 0xFF)
add a, c
ld e, a
ld a,+((_report+2) / 256)
adc a,0x00
ld d, a
ld a, (de)
ld hl,_report ld hl,_report
ld c, (hl)
ld b, (hl)
push bc
push de
ld c,b
ld b,a ld b,a
push bc push bc
call _keyboard_buf_put call _keyboard_buf_put
pop af pop af
;source-doc/keyboard/kyb-init.c:96: keyboard_buf_put(report.bModifierKeys, report.keyCode[0]);
pop de
pop bc
;source-doc/keyboard/kyb-init.c:104: keyboard_buf_put(report.bModifierKeys, report.keyCode[i]);
ld b,0x00
ld hl,_previous_keyCodes
add hl, bc
ld a, (de)
ld (hl), a
;source-doc/keyboard/kyb-init.c:102: if (result == 0)
inc c
jr l_keyboard_tick_00109
l_keyboard_tick_00111:
;source-doc/keyboard/kyb-init.c:106: }
ret ret
_keyboard_config: _keyboard_config:
DEFW +0x0000 DEFW +0x0000
@ -384,6 +431,13 @@ _write_index:
DEFB +0x00 DEFB +0x00
_read_index: _read_index:
DEFB +0x00 DEFB +0x00
_previous_keyCodes:
DEFB +0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00
DEFB 0x00
_active: _active:
DEFB +0x00 DEFB +0x00
_report: _report:

2
Source/HBIOS/ch376-native/source-doc/base-drv/dev_transfers.h

@ -37,7 +37,7 @@ typedef struct {
typedef struct { typedef struct {
COMMON_DEVICE_CONFIG // bytes: 0-2 COMMON_DEVICE_CONFIG // bytes: 0-2
endpoint_param endpoints[3]; // bytes: 3-5, 6-8, 9-11 bulk in/out and interrupt
endpoint_param endpoints[3]; // bytes: 3-5, 6-8, 9-11 bulk in/out and interrupt
uint32_t current_lba; // bytes 12-15 uint32_t current_lba; // bytes 12-15
uint8_t drive_index; // byte 16 uint8_t drive_index; // byte 16
} device_config_storage; } device_config_storage;

12
Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c

@ -45,10 +45,17 @@ keyboard_event buffer[KEYBOARD_BUFFER_SIZE] = {{0}};
uint8_t write_index = 0; uint8_t write_index = 0;
uint8_t read_index = 0; uint8_t read_index = 0;
uint8_t previous_keyCodes[6] = {0};
void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) { void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) {
if (key_code >= 0x80 || key_code == 0) if (key_code >= 0x80 || key_code == 0)
return; // ignore ??? return; // ignore ???
// if already reported, just skip it
for (uint8_t i = 0; i < 6; i++)
if (previous_keyCodes[i] == key_code)
return;
uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK; uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK;
if (next_write_index != read_index) { // Check if buffer is not full if (next_write_index != read_index) { // Check if buffer is not full
buffer[write_index].modifier_keys = modifier_keys; buffer[write_index].modifier_keys = modifier_keys;
@ -93,5 +100,8 @@ void keyboard_tick(void) {
result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)report, 8); result = usbdev_dat_in_trnsfer_0((device_config *)keyboard_config, (uint8_t *)report, 8);
ch_configure_nak_retry_3s(); ch_configure_nak_retry_3s();
if (result == 0) if (result == 0)
keyboard_buf_put(report.bModifierKeys, report.keyCode[0]);
for (uint8_t i = 0; i < 6; i++) {
keyboard_buf_put(report.bModifierKeys, report.keyCode[i]);
previous_keyCodes[i] = report.keyCode[i];
}
} }

13
Source/HBIOS/ch376kyb.asm

@ -16,12 +16,8 @@
#include "./ch376-native/keyboard.s" #include "./ch376-native/keyboard.s"
; COUNT FOR INTERRUPT HANDLER TO TRIGGER KEYBOARD SCANNER (EG: SCAN KEYBOARD ONLY EVERY 3RD INTERRUPT (3/60))
SCAN_INT_PERIOD: .EQU 3
; VDP-INTERUPT COUNTER THAT COUNTS FROM SCAN_INT_PERIOD TO 0, WHEN IT REACHES ZERO, THE
; KEYBOARD MATRIX IS SCANNED, AND THE COUNTERS IS RESET AT SCAN_INT_PERIOD
UKY_SCNCNT: .DB SCAN_INT_PERIOD
; COUNT FOR INTERRUPT HANDLER TO TRIGGER KEYBOARD SCANNER (EG: SCAN KEYBOARD ONLY EVERY 2ND INTERRUPT (2/60))
SCAN_INT_PERIOD: .EQU 2
.DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
.DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 .DB 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
@ -52,10 +48,11 @@ CHUKB_INIT:
JP _keyboard_init JP _keyboard_init
CHUKB_TICK: CHUKB_TICK:
LD A, (UKY_SCNCNT) ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS.
LD A, SCAN_INT_PERIOD ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS.
UKY_SCNCNT .EQU $ - 1
DEC A DEC A
LD (UKY_SCNCNT), A LD (UKY_SCNCNT), A
JR NZ, VEC_CHUKB_TICK
JP NZ, HB_TICK
LD A, SCAN_INT_PERIOD LD A, SCAN_INT_PERIOD
LD (UKY_SCNCNT), A LD (UKY_SCNCNT), A

Loading…
Cancel
Save