首页 » 技术文章 » ARM920T基于Linux平台下的FPGA驱动开发

ARM920T基于Linux平台下的FPGA驱动开发

作者:  时间:2010-10-12 10:35  来源:EDN

  1.4 openrelease

  open主要用于提供驱动初始化,在大部分驱动中,open应当检查设备特定的错误(例如设备没准备好,或者类似的硬件错误),但是,其第一步常常是确定打开哪个设备。open的原代码为:

  int(*open)  (struct inode*inodestructfile*flip) 

  releaseopen的反操作。

  1.5 读/写操作

  读和写都是进行类似的任务,就是从设备到应用程序代码的数据拷贝。因此,它们的原代码比较相似:

  ssize_t read(struct file*flipchar__user*buffsize_t countloff_t*offp)

  ssize_t write(struct file*filpconst char__user*buffsize_t countloff_t*offp)

  read的任务是从设备拷贝数据到用户空间(使用copy_to_user),而write方法则是从用户空间拷贝数据到设备(使用copy_from_user)

  
硬件电路

  通常在大容量存储项目中,S3C2410处理器一般作为主CPU,可对EP2S30F67214进行扩展,以使系统具有拍摄、存储、下载、IO口扩展的功能。由于FPGA的高速处理能力和易扩展性,ARMFPGA的结合使用,将在嵌入式系统领域占据主导地位。

  本项目中的ARM主要读取FPGA的数据,然后进行数据处理并送给上位机。其ARM处理器与FPGA的连接关系如图2所示,其主要连接有32位宽数据线、27位宽地址线以及读、写、中断和片选控制线等。

  在S3C2410中,nGPCS4的物理地址为0x2000000—0x28000000,共计128MB的静态物理空间。中断方式为下降沿有效。

  编程实现

  3.1  设备驱动初始化

  初始化模块在内核启动时主要负责初始化FPGA工作。其实现由module_init () module_exit ()两部分组成。其代码如下:

  3.2  异步中断通知

  在应用程序中,可用如下代码获得中断响应:   

  signal (SIGIOtest_handler);/*test_handler为函数名字*

  fcntl(faF_SETOWNgetpid ())

  oflags=fcntl(faF_GETFL);/*fd为打开设备返回值*

  fcntl (fdF_SETFLoflags∣FASYNC);/*fd为打开设备返回值*

  应当注意的是,不是所有的设备都支持异步通知。应用程序常常假定异步能力只对sockettty可用。

  3.3  地址映射

  在Linux设备驱动程序开发过程中,由于驱动程序操作的都是设备的虚拟地址,因此,要使驱动程序对虚拟地址的操作反映到正确的设备上,还需要通过内存管理单元MMU来将设备的虚拟地址映射到正确的物理地址上去,从而保证驱动程序对设备的虚拟地址的操作,也就是要对其相应的物理地址进行操作。使用内存映射的好处是处理大文件时,其速度明显快于标准文件IO,这样无论读和写,都少了一次用户空间与内核空间之间的复制。在用户空间对FPGA设备的访问可通过内存映射来实现。FPGA可以看作是硬件连接在S3C2410微处理器的片选信号nGPCS4上的一段物理地址的寻址。因此,必须先把物理地址映射到虚拟地址空间,然后才能对该段地址进行读/写。通常用户可用如下代码关联FPGA的地址:

  fpga_base=ioremap(FPGA_PHY_STARTFPGA_PHY_SIZE)

  结束语

  本文系统的介绍了ARM基于Linux平台下的FPGA的驱动开发方法,并通过开发用户程序,实现了数据的处理和传输,从而实现了FPGA在嵌入式领域的广泛应用。

相关推荐

没有退路的FPGA与晶圆代工业者

FPGA  晶圆代工  2014-01-03

采用FPGA的可编程电阻的设计结构分析

FPGA  电阻  2013-09-24

从FPGA的制程竞赛看英特尔与Fabless的后续变化

FPGA  Fabless  2013-07-16

物联网融合自动化推动高效生产模式变革

物联网  FPGA  SoC  2013-07-09

Linux将进军汽车智能系统领域

Linux  汽车智能系统  2013-07-09

14纳米FPGA展现突破性优势

14纳米  FPGA  2013-06-20
在线研讨会
焦点