Browse Source

ch376-native: fixed issue with enumerating devices with interfaces containing no endpoints

pull/592/head
Dean Netherton 9 months ago
parent
commit
7e8560f9a9
  1. 8
      Source/HBIOS/ch376-native/base-drv/enumerate.c.s
  2. 214
      Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s
  3. 2
      Source/HBIOS/ch376-native/source-doc/base-drv/ch376.c
  4. 2
      Source/HBIOS/ch376-native/source-doc/base-drv/enumerate.c
  5. 2
      Source/HBIOS/ch376-native/source-doc/base-drv/transfers.c
  6. 7
      Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c
  7. 5
      Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h
  8. 2
      Source/HBIOS/ch376scsi.asm

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

@ -245,10 +245,12 @@ l_op_interface_next_00103:
; ---------------------------------
_op_endpoint_next:
ex de, hl
;source-doc/base-drv/enumerate.c:49: if (--working->endpoint_count > 0) {
;source-doc/base-drv/enumerate.c:49: if (working->endpoint_count != 0 && --working->endpoint_count > 0) {
ld hl,0x0017
add hl, de
ld a, (hl)
or a
jr Z,l_op_endpoint_next_00102
dec a
ld (hl), a
or a
@ -271,13 +273,13 @@ _op_endpoint_next:
;source-doc/base-drv/enumerate.c:51: return op_parse_endpoint(working);
ex de, hl
jp _op_parse_endpoint
jr l_op_endpoint_next_00103
jr l_op_endpoint_next_00104
l_op_endpoint_next_00102:
;source-doc/base-drv/enumerate.c:54: return op_interface_next(working);
ex de, hl
call _op_interface_next
ld a, l
l_op_endpoint_next_00103:
l_op_endpoint_next_00104:
;source-doc/base-drv/enumerate.c:55: }
ret
;source-doc/base-drv/enumerate.c:57: usb_error op_parse_endpoint(_working *const working) __sdcccall(1) {

214
Source/HBIOS/ch376-native/scsi-drv/class_scsi.c.s

@ -39,7 +39,7 @@ _next_tag:
DEFS 2
_csw:
DEFS 13
_scsi_read_capacity:
_scsi_packet_read_capacity:
DEFS 12
_scsi_packet_inquiry:
DEFS 12
@ -62,7 +62,7 @@ _cbw:
;--------------------------------------------------------
; code
;--------------------------------------------------------
;source-doc/scsi-drv/class_scsi.c:12: usb_error do_scsi_cmd(device_config_storage *const dev,
;source-doc/scsi-drv/class_scsi.c:13: usb_error do_scsi_cmd(device_config_storage *const dev,
; ---------------------------------
; Function do_scsi_cmd
; ---------------------------------
@ -73,7 +73,7 @@ _do_scsi_cmd:
ld hl, -8
add hl, sp
ld sp, hl
;source-doc/scsi-drv/class_scsi.c:17: cbw->dCBWTag[0] = next_tag++;
;source-doc/scsi-drv/class_scsi.c:18: cbw->dCBWTag[0] = next_tag++;
ld c,(ix+6)
ld b,(ix+7)
ld hl,0x0004
@ -91,19 +91,19 @@ _do_scsi_cmd:
ld (hl), e
inc hl
ld (hl), d
;source-doc/scsi-drv/class_scsi.c:19: if (!send)
;source-doc/scsi-drv/class_scsi.c:20: if (!send)
bit 0,(ix+10)
jr NZ,l_do_scsi_cmd_00102
;source-doc/scsi-drv/class_scsi.c:20: cbw->bmCBWFlags = 0x80;
;source-doc/scsi-drv/class_scsi.c:21: cbw->bmCBWFlags = 0x80;
ld hl,0x000c
add hl, bc
ld (hl),0x80
l_do_scsi_cmd_00102:
;source-doc/scsi-drv/class_scsi.c:22: critical_begin();
;source-doc/scsi-drv/class_scsi.c:23: critical_begin();
push bc
call _critical_begin
pop bc
;source-doc/scsi-drv/class_scsi.c:25: &dev->endpoints[ENDPOINT_BULK_OUT]));
;source-doc/scsi-drv/class_scsi.c:26: &dev->endpoints[ENDPOINT_BULK_OUT]));
ld a,(ix+4)
ld (ix-6),a
ld e, a
@ -148,7 +148,7 @@ l_do_scsi_cmd_00102:
ld a,(_result)
or a
jp NZ, l_do_scsi_cmd_00120
;source-doc/scsi-drv/class_scsi.c:27: if (cbw->dCBWDataTransferLength != 0) {
;source-doc/scsi-drv/class_scsi.c:28: if (cbw->dCBWDataTransferLength != 0) {
ld hl,8
add hl, bc
ld c, (hl)
@ -163,15 +163,15 @@ l_do_scsi_cmd_00102:
or b
or c
jr Z,l_do_scsi_cmd_00113
;source-doc/scsi-drv/class_scsi.c:30: &dev->endpoints[ENDPOINT_BULK_IN]));
;source-doc/scsi-drv/class_scsi.c:31: &dev->endpoints[ENDPOINT_BULK_IN]));
ld a,(ix+8)
ld (ix-2),a
ld a,(ix+9)
ld (ix-1),a
;source-doc/scsi-drv/class_scsi.c:28: if (!send) {
;source-doc/scsi-drv/class_scsi.c:29: if (!send) {
bit 0,(ix+10)
jr NZ,l_do_scsi_cmd_00110
;source-doc/scsi-drv/class_scsi.c:30: &dev->endpoints[ENDPOINT_BULK_IN]));
;source-doc/scsi-drv/class_scsi.c:31: &dev->endpoints[ENDPOINT_BULK_IN]));
ld a,(ix-6)
add a,0x06
ld e, a
@ -205,7 +205,7 @@ l_do_scsi_cmd_00102:
jr Z,l_do_scsi_cmd_00113
jp l_do_scsi_cmd_00120
l_do_scsi_cmd_00110:
;source-doc/scsi-drv/class_scsi.c:34: &dev->endpoints[ENDPOINT_BULK_OUT]));
;source-doc/scsi-drv/class_scsi.c:35: &dev->endpoints[ENDPOINT_BULK_OUT]));
ld l,(ix-4)
ld h,(ix-3)
ld a, (hl)
@ -232,7 +232,7 @@ l_do_scsi_cmd_00110:
or a
jr NZ,l_do_scsi_cmd_00120
l_do_scsi_cmd_00113:
;source-doc/scsi-drv/class_scsi.c:39: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN]));
;source-doc/scsi-drv/class_scsi.c:40: usb_data_in_transfer((uint8_t *)&csw, sizeof(_scsi_command_status_wrapper), dev->address, &dev->endpoints[ENDPOINT_BULK_IN]));
ld a,(ix-6)
add a,0x06
ld e, a
@ -265,7 +265,7 @@ l_do_scsi_cmd_00113:
ld a,(_result)
or a
jr NZ,l_do_scsi_cmd_00120
;source-doc/scsi-drv/class_scsi.c:41: if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0])
;source-doc/scsi-drv/class_scsi.c:42: if (csw.bCSWStatus != 0 && csw.dCSWTag[0] != cbw->dCBWTag[0])
ld a, (_csw + 12)
or a
jr Z,l_do_scsi_cmd_00117
@ -279,36 +279,36 @@ l_do_scsi_cmd_00113:
xor a
sbc hl,bc
jr Z,l_do_scsi_cmd_00117
;source-doc/scsi-drv/class_scsi.c:42: result = USB_ERR_FAIL;
;source-doc/scsi-drv/class_scsi.c:43: result = USB_ERR_FAIL;
ld hl,_result
ld (hl),0x0e
jr l_do_scsi_cmd_00120
l_do_scsi_cmd_00117:
;source-doc/scsi-drv/class_scsi.c:44: result = USB_ERR_OK;
;source-doc/scsi-drv/class_scsi.c:45: result = USB_ERR_OK;
xor a
ld (_result),a
;source-doc/scsi-drv/class_scsi.c:46: done:
;source-doc/scsi-drv/class_scsi.c:47: done:
l_do_scsi_cmd_00120:
;source-doc/scsi-drv/class_scsi.c:47: critical_end();
;source-doc/scsi-drv/class_scsi.c:48: critical_end();
call _critical_end
;source-doc/scsi-drv/class_scsi.c:48: return result;
;source-doc/scsi-drv/class_scsi.c:49: return result;
ld hl, (_result)
;source-doc/scsi-drv/class_scsi.c:49: }
;source-doc/scsi-drv/class_scsi.c:50: }
ld sp, ix
pop ix
ret
;source-doc/scsi-drv/class_scsi.c:53: usb_error get_scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) {
;source-doc/scsi-drv/class_scsi.c:54: usb_error scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) {
; ---------------------------------
; Function get_scsi_read_capacity
; Function scsi_read_capacity
; ---------------------------------
_get_scsi_read_capacity:
_scsi_read_capacity:
push ix
ld ix,0
add ix,sp
ld hl, -27
add hl, sp
ld sp, hl
;source-doc/scsi-drv/class_scsi.c:55: cbw_scsi.cbw = scsi_command_block_wrapper;
;source-doc/scsi-drv/class_scsi.c:56: cbw_scsi.cbw = scsi_command_block_wrapper;
ld hl,0
add hl, sp
ld e,l
@ -317,19 +317,19 @@ _get_scsi_read_capacity:
ld bc,0x000f
ld hl,_scsi_command_block_wrapper
ldir
;source-doc/scsi-drv/class_scsi.c:56: cbw_scsi.read_capacity = scsi_read_capacity;
;source-doc/scsi-drv/class_scsi.c:57: cbw_scsi.read_capacity = scsi_packet_read_capacity;
ld hl,17
add hl, sp
ex de, hl
ld bc,0x000c
ld hl,_scsi_read_capacity
ld hl,_scsi_packet_read_capacity
ldir
pop bc
;source-doc/scsi-drv/class_scsi.c:58: cbw_scsi.cbw.bCBWLUN = 0;
;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.cbw.bCBWLUN = 0;
ld (ix-14),0x00
;source-doc/scsi-drv/class_scsi.c:59: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity);
;source-doc/scsi-drv/class_scsi.c:60: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity);
ld (ix-13),0x0c
;source-doc/scsi-drv/class_scsi.c:60: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result);
;source-doc/scsi-drv/class_scsi.c:61: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_read_capacity_result);
ld hl,0x0008
add hl, bc
ld (hl),0x08
@ -340,7 +340,7 @@ _get_scsi_read_capacity:
ld (hl), a
inc hl
ld (hl), a
;source-doc/scsi-drv/class_scsi.c:62: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false);
;source-doc/scsi-drv/class_scsi.c:63: return do_scsi_cmd(dev, &cbw_scsi.cbw, cap_result, false);
ld e,(ix+6)
ld d,(ix+7)
xor a
@ -352,11 +352,11 @@ _get_scsi_read_capacity:
ld h,(ix+5)
push hl
call _do_scsi_cmd
;source-doc/scsi-drv/class_scsi.c:63: }
;source-doc/scsi-drv/class_scsi.c:64: }
ld sp,ix
pop ix
ret
;source-doc/scsi-drv/class_scsi.c:67: usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result) {
;source-doc/scsi-drv/class_scsi.c:68: usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result) {
; ---------------------------------
; Function scsi_inquiry
; ---------------------------------
@ -367,7 +367,7 @@ _scsi_inquiry:
ld hl, -27
add hl, sp
ld sp, hl
;source-doc/scsi-drv/class_scsi.c:69: cbw_scsi.cbw = scsi_command_block_wrapper;
;source-doc/scsi-drv/class_scsi.c:70: cbw_scsi.cbw = scsi_command_block_wrapper;
ld hl,0
add hl, sp
ld e,l
@ -376,7 +376,7 @@ _scsi_inquiry:
ld bc,0x000f
ld hl,_scsi_command_block_wrapper
ldir
;source-doc/scsi-drv/class_scsi.c:70: cbw_scsi.inquiry = scsi_packet_inquiry;
;source-doc/scsi-drv/class_scsi.c:71: cbw_scsi.inquiry = scsi_packet_inquiry;
ld hl,17
add hl, sp
ex de, hl
@ -384,11 +384,11 @@ _scsi_inquiry:
ld hl,_scsi_packet_inquiry
ldir
pop bc
;source-doc/scsi-drv/class_scsi.c:72: cbw_scsi.cbw.bCBWLUN = 0;
;source-doc/scsi-drv/class_scsi.c:73: cbw_scsi.cbw.bCBWLUN = 0;
ld (ix-14),0x00
;source-doc/scsi-drv/class_scsi.c:73: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry);
;source-doc/scsi-drv/class_scsi.c:74: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_inquiry);
ld (ix-13),0x0c
;source-doc/scsi-drv/class_scsi.c:74: cbw_scsi.cbw.dCBWDataTransferLength = 0x24;
;source-doc/scsi-drv/class_scsi.c:75: cbw_scsi.cbw.dCBWDataTransferLength = 0x24;
ld hl,0x0008
add hl, bc
ld (hl),0x24
@ -399,7 +399,7 @@ _scsi_inquiry:
ld (hl), a
inc hl
ld (hl), a
;source-doc/scsi-drv/class_scsi.c:76: return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false);
;source-doc/scsi-drv/class_scsi.c:77: return do_scsi_cmd(dev, &cbw_scsi.cbw, inq_result, false);
ld e,(ix+6)
ld d,(ix+7)
xor a
@ -411,11 +411,11 @@ _scsi_inquiry:
ld h,(ix+5)
push hl
call _do_scsi_cmd
;source-doc/scsi-drv/class_scsi.c:77: }
;source-doc/scsi-drv/class_scsi.c:78: }
ld sp,ix
pop ix
ret
;source-doc/scsi-drv/class_scsi.c:79: usb_error scsi_test(device_config_storage *const dev) {
;source-doc/scsi-drv/class_scsi.c:80: usb_error scsi_test(device_config_storage *const dev) {
; ---------------------------------
; Function scsi_test
; ---------------------------------
@ -426,7 +426,7 @@ _scsi_test:
ld hl, -27
add hl, sp
ld sp, hl
;source-doc/scsi-drv/class_scsi.c:81: cbw_scsi.cbw = scsi_command_block_wrapper;
;source-doc/scsi-drv/class_scsi.c:82: cbw_scsi.cbw = scsi_command_block_wrapper;
ld hl,0
add hl, sp
ld e,l
@ -435,7 +435,7 @@ _scsi_test:
ld bc,0x000f
ld hl,_scsi_command_block_wrapper
ldir
;source-doc/scsi-drv/class_scsi.c:82: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test));
;source-doc/scsi-drv/class_scsi.c:83: memset(&cbw_scsi.test, 0, sizeof(_scsi_packet_test));
ld hl,17
add hl, sp
ld b,0x06
@ -447,11 +447,11 @@ l_scsi_test_00103:
inc hl
djnz l_scsi_test_00103
pop bc
;source-doc/scsi-drv/class_scsi.c:84: cbw_scsi.cbw.bCBWLUN = 0;
;source-doc/scsi-drv/class_scsi.c:85: cbw_scsi.cbw.bCBWLUN = 0;
ld (ix-14),0x00
;source-doc/scsi-drv/class_scsi.c:85: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test);
;source-doc/scsi-drv/class_scsi.c:86: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_test);
ld (ix-13),0x0c
;source-doc/scsi-drv/class_scsi.c:86: cbw_scsi.cbw.dCBWDataTransferLength = 0;
;source-doc/scsi-drv/class_scsi.c:87: cbw_scsi.cbw.dCBWDataTransferLength = 0;
ld hl,0x0008
add hl, bc
xor a
@ -462,7 +462,7 @@ l_scsi_test_00103:
ld (hl), a
inc hl
ld (hl), a
;source-doc/scsi-drv/class_scsi.c:88: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false);
;source-doc/scsi-drv/class_scsi.c:89: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false);
xor a
push af
inc sp
@ -473,11 +473,11 @@ l_scsi_test_00103:
ld h,(ix+5)
push hl
call _do_scsi_cmd
;source-doc/scsi-drv/class_scsi.c:89: }
;source-doc/scsi-drv/class_scsi.c:90: }
ld sp,ix
pop ix
ret
;source-doc/scsi-drv/class_scsi.c:93: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) {
;source-doc/scsi-drv/class_scsi.c:94: usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result) {
; ---------------------------------
; Function scsi_request_sense
; ---------------------------------
@ -488,7 +488,7 @@ _scsi_request_sense:
ld hl, -27
add hl, sp
ld sp, hl
;source-doc/scsi-drv/class_scsi.c:95: cbw_scsi.cbw = scsi_command_block_wrapper;
;source-doc/scsi-drv/class_scsi.c:96: cbw_scsi.cbw = scsi_command_block_wrapper;
ld hl,0
add hl, sp
ld e,l
@ -497,7 +497,7 @@ _scsi_request_sense:
ld bc,0x000f
ld hl,_scsi_command_block_wrapper
ldir
;source-doc/scsi-drv/class_scsi.c:96: cbw_scsi.request_sense = scsi_packet_request_sense;
;source-doc/scsi-drv/class_scsi.c:97: cbw_scsi.request_sense = scsi_packet_request_sense;
ld hl,17
add hl, sp
ex de, hl
@ -505,11 +505,11 @@ _scsi_request_sense:
ld hl,_scsi_packet_request_sense
ldir
pop bc
;source-doc/scsi-drv/class_scsi.c:98: cbw_scsi.cbw.bCBWLUN = 0;
;source-doc/scsi-drv/class_scsi.c:99: cbw_scsi.cbw.bCBWLUN = 0;
ld (ix-14),0x00
;source-doc/scsi-drv/class_scsi.c:99: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense);
;source-doc/scsi-drv/class_scsi.c:100: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_request_sense);
ld (ix-13),0x0c
;source-doc/scsi-drv/class_scsi.c:100: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result);
;source-doc/scsi-drv/class_scsi.c:101: cbw_scsi.cbw.dCBWDataTransferLength = sizeof(scsi_sense_result);
ld hl,0x0008
add hl, bc
ld (hl),0x12
@ -520,7 +520,7 @@ _scsi_request_sense:
ld (hl), a
inc hl
ld (hl), a
;source-doc/scsi-drv/class_scsi.c:102: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false);
;source-doc/scsi-drv/class_scsi.c:103: return do_scsi_cmd(dev, &cbw_scsi.cbw, sens_result, false);
ld e,(ix+6)
ld d,(ix+7)
xor a
@ -532,11 +532,11 @@ _scsi_request_sense:
ld h,(ix+5)
push hl
call _do_scsi_cmd
;source-doc/scsi-drv/class_scsi.c:103: }
;source-doc/scsi-drv/class_scsi.c:104: }
ld sp,ix
pop ix
ret
;source-doc/scsi-drv/class_scsi.c:105: usb_error scsi_sense_init(device_config_storage *const dev) {
;source-doc/scsi-drv/class_scsi.c:106: usb_error scsi_sense_init(device_config_storage *const dev) {
; ---------------------------------
; Function scsi_sense_init
; ---------------------------------
@ -547,9 +547,9 @@ _scsi_sense_init:
ld hl, -18
add hl, sp
ld sp, hl
;source-doc/scsi-drv/class_scsi.c:109: critical_begin();
;source-doc/scsi-drv/class_scsi.c:110: critical_begin();
call _critical_begin
;source-doc/scsi-drv/class_scsi.c:110: while ((result = scsi_test(dev)) && --counter > 0)
;source-doc/scsi-drv/class_scsi.c:111: while ((result = scsi_test(dev)) && --counter > 0)
ld c,0x03
l_scsi_sense_init_00102:
push bc
@ -565,7 +565,7 @@ l_scsi_sense_init_00102:
jr Z,l_scsi_sense_init_00104
dec c
jr Z,l_scsi_sense_init_00104
;source-doc/scsi-drv/class_scsi.c:111: scsi_request_sense(dev, &response);
;source-doc/scsi-drv/class_scsi.c:112: scsi_request_sense(dev, &response);
ld hl,0
add hl, sp
push bc
@ -579,15 +579,15 @@ l_scsi_sense_init_00102:
pop bc
jr l_scsi_sense_init_00102
l_scsi_sense_init_00104:
;source-doc/scsi-drv/class_scsi.c:112: critical_end();
;source-doc/scsi-drv/class_scsi.c:113: critical_end();
call _critical_end
;source-doc/scsi-drv/class_scsi.c:114: return result;
;source-doc/scsi-drv/class_scsi.c:115: return result;
ld hl, (_result)
;source-doc/scsi-drv/class_scsi.c:115: }
;source-doc/scsi-drv/class_scsi.c:116: }
ld sp, ix
pop ix
ret
;source-doc/scsi-drv/class_scsi.c:119: usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer) {
;source-doc/scsi-drv/class_scsi.c:120: usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer) {
; ---------------------------------
; Function scsi_read
; ---------------------------------
@ -595,7 +595,7 @@ _scsi_read:
push ix
ld ix,0
add ix,sp
;source-doc/scsi-drv/class_scsi.c:120: memset(&cbw, 0, sizeof(cbw_scsi_read_write));
;source-doc/scsi-drv/class_scsi.c:121: memset(&cbw, 0, sizeof(cbw_scsi_read_write));
ld de,_cbw
ld l, e
ld h, d
@ -608,28 +608,28 @@ l_scsi_read_00113:
ld (hl),0x00
inc hl
djnz l_scsi_read_00112
;source-doc/scsi-drv/class_scsi.c:121: cbw.cbw = scsi_command_block_wrapper;
;source-doc/scsi-drv/class_scsi.c:122: cbw.cbw = scsi_command_block_wrapper;
ld bc,0x000f
ld hl,_scsi_command_block_wrapper
ldir
;source-doc/scsi-drv/class_scsi.c:123: cbw.cbw.bCBWLUN = 0;
;source-doc/scsi-drv/class_scsi.c:124: cbw.cbw.bCBWLUN = 0;
ld hl,_cbw + 13
ld (hl),0x00
;source-doc/scsi-drv/class_scsi.c:124: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write);
;source-doc/scsi-drv/class_scsi.c:125: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write);
ld hl,_cbw + 14
ld (hl),0x0c
;source-doc/scsi-drv/class_scsi.c:125: cbw.cbw.dCBWDataTransferLength = 512;
;source-doc/scsi-drv/class_scsi.c:126: cbw.cbw.dCBWDataTransferLength = 512;
ld hl,0x0200
ld (_cbw + 8),hl
ld h, l
ld (_cbw + 8 + 2),hl
;source-doc/scsi-drv/class_scsi.c:127: cbw.scsi_cmd.operation_code = 0x28; // read operation
;source-doc/scsi-drv/class_scsi.c:128: cbw.scsi_cmd.operation_code = 0x28; // read operation
ld hl,_cbw + 15
ld (hl),0x28
;source-doc/scsi-drv/class_scsi.c:128: cbw.scsi_cmd.transfer_len[1] = 1;
;source-doc/scsi-drv/class_scsi.c:129: cbw.scsi_cmd.transfer_len[1] = 1;
ld hl,_cbw + 23
ld (hl),0x01
;source-doc/scsi-drv/class_scsi.c:129: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24;
;source-doc/scsi-drv/class_scsi.c:130: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24;
ld l,(ix+4)
ld h,(ix+5)
ld bc,0x000c
@ -641,8 +641,8 @@ l_scsi_read_00113:
inc hl
ld a, (hl)
ld ((_cbw + 17)),a
;source-doc/scsi-drv/class_scsi.c:130: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16;
;source-doc/scsi-drv/class_scsi.c:131: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8;
;source-doc/scsi-drv/class_scsi.c:131: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16;
;source-doc/scsi-drv/class_scsi.c:132: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8;
ld l,c
ld h,b
inc hl
@ -653,11 +653,11 @@ l_scsi_read_00113:
ld e, (hl)
ld hl, +(_cbw + 19)
ld (hl), e
;source-doc/scsi-drv/class_scsi.c:132: cbw.scsi_cmd.lba[3] = dev->current_lba;
;source-doc/scsi-drv/class_scsi.c:133: cbw.scsi_cmd.lba[3] = dev->current_lba;
ld a, (bc)
inc hl
ld (hl), a
;source-doc/scsi-drv/class_scsi.c:134: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false);
;source-doc/scsi-drv/class_scsi.c:135: result = do_scsi_cmd(dev, &cbw.cbw, buffer, false);
ld e,(ix+6)
ld d,(ix+7)
push bc
@ -678,11 +678,11 @@ l_scsi_read_00113:
pop bc
ld a, l
ld (_result), a
;source-doc/scsi-drv/class_scsi.c:136: if (result == USB_ERR_OK)
;source-doc/scsi-drv/class_scsi.c:137: if (result == USB_ERR_OK)
ld a,(_result)
or a
jr NZ,l_scsi_read_00102
;source-doc/scsi-drv/class_scsi.c:137: dev->current_lba++;
;source-doc/scsi-drv/class_scsi.c:138: dev->current_lba++;
ld l, c
ld h, b
ld e, (hl)
@ -711,12 +711,12 @@ l_scsi_read_00114:
ld a, h
ld (bc), a
l_scsi_read_00102:
;source-doc/scsi-drv/class_scsi.c:138: return result;
;source-doc/scsi-drv/class_scsi.c:139: return result;
ld hl, (_result)
;source-doc/scsi-drv/class_scsi.c:139: }
;source-doc/scsi-drv/class_scsi.c:140: }
pop ix
ret
;source-doc/scsi-drv/class_scsi.c:141: usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) {
;source-doc/scsi-drv/class_scsi.c:142: usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer) {
; ---------------------------------
; Function scsi_write
; ---------------------------------
@ -724,7 +724,7 @@ _scsi_write:
push ix
ld ix,0
add ix,sp
;source-doc/scsi-drv/class_scsi.c:142: memset(&cbw, 0, sizeof(cbw_scsi_read_write));
;source-doc/scsi-drv/class_scsi.c:143: memset(&cbw, 0, sizeof(cbw_scsi_read_write));
ld de,_cbw
ld l, e
ld h, d
@ -737,28 +737,28 @@ l_scsi_write_00113:
ld (hl),0x00
inc hl
djnz l_scsi_write_00112
;source-doc/scsi-drv/class_scsi.c:143: cbw.cbw = scsi_command_block_wrapper;
;source-doc/scsi-drv/class_scsi.c:144: cbw.cbw = scsi_command_block_wrapper;
ld bc,0x000f
ld hl,_scsi_command_block_wrapper
ldir
;source-doc/scsi-drv/class_scsi.c:145: cbw.cbw.bCBWLUN = 0;
;source-doc/scsi-drv/class_scsi.c:146: cbw.cbw.bCBWLUN = 0;
ld hl,_cbw + 13
ld (hl),0x00
;source-doc/scsi-drv/class_scsi.c:146: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write);
;source-doc/scsi-drv/class_scsi.c:147: cbw.cbw.bCBWCBLength = sizeof(_scsi_packet_read_write);
ld hl,_cbw + 14
ld (hl),0x0c
;source-doc/scsi-drv/class_scsi.c:147: cbw.cbw.dCBWDataTransferLength = 512;
;source-doc/scsi-drv/class_scsi.c:148: cbw.cbw.dCBWDataTransferLength = 512;
ld hl,0x0200
ld (_cbw + 8),hl
ld h, l
ld (_cbw + 8 + 2),hl
;source-doc/scsi-drv/class_scsi.c:149: cbw.scsi_cmd.operation_code = 0x2A; // write operation
;source-doc/scsi-drv/class_scsi.c:150: cbw.scsi_cmd.operation_code = 0x2A; // write operation
ld hl,_cbw + 15
ld (hl),0x2a
;source-doc/scsi-drv/class_scsi.c:150: cbw.scsi_cmd.transfer_len[1] = 1;
;source-doc/scsi-drv/class_scsi.c:151: cbw.scsi_cmd.transfer_len[1] = 1;
ld hl,_cbw + 23
ld (hl),0x01
;source-doc/scsi-drv/class_scsi.c:151: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24;
;source-doc/scsi-drv/class_scsi.c:152: cbw.scsi_cmd.lba[0] = dev->current_lba >> 24;
ld l,(ix+4)
ld h,(ix+5)
ld bc,0x000c
@ -770,8 +770,8 @@ l_scsi_write_00113:
inc hl
ld a, (hl)
ld ((_cbw + 17)),a
;source-doc/scsi-drv/class_scsi.c:152: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16;
;source-doc/scsi-drv/class_scsi.c:153: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8;
;source-doc/scsi-drv/class_scsi.c:153: cbw.scsi_cmd.lba[1] = dev->current_lba >> 16;
;source-doc/scsi-drv/class_scsi.c:154: cbw.scsi_cmd.lba[2] = dev->current_lba >> 8;
ld l,c
ld h,b
inc hl
@ -782,11 +782,11 @@ l_scsi_write_00113:
ld e, (hl)
ld hl, +(_cbw + 19)
ld (hl), e
;source-doc/scsi-drv/class_scsi.c:154: cbw.scsi_cmd.lba[3] = dev->current_lba;
;source-doc/scsi-drv/class_scsi.c:155: cbw.scsi_cmd.lba[3] = dev->current_lba;
ld a, (bc)
inc hl
ld (hl), a
;source-doc/scsi-drv/class_scsi.c:156: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true);
;source-doc/scsi-drv/class_scsi.c:157: result = do_scsi_cmd(dev, &cbw.cbw, buffer, true);
ld e,(ix+6)
ld d,(ix+7)
push bc
@ -807,11 +807,11 @@ l_scsi_write_00113:
pop bc
ld a, l
ld (_result), a
;source-doc/scsi-drv/class_scsi.c:158: if (result == USB_ERR_OK)
;source-doc/scsi-drv/class_scsi.c:159: if (result == USB_ERR_OK)
ld a,(_result)
or a
jr NZ,l_scsi_write_00102
;source-doc/scsi-drv/class_scsi.c:159: dev->current_lba++;
;source-doc/scsi-drv/class_scsi.c:160: dev->current_lba++;
ld l, c
ld h, b
ld e, (hl)
@ -840,12 +840,12 @@ l_scsi_write_00114:
ld a, h
ld (bc), a
l_scsi_write_00102:
;source-doc/scsi-drv/class_scsi.c:160: return result;
;source-doc/scsi-drv/class_scsi.c:161: return result;
ld hl, (_result)
;source-doc/scsi-drv/class_scsi.c:161: }
;source-doc/scsi-drv/class_scsi.c:162: }
pop ix
ret
;source-doc/scsi-drv/class_scsi.c:163: usb_error scsi_eject(device_config_storage *const dev) {
;source-doc/scsi-drv/class_scsi.c:164: usb_error scsi_eject(device_config_storage *const dev) {
; ---------------------------------
; Function scsi_eject
; ---------------------------------
@ -856,7 +856,7 @@ _scsi_eject:
ld hl, -21
add hl, sp
ld sp, hl
;source-doc/scsi-drv/class_scsi.c:165: cbw_scsi.cbw = scsi_command_block_wrapper;
;source-doc/scsi-drv/class_scsi.c:166: cbw_scsi.cbw = scsi_command_block_wrapper;
ld hl,0
add hl, sp
ld e,l
@ -865,7 +865,7 @@ _scsi_eject:
ld bc,0x000f
ld hl,_scsi_command_block_wrapper
ldir
;source-doc/scsi-drv/class_scsi.c:167: memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject));
;source-doc/scsi-drv/class_scsi.c:168: memset(&cbw_scsi.eject, 0, sizeof(_scsi_packet_eject));
ld hl,17
add hl, sp
ld b,0x03
@ -877,17 +877,17 @@ l_scsi_eject_00103:
inc hl
djnz l_scsi_eject_00103
pop bc
;source-doc/scsi-drv/class_scsi.c:169: cbw_scsi.eject.operation_code = 0x1B;
;source-doc/scsi-drv/class_scsi.c:170: cbw_scsi.eject.operation_code = 0x1B;
ld (ix-6),0x1b
;source-doc/scsi-drv/class_scsi.c:170: cbw_scsi.eject.loej = 1;
;source-doc/scsi-drv/class_scsi.c:171: cbw_scsi.eject.loej = 1;
ld hl,19
add hl, sp
set 1, (hl)
;source-doc/scsi-drv/class_scsi.c:172: cbw_scsi.cbw.bCBWLUN = 0;
;source-doc/scsi-drv/class_scsi.c:173: cbw_scsi.cbw.bCBWLUN = 0;
ld (ix-8),0x00
;source-doc/scsi-drv/class_scsi.c:173: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject);
;source-doc/scsi-drv/class_scsi.c:174: cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_packet_eject);
ld (ix-7),0x06
;source-doc/scsi-drv/class_scsi.c:174: cbw_scsi.cbw.dCBWDataTransferLength = 0;
;source-doc/scsi-drv/class_scsi.c:175: cbw_scsi.cbw.dCBWDataTransferLength = 0;
ld hl,0x0008
add hl, bc
xor a
@ -898,7 +898,7 @@ l_scsi_eject_00103:
ld (hl), a
inc hl
ld (hl), a
;source-doc/scsi-drv/class_scsi.c:176: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false);
;source-doc/scsi-drv/class_scsi.c:177: return do_scsi_cmd(dev, &cbw_scsi.cbw, 0, false);
xor a
push af
inc sp
@ -909,7 +909,7 @@ l_scsi_eject_00103:
ld h,(ix+5)
push hl
call _do_scsi_cmd
;source-doc/scsi-drv/class_scsi.c:177: }
;source-doc/scsi-drv/class_scsi.c:178: }
ld sp,ix
pop ix
ret
@ -940,7 +940,7 @@ _csw:
DEFB 0x00
DEFB 0x00
DEFB +0x00
_scsi_read_capacity:
_scsi_packet_read_capacity:
DEFB +0x25
DEFB +0x00
DEFB +0x00

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

