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会不断向外发送数据,可能会让你接回来一些没用的数据。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)