From cccb51b3c428a9136802c06d3f5c5042d7ca63d0 Mon Sep 17 00:00:00 2001 From: Wayne Warthen Date: Mon, 25 Aug 2025 17:12:59 -0700 Subject: [PATCH] Adjust ESPSD Driver for Firmware Updates --- Source/HBIOS/espsd.asm | 204 +++++++++++++++++++++++++++++------------ 1 file changed, 144 insertions(+), 60 deletions(-) diff --git a/Source/HBIOS/espsd.asm b/Source/HBIOS/espsd.asm index 5e00cfe7..7bbc97dc 100644 --- a/Source/HBIOS/espsd.asm +++ b/Source/HBIOS/espsd.asm @@ -27,30 +27,27 @@ ; FOR STATUS AND THE SECOND IS FOR COMMAND & DATA EXCHANGE. ; ; === 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 ; ---------------------- @@ -65,17 +62,18 @@ ; ->CMD_FORMAT, <-STATUS ; ->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_TYPE, <-[SD Card Type (1 byte)], <-STATUS ; ->CMD_CAP, <-[Sector Count (4 bytes, MS first)], <-STATUS ; ->CMD_CID, <-[CID 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 -; STATUS BYTE, THEN DUMMY PADDING DATA MUST BE SENT BEFORE THE +; STATUS BYTE, THEN DUMMY PADDING DATA IS SENT BEFORE THE ; ERROR STATUS. ; 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_CID .EQU $94 ; REPORT CID 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_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_STOK .EQU 0 @@ -235,6 +240,31 @@ ESPSD_INIT2B: JR ESPSD_INIT4 ; SKIP CFG ENTRY ; 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 ; ESPSD_INIT4: @@ -432,9 +462,18 @@ ESPSD_GEOM: ; ON RETURN, ZF SET INDICATES HARDWARE FOUND ; 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 ; @@ -453,10 +492,6 @@ ESPSD_INITDEV1: ; CALL ESPSD_INITCARD ; PERFORM DEVICE INIT 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 LD A,ESPSD_STOK @@ -480,17 +515,13 @@ ESPSD_IO: ; SELECT PRI/SEC DEVICE CALL ESPSD_SELECT ; SELECT DEVICE JP NZ,ESPSD_ERR ; ON ERROR, RECORD AND BAIL OUT - ;CALL LDELAY ; *DEBUG* ; ; SET LBA LD A,ESPSD_LBA ; OFFSET OF LBA VALUE CALL LDHLIYA ; HL := IY + A, REG A TRASHED CALL HB_DSKACT ; SHOW ACTIVITY - CALL LD32 ; LOAD IT TO DE:HL, AF IS TRASHED CALL ESPSD_SETLBA ; SEND LBA TO DEVICE - ;JP ESPSD_IOERR ; *DEBUG* JP NZ,ESPSD_ERR ; ON ERROR, RECORD AND BAIL OUT - ;CALL LDELAY ; *DEBUG* ; ; PERFORM BLOCK READ/WRITE LD HL,(ESPSD_DSKBUF) ; RECOVER THE DISK BUFFER ADR @@ -503,7 +534,6 @@ ESPSD_IO2: CALL ESPSD_BLKWRITE ; DO THE WRITE ESPSD_IO3: JP NZ,ESPSD_ERR ; ON ERROR, RECORD AND BAIL OUT - ;CALL LDELAY ; *DEBUG* ; ; INCREMENT LBA LD A,ESPSD_LBA ; LBA OFFSET @@ -529,7 +559,57 @@ ESPSD_IO3: ESPSD_INITCARD: LD A,ESPSD_CMD_INIT0 ; INIT PRIMARY DEVICE 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 ; @@ -544,6 +624,7 @@ ESPSD_RUNCMD: LD E,A ; PUT IN E CALL ESPSD_CMD_SLOW ; SEND COMMAND RET NZ ; HANDLE ERROR +ESPSD_GETRESULT: CALL ESPSD_GETBYTE_SLOW ; GET RESULT RET NZ ; HANDLE ERROR LD A,E ; RESULT TO ACCUM @@ -558,17 +639,24 @@ ESPSD_RUNCMD: ; A 16-BIT LBA. ; 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 OR A ; SET FLAGS RET Z ; GOOD RETURN @@ -602,7 +690,6 @@ ESPSD_BLKREAD1: CALL ESPSD_GETBYTE_SLOW ; GET RESULT RET NZ ; HANDLE ERROR LD A,E ; RESULT TO ACCUM - ;;;CALL PRTHEXBYTE ; *DEBUG* OR A ; SET FLAGS RET Z ; GOOD RETURN LD A,ESPSD_STIOERR ; CALL THIS AN IO ERROR @@ -678,7 +765,6 @@ ESPSD_PUTBYTE1: IN A,(C) BIT 0,A JR Z,ESPSD_PUTBYTE2 - ;JR ESPSD_PUTBYTE1 ; *DEBUG* DJNZ ESPSD_PUTBYTE1 LD A,ESPSD_STTO OR A @@ -699,10 +785,7 @@ ESPSD_PUTBYTE2: ; ESPSD_PUTBYTE_SLOW: PUSH HL - ;;;LD HL,50 * 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: PUSH HL CALL ESPSD_PUTBYTE @@ -753,10 +836,7 @@ ESPSD_GETBYTE2: ; ESPSD_GETBYTE_SLOW: PUSH HL - ;;;LD HL,50 * 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: PUSH HL CALL ESPSD_GETBYTE @@ -885,6 +965,10 @@ ESPSD_STR_STTO .TEXT "TIMEOUT$" ESPSD_STR_STNOTRDY .TEXT "NOT READY$" ESPSD_STR_STUNK .TEXT "UNKNOWN ERROR$" ; +ESPSD_STR_2CF1SD .TEXT "2CF+1SD$" +ESPSD_STR_2SD .TEXT "2SD$" +ESPSD_STR_UNKNOWN .TEXT "BOARD?$" +; ;============================================================================= ; DATA STORAGE ;=============================================================================