@ -186,7 +186,7 @@ done:
return result;
}
//TODO: review: does buffer_size need to be signed?
// TODO: review: does buffer_size need to be signed?
usb_error ch_data_in_transfer_n(uint8_t *const buffer, int8_t *const buffer_size, endpoint_param *const endpoint) {
uint8_t count;
usb_error result;

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

@ -46,7 +46,7 @@ usb_error op_interface_next(_working *const working) __z88dk_fastcall {
}
usb_error op_endpoint_next(_working *const working) __sdcccall(1) {
if (--working->endpoint_count > 0) {
if (working->endpoint_count != 0 && --working->endpoint_count > 0) {
working->ptr += ((endpoint_descriptor *)working->ptr)->bLength;
return op_parse_endpoint(working);
}

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

@ -159,7 +159,7 @@ usb_data_in_transfer_n(uint8_t *buffer, uint8_t *const buffer_size, const uint8_
ch_set_usb_address(device_address);
result = ch_data_in_transfer_n(buffer, buffer_size, endpoint); //does ch_data_in_transfer_n size need to be signed?
result = ch_data_in_transfer_n(buffer, buffer_size, endpoint); // does ch_data_in_transfer_n size need to be signed?
critical_end();

7
Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.c

@ -9,6 +9,7 @@ _scsi_command_block_wrapper scsi_command_block_wrapper = {{0x55, 0x53, 0x42, 0x4
uint16_t next_tag = 0;
_scsi_command_status_wrapper csw = {{{0}}};
usb_error do_scsi_cmd(device_config_storage *const dev,
_scsi_command_block_wrapper *const cbw,
void *const send_receive_buffer,
@ -48,12 +49,12 @@ done:
return result;
}
_scsi_read_capacity scsi_read_capacity = {0x25, 0, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0}};
_scsi_read_capacity scsi_packet_read_capacity = {0x25, 0, {0, 0, 0, 0, 0, 0, 0, 0}, {0, 0}};
usb_error get_scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) {
usb_error scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *cap_result) {
cbw_scsi_read_capacity cbw_scsi;
cbw_scsi.cbw = scsi_command_block_wrapper;
cbw_scsi.read_capacity = scsi_read_capacity;
cbw_scsi.read_capacity = scsi_packet_read_capacity;
cbw_scsi.cbw.bCBWLUN = 0;
cbw_scsi.cbw.bCBWCBLength = sizeof(_scsi_read_capacity);

5
Source/HBIOS/ch376-native/source-doc/scsi-drv/class_scsi.h

@ -182,15 +182,12 @@ typedef struct {
_scsi_packet_read_write scsi_cmd;
} cbw_scsi_read_write;
extern usb_error get_scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *result);
extern usb_error scsi_read_capacity(device_config_storage *const dev, scsi_read_capacity_result *result);
extern usb_error scsi_inquiry(device_config_storage *const dev, scsi_inquiry_result *inq_result);
extern usb_error scsi_sense_init(device_config_storage *const dev);
extern usb_error scsi_test(device_config_storage *const dev);
extern usb_error scsi_request_sense(device_config_storage *const dev, scsi_sense_result *const sens_result);
extern usb_error scsi_eject(device_config_storage *const dev);
extern usb_error scsi_read_write(
device_config_storage *const dev, const bool send, uint32_t sector_number, const uint8_t sector_count, uint8_t *const buffer);
extern usb_error scsi_read(device_config_storage *const dev, uint8_t *const buffer);
extern usb_error scsi_write(device_config_storage *const dev, uint8_t *const buffer);
#endif

2
Source/HBIOS/ch376scsi.asm

@ -237,7 +237,7 @@ CH_SCSI_CAP:
push ix
push iy
call _get_scsi_read_capacity
call _scsi_read_capacity
pop iy
pop ix

Loading…
Cancel
Save