diff --git a/Source/HBIOS/ch376-native/base-drv.s b/Source/HBIOS/ch376-native/base-drv.s index fb66e985..ed11de0a 100644 --- a/Source/HBIOS/ch376-native/base-drv.s +++ b/Source/HBIOS/ch376-native/base-drv.s @@ -1,5 +1,6 @@ ; Generated File -- not to be modify directly #include "ch376-native/base-drv/ch376.c.s" +#include "ch376-native/base-drv/ch376_init.c.s" #include "ch376-native/base-drv/class_hub.c.s" #include "ch376-native/base-drv/critical-section.c.s" #include "ch376-native/base-drv/dev_transfers.c.s" @@ -9,6 +10,6 @@ #include "ch376-native/base-drv/protocol.c.s" #include "ch376-native/base-drv/transfers.c.s" #include "ch376-native/base-drv/usb-base-drv.c.s" -#include "ch376-native/base-drv/usb-init.c.s" +#include "ch376-native/base-drv/usb_init.c.s" #include "ch376-native/base-drv/usb_state.c.s" #include "ch376-native/base-drv/work-area.c.s" diff --git a/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s b/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s new file mode 100644 index 00000000..2081c4db --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/ch376_init.c.s @@ -0,0 +1,302 @@ +; +; Generated from source-doc/base-drv/ch376_init.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.5.0 #15248 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/ch376_init.c:4: static uint16_t wait_for_state(const uint8_t loop_counter, uint8_t state, const uint8_t desired_state) __sdcccall(1) { +; --------------------------------- +; Function wait_for_state +; --------------------------------- +_wait_for_state: + push ix + ld ix,0 + add ix,sp + dec sp + ld (ix-1),a + ld b, l +;source-doc/base-drv/ch376_init.c:5: uint16_t r = state; + ld e, b +;source-doc/base-drv/ch376_init.c:7: for (uint8_t i = 0; i < loop_counter; i++) { + ld d,0x00 + ld c,d +l_wait_for_state_00108: + ld a, c + sub (ix-1) + jr NC,l_wait_for_state_00106 +;source-doc/base-drv/ch376_init.c:8: if (state == desired_state) + ld a,(ix+4) + sub b + jr Z,l_wait_for_state_00106 +;source-doc/base-drv/ch376_init.c:11: if (i & 1) + bit 0, c + jr Z,l_wait_for_state_00104 +;source-doc/base-drv/ch376_init.c:12: print_string("\b $"); + push bc + ld hl,ch376_init_str_0 + call _print_string + pop bc + jr l_wait_for_state_00105 +l_wait_for_state_00104: +;source-doc/base-drv/ch376_init.c:14: print_string("\b*$"); + push bc + ld hl,ch376_init_str_1 + call _print_string + pop bc +l_wait_for_state_00105: +;source-doc/base-drv/ch376_init.c:16: r = usb_init(state); + push bc + push bc + inc sp + call _usb_init + inc sp + ex de, hl + pop bc +;source-doc/base-drv/ch376_init.c:17: state = r & 255; + ld b, e +;source-doc/base-drv/ch376_init.c:7: for (uint8_t i = 0; i < loop_counter; i++) { + inc c + jr l_wait_for_state_00108 +l_wait_for_state_00106: +;source-doc/base-drv/ch376_init.c:20: return r; +;source-doc/base-drv/ch376_init.c:21: } + inc sp + pop ix + pop hl + inc sp + jp (hl) +ch376_init_str_0: + DEFB 0x08 + DEFM " $" + DEFB 0x00 +ch376_init_str_1: + DEFB 0x08 + DEFM "*$" + DEFB 0x00 +;source-doc/base-drv/ch376_init.c:23: static void _chnative_init(bool forced) { +; --------------------------------- +; Function _chnative_init +; --------------------------------- +__chnative_init: + push ix + ld ix,0 + add ix,sp + dec sp +;source-doc/base-drv/ch376_init.c:26: const uint8_t loop_counter = forced ? 40 : 5; + bit 0,(ix+4) + jr Z,l__chnative_init_00113 + ld a,0x28 + jr l__chnative_init_00114 +l__chnative_init_00113: + ld a,0x05 +l__chnative_init_00114: + ld (ix-1),a +;source-doc/base-drv/ch376_init.c:28: print_string("\r\nCH376: *$"); + ld hl,ch376_init_str_2 + call _print_string +;source-doc/base-drv/ch376_init.c:30: r = wait_for_state(loop_counter, state, 1); + ld a,0x01 + push af + inc sp + ld l,0x00 + ld a,(ix-1) + call _wait_for_state + ld b, e +;source-doc/base-drv/ch376_init.c:31: state = r & 255; +;source-doc/base-drv/ch376_init.c:33: print_string("\bPRESENT (VER $"); + push bc + ld hl,ch376_init_str_3 + call _print_string +;source-doc/base-drv/ch376_init.c:35: r = usb_init(state); + inc sp + call _usb_init + inc sp + ex de, hl +;source-doc/base-drv/ch376_init.c:36: state = r & 255; + ld c, e +;source-doc/base-drv/ch376_init.c:37: if (state != 2) { + ld a, c + sub 0x02 + jr Z,l__chnative_init_00102 +;source-doc/base-drv/ch376_init.c:38: print_string("\rCH376: $"); + ld hl,ch376_init_str_4 + call _print_string +;source-doc/base-drv/ch376_init.c:39: print_string("VERSION FAILURE\r\n$"); + ld hl,ch376_init_str_5 + call _print_string +;source-doc/base-drv/ch376_init.c:40: return; + jr l__chnative_init_00111 +l__chnative_init_00102: +;source-doc/base-drv/ch376_init.c:43: print_hex(r >> 8); + push bc + ld l, d + call _print_hex +;source-doc/base-drv/ch376_init.c:44: print_string("); $"); + ld hl,ch376_init_str_6 + call _print_string +;source-doc/base-drv/ch376_init.c:46: print_string("USB: *$"); + ld hl,ch376_init_str_7 + call _print_string + pop bc +;source-doc/base-drv/ch376_init.c:48: r = wait_for_state(loop_counter, state, 3); + ld a,0x03 + push af + inc sp + ld l, c + ld a,(ix-1) + call _wait_for_state + ld b, e +;source-doc/base-drv/ch376_init.c:49: state = r & 255; +;source-doc/base-drv/ch376_init.c:51: if (state == 2) { + ld a, b + sub 0x02 + jr NZ,l__chnative_init_00104 +;source-doc/base-drv/ch376_init.c:52: print_string("\bDISCONNECTED$"); + ld hl,ch376_init_str_8 + call _print_string +;source-doc/base-drv/ch376_init.c:53: return; + jr l__chnative_init_00111 +l__chnative_init_00104: +;source-doc/base-drv/ch376_init.c:56: print_string("\bCONNECTED$"); + push bc + ld hl,ch376_init_str_9 + call _print_string +;source-doc/base-drv/ch376_init.c:59: r = usb_init(state); + inc sp + call _usb_init + inc sp + ex de, hl +;source-doc/base-drv/ch376_init.c:60: state = r & 255; + ld b, e +;source-doc/base-drv/ch376_init.c:62: for (uint8_t i = 0; i < loop_counter; i++) { + ld c,0x00 +l__chnative_init_00109: + ld a, c + sub (ix-1) + jr NC,l__chnative_init_00111 +;source-doc/base-drv/ch376_init.c:63: if (r >> 8 != 0) + ld a,0x00 + or d + jr NZ,l__chnative_init_00111 +;source-doc/base-drv/ch376_init.c:66: print_string(".$"); + push bc + ld hl,ch376_init_str_10 + call _print_string + pop bc +;source-doc/base-drv/ch376_init.c:67: r = usb_init(state); + push bc + push bc + inc sp + call _usb_init + inc sp + ex de, hl + pop bc +;source-doc/base-drv/ch376_init.c:68: state = r & 255; + ld b, e +;source-doc/base-drv/ch376_init.c:62: for (uint8_t i = 0; i < loop_counter; i++) { + inc c + jr l__chnative_init_00109 +l__chnative_init_00111: +;source-doc/base-drv/ch376_init.c:70: } + inc sp + pop ix + ret +ch376_init_str_2: + DEFB 0x0d + DEFB 0x0a + DEFM "CH376: *$" + DEFB 0x00 +ch376_init_str_3: + DEFB 0x08 + DEFM "PRESENT (VER $" + DEFB 0x00 +ch376_init_str_4: + DEFB 0x0d + DEFM "CH376: $" + DEFB 0x00 +ch376_init_str_5: + DEFM "VERSION FAILURE" + DEFB 0x0d + DEFB 0x0a + DEFM "$" + DEFB 0x00 +ch376_init_str_6: + DEFM "); $" + DEFB 0x00 +ch376_init_str_7: + DEFM "USB: *$" + DEFB 0x00 +ch376_init_str_8: + DEFB 0x08 + DEFM "DISCONNECTED$" + DEFB 0x00 +ch376_init_str_9: + DEFB 0x08 + DEFM "CONNECTED$" + DEFB 0x00 +ch376_init_str_10: + DEFM ".$" + DEFB 0x00 +;source-doc/base-drv/ch376_init.c:72: void chnative_init_force(void) { _chnative_init(true); } +; --------------------------------- +; Function chnative_init_force +; --------------------------------- +_chnative_init_force: + ld a,0x01 + push af + inc sp + call __chnative_init + inc sp + ret +;source-doc/base-drv/ch376_init.c:74: void chnative_init(void) { _chnative_init(false); } +; --------------------------------- +; Function chnative_init +; --------------------------------- +_chnative_init: + xor a + push af + inc sp + call __chnative_init + inc sp + ret diff --git a/Source/HBIOS/ch376-native/base-drv/usb_init.c.s b/Source/HBIOS/ch376-native/base-drv/usb_init.c.s new file mode 100644 index 00000000..09fd1e9b --- /dev/null +++ b/Source/HBIOS/ch376-native/base-drv/usb_init.c.s @@ -0,0 +1,210 @@ +; +; Generated from source-doc/base-drv/usb_init.c.asm -- not to be modify directly +; +; +;-------------------------------------------------------- +; File Created by SDCC : free open source ISO C Compiler +; Version 4.5.0 #15248 (Linux) +;-------------------------------------------------------- +; Processed by Z88DK +;-------------------------------------------------------- + + +;-------------------------------------------------------- +; Public variables in this module +;-------------------------------------------------------- +;-------------------------------------------------------- +; Externals used +;-------------------------------------------------------- +;-------------------------------------------------------- +; special function registers +;-------------------------------------------------------- +_CH376_DATA_PORT .EQU 0xff88 +_CH376_COMMAND_PORT .EQU 0xff89 +_USB_MODULE_LEDS .EQU 0xff8a +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; ram data +;-------------------------------------------------------- + +#IF 0 + +; .area _INITIALIZED removed by z88dk + + +#ENDIF + +;-------------------------------------------------------- +; absolute external ram data +;-------------------------------------------------------- +;-------------------------------------------------------- +; global & static initialisations +;-------------------------------------------------------- +;-------------------------------------------------------- +; Home +;-------------------------------------------------------- +;-------------------------------------------------------- +; code +;-------------------------------------------------------- +;source-doc/base-drv/usb_init.c:7: static usb_error usb_host_bus_reset(void) { +; --------------------------------- +; Function usb_host_bus_reset +; --------------------------------- +_usb_host_bus_reset: +;source-doc/base-drv/usb_init.c:8: ch_cmd_set_usb_mode(CH_MODE_HOST); + ld l,0x06 + call _ch_cmd_set_usb_mode +;source-doc/base-drv/usb_init.c:9: delay_20ms(); + call _delay_20ms +;source-doc/base-drv/usb_init.c:11: ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); + ld l,0x07 + call _ch_cmd_set_usb_mode +;source-doc/base-drv/usb_init.c:12: delay_20ms(); + call _delay_20ms +;source-doc/base-drv/usb_init.c:14: ch_cmd_set_usb_mode(CH_MODE_HOST); + ld l,0x06 + call _ch_cmd_set_usb_mode +;source-doc/base-drv/usb_init.c:15: delay_20ms(); + call _delay_20ms +;source-doc/base-drv/ch376.h:110: #endif + ld l,0x0b + call _ch_command +;source-doc/base-drv/ch376.h:111: + ld a,0x25 + ld bc,_CH376_DATA_PORT + out (c), a +;source-doc/base-drv/ch376.h:112: #define calc_max_packet_sizex(packet_size) (packet_size & 0x3FF) + ld a,0xdf + ld bc,_CH376_DATA_PORT + out (c), a +;source-doc/base-drv/usb_init.c:19: return USB_ERR_OK; + ld l,0x00 +;source-doc/base-drv/usb_init.c:20: } + ret +;source-doc/base-drv/usb_init.c:24: uint16_t usb_init(uint8_t state) { +; --------------------------------- +; Function usb_init +; --------------------------------- +_usb_init: + push ix + ld ix,0 + add ix,sp +;source-doc/base-drv/usb_init.c:27: USB_MODULE_LEDS = 0x03; + ld a,0x03 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb_init.c:29: if (state == 0) { + ld a,(ix+4) + or a + jr NZ,l_usb_init_00104 +;source-doc/base-drv/usb_init.c:30: ch_cmd_reset_all(); + call _ch_cmd_reset_all +;source-doc/base-drv/usb_init.c:31: delay_medium(); + call _delay_medium +;source-doc/base-drv/usb_init.c:33: if (!ch_probe()) { + call _ch_probe + ld a, l +;source-doc/base-drv/usb_init.c:34: USB_MODULE_LEDS = 0x00; + or a + jr NZ,l_usb_init_00102 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb_init.c:35: return 0xFF00; + ld hl,0xff00 + jp l_usb_init_00113 +l_usb_init_00102: +;source-doc/base-drv/usb_init.c:37: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb_init.c:38: return 1; + ld hl,0x0001 + jr l_usb_init_00113 +l_usb_init_00104: +;source-doc/base-drv/usb_init.c:41: if (state == 1) { + ld a,(ix+4) + dec a + jr NZ,l_usb_init_00106 +;source-doc/base-drv/usb_init.c:42: r = ch_cmd_get_ic_version(); + call _ch_cmd_get_ic_version +;source-doc/base-drv/usb_init.c:44: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb_init.c:45: return (uint16_t)r << 8 | 2; + xor a + ld h, l + ld l,0x02 + jr l_usb_init_00113 +l_usb_init_00106: +;source-doc/base-drv/usb_init.c:48: if (state == 2) { + ld a,(ix+4) + sub 0x02 + jr NZ,l_usb_init_00159 + ld a,0x01 + jr l_usb_init_00160 +l_usb_init_00159: + xor a +l_usb_init_00160: + ld c,a + or a + jr Z,l_usb_init_00110 +;source-doc/base-drv/usb_init.c:49: usb_host_bus_reset(); + call _usb_host_bus_reset +;source-doc/base-drv/usb_init.c:51: r = ch_very_short_wait_int_and_get_(); + call _ch_very_short_wait_int_and_get + ld a, l +;source-doc/base-drv/usb_init.c:53: if (r != USB_INT_CONNECT) { + sub 0x81 + jr Z,l_usb_init_00108 +;source-doc/base-drv/usb_init.c:54: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb_init.c:55: return 2; + ld hl,0x0002 + jr l_usb_init_00113 +l_usb_init_00108: +;source-doc/base-drv/usb_init.c:58: return 3; + ld hl,0x0003 + jr l_usb_init_00113 +l_usb_init_00110: +;source-doc/base-drv/usb_init.c:61: memset(get_usb_work_area(), 0, sizeof(_usb_state)); + ld b,0x35 + ld hl,_x + jr l_usb_init_00163 +l_usb_init_00162: + ld (hl),0x00 + inc hl +l_usb_init_00163: + ld (hl),0x00 + inc hl + djnz l_usb_init_00162 +;source-doc/base-drv/usb_init.c:62: if (state != 2) { + bit 0, c + jr NZ,l_usb_init_00112 +;source-doc/base-drv/usb_init.c:63: usb_host_bus_reset(); + call _usb_host_bus_reset +;source-doc/base-drv/usb_init.c:64: delay_medium(); + call _delay_medium +l_usb_init_00112: +;source-doc/base-drv/usb_init.c:66: enumerate_all_devices(); + call _enumerate_all_devices +;source-doc/base-drv/usb_init.c:67: USB_MODULE_LEDS = 0x00; + ld a,0x00 + ld bc,_USB_MODULE_LEDS + out (c), a +;source-doc/base-drv/usb_init.c:68: return (uint16_t)count_of_devices() << 8 | state + 1; + call _count_of_devices + ld c,(ix+4) + ld b,0x00 + inc bc + or b + ld h, a + ld l, c +l_usb_init_00113: +;source-doc/base-drv/usb_init.c:69: } + pop ix + ret diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c new file mode 100644 index 00000000..642695a1 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c @@ -0,0 +1,74 @@ +#include "print.h" +#include "usb_init.h" + +static uint16_t wait_for_state(const uint8_t loop_counter, uint8_t state, const uint8_t desired_state) __sdcccall(1) { + uint16_t r = state; + + for (uint8_t i = 0; i < loop_counter; i++) { + if (state == desired_state) + break; + + if (i & 1) + print_string("\b $"); + else + print_string("\b*$"); + + r = usb_init(state); + state = r & 255; + } + + return r; +} + +static void _chnative_init(bool forced) { + uint8_t state = 0; + uint16_t r; + const uint8_t loop_counter = forced ? 40 : 5; + + print_string("\r\nCH376: *$"); + + r = wait_for_state(loop_counter, state, 1); + state = r & 255; + + print_string("\bPRESENT (VER $"); + + r = usb_init(state); + state = r & 255; + if (state != 2) { + print_string("\rCH376: $"); + print_string("VERSION FAILURE\r\n$"); + return; + } + + print_hex(r >> 8); + print_string("); $"); + + print_string("USB: *$"); + + r = wait_for_state(loop_counter, state, 3); + state = r & 255; + + if (state == 2) { + print_string("\bDISCONNECTED$"); + return; + } + + print_string("\bCONNECTED$"); + + // enumerate.... + r = usb_init(state); + state = r & 255; + + for (uint8_t i = 0; i < loop_counter; i++) { + if (r >> 8 != 0) + break; + + print_string(".$"); + r = usb_init(state); + state = r & 255; + } +} + +void chnative_init_force(void) { _chnative_init(true); } + +void chnative_init(void) { _chnative_init(false); } 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 deleted file mode 100644 index 5a5fea30..00000000 --- a/Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c +++ /dev/null @@ -1,142 +0,0 @@ -#include "ch376.h" -#include "enumerate.h" -#include "print.h" -#include "work-area.h" -#include "z80.h" -#include - -static usb_error usb_host_bus_reset(void) { - ch_cmd_set_usb_mode(CH_MODE_HOST); - delay_20ms(); - - ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); - delay_20ms(); - - ch_cmd_set_usb_mode(CH_MODE_HOST); - delay_20ms(); - - ch_configure_nak_retry_3s(); - - return USB_ERR_OK; -} - -#define ERASE_LINE "\x1B\x6C\r$" - -uint16_t ch376_init(uint8_t state) { - uint8_t r; - - USB_MODULE_LEDS = 0x03; - - if (state == 0) { - ch_cmd_reset_all(); - delay_medium(); - - if (!ch_probe()) { - USB_MODULE_LEDS = 0x00; - return 0xFF00; - } - USB_MODULE_LEDS = 0x00; - return 1; - } - - if (state == 1) { - r = ch_cmd_get_ic_version(); - - USB_MODULE_LEDS = 0x00; - return (uint16_t)r << 8 | 2; - } - - if (state == 2) { - usb_host_bus_reset(); - - r = ch_very_short_wait_int_and_get_status(); - - if (r != USB_INT_CONNECT) { - USB_MODULE_LEDS = 0x00; - return 2; - } - - return 3; - } - - memset(get_usb_work_area(), 0, sizeof(_usb_state)); - if (state != 2) { - usb_host_bus_reset(); - delay_medium(); - } - enumerate_all_devices(); - USB_MODULE_LEDS = 0x00; - return (uint16_t)count_of_devices() << 8 | state + 1; -} - -static uint16_t wait_for_state(const uint8_t loop_counter, uint8_t state, const uint8_t desired_state) __sdcccall(1) { - uint16_t r = state; - - for (uint8_t i = 0; i < loop_counter; i++) { - if (state == desired_state) - break; - - if (i & 1) - print_string("\b $"); - else - print_string("\b*$"); - - r = ch376_init(state); - state = r & 255; - } - - return r; -} - -void _chnative_init(bool forced) { - uint8_t state = 0; - uint16_t r; - const uint8_t loop_counter = forced ? 40 : 5; - - print_string("\r\nCH376: *$"); - - r = wait_for_state(loop_counter, state, 1); - state = r & 255; - - print_string("\bPRESENT (VER $"); - - r = ch376_init(state); - state = r & 255; - if (state != 2) { - print_string("\rCH376: $"); - print_string("VERSION FAILURE\r\n$"); - return; - } - - print_hex(r >> 8); - print_string("); $"); - - print_string("USB: *$"); - - r = wait_for_state(loop_counter, state, 3); - state = r & 255; - - if (state == 2) { - print_string("\bDISCONNECTED$"); - return; - } - - print_string("\bCONNECTED$"); - - // enumerate.... - r = ch376_init(state); - state = r & 255; - - for (uint8_t i = 0; i < loop_counter; i++) { - if (r >> 8 != 0) - break; - - print_string(".$"); - r = ch376_init(state); - state = r & 255; - } -} - -void chnative_init_force(void) { _chnative_init(true); } - -void chnative_init(void) { _chnative_init(false); } 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 new file mode 100644 index 00000000..319f9416 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.c @@ -0,0 +1,69 @@ +#include "usb_init.h" +#include "ch376.h" +#include "enumerate.h" +#include "work-area.h" +#include + +static usb_error usb_host_bus_reset(void) { + ch_cmd_set_usb_mode(CH_MODE_HOST); + delay_20ms(); + + ch_cmd_set_usb_mode(CH_MODE_HOST_RESET); + delay_20ms(); + + ch_cmd_set_usb_mode(CH_MODE_HOST); + delay_20ms(); + + ch_configure_nak_retry_3s(); + + return USB_ERR_OK; +} + +#define ERASE_LINE "\x1B\x6C\r$" + +uint16_t usb_init(uint8_t state) { + uint8_t r; + + USB_MODULE_LEDS = 0x03; + + if (state == 0) { + ch_cmd_reset_all(); + delay_medium(); + + if (!ch_probe()) { + USB_MODULE_LEDS = 0x00; + return 0xFF00; + } + USB_MODULE_LEDS = 0x00; + return 1; + } + + if (state == 1) { + r = ch_cmd_get_ic_version(); + + USB_MODULE_LEDS = 0x00; + return (uint16_t)r << 8 | 2; + } + + if (state == 2) { + usb_host_bus_reset(); + + r = ch_very_short_wait_int_and_get_status(); + + if (r != USB_INT_CONNECT) { + USB_MODULE_LEDS = 0x00; + return 2; + } + + return 3; + } + + memset(get_usb_work_area(), 0, sizeof(_usb_state)); + if (state != 2) { + usb_host_bus_reset(); + delay_medium(); + } + enumerate_all_devices(); + USB_MODULE_LEDS = 0x00; + return (uint16_t)count_of_devices() << 8 | state + 1; +} diff --git a/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h new file mode 100644 index 00000000..08808955 --- /dev/null +++ b/Source/HBIOS/ch376-native/source-doc/base-drv/usb_init.h @@ -0,0 +1,8 @@ +#ifndef __USB_INIT +#define __USB_INIT + +#include + +extern uint16_t usb_init(uint8_t state); + +#endif