Browse Source

ch376-native: fixed and extend indicator led operation

pull/592/head
Dean Netherton 1 year ago
parent
commit
93d7c7ed77
  1. 1
      Source/HBIOS/Config/RCEZ80_std.asm
  2. 93
      Source/HBIOS/ch376-native/base-drv/ch376.c.s
  3. 87
      Source/HBIOS/ch376-native/base-drv/usb-init.c.s
  4. 15
      Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c
  5. 14
      Source/HBIOS/ch376-native/source-doc/base-drv/usb-init.c

1
Source/HBIOS/Config/RCEZ80_std.asm

@ -87,6 +87,7 @@ CHENABLE .SET FALSE ; CH: ENABLE CH375/376 USB SUPPORT
CH0USBENABLE .SET FALSE ; CH375: ENABLE CH375 USB DRIVER
CH1USBENABLE .SET FALSE ; CH376: ENABLE CH376 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)
CHUFIENABLE .SET TRUE ; CH376: ENABLE CH376 NATIVE UFI FLOPPY DISK DEVICES (REQUIRES CHNATIVEENABLE)

93
Source/HBIOS/ch376-native/base-drv/ch376.c.s

@ -539,9 +539,10 @@ l_ch_data_in_transfer_00107:
pop bc
;source-doc/base-drv/ch376.c:172: if (count == 0) {
ld a, e
;source-doc/base-drv/ch376.c:173: USB_MODULE_LEDS = 0x00;
or a
jr NZ,l_ch_data_in_transfer_00106
;source-doc/base-drv/ch376.c:173: USB_MODULE_LEDS = 0x03;
ld a,0x03
ld bc,_USB_MODULE_LEDS
out (c),a
;source-doc/base-drv/ch376.c:174: return USB_ERR_DATA_ERROR;
@ -571,24 +572,28 @@ l_ch_data_in_transfer_00148:
xor 0x80
l_ch_data_in_transfer_00149:
jp M, l_ch_data_in_transfer_00107
;source-doc/base-drv/ch376.c:181: USB_MODULE_LEDS = 0x00;
ld a,0x00
;source-doc/base-drv/ch376.c:181: USB_MODULE_LEDS = 0x03;
ld a,0x03
ld bc,_USB_MODULE_LEDS
out (c),a
;source-doc/base-drv/ch376.c:183: return USB_ERR_OK;
;source-doc/base-drv/ch376.c:182: return USB_ERR_OK;
ld l,0x00
jr l_ch_data_in_transfer_00111
;source-doc/base-drv/ch376.c:184: done:
l_ch_data_in_transfer_00110:
;source-doc/base-drv/ch376.c:185: return result;
;source-doc/base-drv/ch376.c:185: USB_MODULE_LEDS = 0x03;
ld a,0x03
ld bc,_USB_MODULE_LEDS
out (c),a
;source-doc/base-drv/ch376.c:186: return result;
ld hl,(_result)
ld h,+((_result) / 256)
l_ch_data_in_transfer_00111:
;source-doc/base-drv/ch376.c:186: }
;source-doc/base-drv/ch376.c:187: }
ld sp, ix
pop ix
ret
;source-doc/base-drv/ch376.c:188: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) {
;source-doc/base-drv/ch376.c:189: usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) {
; ---------------------------------
; Function ch_data_in_transfer_n
; ---------------------------------
@ -596,21 +601,21 @@ _ch_data_in_transfer_n:
push ix
ld ix,0
add ix,sp
;source-doc/base-drv/ch376.c:192: USB_MODULE_LEDS = 0x01;
;source-doc/base-drv/ch376.c:193: USB_MODULE_LEDS = 0x01;
ld a,0x01
ld bc,_USB_MODULE_LEDS
out (c),a
;source-doc/base-drv/ch376.c:194: ch_issue_token_in(endpoint);
;source-doc/base-drv/ch376.c:195: ch_issue_token_in(endpoint);
ld l,(ix+8)
ld h,(ix+9)
call _ch_issue_token_in
;source-doc/base-drv/ch376.c:196: CHECK(ch_long_wait_int_and_get_status());
;source-doc/base-drv/ch376.c:197: CHECK(ch_long_wait_int_and_get_status());
call _ch_long_wait_int_and_get_statu
ld a, l
ld b, a
or a
jr NZ,l_ch_data_in_transfer_n_00103
;source-doc/base-drv/ch376.c:198: endpoint->toggle = !endpoint->toggle;
;source-doc/base-drv/ch376.c:199: endpoint->toggle = !endpoint->toggle;
ld e,(ix+8)
ld d,(ix+9)
ld c, e
@ -625,30 +630,36 @@ _ch_data_in_transfer_n:
and 0xfe
or e
ld (bc), a
;source-doc/base-drv/ch376.c:200: count = ch_read_data(buffer);
;source-doc/base-drv/ch376.c:201: count = ch_read_data(buffer);
ld l,(ix+4)
ld h,(ix+5)
call _ch_read_data
;source-doc/base-drv/ch376.c:202: *buffer_size = count;
;source-doc/base-drv/ch376.c:203: *buffer_size = count;
ld c,(ix+6)
ld b,(ix+7)
ld (bc), a
;source-doc/base-drv/ch376.c:204: USB_MODULE_LEDS = 0x00;
ld a,0x00
;source-doc/base-drv/ch376.c:205: USB_MODULE_LEDS = 0x03;
ld a,0x03
ld bc,_USB_MODULE_LEDS
out (c),a
;source-doc/base-drv/ch376.c:206: return USB_ERR_OK;
;source-doc/base-drv/ch376.c:207: return USB_ERR_OK;
ld l,0x00
jr l_ch_data_in_transfer_n_00104
;source-doc/base-drv/ch376.c:207: done:
;source-doc/base-drv/ch376.c:208: done:
l_ch_data_in_transfer_n_00103:
;source-doc/base-drv/ch376.c:208: return result;
;source-doc/base-drv/ch376.c:209: USB_MODULE_LEDS = 0x03;
ld a,0x03
push bc
ld bc,_USB_MODULE_LEDS
out (c),a
pop bc
;source-doc/base-drv/ch376.c:210: return result;
ld l, b
l_ch_data_in_transfer_n_00104:
;source-doc/base-drv/ch376.c:209: }
;source-doc/base-drv/ch376.c:211: }
pop ix
ret
;source-doc/base-drv/ch376.c:211: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) {
;source-doc/base-drv/ch376.c:213: usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, endpoint_param *const endpoint) {
; ---------------------------------
; Function ch_data_out_transfer
; ---------------------------------
@ -658,7 +669,7 @@ _ch_data_out_transfer:
add ix,sp
push af
dec sp
;source-doc/base-drv/ch376.c:214: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex);
;source-doc/base-drv/ch376.c:216: const uint8_t max_packet_size = calc_max_packet_size(endpoint->max_packet_sizex);
ld c,(ix+8)
ld b,(ix+9)
ld e, c
@ -666,13 +677,13 @@ _ch_data_out_transfer:
inc de
ld a, (de)
ld (ix-3),a
;source-doc/base-drv/ch376.c:216: USB_MODULE_LEDS = 0x02;
;source-doc/base-drv/ch376.c:218: USB_MODULE_LEDS = 0x02;
ld a,0x02
push bc
ld bc,_USB_MODULE_LEDS
out (c),a
pop bc
;source-doc/base-drv/ch376.c:218: while (buffer_length > 0) {
;source-doc/base-drv/ch376.c:220: while (buffer_length > 0) {
ld (ix-2),c
ld (ix-1),b
l_ch_data_out_transfer_00103:
@ -683,7 +694,7 @@ l_ch_data_out_transfer_00103:
xor 0x80
l_ch_data_out_transfer_00139:
jp P, l_ch_data_out_transfer_00105
;source-doc/base-drv/ch376.c:219: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length;
;source-doc/base-drv/ch376.c:221: const uint8_t size = max_packet_size < buffer_length ? max_packet_size : buffer_length;
ld d,(ix-3)
ld e,0x00
ld a, d
@ -699,7 +710,7 @@ l_ch_data_out_transfer_00109:
ld d,(ix+6)
ld e,(ix+7)
l_ch_data_out_transfer_00110:
;source-doc/base-drv/ch376.c:220: buffer = ch_write_data(buffer, size);
;source-doc/base-drv/ch376.c:222: buffer = ch_write_data(buffer, size);
push bc
push de
push de
@ -714,7 +725,7 @@ l_ch_data_out_transfer_00110:
pop bc
ld (ix+4),l
ld (ix+5),h
;source-doc/base-drv/ch376.c:221: buffer_length -= size;
;source-doc/base-drv/ch376.c:223: buffer_length -= size;
ld e,0x00
ld a,(ix+6)
sub d
@ -722,7 +733,7 @@ l_ch_data_out_transfer_00110:
ld a,(ix+7)
sbc a, e
ld (ix+7),a
;source-doc/base-drv/ch376.c:222: ch_issue_token_out(endpoint);
;source-doc/base-drv/ch376.c:224: ch_issue_token_out(endpoint);
ld l,c
ld h,b
push hl
@ -733,7 +744,7 @@ l_ch_data_out_transfer_00110:
ld l, a
or a
jr NZ,l_ch_data_out_transfer_00106
;source-doc/base-drv/ch376.c:226: endpoint->toggle = !endpoint->toggle;
;source-doc/base-drv/ch376.c:228: endpoint->toggle = !endpoint->toggle;
ld e, c
ld d, b
ld l,(ix-2)
@ -749,34 +760,40 @@ l_ch_data_out_transfer_00110:
ld (de), a
jr l_ch_data_out_transfer_00103
l_ch_data_out_transfer_00105:
;source-doc/base-drv/ch376.c:229: USB_MODULE_LEDS = 0x00;
ld a,0x00
;source-doc/base-drv/ch376.c:231: USB_MODULE_LEDS = 0x03;
ld a,0x03
ld bc,_USB_MODULE_LEDS
out (c),a
;source-doc/base-drv/ch376.c:231: return USB_ERR_OK;
;source-doc/base-drv/ch376.c:232: return USB_ERR_OK;
ld l,0x00
;source-doc/base-drv/ch376.c:232: done:
;source-doc/base-drv/ch376.c:233: return result;
jr l_ch_data_out_transfer_00107
;source-doc/base-drv/ch376.c:234: done:
l_ch_data_out_transfer_00106:
;source-doc/base-drv/ch376.c:234: }
;source-doc/base-drv/ch376.c:235: USB_MODULE_LEDS = 0x03;
ld a,0x03
ld bc,_USB_MODULE_LEDS
out (c),a
;source-doc/base-drv/ch376.c:236: return result;
l_ch_data_out_transfer_00107:
;source-doc/base-drv/ch376.c:237: }
ld sp, ix
pop ix
ret
;source-doc/base-drv/ch376.c:236: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall {
;source-doc/base-drv/ch376.c:239: void ch_set_usb_address(const uint8_t device_address) __z88dk_fastcall {
; ---------------------------------
; Function ch_set_usb_address
; ---------------------------------
_ch_set_usb_address:
;source-doc/base-drv/ch376.c:237: ch_command(CH_CMD_SET_USB_ADDR);
;source-doc/base-drv/ch376.c:240: ch_command(CH_CMD_SET_USB_ADDR);
push hl
ld l,0x13
call _ch_command
pop hl
;source-doc/base-drv/ch376.c:238: CH376_DATA_PORT = device_address;
;source-doc/base-drv/ch376.c:241: CH376_DATA_PORT = device_address;
ld a, l
ld bc,_CH376_DATA_PORT
out (c),a
;source-doc/base-drv/ch376.c:239: }
;source-doc/base-drv/ch376.c:242: }
ret
_result:
DEFB +0x00

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

