微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ISA总线的DMA技术

ISA总线的DMA技术

时间:05-20 来源:互联网 点击:

统RAM中低16MB物理内存,因此:ISA设备驱动程序在申请DMA缓冲区时,一定要以GFP_DMA标志来调用kmalloc()函数或get_free_pages()函数,以便在系统内存的DMA区中分配物理内存。

5.3 编程DMAC

设备驱动程序可以在他的read()方法、write()方法或ISR中对DMAC进行编程,以便准备启动一个DMA传输事务。一个DMA传输事务有两种典型的过程:(1)用户请求设备进行DMA传输;(2)硬件异步地将外部数据写道系统中。

用户通过I/O请求触发设备进行DMA传输的步骤如下:

1.用户进程通过系统调用read()/write()来调用设备驱动程序的read()方法或write()方法,然后由设备驱动程序read/write方法负责申请DMA缓冲区,对DMAC进行编程,以准备启动一个DMA传输事务,最后正确地设置设备(setup device),并将用户进程投入睡眠。

2.DMAC负责在DMA缓冲区和I/O外设之间进行数据传输,并在结束后触发一个中断。

3.设备的ISR检查DMA传输事务是否成功地结束,并将数据从DMA缓冲区中拷贝到驱动程序的其他内核缓冲区中(对于I/O device to memory的情况)。然后唤醒睡眠的用户进程。

硬件异步地将外部数据写到系统中的步骤如下:

1.外设触发一个中断通知系统有新数据到达。

2.ISR申请一个DMA缓冲区,并对DMAC进行编程,以准备启动一个DMA传输事务,最后正确地设置好外设。

3.硬件将外部数据写到DMA缓冲区中,DMA传输事务结束后,触发一个中断。

4. ISR检查DMA传输事务是否成功地结束,然后将DMA缓冲区中的数据拷贝驱动程序的其他内核缓冲区中,最后唤醒相关的等待进程。

网卡就是上述过程的一个典型例子。

为准备一个DMA传输事务而对DMAC进行编程的典型代码段如下:

unsigned long flags;

flags = claim_dma_lock();

disable_dma(dmanr);

clear_dma_ff(dmanr);

set_dma_mode(dmanr,mode);

set_dma_addr(dmanr, virt_to_bus(buf));

set_dma_count(dmanr, count);

enable_dma(dmanr);

release_dma_lock(flags);

检查一个DMA传输事务是否成功地结束的代码段如下:

int residue;

unsigned long flags = claim_dma_lock();

residue = get_dma_residue(dmanr);

release_dma_lock(flags);

ASSERT(residue == 0);

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top