Browse Source

Merge pull request #609 from dinoboards/dean-dev-2025-08-30-ch376-issue

ch376native: fix issue with CH376S modules with VER 3 firmware.
pull/614/head
Wayne Warthen 5 months ago
committed by GitHub
parent
commit
1a38b97e51
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 4
      Source/HBIOS/ch376-native/base-drv/ch376.c.s
  2. 141
      Source/HBIOS/ch376-native/base-drv/enumerate.c.s
  3. 4
      Source/HBIOS/ch376-native/base-drv/usb-base-drv.c.s
  4. 2
      Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c
  5. 2
      Source/HBIOS/ch376-native/source-doc/base-drv/ch376_init.c
  6. 5
      Source/HBIOS/ch376-native/source-doc/base-drv/ch376inc.h
  7. 8
      Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c
  8. 2
      Source/HBIOS/ch376-native/source-doc/base-drv/usb-base-drv.c

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

@ -234,8 +234,8 @@ l_ch_probe_00103:
ld l,$01 ld l,$01
jr l_ch_probe_00107 jr l_ch_probe_00107
l_ch_probe_00102: l_ch_probe_00102:
;source-doc/base-drv/ch376.c:104: delay_medium();
call _delay_medium
;source-doc/base-drv/ch376.c:104: delay_short();
call _delay_short
;source-doc/base-drv/ch376.c:105: } while (--i != 0); ;source-doc/base-drv/ch376.c:105: } while (--i != 0);
dec (ix-1) dec (ix-1)
jr NZ,l_ch_probe_00103 jr NZ,l_ch_probe_00103

141
Source/HBIOS/ch376-native/base-drv/enumerate.c.s