@ -100,73 +100,92 @@ __chnative_init:
inc de
ld bc,0x0068
ldir
;source-doc/base-drv/usb-init.c:28: ch_cmd_reset_all();
;source-doc/base-drv/usb-init.c:28: USB_MODULE_LEDS = 0x00;
ld a,0x00
ld bc,_USB_MODULE_LEDS
out (c),a
;source-doc/base-drv/usb-init.c:30: 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:32: delay_medium();
call _delay_medium
;source-doc/base-drv/usb-init.c:32: if (forced) {
;source-doc/base-drv/usb-init.c:34: if (forced) {
bit 0,(ix+4)
jr Z,l__chnative_init_00110
;source-doc/base-drv/usb-init.c:33: bool indicator = true;
;source-doc/base-drv/usb-init.c:35: bool indicator = true;
ld (ix-1),0x01
;source-doc/base-drv/usb-init.c:34: print_string("\r\nCH376: *$");
;source-doc/base-drv/usb-init.c:36: print_string("\r\nCH376: *$");
ld hl,usb_init_str_0
call _print_string
;source-doc/base-drv/usb-init.c:35: while (!ch_probe()) {
;source-doc/base-drv/usb-init.c:37: while (!ch_probe()) {
l__chnative_init_00104:
call _ch_probe
ld a, l
or a
jr NZ,l__chnative_init_00106
;source-doc/base-drv/usb-init.c:36: if (indicator)
;source-doc/base-drv/usb-init.c:38: if (indicator) {
bit 0,(ix-1)
jr Z,l__chnative_init_00102
;source-doc/base-drv/usb-init.c:37: print_string("\b $");
;source-doc/base-drv/usb-init.c:39: USB_MODULE_LEDS = 0x00;
ld a,0x00
ld bc,_USB_MODULE_LEDS
out (c),a
;source-doc/base-drv/usb-init.c:40: print_string("\b $");
ld hl,usb_init_str_1
call _print_string
jr l__chnative_init_00103
l__chnative_init_00102:
;source-doc/base-drv/usb-init.c:39: print_string("\b*$");
;source-doc/base-drv/usb-init.c:42: USB_MODULE_LEDS = 0x03;
ld a,0x03
ld bc,_USB_MODULE_LEDS
out (c),a
;source-doc/base-drv/usb-init.c:43: 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();
;source-doc/base-drv/usb-init.c:46: delay_medium();
call _delay_medium
;source-doc/base-drv/usb-init.c:42: indicator = !indicator;
;source-doc/base-drv/usb-init.c:47: 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 $");
;source-doc/base-drv/usb-init.c:50: 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:47: if (!ch_probe()) {
;source-doc/base-drv/usb-init.c:52: if (!ch_probe()) {
call _ch_probe
ld a, l
;source-doc/base-drv/usb-init.c:53: USB_MODULE_LEDS = 0x00;
or a
jr NZ,l__chnative_init_00108
;source-doc/base-drv/usb-init.c:48: print_string("\r\nCH376: NOT PRESENT$");
ld bc,_USB_MODULE_LEDS
out (c),a
;source-doc/base-drv/usb-init.c:54: print_string("\r\nCH376: NOT PRESENT$");
ld hl,usb_init_str_4
call _print_string
;source-doc/base-drv/usb-init.c:49: return;
;source-doc/base-drv/usb-init.c:55: return;
jr l__chnative_init_00118
l__chnative_init_00108:
;source-doc/base-drv/usb-init.c:52: print_string("\r\nCH376: PRESENT (VER $");
;source-doc/base-drv/usb-init.c:58: 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:55: print_hex(ch_cmd_get_ic_version());
;source-doc/base-drv/usb-init.c:61: USB_MODULE_LEDS = 0x01;
ld a,0x01
ld bc,_USB_MODULE_LEDS
out (c),a
;source-doc/base-drv/usb-init.c:63: print_hex(ch_cmd_get_ic_version());
call _ch_cmd_get_ic_version
call _print_hex
;source-doc/base-drv/usb-init.c:56: print_string("); $");
;source-doc/base-drv/usb-init.c:64: print_string("); $");
ld hl,usb_init_str_6
call _print_string
;source-doc/base-drv/usb-init.c:58: usb_host_bus_reset();
;source-doc/base-drv/usb-init.c:66: usb_host_bus_reset();
call _usb_host_bus_reset
;source-doc/base-drv/usb-init.c:60: 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 ? 10 : 5); i++) {
ld c,0x00
l__chnative_init_00116:
bit 0,(ix+4)
@ -186,31 +205,39 @@ l__chnative_init_00121:
xor 0x80
l__chnative_init_00185:
jp P, l__chnative_init_00114
;source-doc/base-drv/usb-init.c:61: const uint8_t r = ch_very_short_wait_int_and_get_();
;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
ld a, l
pop bc
;source-doc/base-drv/usb-init.c:63: if (r == USB_INT_CONNECT) {
;source-doc/base-drv/usb-init.c:71: if (r == USB_INT_CONNECT) {
sub 0x81
jr NZ,l__chnative_init_00117
;source-doc/base-drv/usb-init.c:64: print_string("USB: CONNECTED$");
;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:66: enumerate_all_devices();
;source-doc/base-drv/usb-init.c:74: enumerate_all_devices();
call _enumerate_all_devices
;source-doc/base-drv/usb-init.c:68: return;
;source-doc/base-drv/usb-init.c:76: 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:60: 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 ? 10 : 5); i++) {
inc c
jr l__chnative_init_00116
l__chnative_init_00114:
;source-doc/base-drv/usb-init.c:72: print_string("USB: DISCONNECTED$");
;source-doc/base-drv/usb-init.c:81: 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
call _print_string
l__chnative_init_00118:
;source-doc/base-drv/usb-init.c:73: }
;source-doc/base-drv/usb-init.c:83: }
inc sp
pop ix
ret
@ -250,7 +277,7 @@ usb_init_str_7:
usb_init_str_8:
DEFM "USB: DISCONNECTED$"
DEFB 0x00
;source-doc/base-drv/usb-init.c:75: void chnative_init_force(void) { _chnative_init(true); }
;source-doc/base-drv/usb-init.c:85: void chnative_init_force(void) { _chnative_init(true); }
; ---------------------------------
; Function chnative_init_force
; ---------------------------------
@ -261,7 +288,7 @@ _chnative_init_force:
call __chnative_init
inc sp
ret
;source-doc/base-drv/usb-init.c:77: void chnative_init(void) { _chnative_init(false); }
;source-doc/base-drv/usb-init.c:87: void chnative_init(void) { _chnative_init(false); }
; ---------------------------------
; Function chnative_init
; ---------------------------------

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

@ -170,7 +170,7 @@ usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_par
count = ch_read_data(buffer);
if (count == 0) {
USB_MODULE_LEDS = 0x00;
USB_MODULE_LEDS = 0x03;
return USB_ERR_DATA_ERROR;
}
@ -178,10 +178,11 @@ usb_error ch_data_in_transfer(uint8_t *buffer, int16_t buffer_size, endpoint_par
buffer_size -= count;
} while (buffer_size > 0);
USB_MODULE_LEDS = 0x00;
USB_MODULE_LEDS = 0x03;
return USB_ERR_OK;
done:
USB_MODULE_LEDS = 0x03;
return result;
}
@ -201,10 +202,11 @@ usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size
*buffer_size = count;
USB_MODULE_LEDS = 0x00;
USB_MODULE_LEDS = 0x03;
return USB_ERR_OK;
done:
USB_MODULE_LEDS = 0x03;
return result;
}
@ -226,10 +228,11 @@ usb_error ch_data_out_transfer(const uint8_t *buffer, int16_t buffer_length, end
endpoint->toggle = !endpoint->toggle;
}
USB_MODULE_LEDS = 0x00;
USB_MODULE_LEDS = 0x03;
return USB_ERR_OK;
done:
USB_MODULE_LEDS = 0x03;
return result;
}

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

@ -25,6 +25,8 @@ static usb_error usb_host_bus_reset(void) {
void _chnative_init(bool forced) {
memset(get_usb_work_area(), 0, sizeof(_usb_state));
USB_MODULE_LEDS = 0x00;
ch_cmd_reset_all();
delay_medium();
@ -33,10 +35,13 @@ void _chnative_init(bool forced) {
bool indicator = true;
print_string("\r\nCH376: *$");
while (!ch_probe()) {
if (indicator)
if (indicator) {
USB_MODULE_LEDS = 0x00;
print_string("\b $");
else
} else {
USB_MODULE_LEDS = 0x03;
print_string("\b*$");
}
delay_medium();
indicator = !indicator;
@ -45,6 +50,7 @@ void _chnative_init(bool forced) {
print_string("\bPRESENT (VER $");
} else {
if (!ch_probe()) {
USB_MODULE_LEDS = 0x00;
print_string("\r\nCH376: NOT PRESENT$");
return;
}
@ -52,6 +58,8 @@ void _chnative_init(bool forced) {
print_string("\r\nCH376: PRESENT (VER $");
}
USB_MODULE_LEDS = 0x01;
print_hex(ch_cmd_get_ic_version());
print_string("); $");
@ -65,10 +73,12 @@ void _chnative_init(bool forced) {
enumerate_all_devices();
USB_MODULE_LEDS = 0x03;
return;
}
}
USB_MODULE_LEDS = 0x00;
print_string("USB: DISCONNECTED$");
}

Loading…
Cancel
Save