diff --git a/Source/HBIOS/ch376-native/Makefile b/Source/HBIOS/ch376-native/Makefile index cd6f25b0..a0989a7e 100644 --- a/Source/HBIOS/ch376-native/Makefile +++ b/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 $@" diff --git a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s b/Source/HBIOS/ch376-native/base-drv/usb-init.c.s index 90f05110..ba928203 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb-init.c.s +++ b/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 ; --------------------------------- diff --git a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s b/Source/HBIOS/ch376-native/base-drv/usb_state.c.s index e494fb01..660e8572 100644 --- a/Source/HBIOS/ch376-native/base-drv/usb_state.c.s +++ b/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 diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c index fa7ba6f0..fb898799 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c +++ b/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; } diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c index fe6709b9..ce6e460d 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.c +++ b/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 diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h index 87821f27..d5246a1b 100644 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_state.h +++ b/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);