ARM PL330 DMAC (qt210)
Hi 大虾:
最近在看s5pc110的datasheet。其中涉及了DMAC的描述,网上查了一些PL330的资料。后来疑惑了。。。
1,PL330的汇编怎么给PL330使用?
2,如果有汇编去控制PL330,那么编译好的汇编代码怎么输入到PL330?
由于理解有限,提出的问题可能有些肤浅。如果大虾知道如何调试使用PL330的请不要吝啬文笔。多写一点相关的感念和技术。
谢谢。
[解决办法]
PL330 的DMA驱动和以往驱动的不同之处:
a) DMA 有自己的特殊指令集,基本是1-6个字节不定长,主要有 DMAMOV/DMALD/DMAST/DMAGO
b) DMA 的驱动主要包含两个工作:
### 1) 开辟一个buf,在buf里面存放DMA的二进制指令,可以完成数据传输操作。
### 2) 通过执行 DMAGO 指令,使得 DMA 内部的取值部件 pc 调转到 buf,从 buf 取值执行相应的指令。
DMAGO 指令的本身的执行,是通过写 S5PV210 芯片的 DBGCMD/DBGINST0/DBGINST1 这3个寄存器实现的。
c) linux 下的 pl330.c 是可以参考使用的驱动,主要包含了一系列 _emit_MOV/_emit_LD/_emit_ST 等类似指令的接口。
这些接口完成类似编译器的工作,把一个DMA操作函数,转换为存放在 buf 数组里面的二进制指令。
d) 驱动编程的关键在于形成 buf 内部的正确机器指令,然后通过对 DBGCMD/DBGINST0/DBGINST1 这3个寄存器进行编程,完成跳转到 buf 执行指令。
http://www.lumit.org/LASO/
https://github.com/limingth/LASO/wiki
https://github.com/limingth/ARM-Codes/tree/master/tiny210-linux-codes/prj3-dpf-dma
[解决办法]
PL330 的DMA驱动和以往驱动的不同之处:
a) DMA 有自己的特殊指令集,基本是1-6个字节不定长,主要有 DMAMOV/DMALD/DMAST/DMAGO
b) DMA 的驱动主要包含两个工作:
### 1) 开辟一个buf,在buf里面存放DMA的二进制指令,可以完成数据传输操作。
### 2) 通过执行 DMAGO 指令,使得 DMA 内部的取值部件 pc 调转到 buf,从 buf 取值执行相应的指令。
DMAGO 指令的本身的执行,是通过写 S5PV210 芯片的 DBGCMD/DBGINST0/DBGINST1 这3个寄存器实现的。
c) linux 下的 pl330.c 是可以参考使用的驱动,主要包含了一系列 _emit_MOV/_emit_LD/_emit_ST 等类似指令的接口。
这些接口完成类似编译器的工作,把一个DMA操作函数,转换为存放在 buf 数组里面的二进制指令。
d) 驱动编程的关键在于形成 buf 内部的正确机器指令,然后通过对 DBGCMD/DBGINST0/DBGINST1 这3个寄存器进行编程,完成跳转到 buf 执行指令。
http://www.lumit.org/LASO/
https://github.com/limingth/LASO/wiki
https://github.com/limingth/ARM-Codes/tree/master/tiny210-linux-codes/prj3-dpf-dma
[解决办法]
http://www.lumit.org/LASO/
https://github.com/limingth/LASO/wiki
https://github.com/limingth/ARM-Codes/tree/master/tiny210-linux-codes/prj3-dpf-dma