Browse Source

Adjust ESPSD Driver for Firmware Updates

pull/609/head
Wayne Warthen 5 months ago
parent
commit
cccb51b3c4
No known key found for this signature in database GPG Key ID: 8B34ED29C07EEB0A
  1. 204
      Source/HBIOS/espsd.asm

204
Source/HBIOS/espsd.asm

@ -27,30 +27,27 @@
; FOR STATUS AND THE SECOND IS FOR COMMAND & DATA EXCHANGE. ; FOR STATUS AND THE SECOND IS FOR COMMAND & DATA EXCHANGE.
; ;
; === STATUS REGISTER (READ) === ; === STATUS REGISTER (READ) ===
;
; 7 6 5 4 3 2 1 0
; +-------+-------+-------+-------+-------+-------+-------+-------+
; | XIN | ERR | DSW | CS1 | CS0 | CD1 | CD0 | XOUT |
; +-------+-------+-------+-------+-------+-------+-------+-------+
;
; XIN: DATA READ FROM ESP32 PENDING
; ERR: ERROR ACTIVE
; DSW: OLED DISPLAY ACTIVATION SWITCH
; CS1: SD CARD 1 CHIP SELECT
; CS0: SD CARD 0 CHIP SELECT
; CD1: SD CARD 1 MEDIA PRESENT (CARD DETECT)
; CD0: SD CARD 0 MEDIA PRESENT (CARD DETECT)
; XOUT: DATA WRITE TO ESP32 PENDING
;
; === STATUS REGISTER (WRITE) ===
;
; 7 6 5 4 3 2 1 0
; +-------+-------+-------+-------+-------+-------+-------+-------+
; | XIN | | | | | | | XOUT |
; +-------+-------+-------+-------+-------+-------+-------+-------+
;
; XIN: UNUSED???
; XOUT: ACTIVATE WRITE TO ESP32
; BIT 2SD 2CF+1SD
; ------ --------- ---------
; BIT-0 SENDACT SENDACT
; BIT-1 SD0_CD SD1_CD
; BIT-2 SD1_CD RCV
; BIT-3 SD0_CS GPIO3
; BIT-4 SD1_CS ERROR
; BIT-5 DIAG SD1_CS
; BIT-6 ERROR GPIO47
; BIT-7 RCVRDY RCVRDY
;
; SENDACT: DATA OUTPUT TO ESP32 PENDING, XMIT REGISTER FULL
; RCVRDY: DATA FROM ESP32 READY TO READ
; SD0_CD: SD0 CARD DETECT
; SD1_CD: SD1 CARD DETECT
; SD0_CS: SD0 CHIP SELECT
; SD1_CS: SD1 CHIP SELECT
; ERROR: ERROR INDICATOR
; DIAG: DIAGNOSTIC SWITCH
; GPIOX: GPIO BIT LEVEL
; ;
; COMMAND/DATA EXCHANGES ; COMMAND/DATA EXCHANGES
; ---------------------- ; ----------------------
@ -65,17 +62,18 @@
; ->CMD_FORMAT, <-STATUS ; ->CMD_FORMAT, <-STATUS
; ->CMD_RESET ; ->CMD_RESET
; ;
; NEW/PROPOSED:
;
; ->CMD_FWVER, <-[Version: Major (byte), Minor (byte)], <-STATUS
; ADDED IN V1.4:
; ->CMD_FWVER, <-[BoardID (byte), Ver-Major (byte), Ver-Minor (byte)], <-STATUS
; ->CMD_SETLBA, ->[LBA value (4 bytes, MS first)], <-STATUS ; ->CMD_SETLBA, ->[LBA value (4 bytes, MS first)], <-STATUS
; ->CMD_TYPE, <-[SD Card Type (1 byte)], <-STATUS ; ->CMD_TYPE, <-[SD Card Type (1 byte)], <-STATUS
; ->CMD_CAP, <-[Sector Count (4 bytes, MS first)], <-STATUS ; ->CMD_CAP, <-[Sector Count (4 bytes, MS first)], <-STATUS
; ->CMD_CID, <-[CID Data (16 bytes), <-STATUS ; ->CMD_CID, <-[CID Data (16 bytes), <-STATUS
; ->CMD_CSD, <-[CSD Data (16 bytes), <-STATUS ; ->CMD_CSD, <-[CSD Data (16 bytes), <-STATUS
; ->CMD_DISP, ->[null terminated string], <-STATUS
; ->CMD_ECHO, ->[null terminated string], <-[null terminated string], <-STATUS
; ;
; IF AN ERROR OCCURS IN ANY COMMAND THAT RETURNS DATA BEFORE THE ; IF AN ERROR OCCURS IN ANY COMMAND THAT RETURNS DATA BEFORE THE
; STATUS BYTE, THEN DUMMY PADDING DATA MUST BE SENT BEFORE THE
; STATUS BYTE, THEN DUMMY PADDING DATA IS SENT BEFORE THE
; ERROR STATUS. ; ERROR STATUS.
; ;
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
@ -96,10 +94,17 @@ ESPSD_CMD_TYPE .EQU $92 ; REPORT CARD TYPE OF SELECTED SD CARD
ESPSD_CMD_CAP .EQU $93 ; REPORT CAPACITY (SECTORS) OF SELECTED SD CARD ESPSD_CMD_CAP .EQU $93 ; REPORT CAPACITY (SECTORS) OF SELECTED SD CARD
ESPSD_CMD_CID .EQU $94 ; REPORT CID DATA OF SELECTED SD CARD ESPSD_CMD_CID .EQU $94 ; REPORT CID DATA OF SELECTED SD CARD
ESPSD_CMD_CSD .EQU $95 ; REPORT CSD DATA OF SELECTED SD CARD ESPSD_CMD_CSD .EQU $95 ; REPORT CSD DATA OF SELECTED SD CARD
ESPSD_CMD_DISP .EQU $96 ; REPORT CSD DATA OF SELECTED SD CARD
ESPSD_CMD_ECHO .EQU $97 ; REPORT CSD DATA OF SELECTED SD CARD
; ;
ESPSD_STAT_OK .EQU $00 ; OPERATION COMPLETED OK ESPSD_STAT_OK .EQU $00 ; OPERATION COMPLETED OK
ESPSD_STAT_ERR .EQU $1A ; OPERATION FAILED ESPSD_STAT_ERR .EQU $1A ; OPERATION FAILED
; ;
; BOARD IDS
;
ESPSD_BOARD_2CF1SD .EQU 1 ; 2CF+1SD
ESPSD_BOARD_2SD .EQU 2 ; 2SD
;
; ESPSD DEVICE STATUS CODES ; ESPSD DEVICE STATUS CODES
; ;
ESPSD_STOK .EQU 0 ESPSD_STOK .EQU 0
@ -235,6 +240,31 @@ ESPSD_INIT2B:
JR ESPSD_INIT4 ; SKIP CFG ENTRY JR ESPSD_INIT4 ; SKIP CFG ENTRY
; ;
ESPSD_INIT3: ESPSD_INIT3:
CALL PC_SPACE ; FORMATTING
CALL ESPSD_FWVER ; GET BOARD ID AND F/W VER
JR NZ,ESPSD_INIT3D ; HANDLE ERROR (IGNORE IT)
LD A,E ; BOARD ID
CP ESPSD_BOARD_2CF1SD ; 2CF+1SD?
JR NZ,ESPSD_INIT3A ; IF NOT, CHECK MORE
LD DE,ESPSD_STR_2CF1SD ; LOAD STRING
JR ESPSD_INIT3C ; SKIP TO PRINT
ESPSD_INIT3A:
CP ESPSD_BOARD_2SD ; 2SD?
JR NZ,ESPSD_INIT3B ; NOPE
LD DE,ESPSD_STR_2SD ; LOAD STRING
JR ESPSD_INIT3C ; SKIP TO PRINT
ESPSD_INIT3B:
LD DE,ESPSD_STR_UNKNOWN ; UNKNOWN BOARD
ESPSD_INIT3C:
CALL WRITESTR ; PRINT BOARD NAME
PRTS(" F/W V$")
LD A,H ; GET MAJOR VER
CALL PRTDEC8 ; PRINT IT
CALL PC_PERIOD ; SEPARATOR
LD A,L ; GET MINOR VER
CALL PRTDEC8 ; PRINT IT
;
ESPSD_INIT3D:
CALL ESPSD_INIT5 ; REGISTER & INIT DEVICE CALL ESPSD_INIT5 ; REGISTER & INIT DEVICE
; ;
ESPSD_INIT4: ESPSD_INIT4:
@ -432,9 +462,18 @@ ESPSD_GEOM:
; ON RETURN, ZF SET INDICATES HARDWARE FOUND ; ON RETURN, ZF SET INDICATES HARDWARE FOUND
; ;
ESPSD_DETECT: ESPSD_DETECT:
; WE USE A DUMMY SETLBA COMMAND TO TEST FOR PRESENCE
LD HL,0 ; IRRELEVANT
JP ESPSD_SETLBA ; PASS OFF TO SETLBA
; WE USE A DUMMY SELECT COMMAND TO TEST FOR PRESENCE
LD A,ESPSD_CMD_SEL0
ADD A,(IY+ESPSD_ROLE)
LD E,A
CALL ESPSD_CMD_SLOW
RET NZ
LD E,0
CALL ESPSD_PUTBYTE_SLOW
RET NZ
CALL ESPSD_PUTBYTE_SLOW
RET NZ
JP ESPSD_GETRESULT
; ;
; INITIALIZE DEVICE ; INITIALIZE DEVICE
; ;
@ -453,10 +492,6 @@ ESPSD_INITDEV1:
; ;
CALL ESPSD_INITCARD ; PERFORM DEVICE INIT CALL ESPSD_INITCARD ; PERFORM DEVICE INIT
JP NZ,ESPSD_NOMEDIA ; CONVERT TO NO MEDIA ERROR JP NZ,ESPSD_NOMEDIA ; CONVERT TO NO MEDIA ERROR
;
; GET CAPACITY
; NOT CURRENTLY AVAILABLE IN ESP32 API
; CAPACITY IS HARD-CODED ABOVE AT API MAX OF $10000 BLOCKS
; ;
; RESET STATUS ; RESET STATUS
LD A,ESPSD_STOK LD A,ESPSD_STOK
@ -480,17 +515,13 @@ ESPSD_IO:
; SELECT PRI/SEC DEVICE ; SELECT PRI/SEC DEVICE
CALL ESPSD_SELECT ; SELECT DEVICE CALL ESPSD_SELECT ; SELECT DEVICE
JP NZ,ESPSD_ERR ; ON ERROR, RECORD AND BAIL OUT JP NZ,ESPSD_ERR ; ON ERROR, RECORD AND BAIL OUT
;CALL LDELAY ; *DEBUG*
; ;
; SET LBA ; SET LBA
LD A,ESPSD_LBA ; OFFSET OF LBA VALUE LD A,ESPSD_LBA ; OFFSET OF LBA VALUE
CALL LDHLIYA ; HL := IY + A, REG A TRASHED CALL LDHLIYA ; HL := IY + A, REG A TRASHED
CALL HB_DSKACT ; SHOW ACTIVITY CALL HB_DSKACT ; SHOW ACTIVITY
CALL LD32 ; LOAD IT TO DE:HL, AF IS TRASHED
CALL ESPSD_SETLBA ; SEND LBA TO DEVICE CALL ESPSD_SETLBA ; SEND LBA TO DEVICE
;JP ESPSD_IOERR ; *DEBUG*
JP NZ,ESPSD_ERR ; ON ERROR, RECORD AND BAIL OUT JP NZ,ESPSD_ERR ; ON ERROR, RECORD AND BAIL OUT
;CALL LDELAY ; *DEBUG*
; ;
; PERFORM BLOCK READ/WRITE ; PERFORM BLOCK READ/WRITE
LD HL,(ESPSD_DSKBUF) ; RECOVER THE DISK BUFFER ADR LD HL,(ESPSD_DSKBUF) ; RECOVER THE DISK BUFFER ADR
@ -503,7 +534,6 @@ ESPSD_IO2:
CALL ESPSD_BLKWRITE ; DO THE WRITE CALL ESPSD_BLKWRITE ; DO THE WRITE
ESPSD_IO3: ESPSD_IO3:
JP NZ,ESPSD_ERR ; ON ERROR, RECORD AND BAIL OUT JP NZ,ESPSD_ERR ; ON ERROR, RECORD AND BAIL OUT
;CALL LDELAY ; *DEBUG*
; ;
; INCREMENT LBA ; INCREMENT LBA
LD A,ESPSD_LBA ; LBA OFFSET LD A,ESPSD_LBA ; LBA OFFSET
@ -529,7 +559,57 @@ ESPSD_IO3:
ESPSD_INITCARD: ESPSD_INITCARD:
LD A,ESPSD_CMD_INIT0 ; INIT PRIMARY DEVICE LD A,ESPSD_CMD_INIT0 ; INIT PRIMARY DEVICE
ADD A,(IY+ESPSD_ROLE) ; ADJUST FOR PRI/SEC ADD A,(IY+ESPSD_ROLE) ; ADJUST FOR PRI/SEC
JR ESPSD_RUNCMD ; USE COMMON CMD ROUTINE
CALL ESPSD_RUNCMD ; USE COMMON CMD ROUTINE
RET NZ ; HANDLE ERROR
;
; GET CAPACITY
LD E,ESPSD_CMD_CAP ; GET CAPACITY COMMAND
CALL ESPSD_CMD_SLOW ; SEND IT
RET NZ ; HANDLE ERROR
;
LD A,ESPSD_MEDCAP ; OFFSET TO CAPACITY FIELD
CALL LDHLIYA ; HL := IY + A, REG A TRASHED
LD A,4 ; START AT END FOR LITTLE ENDIAN
CALL ADDHLA ; BUMP PTR TO END OF DWORD
LD B,4 ; LOOP FOR 4 BYTES
;
ESPSD_INITCARD1:
DEC HL ; DEC POINTER
PUSH BC ; SAVE LOOP CONTROL
CALL ESPSD_GETBYTE_SLOW ; FIRST BYTE (MSB)
POP BC ; RESTORE LOOP CONTROL
RET NZ ; HANDLE ERROR
LD (HL),E ; SAVE IT
DJNZ ESPSD_INITCARD1 ; LOOP AS NEEDED
;
JR ESPSD_GETRESULT ; EXIT VIA CMD RESULT HANDLER
;
; GET BOARD ID AND FIRMWARE VERSION
;
ESPSD_FWVER:
LD E,ESPSD_CMD_FWVER ; FWVER COMMAND
CALL ESPSD_CMD_SLOW ; SEND IT
RET NZ ; HANDLE ERROR
CALL ESPSD_GETBYTE_SLOW ; GET BOARD ID
RET NZ ; HANDLE ERROR
LD D,E ; SAVE IN D
CALL ESPSD_GETBYTE_SLOW ; GET VER MAJOR
RET NZ ; HANDLE ERROR
LD H,E ; PUT IN H
CALL ESPSD_GETBYTE_SLOW ; GET VER MINOR
RET NZ ; HANDLE ERROR
LD L,E ; PUT IN H
CALL ESPSD_GETBYTE_SLOW ; GET RESULT
RET NZ ; HANDLE ERROR
LD A,E ; RESULT TO ACCUM
LD E,D ; BOARD ID BACK TO E
OR A ; SET FLAGS
RET Z ; RETURN SUCCESS
LD A,ESPSD_STIOERR ; CALL THIS AN I/O ERR
OR A ; SET FLAGS
RET ; DONE
; ;
; (RE)SELECT DEVICE ; (RE)SELECT DEVICE
; ;
@ -544,6 +624,7 @@ ESPSD_RUNCMD:
LD E,A ; PUT IN E LD E,A ; PUT IN E
CALL ESPSD_CMD_SLOW ; SEND COMMAND CALL ESPSD_CMD_SLOW ; SEND COMMAND
RET NZ ; HANDLE ERROR RET NZ ; HANDLE ERROR
ESPSD_GETRESULT:
CALL ESPSD_GETBYTE_SLOW ; GET RESULT CALL ESPSD_GETBYTE_SLOW ; GET RESULT
RET NZ ; HANDLE ERROR RET NZ ; HANDLE ERROR
LD A,E ; RESULT TO ACCUM LD A,E ; RESULT TO ACCUM
@ -558,17 +639,24 @@ ESPSD_RUNCMD:
; A 16-BIT LBA. ; A 16-BIT LBA.
; ;
ESPSD_SETLBA: ESPSD_SETLBA:
LD E,ESPSD_CMD_SETTRKSEC
CALL ESPSD_CMD_SLOW
RET NZ
LD E,H
CALL ESPSD_PUTBYTE_SLOW
RET NZ
LD E,L
CALL ESPSD_PUTBYTE_SLOW
RET NZ
CALL ESPSD_GETBYTE_SLOW
RET NZ
LD E,ESPSD_CMD_SETLBA ; SETLBA COMMAND
CALL ESPSD_CMD_SLOW ; SEND IT
RET NZ ; HANDLE ERROR
LD A,4 ; LITTLE ENDIAN
CALL ADDHLA ; BUMP TO END OF LBA BYTES
LD B,4 ; LOOP TO SEND 4 BYTES
;
ESPSD_SETLBA1:
DEC HL ; DEC POINTER
LD E,(HL) ; GET NEXT BYTE TO SEND
PUSH BC ; SAVE LOOP CONTROL
CALL ESPSD_PUTBYTE_SLOW ; SEND BYTE
POP BC ; RESTORE LOOP CONTROL
RET NZ ; HANDLE ERROR
DJNZ ESPSD_SETLBA1 ; LOOP AS NEEDED
;
CALL ESPSD_GETBYTE_SLOW ; GET RESULT
RET NZ ; HANDLE ERROR
LD A,E ; RESULT TO ACCUM LD A,E ; RESULT TO ACCUM
OR A ; SET FLAGS OR A ; SET FLAGS
RET Z ; GOOD RETURN RET Z ; GOOD RETURN
@ -602,7 +690,6 @@ ESPSD_BLKREAD1:
CALL ESPSD_GETBYTE_SLOW ; GET RESULT CALL ESPSD_GETBYTE_SLOW ; GET RESULT
RET NZ ; HANDLE ERROR RET NZ ; HANDLE ERROR
LD A,E ; RESULT TO ACCUM LD A,E ; RESULT TO ACCUM
;;;CALL PRTHEXBYTE ; *DEBUG*
OR A ; SET FLAGS OR A ; SET FLAGS
RET Z ; GOOD RETURN RET Z ; GOOD RETURN
LD A,ESPSD_STIOERR ; CALL THIS AN IO ERROR LD A,ESPSD_STIOERR ; CALL THIS AN IO ERROR
@ -678,7 +765,6 @@ ESPSD_PUTBYTE1:
IN A,(C) IN A,(C)
BIT 0,A BIT 0,A
JR Z,ESPSD_PUTBYTE2 JR Z,ESPSD_PUTBYTE2
;JR ESPSD_PUTBYTE1 ; *DEBUG*
DJNZ ESPSD_PUTBYTE1 DJNZ ESPSD_PUTBYTE1
LD A,ESPSD_STTO LD A,ESPSD_STTO
OR A OR A
@ -699,10 +785,7 @@ ESPSD_PUTBYTE2:
; ;
ESPSD_PUTBYTE_SLOW: ESPSD_PUTBYTE_SLOW:
PUSH HL PUSH HL
;;;LD HL,50 * CPUMHZ ; CPU SPEED SCALED TIMEOUT
LD HL,100 * CPUMHZ ; CPU SPEED SCALED TIMEOUT LD HL,100 * CPUMHZ ; CPU SPEED SCALED TIMEOUT
;;;LD HL,1000 * CPUMHZ ; CPU SPEED SCALED TIMEOUT
;;;LD HL,0 ; *DEBUG*
ESPSD_PUTBYTE_SLOW1: ESPSD_PUTBYTE_SLOW1:
PUSH HL PUSH HL
CALL ESPSD_PUTBYTE CALL ESPSD_PUTBYTE
@ -753,10 +836,7 @@ ESPSD_GETBYTE2:
; ;
ESPSD_GETBYTE_SLOW: ESPSD_GETBYTE_SLOW:
PUSH HL PUSH HL
;;;LD HL,50 * CPUMHZ ; CPU SPEED SCALED TIMEOUT
LD HL,100 * CPUMHZ ; CPU SPEED SCALED TIMEOUT LD HL,100 * CPUMHZ ; CPU SPEED SCALED TIMEOUT
;;;LD HL,1000 * CPUMHZ ; CPU SPEED SCALED TIMEOUT
;;;LD HL,0 ; *DEBUG*
ESPSD_GETBYTE_SLOW1: ESPSD_GETBYTE_SLOW1:
PUSH HL PUSH HL
CALL ESPSD_GETBYTE CALL ESPSD_GETBYTE
@ -885,6 +965,10 @@ ESPSD_STR_STTO .TEXT "TIMEOUT$"
ESPSD_STR_STNOTRDY .TEXT "NOT READY$" ESPSD_STR_STNOTRDY .TEXT "NOT READY$"
ESPSD_STR_STUNK .TEXT "UNKNOWN ERROR$" ESPSD_STR_STUNK .TEXT "UNKNOWN ERROR$"
; ;
ESPSD_STR_2CF1SD .TEXT "2CF+1SD$"
ESPSD_STR_2SD .TEXT "2SD$"
ESPSD_STR_UNKNOWN .TEXT "BOARD?$"
;
;============================================================================= ;=============================================================================
; DATA STORAGE ; DATA STORAGE
;============================================================================= ;=============================================================================

Loading…
Cancel
Save