allwinner h3 通用DMA 驱动(SylixOS 操作系统)
SylixOS 集成了DMA框架,在使用DMA时需要针对硬件封装对应的函数。
1.注册DMA驱动
全志 h3 共有12个通用驱动,注册12个DMA控制器驱动。 dmaGetFuncs函数实现对传输,状态监测,复位函数的封装。
首先配置时钟,根据手册中的DMA时钟写入对应的值,实现 Reset,Trans,Status三个函数
2.功能函数实现
由全志h3 数据手册可以看出存在DMA的使能,状态和暂停寄存器,所以复位和状态功能只需要写入和读取相应寄存器的值就可以,比较简单。系统在调用一个通道时首先会对通道进行复位,复位函数中使能DMA中断,根据data手册中的DMA中断寄存器进行配置。重点在trans 传输函数。首先查看h3 DMA 描述符的定义:
查看手册中 第190页 DMA描述符 和DMA处理过程如上图,首先定义DMA描述符
DMA必须使用物理地址,所以使用系统函数API_VmmDmaAllocAlign 分配物理地址。分配完成物理地址后对描述符中的项填充相应的数据
填充完成后使能发送,发送完成后删除申请的DMA区域。
3.DMA测试
申请两个物理地址,将地址传入给DMA,在_dmaTestDone 函数是DMA传输完成后的回调函数:
使用信号量保证在一次传输完成后才结束此次过程。