Linux 中的DMA是什么?

Linux 中的DMA是什么?,第1张

从硬件上来说,dma

engine即dma引擎,就是dma控制器;从软件上来说,其实就是一个dma框架,在该框架下针对你的具体的dma控制器开发出dma驱动,然后其他drivers比如audio,network,crypto等就都可以调用统一的dma相关的api来使用你的dma。

如果在安装时DMA是disable的,那该怎么才能激活DMA呢?通过重新编译内核可以激活DMA支持,但编译内核对新手显然太过复杂。下面的方法无需编译内核,就可以激活DMA支持。

一、检查系统中的DMA选项是否已被激活

在进行 *** 作前,先确认硬盘是否已经在使用DMA方式传输数据了。方法:查看/proc/ide/hda/settings文件,其中有一行的内容为:using_dma,如果其后面的值被设置为1就说明系统已经支持DMA了,那么下面的 *** 作就可以免了,当然如果你要关闭DMA功能的话,还要往下看看哟:)。

Linux中的hdparm命令是用来进行与硬盘相关 *** 作的,用hdparm -i /dev/hda可以列出IDE可能支持的DMA模式,如:

DMA modes: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 *udma4

二、激活DMA支持

方法1:在lilo.conf中加入:idex=dma,其中x代表硬盘序号,其取值范围0-3,分别代表系统中的四个IDE硬盘设备。

方法2:使用hdparm命令,hdparm d1 /dev/hda 其中d1表示使能DMA,你可以将其加到rc.locl中以便每次启动时都硬盘都能使用DMA方式传输数据。

三、关闭DMA支持

DMA不可以自动帮忙发送时钟信号,但是如果让spi发送数据并且使用DMA方式,spi可以帮忙自动发送时钟信号。基于这样的理论,试了一上午,成功了,很高兴。这是在网友的帮助下完成的,现在写下来分享给大家,将温暖传递下去。

硬件:stm32+cc1101无线模块(两者之前通过spi通信)

配置:stm32的spi工作在master模式,当cc1101有数据时,将会给stm32一个外部中断。

实现方法:配置DMA的两个通道,分别用于spi发送和spi接收,配置的时候先把其它参数都配置好不要使能DMA,也就是说先不要写这两句话:

DMA_Cmd(DMA1_Channel4, ENABLE)

DMA_Cmd(DMA1_Channel5, ENABLE)

在表示cc1101数据来临的外部中断的中断处理函数中将DMA打开,这个时候,spi就会向cc1101发送数据(也就是stm32的spi接收来自cc1101数据所需要的时钟),发送数据的同时,cc1101数据就会不断的从cc1101的寄存器里面跑到SPI_DR里面。由于已经配置好了接收SPI的DMA,所以数据到来了SPI_DR里面以后,DMA会自动将数据帮你拷贝到缓存数组里去,你只需要在用于接收的DMA中断处理函数里面将缓存数组里的数据拷出来即可。拷完以后最好把DMA关掉,否则spi会不断向外发送数据,可能会让你接回来一些没用的数据。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7346951.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-04
下一篇 2023-04-04

发表评论

登录后才能评论

评论列表(0条)

保存