Edit online

内部 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
    • 描述符链表向前连接, 最后一个描述符可以指回到第一个描述符,形成一个环状结构。
    • 描述符链表存储在内存中。
    • 每个描述符可以指向两个数据缓存中容量最大的一个。

两种描述符结构见下图:


../images/sdmc_des2.png

描述符地址必须按照 32 位对齐,每个描述符包含 16 字节的控制和状态信息,以及数据缓存的指针和容量。每个描述符由四个 DES 结构体组成,每个 DES 都存储 32 位数据。
  • DES0 用于配置控制信息
  • DES1 用于配置每个描述符的数据长度
  • DES2 用于配置第一个数据缓存的起始地址
  • DES3 用于配置第二个数据缓存的起始地址,或第二个描述符的起始地址

关于四个描述符结构体的详细配置说明,可查看 DES 结构体

IDMA 控制器初始化

  1. 配置 HCTRL1 寄存器的 bit25,使用 IDMAC 访问 FIFO。
  2. 写 IDMAC 总线模式寄存器 (PBUSCFG) 。
    1. 配置突发传输的数据长度。
    2. 使能 IDMAC。
    3. 复位 IDMAC 内部寄存器。
    4. 此步骤可选。如果使用双缓存结构的描述符,配置描述符之间跳过的数据长度。
  3. 写 IDMAC 中断使能寄存器 (IDMAINTEN),屏蔽掉不需要的中断。
  4. 配置 IDMAC 描述符链表基址寄存器 (IDMASADDR)。

    驱动软件在内存中创建发送或接收的描述符链表,并写入 IDMAC 描述符链表基址寄存器 (IDMASADDR),为 IDMAC 提供描述符的起始地址。

  5. IDMAC 模块从描述符链表获取描述符。

DES 结构体

描述符地址必须按照 32 位对齐,每个描述符包含 16 字节的控制和状态信息,以及数据缓存的指针和容量。每个描述符由四个 DES 结构体组成,每个 DES 都存储 32 位数据。

DES0 用于配置控制信息,说明如下:

位域 位域名称 说明
31 OWN
  • 1,表示描述符由 IDMAC 控制。
  • 0,表示描述符由 Host 控制。当数据传输完成时,IDMAC 控制器对该位域清零。
30 CES (Card Error Summary) 错误位
  • 表示发送到 Card 或来自 Card 的错误状态。
  • 也存在于 OINTST 寄存器,与以下位域为逻辑或的关系:
    • BE:结束位错误
    • TO:响应超时
    • CRC:响应数据 CRC 错误
    • RTO:数据读超时
    • CRC:数据接收 CRC 错误
    • RE:响应错误
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,表示缓存指向该描述符的最后一个缓存数据。
  • 描述符结束后,剩余的字节数为 0。即描述符完成后且该位域置 1 时,剩余的字节数为 0。
1 DIC (Disable Interrupt on Completion) 置 1,防止 IDMAC 状态寄存器的 bit0/ 1 置位。
0 RES -

DES1 用于配置每个描述符的数据长度,说明如下:

位域 位域名称 说明
31:26 RES -
25:13 BS2 (Buffer 2 Size) 缓存 2 容量,表示第二个数据缓存的字节容量。
  • 缓存容量必须按 32 位对齐。
  • 置 0,DMA 忽略该缓存,跳到下一个双缓存结构的缓存。
  • 对于链式结构,该位域无效。此时 DES0[4] 置 1。
  • 如果在任意的描述符里该位被置 0,剩下的描述符不能为非零值,直到最后一个描述符。
12:0 BS1 (Buffer 1 Size) 缓存 1 容量,表示第一个数据缓存的字节容量。
  • 缓存容量必须按 32 位对齐。
  • 该位域不能为 0。
注: 如果仅有一个缓存被编程,必须使用缓存 1,而不是缓存 2。

DES2 用于配置第一个描述符的起始地址,说明如下:

位域 位域名称 说明
31:0 缓存地址指针 1
  • 使用双缓存结构时,表示第一个数据缓存的物理地址。
  • 对于链式结构,表示数据缓存的物理地址。

DES3 用于配置下一个描述符的起始地址,说明如下:

位域 位域名称 说明
31:0 缓存地址指针 2 使用双缓存结构时,表示第二个缓存的物理地址。如果 DES0[4] 置 1,该地址指向下一个描述符的地址。如果不是最后一个描述符,下一个描述符的地址必须按 32 位对齐,即 bit[1:0] 为 0,内部最低有效位被忽略。