@ -952,104 +952,115 @@ _read_all_configs:
push ix push ix
ld ix,0 ld ix,0
add ix,sp add ix,sp
ld hl, -171
ld hl, -174
add hl, sp add hl, sp
ld sp, hl ld sp, hl
;source-doc/base-drv/enumerate.c:212: memset(&working, 0, sizeof(_working));
;source-doc/base-drv/enumerate.c:213: memset(&working, 0, sizeof(_working));
ld hl,0 ld hl,0
add hl, sp add hl, sp
ld e,l
ld d,h
ld b,$56
jr l_read_all_configs_00150
l_read_all_configs_00149:
ld (hl),$00
inc hl
l_read_all_configs_00150:
ld (hl),$00 ld (hl),$00
inc hl
djnz l_read_all_configs_00149
;source-doc/base-drv/enumerate.c:213: working.state = state;
ld l, e
ld h, d
ld e, l
ld d, h
inc de
ld bc,$00aa
ldir
;source-doc/base-drv/enumerate.c:214: working.state = state;
ld a,(ix+4) ld a,(ix+4)
ld hl,0
add hl, sp
ld (hl), a ld (hl), a
inc hl
ld a,(ix+5) ld a,(ix+5)
inc hl
ld (hl), a ld (hl), a
;source-doc/base-drv/enumerate.c:215: CHECK(usbtrn_get_descriptor(&working.desc));
push de
ld hl,5
;source-doc/base-drv/enumerate.c:216: retry:
ld a,(ix+4)
ld (ix-3),a
ld a,(ix+5)
ld (ix-2),a
ld (ix-1),$00
l_read_all_configs_00101:
;source-doc/base-drv/enumerate.c:217: CHECK(usbtrn_get_descriptor(&working.desc));
ld hl,3
add hl, sp add hl, sp
push hl push hl
call _usbtrn_get_descriptor call _usbtrn_get_descriptor
pop af pop af
ld a, l ld a, l
pop de
or a or a
jr NZ,l_read_all_configs_00108
;source-doc/base-drv/enumerate.c:217: state->next_device_address++;
ld b,(ix+5)
ld a,(ix+4)
ld l, a
ld h, b
jr NZ,l_read_all_configs_00109
;source-doc/base-drv/enumerate.c:219: state->next_device_address++;
ld l,(ix-3)
ld h,(ix-2)
ld c, (hl) ld c, (hl)
inc c inc c
ld l, a
ld h, b
ld (hl), c ld (hl), c
;source-doc/base-drv/enumerate.c:218: working.current_device_address = state->next_device_address;
ld hl,$0018
add hl, de
;source-doc/base-drv/enumerate.c:220: working.current_device_address = state->next_device_address;
ld hl,24
add hl, sp
ld (hl), c ld (hl), c
;source-doc/base-drv/enumerate.c:219: CHECK(usbtrn_set_address(working.current_device_address));
push de
;source-doc/base-drv/enumerate.c:221: CHECK(usbtrn_set_address(working.current_device_address));
ld l, c ld l, c
call _usbtrn_set_address call _usbtrn_set_address
ld a, l ld a, l
pop de
;source-doc/base-drv/enumerate.c:221: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) {
;source-doc/base-drv/enumerate.c:223: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) {
or a or a
jr NZ,l_read_all_configs_00108
jr NZ,l_read_all_configs_00109
ld c,a ld c,a
l_read_all_configs_00110:
l_read_all_configs_00114:
ld hl,20 ld hl,20
add hl, sp add hl, sp
ld b, (hl) ld b, (hl)
ld a, c ld a, c
sub b sub b
jr NC,l_read_all_configs_00107
;source-doc/base-drv/enumerate.c:222: working.config_index = config_index;
ld hl,$0015
add hl, de
jr NC,l_read_all_configs_00108
;source-doc/base-drv/enumerate.c:224: working.config_index = config_index;
ld hl,21
add hl, sp
ld b,l
ld (hl), c ld (hl), c
;source-doc/base-drv/enumerate.c:224: CHECK(op_get_cfg_desc(&working));
ld l, e
ld h, d
;source-doc/base-drv/enumerate.c:226: CHECK(op_get_cfg_desc(&working));
push bc push bc
push de
ld hl,2
add hl, sp
call _op_get_cfg_desc call _op_get_cfg_desc
pop de
ld l, a
pop bc pop bc
ld a, l
or a or a
jr NZ,l_read_all_configs_00108
;source-doc/base-drv/enumerate.c:221: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) {
jr NZ,l_read_all_configs_00109
;source-doc/base-drv/enumerate.c:223: for (uint8_t config_index = 0; config_index < working.desc.bNumConfigurations; config_index++) {
inc c inc c
jr l_read_all_configs_00110
l_read_all_configs_00107:
;source-doc/base-drv/enumerate.c:227: return USB_ERR_OK;
ld l,$00
jr l_read_all_configs_00112
;source-doc/base-drv/enumerate.c:228: done:
jr l_read_all_configs_00114
l_read_all_configs_00108: l_read_all_configs_00108:
;source-doc/base-drv/enumerate.c:229: return result;
ld l, a
l_read_all_configs_00112:
;source-doc/base-drv/enumerate.c:230: }
;source-doc/base-drv/enumerate.c:229: return USB_ERR_OK;
ld l,$00
jr l_read_all_configs_00116
;source-doc/base-drv/enumerate.c:230: done:
l_read_all_configs_00109:
;source-doc/base-drv/enumerate.c:231: if (result == USB_ERR_STALL && retry_count == 0) {
ld a, l
sub $02
jr NZ,l_read_all_configs_00111
ld a,(ix-1)
or a
jr NZ,l_read_all_configs_00111
;source-doc/base-drv/enumerate.c:232: retry_count++;
inc (ix-1)
;source-doc/base-drv/enumerate.c:233: ch_command(CMD1H_CLR_STALL);
ld l,$41
call _ch_command
;source-doc/base-drv/enumerate.c:234: ch_get_status();
call _ch_get_status
;source-doc/base-drv/enumerate.c:235: goto retry;
jr l_read_all_configs_00101
l_read_all_configs_00111:
;source-doc/base-drv/enumerate.c:237: return result;
l_read_all_configs_00116:
;source-doc/base-drv/enumerate.c:238: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret
;source-doc/base-drv/enumerate.c:232: usb_error enumerate_all_devices(void) {
;source-doc/base-drv/enumerate.c:240: usb_error enumerate_all_devices(void) {
; --------------------------------- ; ---------------------------------
; Function enumerate_all_devices ; Function enumerate_all_devices
; --------------------------------- ; ---------------------------------
@ -1058,8 +1069,8 @@ _enumerate_all_devices:
ld ix,0 ld ix,0
add ix,sp add ix,sp
push af push af
;source-doc/base-drv/enumerate.c:233: _usb_state *const work_area = get_usb_work_area();
;source-doc/base-drv/enumerate.c:235: memset(&state, 0, sizeof(enumeration_state));
;source-doc/base-drv/enumerate.c:241: _usb_state *const work_area = get_usb_work_area();
;source-doc/base-drv/enumerate.c:243: memset(&state, 0, sizeof(enumeration_state));
ld hl,0 ld hl,0
add hl, sp add hl, sp
ld e,l ld e,l
@ -1068,18 +1079,18 @@ _enumerate_all_devices:
ld (hl), a ld (hl), a
inc hl inc hl
ld (hl), a ld (hl), a
;source-doc/base-drv/enumerate.c:237: usb_error result = read_all_configs(&state);
;source-doc/base-drv/enumerate.c:245: usb_error result = read_all_configs(&state);
push de push de
push de push de
call _read_all_configs call _read_all_configs
pop af pop af
pop de pop de
;source-doc/base-drv/enumerate.c:239: work_area->count_of_detected_usb_devices = state.next_device_address;
;source-doc/base-drv/enumerate.c:247: work_area->count_of_detected_usb_devices = state.next_device_address;
ld bc,_x + 1 ld bc,_x + 1
ld a, (de) ld a, (de)
ld (bc), a ld (bc), a
;source-doc/base-drv/enumerate.c:242: return result;
;source-doc/base-drv/enumerate.c:243: }
;source-doc/base-drv/enumerate.c:250: return result;
;source-doc/base-drv/enumerate.c:251: }
ld sp, ix ld sp, ix
pop ix pop ix
ret ret

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

@ -95,8 +95,8 @@ _usb_init:
jr NZ,l_usb_init_00104 jr NZ,l_usb_init_00104
;source-doc/base-drv/usb-base-drv.c:30: ch_cmd_reset_all(); ;source-doc/base-drv/usb-base-drv.c:30: ch_cmd_reset_all();
call _ch_cmd_reset_all call _ch_cmd_reset_all
;source-doc/base-drv/usb-base-drv.c:31: delay_medium();
call _delay_medium
;source-doc/base-drv/usb-base-drv.c:31: delay_short();
call _delay_short
;source-doc/base-drv/usb-base-drv.c:33: if (!ch_probe()) { ;source-doc/base-drv/usb-base-drv.c:33: if (!ch_probe()) {
call _ch_probe call _ch_probe
ld a, l ld a, l

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

@ -101,7 +101,7 @@ uint8_t ch_probe(void) {
if (ch_cmd_check_exist()) if (ch_cmd_check_exist())
return true; return true;
delay_medium();
delay_short();
} while (--i != 0); } while (--i != 0);
return false; return false;

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

@ -26,7 +26,7 @@ extern uint8_t CH376_DAT_PORT_ADDR;
extern uint8_t CH376_CMD_PORT_ADDR; extern uint8_t CH376_CMD_PORT_ADDR;
extern uint8_t USB_MOD_LEDS_ADDR; extern uint8_t USB_MOD_LEDS_ADDR;
// there is a weird bug with the compilier - somtimes string literals containing
// there is a weird bug with the compiler - sometimes string literals containing
// a dollar sign -- the dollar sign is ignored! // a dollar sign -- the dollar sign is ignored!
const char comma_0_x_dollar[] = {' ', '0', 'x', '$'}; const char comma_0_x_dollar[] = {' ', '0', 'x', '$'};

5
Source/HBIOS/ch376-native/source-doc/base-drv/ch376inc.h

@ -139,8 +139,9 @@ typedef unsigned char volatile *PUINT8V;
* input: mode code * input: mode code
* 00H=Device mode not enabled * 00H=Device mode not enabled
* 01H=Device mode enabled and using external firmware mode (serial port not * 01H=Device mode enabled and using external firmware mode (serial port not
* supported) 02H=Device mode enabled and using built-in firmware mode 03H=SD
* card host mode/inactive host mode, used to manage and access files in SD card
* supported)
* 02H=Device mode enabled and using built-in firmware mode
* 03H=SD card host mode/inactive host mode, used to manage and access files in SD card
* 04H=Host mode not enabled * 04H=Host mode not enabled
* 05H=Host mode enabled * 05H=Host mode enabled
* 06H=Host mode enabled and SOF packet generated automatically * 06H=Host mode enabled and SOF packet generated automatically

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

@ -207,11 +207,13 @@ done:
usb_error read_all_configs(enumeration_state *const state) { usb_error read_all_configs(enumeration_state *const state) {
uint8_t result; uint8_t result;
_usb_state *const work_area = get_usb_work_area(); _usb_state *const work_area = get_usb_work_area();
uint8_t retry_count = 0;
_working working; _working working;
memset(&working, 0, sizeof(_working)); memset(&working, 0, sizeof(_working));
working.state = state; working.state = state;
retry:
CHECK(usbtrn_get_descriptor(&working.desc)); CHECK(usbtrn_get_descriptor(&working.desc));
state->next_device_address++; state->next_device_address++;
@ -226,6 +228,12 @@ usb_error read_all_configs(enumeration_state *const state) {
return USB_ERR_OK; return USB_ERR_OK;
done: done:
if (result == USB_ERR_STALL && retry_count == 0) {
retry_count++;
ch_command(CMD1H_CLR_STALL);
ch_get_status();
goto retry;
}
return result; return result;
} }

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

@ -28,7 +28,7 @@ uint16_t usb_init(uint8_t state) __z88dk_fastcall {
if (state == 0) { if (state == 0) {
ch_cmd_reset_all(); ch_cmd_reset_all();
delay_medium();
delay_short();
if (!ch_probe()) { if (!ch_probe()) {
USB_MODULE_LEDS = 0x00; USB_MODULE_LEDS = 0x00;

Loading…
Cancel
Save