Browse Source

ch376-native: fixed issue with TMSMODE_MSXUKY selected when no usb keyboard is present on boot

The TMS driver would always install a USB keyboard pooling interrupt, despite no keyboard present

This would load the CPU and prevent other I/O operations
pull/592/head
Dean Netherton 10 months ago
parent
commit
9c96e7c7a2
  1. 99
      Source/HBIOS/ch376-native/keyboard/kyb-init.c.s
  2. 5
      Source/HBIOS/ch376-native/source-doc/keyboard/kyb-init.c
  3. 6
      Source/HBIOS/ch376kyb.asm

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

@ -62,7 +62,7 @@ _report:
;--------------------------------------------------------
; code
;--------------------------------------------------------
;source-doc/keyboard/kyb-init.c:12: void keyboard_init(void) {
;source-doc/keyboard/kyb-init.c:12: uint8_t keyboard_init(void) __sdcccall(1) {
; ---------------------------------
; Function keyboard_init
; ---------------------------------
@ -118,7 +118,8 @@ l_keyboard_init_00105:
inc sp
ld hl, (_keyboard_config)
call _hid_set_idle
;source-doc/keyboard/kyb-init.c:32: return;
;source-doc/keyboard/kyb-init.c:32: return 1;
ld a,0x01
jr l_keyboard_init_00108
l_keyboard_init_00106:
;source-doc/keyboard/kyb-init.c:34: } while (++index != MAX_NUMBER_OF_DEVICES + 1);
@ -130,9 +131,11 @@ l_keyboard_init_00106:
l_keyboard_init_00107:
;source-doc/keyboard/kyb-init.c:36: print_string("\r\nUSB: KEYBOARD: NOT FOUND$");
ld hl,kyb_init_str_2
jp _print_string
call _print_string
;source-doc/keyboard/kyb-init.c:37: return 0;
xor a
l_keyboard_init_00108:
;source-doc/keyboard/kyb-init.c:37: }
;source-doc/keyboard/kyb-init.c:38: }
ret
kyb_init_str_0:
DEFB 0x0d
@ -147,7 +150,7 @@ kyb_init_str_2:
DEFB 0x0a
DEFM "USB: KEYBOARD: NOT FOUND$"
DEFB 0x00
;source-doc/keyboard/kyb-init.c:50:
;source-doc/keyboard/kyb-init.c:51:
; ---------------------------------
; Function keyboard_buf_put
; ---------------------------------
@ -155,42 +158,42 @@ _keyboard_buf_put:
push ix
ld ix,0
add ix,sp
;source-doc/keyboard/kyb-init.c:51: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) {
;source-doc/keyboard/kyb-init.c:52: void keyboard_buf_put(const uint8_t modifier_keys, const uint8_t key_code) {
ld a,(ix+5)
sub 0x80
jr NC,l_keyboard_buf_put_00112
ld a,(ix+5)
or a
;source-doc/keyboard/kyb-init.c:52: if (key_code >= 0x80 || key_code == 0)
;source-doc/keyboard/kyb-init.c:55: // if already reported, just skip it
;source-doc/keyboard/kyb-init.c:53: if (key_code >= 0x80 || key_code == 0)
;source-doc/keyboard/kyb-init.c:56: // 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:56: for (uint8_t i = 0; i < 6; i++)
;source-doc/keyboard/kyb-init.c:57: for (uint8_t i = 0; i < 6; i++)
ld b,0x00
ld hl,_previous_keyCodes
add hl, bc
ld a, (hl)
sub (ix+5)
;source-doc/keyboard/kyb-init.c:57: if (previous_keyCodes[i] == key_code)
;source-doc/keyboard/kyb-init.c:58: if (previous_keyCodes[i] == key_code)
jr Z,l_keyboard_buf_put_00112
;source-doc/keyboard/kyb-init.c:55: // if already reported, just skip it
;source-doc/keyboard/kyb-init.c:56: // 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:59:
;source-doc/keyboard/kyb-init.c:60:
ld a, (_write_index)
inc a
and 0x07
ld c, a
;source-doc/keyboard/kyb-init.c:60: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK;
;source-doc/keyboard/kyb-init.c:61: uint8_t next_write_index = (write_index + 1) & KEYBOARD_BUFFER_SIZE_MASK;
ld a,(_read_index)
sub c
jr Z,l_keyboard_buf_put_00112
;source-doc/keyboard/kyb-init.c:61: if (next_write_index != read_index) { // Check if buffer is not full
;source-doc/keyboard/kyb-init.c:62: if (next_write_index != read_index) { // Check if buffer is not full
ld de,_buffer+0
ld hl, (_write_index)
ld h,0x00
@ -198,7 +201,7 @@ l_keyboard_buf_put_00106:
add hl, de
ld a,(ix+4)
ld (hl), a
;source-doc/keyboard/kyb-init.c:62: buffer[write_index].modifier_keys = modifier_keys;
;source-doc/keyboard/kyb-init.c:63: buffer[write_index].modifier_keys = modifier_keys;
ld hl, (_write_index)
ld h,0x00
add hl, hl
@ -206,39 +209,39 @@ l_keyboard_buf_put_00106:
inc hl
ld a,(ix+5)
ld (hl), a
;source-doc/keyboard/kyb-init.c:63: buffer[write_index].key_code = key_code;
;source-doc/keyboard/kyb-init.c:64: buffer[write_index].key_code = key_code;
ld hl,_write_index
ld (hl), c
l_keyboard_buf_put_00112:
;source-doc/keyboard/kyb-init.c:65: }
;source-doc/keyboard/kyb-init.c:66: }
pop ix
ret
;source-doc/keyboard/kyb-init.c:67:
;source-doc/keyboard/kyb-init.c:68:
; ---------------------------------
; Function keyboard_buf_size
; ---------------------------------
_keyboard_buf_size:
;source-doc/keyboard/kyb-init.c:68: uint8_t keyboard_buf_size() __sdcccall(1) {
;source-doc/keyboard/kyb-init.c:69: uint8_t keyboard_buf_size() __sdcccall(1) {
ld a,(_write_index)
ld hl,_read_index
sub (hl)
jr C,l_keyboard_buf_size_00102
;source-doc/keyboard/kyb-init.c:69: if (write_index >= read_index)
;source-doc/keyboard/kyb-init.c:70: if (write_index >= read_index)
ld a,(_write_index)
ld hl,_read_index
sub (hl)
jr l_keyboard_buf_size_00103
l_keyboard_buf_size_00102:
;source-doc/keyboard/kyb-init.c:71:
;source-doc/keyboard/kyb-init.c:72:
ld hl, (_read_index)
ld a,0x08
sub l
ld hl, (_write_index)
add a, l
l_keyboard_buf_size_00103:
;source-doc/keyboard/kyb-init.c:72: return KEYBOARD_BUFFER_SIZE - read_index + write_index;
;source-doc/keyboard/kyb-init.c:73: return KEYBOARD_BUFFER_SIZE - read_index + write_index;
ret
;source-doc/keyboard/kyb-init.c:74:
;source-doc/keyboard/kyb-init.c:75:
; ---------------------------------
; Function keyboard_buf_get_next
; ---------------------------------
@ -248,53 +251,53 @@ _keyboard_buf_get_next:
add ix,sp
push af
push af
;source-doc/keyboard/kyb-init.c:75: uint32_t keyboard_buf_get_next() {
;source-doc/keyboard/kyb-init.c:76: uint32_t keyboard_buf_get_next() {
ld a,(_write_index)
ld hl,_read_index
sub (hl)
jr NZ,l_keyboard_buf_get_next_00102
;source-doc/keyboard/kyb-init.c:76: if (write_index == read_index) // Check if buffer is empty
;source-doc/keyboard/kyb-init.c:77: if (write_index == read_index) // Check if buffer is empty
ld hl,0xff00
ld e, h
ld d, h
jr l_keyboard_buf_get_next_00105
l_keyboard_buf_get_next_00102:
;source-doc/keyboard/kyb-init.c:78:
;source-doc/keyboard/kyb-init.c:79:
ld bc,_buffer+0
ld hl, (_read_index)
ld h,0x00
add hl, hl
add hl, bc
ld b, (hl)
;source-doc/keyboard/kyb-init.c:79: const uint8_t modifier_key = buffer[read_index].modifier_keys;
;source-doc/keyboard/kyb-init.c:80: const uint8_t modifier_key = buffer[read_index].modifier_keys;
inc hl
ld c, (hl)
;source-doc/keyboard/kyb-init.c:80: const uint8_t key_code = buffer[read_index].key_code;
;source-doc/keyboard/kyb-init.c:81: const uint8_t key_code = buffer[read_index].key_code;
ld a, (_read_index)
inc a
and 0x07
ld (_read_index),a
;source-doc/keyboard/kyb-init.c:82:
;source-doc/keyboard/kyb-init.c:83:
ld a, c
sub 0x39
jr NZ,l_keyboard_buf_get_next_00104
;source-doc/keyboard/kyb-init.c:83: if (key_code == KEY_CODE_CAPS_LOCK) {
;source-doc/keyboard/kyb-init.c:84: if (key_code == KEY_CODE_CAPS_LOCK) {
ld hl,_caps_lock_engaged
ld a, (hl)
xor 0x01
ld (hl), a
;source-doc/keyboard/kyb-init.c:84: caps_lock_engaged = !caps_lock_engaged;
;source-doc/keyboard/kyb-init.c:85: caps_lock_engaged = !caps_lock_engaged;
call _keyboard_buf_get_next
jr l_keyboard_buf_get_next_00105
l_keyboard_buf_get_next_00104:
;source-doc/keyboard/kyb-init.c:87:
;source-doc/keyboard/kyb-init.c:88:
push bc
ld l, c
ld a, b
call _scancode_to_char
ld e, a
pop bc
;source-doc/keyboard/kyb-init.c:89: /* D = modifier, e-> char, H = 0, L=>code */
;source-doc/keyboard/kyb-init.c:90: /* D = modifier, e-> char, H = 0, L=>code */
xor a
ld (ix-1),b
xor a
@ -311,32 +314,32 @@ l_keyboard_buf_get_next_00104:
pop hl
push hl
l_keyboard_buf_get_next_00105:
;source-doc/keyboard/kyb-init.c:90: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code;
;source-doc/keyboard/kyb-init.c:91: return (uint32_t)modifier_key << 24 | (uint32_t)c << 16 | key_code;
ld sp, ix
pop ix
ret
;source-doc/keyboard/kyb-init.c:92:
;source-doc/keyboard/kyb-init.c:93:
; ---------------------------------
; Function keyboard_buf_flush
; ---------------------------------
_keyboard_buf_flush:
;source-doc/keyboard/kyb-init.c:93: void keyboard_buf_flush() {
;source-doc/keyboard/kyb-init.c:94: write_index = 0;
;source-doc/keyboard/kyb-init.c:94: void keyboard_buf_flush() {
;source-doc/keyboard/kyb-init.c:95: write_index = 0;
xor a
ld (_write_index),a
ld (_read_index),a
;source-doc/keyboard/kyb-init.c:95: read_index = 0;
;source-doc/keyboard/kyb-init.c:96: read_index = 0;
ret
;source-doc/keyboard/kyb-init.c:101:
;source-doc/keyboard/kyb-init.c:102:
; ---------------------------------
; Function keyboard_tick
; ---------------------------------
_keyboard_tick:
;source-doc/keyboard/kyb-init.c:102: void keyboard_tick(void) {
;source-doc/keyboard/kyb-init.c:103: void keyboard_tick(void) {
ld hl,_in_critical_usb_section
ld a, (hl)
or a
;source-doc/keyboard/kyb-init.c:103: if (is_in_critical_section())
;source-doc/keyboard/kyb-init.c:104: if (is_in_critical_section())
jr NZ,l_keyboard_tick_00111
;././source-doc/base-drv//ch376.h:110: #endif
ld l,0x0b
@ -349,7 +352,7 @@ _keyboard_tick:
ld a,0x1f
ld bc,_CH376_DATA_PORT
out (c), a
;source-doc/keyboard/kyb-init.c:106: ch_configure_nak_retry_disable();
;source-doc/keyboard/kyb-init.c:107: ch_configure_nak_retry_disable();
ld bc,_report
ld hl, (_keyboard_config)
ld a,0x08
@ -374,10 +377,10 @@ _keyboard_tick:
ld a,0xdf
ld bc,_CH376_DATA_PORT
out (c), a
;source-doc/keyboard/kyb-init.c:108: ch_configure_nak_retry_3s();
;source-doc/keyboard/kyb-init.c:109: ch_configure_nak_retry_3s();
ld hl,_result
ld a, (hl)
;source-doc/keyboard/kyb-init.c:109: if (result == 0)
;source-doc/keyboard/kyb-init.c:110: if (result == 0)
or a
jr NZ,l_keyboard_tick_00111
ld c,a
@ -385,7 +388,7 @@ l_keyboard_tick_00109:
ld a, c
sub 0x06
ret NC
;source-doc/keyboard/kyb-init.c:110: for (uint8_t i = 0; i < 6; i++) {
;source-doc/keyboard/kyb-init.c:111: for (uint8_t i = 0; i < 6; i++) {
ld a,+((_report+2) & 0xFF)
add a, c
ld e, a
@ -404,17 +407,17 @@ l_keyboard_tick_00109:
pop af
pop de
pop bc
;source-doc/keyboard/kyb-init.c:111: keyboard_buf_put(report.bModifierKeys, report.keyCode[i]);
;source-doc/keyboard/kyb-init.c:112: 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:109: if (result == 0)
;source-doc/keyboard/kyb-init.c:110: if (result == 0)
inc c
jr l_keyboard_tick_00109
l_keyboard_tick_00111:
;source-doc/keyboard/kyb-init.c:113: }
;source-doc/keyboard/kyb-init.c:114: }
ret
_keyboard_config:
DEFW +0x0000

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

@ -9,7 +9,7 @@
static device_config_keyboard *keyboard_config = 0;
extern bool caps_lock_engaged;
void keyboard_init(void) {
uint8_t keyboard_init(void) __sdcccall(1) {
uint8_t index = 1;
keyboard_config = NULL;
@ -29,11 +29,12 @@ void keyboard_init(void) {
hid_set_protocol(keyboard_config, 1);
hid_set_idle(keyboard_config, 0x80);
return;
return 1;
}
} while (++index != MAX_NUMBER_OF_DEVICES + 1);
print_string("\r\nUSB: KEYBOARD: NOT FOUND$");
return 0;
}
#define KEYBOARD_BUFFER_SIZE 8

6
Source/HBIOS/ch376kyb.asm

@ -38,6 +38,10 @@ SCAN_INT_PERIOD: .EQU 2
UKY_INTSTK: ; 128 bytes for keyboard interrupt stack - need ~52 bytes???
CHUKB_INIT:
CALL _keyboard_init
OR A
RET Z
; INSTALL INTERRUPT HANDLER
LD HL, (VEC_TICK+1)
LD (VEC_CHUKB_TICK+1), HL
@ -45,7 +49,7 @@ CHUKB_INIT:
LD HL, CHUKB_TICK
LD (VEC_TICK+1), HL
JP _keyboard_init
RET
CHUKB_TICK:
LD A, SCAN_INT_PERIOD ; SCAN THE KEYBOARD EVERY 'SCAN_INT_PERIOD' INTERRUPTS.

Loading…
Cancel
Save