当前位置:  技术问答>linux2.6.24.7 +s3c2440, 使用linux-2.6.24.7/driver/spi/spi_bitbang.c spi_s3c244xx.c,spidev.c,如何实现spi 的dma方式? iis7站长之家

如何以DMA方式传输数据(内存到内存)

    来源: 互联网  发布时间:2016-09-30

    本文导语:  目前做的一个项目,需要用到DMA方式传数据,平台是GM8180,里面内带了块DMAC,根据数据手册上所介绍的DMAC的设置方法,将DMAC设置好后,启动DMA传输...可是啥都没发生..,这是为什么? 以下是我设置的主要积存器: 1、使能DMAC, ...

目前做的一个项目,需要用到DMA方式传数据,平台是GM8180,里面内带了块DMAC,根据数据手册上所介绍的DMAC的设置方法,将DMAC设置好后,启动DMA传输...可是啥都没发生..,这是为什么? 以下是我设置的主要积存器:

1、使能DMAC,
2、设置通道积存器,包括源地址(我直接以一个数组地址赋值)、目的地址、传输大小、优先级、等一些琐碎的内容
3、开始传输

由于我只想要一个内存到内存传输的例子,所以忽略了什么中断啊、什么异常处理,这应该没问题的吧?刚开始接触驱动级,大家别见笑。
以下是数据手册的原文以及我写的代码,大虾指点下迷津啊:
1. Set CSR
Decide the master 0 interface and master 1 endianness by setting M1ENDIAN and M0ENDIAN
Enable the DMA controller by setting DMACEN to ‘1’
2. Set SYNC to decide which channel synchronization logic needs to be enabled
3. Set the channel registers
Set Cn_CFG to decide which channel interrupt needs to be enabled
Set the Cn_SrcAddr transfer source address and the Cn_DstAddr destination address
Set the Cn_LLP Linked List Pointer to ‘0’
Set the Cn_SIZE transfer number to determine how many transfers are required in the current DMA
transaction
Set Cn_CSR to decide the priority (CHIPRI), transfer burst size (SRC_SIZE), transfer width
(SRC_WIDTH, DST_WIDTH), increment or decrement address, and source or destination interface
GM8180 Data Sheet
www.faraday-tech.com
163
(SRC_SEL, DST_SEL)
Set MODE in the Cn_CSR to the hardware handshake mode
4. Start the DMA transfer by setting CH_EN of the Cn_CSR TO 1;



char src[128] = {"aaaaaaaaaaaaaaa"};
char dst[128] = {"bbbbbbbbbbbbbbb"};
static int dmatest_setup()
{


Csr_Addr = DMA_ADDR_BASE+0x24;
Csr_Addr = (unsigned long)ioremap(Csr_Addr,8);
Sy_Addr = (unsigned long)ioremap(DMA_ADDR_BASE+0x28,8);
Cn_CFG_Addr = (unsigned long)ioremap(DMA_ADDR_BASE+0x104,32);
Cn_LLP_Addr = (unsigned long)ioremap(DMA_ADDR_BASE+0x110,32);
Cn_Size_Addr = (unsigned long)ioremap(DMA_ADDR_BASE+0x114,32);
Cn_Csr_Addr = (unsigned long)ioremap(DMA_ADDR_BASE+0x100,32);
Cn_SrcAddr = (unsigned long)ioremap(DMA_ADDR_BASE+0x108,32);
Cn_DesAddr = (unsigned long)ioremap(DMA_ADDR_BASE+0x10c,32);


(*(volatile unsigned long *)Csr_Addr) |= 0x01;
(*(volatile unsigned long *)Sy_Addr) |= 0x80;
(*(volatile unsigned long *)Cn_CFG_Addr) = 0x00;
(*(volatile unsigned long *)Cn_LLP_Addr)  = 0x00;
(*(volatile unsigned long *)Cn_Size_Addr) |= 0x20;
(*(volatile unsigned long *)Cn_Csr_Addr) |= 0x00f41280;


(*(volatile unsigned long *)Cn_SrcAddr) = src;
(*(volatile unsigned long *)Cn_DesAddr) = dst;
(*(volatile unsigned long *)Cn_Csr_Addr) |= 0x01;     //开始传输
// mdelay(1000);
printk("src:%x=%sn,dst:%x=%sn",src,src,dst,dst);

return 0;

}


|
DMA(Direct Memory Access),即直接存储器存取,是一种快速传送数据的机制。数据传递可以从适配卡到内存,从内存到适配卡或从一段内存到另一段内存。

将DMAC设置好后,启动DMA传输...可是啥都没发生..,这是为什么?
   有没有将目的地址的内容打印一下,看跟SOURCE的一样不。

|
一般系统有写好DMA驱动接口的阿
你直接调用DMA请求,然后给好配置  然后start 就可以了 ,dma还是蛮简单的东西
需要注意的是dma一般使用的是物理地址的  应该转换一下,不过这样的动作在驱动中应该有做的

|
我觉得可能有几点问题, 首先DMA设备应该是在总线上, 但你缺少总线对设备的初始化动作, 那么端口怎么映射到内存呢? ioremap 在这里怕是什么作用都没起到, 如果端口搞错了, 那么你所有的初始化都是无用的.

|
linux-2.6.31driversdmaat_hdmac.c  at_dma_probe 函数有些初始化动作, 你跟着试试, 估计写过DMA驱动的不多, 完全有经验的人少. 我也没做过, 只是凭感觉.

|
不会,关注

|
顶顶顶,期待更有力的回答啊!我也需要这方面的指导。。。。

|
又被我发现了 

|
请问楼主,DMA启动后是只传一次么,还是一次都不传?另外,dma工作模式是否设置为内存到内存模式呢?

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问如何让DMA方式读取硬盘啊?
  • linux2.6.24.7 +s3c2440, 使用linux-2.6.24.7/driver/spi/spi_bitbang.c spi_s3c244xx.c,spidev.c,如何实现spi 的dma方式?
  • 请教s3c2410-UART2以DMA方式进行数据读取的驱动中问题,感谢
  • lcd驱动dma问题
  • 驱动程序中的dma操作问题?
  • DMA多次传送如何设置~迷茫中
  • 有关2440 DMA驱动的问题
  • DM9000如何使用DMA
  • 请教DMA的问题
  • linux kernel module中,怎样进行dma转送
  • 關於SPI下實現DMA傳輸
  • dma_map_single可以使用任意的地址吗?
  • alsa driver ,dma_alloc_coherent問題
  • 关于DMA操作的问题
  • 如何打开DMA通道?
  • 什么是DMA 啊?
  • 关于DMA_driver的一些问题?
  • s3c2440-sdi s3c2440-sdi: unable to get DMA channel
  • 我本来有xp然后安装 linux一切完成之后当到 UP-IDE; unknown via southbridge,disabling dma
  • 2.6.18的内核,SATA硬盘,怎么开启DMA模式啊
  • 写了个DMA驱动,想测试一下,请大家给点建议!!
  • linux下硬盘模式 DMA 和 pio
  • 谁知道怎么用linux-kernel/arch/arm/mach-GM下的ahb_dma.c这段代码的,再送100分


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3