S3C2440的高级功能模块实现过程(5) 5.7 直接存储DMA模块 DMA.c 包含方法: U32RequestDMASW(U32 attr, U32 mode); U32 RequestDMA(U32attr, U32 mode); U16 ReleaseDMA(U32attr); U16 StartDMA(U32attr); U16 StopDMA(U32attr); U16 SetDMARun(U32attr, U32 src_addr, U32 dst_addr, U32 len); U32QueryDMAStat(U32 attr); U32QueryDMASrc(U32 attr); U32QueryDMADst(U32 attr); S3C2440总共有4条DMA通道,其中每个通道有7个可以使用的信号源,DMA通道分配如下表: 表5-2 每个DMA通道的申请源 通过表中,不同的信号源在使用DMA通道时会申请不同的通道,但使用相同通道的信号源就必须识别当前通道是否被同级的其他源所占用,当一个信号源申请DMA通道成功后,就会一直占有这个通道,直到它使用完毕后释放它。那么其他同级信号源就不得不等待它。 DMA通道的申请模式包含两种,一种是硬件请求模式(H/W Request Mode),一种是软件请求模式(S/W Request Mode)。 重要方法说明: l DMA请求(RequestDMA) 具体步骤: 1. DMA请求函数的传参为attr和mode。其中attr是设备信息,attr高16位为设备ID,低16位的高8位为DMA传送源和的属性(AHP/APB,INCREASE/FIX),低8位为请求源,请求源的高4位是申请的DMA通道号。Mode模式参数决定是硬件请求模式和是软件请求模式。 2. 如果参数的解析中发现传参错误或者所申请的DMA通道已被占用,则DMA请求会返回失败代码。 3. 否则,则会把对应参数传递给指定寄存器DMASKTRIG、DISRCC、DIDSTC、DCON等。 4. 函数返回申请成功的设备ID和请求源。 l DMA释放(ReleaseDMA) 1. 和DMA请求函数的传参方法一样,如果attr的传参不正确或者DMA通道本身就是Free状态,则返回DMA释放失败代码。 2. 否则,清空DMASKTRIG触发屏蔽寄存器。 l DMA传输开始(StartDMA) 这个函数的使用必须建立在成功的申请到了DMA通道。调用RequestDMA得到了成功代码之后,就可以StartDMA。 通过打开DMASKTRIG触发屏蔽寄存器的ChannelOn位开始传输。 l DMA传输停止(StopDMA) 和StartDMA类似,设置DMASKTRIG触发屏蔽寄存器的ChannelOff位,中止DMA传输。 l DMA开始工作(SetDMARun) 这个函数主要是包含了RequestDMA和StartDMA的功能。 l 查询DMA状态(QueryDMAStat) 通过返回指定attr设备信息申请到的DMA通道所处的DSTAT状态寄存器。主要了解当前状态信息和CURR_TC服务时间计数器还有多少服务时间。 l 查询DMA申请源地址(QueryDMAScr) 通过返回指定attr设备信息申请到的DMA通道所处的DCSRC申请源地址寄存器。 l 查询DMA操作目标地址(QueryDMADst) 通过返回指定attr设备信息申请到的DMA通道所处的DCDST申请目标地址寄存器。
|