Browse Source

S100 ESP SD Driver Tweaks

- Tune timeout
- Implement card detect
pull/609/head v3.6.0-dev.18
Wayne Warthen 6 months ago
parent
commit
15e44ecd8e
No known key found for this signature in database GPG Key ID: 8B34ED29C07EEB0A
  1. 2
      Source/CBIOS/cbios.asm
  2. 1
      Source/Doc/Catalog.md
  3. 1
      Source/HBIOS/Config/FZ80_std.asm
  4. 2
      Source/HBIOS/Config/S100_std.asm
  5. 106
      Source/HBIOS/espsd.asm
  6. 2
      Source/ver.inc
  7. 2
      Source/ver.lib

2
Source/CBIOS/cbios.asm

@ -3427,7 +3427,7 @@ DEV12 .DB "SYQ$"
DEV13 .DB "CHUSB$"
DEV14 .DB "CHSD$"
DEV15 .DB "USB$"
DEV16 .DB "S100SD$"
DEV16 .DB "ESPSD$"
DEV17 .EQU DEVUNK
;
#ENDIF

1
Source/Doc/Catalog.md

@ -1238,6 +1238,7 @@ The following files are found in
| `DRTCPM.OBJ` | Startup Object File (???) |
| `EXEC.H` | Language include file (see manual) |
| `FLOAT.H` | Language include file (see manual) |
| `HELLO.C` | Sample C source file |
| `HITECH.H` | Language include file (see manual) |
| `LIBC.LIB` | Standard C Runtime Library |
| `LIBF.LIB` | Floating Point Library |

1
Source/HBIOS/Config/FZ80_std.asm

@ -57,3 +57,4 @@ LPTENABLE .SET TRUE ; LPT: ENABLE CENTRONICS PRINTER DRIVER (LPT.ASM)
;
ESPSDENABLE .SET TRUE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
ESPSDCNT .SET 1 ; ESPSD: NUMBER OF BOARDS TO DETECT (1-2), 1-2 DEVICES PER BOARD
ESPSD0DUAL .SET TRUE ; ESPSD 0: DUAL INTERFACE BOARD (DUAL SD)

2
Source/HBIOS/Config/S100_std.asm

@ -74,4 +74,4 @@ SDCNT .SET 1 ; SD: NUMBER OF SD CARD DEVICES (1-2), FOR DSD/SC/MT ONLY
;
ESPSDENABLE .SET TRUE ; ESPSD: ENABLE S100 ESP32 SD DISK DRIVER (ESPSD.ASM)
ESPSDCNT .SET 1 ; ESPSD: NUMBER OF BOARDS TO DETECT (1-2), 1-2 DEVICES PER BOARD
ESPSD0DUAL .SET TRUE ; ESPSD 0: DUAL INTERFACE BOARD (DUAL SD)

106
Source/HBIOS/espsd.asm

