mirror of
https://github.com/Doczom/SDHCI_driver_for_Kolibrios.git
synced 2025-09-21 02:50:10 +02:00
Added a function to get the number of sectors
Added a function to get the number of sectors and other update file. Added test functions for reading sectors from an SD card using SDMA.
This commit is contained in:
164
SDHC_doc.txt
Normal file
164
SDHC_doc.txt
Normal file
@@ -0,0 +1,164 @@
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
; Response Bit Definition and Each Response type
|
||||
; R1,R1b (normal response) - Card Status - REP[0:31]
|
||||
; R1b (Auto CMD12 response) - Card Status for Auto CMD12 - REP[96:127]
|
||||
; R1 (Auto CMD23 response) - Card Status for Auto CMD23 - REP[96:127]
|
||||
; R2 (CID, CSD register) - CID or CSD reg. incl. - REP[0:119]
|
||||
; R3 (OCR register) - OCR register for memory - REP[0:31]
|
||||
; R4 (OCR register) - OCR register for I/O etc - REP[0:31]
|
||||
; R5, R5b - SDIO response - REP[0:31]
|
||||
; R6 (Published RCA response) - New published RCA[16:31] etc - REP[0:31]
|
||||
; R7 (return CMD8) - Voltage flags + mask protect - REP[0:31]
|
||||
|
||||
|
||||
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SD/SDIO/MMC <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
; OCR register
|
||||
; bit | data
|
||||
;---------|----------------------------;
|
||||
; 0-6 | reserved ;
|
||||
; 7 | Low Voltage Range (1.8V) ;
|
||||
; 8-14 | reserved ;
|
||||
; 15 | 2.7 - 2.8V ;
|
||||
; 16 | 2.8 - 2.9V ;
|
||||
; 17 | 2.9 - 3.0V ;
|
||||
; 18 | 3.0 - 3.1V ;
|
||||
; 19 | 3.1 - 3.2V ;
|
||||
; 20 | 3.2 - 3.3V ;
|
||||
; 21 | 3.3 - 3.4V ;
|
||||
; 22 | 3.4 - 3.5V ;
|
||||
; 23 | 3.5 - 3.6V ;
|
||||
; 24 | reserved ; <- only to UHS-I "switching to 1.8 Accepted (S18A)"
|
||||
; 25-26 | reserved ;
|
||||
; 27 | reserved ; <- only to SDUC "Over to 2TB support Status (CO2T)"
|
||||
; 28 | reserved ;
|
||||
; 29 | reserved ; <- UHS-II Card Status
|
||||
; 30 | Card Capacity Status(CCS) ;
|
||||
; 31 | Card power up status bit ; (busy)
|
||||
;--------------------------------------;
|
||||
|
||||
; I/O OCR register
|
||||
; bit | data
|
||||
;---------|----------------------------;
|
||||
; 0-7 | reserved ;
|
||||
; 8 | 2.0 - 2.1V ;
|
||||
; 9 | 2.1 - 2.2V ;
|
||||
; 10 | 2.2 - 2.3V ;
|
||||
; 11 | 2.3 - 2.4V ;
|
||||
; 12 | 2.4 - 2.5V ;
|
||||
; 13 | 2.5 - 2.6V ;
|
||||
; 11 | 2.6 - 2.7V ;
|
||||
; 15 | 2.7 - 2.8V ;
|
||||
; 16 | 2.8 - 2.9V ;
|
||||
; 17 | 2.9 - 3.0V ;
|
||||
; 18 | 3.0 - 3.1V ;
|
||||
; 19 | 3.1 - 3.2V ;
|
||||
; 20 | 3.2 - 3.3V ;
|
||||
; 21 | 3.3 - 3.4V ;
|
||||
; 22 | 3.4 - 3.5V ;
|
||||
; 23 | 3.5 - 3.6V ;
|
||||
; 24 | switching to 1.8 Accepted ; <- "switching to 1.8 Accepted (S18A)"
|
||||
; 25-26 | reserved ;
|
||||
; 27 | Memory Present ; <- 1 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SD <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 0 <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> I/O
|
||||
; 28-30 | Number of I/O Functions ; <- <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> SDIO <20><><EFBFBD><EFBFBD><EFBFBD>)
|
||||
; 31 | Card power up status bit ; (busy)
|
||||
;--------------------------------------;
|
||||
; CID register
|
||||
; bit | width | data ;
|
||||
;---------|-------|----------------------------;
|
||||
; 0-11 | 12 | Manufacturing date(MDT) ; <- [0-3] month code(1=january) [4-11] year-2000
|
||||
; 12-15 | 4 | reserved ;
|
||||
; 16-47 | 32 | Product Serial Number(PSN) ;
|
||||
; 48-55 | 8 | Product Revision(PRV) ; <- BCD number
|
||||
; 56-95 | 40 | Product name(PRN) ;
|
||||
; 96-111 | 16 | OEM/Aplication ID (OID) ;
|
||||
; 112-119 | 8 | Manufacturer ID (MID) ;
|
||||
;----------------------------------------------;
|
||||
; CSD register ver 1.0
|
||||
; bit | width | value | data ;
|
||||
;---------|-------|--------------------|-----------------------------------------------------;
|
||||
; 0-1 | 2 | 00b | reserved ;
|
||||
; 2-3 | 2 | xxb | File Format(FILE_FORMAT) ;
|
||||
; 4 | 1 | xb | temporary write protection TMP_WRITE_PROTECT ;
|
||||
; 5 | 1 | xb | permanent write protection PERM_WRITE_PROTECT ;
|
||||
; 6 | 1 | xb | copy flag COPY ;
|
||||
; 7 | 1 | xb | file format group (FILE_FORMAT_GRP) ;
|
||||
; 8-12 | 5 | 00000b | reserved ;
|
||||
; 13 | 1 | xb | partial blocks for write allowed (WRITE_BL_PARTIAL) ;
|
||||
; 14-17 | 4 | xxxxb | max. write data block length (WRITE_BL_LEN) ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; 18-20 | 3 | xxxb | write speed factor (R2W_FACTOR) ;
|
||||
; 21-22 | 2 | 00b | reserved ;
|
||||
; 23 | 1 | xb | write protect group enable (WP_GRP_ENABLE) ;
|
||||
; 24-30 | 7 | xxxxxxxb | write protect group size (WP_GRP_SIZE) ;
|
||||
; 31-37 | 7 | xxxxxxxb | erase sector size (SECTOR_SIZE) ;
|
||||
; 38 | 1 | xb | erase single block enable (ERASW_BLK_EN) ;
|
||||
; 39-41 | 3 | xxxb | device size multiplier C_SIZE_MULT ;
|
||||
; 42-44 | 3 | xxxb | VDD_W_CURR_MAX ;
|
||||
; 45-47 | 3 | xxxb | VDD_W_CURR_MIN ;
|
||||
; 48-50 | 3 | xxxb | VDD_R_CURR_MAX ;
|
||||
; 51-53 | 3 | xxxb | VDD_R_CURR_MIN ;
|
||||
; 54-65 | 12 | xxxh | device size C_SIZE ;
|
||||
; 66-67 | 2 | 00b | reserved ;
|
||||
; 68 | 1 | xb | DSR implemented DSR_IMP ; <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> DSR <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; 69 | 1 | xb | read block misalignment (READ_BLK_MISALIGN) ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; 70 | 1 | xb | write block misalignment (WRITE_BLK_MISALIGN) ; 0 - <20><><EFBFBD> 1 - <20><>
|
||||
; 71 | 1 | 1b | partial blocks for read allowed (READ_BL_PARTIAL) ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1. <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
; 72-75 | 4 | xh | max. read data block length (READ_BL_LEN) ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; 76-87 | 12 | 01x110110101b | card command classes CCC ;
|
||||
; 88-95 | 8 | 32h,5Ah | max. data transfer rate (TRAN_SPEED) ;
|
||||
; 96-103 | 8 | xxh | data read access-time in CLK cycles(MSAC*100) NSAC);
|
||||
; 104-111 | 8 | xxh | data read access-time (TAAC) ;
|
||||
; 112-117 | 6 | 00 0000b | reserved ;
|
||||
; 118-119 | 2 | 00b | CSD structure CSD_STRUCTURE ;
|
||||
;--------------------------------------------------------------------------------------------;
|
||||
; CSD register ver 2.0
|
||||
; bit | width | value | data ;
|
||||
;---------|-------|--------------------|-----------------------------------------------------;
|
||||
; 0-1 | 2 | 00b | reserved ;
|
||||
; 2-3 | 2 | 00b | File Format(FILE_FORMAT) ;
|
||||
; 4 | 1 | x | temporary write protection TMP_WRITE_PROTECT ;
|
||||
; 5 | 1 | x | permanent write protection PERM_WRITE_PROTECT ;
|
||||
; 6 | 1 | x | copy flag COPY ;
|
||||
; 7 | 1 | 0 | file format group (FILE_FORMAT_GRP) ;
|
||||
; 8-12 | 5 | 00000b | reserved ;
|
||||
; 13 | 1 | 0 | partial blocks for write allowed (WRITE_BL_PARTIAL) ;
|
||||
; 14-17 | 4 | 9 | max. write data block length (WRITE_BL_LEN) ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; 18-20 | 3 | 010b | write speed factor (R2W_FACTOR) ;
|
||||
; 21-22 | 2 | 00b | reserved ;
|
||||
; 23 | 1 | 0 | write protect group enable (WP_GRP_ENABLE) ;
|
||||
; 24-30 | 7 | 0000000b | write protect group size (WP_GRP_SIZE) ;
|
||||
; 31-37 | 7 | 7Fh | erase sector size (SECTOR_SIZE) ;
|
||||
; 38 | 1 | 1 | erase single block enable (ERASW_BLK_EN) ;
|
||||
; 39 | 1 | 0 | reserved ;
|
||||
; 40-61 | 22 | xxxxxxh | device size C_SIZE ;
|
||||
; 62-67 | 6 | 00 0000b | reserved ;
|
||||
; 68 | 1 | x | DSR implemented DSR_IMP ; <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> DSR <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; 69 | 1 | 0 | read block misalignment (READ_BLK_MISALIGN) ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; 70 | 1 | 0 | write block misalignment (WRITE_BLK_MISALIGN) ; 0 - <20><><EFBFBD> 1 - <20><>
|
||||
; 71 | 1 | 0 | partial blocks for read allowed (READ_BL_PARTIAL) ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1. <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
; 72-75 | 4 | 9 | max. read data block length (READ_BL_LEN) ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; 76-87 | 12 | 01x110110101b | card command classes CCC ;
|
||||
; 88-95 | 8 | 32h,5Ah,0Bh or 2Bh | max. data transfer rate (TRAN_SPEED) ;
|
||||
; 96-103 | 8 | 00h | data read access-time in CLK cycles(MSAC*100) NSAC);
|
||||
; 104-111 | 8 | 0Eh | data read access-time (TAAC) ;
|
||||
; 112-117 | 6 | 00 0000b | reserved ;
|
||||
; 118-119 | 2 | 01b | CSD structure CSD_STRUCTURE ;
|
||||
;--------------------------------------------------------------------------------------------;
|
||||
;
|
||||
; for version struct 1.0
|
||||
; memory capacity = BLOCKNR * BLOCK_LEN
|
||||
; BLOCKNR = (C_SIZE + 1) * MULT
|
||||
; MULT = 2^(C_SIZE_MULT + 2)
|
||||
; for version struct 2.0
|
||||
; memory capacity = (C_SIZE + 1) * 512 KByte
|
||||
|
||||
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
|
||||
; <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> sd <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>-<2D><>
|
||||
; <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
266
sdhc_cmd.inc
266
sdhc_cmd.inc
@@ -1,16 +1,6 @@
|
||||
;; Copyright (C) 2022, Michael Frolov(aka Doczom)
|
||||
;; SDHC commands
|
||||
|
||||
; Response Bir Definition and Each Response type
|
||||
; R1,R1b (normal response) - Card Status - REP[0:31]
|
||||
; R1b (Auto CMD12 response) - Card Status for Auto CMD12 - REP[96:127]
|
||||
; R1 (Auto CMD23 response) - Card Status for Auto CMD23 - REP[96:127]
|
||||
; R2 (CID, CSD register) - CID or CSD reg. incl. - REP[0:119]
|
||||
; R3 (OCR register) - OCR register for memory - REP[0:31]
|
||||
; R4 (OCR register) - OCR register for I/O etc - REP[0:31]
|
||||
; R5, R5b - SDIO response - REP[0:31]
|
||||
; R6 (Published RCA response) - New published RCA[16:31] etc - REP[0:31]
|
||||
; R7 (return CMD8) - Voltage flags + mask protect - REP[0:31]
|
||||
RESP_TYPE:
|
||||
.not = 00000b + 00b
|
||||
.R1 = 11000b + 10b
|
||||
@@ -22,99 +12,131 @@ RESP_TYPE:
|
||||
.R5b = .R1b
|
||||
.R6 = .R1
|
||||
.R7 = .R1
|
||||
; OCR register
|
||||
; bit | data
|
||||
;---------|----------------------------;
|
||||
; 0-6 | reserved ;
|
||||
; 7 | Low Voltage Range (1.8V) ;
|
||||
; 8-14 | reserved ;
|
||||
; 15 | 2.7 - 2.8V ;
|
||||
; 16 | 2.8 - 2.9V ;
|
||||
; 17 | 2.9 - 3.0V ;
|
||||
; 18 | 3.0 - 3.1V ;
|
||||
; 19 | 3.1 - 3.2V ;
|
||||
; 20 | 3.2 - 3.3V ;
|
||||
; 21 | 3.3 - 3.4V ;
|
||||
; 22 | 3.4 - 3.5V ;
|
||||
; 23 | 3.5 - 3.6V ;
|
||||
; 24 | reserved ; <- only to UHS-I "switching to 1.8 Accepted (S18A)"
|
||||
; 25-26 | reserved ;
|
||||
; 27 | reserved ; <- only to SDUC "Over to 2TB support Status (CO2T)"
|
||||
; 28 | reserved ;
|
||||
; 29 | reserved ; <- UHS-II Card Status
|
||||
; 30 | Card Capacity Status(CCS) ;
|
||||
; 31 | Card power up status bit ; (busy)
|
||||
;--------------------------------------;
|
||||
|
||||
; I/O OCR register
|
||||
; bit | data
|
||||
;---------|----------------------------;
|
||||
; 0-7 | reserved ;
|
||||
; 8 | 2.0 - 2.1V ;
|
||||
; 9 | 2.1 - 2.2V ;
|
||||
; 10 | 2.2 - 2.3V ;
|
||||
; 11 | 2.3 - 2.4V ;
|
||||
; 12 | 2.4 - 2.5V ;
|
||||
; 13 | 2.5 - 2.6V ;
|
||||
; 11 | 2.6 - 2.7V ;
|
||||
; 15 | 2.7 - 2.8V ;
|
||||
; 16 | 2.8 - 2.9V ;
|
||||
; 17 | 2.9 - 3.0V ;
|
||||
; 18 | 3.0 - 3.1V ;
|
||||
; 19 | 3.1 - 3.2V ;
|
||||
; 20 | 3.2 - 3.3V ;
|
||||
; 21 | 3.3 - 3.4V ;
|
||||
; 22 | 3.4 - 3.5V ;
|
||||
; 23 | 3.5 - 3.6V ;
|
||||
; 24 | switching to 1.8 Accepted ; <- "switching to 1.8 Accepted (S18A)"
|
||||
; 25-26 | reserved ;
|
||||
; 27 | Memory Present ; <- 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SD <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, 0 <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> I/O
|
||||
; 28-30 | Number of I/O Functions ; <- <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0 (<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> SDIO <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)
|
||||
; 31 | Card power up status bit ; (busy)
|
||||
;--------------------------------------;
|
||||
; CID register
|
||||
; bit | width | data ;
|
||||
;---------|-------|----------------------------;
|
||||
; 0-11 | 12 | Manufacturing date(MDT) ; <- [0-3] month code(1=january) [4-11] year-2000
|
||||
; 12-15 | 4 | reserved ;
|
||||
; 16-47 | 32 | Product Serial Number(PSN) ;
|
||||
; 48-55 | 8 | Product Revision(PRV) ; <- BCD number
|
||||
; 56-95 | 40 | Product name(PRN) ;
|
||||
; 96-111 | 16 | OEM/Aplication ID (OID) ;
|
||||
; 112-119 | 8 | Manufacturer ID (MID) ;
|
||||
;----------------------------------------------;
|
||||
;
|
||||
CMD_TYPE: ; 6-7 bits
|
||||
.Normal = 00000000b ; other command
|
||||
.Suspend = 10000000b ; CMD12, CMD52 for writing "Bus Suspend" in CCCR
|
||||
.Resume = 01000000b ; CMD52 for writing "Function Select" in CCCR
|
||||
.Abort = 11000000b ; CMD52 for writing "I/O Abort" in CCCR
|
||||
; for 0xc
|
||||
.Single = 000000b
|
||||
.Multiple = 100010b
|
||||
.Infinite = 100000b
|
||||
|
||||
DATA_PRSNT = 100000b ; set for using DAT line for transfer
|
||||
|
||||
;Transfer_type:
|
||||
; .Single = 000000b
|
||||
; .Multiple = 100010b
|
||||
; .Infinite = 100000b
|
||||
DATA_DIR:
|
||||
.Write = 00000b
|
||||
.Read = 10000b
|
||||
|
||||
DMA_EN = 1b ; reg 0x0C
|
||||
ACMD12_EN = 100b ;send acmd12 for end transfer blocks
|
||||
|
||||
DMA_SELECT: ; 3-4 bits SDHC_CTRL1 reg
|
||||
.SDMA = 00000b
|
||||
.ADMA1 = 010000b
|
||||
.ADMA2_32 = 100000b
|
||||
.ADMA2_64 = 110000b
|
||||
|
||||
SD_BLOCK_SIZE = 0x200 ;standart sector = 512
|
||||
|
||||
R1_APP_CMD = 100000b ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ACMD <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
R1_READY_FOR_DATA = 100000000b ; 0x100 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; in: eax - reg map, esi - struct controller
|
||||
; ebx - arg 32 bit <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ecx - 0x0C register edx - command reg with flags
|
||||
; ebx - arg 32 bit <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> edx - 0x0C register ;command reg with flags
|
||||
proc send_sdhc_command
|
||||
@@:
|
||||
test dword[eax + SDHC_PRSNT_STATE], 0x07 ; check cmd_inhid_cmd + cmd_inhibit_dat + DAT Line Active
|
||||
jnz @b
|
||||
mov dword[eax + SDHC_CMD_ARG], ebx
|
||||
;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
shl edx, 16
|
||||
add edx, ecx
|
||||
mov dword[esi + SDHCI_CONTROLLER.int_status], 0
|
||||
DEBUGF 1,"SDHCI: Command send\n"
|
||||
mov dword[eax + SDHC_CMD_TRN], edx ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
@@:
|
||||
cmp dword[esi + SDHCI_CONTROLLER.int_status], 0
|
||||
hlt
|
||||
cmp dword[esi + SDHCI_CONTROLLER.int_status], 0
|
||||
;hlt
|
||||
jz @b
|
||||
DEBUGF 1,"SDHCI: resp1=%x resp2=%x \n", [eax + SDHC_RESP1_0], [eax + SDHC_RESP3_2]
|
||||
ret
|
||||
endp
|
||||
|
||||
; in: eax - reg map, esi - struct controller
|
||||
; ebx - arg 32 bit <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> ecx - 0x0C register edx - command reg with flags
|
||||
proc send_sdhc_transfer_command stdcall, arg:dword, _block_size:word, _block_count:word,\
|
||||
reg0c:dword, virt_addr:dword, phys_addr:dword
|
||||
@@:
|
||||
test dword[eax + SDHC_PRSNT_STATE], 0x07
|
||||
jnz @b ; check cmd_inhid_cmd + cmd_inhibit_dat + DAT Line Active
|
||||
|
||||
; (1) Set Block Size Reg
|
||||
; (2) Set Block Count Reg
|
||||
; (3) Set Argument Reg
|
||||
; (4) Set Transfer Mode Reg
|
||||
; (5) Set Command Reg
|
||||
|
||||
@@:
|
||||
cmp dword[esi + SDHCI_CONTROLLER.int_status], 0
|
||||
hlt
|
||||
jz @b
|
||||
DEBUGF 1,"SDHCI: resp1=%x resp2=%x \n", [eax + SDHC_RESP1_0], [eax + SDHC_RESP3_2]
|
||||
|
||||
cmp dword[esi + SDHCI_CONTROLLER.int_status], 0x01 ; comand complate
|
||||
jnz .err
|
||||
|
||||
; wait interrupt
|
||||
.wait_int:
|
||||
mov dword[esi + SDHCI_CONTROLLER.int_status], 0
|
||||
hlt
|
||||
cmp dword[esi + SDHCI_CONTROLLER.int_status], 0
|
||||
jz .wait_int
|
||||
|
||||
cmp dword[esi + SDHCI_CONTROLLER.int_status], 1000b ; DMA intr
|
||||
jnz .no_sdma
|
||||
; set new addr
|
||||
jmp .wait_int
|
||||
.no_sdma:
|
||||
cmp dword[esi + SDHCI_CONTROLLER.int_status], 10000b ; port write
|
||||
jnz .no_w_port
|
||||
|
||||
; get phys addr
|
||||
|
||||
jmp .wait_int
|
||||
.no_w_port:
|
||||
cmp dword[esi + SDHCI_CONTROLLER.int_status], 100000b ; port read
|
||||
jnz .no_r_port
|
||||
|
||||
;
|
||||
mov ecx, [eax + SDHC_BUFFER]
|
||||
jmp .wait_int
|
||||
.no_w_port:
|
||||
cmp dword[esi + SDHCI_CONTROLLER.int_status], 10b ; Transfer complate
|
||||
jz .good_transfer
|
||||
|
||||
cmp dword[esi + SDHCI_CONTROLLER.int_status], (10b shl 8) shl 16 ; ADMA Error
|
||||
jz .adma_error
|
||||
|
||||
.good_transfer:
|
||||
DEBUGF 1,"SDHCI: GOOD COMMAND\n"
|
||||
ret
|
||||
.undefined_err:
|
||||
DEBUGF 1,"SDHCI: UNDEFINED ERROR\n"
|
||||
.adma_error:
|
||||
.err:
|
||||
DEBUGF 1,"SDHCI: ERROR TRANSFER COMMAND\n"
|
||||
ret
|
||||
endp
|
||||
|
||||
;basic commands
|
||||
|
||||
;cmd0 - Resets all cards to idle state
|
||||
macro GO_IDLE_SATTE {
|
||||
xor ebx, ebx
|
||||
mov ecx, 0x00;0x02 ; read mull
|
||||
mov edx, RESP_TYPE.not
|
||||
mov edx, (RESP_TYPE.not) shl 16
|
||||
call send_sdhc_command
|
||||
;ret
|
||||
}
|
||||
@@ -123,8 +145,7 @@ macro GO_IDLE_SATTE {
|
||||
;args =
|
||||
macro ALL_SEND_CID {
|
||||
xor ebx, ebx ;arg
|
||||
mov ecx, 0x00;0x02 ; read mull
|
||||
mov edx, (2 shl 8) + RESP_TYPE.R2 ;01000b + 01b
|
||||
mov edx, ((2 shl 8) + RESP_TYPE.R2 ) shl 16
|
||||
call send_sdhc_command
|
||||
; save CID
|
||||
mov ecx, [eax + SDHC_RESP1_0]
|
||||
@@ -143,8 +164,7 @@ macro ALL_SEND_CID {
|
||||
;args =
|
||||
proc SEND_RCA
|
||||
xor ebx, ebx ;arg
|
||||
mov ecx, 0x00;0x02 ; read mull
|
||||
mov edx, (3 shl 8) + RESP_TYPE.R6 ;01000b + 01b
|
||||
mov edx, ((3 shl 8) + RESP_TYPE.R6 ) shl 16
|
||||
call send_sdhc_command
|
||||
|
||||
mov ecx, [eax + SDHC_RESP1_0]
|
||||
@@ -159,8 +179,27 @@ proc SET_DSR
|
||||
|
||||
ret
|
||||
endp
|
||||
proc cmd7
|
||||
ret
|
||||
;cmd7 - select card for switch in transfer state
|
||||
;resp = R1b , ZF - good; not ZF - error
|
||||
;args = RCA in ebx
|
||||
proc SELECT_CARD
|
||||
mov bx, word[esi + SDHCI_CONTROLLER.card_reg_rca]
|
||||
shl ebx, 16
|
||||
mov edx, ((7 shl 8) + RESP_TYPE.R1b ) shl 16
|
||||
call send_sdhc_command
|
||||
|
||||
test dword[esi + SDHCI_CONTROLLER.int_status],0x8000
|
||||
ret
|
||||
endp
|
||||
;cmd7 - switch card in stable state
|
||||
;resp = R1b , ZF - good; not ZF - error
|
||||
proc DESELECT_CARD
|
||||
xor ebx, ebx
|
||||
mov edx, ((7 shl 8) + RESP_TYPE.R1b ) shl 16
|
||||
call send_sdhc_command
|
||||
|
||||
test dword[esi + SDHCI_CONTROLLER.int_status],0x8000
|
||||
ret
|
||||
endp
|
||||
;cmd8 - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2.0 <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
;resp = R7
|
||||
@@ -168,6 +207,7 @@ endp
|
||||
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD>)) <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>,
|
||||
; <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> ACMD41
|
||||
proc SEND_IF_COUND
|
||||
mov ebx, (0001b shl 8) + 10101010b
|
||||
|
||||
@@ -175,10 +215,9 @@ proc SEND_IF_COUND
|
||||
jnz @f
|
||||
mov ebx, (0010b shl 8) + 10101010b ;0001b - <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
@@: ;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD> 51. 2.7V-3.6V=0001b 1.8V=0010b
|
||||
mov ecx, 0x00;0x02 ; read mull
|
||||
mov edx, (8 shl 8) + RESP_TYPE.R7 ;01000b + 11b
|
||||
mov edx, ((8 shl 8) + RESP_TYPE.R7 ) shl 16
|
||||
call send_sdhc_command
|
||||
cmp word[eax + SDHC_RESP1_0], bx;(0001b shl 8) + 10101010b
|
||||
;cmp word[eax + SDHC_RESP1_0], bx;(0001b shl 8) + 10101010b
|
||||
ret
|
||||
endp
|
||||
|
||||
@@ -186,11 +225,10 @@ endp
|
||||
;resp = R2
|
||||
;args = [16:31]RCA card
|
||||
proc SEND_CSD
|
||||
DEBUGF 1,"SDHCI: get CSD reg\n"
|
||||
;DEBUGF 1,"SDHCI: get CSD reg\n"
|
||||
mov bx, word[esi + SDHCI_CONTROLLER.card_reg_rca]
|
||||
shl ebx, 16
|
||||
mov ecx, 0x00;0x02 ; read mull
|
||||
mov edx, (9 shl 8) + RESP_TYPE.R2 ;01000b + 01b
|
||||
mov edx, ((9 shl 8) + RESP_TYPE.R2 ) shl 16
|
||||
call send_sdhc_command
|
||||
; save CID
|
||||
mov ecx, [eax + SDHC_RESP1_0]
|
||||
@@ -204,22 +242,44 @@ proc SEND_CSD
|
||||
DEBUGF 1,"SDHCI: resp3=%x resp4=%x \n", [eax + SDHC_RESP5_4], [eax + SDHC_RESP7_6]
|
||||
ret
|
||||
endp
|
||||
;cmd10 = get CID for this card
|
||||
;resp = R2
|
||||
;args = [16:31]RCA card
|
||||
proc SEND_CID
|
||||
;DEBUGF 1,"SDHCI: get CID reg\n"
|
||||
mov bx, word[esi + SDHCI_CONTROLLER.card_reg_rca]
|
||||
shl ebx, 16
|
||||
mov edx, ((10 shl 8) + RESP_TYPE.R2 ) shl 16
|
||||
call send_sdhc_command
|
||||
; save CID
|
||||
mov ecx, [eax + SDHC_RESP1_0]
|
||||
mov ebx, [eax + SDHC_RESP3_2]
|
||||
mov edx, [eax + SDHC_RESP5_4]
|
||||
mov edi, [eax + SDHC_RESP7_6]
|
||||
mov [esi + SDHCI_CONTROLLER.card_reg_cid], ecx
|
||||
mov [esi + SDHCI_CONTROLLER.card_reg_cid + 4], ebx
|
||||
mov [esi + SDHCI_CONTROLLER.card_reg_cid + 8], edx
|
||||
mov [esi + SDHCI_CONTROLLER.card_reg_cid + 12], edi
|
||||
DEBUGF 1,"SDHCI: resp3=%x resp4=%x \n", [eax + SDHC_RESP5_4], [eax + SDHC_RESP7_6]
|
||||
ret
|
||||
endp
|
||||
;cmd55 = switch to ACMD mode command
|
||||
;resp = R1
|
||||
;args = [31:16]RCA [15:0]stuff bits
|
||||
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> acmd
|
||||
; WARNING!!! <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
proc APP_CMD
|
||||
push ecx edx ebx
|
||||
@@:
|
||||
mov bx, word[esi + SDHCI_CONTROLLER.card_reg_rca]
|
||||
shl ebx, 16
|
||||
mov ecx, 0x00;0x02 ; read mull
|
||||
mov edx, (55 shl 8) + RESP_TYPE.R1;11000b + 11b
|
||||
mov edx, ((55 shl 8) + RESP_TYPE.R1 ) shl 16
|
||||
call send_sdhc_command
|
||||
; <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
cmp dword[eax + SDHC_RESP1_0], 0x120 ; <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> embox, <EFBFBD><EFBFBD><EFBFBD> 1 <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
jnz @b ; <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD> 63(74))
|
||||
; <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> APP_CMD <EFBFBD> READY_FOR_DATA
|
||||
;TODO: <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!!!
|
||||
pop ebx edx ecx
|
||||
ret
|
||||
endp
|
||||
@@ -232,8 +292,7 @@ endp
|
||||
proc SD_SEND_OP_COND
|
||||
call APP_CMD
|
||||
|
||||
mov ecx, 0x00;0x02 ; read mull
|
||||
mov edx, (41 shl 8) + RESP_TYPE.R3
|
||||
mov edx, ((41 shl 8) + RESP_TYPE.R3 ) shl 16
|
||||
call send_sdhc_command
|
||||
mov ecx, [eax + SDHC_RESP1_0]
|
||||
mov [esi + SDHCI_CONTROLLER.card_reg_ocr], ecx
|
||||
@@ -245,8 +304,15 @@ endp
|
||||
;cmd16 -
|
||||
;arg = 0-31 - block Length
|
||||
;resp = R1
|
||||
; IN: ebx - 32bit block length
|
||||
proc SET_BLOCKLEN
|
||||
ret
|
||||
DEBUGF 1,"SDHCI: SET_BLOCKLEN 0x%x\n", ebx
|
||||
mov edx, ((16 shl 8) + RESP_TYPE.R1 ) shl 16
|
||||
call send_sdhc_command
|
||||
mov ecx, [eax + SDHC_RESP1_0]
|
||||
mov [esi + SDHCI_CONTROLLER.card_reg_ocr], ecx
|
||||
test dword[esi + SDHCI_CONTROLLER.int_status],0x8000
|
||||
ret
|
||||
endp
|
||||
; block read
|
||||
|
||||
@@ -279,9 +345,9 @@ proc WRITE_MULTIPLE_BLOCK
|
||||
endp
|
||||
;cmd27 - Programming of the programmable bits of the CSD
|
||||
;resp = R1
|
||||
proc PROGRAM_CSD
|
||||
ret
|
||||
endp
|
||||
;proc PROGRAM_CSD
|
||||
; ret
|
||||
;endp
|
||||
; SDIO mode
|
||||
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> SD memory:
|
||||
; - CID <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
@@ -292,9 +358,7 @@ endp
|
||||
;resp = R4
|
||||
;IN: ebx - argument
|
||||
proc IO_SEND_OP_COND
|
||||
|
||||
mov ecx, 0x00;0x02 ; read mull
|
||||
mov edx, (5 shl 8) + RESP_TYPE.R4;00000b + 10b ;TODO
|
||||
mov edx, ((5 shl 8) + RESP_TYPE.R4 ) shl 16
|
||||
|
||||
call send_sdhc_command
|
||||
mov ecx, [eax + SDHC_RESP1_0]
|
||||
|
180
sdhc_disk.inc
180
sdhc_disk.inc
@@ -1,7 +1,87 @@
|
||||
; Functions for this driver
|
||||
|
||||
proc add_card_disk
|
||||
;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> push/pop <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>:
|
||||
;proc GET_SDSC_SIZE uses ecx edx
|
||||
;proc GET_SDSC_SIZE uses ecx edx, _param1, _param2
|
||||
|
||||
proc GET_SDSC_SIZE
|
||||
; memory capacity = BLOCKNR * BLOCK_LEN ; shl BSF block_len
|
||||
; BLOCKNR = (C_SIZE + 1) * MULT ; shl ecx, BSF (C_SIZE_MULT + 2)
|
||||
; MULT = 2^(C_SIZE_MULT + 2)
|
||||
; BLOCK_LEN = 2^LEN_BL_READ
|
||||
push ecx edx
|
||||
mov ecx, dword[esi + SDHCI_CONTROLLER.card_reg_csd + 4] ; C_SIZE_MULT
|
||||
shr ecx, 7; 39 - 32 = 7
|
||||
and ecx, 111b
|
||||
add ecx, 2
|
||||
|
||||
mov edx, dword[esi + SDHCI_CONTROLLER.card_reg_csd + 6] ; C_SIZE 48/8
|
||||
shr edx, 6 ; 48 + 6
|
||||
and edx, 0xFFF ; data in 12 low bits
|
||||
inc edx
|
||||
shl edx, cl
|
||||
|
||||
movzx ecx, byte[esi + SDHCI_CONTROLLER.card_reg_csd + 9] ; LEN_BL_READ 72/8
|
||||
and ecx, 0x0f
|
||||
shl edx, cl
|
||||
; get sectors = edx / 512 <- sectorsize for kernel
|
||||
shr edx, BSF 512
|
||||
mov dword[esi + SDHCI_CONTROLLER.sector_count], edx
|
||||
mov dword[esi + SDHCI_CONTROLLER.sector_count + 4], 0
|
||||
pop edx ecx
|
||||
ret
|
||||
endp
|
||||
|
||||
proc GET_SDHC_SIZE
|
||||
; 22 bit [40:61]
|
||||
; ((C_SIZE + 1) * 512Kbyte ) / sectorsize
|
||||
push ebx
|
||||
mov ebx, dword[esi + SDHCI_CONTROLLER.card_reg_csd + 5]
|
||||
and ebx, not 0xFFC00000 ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
mov dword[esi + SDHCI_CONTROLLER.sector_count + 4], 0
|
||||
inc edx ; C_SIZE + 1
|
||||
shl ebx, 10 ; *512Kbyte / sectorsize(512)
|
||||
mov dword[esi + SDHCI_CONTROLLER.sector_count], ebx
|
||||
;bt dword[esi + SDHCI_CONTROLLER.card_reg_csd + 4], 29 ; read 22 bit C_SIZE
|
||||
adc dword[esi + SDHCI_CONTROLLER.sector_count + 4], 0
|
||||
pop ebx
|
||||
ret
|
||||
endp
|
||||
|
||||
proc GET_SDUC_SIZE
|
||||
; 28 bit [40:67] 40bit=5*8bit
|
||||
; ((C_SIZE + 1) * 512Kbyte ) / sectorsize
|
||||
push ebx
|
||||
mov ebx, dword[esi + SDHCI_CONTROLLER.card_reg_csd + 5]
|
||||
and ebx, not 0xC0000000 ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
inc edx
|
||||
mov dword[esi + SDHCI_CONTROLLER.sector_count], ebx
|
||||
shr ebx, 31-10 ; get hign LBA addr
|
||||
mov dword[esi + SDHCI_CONTROLLER.card_reg_csd + 4], ebx
|
||||
shl dword[esi + SDHCI_CONTROLLER.sector_count], 10
|
||||
pop ebx
|
||||
ret
|
||||
endp
|
||||
|
||||
proc GET_MMC_SIZE
|
||||
; <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD> <EFBFBD>*<EFBFBD><EFBFBD>
|
||||
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
proc add_card_disk stdcall, hd_name:dword
|
||||
|
||||
invoke DiskAdd, sdhci_callbacks, [hd_name], esi, 0
|
||||
test eax, eax
|
||||
jz .disk_add_fail
|
||||
|
||||
invoke DiskMediaChanged, eax, 1 ; system will scan for partitions on disk
|
||||
|
||||
ret
|
||||
|
||||
.disk_add_fail:
|
||||
DEBUGF 1, "Failed to add disk\n"
|
||||
ret
|
||||
endp
|
||||
proc del_card_disk
|
||||
@@ -10,46 +90,110 @@ proc del_card_disk
|
||||
endp
|
||||
|
||||
; Functions for kernel
|
||||
|
||||
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>/<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
||||
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SD <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
||||
; SDIO <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) <EFBFBD> MMC(eMMC) <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
; <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(17,18,24,25), <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
; <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,
|
||||
; <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SDMA <EFBFBD><EFBFBD><EFBFBD> ADMA2 <EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD>
|
||||
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
proc sdhci_read stdcall pdata: dword, buffer: dword, startsector: qword, numsectors_ptr:dword
|
||||
mov esi, [pdata]
|
||||
mov eax, [esi + SDHCI_CONTROLLER.base_reg_map]
|
||||
|
||||
cmp dword[numsectors_ptr], 1
|
||||
ja .multiple
|
||||
|
||||
; get phys addr
|
||||
mov eax, [buffer]
|
||||
invoke GetPhysAddr
|
||||
|
||||
|
||||
; send CMD 17
|
||||
|
||||
ret
|
||||
.multiple:
|
||||
; get phys addr table
|
||||
|
||||
; send CMD 18
|
||||
|
||||
; send CMD 12
|
||||
|
||||
ret
|
||||
endp
|
||||
proc sdhci_write stdcall pdata: dword, buffer: dword, startsector: qword, numsectors_ptr:dword
|
||||
mov esi, [pdata]
|
||||
mov eax, [esi + SDHCI_CONTROLLER.base_reg_map]
|
||||
|
||||
;call [write_functions + ]
|
||||
cmp dword[numsectors_ptr], 1
|
||||
ja .multiple
|
||||
|
||||
; get phys addr
|
||||
mov eax, [buffer]
|
||||
invoke GetPhysAddr
|
||||
|
||||
; send CMD 24
|
||||
|
||||
ret
|
||||
.multiple:
|
||||
; get phys addr table
|
||||
|
||||
; send CMD 25
|
||||
|
||||
; send CMD 12
|
||||
|
||||
ret
|
||||
endp
|
||||
|
||||
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> DMA <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
read_functions:
|
||||
dd 0 ; no dma
|
||||
dd 0 ; sdma
|
||||
dd 0 ; adma1
|
||||
dd adma2_read_sectors ; adma2
|
||||
write_functions:
|
||||
dd 0 ; no dma
|
||||
dd 0 ; sdma
|
||||
dd 0 ; adma1
|
||||
dd adma2_write_sectors ; adma2
|
||||
struct DISKMEDIAINFO
|
||||
Flags dd ?
|
||||
SectorSize dd ?
|
||||
Capacity dq ?
|
||||
ends
|
||||
|
||||
proc sdhci_querymedia stdcall, pdata, mediainfo
|
||||
push ecx edx
|
||||
mov eax, [mediainfo]
|
||||
mov edx, [pdata]
|
||||
mov [eax + DISKMEDIAINFO.Flags], 0
|
||||
mov [eax + DISKMEDIAINFO.SectorSize], 512
|
||||
mov ecx, dword[edx + SDHCI_CONTROLLER.sector_count]
|
||||
mov dword [eax + DISKMEDIAINFO.Capacity], ecx
|
||||
mov ecx, dword[edx + SDHCI_CONTROLLER.sector_count + 4]
|
||||
mov dword [eax + DISKMEDIAINFO.Capacity + 4], ecx
|
||||
pop edx ecx
|
||||
xor eax, eax
|
||||
ret
|
||||
endp
|
||||
|
||||
; UPD: <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; <EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> int_status
|
||||
; <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> DMA <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
;read_functions:
|
||||
; dd 0 ; no dma
|
||||
; dd 0 ; sdma
|
||||
; dd 0 ; adma1
|
||||
; dd 0 ;adma2_read_sectors ; adma2
|
||||
;write_functions:
|
||||
; dd 0 ; no dma
|
||||
; dd 0 ; sdma
|
||||
; dd 0 ; adma1
|
||||
; dd 0 ;adma2_write_sectors ; adma2
|
||||
;
|
||||
|
||||
align 4
|
||||
sdhci_callbacks:
|
||||
dd sdhci_callbacks.end - sdhci_callbacks
|
||||
dd 0 ; no close function
|
||||
dd 0 ; no closemedia function
|
||||
dd 0;ahci_querymedia
|
||||
dd sdhci_read
|
||||
dd sdhci_write
|
||||
dd sdhci_querymedia ; +
|
||||
dd sdhci_read ; -
|
||||
dd sdhci_write ; -
|
||||
dd 0 ; no flush function
|
||||
dd 0 ; use default cache size
|
||||
.end:
|
||||
|
||||
sdcard_disk_name: db 'sdcard00',0
|
||||
mmccard_disk_name: db 'MMCcard00',0
|
||||
mmccard_disk_name: db 'MMC00',0
|
274
sdhci.asm
274
sdhci.asm
@@ -15,10 +15,6 @@ use32
|
||||
; Driver for SD host controller ;
|
||||
; ;
|
||||
;;; ;;;
|
||||
; <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> sd <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>-<2D><>
|
||||
; <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
DEBUG = 1
|
||||
__DEBUG__ = 1
|
||||
__DEBUG_LEVEL__ = 1 ; 1 = verbose, 2 = errors only
|
||||
@@ -56,7 +52,7 @@ use32
|
||||
;=====
|
||||
; <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>-<2D><> <20><><EFBFBD><EFBFBD>
|
||||
; <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> sdma
|
||||
SDHC_SYS_ADDR = 0x00 ;32bit block Count(SDMA System Address)
|
||||
SDHC_SYS_ADDR = 0x00 ;32bit SDMA System Address
|
||||
;<3B> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 3 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||||
;0-11 Transfer Block Size
|
||||
; <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> CMD17, CMD18, CMD24, CMD25, CMD35.
|
||||
@@ -87,8 +83,6 @@ SDHX_BLK_CS = 0x04
|
||||
_16bit_block_count_register = 0x06 ;word
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> SD <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
SDHC_CMD_ARG = 0x08 ; dword
|
||||
ARGUMENT0 = 0x08 ; word
|
||||
ARGUMENT1 = 0x0A ; word
|
||||
; Transfer Mode Register
|
||||
; <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Data Pressent Select <20> Command <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>), <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
@@ -522,7 +516,6 @@ SDHC_ADMA_ERR = 0x54
|
||||
ADMA_error_status = 0x54 ; byte (using 0-2 bits)
|
||||
|
||||
SDHC_ADMA_SAD = 0x58
|
||||
ADMA_system_addres_register = 0x58 ;qword
|
||||
|
||||
;0x60-0x6f - Preset Value ;spec version 3
|
||||
|
||||
@@ -600,6 +593,8 @@ struct SDHCI_CONTROLLER
|
||||
card_reg_scr rd 2 ; 64 bits
|
||||
card_reg_ssr rd 16 ; 512bit
|
||||
|
||||
sector_count rq 1 ; count rw sectors on SD\SDIO\MMC card
|
||||
|
||||
program_id rd 1 ; tid thread for working with no memory cards
|
||||
|
||||
flag_command_copmlate rd 1 ; flag interrapt command complate 00 - interrapt is geting
|
||||
@@ -608,6 +603,7 @@ struct SDHCI_CONTROLLER
|
||||
rd 4 ; reserved
|
||||
status_control rd 1 ; flags status controller(0x01 - get irq AND int_status good)
|
||||
; status for write\read disk, global flags
|
||||
|
||||
ends
|
||||
|
||||
struct SDHCI_SLOT
|
||||
@@ -867,11 +863,6 @@ proc sdhci_init
|
||||
DEBUGF 1,'400KHz : %u\n', edi
|
||||
|
||||
pop eax
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> TODO: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DMA
|
||||
;mov eax, [esi + SDHCI_CONTROLLER.base_reg_map]
|
||||
or dword[eax + SDHC_INT_MASK], 0x40 or 0x80
|
||||
or word[eax + SDHC_SOG_MASK], 0x40 or 0x80
|
||||
DEBUGF 1,'SDHCI: Set maximum int mask and mask signal\n'
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> Host Control Register
|
||||
; <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
@@ -879,25 +870,23 @@ proc sdhci_init
|
||||
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> host control 2
|
||||
;set 0x2e
|
||||
|
||||
;test
|
||||
mov dword[eax + SDHC_INT_STATUS], 0x00
|
||||
|
||||
; set Wekeup_control
|
||||
or byte[Wekeup_control], 111b
|
||||
|
||||
; save and attach IRQ
|
||||
invoke PciRead8, dword [esi + SDHCI_CONTROLLER.bus], dword [esi + SDHCI_CONTROLLER.dev], PCI_IRQ_LINE ;al=irq
|
||||
;DEBUGF 1,'Attaching to IRQ %x\n',al
|
||||
movzx eax, al
|
||||
|
||||
;invoke PciWrite16, [esi + SDHCI_CONTROLLER.bus], [esi + SDHCI_CONTROLLER.dev], dword 0x82, 0x0000
|
||||
; disable smi ;SD_PCI_MSI_CTRL- RW - 16bits - [SD_PCI_CFG: 82h]
|
||||
|
||||
;attach interrupt
|
||||
mov [esi + SDHCI_CONTROLLER.irq_line], eax ;save irq line
|
||||
invoke AttachIntHandler, eax, sdhc_irq, esi ;esi = pointre to controller
|
||||
invoke AttachIntHandler, eax, sdhc_irq, esi ;esi = pointre to controller struct
|
||||
mov eax, [esi + SDHCI_CONTROLLER.base_reg_map]
|
||||
or dword[eax + SDHC_INT_MASK], 0x40 or 0x80
|
||||
or word[eax + SDHC_SOG_MASK], 0x40 or 0x80
|
||||
DEBUGF 1,'SDHCI: Enable insert and remove interrupt\n'
|
||||
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>
|
||||
mov eax, [esi + SDHCI_CONTROLLER.base_reg_map]
|
||||
;mov eax, [esi + SDHCI_CONTROLLER.base_reg_map]
|
||||
test dword[eax + SDHC_PRSNT_STATE], 0x10000 ; check 16 bit in SDHC_PRSNT_STATE.CARD_INS
|
||||
jz @f
|
||||
call card_detect ; eax - REGISTER MAP esi - SDHCI_CONTROLLER
|
||||
@@ -983,23 +972,15 @@ proc card_init
|
||||
call IO_SEND_OP_COND; 0 - test voltage mask to check SDIO interface, ZF=1-sdio
|
||||
jz .sdio
|
||||
|
||||
; acmd41 voltage window = 0
|
||||
DEBUGF 1,"SDHCI: ACMD41 - get OCR\n"
|
||||
call SD_SEND_OP_COND
|
||||
jnz .mmc ; if error command
|
||||
|
||||
; cmd8 - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
DEBUGF 1,"SDHCI: CMD8 - check SDHC card\n"
|
||||
;DEBUGF 1,"SDHCI: CMD8 - check SDHC card\n"
|
||||
call SEND_IF_COUND
|
||||
mov ebx, 0 ; no set EFLAGS
|
||||
;if card supported 2 spec, acmd41 + set hsp=1
|
||||
jnz @f
|
||||
mov ebx, 1 shl 30 ; set HSP
|
||||
@@:
|
||||
call get_ocr_mask
|
||||
jz .err
|
||||
;DEBUGF 1,"SDHCI: ACMD41 - get OCR\n"
|
||||
mov [esi + SDHCI_CONTROLLER.card_reg_ocr], 1 shl 30 ; set HSP
|
||||
.set_acmd41:
|
||||
; TODO: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> 10<31><30>, <20><><EFBFBD> <20> embox
|
||||
call get_ocr_mask
|
||||
; acmd41 - <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> OCR, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
call SD_SEND_OP_COND
|
||||
jnz .mmc
|
||||
test dword[eax + SDHC_RESP1_0], 0x80000000 ; check 31 bit
|
||||
@@ -1009,10 +990,58 @@ proc card_init
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> irq <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; for all init card : cmd3 - get RCA
|
||||
call SEND_RCA
|
||||
|
||||
;TODO: get CSD register
|
||||
; get CSD register
|
||||
call SEND_CSD
|
||||
|
||||
; send CMD7
|
||||
call SELECT_CARD
|
||||
|
||||
test [esi + SDHCI_CONTROLLER.card_reg_ocr], 0x40000000
|
||||
jnz @f
|
||||
|
||||
;send CMD 16
|
||||
mov ebx, 0x200 ; 512 byte
|
||||
call SET_BLOCKLEN
|
||||
@@:
|
||||
|
||||
; get size device
|
||||
test dword[esi + SDHCI_CONTROLLER.card_reg_csd + 12], 0x400000 ;check version SCD ver2
|
||||
jz @f
|
||||
|
||||
call GET_SDHC_SIZE
|
||||
jmp .end_get_size
|
||||
@@:
|
||||
test dword[esi + SDHCI_CONTROLLER.card_reg_csd + 12], 0x800000 ;check version SCD ver3
|
||||
jz @f
|
||||
|
||||
call GET_SDUC_SIZE
|
||||
jmp .end_get_size
|
||||
@@:
|
||||
test dword[esi + SDHCI_CONTROLLER.card_reg_csd + 12], 0xC00000 ;check version SCD ver3
|
||||
jnz .err ; no get size device
|
||||
|
||||
call GET_SDSC_SIZE
|
||||
|
||||
.end_get_size:
|
||||
DEBUGF 1,"SDHCI: Sectors card = %d:%d\n",[esi + SDHCI_CONTROLLER.sector_count + 4],\
|
||||
[esi + SDHCI_CONTROLLER.sector_count]
|
||||
DEBUGF 1,"SDHCI: TEST1 SDMA - read first sector\n"
|
||||
call TEST_SDMA_R
|
||||
|
||||
DEBUGF 1,"SDHCI: TEST2 SDMA - read first sector\n"
|
||||
call TEST_SDMA_R_MUL
|
||||
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; set 4bit mode else card and controler suppoted it mode.
|
||||
|
||||
; set bus speed mode
|
||||
|
||||
; set new clock. <20><> 50 <20><><EFBFBD>
|
||||
|
||||
|
||||
|
||||
;TODO: get SCR register
|
||||
|
||||
mov ebx, 2
|
||||
ret
|
||||
.sdio:
|
||||
@@ -1028,10 +1057,6 @@ proc card_init
|
||||
|
||||
call SEND_RCA
|
||||
|
||||
;TODO: get CSD register
|
||||
call SEND_CSD
|
||||
;TODO: get SCR register
|
||||
|
||||
mov ebx, 1
|
||||
ret
|
||||
|
||||
@@ -1050,31 +1075,23 @@ endp
|
||||
|
||||
proc thread_card_detect
|
||||
;get event with data
|
||||
invoke Kmalloc, 6*4 ; 6*Dword
|
||||
test eax, eax
|
||||
jz .no_malloc
|
||||
mov edi, eax
|
||||
push edi
|
||||
sub esp, 6*4 ; 6*Dword
|
||||
mov edi, esp
|
||||
invoke GetEvent
|
||||
pop edi
|
||||
mov edi, esp
|
||||
;DEBUGF 1,'SDHCI: Get event code=%x [edi + 4]=%x, [edi + 8]=%x\n', [edi], [edi + 4], [edi + 8]
|
||||
push dword[edi + 4] ; reg map
|
||||
push dword[edi + 8] ;controller struct
|
||||
mov eax, edi
|
||||
invoke Kfree
|
||||
pop esi
|
||||
pop eax
|
||||
mov eax, dword[edi + 4] ; reg map
|
||||
mov esi, dword[edi + 8] ;controller struct
|
||||
|
||||
call card_detect
|
||||
.no_malloc:
|
||||
; destryct thread
|
||||
mov eax, -1
|
||||
int 0x40
|
||||
endp
|
||||
|
||||
proc card_detect
|
||||
;DEBUGF 1,'SDHCI: eax=%x esi=%x\n', eax, esi
|
||||
DEBUGF 1,'SDHCI: Card inserted\n'
|
||||
call card_init ; TODO: get CSD and SRC registers + get SSR register
|
||||
call card_init ; TODO: get SRC registers + get SSR register
|
||||
mov [esi + SDHCI_CONTROLLER.type_card], ebx
|
||||
test ebx, ebx
|
||||
jz .unknowe
|
||||
@@ -1083,7 +1100,10 @@ proc card_detect
|
||||
; <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(SD memory, eMMC, SPI), <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>, else set flag SDIO device
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
.memory_card:
|
||||
call add_card_disk
|
||||
|
||||
|
||||
|
||||
;call add_card_disk
|
||||
DEBUGF 1,'SDHCI: Card init - Memory card\n'
|
||||
ret
|
||||
.SDIO:
|
||||
@@ -1101,7 +1121,7 @@ proc card_detect
|
||||
ret
|
||||
endp
|
||||
|
||||
proc card_destryct
|
||||
proc card_destruct
|
||||
DEBUGF 1,'SDHCI: Card removed\n'
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>
|
||||
test ebx, 110b
|
||||
@@ -1158,19 +1178,23 @@ proc sdhc_irq
|
||||
;DEBUGF 1,"SDHCI: Evend sended, eax=%x uid=%x \n", eax, ebx
|
||||
pop eax
|
||||
pop esi
|
||||
jmp .exit
|
||||
|
||||
.no_card_inserted:
|
||||
test dword[eax + SDHC_INT_STATUS], 0x80
|
||||
jz .no_card_removed
|
||||
|
||||
or dword[eax + SDHC_INT_STATUS], 0x80
|
||||
call card_destryct
|
||||
call card_destruct
|
||||
jmp .exit
|
||||
|
||||
.no_card_removed:
|
||||
|
||||
|
||||
mov ecx, [eax + SDHC_INT_STATUS]
|
||||
mov dword[esi + SDHCI_CONTROLLER.int_status], ecx
|
||||
mov [eax + SDHC_INT_STATUS], ecx ; <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
|
||||
.exit:
|
||||
popa
|
||||
xor eax, eax
|
||||
ret
|
||||
@@ -1206,22 +1230,138 @@ proc get_ocr_mask
|
||||
ret
|
||||
endp
|
||||
|
||||
proc TEST_SDMA_R
|
||||
or dword[eax + SDHC_INT_MASK], 0xFFFFFFFF
|
||||
or dword[eax + SDHC_SOG_MASK], 0xFFFFFFFF
|
||||
and dword[eax + SDHC_CTRL1], not 11000b ; set SDMA mode
|
||||
mov byte[eax + 0x2E], 1110b ; set max
|
||||
mov ebp, eax
|
||||
invoke KernelAlloc, 4096
|
||||
push eax
|
||||
invoke GetPhysAddr ; arg = eax
|
||||
xchg eax, ebp
|
||||
mov dword[eax], ebp;phys addr
|
||||
mov dword[eax + 4], SD_BLOCK_SIZE
|
||||
;(block_count shl) 16 + (sdma_buffer_boundary shl 12) + block_size
|
||||
mov dword[eax + 8], 0 ; arg - num sector
|
||||
mov dword[eax + 0xC], (((17 shl 8) + DATA_PRSNT + RESP_TYPE.R1 ) shl 16) + 010001b
|
||||
@@:
|
||||
cmp dword[esi + SDHCI_CONTROLLER.int_status], 0
|
||||
hlt
|
||||
jz @b
|
||||
DEBUGF 1,"SDHCI: resp1=%x resp2=%x \n", [eax + SDHC_RESP1_0], [eax + SDHC_RESP3_2]
|
||||
.wait_int:
|
||||
mov dword[esi + SDHCI_CONTROLLER.int_status], 0
|
||||
hlt
|
||||
cmp dword[esi + SDHCI_CONTROLLER.int_status], 0
|
||||
jz .wait_int
|
||||
DEBUGF 1,"SDHCI: resp1=%x resp2=%x \n", [eax + SDHC_RESP1_0], [eax + SDHC_RESP3_2]
|
||||
pop ebp
|
||||
test dword[eax + SDHC_RESP1_0], 0x8000
|
||||
jnz @f
|
||||
push eax
|
||||
mov dword[.ptr], ebp
|
||||
mov ebx, .file_struct
|
||||
invoke FS_Service
|
||||
pop eax
|
||||
@@:
|
||||
ret
|
||||
.file_struct:
|
||||
dd 2
|
||||
dd 0
|
||||
dd 0
|
||||
dd 512
|
||||
.ptr: dd 0
|
||||
db '/tmp0/1/dump_first_sector',0
|
||||
|
||||
endp
|
||||
|
||||
; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> SDMA: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DMA <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> 4<><34>
|
||||
proc TEST_SDMA_R_MUL
|
||||
or dword[eax + SDHC_INT_MASK], 0xFFFFFFFF
|
||||
or dword[eax + SDHC_SOG_MASK], 0xFFFFFFFF
|
||||
and dword[eax + SDHC_CTRL1], not 11000b ; set SDMA mode
|
||||
mov byte[eax + 0x2E], 1110b ; set max
|
||||
mov ebp, eax
|
||||
invoke KernelAlloc, 4096*0x800;128;4096*512
|
||||
push eax
|
||||
push eax
|
||||
invoke GetPhysAddr ; arg = eax
|
||||
xchg eax, ebp
|
||||
mov dword[eax], ebp;phys addr
|
||||
mov dword[eax + 4], ((8*0x800) shl 16) + SD_BLOCK_SIZE
|
||||
;(block_count shl) 16 + (sdma_buffer_boundary shl 12) + block_size
|
||||
mov dword[eax + 8], 0;0x2000 ; arg - num sector
|
||||
mov dword[eax + 0xC], (((18 shl 8) + DATA_PRSNT + RESP_TYPE.R1 ) shl 16) + CMD_TYPE.Multiple + 10101b
|
||||
@@:
|
||||
cmp dword[esi + SDHCI_CONTROLLER.int_status], 0
|
||||
hlt
|
||||
jz @b
|
||||
DEBUGF 1,"SDHCI: resp1=%x resp2=%x \n", [eax + SDHC_RESP1_0], [eax + SDHC_RESP3_2]
|
||||
.wait_int:
|
||||
mov dword[esi + SDHCI_CONTROLLER.int_status], 0
|
||||
hlt
|
||||
cmp dword[esi + SDHCI_CONTROLLER.int_status], 0
|
||||
jz .wait_int
|
||||
test dword[esi + SDHCI_CONTROLLER.int_status], 10b
|
||||
jnz @f
|
||||
test dword[esi + SDHCI_CONTROLLER.int_status], 1000b
|
||||
jz @f
|
||||
|
||||
xchg eax, ebp
|
||||
mov eax, dword[esp]
|
||||
add eax, 4096
|
||||
mov dword[esp], eax
|
||||
invoke GetPhysAddr
|
||||
xchg eax, ebp
|
||||
mov dword[eax], ebp;phys addr
|
||||
|
||||
jmp .wait_int
|
||||
|
||||
;DEBUGF 1,"SDHCI: resp1=%x resp2=%x \n", [eax + SDHC_RESP1_0], [eax + SDHC_RESP3_2]
|
||||
@@:
|
||||
pop ebp
|
||||
pop ebp
|
||||
test dword[eax + SDHC_RESP1_0], 0x8000
|
||||
jnz @f
|
||||
push eax
|
||||
mov dword[.ptr], ebp
|
||||
mov ebx, .file_struct
|
||||
invoke FS_Service
|
||||
pop eax
|
||||
@@:
|
||||
ret
|
||||
.file_struct:
|
||||
dd 2
|
||||
dd 0
|
||||
dd 0
|
||||
dd 4096*0x800;128
|
||||
.ptr: dd 0
|
||||
db '/tmp0/1/dump_first_sector_mul',0
|
||||
|
||||
endp
|
||||
|
||||
|
||||
; This function for working drivers and programs worked
|
||||
; with SDIO interface.
|
||||
proc service_proc stdcall, ioctl:dword
|
||||
|
||||
; 0 - get version
|
||||
; 1 - get card count
|
||||
; 2 - get card (hand + info(CID, CSD, RCA, OCR))
|
||||
; 3 - set card width
|
||||
; 4 - set card clock
|
||||
; 5 - set DMA mode
|
||||
; 6 - set card irq hand (for SDIO)
|
||||
; 7 - look access card
|
||||
; 8 - unlook access card
|
||||
; 9 - call card func (for SDIO)
|
||||
; 10 - capturing control controller
|
||||
ret
|
||||
endp
|
||||
|
||||
drv_name: db 'SDHCI',0
|
||||
|
||||
;base_reg_map: dd 0;pointer on base registers comntroller
|
||||
|
||||
;SDMA_sys_addr: dq 0; [base_sdhc_reg]+offset(0x00 or 0x58-0x5f) 32 or 64 bit
|
||||
;pt_call_command: dd 0; noDMA or DMA function
|
||||
|
||||
align 4
|
||||
data fixups
|
||||
end data
|
||||
|
@@ -2,24 +2,60 @@
|
||||
;; SDHC ADMA function
|
||||
|
||||
|
||||
|
||||
proc creat_descripton_table
|
||||
; for ADMA2
|
||||
proc create_adma2_table
|
||||
|
||||
ret
|
||||
endp
|
||||
|
||||
proc destryct_description_table
|
||||
proc destruct_adma2_table
|
||||
|
||||
ret
|
||||
endp
|
||||
|
||||
|
||||
proc adma2_read_sectors
|
||||
; for ADMA1
|
||||
proc create_adma1_table
|
||||
|
||||
ret
|
||||
endp
|
||||
|
||||
proc adma2_write_sectors
|
||||
proc destruct_adma1_table
|
||||
|
||||
ret
|
||||
endp
|
||||
endp
|
||||
|
||||
; for SDMA mode and for creating ADMA tables
|
||||
; ecx = line address
|
||||
; edx = length
|
||||
; OUT: ecx = virtual addr on table phys addrs on blocks in 512 byte
|
||||
|
||||
; WARNING!!! buffer align 9
|
||||
; 4096 = 0..4 sectors + 1022*4 sectors + 0..4 sectors
|
||||
proc create_mem_table
|
||||
|
||||
ret
|
||||
endp
|
||||
|
||||
proc destruct_mem_table
|
||||
|
||||
ret
|
||||
endp
|
||||
|
||||
; SDMA
|
||||
; send command
|
||||
; wait command_complate
|
||||
;@@:
|
||||
; wait DMA int or Transfer compalte
|
||||
; if Transfer complate goto .end
|
||||
; set new addr ; <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
; goto @f
|
||||
;.end:
|
||||
|
||||
; ADMA
|
||||
; creat descrption table
|
||||
; send command
|
||||
; wait command_complate
|
||||
; wait transfer complate or ADMA_Error
|
||||
; destruct description table
|
||||
|
||||
; no DMA
|
Reference in New Issue
Block a user