Browse Source

ch376: added build option CHNATIVEFORCE to always force detection of module on boot

pull/592/head
Dean Netherton 1 year ago
parent
commit
72ec983c4f
  1. 2
      Dockerfile
  2. 1
      Source/HBIOS/Config/RCZ80_std.asm
  3. 1
      Source/HBIOS/cfg_MASTER.asm
  4. 5
      Source/HBIOS/ch376-native/Makefile
  5. 188
      Source/HBIOS/ch376-native/base-drv/usb-init.c.s
  6. 33
      Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c
  7. 1
      Source/HBIOS/ch376.asm
  8. 4
      Source/HBIOS/hbios.asm

2
Dockerfile

@ -16,7 +16,7 @@ FROM ubuntu:jammy-20240111 AS basebuilder
# cd Tools && make # cd Tools && make
# cd Source && make # at least once to build many common units # cd Source && make # at least once to build many common units
# cd Source && make rom ROM_PLATFORM=RCEZ80 ROM_CONFIG=std
# cd Source && make rom ROM_PLATFORM=RCZ80 ROM_CONFIG=std
# when finish, type 'exit' to return to back to your standard terminal session # when finish, type 'exit' to return to back to your standard terminal session

1
Source/HBIOS/Config/RCZ80_std.asm

@ -111,6 +111,7 @@ CHENABLE .SET FALSE ; CH: ENABLE CH375/376 USB SUPPORT
CH0USBENABLE .SET FALSE ; CH375: ENABLE CH375 USB DRIVER CH0USBENABLE .SET FALSE ; CH375: ENABLE CH375 USB DRIVER
CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 USB DRIVER CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 USB DRIVER
CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER CHNATIVEENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE USB DRIVER
CHNATIVEFORCE .SET TRUE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED
CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) CHSCSIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE)
CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE)
USBKYBENABLE .SET TRUE ; USB KEYBOARD DRIVER USBKYBENABLE .SET TRUE ; USB KEYBOARD DRIVER

1
Source/HBIOS/cfg_MASTER.asm

@ -505,3 +505,4 @@ EZ80_FWSMD_TYP .EQU EZ80WSMD_CALC ; WAIT STATE TYPE: EZ80RMMD_[CALC|WAIT] (CYCL
CHNATIVEENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE USB DRIVER CHNATIVEENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE USB DRIVER
CHSCSIENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE) CHSCSIENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE MASS STORAGE DEVICES (REQUIRES CHNATIVEENABLE)
CHUFIENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE) CHUFIENABLE .EQU FALSE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE)
CHNATIVEFORCE .EQU FALSE ; CH376: DISABLE AUTO-DETECTION OF MODULE - ASSUME ITS INSTALLED (REQUIRES CHNATIVEENABLE)

5
Source/HBIOS/ch376-native/Makefile

@ -79,3 +79,8 @@ $(eval $(call build_subsystem,base-drv))
$(eval $(call build_subsystem,scsi-drv)) $(eval $(call build_subsystem,scsi-drv))
$(eval $(call build_subsystem,keyboard)) $(eval $(call build_subsystem,keyboard))
$(eval $(call build_subsystem,ufi-drv)) $(eval $(call build_subsystem,ufi-drv))
.PHONY: format
format: SHELL:=/bin/bash
format:
@find \( -name "*.c" -o -name "*.h" \) -exec echo "formating {}" \; -exec clang-format -i {} \;

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

