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硬件架构

sdio_arch

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寄存器配置的时间间隔内检测这一忙碌状态。如果超过此时间范围,我们将报告错误。

sdio_cmd_timing

SDIO命令通道时序

数据通路

sdio_sdr_1bit_timing

SDIO 1线SDR模式数据通道时序

sdio_sdr_4bit_timing

SDIO 4线SDR模式数据通道时序

sdio_sdr_8bit_timing

SDIO 8线SDR模式数据通道时序

在DDR模式下,数据在SDIO的两个沿上进行采样,具体如下:

  • 在时钟的上升沿,会采样奇数字节。

  • 在时钟的下降沿,偶数字节被采样。

  • 数据有效载荷大小始终是2字节的倍数。

  • 每条数据线计算两个CRC16。奇数位的CRC16在时钟的下降沿进行采样,偶数位的CRC16在时钟的上升沿进行采样。

  • 起始位、结束位和空闲条件均为全周期。

  • CRC状态/启动确认和忙信号均为完整周期,且仅在时钟的上升沿采样。

sdio_sdr_8bit_timing

SDIO 4线DDR模式数据通道时序

sdio_ddr_8bit_timing

SDIO 8线DDR模式数据通道时序

如下图所示,这是一个数据读取序列图:发送读取命令后,我们即可开始读取数据线。我们有一段特定的时间来检测读取数据的起始位。这段时间可通过data_timeout_cnt寄存器配置确定。如果超过此时间仍未检测到读取数据的起始位,我们将报告错误。

sdio_read_data_timing

SDIO 读数据时序

如下图所示为写数据序列图。当命令响应结束时,我们开始发送写数据序列,包括起始位、内容和结束位。写数据序列发送完成后,我们需要等待设备返回CRC状态。在图中,这一阶段显示为等待CRC令牌阶段。在此阶段,我们可通过配置crc_token_cnt寄存器来调整接收CRC状态的时间。如果超过此时间仍未检测到CRC状态,我们将报告相应的错误。在接受到CRC状态后,设备会拉低Data0,表示其处于忙碌状态。我们将在此期间检测忙碌状态,而我们的检测时间同样由data_timeout_cnt寄存器决定。

sdio_write_data_timing

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。实际上,部分区域并未得到我们的支持。以下将对这些寄存器进行说明。

sdio_csr_mapping

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的相关寄存器。该寄存器空间的映射关系如下图所示。

sdio_slave_dma_reg

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相关文档