.. _ip_storage_sdio: SDIO ======================= 简介 --------------- SDIO协议是在SD卡协议基础上发展和升级而来的。在许多地方,SD卡读写协议得以保留。与此同时,SDIO协议在SD卡协议的基础上新增了cmd52和cmd53命令。正因如此,SDIO与SD卡规范之间的一个重要区别在于增加了低速标准。低速卡的目标应用是:以最少的硬件开销支持低速I/O功能。 MMC是多媒体卡(multimedia card)的缩写。本质上,它是一种用于固态非易失性存储的存储卡规范,定义了诸如卡片形状、尺寸、容量、电信号以及主机间通信协议等方面的内容。 自1997年MMC规范发布以来,根据不同考量(物理尺寸、电压范围、引脚数量、最大容量、数据位宽、时钟频率、安全特性、是否支持SPI模式、是否支持DDR模式等),相继衍生出了MMC、SD、microSD、SDIO和EMMC等多种不同规格。尽管这些规格花样繁多,但其本质始终如一,这也是为什么Linux内核将它们统称为MMC的原因。 主要功能 --------------- SD/SDIO、嵌入式多媒体卡(eMMC)主机接口(SDMMC)在内部总线与SD存储卡、SDIO卡和eMMC设备之间提供接口。多媒体卡系统规范可通过多媒体卡协会网站www.jedec.org获取,该规范由MMCA技术委员会发布。SD存储卡和SD I/O卡系统规范可通过SD卡协会网站www.sdcard.org获取。SDMMC的功能包括以下几点: - 符合嵌入式多媒体卡系统规范5.1版。该卡支持三种不同的数据总线模式:1位(默认)、4位和8位(不支持HS400)。 - 与先前版本的多媒体卡完全兼容(向后兼容)。 - 完全符合SD存储卡规范4.2版(不支持SPI模式和UHS-II模式)。 - 完全符合SDIO卡规范4.0版本。该卡支持两种不同的数据总线模式:1位(默认)和4位(不支持SPI模式和UHS-II模式)。 - 支持SDIO从机模式(仅IO模式) 功能描述 --------------- SDIO硬件架构 --------------- .. figure:: /assets/images/sdio_arch.png :alt: sdio_arch :height: 400px :align: center SDIO硬件架构 SDIO适配层描述 --------------- SDMMC适配器是一种多媒体/安全数字存储卡总线主控器,可为MultiMedi-aCard堆栈或安全数字存储卡提供接口。它由以下子单元组成: - 时钟控制单元 - 适配器寄存器块 - 命令/响应路径 - 数据发送/接收路径 - 数据先进先出队列 - 私有DMA控制器 ------------- 时钟控制单元 ------------- 时钟控制单元通过配置分频系数对屏幕进行分频,从而输出系统时钟。输入时钟与SDCLK之间的关系由以下公式给出: Freq_SDCLK = Freq_SDIO / (2*(div + 1)) 其中,div是通过寄存器配置的频率分频系数 ------------- 适配器寄存器 ------------- 适配器寄存器块包含所有系统控制寄存器、SDIO命令与响应寄存器以及数据FIFO。该块还生成来自SDIO清除寄存器相应位的信号,用于清除SDIO适配器中的静态标志位。 -------------- 命令/响应通路 -------------- 命令/响应路径子单元在SDIO_CMD线上传输命令和响应。命令路径由SDIO_CLK时钟驱动,向卡发送命令。响应路径由SDIO_CLK时钟驱动,从卡接收响应。 以下 SDIO 命令格式表是sdio命令格式表 ================== ========= ================== =============== ============ ======== ========= Field Start Bit Transmission Bit Command Index Argument CRC7 End Bit ================== ========= ================== =============== ============ ======== ========= Bit position 47 46 [45:40] [39:8] [7:1] 0 Width (bits) 1 1 6 32 7 1 Value "0" "1" x x x "1" ================== ========= ================== =============== ============ ======== ========= 以下 SDIO响应格式表是sdio响应格式表 ================== ========= ================== =============== ============ ======== ========= Field Start Bit Transmission Bit Command Index Argument CRC7 End Bit ================== ========= ================== =============== ============ ======== ========= Bit position 47 46 [45:40] [39:8] [7:1] 0 Width (bits) 1 1 6 32 7 1 Value "0" "0" x x CRC7 "1" ================== ========= ================== =============== ============ ======== ========= 下图是一个经典的命令序列。以下将详细说明每个序列阶段的功能。 1. 上电阶段:我们可以在发送命令时选择是否经过上电阶段。如果启用此阶段,我们在发送命令时将启动一个时钟空闲状态。该状态将启动sdclk,此时钟的启动时间将由power_up_cnt寄存器进行配置。 2. 主机命令阶段:此阶段为CMD数据发送阶段,包括起始位、传输位、内容、CRC校验和结束位。主机将根据时序协议发送命令内容。 3. 等待响应时间阶段:此阶段是等待设备返回响应所需的时间。此时间可由wait_rsp_cnt寄存器进行配置。 4. 响应阶段:此阶段是设备返回响应的阶段。响应包括起始位、传输位、内容、CRC 和结束位。不过,某些特殊 CMD 类型并非如此定时。我们可以通过调整 rsp_type 寄存器来调整定时。 5. 等待EOT阶段:在响应序列结束时,我们可以通过调整wait_eot_cnt来延长时钟结束时间。在此期间,我们还可以检查设备的忙碌状态。某些命令在结束之后会将数据线Data0拉低,表示设备处于忙碌状态。我们可以在wait_eot_cnt寄存器配置的时间间隔内检测这一忙碌状态。如果超过此时间范围,我们将报告错误。 .. figure:: /assets/images/sdio_cmd_timing.png :alt: sdio_cmd_timing :height: 100px :align: center SDIO命令通道时序 -------------- 数据通路 -------------- .. figure:: /assets/images/sdio_sdr_1bit_timing.png :alt: sdio_sdr_1bit_timing :height: 150px :align: center SDIO 1线SDR模式数据通道时序 .. figure:: /assets/images/sdio_sdr_4bit_timing.png :alt: sdio_sdr_4bit_timing :height: 280px :align: center SDIO 4线SDR模式数据通道时序 .. figure:: /assets/images/sdio_sdr_8bit_timing.png :alt: sdio_sdr_8bit_timing :height: 500px :align: center SDIO 8线SDR模式数据通道时序 在DDR模式下,数据在SDIO的两个沿上进行采样,具体如下: - 在时钟的上升沿,会采样奇数字节。 - 在时钟的下降沿,偶数字节被采样。 - 数据有效载荷大小始终是2字节的倍数。 - 每条数据线计算两个CRC16。奇数位的CRC16在时钟的下降沿进行采样,偶数位的CRC16在时钟的上升沿进行采样。 - 起始位、结束位和空闲条件均为全周期。 - CRC状态/启动确认和忙信号均为完整周期,且仅在时钟的上升沿采样。 .. figure:: /assets/images/sdio_ddr_4bit_timing.png :alt: sdio_sdr_8bit_timing :height: 300px :align: center SDIO 4线DDR模式数据通道时序 .. figure:: /assets/images/sdio_ddr_8bit_timing.png :alt: sdio_ddr_8bit_timing :height: 500px :align: center SDIO 8线DDR模式数据通道时序 如下图所示,这是一个数据读取序列图:发送读取命令后,我们即可开始读取数据线。我们有一段特定的时间来检测读取数据的起始位。这段时间可通过data_timeout_cnt寄存器配置确定。如果超过此时间仍未检测到读取数据的起始位,我们将报告错误。 .. figure:: /assets/images/sdio_read_data_timing.png :alt: sdio_read_data_timing :height: 180px :align: center SDIO 读数据时序 如下图所示为写数据序列图。当命令响应结束时,我们开始发送写数据序列,包括起始位、内容和结束位。写数据序列发送完成后,我们需要等待设备返回CRC状态。在图中,这一阶段显示为等待CRC令牌阶段。在此阶段,我们可通过配置crc_token_cnt寄存器来调整接收CRC状态的时间。如果超过此时间仍未检测到CRC状态,我们将报告相应的错误。在接受到CRC状态后,设备会拉低Data0,表示其处于忙碌状态。我们将在此期间检测忙碌状态,而我们的检测时间同样由data_timeout_cnt寄存器决定。 .. figure:: /assets/images/sdio_write_data_timing.png :alt: sdio_write_data_timing :height: 180px :align: center SDIO 写数据时序 ------------------ SDIO专用DMA控制器 ------------------ SDIO控制器在以传输或接收模式工作时,可借助专用DMA控制器访问内存。也就是说,CPU或SoC上的任何其他主设备会在适当的内存位置准备好所需的数据(或在接收数据场景中准备足够的内存空间)。通过正确配置包括基地址、传输大小等在内的所有其他配置寄存器,再对相应的SDIO控制器的DATA_TX/DATA_RX使能位进行编程,即可启用DMA传输。 总共支持两个通道传输(DATA_TX/DATA_RX),可通过编程SDIO控制器内的相应配置和控制位来实现。为避免单个通道的数据传输持续占用物理总线,这两个通道采用轮询仲裁方案。 SDIO 从机模式说明 ---------------------- 以下是SDIO从机模式的主要特点: - 符合SD物理规范3.00版和SDIO规范4.00版。 - 支持1位和4位SD模式 - 支持SDIO中断功能 - 支持SD模式的所有强制性SDIO命令/响应类型(CMD3、CMD5、CMD7、CMD52、CMD53、CMD11、CMD19) - 命令/响应的CRC7校验/生成 - 用于数据传输的CRC16校验/生成。 - 支持SDR12、SDR25、SDR50和SDR104工作模式 - 使用CMD53以多字节和多块模式进行数据传输 - 支持函数0和函数1 - 仅支持SDIO实现,不支持组合卡功能 - 不支持可选代码存储区(CSA) - 不支持暂停/恢复功能 - 不支持DDR50模式 ------------------------ SDIO 从机模式寄存器描述 ------------------------ 以下是SDIO从机模式所支持的寄存器说明。我们遵循SDIO 3.0协议规范,根据该协议规范,功能0 I/O寄存器被划分为三个区域:CCCR、FBR和CIS。实际上,部分区域并未得到我们的支持。以下将对这些寄存器进行说明。 .. figure:: /assets/images/sdio_csr_mapping.png :alt: sdio_csr_mapping :height: 350px :align: center SDIO Slave模式寄存器映射关系 CCCR、FBR 和 CIS 是 SDIO 协议中规定的通用控制寄存器,用于各功能的控制配置寄存器,以及与卡信息相关的状态寄存器,例如功耗和制造商信息。这些控制或配置寄存器所对应的功能是可选的,其具体含义详见 SDIO 规范。除自定义寄存器外,所有其他寄存器均属于 SDIO 4.0 协议规范定义,其中“/”未实现或未定义。 ========== ======================= ============ ============ ============ ============ ============ ============ ============ ============ Address Register Name Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 ========== ======================= ============ ============ ============ ============ ============ ============ ============ ============ 0x00 CCCR/SDIO Revision SDIO SDIO SDIO SDIO CCCR CCCR CCCR CCCR 0x01 SD Specification Rev / / / / SD SD SD SD 0x02 I/O Enable IOE7 IOE6 IOE5 IOE4 IOE3 IOE2 IOE1 / 0x03 I/O Ready IOR7 IOR6 IOR5 IOR4 IOR3 IOR2 IOR1 IOR0 0x04 Int Enable IEN7 IEN6 IEN5 IEN4 IEN3 IEN2 IEN1 IENM 0x05 Int Pending / / / / / / / / 0x06 I/O Abort / / / / RES AS2 AS1 AS0 0x07 Bus Interface Control / / / / / / Bus Width 1 Bus Width 0 0x08 Card Capability 4BLS LSC E4MI S4MI SBS SRW SMB SDC 0x09-0x0b Common CIS Pointer / / / / / / / / 0x0c Bus Suspend / / / / / / / / 0x0d Function Select / / / / FS3 FS2 FS1 FS0 0x0e Exec Flags / / / / / / / / 0x0f Ready Flags RF7 RF6 RF5 RF4 RF3 RF2 RF1 RF0 0x10-0x11 FN0 Block Size / / / / / / / / 0x12 Power Control / / / / / / / / 0x13 Bus Speed Select / / / / BSS2 BSS1 BSS0/EH SSHS 0x14 UHS-I Support / / / / / / / / 0x15 Driver Strength / / / / / / / / 0x16 Interrupt Extension / / / / / / / / 0x17-0xef RFU / / / / / / / / 0xf0 Status Register / / CFS CCE CIE GRE RXR RXV 0xf1-0xff Reserved for Vendors / / / / / / / / ========== ======================= ============ ============ ============ ============ ============ ============ ============ ============ 需要单独说明。我们为从控制器定制了一个状态寄存器,该寄存器位于CCCR的0xf0地址。下面,我们将分别说明该寄存器的各位字段。 ==================== ======== ===== ================================================================== Register Name Field Type Description ==================== ======== ===== ================================================================== Status Register [7:6] / 保留字段(Reserved),未定义用途 Status Register 5 RW FIFO 清除控制位:写 1 可清除从控制器的缓存缓冲区;写 0 无作用 Status Register 4 RO CRC 校验错误标志:'0' = 无错误,'1' = 上一条命令 CRC 校验失败 Status Register 3 RO 非法命令错误标志:'0' = 无错误,'1' = 当前卡状态下命令非法 Status Register 2 RO 通用或未知错误标志:'0' = 无错误,'1' = 操作过程中发生未知错误 Status Register 1 RO RX FIFO 就绪状态位:'1' = FIFO 中有数据可读 Status Register 0 RO RX FIFO 有效状态位:'1' = FIFO 数据有效 ==================== ======== ===== ================================================================== ------------------------ 数据包的收发过程 ------------------------ - 从从机向主机发送数据包 数据包的发送由从机发起,并通过中断通知主机(有关中断实现,请参阅SDIO协议)。主机从从机读取相关信息,并启动SDIO总线传输。整个过程如下所示。我们可以通过两种方式填充数据:一种是通过主机发送命令,远程访问从机内部的DMA配置寄存器,并激活从机端的DMA以填充数据;另一种方式是在从机端通过CPU配置DMA,然后通过DMA填充数据。 首先,我们来介绍通过主机进行远程访问以处理数据的第1种方法。 - 1 主机初始化卡片。(参见SDIO 4.0协议) - 2 主机通过发送CMD52,将CMD52功能号字段配置为功能1。我们在功能1区域定义了一个空间,该空间可映射从机侧的DMA配置寄存器。通过此空间,我们可以访问用于启动从机侧DMA的相关寄存器。该寄存器空间的映射关系如下图所示。 .. figure:: /assets/images/sdio_slave_dma_reg.png :alt: sdio_slave_dma_reg :height: 800px :align: center SDIO Slave模式DMA寄存器映射关系 - 3 通过步骤2中的操作将数据移至从机端的缓冲区。当缓冲区中有数据时,从机会向主机发起中断通知,并发出读取命令以执行读取操作。 - 4 主机接收到从机产生的中断,通过查询开关状态,可以确定是继续进行两者操作还是仅执行写操作。 - 5 主机配置读取数据相关信息。 - 6 主机发送读取命令CMD53,等待读取结束标志。 接下来,我们将介绍通过从机端的CPU配置DMA的第二种方法。与第一种方法不同,这种准备过程由从机发起,因此需要确保系统层具备相应的机制,以保证主机能够协同工作。 - 1 在从机端配置带DMA的CPU,并用它将主机所需的数据移动到数据缓冲区。 - 2 主机初始化卡片。(参见SDIO 4.0协议)。 - 3 通过步骤1中的操作将数据移至从端的缓冲区。当缓冲区有数据时,从端将向主机发起中断通知,并发出读取命令以执行读取操作。 - 4 主机接收到从机产生的中断,通过查询开关状态,可以确定是继续进行两者操作还是仅执行写操作。 - 5 主机配置读取数据相关信息。 - 6 主机发送读取命令CMD53,等待读取结束标志。 - 从主机向从机发送数据包 数据包的发送由从机发起,并通过中断通知主机(有关中断实现,请参阅SDIO协议)。主机从从机读取相关信息,并启动SDIO总线传输。整个过程如下所示。我们可以通过两种方式填充数据:一种是通过主机发送命令,远程访问从机内部的DMA配置寄存器,并激活从机端的DMA进行数据填充;另一种方式是在从机端通过CPU配置DMA,然后通过DMA完成数据填充。 首先,让我们来介绍通过主机进行远程访问以处理数据的第一种方法处理 - 1 主机初始化卡片。(参见SDIO 4.0协议) - 2 主机通过发送CMD52,将CMD52功能号字段配置为功能1。我们在功能1区域定义了一个空间,该空间可映射从机侧的DMA配置寄存器。通过此空间,我们可以访问用于启动从机侧DMA的相关寄存器。该寄存器空间的映射关系与读操作相同。 - 3 通过步骤2中的配置,从设备现在有了接收数据的空间,并且从设备将为写操作向主机发起中断通知。 - 4 主机接收到从机产生的中断,通过查询开关状态,可以确定是继续进行两者操作还是仅执行写操作。 - 5 主机配置写入数据相关信息。 - 6 主机发送写入命令CMD53,等待写入结束标志。 接下来,我们将介绍通过从机端的CPU配置DMA的第二种方法。与第一种方法不同,这种准备过程由从机发起,因此需要确保系统层具备相应的机制,以保证主机能够协同工作。 - 1 在从机端配置带DMA的CPU,DMA可释放缓冲区空间,从机通过中断请求将数据写入主机。 - 2 主机初始化卡片。(参见SDIO 4.0协议)。 - 3 主机接收到从机产生的中断,通过查询开关状态,可以确定是继续进行两者操作还是仅执行写操作。 - 4 主机配置写入数据相关信息。 - 5 主机发送写入命令CMD53,等待写入结束标志。 寄存器 --------------- - 寄存器及其对应偏移量 ===================== ========================= =============================================================================================================== Offset Register Name Function Description ===================== ========================= =============================================================================================================== 0x0 SDIO_RX_SADDR uDMA RX SDIO 缓冲区基地址寄存器:若 DMA 处于链表模式,则首次配置此寄存器;之后 DMA 将从其自身的链表地址读取信息 0x4 SDIO_RX_SIZE uDMA RX SDIO 缓冲区大小配置寄存器:若 DMA 处于链表模式,则首次配置此寄存器;之后 DMA 将从其自身的链表地址读取信息 0x8 SDIO_RX_CFG uDMA RX SDIO 流配置寄存器:若 DMA 处于链表模式,则首次配置此寄存器;之后 DMA 将从其自身的链表地址读取信息。链表模式不支持连续传输 0xC SDIO_CR SDIO 控制寄存器 0x10 SDIO_TX_SADDR uDMA TX SDIO 缓冲区基地址配置寄存器:若 DMA 处于链表模式,则首次配置此寄存器;之后 DMA 将从其自身的链表地址读取信息 0x14 SDIO_TX_SIZE uDMA TX SDIO 缓冲区大小配置寄存器:若 DMA 处于链表模式,则首次配置此寄存器;之后 DMA 将从其自身的链表地址读取信息 0x18 SDIO_TX_CFG uDMA TX SDIO 流配置寄存器:若 DMA 处于链表模式,则首次配置此寄存器;之后 DMA 将从其自身的链表地址读取信息。链表模式不支持连续传输 0x1C SDIO_VERSION SDIO 版本号:1.5.0 0x20 SDIO_CMD_OP SDIO 命令操作寄存器 0x24 SDIO_CMD_ARG SDIO 命令参数寄存器 0x28 SDIO_DATA_SETUP SDIO 数据传输设置寄存器 0x2C SDIO_START SDIO 启动命令寄存器 0x30 SDIO_RSP0 SDIO 响应 0 0x34 SDIO_RSP1 SDIO 响应 1 0x38 SDIO_RSP2 SDIO 响应 2 0x3C SDIO_RSP3 SDIO 响应 3 0x40 SDIO_CLK_DIV SDIO 时钟分频寄存器 0x44 SDIO_STATUS SDIO 状态寄存器 0x48 SDIO_STOP_CMD_OP SDIO STOP 命令操作寄存器 0x4C SDIO_STOP_CMD_ARG SDIO STOP 命令参数寄存器 0x50 SDIO_DATA_TIMEOUT_CNT SDIO 数据超时延迟计数寄存器 0x54 SDIO_CMD_POWERUP_CNT SDIO 命令上电延迟计数寄存器 0x58 SDIO_CMD_WAIT_RSP_CNT SDIO 等待响应计数配置寄存器 0x5C SDIO_CMD_WAIT_EOT_CNT SDIO 等待结束计数配置寄存器 0x60 SDIO_TX_DATA SDIO 发送数据寄存器 0x64 SDIO_RX_DATA SDIO 接收数据寄存器 0x68 SDIO_TX_MARK SDIO 发送 FIFO 水位标记 0x6C SDIO_RX_MARK SDIO 接收 FIFO 水位标记 0x70 SDIO_IP SDIO 中断挂起标志 0x74 SDIO_IE SDIO 中断使能寄存器 0x78 SDIO_SAMPLE_DDR SDIO DDR 采样选择寄存器 0x84 SDIO_DATA_TX_DELAY_CNT SDIO 发送数据延迟计数寄存器 0x88 SDIO_DATA_CRC_TOKEN_CNT SDIO CRC 标记超时延迟计数寄存器 0x8C SDIO_CRC_VALUE SDIO 命令 CRC 值 0x90 SDIO_STATUS1 SDIO 状态 1 寄存器 0x94 SDIO_STOP SDIO 停止命令寄存器 0x98 SDIO_PAD_CTRL SDIO 引脚上拉控制寄存器 0xA0 SDIO_STOP_RSP0 SDIO Stop 响应 0 0xA4 SDIO_STOP_RSP1 SDIO Stop 响应 1 0xA8 SDIO_STOP_RSP2 SDIO Stop 响应 2 0xAC SDIO_STOP_RSP3 SDIO Stop 响应 3 0x1000 DMA_CFG_PCTRL 时钟门控寄存器(仅当外设在 RTL 层启用时存在) 0x1004 DMA_CFG_EVENT 事件 ID 寄存器(仅当外设在 RTL 层支持时存在) 0xC00 DMA_PCH0_IRQ_EN P2M Channel0 中断使能寄存器 0xC04 DMA_PCH0_IRQ_STAT P2M Channel0 中断状态标志寄存器 0xC08 DMA_PCH0_IRQ_CLR P2M Channel0 中断清除寄存器 0xE00 DMA_PCH0_CFG_RX_LLA_REG P2M Channel0 RX LLA 配置寄存器 0xF00 DMA_PCH0_CFG_TX_LLA_REG P2M Channel0 TX LLA 配置寄存器 ===================== ========================= =============================================================================================================== - SDIO_RX_SADDR Address offset: 0x0. ================== ======== ========= =========== ===================================================================== Field Bit Access Reset Value Description ================== ======== ========= =========== ===================================================================== rx_saddr 31:0 RW 0 uDMA RX SDIO 缓冲区基地址 ================== ======== ========= =========== ===================================================================== - SDIO_RX_SIZE Address offset: 0x4. ================== ======== ========= =========== ======================================================================== Field Bit Access Reset Value Description ================== ======== ========= =========== ======================================================================== rx_size 19:0 RW 0 uDMA RX SDIO 请求的数据空间大小(单位:字节) Reserved 31:20 / 0x0 保留位 ================== ======== ========= =========== ======================================================================== - SDIO_RX_CFG Address offset: 0x8. ================== ======== ========= =========== ============================================================================================================================= Field Bit Access Reset Value Description ================== ======== ========= =========== ============================================================================================================================= rx_continuous 0 RW 0 RX 通道连续模式控制位: - '0':禁用连续模式 - '1':启用连续模式 rx_datasize 2:1 RW 2 通道传输大小,用于递增 uDMA 缓冲区地址指针: - '00':字节(8 bits) - '01':半字(16 bits) - '10':字(32 bits)(默认) - '11':保留 Reserved 3 / 0x0 保留位 rx_en 4 RW 0 RX 通道使能和启动传输控制位: - '0':禁用 - '1':使能并启动传输 Reserved 5 / 0x0 保留位 rx_clr 6 W1C 0 RX 通道清除和停止传输控制位: - '0':禁用 - '1':停止并清除当前传输 注意:清除操作不会立即执行,需等待 TXEN 拉低后才生效 Reserved 4:7 / 0x0 保留位 rx_pending 5 RO 0 RX 传输队列挂起状态标志: - '0':无挂起,队列中无待传输任务 - '1':有挂起,队列中有待传输任务 Reserved 31:6 / 0x0 保留位 ================== ======== ========= =========== ============================================================================================================================= - SDIO_CR Address offset: 0xC. ======================= ======== ======== ============== ============================================================================================================ Field Bit Access Reset Value Description ======================= ======== ======== ============== ============================================================================================================ dma_en 0 RW 0 uDMA 模式使能: - '0':禁用 - '1':启用 ddr_en 1 RW 0 双数据速率(DDR)模式使能: - '0':禁用 - '1':启用 auto_cmd12_en 2 RW 0 自动发送 CMD12 命令使能: - '0':关闭自动发送 CMD12 模式 - '1':开启自动发送 CMD12 模式 block_en 3 RW 1 块数量配置使能位: - '0':忽略 block_num 配置,进入无限发送/接收状态,直到发送 CMD12 才停止 - '1':由 block_num 决定 SDIO 控制器发送的块数量 Reserved 4 / 0x0 保留位 clk_stop 5 RW 1 若该位域置位,每次传输完成后 SD 卡时钟将停止: - '0':始终打开 SDCLK - '1':停止 SDCLK high_width_mode 6 RW 1 高带宽模式使能: - '0':禁用 - '1':启用,此时数据以 4 字节对齐方式传输,若未对齐则只传输有效字节 data_crc_check_en 7 RW 1 数据 CRC 校验使能: - '0':禁用 - '1':启用 data_bus_speed 8 RW 0 数据总线速度选择: - '0':禁用 - '1':启用 irq_period_check 9 RW 0 中断周期检查使能: - '0':禁用 - '1':启用 stream_mode 10 RW 0 eMMC 流模式使能: - '0':禁用 - '1':启用 sleep_mode 11 RW 0 睡眠模式使能 Reserved 17:12 / 0x0 保留位 boot_mode 19:18 RW 0 SDIO 引导模式使能: - '00':非引导模式 - '01':正常引导模式 - '10':待机引导模式 voltage_switch_mode 20 RW 0 SDIO 电压切换模式使能: - '0':非电压切换模式 - '1':电压切换模式 reset_mode 22:21 RW 0 复位模式控制: - '00':复位后禁用 SDIO,时钟停止,SDIO_DATA[7:0]、SDIO_CMD 为高阻态,SDIO_CLK 为低电平; 写入 00 后电源关闭:SDIO 禁用,时钟停止,SDIO_DATA[7:0]、SDIO_CMD 和 SDIO_CLK 均为高电平。 - '01':保留(写入 01 时 PWRCTRL 值不变) - '10':上电复位:卡被时钟驱动,但 SDIO 仍禁用;74 个 SDIO_CLK 周期后 SDIO 启用,后续操作按 SDIO 协议执行; 再次写入将被忽略,PWRCTRL 值保持为 '11' - '11':上电启动:卡被时钟驱动,SDIO 启用,SDIO_DATA[7:0]、SDIO_CMD、SDIO_CLK 被控制进行 SDIO 操作 voltage_switch_start 23 RW 0 电压切换开始标志 boot_ack_req 24 RW 0 引导应答请求 read_wait_req 25 RW 0 读等待请求 boot_data_req 26 RW 1 引导数据请求 Reserved 27 / 0x0 保留位 voltage_sdclk_resume 31:28 RW 7 电压切换后 SDCLK 恢复计数器(用于切换结束) ======================= ======== ======== ============== ============================================================================================================ - SDIO_TX_SADDR Address offset: 0x10. ===================== ======== ======== ============== ============================================================= Field Bit Access Reset Value Description ===================== ======== ======== ============== ============================================================= tx_saddr 31:0 RW 0 uDMA TX SDIO 缓冲区基地址 ===================== ======== ======== ============== ============================================================= - SDIO_TX_SIZE Address offset: 0x14. ===================== ======== ======== ============== ===================================================================== Field Bit Access Reset Value Description ===================== ======== ======== ============== ===================================================================== tx_size 19:0 RW 0 uDMA TX SDIO 请求的数据空间大小(单位:字节) Reserved 31:20 / 0x0 保留位 ===================== ======== ======== ============== ===================================================================== - SDIO_TX_CFG Address offset: 0x18. ================== ======== ======== ============== ==================================================================================================================== Field Bit Access Reset Value Description ================== ======== ======== ============== ==================================================================================================================== tx_continuous 0 RW 0 TX 通道连续模式位域: - '0':禁用 - '1':启用 tx_datasize 2:1 RW 2 用于递增 uDMA 缓冲区地址指针的通道传输大小: - '00':字节(8 位) - '01':半字(16 位) - '10':字(32 位)(默认) - '11':保留 Reserved 3 / 0x0 保留位 tx_en 4 RW 0 TX 通道使能并启动传输位域: - '0':禁用 - '1':使能并启动传输 Reserved 5 / 0x0 保留位 tx_clr 6 W1C 0 TX 通道清除并停止传输位域: - '0':禁用 - '1':停止并清除正在进行的传输 注意:清除操作不会立即执行,需等待 TXEN 拉低后才完成 Reserved 4:7 / 0x0 保留位 tx_pending 5 RO 0 TX 传输队列挂起状态标志: - '0':无挂起 —— 队列中无待处理传输 - '1':有挂起 —— 队列中有待处理传输 Reserved 31:6 / 0x0 保留位 ================== ======== ======== ============== ==================================================================================================================== - SDIO_VERSION Address offset: 0x1C. ===================== ======== ======== ============== =============================================================== Field Bit Access Reset Value Description ===================== ======== ======== ============== =============================================================== sdio_version 31:0 RO 0x00010500 SDIO 版本号 1.5.0 ===================== ======== ======== ============== =============================================================== - SDIO_CMD_OP Address offset: 0x20. ===================== ======== ======== ============== ===================================================================== Field Bit Access Reset Value Description ===================== ======== ======== ============== ===================================================================== type_no_rsp 0 RW 0 是否接收响应: - '0':不接收响应 - '1':接收 48 位响应(默认) type_136bit 1 RW 0 接收响应长度选择: - '0':接收 48 位响应 - '1':接收 136 位响应 type_crc 2 RW 0 是否启用 CRC 校验: - '0':关闭 CRC 校验 - '1':开启 CRC 校验 type_busy 3 RW 0 是否启用 r1 命令类型的 busy 检查: - '0':关闭 - '1':开启 type_power_up 4 RW 0 是否在初始化时启用上电: - '0':关闭 - '1':开启 type_crc_check_err 5 RW 0 是否启用 CRC 错误检查: - '0':关闭 - '1':开启 type_stop_cmd 6 RW 0 是否发送停止命令: - '0':不发送停止命令 - '1':发送停止命令 type_cmd_enable 7 RW 1 是否发送命令: - '0':不发送命令 - '1':发送命令 cmd_op 13:8 RW 0 命令索引(command index) Reserved 31:14 / 0x0 保留位 ===================== ======== ======== ============== ===================================================================== - SDIO_CMD_ARG Address offset: 0x24. ===================== ======== ======== ============== ===================================================================== Field Bit Access Reset Value Description ===================== ======== ======== ============== ===================================================================== cmd_arg 31:0 RW 0 SD/MMC 命令参数: 对应 SD 或 MMC 规范中命令格式的第 39-8 位 ===================== ======== ======== ============== ===================================================================== - SDIO_DATA_SETUP Address offset: 0x28. ===================== ======== ======== ============== ===================================================================== Field Bit Access Reset Value Description ===================== ======== ======== ============== ===================================================================== data_en 0 RW 0 SDIO 数据通道使能: - '0':关闭 - '1':开启 data_rwn 1 RW 0 SDIO 读/写使能: - '0':写使能 - '1':读使能 data_mode 3:2 RW 0 数据模式选择: - '00':单线模式(One wire mode) - '01':四线模式(Four wire mode) - '10':八线模式(Eight wire mode) block_num 19:4 RW 0 SDIO 块数量字段,表示实际块数减 1: block_num = 实际块数 - 1 block_size 31:20 RW 0 每个 SDIO 块的大小(字节): 值范围为 3~1023,实际块大小 = block_size + 1(字节) ===================== ======== ======== ============== ===================================================================== - SDIO_START Address offset: 0x2C. ===================== ======== ======== ============== ============================================================= Field Bit Access Reset Value Description ===================== ======== ======== ============== ============================================================= start 0 W1C 0 启动传输:写 '1' 生成脉冲并自动复位 Reserved 31:1 / 0x0 保留位 ===================== ======== ======== ============== ============================================================= - SDIO_RSP0 Address offset: 0x30. ===================== ======== ======== ============== ===================================================================== Field Bit Access Reset Value Description ===================== ======== ======== ============== ===================================================================== rsp0 31:0 RO 0 命令响应 0: 请参考命令响应 3(cmd_rsp3)以了解 SD 总线命令响应到该寄存器的映射关系 ===================== ======== ======== ============== ===================================================================== - SDIO_RSP1 Address offset: 0x34. ===================== ======== ======== ============== ===================================================================== Field Bit Access Reset Value Description ===================== ======== ======== ============== ===================================================================== rsp1 31:0 RO 0 命令响应 1: 请参考命令响应 3(cmd_rsp3)以了解 SD 总线命令响应到该寄存器的映射关系 ===================== ======== ======== ============== ===================================================================== - SDIO_RSP2 Address offset: 0x38. ===================== ======== ======== ============== ===================================================================== Field Bit Access Reset Value Description ===================== ======== ======== ============== ===================================================================== rsp2 31:0 RO 0 命令响应 2: 请参考命令响应 3(cmd_rsp3)以了解 SD 总线命令响应到该寄存器的映射关系 ===================== ======== ======== ============== ===================================================================== - SDIO_RSP3 Address offset: 0x3C. ===================== ======== ======== ============== ===================================================================== Field Bit Access Reset Value Description ===================== ======== ======== ============== ===================================================================== rsp3 31:0 RO 0 命令响应 3: 请参考命令响应 3(cmd_rsp3)以了解 SD 总线命令响应到该寄存器的映射关系 ===================== ======== ======== ============== ===================================================================== - SDIO_CLK_DIV Address offset: 0x40. ===================== ======== ======== ============== ===================================================================== Field Bit Access Reset Value Description ===================== ======== ======== ============== ===================================================================== div 31:0 RW 0 串行时钟分频系数: wide_sdclk = clk / (2 * (div + 1)) ===================== ======== ======== ============== ===================================================================== - SDIO_STATUS Address offset: 0x44. ======================== ======== ======== ============== ===================================================================== Field Bit Access Reset Value Description ======================== ======== ======== ============== ===================================================================== eot 0 W1C 0 传输结束标志:写 '1' 清除为 '0' error 1 W1C 0 传输错误标志:写 '1' 清除为 '0' txudr_err 2 W1C 0 发送缓冲区下溢错误标志:写 '1' 清除为 '0' txovf_err 3 W1C 0 发送缓冲区上溢错误标志:写 '1' 清除为 '0' rxudr_err 4 W1C 0 接收缓冲区下溢错误标志:写 '1' 清除为 '0' rxovf_err 5 W1C 0 接收缓冲区上溢错误标志:写 '1' 清除为 '0' busy 6 RO 0 SDIO 忙标志 clear_fifo_star 7 W1C 0 SDIO 清除 FIFO irq_check 8 W1C 0 SDIO 中断检查 block_done 9 W1C 0 SDIO 块传输完成标志 busy0_end 10 W1C 0 SDIO 睡眠模式完成标志 voltage_switch_pass 11 W1C 0 SDIO 电压切换成功标志 voltage_switch_fail 12 W1C 0 SDIO 电压切换失败标志 boot_ack_pass 13 W1C 0 SDIO 引导应答成功标志 boot_ack_fail 14 W1C 0 SDIO 引导应答失败标志 clk_stop 15 RO 1 SDIO 时钟停止标志 cmd_err_status 21:16 RO 0 命令传输错误状态: - '00000':无错误 - '00001':响应超时 - '00010':响应方向错误 - '00011':响应忙超时 - '00100':响应 CRC 校验错误 voltage_switch_end 22 W1C 0 SDIO 电压切换结束标志 Reserved 23 / 0x0 保留位 data_err_status 29:24 RO 0 数据传输错误状态: - '00000':无错误 - '00001':响应超时 - '00010':响应忙超时 - '00011':TX CRC 超时 - '00100':响应 CRC 校验错误 data_runing 30 RO 0 数据通道工作状态: - '0':数据通道未工作 - '1':数据通道正在工作 slave_ready 31 RW 1 SDIO 从设备就绪标志 ======================== ======== ======== ============== ===================================================================== - SDIO_STOP_CMD_OP Address offset: 0x48. ==================== ======== ======== ============== ===================================================================== Field Bit Access Reset Value Description ==================== ======== ======== ============== ===================================================================== type_no_rsp 0 RW 0 是否接收响应: - '0':不接收响应 - '1':接收 48 位响应(默认) type_136bit 1 RW 0 接收响应长度选择: - '0':接收 48 位响应 - '1':接收 136 位响应 type_crc 2 RW 0 是否启用 CRC 校验: - '0':关闭 CRC 校验 - '1':开启 CRC 校验 type_busy 3 RW 0 是否启用忙检查(针对 r1b 命令类型): - '0':关闭 - '1':开启 type_power_up 4 RW 0 是否在初始化时启用上电: - '0':关闭 - '1':开启 type_crc_check_err 5 RW 0 是否启用 CRC 错误检查: - '0':关闭 - '1':开启 Reserved 7:6 / 0x0 保留位 cmd_op 13:8 RW 0 命令索引(command index) Reserved 31:14 / 0x0 保留位 ==================== ======== ======== ============== ===================================================================== - SDIO_STOP_CMD_ARG Address offset: 0x4C. ================== ======== ======== ============== ============================================= Field Bit Access Reset Value Description ================== ======== ======== ============== ============================================= cmd_arg 31:0 RW 0 SDIO STOP command arg ================== ======== ======== ============== ============================================= - SDIO_DATA_TIMEOUT_CNT Address offset: 0x50. ======================== ======== ======== ============== ========================================================================================================= Field Bit Access Reset Value Description ======================== ======== ======== ============== ========================================================================================================= data_timeout_cnt 31:0 RW 2047 当数据线读取数据时,如果主机未在配置的 data_time_out 寄存器指定的时间范围内等待起始位标志,则会产生一个 Pace Time Out; 当数据线写入数据结束时,如果主机超出了配置的 data_time_out 寄存器的时间范围,并且数据线处于忙状态,则主机将报告 Rescue Busy Timeout ======================== ======== ======== ============== ========================================================================================================= - SDIO_CMD_POWERUP_CNT Address offset: 0x54. ======================== ======== ======== ============== ======================================================================================================== Field Bit Access Reset Value Description ======================== ======== ======== ============== ======================================================================================================== cmd_powerup_cnt 31:0 RW 73 在发送命令之前,可以配置一个上电时间;经过此寄存器配置的时钟数量后,命令开始发送 ======================== ======== ======== ============== ======================================================================================================== - SDIO_CMD_WAIT_RSP_CNT Address offset: 0x58. ======================== ======== ======== ============== ============================================================ Field Bit Access Reset Value Description ======================== ======== ======== ============== ============================================================ cmd_wait_rsp_cnt 31:0 RW 100 SDIO 等待响应计数器配置 ======================== ======== ======== ============== ============================================================ - SDIO_CMD_WAIT_EOT_CNT Address offset: 0x5C. ======================== ======== ======== ============== ============================================================ Field Bit Access Reset Value Description ======================== ======== ======== ============== ============================================================ cmd_wait_eot_cnt 31:0 RW 16 SDIO 等待结束计数器配置 ======================== ======== ======== ============== ============================================================ - SDIO_TX_DATA Address offset: 0x60. ================== ======== ======== ============== ========================== Field Bit Access Reset Value Description ================== ======== ======== ============== ========================== tx_data 31:0 WO 0 SDIO 发送数据 ================== ======== ======== ============== ========================== - SDIO_RX_DATA Address offset: 0x64. ================== ======== ======== ============== ========================== Field Bit Access Reset Value Description ================== ======== ======== ============== ========================== rx_data 31:0 RO 0 SDIO 接收数据 ================== ======== ======== ============== ========================== - SDIO_TX_MARK Address offset: 0x68. ================== ======== ======== ============== ======================================================================================================================= Field Bit Access Reset Value Description ================== ======== ======== ============== ======================================================================================================================= tx_mark 5:0 RW 0 发送水印。当 Txmark > tx_fifo_num 且中断使能时,会生成 TX 中断。 NOTE:该寄存器宽度随 FIFO 深度变化,文档以 FIFO 深度为 8 为例 Reserved 31:6 / 0x0 / ================== ======== ======== ============== ======================================================================================================================= - SDIO_RX_MARK Address offset: 0x6C. ================== ======== ======== ============== ======================================================================================================================= Field Bit Access Reset Value Description ================== ======== ======== ============== ======================================================================================================================= rx_mark 5:0 RW 0 接收水印。当 Rxmark < rx_fifo 且中断使能时,会生成 RX 中断。 NOTE:该寄存器宽度随 FIFO 深度变化,文档以 FIFO 深度为 8 为例 Reserved 31:6 / 0x0 / ================== ======== ======== ============== ======================================================================================================================= - SDIO_IP Address offset: 0x70. ================== ======== ======== ============== ============================================================= Field Bit Access Reset Value Description ================== ======== ======== ============== ============================================================= tx_irq 0 RO 0 发送水印使能 rx_irq 1 RO 0 接收水印使能 rx_empty 2 RO 1 接收 FIFO 为空 tx_full 3 RO 0 发送 FIFO 已满 tx_empty 4 RO 1 发送 FIFO 为空 rx_full 5 RO 0 接收 FIFO 已满 Reserved 31:6 / 0x0 / ================== ======== ======== ============== ============================================================= - SDIO_IE Address offset: 0x74. ======================= ======== ======== ============== ======================================================================================================= Field Bit Access Reset Value Description ======================= ======== ======== ============== ======================================================================================================= tx_irq_en 0 RW 0 发送水印中断使能 rx_irq_en 1 RW 0 接收水印中断使能 eot_irq_en 2 RW 0 结束中断使能 err_irq_en 3 RW 0 错误中断使能 txudr_err_en 4 RW 0 TX underflow 错误中断使能 txovf_err_en 5 RW 0 TX overflow 错误中断使能 rxudr_err_en 6 RW 0 RX underflow 错误中断使能 rxovf_err_en 7 RW 0 RX overflow 错误中断使能 irq_check_en 8 RW 0 SDIO 检查中断使能 block_done_en 9 RW 0 SDIO 块完成中断使能 busy0_end_en 10 RW 0 SDIO CMD5 完成中断使能 volt_age_switch_pass_en 11 RW 0 SDIO 电压切换成功中断使能 volt_age_switch_fail_en 12 RW 0 SDIO 电压切换失败中断使能 boot_ack_pass_en 13 RW 0 SDIO 引导应答成功中断使能 boot_ack_fail_en 14 RW 0 SDIO 引导应答失败中断使能 Reserved 31:15 / 0x0 / ======================= ======== ======== ============== ======================================================================================================= - SDIO_SAMPLE_DDR Address offset: 0x78. ================== ======== ======== ============== ========================================================= Field Bit Access Reset Value Description ================== ======== ======== ============== ========================================================= ddr_delay 31:0 RW 0 该位域表示延迟采样值。延迟单位为系统时钟的一半(sample_ddr < 2 * DIV) ================== ======== ======== ============== ========================================================= - SDIO_DATA_TX_DELAY_CNT Address offset: 0x84. ========================== ======== ======== ============== ================================================================================================================== Field Bit Access Reset Value Description ========================== ======== ======== ============== ================================================================================================================== data_tx_delay_cnt 31:0 RW 7 对于单个块,传输结束后的延迟时间由该寄存器配置;多个块之间发送的延迟时间也由该寄存器配置 ========================== ======== ======== ============== ================================================================================================================== - SDIO_DATA_CRC_TOKEN_CNT Address offset: 0x88. ========================== ======== ======== ============== ================================================================ Field Bit Access Reset Value Description ========================== ======== ======== ============== ================================================================ data_crc_token_cnt 15:0 RW 32 SDIO CRC Token 超时延迟计数器寄存器 Reserved 31:16 / 0x0 / ========================== ======== ======== ============== ================================================================ - SDIO_CRC_VALUE Address offset: 0x8C. ================== ======== ======== ============== ============================================================= Field Bit Access Reset Value Description ================== ======== ======== ============== ============================================================= cmd_crc 6:0 RO 0 SDIO 命令 CRC 值 Reserved 7 / 0x0 / stop_cmd_crc 14:8 RO 0 SDIO STOP 命令 CRC 值(仅在 autoCMD12 模式下使用) Reserved 31:15 / 0x0 / ================== ======== ======== ============== ============================================================= - SDIO_STATUS1 Address offset: 0x90. ================== ======== ======== ============== ============================================ Field Bit Access Reset Value Description ================== ======== ======== ============== ============================================ block_num 15:0 RO 0 剩余块的传输数量 Reserved 31:16 / 0x0 / ================== ======== ======== ============== ============================================ - SDIO_STOP Address offset: 0x94. ================== ======== ======== ============== ===================================================================== Field Bit Access Reset Value Description ================== ======== ======== ============== ===================================================================== stop 0 WIC 0 停止传输,写入 1 会生成脉冲并自动复位 Reserved 31:1 / 0x0 / ================== ======== ======== ============== ===================================================================== - SDIO_PAD_CTRL Address offset: 0x98. ================== ======== ======== ============== ============================================================= Field Bit Access Reset Value Description ================== ======== ======== ============== ============================================================= pad_ctrl 9:0 RW 0x3ff SDIO PAD 上拉控制(用于 sdclk, sdcmd, sddata0-7) Reserved 31:10 / 0x0 / ================== ======== ======== ============== ============================================================= - SDIO_STOP_RSP0 Address offset: 0xA0. ================== ======== ======== ============== ==================================================================================================================== Field Bit Access Reset Value Description ================== ======== ======== ============== ==================================================================================================================== stop_rsp0 31:0 RO 0 命令响应 0 请参考命令响应 3(stop_cmd_rsp3),以了解 SD 总线命令响应类型到此寄存器的映射关系。 ================== ======== ======== ============== ==================================================================================================================== - SDIO_STOP_RSP1 Address offset: 0xA4. ================== ======== ======== ============== ==================================================================================================================== Field Bit Access Reset Value Description ================== ======== ======== ============== ==================================================================================================================== stop_rsp0 31:0 RO 0 命令响应 0 请参考命令响应 3(stop_cmd_rsp3),以了解 SD 总线命令响应类型到此寄存器的映射关系。 ================== ======== ======== ============== ==================================================================================================================== - SDIO_STOP_RSP2 Address offset: 0xA8. ================== ======== ======== ============== ==================================================================================================================== Field Bit Access Reset Value Description ================== ======== ======== ============== ==================================================================================================================== stop_rsp0 31:0 RO 0 命令响应 0 请参考命令响应 3(stop_cmd_rsp3),以了解 SD 总线命令响应类型到此寄存器的映射关系。 ================== ======== ======== ============== ==================================================================================================================== - SDIO_STOP_RSP3 Address offset: 0xAC. ================== ======== ======== ============== ==================================================================================================================== Field Bit Access Reset Value Description ================== ======== ======== ============== ==================================================================================================================== stop_rsp0 31:0 RO 0 命令响应 0 请参考命令响应 3(stop_cmd_rsp3),以了解 SD 总线命令响应类型到此寄存器的映射关系。 ================== ======== ======== ============== ==================================================================================================================== - DMA_CFG_PCTRL Address offset: 0x1000. ================== ======== ======== ============== ===================================================================== Field Bit Access Reset Value Description ================== ======== ======== ============== ===================================================================== pctrl_cg 31:0 RW 0x0 DMA 相关外设的时钟门控使能 ================== ======== ======== ============== ===================================================================== - DMA_CFG_EVENT Address offset: 0x1004. ================== ======== ======== ============== ======================================================================================================== Field Bit Access Reset Value Description ================== ======== ======== ============== ======================================================================================================== EVT0 7:0 RW 0xFF ID 匹配这些位的外部事件将被转发到外设作为 event0 EVT1 15:8 RW 0xFF ID 匹配这些位的外部事件将被转发到外设作为 event1 EVT2 23:16 RW 0xFF ID 匹配这些位的外部事件将被转发到外设作为 event2 EVT3 31:24 RW 0xFF ID 匹配这些位的外部事件将被转发到外设作为 event3 ================== ======== ======== ============== ======================================================================================================== - DMA_PCH0_IRQ_EN Address offset: 0xC00. 参考DMA相关文档 - DMA_PCH0_IRQ_STAT Address offset: 0xC04. 参考DMA相关文档 - DMA_PCH0_IRQ_CLR Address offset: 0xC08. 参考DMA相关文档 - DMA_PCH0_CFG_RX_LLA_REG Address offset: 0xE00. 参考DMA相关文档 - DMA_PCH0_CFG_TX_LLA_REG Address offset: 0xF00. 参考DMA相关文档