内部 DMA 控制器 (IDMAC)
16 Aug 2024
Read time: 3 minute(s)
SDMC 控制器内部包含一套 DMA 控制器(简称 IDMAC),IDMAC 由控制寄存器、状态寄存器和单向的发送/ 接收引擎组成。IDMAC
使用一个有效的描述符将数据从源地址搬移到目标地址,用于发送和接收数据,使 CPU 干预最小化。IDMAC 包含以下特性:
- IDMAC 从 Card 接收数据存储到内存中,并从内存中读取数据发送到 FIFO。
- IDMAC 的描述符存储在内存中,控制器通过内存的指针来获取描述符内容。
- Host 的数据缓存存储在内存中,由完整的数据或部分数据组成,描述符通过指针指向数据缓存:
- 数据缓存中仅包含数据。
- 数据缓存的状态包含在描述符中。
描述符
IDMAC 使用两种描述符结构:
- 双缓存结构:每个描述符指向两个数据缓存,两个描述符的间隔,通过 PBUSCFG 寄存器的 DSL 位域进行编程。
- 链式结构:每个描述符指向唯一的缓存和下一个描述符地址。多个描述符可以组成描述符链表,包含以下特性:
- 链表的基址写入描述符链表基址寄存器 IDMAINTEN。
- 描述符链表向前连接, 最后一个描述符可以指回到第一个描述符,形成一个环状结构。
- 描述符链表存储在内存中。
- 每个描述符可以指向两个数据缓存中容量最大的一个。
两种描述符结构见下图:
描述符地址必须按照 32 位对齐,每个描述符包含 16 字节的控制和状态信息,以及数据缓存的指针和容量。每个描述符由四个 DES 结构体组成,每个 DES
都存储 32 位数据。
- DES0 用于配置控制信息
- DES1 用于配置每个描述符的数据长度
- DES2 用于配置第一个数据缓存的起始地址
- DES3 用于配置第二个数据缓存的起始地址,或第二个描述符的起始地址
关于四个描述符结构体的详细配置说明,可查看 DES 结构体。
IDMA 控制器初始化
- 配置 HCTRL1 寄存器的 bit25,使用 IDMAC 访问 FIFO。
- 写 IDMAC 总线模式寄存器 (PBUSCFG) 。
- 配置突发传输的数据长度。
- 使能 IDMAC。
- 复位 IDMAC 内部寄存器。
- 此步骤可选。如果使用双缓存结构的描述符,配置描述符之间跳过的数据长度。
- 写 IDMAC 中断使能寄存器 (IDMAINTEN),屏蔽掉不需要的中断。
- 配置 IDMAC 描述符链表基址寄存器 (IDMASADDR)。
驱动软件在内存中创建发送或接收的描述符链表,并写入 IDMAC 描述符链表基址寄存器 (IDMASADDR),为 IDMAC 提供描述符的起始地址。
- IDMAC 模块从描述符链表获取描述符。
DES 结构体
描述符地址必须按照 32 位对齐,每个描述符包含 16 字节的控制和状态信息,以及数据缓存的指针和容量。每个描述符由四个 DES 结构体组成,每个 DES 都存储 32 位数据。
DES0 用于配置控制信息,说明如下:
位域 | 位域名称 | 说明 |
---|---|---|
31 | OWN |
|
30 | CES (Card Error Summary) | 错误位
|
29:6 | RESET | - |
5 | ER (End of Ring) | 置 1,表示描述符链表到达最后一个描述符。IDMAC 返回链表的基址,创建一个描述符环。仅在双缓存描述符结构时有效。 |
4 | CH (Second Address Chained) | 置 1,表示描述符的第二个地址是下一个描述符的地址,不是第二个缓存的地址。该位域置 1 时,DES1[25:13] 应该清零。 |
3 | FS (Fist Descriptor) | 置 1,表示描述符包含第一个缓存的数据。如果第一个缓存的容量为 0,下一个描述符包含起始数据。 |
2 | LD (Last Descriptor) | 与一次 IDMAC 传输的最后一个 block 有关。
|
1 | DIC (Disable Interrupt on Completion) | 置 1,防止 IDMAC 状态寄存器的 bit0/ 1 置位。 |
0 | RES | - |
DES1 用于配置每个描述符的数据长度,说明如下:
位域 | 位域名称 | 说明 |
---|---|---|
31:26 | RES | - |
25:13 | BS2 (Buffer 2 Size) | 缓存 2 容量,表示第二个数据缓存的字节容量。
|
12:0 | BS1 (Buffer 1 Size) | 缓存 1 容量,表示第一个数据缓存的字节容量。
注: 如果仅有一个缓存被编程,必须使用缓存 1,而不是缓存
2。 |
DES2 用于配置第一个描述符的起始地址,说明如下:
位域 | 位域名称 | 说明 |
---|---|---|
31:0 | 缓存地址指针 1 |
|
DES3 用于配置下一个描述符的起始地址,说明如下:
位域 | 位域名称 | 说明 |
---|---|---|
31:0 | 缓存地址指针 2 | 使用双缓存结构时,表示第二个缓存的物理地址。如果 DES0[4] 置 1,该地址指向下一个描述符的地址。如果不是最后一个描述符,下一个描述符的地址必须按 32 位对齐,即 bit[1:0] 为 0,内部最低有效位被忽略。 |