@ -83,11 +83,15 @@ _usb_host_bus_reset:
ld l,0x00 ld l,0x00
;source-doc/base-drv/usb-init.c:21: } ;source-doc/base-drv/usb-init.c:21: }
ret ret
;source-doc/base-drv/usb-init.c:25: void chnative_init(void) {
;source-doc/base-drv/usb-init.c:25: void _chnative_init(bool forced) {
; --------------------------------- ; ---------------------------------
; Function chnative_init
; Function _chnative_init
; --------------------------------- ; ---------------------------------
_chnative_init:
__chnative_init:
push ix
ld ix,0
add ix,sp
dec sp
;source-doc/base-drv/usb-init.c:26: memset(get_usb_work_area(), 0, sizeof(_usb_state)); ;source-doc/base-drv/usb-init.c:26: memset(get_usb_work_area(), 0, sizeof(_usb_state));
ld hl,_x ld hl,_x
ld (hl),0x00 ld (hl),0x00
@ -100,75 +104,175 @@ _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 (!ch_probe()) {
;source-doc/base-drv/usb-init.c:32: if(forced) {
bit 0,(ix+4)
jr Z,l__chnative_init_00110
;source-doc/base-drv/usb-init.c:33: bool indicator = true;
ld (ix-1),0x01
;source-doc/base-drv/usb-init.c:34: print_string("\r\nCH376: *$");
ld hl,usb_init_str_0
call _print_string
;source-doc/base-drv/usb-init.c:35: while(!ch_probe()) {
l__chnative_init_00104:
call _ch_probe call _ch_probe
ld a, l ld a, l
or a or a
jr NZ,l_chnative_init_00102
;source-doc/base-drv/usb-init.c:33: print_string("\r\nCH376: NOT PRESENT$");
;source-doc/base-drv/usb-init.c:34: return;
ld hl,usb_init_str_0
jp _print_string
l_chnative_init_00102:
;source-doc/base-drv/usb-init.c:37: print_string("\r\nCH376: PRESENT (VER $");
jr NZ,l__chnative_init_00106
;source-doc/base-drv/usb-init.c:36: if (indicator)
bit 0,(ix-1)
jr Z,l__chnative_init_00102
;source-doc/base-drv/usb-init.c:37: print_string("\b $");
ld hl,usb_init_str_1 ld hl,usb_init_str_1
call _print_string call _print_string
;source-doc/base-drv/usb-init.c:38: print_hex(ch_cmd_get_ic_version());
jr l__chnative_init_00103
l__chnative_init_00102:
;source-doc/base-drv/usb-init.c:39: print_string("\b*$");
ld hl,usb_init_str_2
call _print_string
l__chnative_init_00103:
;source-doc/base-drv/usb-init.c:41: delay_medium();
call _delay_medium
;source-doc/base-drv/usb-init.c:42: indicator = !indicator;
ld a,(ix-1)
xor 0x01
ld (ix-1),a
jr l__chnative_init_00104
l__chnative_init_00106:
;source-doc/base-drv/usb-init.c:45: print_string("\bPRESENT (VER $");
ld hl,usb_init_str_3
call _print_string
jr l__chnative_init_00111
l__chnative_init_00110:
;source-doc/base-drv/usb-init.c:48: if (!ch_probe()) {
call _ch_probe
ld a, l
or a
jr NZ,l__chnative_init_00108
;source-doc/base-drv/usb-init.c:49: print_string("\r\nCH376: NOT PRESENT$");
ld hl,usb_init_str_4
call _print_string
;source-doc/base-drv/usb-init.c:50: return;
jr l__chnative_init_00118
l__chnative_init_00108:
;source-doc/base-drv/usb-init.c:53: print_string("\r\nCH376: PRESENT (VER $");
ld hl,usb_init_str_5
call _print_string
l__chnative_init_00111:
;source-doc/base-drv/usb-init.c:56: 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:39: print_string("); $");
ld hl,usb_init_str_2
;source-doc/base-drv/usb-init.c:57: print_string("); $");
ld hl,usb_init_str_6
call _print_string call _print_string
;source-doc/base-drv/usb-init.c:41: usb_host_bus_reset();
;source-doc/base-drv/usb-init.c:59: usb_host_bus_reset();
call _usb_host_bus_reset call _usb_host_bus_reset
;source-doc/base-drv/usb-init.c:43: for (uint8_t i = 0; i < 4; i++) {
;source-doc/base-drv/usb-init.c:61: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) {
ld c,0x00 ld c,0x00
l_chnative_init_00107:
ld a, c
sub 0x04
jr NC,l_chnative_init_00105
;source-doc/base-drv/usb-init.c:44: const uint8_t r = ch_very_short_wait_int_and_get_();
l__chnative_init_00116:
bit 0,(ix+4)
jr Z,l__chnative_init_00120
ld de,0x000a
jr l__chnative_init_00121
l__chnative_init_00120:
ld de,0x0005
l__chnative_init_00121:
ld b, c
ld l,0x00
ld a, b
sub e
ld a, l
sbc a, d
jp PO, l__chnative_init_00185
xor 0x80
l__chnative_init_00185:
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_();
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:46: if (r == USB_INT_CONNECT) {
;source-doc/base-drv/usb-init.c:64: if (r == USB_INT_CONNECT) {
sub 0x81 sub 0x81
jr NZ,l_chnative_init_00108
;source-doc/base-drv/usb-init.c:47: print_string("USB: CONNECTED$");
ld hl,usb_init_str_3
jr NZ,l__chnative_init_00117
;source-doc/base-drv/usb-init.c:65: print_string("USB: CONNECTED$");
ld hl,usb_init_str_7
call _print_string call _print_string
;source-doc/base-drv/usb-init.c:49: enumerate_all_devices();
jp _enumerate_all_devices
;source-doc/base-drv/usb-init.c:51: return;
jr l_chnative_init_00109
l_chnative_init_00108:
;source-doc/base-drv/usb-init.c:43: for (uint8_t i = 0; i < 4; i++) {
;source-doc/base-drv/usb-init.c:67: enumerate_all_devices();
call _enumerate_all_devices
;source-doc/base-drv/usb-init.c:69: return;
jr l__chnative_init_00118
l__chnative_init_00117:
;source-doc/base-drv/usb-init.c:61: for (uint8_t i = 0; i < (forced ? 10 : 5); i++) {
inc c inc c
jr l_chnative_init_00107
l_chnative_init_00105:
;source-doc/base-drv/usb-init.c:55: print_string("USB: DISCONNECTED$");
ld hl,usb_init_str_4
jp _print_string
l_chnative_init_00109:
;source-doc/base-drv/usb-init.c:56: }
jr l__chnative_init_00116
l__chnative_init_00114:
;source-doc/base-drv/usb-init.c:73: print_string("USB: DISCONNECTED$");
ld hl,usb_init_str_8
call _print_string
l__chnative_init_00118:
;source-doc/base-drv/usb-init.c:74: }
inc sp
pop ix
ret ret
usb_init_str_0: usb_init_str_0:
DEFB 0x0d DEFB 0x0d
DEFB 0x0a DEFB 0x0a
DEFM "CH376: NOT PRESENT$"
DEFM "CH376: *$"
DEFB 0x00 DEFB 0x00
usb_init_str_1: usb_init_str_1:
DEFB 0x08
DEFM " $"
DEFB 0x00
usb_init_str_2:
DEFB 0x08
DEFM "*$"
DEFB 0x00
usb_init_str_3:
DEFB 0x08
DEFM "PRESENT (VER $"
DEFB 0x00
usb_init_str_4:
DEFB 0x0d
DEFB 0x0a
DEFM "CH376: NOT PRESENT$"
DEFB 0x00
usb_init_str_5:
DEFB 0x0d DEFB 0x0d
DEFB 0x0a DEFB 0x0a
DEFM "CH376: PRESENT (VER $" DEFM "CH376: PRESENT (VER $"
DEFB 0x00 DEFB 0x00
usb_init_str_2:
usb_init_str_6:
DEFM "); $" DEFM "); $"
DEFB 0x00 DEFB 0x00
usb_init_str_3:
usb_init_str_7:
DEFM "USB: CONNECTED$" DEFM "USB: CONNECTED$"
DEFB 0x00 DEFB 0x00
usb_init_str_4:
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) {
; ---------------------------------
; Function chnative_init_force
; ---------------------------------
_chnative_init_force:
;source-doc/base-drv/usb-init.c:78: _chnative_init(true);
ld a,0x01
push af
inc sp
call __chnative_init
inc sp
;source-doc/base-drv/usb-init.c:79: }
ret
;source-doc/base-drv/usb-init.c:81: void chnative_init(void) {
; ---------------------------------
; Function chnative_init
; ---------------------------------
_chnative_init:
;source-doc/base-drv/usb-init.c:82: _chnative_init(false);
xor a
push af
inc sp
call __chnative_init
inc sp
;source-doc/base-drv/usb-init.c:83: }
ret

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

@ -22,25 +22,42 @@ static usb_error usb_host_bus_reset(void) {
#define ERASE_LINE "\x1B\x6C\r$" #define ERASE_LINE "\x1B\x6C\r$"
void chnative_init(void) {
void _chnative_init(bool forced) {
memset(get_usb_work_area(), 0, sizeof(_usb_state)); memset(get_usb_work_area(), 0, sizeof(_usb_state));
ch_cmd_reset_all(); ch_cmd_reset_all();
delay_medium(); delay_medium();
if (!ch_probe()) {
print_string("\r\nCH376: NOT PRESENT$");
return;
if (forced) {
bool indicator = true;
print_string("\r\nCH376: *$");
while (!ch_probe()) {
if (indicator)
print_string("\b $");
else
print_string("\b*$");
delay_medium();
indicator = !indicator;
}
print_string("\bPRESENT (VER $");
} else {
if (!ch_probe()) {
print_string("\r\nCH376: NOT PRESENT$");
return;
}
print_string("\r\nCH376: PRESENT (VER $");
} }
print_string("\r\nCH376: PRESENT (VER $");
print_hex(ch_cmd_get_ic_version()); print_hex(ch_cmd_get_ic_version());
print_string("); $"); print_string("); $");
usb_host_bus_reset(); usb_host_bus_reset();
for (uint8_t i = 0; i < 4; i++) {
for (uint8_t i = 0; i < (forced ? 10 : 5); i++) {
const uint8_t r = ch_very_short_wait_int_and_get_status(); const uint8_t r = ch_very_short_wait_int_and_get_status();
if (r == USB_INT_CONNECT) { if (r == USB_INT_CONNECT) {
@ -54,3 +71,7 @@ void chnative_init(void) {
print_string("USB: DISCONNECTED$"); print_string("USB: DISCONNECTED$");
} }
void chnative_init_force(void) { _chnative_init(true); }
void chnative_init(void) { _chnative_init(false); }

1
Source/HBIOS/ch376.asm

@ -50,3 +50,4 @@ _dio_add_entry:
#include "./ch376-native/base-drv.s" #include "./ch376-native/base-drv.s"
CHNATIVE_INIT .EQU _chnative_init CHNATIVE_INIT .EQU _chnative_init
CHNATIVE_INITF .EQU _chnative_init_force

4
Source/HBIOS/hbios.asm

@ -3982,8 +3982,12 @@ HB_INITTBL:
#IF (CHNATIVEENABLE) #IF (CHNATIVEENABLE)
; NEED TO ENUMERATE USB DEVICES EARLY, SO THAT ACTUAL DRIVERS ; NEED TO ENUMERATE USB DEVICES EARLY, SO THAT ACTUAL DRIVERS
; WILL BE ABLE TO FIND THEM. ; WILL BE ABLE TO FIND THEM.
#IF (CHNATIVEFORCE)
.DW CHNATIVE_INITF
#ELSE
.DW CHNATIVE_INIT .DW CHNATIVE_INIT
#ENDIF #ENDIF
#ENDIF
#IF (KIOENABLE) #IF (KIOENABLE)
.DW KIO_INIT .DW KIO_INIT
#ENDIF #ENDIF

Loading…
Cancel
Save