Browse Source

ch376-native: extended CHNATIVEFORCE option to wait upto approx 5 seconds for at least one connected device

pull/592/head
Dean Netherton 11 months ago
parent
commit
ce0d04226e
  1. 1
      Source/HBIOS/ch376-native/Makefile
  2. 96
      Source/HBIOS/ch376-native/base-drv/usb-init.c.s
  3. 111
      Source/HBIOS/ch376-native/base-drv/usb_state.c.s
  4. 19
      Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c
  5. 11
      Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c
  6. 2
      Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h

1
Source/HBIOS/ch376-native/Makefile

@ -46,6 +46,7 @@ clean:
rm base-drv.s
rm keyboard.s
.PRECIOUS: $(ASSDIR)%.c.asm
$(ASSDIR)%.c.s: $(ASSDIR)%.c.asm
@mkdir -p $(dir $@)
echo "Converting $< to $@"

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

@ -167,7 +167,7 @@ l__chnative_init_00110:
ld hl,usb_init_str_4
call _print_string
;source-doc/base-drv/usb-init.c:55: return;
jr l__chnative_init_00118
jp l__chnative_init_00127
l__chnative_init_00108:
;source-doc/base-drv/usb-init.c:58: print_string("\r\nCH376: PRESENT (VER $");
ld hl,usb_init_str_5
@ -185,19 +185,19 @@ l__chnative_init_00111:
call _print_string
;source-doc/base-drv/usb-init.c:66: usb_host_bus_reset();
call _usb_host_bus_reset
;source-doc/base-drv/usb-init.c:68: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) {
;source-doc/base-drv/usb-init.c:68: for (uint8_t i = 0; i < (forced ? 80 : 5); i++) {
ld c,0x00
l__chnative_init_00116:
l__chnative_init_00125:
bit 0,(ix+4)
jr Z,l__chnative_init_00120
ld b,0x0a
jr l__chnative_init_00121
l__chnative_init_00120:
jr Z,l__chnative_init_00129
ld b,0x50
jr l__chnative_init_00130
l__chnative_init_00129:
ld b,0x05
l__chnative_init_00121:
l__chnative_init_00130:
ld a, c
sub b
jr NC,l__chnative_init_00114
jr NC,l__chnative_init_00121
;source-doc/base-drv/usb-init.c:69: const uint8_t r = ch_very_short_wait_int_and_get_();
push bc
call _ch_very_short_wait_int_and_get
@ -205,32 +205,72 @@ l__chnative_init_00121:
pop bc
;source-doc/base-drv/usb-init.c:71: if (r == USB_INT_CONNECT) {
sub 0x81
jr NZ,l__chnative_init_00117
jr NZ,l__chnative_init_00126
;source-doc/base-drv/usb-init.c:72: print_string("USB: CONNECTED$");
ld hl,usb_init_str_7
call _print_string
;source-doc/base-drv/usb-init.c:74: enumerate_all_devices();
call _enumerate_all_devices
;source-doc/base-drv/usb-init.c:76: USB_MODULE_LEDS = 0x03;
;source-doc/base-drv/usb-init.c:76: if (forced && count_of_devices() == 0) {
bit 0,(ix+4)
jr Z,l__chnative_init_00118
call _count_of_devices
or a
jr NZ,l__chnative_init_00118
;source-doc/base-drv/usb-init.c:77: print_string("\r\nUSB: SCANNING $");
ld hl,usb_init_str_8
call _print_string
;source-doc/base-drv/usb-init.c:79: for (i = 0; i < 10; i++) {
ld (ix-1),0x00
l__chnative_init_00122:
;source-doc/base-drv/usb-init.c:80: print_string(".$");
ld hl,usb_init_str_9
call _print_string
;source-doc/base-drv/usb-init.c:81: memset(get_usb_work_area(), 0, sizeof(_usb_state));
ld hl,_x
ld (hl),0x00
ld e, l
ld d, h
inc de
ld bc,0x0068
ldir
;source-doc/base-drv/usb-init.c:82: usb_host_bus_reset();
call _usb_host_bus_reset
;source-doc/base-drv/usb-init.c:84: delay_medium();
call _delay_medium
;source-doc/base-drv/usb-init.c:85: enumerate_all_devices();
call _enumerate_all_devices
;source-doc/base-drv/usb-init.c:87: if (count_of_devices() > 0)
call _count_of_devices
or a
jr NZ,l__chnative_init_00118
;source-doc/base-drv/usb-init.c:79: for (i = 0; i < 10; i++) {
inc (ix-1)
ld a,(ix-1)
sub 0x0a
jr C,l__chnative_init_00122
;source-doc/base-drv/usb-init.c:92: connected:
l__chnative_init_00118:
;source-doc/base-drv/usb-init.c:93: USB_MODULE_LEDS = 0x03;
ld a,0x03
ld bc,_USB_MODULE_LEDS
out (c), a
;source-doc/base-drv/usb-init.c:77: return;
jr l__chnative_init_00118
l__chnative_init_00117:
;source-doc/base-drv/usb-init.c:68: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) {
;source-doc/base-drv/usb-init.c:94: return;
jr l__chnative_init_00127
l__chnative_init_00126:
;source-doc/base-drv/usb-init.c:68: for (uint8_t i = 0; i < (forced ? 80 : 5); i++) {
inc c
jr l__chnative_init_00116
l__chnative_init_00114:
;source-doc/base-drv/usb-init.c:81: USB_MODULE_LEDS = 0x00;
jr l__chnative_init_00125
l__chnative_init_00121:
;source-doc/base-drv/usb-init.c:98: USB_MODULE_LEDS = 0x00;
ld a,0x00
ld bc,_USB_MODULE_LEDS
out (c), a
;source-doc/base-drv/usb-init.c:82: print_string("USB: DISCONNECTED$");
ld hl,usb_init_str_8
;source-doc/base-drv/usb-init.c:99: print_string("USB: DISCONNECTED$");
ld hl,usb_init_str_10
call _print_string
l__chnative_init_00118:
;source-doc/base-drv/usb-init.c:83: }
l__chnative_init_00127:
;source-doc/base-drv/usb-init.c:100: }
inc sp
pop ix
ret
@ -268,9 +308,17 @@ usb_init_str_7:
DEFM "USB: CONNECTED$"
DEFB 0x00
usb_init_str_8:
DEFB 0x0d
DEFB 0x0a
DEFM "USB: SCANNING $"
DEFB 0x00
usb_init_str_9:
DEFM ".$"
DEFB 0x00
usb_init_str_10:
DEFM "USB: DISCONNECTED$"
DEFB 0x00
;source-doc/base-drv/usb-init.c:85: void chnative_init_force(void) { _chnative_init(true); }
;source-doc/base-drv/usb-init.c:102: void chnative_init_force(void) { _chnative_init(true); }
; ---------------------------------
; Function chnative_init_force
; ---------------------------------
@ -281,7 +329,7 @@ _chnative_init_force:
call __chnative_init
inc sp
ret
;source-doc/base-drv/usb-init.c:87: void chnative_init(void) { _chnative_init(false); }
;source-doc/base-drv/usb-init.c:104: void chnative_init(void) { _chnative_init(false); }
; ---------------------------------
; Function chnative_init
; ---------------------------------

111
Source/HBIOS/ch376-native/base-drv/usb_state.c.s

@ -48,45 +48,44 @@ _USB_MODULE_LEDS .EQU 0xff8a
;--------------------------------------------------------
; code
;--------------------------------------------------------
;source-doc/base-drv/usb_state.c:13: device_config *find_device_config(const usb_device_type requested_type) {
;source-doc/base-drv/usb_state.c:13: uint8_t count_of_devices(void) __sdcccall(1) {
; ---------------------------------
; Function find_device_config
; Function count_of_devices
; ---------------------------------
_find_device_config:
push ix
ld ix,0
add ix,sp
_count_of_devices:
;source-doc/base-drv/usb_state.c:14: _usb_state *const p = get_usb_work_area();
;source-doc/base-drv/usb_state.c:16: const device_config *p_config = first_device_config(p);
;source-doc/base-drv/usb_state.c:18: const device_config *p_config = first_device_config(p);
ld hl,_x
call _first_device_config
;source-doc/base-drv/usb_state.c:17: while (p_config) {
l_find_device_config_00103:
;source-doc/base-drv/usb_state.c:19: while (p_config) {
ld c,0x00
l_count_of_devices_00104:
ld a, d
or e
jr Z,l_find_device_config_00105
;source-doc/base-drv/usb_state.c:18: const uint8_t type = p_config->type;
jr Z,l_count_of_devices_00106
;source-doc/base-drv/usb_state.c:20: const uint8_t type = p_config->type;
ld l, e
ld h, d
ld a, (hl)
and 0x0f
;source-doc/base-drv/usb_state.c:20: if (type == requested_type)
sub (ix+4)
jr NZ,l_find_device_config_00102
;source-doc/base-drv/usb_state.c:21: return (device_config *)p_config;
ex de, hl
jr l_find_device_config_00106
l_find_device_config_00102:
;source-doc/base-drv/usb_state.c:23: p_config = next_device_config(p, p_config);
;source-doc/base-drv/usb_state.c:22: if (type != USB_IS_HUB && type)
cp 0x0f
jr Z,l_count_of_devices_00102
or a
jr Z,l_count_of_devices_00102
;source-doc/base-drv/usb_state.c:23: count++;
inc c
l_count_of_devices_00102:
;source-doc/base-drv/usb_state.c:26: p_config = next_device_config(p, p_config);
push bc
ld hl,_x
call _next_device_config
jr l_find_device_config_00103
l_find_device_config_00105:
;source-doc/base-drv/usb_state.c:26: return NULL;
ld hl,0x0000
l_find_device_config_00106:
;source-doc/base-drv/usb_state.c:27: }
pop ix
pop bc
jr l_count_of_devices_00104
l_count_of_devices_00106:
;source-doc/base-drv/usb_state.c:29: return count;
ld a, c
;source-doc/base-drv/usb_state.c:30: }
ret
_device_config_sizes:
DEFB +0x00
@ -96,41 +95,41 @@ _device_config_sizes:
DEFB +0x06
DEFB 0x00
DEFB 0x00
;source-doc/base-drv/usb_state.c:30: device_config *find_first_free(void) {
;source-doc/base-drv/usb_state.c:33: device_config *find_first_free(void) {
; ---------------------------------
; Function find_first_free
; ---------------------------------
_find_first_free:
;source-doc/base-drv/usb_state.c:31: _usb_state *const boot_state = get_usb_work_area();
;source-doc/base-drv/usb_state.c:34: device_config *p = first_device_config(boot_state);
;source-doc/base-drv/usb_state.c:34: _usb_state *const boot_state = get_usb_work_area();
;source-doc/base-drv/usb_state.c:37: device_config *p = first_device_config(boot_state);
ld hl,_x
call _first_device_config
;source-doc/base-drv/usb_state.c:35: while (p) {
;source-doc/base-drv/usb_state.c:38: while (p) {
l_find_first_free_00103:
ld a, d
or e
jr Z,l_find_first_free_00105
;source-doc/base-drv/usb_state.c:36: if (p->type == 0)
;source-doc/base-drv/usb_state.c:39: if (p->type == 0)
ld l, e
ld h, d
ld a, (hl)
and 0x0f
jr NZ,l_find_first_free_00102
;source-doc/base-drv/usb_state.c:37: return p;
;source-doc/base-drv/usb_state.c:40: return p;
ex de, hl
jr l_find_first_free_00106
l_find_first_free_00102:
;source-doc/base-drv/usb_state.c:39: p = next_device_config(boot_state, p);
;source-doc/base-drv/usb_state.c:42: p = next_device_config(boot_state, p);
ld hl,_x
call _next_device_config
jr l_find_first_free_00103
l_find_first_free_00105:
;source-doc/base-drv/usb_state.c:42: return NULL;
;source-doc/base-drv/usb_state.c:45: return NULL;
ld hl,0x0000
l_find_first_free_00106:
;source-doc/base-drv/usb_state.c:43: }
;source-doc/base-drv/usb_state.c:46: }
ret
;source-doc/base-drv/usb_state.c:45: device_config *first_device_config(const _usb_state *const p) __sdcccall(1) { return (device_config *)&p->device_configs[0]; }
;source-doc/base-drv/usb_state.c:48: device_config *first_device_config(const _usb_state *const p) __sdcccall(1) { return (device_config *)&p->device_configs[0]; }
; ---------------------------------
; Function first_device_config
; ---------------------------------
@ -139,24 +138,24 @@ _first_device_config:
inc de
inc de
ret
;source-doc/base-drv/usb_state.c:47: device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1) {
;source-doc/base-drv/usb_state.c:50: device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1) {
; ---------------------------------
; Function next_device_config
; ---------------------------------
_next_device_config:
ld c, l
ld b, h
;source-doc/base-drv/usb_state.c:48: if (p->type == 0)
;source-doc/base-drv/usb_state.c:51: if (p->type == 0)
ld l, e
ld h, d
ld a, (hl)
and 0x0f
jr NZ,l_next_device_config_00102
;source-doc/base-drv/usb_state.c:49: return NULL;
;source-doc/base-drv/usb_state.c:52: return NULL;
ld de,0x0000
jr l_next_device_config_00105
l_next_device_config_00102:
;source-doc/base-drv/usb_state.c:51: const uint8_t size = device_config_sizes[p->type];
;source-doc/base-drv/usb_state.c:54: const uint8_t size = device_config_sizes[p->type];
ld l, e
ld h, d
ld a, (hl)
@ -167,14 +166,14 @@ l_next_device_config_00102:
adc a, +((_device_config_sizes) / 256)
ld h, a
ld a, (hl)
;source-doc/base-drv/usb_state.c:58: const uint8_t *_p = (uint8_t *)p;
;source-doc/base-drv/usb_state.c:59: device_config *const result = (device_config *)(_p + size);
;source-doc/base-drv/usb_state.c:61: const uint8_t *_p = (uint8_t *)p;
;source-doc/base-drv/usb_state.c:62: device_config *const result = (device_config *)(_p + size);
add a, e
ld e, a
ld a,0x00
adc a, d
ld d, a
;source-doc/base-drv/usb_state.c:61: if (result >= (device_config *)&usb_state->device_configs_end)
;source-doc/base-drv/usb_state.c:64: if (result >= (device_config *)&usb_state->device_configs_end)
ld hl,0x0068
add hl, bc
ld a, e
@ -182,20 +181,20 @@ l_next_device_config_00102:
ld a, d
sbc a, h
ret C
;source-doc/base-drv/usb_state.c:62: return NULL;
;source-doc/base-drv/usb_state.c:65: return NULL;
ld de,0x0000
;source-doc/base-drv/usb_state.c:64: return result;
;source-doc/base-drv/usb_state.c:67: return result;
l_next_device_config_00105:
;source-doc/base-drv/usb_state.c:65: }
;source-doc/base-drv/usb_state.c:68: }
ret
;source-doc/base-drv/usb_state.c:68: device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) {
;source-doc/base-drv/usb_state.c:71: device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1) {
; ---------------------------------
; Function get_usb_device_config
; ---------------------------------
_get_usb_device_config:
ld c, a
;source-doc/base-drv/usb_state.c:69: const _usb_state *const usb_state = get_usb_work_area();
;source-doc/base-drv/usb_state.c:73: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) {
;source-doc/base-drv/usb_state.c:72: const _usb_state *const usb_state = get_usb_work_area();
;source-doc/base-drv/usb_state.c:76: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) {
push bc
ld hl,_x
call _first_device_config
@ -205,29 +204,29 @@ l_get_usb_device_config_00107:
ld a, d
or e
jr Z,l_get_usb_device_config_00105
;source-doc/base-drv/usb_state.c:74: if (p->type != USB_NOT_SUPPORTED) {
;source-doc/base-drv/usb_state.c:77: if (p->type != USB_NOT_SUPPORTED) {
ld l, e
ld h, d
ld a, (hl)
and 0x0f
jr Z,l_get_usb_device_config_00108
;source-doc/base-drv/usb_state.c:75: if (counter == device_index)
;source-doc/base-drv/usb_state.c:78: if (counter == device_index)
ld a, c
sub b
;source-doc/base-drv/usb_state.c:76: return p;
;source-doc/base-drv/usb_state.c:79: return p;
jr Z,l_get_usb_device_config_00109
;source-doc/base-drv/usb_state.c:77: counter++;
;source-doc/base-drv/usb_state.c:80: counter++;
inc b
l_get_usb_device_config_00108:
;source-doc/base-drv/usb_state.c:73: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) {
;source-doc/base-drv/usb_state.c:76: for (device_config *p = first_device_config(usb_state); p; p = next_device_config(usb_state, p)) {
push bc
ld hl,_x
call _next_device_config
pop bc
jr l_get_usb_device_config_00107
l_get_usb_device_config_00105:
;source-doc/base-drv/usb_state.c:81: return NULL; // is not a usb device
;source-doc/base-drv/usb_state.c:84: return NULL; // is not a usb device
ld de,0x0000
l_get_usb_device_config_00109:
;source-doc/base-drv/usb_state.c:82: }
;source-doc/base-drv/usb_state.c:85: }
ret

19
Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c

@ -65,7 +65,7 @@ void _chnative_init(bool forced) {
usb_host_bus_reset();
for (uint8_t i = 0; i < (forced ? 10 : 5); i++) {
for (uint8_t i = 0; i < (forced ? 80 : 5); i++) {
const uint8_t r = ch_very_short_wait_int_and_get_status();
if (r == USB_INT_CONNECT) {
@ -73,6 +73,23 @@ void _chnative_init(bool forced) {
enumerate_all_devices();
if (forced && count_of_devices() == 0) {
print_string("\r\nUSB: SCANNING $");
for (i = 0; i < 10; i++) {
print_string(".$");
memset(get_usb_work_area(), 0, sizeof(_usb_state));
usb_host_bus_reset();
delay_medium();
enumerate_all_devices();
if (count_of_devices() > 0)
goto connected;
}
}
connected:
USB_MODULE_LEDS = 0x03;
return;
}

11
Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c

@ -10,20 +10,23 @@ const uint8_t device_config_sizes[_USB_LAST_DEVICE_TYPE] = {
};
// always usb work area
device_config *find_device_config(const usb_device_type requested_type) {
uint8_t count_of_devices(void) __sdcccall(1) {
_usb_state *const p = get_usb_work_area();
uint8_t count = 0;
const device_config *p_config = first_device_config(p);
while (p_config) {
const uint8_t type = p_config->type;
if (type == requested_type)
return (device_config *)p_config;
if (type != USB_IS_HUB && type)
count++;
;
p_config = next_device_config(p, p_config);
};
return NULL;
return count;
}
// always search in boot

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

@ -20,7 +20,7 @@ typedef struct __usb_state {
extern device_config *find_first_free(void);
extern device_config *first_device_config(const _usb_state *const p) __sdcccall(1);
extern device_config *next_device_config(const _usb_state *const usb_state, const device_config *const p) __sdcccall(1);
extern device_config *find_device_config(const usb_device_type requested_type);
extern uint8_t count_of_devices(void) __sdcccall(1);
extern device_config *get_usb_device_config(const uint8_t device_index) __sdcccall(1);

Loading…
Cancel
Save