allwinner h3 通用DMA 驱动(SylixOS 操作系统)

SylixOS  集成了DMA框架,在使用DMA时需要针对硬件封装对应的函数。

1.注册DMA驱动

allwinner h3 通用DMA 驱动(SylixOS 操作系统)

全志 h3 共有12个通用驱动,注册12个DMA控制器驱动。 dmaGetFuncs函数实现对传输,状态监测,复位函数的封装。

allwinner h3 通用DMA 驱动(SylixOS 操作系统) 首先配置时钟,根据手册中的DMA时钟写入对应的值,实现 Reset,Trans,Status三个函数

2.功能函数实现

allwinner h3 通用DMA 驱动(SylixOS 操作系统)

由全志h3 数据手册可以看出存在DMA的使能,状态和暂停寄存器,所以复位和状态功能只需要写入和读取相应寄存器的值就可以,比较简单。系统在调用一个通道时首先会对通道进行复位,复位函数中使能DMA中断,根据data手册中的DMA中断寄存器进行配置。重点在trans 传输函数。首先查看h3 DMA 描述符的定义:

 

allwinner h3 通用DMA 驱动(SylixOS 操作系统)

查看手册中 第190页 DMA描述符 和DMA处理过程如上图,首先定义DMA描述符

allwinner h3 通用DMA 驱动(SylixOS 操作系统)

DMA必须使用物理地址,所以使用系统函数API_VmmDmaAllocAlign 分配物理地址。分配完成物理地址后对描述符中的项填充相应的数据

allwinner h3 通用DMA 驱动(SylixOS 操作系统)

填充完成后使能发送,发送完成后删除申请的DMA区域。

3.DMA测试

allwinner h3 通用DMA 驱动(SylixOS 操作系统)

申请两个物理地址,将地址传入给DMA,在_dmaTestDone 函数是DMA传输完成后的回调函数:

allwinner h3 通用DMA 驱动(SylixOS 操作系统)

使用信号量保证在一次传输完成后才结束此次过程。