转载:http://blog.sina.com.cn/s/blog_99698d3c0100xkqi.html
1. ADMA (Advanced DMA)
在SD Host Controller Standard Specification 2.00,定义了新的DMA传输算法ADMA (Advanced DMA)。在1.0协议中定义的DMA叫做SDMA(Single DMA),SDMA的缺点是在每个页面边界会产生DMA中断,从而打断CPU重新编程新的系统地址,由于每个页面边界的中断,SDMA算法产生了性能瓶颈。ADMA采用scatter gather DMA算法,因此能得到更高的传输速度。在系统内存和SD卡之间,Host驱动在执行DMA前把一系列的数据传输编程成描述符表(Descriptor Table),使能ADMA传输数据而不中断Host驱动。
ADMA不仅支持32位的系统内存地址,也支持64位系统内存地址,32位地址使用64位地址寄存器中的低32位。
ADMA有两种类型:ADMA1和ADMA2。ADMA1支持在系统内存中4KB对齐的数据传输。ADMA2改善了这个限制,因此系统内存中,任何位置和大小的数据能够被传输。ADMA1和ADMA2有不同的描述表格式,2.0协议定义ADMA2作为标准的ADMA,并推荐支持ADMA2而不是ADMA1。
2. 数据地址和数据长度要求
对于描述表,有三个要求需要满足:
1) 最小地址单元为4byte
2) 每个描述符行(Descriptor Line,包括地址,长度和属性)的数据长度小于64KB
3) 总的数据长度:
Total Length = Length 1 + Length 2 + … Length n = multiple of Block Size(块大小的倍数)
如果总的数据长度不是块大小的倍数,那么ADMA2传输不会结束,因此传输将由于数据超时而终止。
Block Count寄存器作为16位寄存器被定义,最大传输是65535个块。如果ADMA2操作少于或等于65535块数据,Block Count能够被使用。因此描述符表的总数据长度将等于块大小的倍数和块数。如果ADMA2操作的数据大于65535个块,那么Block Count寄存器将不被使用并把Block Count Enable阈(Transfer Mode寄存器)设置成“0”,因此总的数据长度将是由描述符表决定,而不是由块数。因此在SD总线上的最后一个块的定时检测可能不同并将影响 Present State寄存器中的Read Transfer Active, Write Transfer Active和DAT line Active。在读操作时,会比要求的多读几个块。如果读操作是内存数据的最后块,Host驱动应该忽略Out Of Range错误。
3. 描述符表(Descriptor Table)
上表是32位地址描述符表,每个描述符行由64位(8byte)组成,Attribute用于控制描述符。下表为Length阈定义和64位地址描述符表
4. ADMA2框图
Host驱动在系统内存中创建描述符表,32位的系统需要32位的描述符表,相应的,64位系统需要64位的描述符表。ADMA2不会为描述符指针使用32-bit的SDMA System Address Register(offset 0),而是使用64-bit Advanced DMA System Address Register(offset 0x58h)。
5. ADMA2编程例子
数据被划分成不同长度的部分,每部分数据存放在系统内存的某个地方,Host驱动创建描述符表(数据地址,长度和属性),每部分数据依照描述符中编程的顺序传输。
6. ADMA2状态
下图为ADMA状态转换图,定义了4个状态:Fetch Descriptor state, Change Address state, Transfer Data state和Stop ADMA state。