@ -12,8 +12,7 @@
;
;
; TODO:
; - ADD TIMEOUT TO DETECTION!!!
; - ADD CARD DETECT FUNCTIONALITY
; - AVOID RESELECTING PRI/SEC ON EVERY I/O CALL
;
; NOTES:
;
@ -22,7 +21,6 @@
; COMMAND/RESPONSE PROTOCOL. THE DUAL SD BOARD SUPPORTS TWO SD CARD
; DEVICES. SEPARATE INIT AND SELECT COMMANDS ARE PROVIDED TO HANDLE
; THIS AS NEEDED. THE 2CF+1SD SUPPORTS ONLY A SINGLE SD CARD DEVICE.
; ONLY THE INIT/SELECT COMMANDS WITH A "0" SUFFIX CAN BE USED.
;
; TWO SEQUENTIAL I/O ADDRESSES ARE IMPLEMENTED. THE FIRST IS
; FOR STATUS AND THE SECOND IS FOR COMMAND & DATA EXCHANGE.
@ -53,35 +51,30 @@
; XIN: UNUSED???
; XOUT: ACTIVATE WRITE TO ESP32
;
ESPSD_IO_STATUS .EQU 0 ; OFFSET OF STATUS PORT FROM BASE I/O ADDRESS
ESPSD_IO_STATUS .EQU 0 ; OFFSET OF STATUS PORT FROM BASE I/O ADDRESS
ESPSD_IO_DATA .EQU 1 ; OFFSET OF DATA PORT FROM BASE I/O ADDRESS
;
ESPSD_CMD_INIT0 .EQU $80 ; Initialize primary SD Card
ESPSD_CMD_INIT1 .EQU $81 ; INITIALIZE SECONDARY SD CARD
ESPSD_CMD_INIT0 .EQU $80 ; Initialize primary SD Card
ESPSD_CMD_INIT1 .EQU $81 ; INITIALIZE SECONDARY SD CARD
ESPSD_CMD_SEL0 .EQU $82 ; (RE)SELECT PRIMARY SD CARD
ESPSD_CMD_SEL1 .EQU $83 ; (RE)SELECT SECONDARY SD CARD
ESPSD_CMD_SETLBA .EQU $84 ; SET LBA FOR SUBSEQUENT I/O
ESPSD_CMD_READ .EQU $85 ; READ SECTOR FROM SELECTED SD CARD AT CURRENT LBA
ESPSD_CMD_WRITE .EQU $86 ; WRITE SECTOR TO SELECTED SD CARD AT CURRENT LBA
ESPSD_CMD_WRITE .EQU $86 ; WRITE SECTOR TO SELECTED SD CARD AT CURRENT LBA
ESPSD_CMD_FORMAT .EQU $87 ; FORMAT SECTOR ON SELECTED SD CARD AT CURRENT LBA
ESPSD_CMD_RESET .EQU $88 ; RESET ESP32 MODULE
ESPSD_CMD_RESET .EQU $88 ; RESET ESP32 MODULE
;
; ESPSD DEVICE STATUS CODES
;
ESPSD_STOK .EQU 0
ESPSD_STINVUNIT .EQU -1
ESPSD_STNOMEDIA .EQU -2
ESPSD_STCMDERR .EQU -3
ESPSD_STIOERR .EQU -4
ESPSD_STRDYTO .EQU -5
ESPSD_STDRQTO .EQU -6
ESPSD_STBSYTO .EQU -7
ESPSD_STNOTSUP .EQU -8
ESPSD_STNOTRDY .EQU -9
ESPSD_STNOMEDIA .EQU -1
ESPSD_STIOERR .EQU -2
ESPSD_STTO .EQU -3
ESPSD_STNOTRDY .EQU -4
;
; IDE DEVICE CONFIGURATION
;
ESPSD_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES
ESPSD_CFGSIZ .EQU 12 ; SIZE OF CFG TBL ENTRIES
;
; PER DEVICE DATA OFFSETS
;
@ -414,6 +407,18 @@ ESPSD_DETECT:
; INITIALIZE DEVICE
;
ESPSD_INITDEV:
; CHECK CARD DETECT
LD A,(IY+ESPSD_ROLE) ; GET ROLE
LD B,%00000010 ; MASK FOR PRIMARY
OR A ; TEST ROLE
JR Z,ESPSD_INITDEV1 ; IF PRIMARY, JUMP AHEAD
LD B,%00000100 ; MASK FOR SECONDARY
ESPSD_INITDEV1:
LD C,(IY+ESPSD_IOBASE) ; STATUS PORT
IN A,(C) ; GET STATUS
AND B ; APPLY MASK
JP Z,ESPSD_NOMEDIA ; IF NO CARD, HANDLE AS NO MEDIA
;
CALL ESPSD_INITCARD ; PERFORM DEVICE INIT
JP NZ,ESPSD_NOMEDIA ; CONVERT TO NO MEDIA ERROR
;
@ -638,7 +643,7 @@ ESPSD_PUTBYTE1:
JR Z,ESPSD_PUTBYTE2
;JR ESPSD_PUTBYTE1 ; *DEBUG*
DJNZ ESPSD_PUTBYTE1
LD A,ESPSD_STBSYTO
LD A,ESPSD_STTO
OR A
RET
ESPSD_PUTBYTE2:
@ -657,7 +662,7 @@ ESPSD_PUTBYTE2:
;
ESPSD_PUTBYTE_SLOW:
PUSH HL
LD HL,$1000 ; *TODO* TUNE THIS VALUE!!!
LD HL,50 * CPUMHZ ; CPU SPEED SCALED TIMEOUT
ESPSD_PUTBYTE_SLOW1:
PUSH HL
CALL ESPSD_PUTBYTE
@ -667,7 +672,7 @@ ESPSD_PUTBYTE_SLOW1:
LD A,H
OR L
JR NZ,ESPSD_PUTBYTE_SLOW1
LD A,ESPSD_STBSYTO
LD A,ESPSD_STTO
ESPSD_PUTBYTE_SLOW_Z:
;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEXWORDHL ; *DEBUG*
@ -689,7 +694,7 @@ ESPSD_GETBYTE1:
BIT 7,A
JR NZ,ESPSD_GETBYTE2
DJNZ ESPSD_GETBYTE1
LD A,ESPSD_STBSYTO
LD A,ESPSD_STTO
OR A
RET
ESPSD_GETBYTE2:
@ -708,7 +713,7 @@ ESPSD_GETBYTE2:
;
ESPSD_GETBYTE_SLOW:
PUSH HL
LD HL,$1000 ; *TODO* TUNE THIS VALUE???
LD HL,50 * CPUMHZ ; CPU SPEED SCALED TIMEOUT
ESPSD_GETBYTE_SLOW1:
PUSH HL
CALL ESPSD_GETBYTE
@ -718,7 +723,7 @@ ESPSD_GETBYTE_SLOW1:
LD A,H
OR L
JR NZ,ESPSD_GETBYTE_SLOW1
LD A,ESPSD_STBSYTO
LD A,ESPSD_STTO
ESPSD_GETBYTE_SLOW_Z:
;CALL PC_SPACE ; *DEBUG*
;CALL PRTHEXWORDHL ; *DEBUG*
@ -732,36 +737,16 @@ ESPSD_GETBYTE_SLOW_Z:
;
; ERROR HANDLERS
;
ESPSD_INVUNIT:
LD A,ESPSD_STINVUNIT
JR ESPSD_ERR2 ; SPECIAL CASE FOR INVALID UNIT
;
ESPSD_NOMEDIA:
LD A,ESPSD_STNOMEDIA
JR ESPSD_ERR
;
ESPSD_CMDERR:
LD A,ESPSD_STCMDERR
JR ESPSD_ERR
;
ESPSD_IOERR:
LD A,ESPSD_STIOERR
JR ESPSD_ERR
;
ESPSD_RDYTO:
LD A,ESPSD_STRDYTO
JR ESPSD_ERR
;
ESPSD_DRQTO:
LD A,ESPSD_STDRQTO
JR ESPSD_ERR
;
ESPSD_BSYTO:
LD A,ESPSD_STBSYTO
JR ESPSD_ERR
;
ESPSD_NOTSUP:
LD A,ESPSD_STNOTSUP
ESPSD_TO:
LD A,ESPSD_STTO
JR ESPSD_ERR
;
ESPSD_NOTRDY:
@ -771,7 +756,6 @@ ESPSD_NOTRDY:
ESPSD_ERR:
LD (IY+ESPSD_STAT),A ; SAVE NEW STATUS
;
ESPSD_ERR2:
#IF (ESPSDTRACE >= 2)
CALL ESPSD_PRTSTAT
#ENDIF
@ -791,8 +775,6 @@ ESPSD_PRTSTAT:
PUSH DE
PUSH HL
LD A,(IY+ESPSD_STAT)
CP ESPSD_STINVUNIT
JR Z,ESPSD_PRTSTAT2 ; INVALID UNIT IS SPECIAL CASE
CALL ESPSD_PRTPREFIX ; PRINT UNIT PREFIX
JR ESPSD_PRTSTAT3
ESPSD_PRTSTAT2:
@ -816,28 +798,13 @@ ESPSD_PRTSTATSTR:
LD DE,ESPSD_STR_STOK
JR Z,ESPSD_PRTSTATSTR1
INC A
LD DE,ESPSD_STR_STINVUNIT
JR Z,ESPSD_PRTSTATSTR1
INC A
LD DE,ESPSD_STR_STNOMEDIA
JR Z,ESPSD_PRTSTATSTR1
INC A
LD DE,ESPSD_STR_STCMDERR
JR Z,ESPSD_PRTSTATSTR1
INC A
LD DE,ESPSD_STR_STIOERR
JR Z,ESPSD_PRTSTATSTR1
INC A
LD DE,ESPSD_STR_STRDYTO
JR Z,ESPSD_PRTSTATSTR1
INC A
LD DE,ESPSD_STR_STDRQTO
JR Z,ESPSD_PRTSTATSTR1
INC A
LD DE,ESPSD_STR_STBSYTO
JR Z,ESPSD_PRTSTATSTR1
INC A
LD DE,ESPSD_STR_STNOTSUP
LD DE,ESPSD_STR_STTO
JR Z,ESPSD_PRTSTATSTR1
INC A
LD DE,ESPSD_STR_STNOTRDY
@ -869,16 +836,11 @@ ESPSD_PRTPREFIX1:
;=============================================================================
;
ESPSD_STR_STOK .TEXT "OK$"
ESPSD_STR_STINVUNIT .TEXT "INVALID UNIT$"
ESPSD_STR_STNOMEDIA .TEXT "NO MEDIA$"
ESPSD_STR_STCMDERR .TEXT "COMMAND ERROR$"
ESPSD_STR_STIOERR .TEXT "IO ERROR$"
ESPSD_STR_STRDYTO .TEXT "READY TIMEOUT$"
ESPSD_STR_STDRQTO .TEXT "DRQ TIMEOUT$"
ESPSD_STR_STBSYTO .TEXT "BUSY TIMEOUT$"
ESPSD_STR_STNOTSUP .TEXT "NOT SUPPORTED$"
ESPSD_STR_STTO .TEXT "TIMEOUT$"
ESPSD_STR_STNOTRDY .TEXT "NOT READY$"
ESPSD_STR_STUNK .TEXT "UNKNOWN ERROR$"
ESPSD_STR_STUNK .TEXT "UNKNOWN ERROR$"
;
;=============================================================================
; DATA STORAGE

2
Source/ver.inc

@ -2,7 +2,7 @@
#DEFINE RMN 6
#DEFINE RUP 0
#DEFINE RTP 0
#DEFINE BIOSVER "3.6.0-dev.17"
#DEFINE BIOSVER "3.6.0-dev.18"
#define rmj RMJ
#define rmn RMN
#define rup RUP

2
Source/ver.lib

@ -3,5 +3,5 @@ rmn equ 6
rup equ 0
rtp equ 0
biosver macro
db "3.6.0-dev.17"
db "3.6.0-dev.18"
endm

Loading…
Cancel
Save