基于linux的arm与fpgaspi接口驱动设计

基于linux的arm与fpgaspi接口驱动设计

ID:28227823

大小:82.54 KB

页数:6页

时间:2018-12-08

基于linux的arm与fpgaspi接口驱动设计_第1页
基于linux的arm与fpgaspi接口驱动设计_第2页
基于linux的arm与fpgaspi接口驱动设计_第3页
基于linux的arm与fpgaspi接口驱动设计_第4页
基于linux的arm与fpgaspi接口驱动设计_第5页
资源描述:

《基于linux的arm与fpgaspi接口驱动设计》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、基于Linux的ARM与FPGASPI接口驱动设计摘要:本文结合具体的FPGA与ARM接口电路介绍了SPI接口驱动程序设计,并给出了部分程序的核心代码。本驱动编写的思路严格按照Linux下字符设备驱动程序的要求,并重点介绍了中断挂载及内存映射等关键技术,对其他SPI外设的驱动程序设计有较强的参考意义。关键词:linux;SPI;驱动中图分类号:TP336在某项目的单板设计中,集成了Altera公司的STRATIXIIEP2S180FPGA和三星公司的S3C2440AARM9处理器,FPGA用于处理原始

2、数据,ARM用于配置FPGA参数并接收FPGA处理后数据,之间采用SPI串行接口通信。SPI接口驱动基于Linux系统开发,Linux内核中虽已集成了SPI驱动,但接口复杂且冗长,不适宜本项目采用,因此重新设计了SPI驱动。1接口电路设计ARM工作在SPI主模式,FPGA工作在SPI从模式,FPGA与ARM间接口电路如图1所示。1接口电路ARM使用SPIO控制器,EINT13作为中断输入,GPG6用于复位FPGA中断。ARM通过SPIMOSIO接口对FPGA进行参数配置,而后启动FPGA进行数据处理。

3、FPGA处理完数据后通过EINT13对ARM发送上升沿中断,触发ARM读取FPGA数据。ARM读取完毕后,通过INT_ACK信号线发上升沿信号对FPGA进行中断清除。2SPI驱动程序设计SH为串行接口,其驱动在Linux中沿用字符设备驱动格式,字符设备驱动接口函数数据结构如下:staticstructfile_operationsdev_fops={•owner=THIS.MODULE,.open=s3c24xx_SPI_open,.release=s3c24xx_SPI_close,.read=s3

4、c24xx_SPI_read,};驱动程序需要实现s3c24xx_SPI_open,s3c24xx_SPI_close、s3c24xx_SPI_read等几个关键函数。s3c24xx_SPI_open函数用于初始化SF1控制器并对FPGA发送初始化配置参数并挂载中断处理函数。s3c24xx_SPI_close函数用于关闭FPGA设备。s3c24xx_SPI_read用于读取FPGA数据,该函数通过调用wait_event_interruptible工作在阻塞模式,由中断处理函数负责唤醒。中断描述结构如

5、下:structspi_irq_desc{intirq;intpin;intpin_setting;intnumber;char*name;};staticstructspi_irq_descspi_irqs[]={{IRQ_EINT13,S3C2410_GPG(5),S3C2410_GPG5_EINT13,2,“SPIINT”},};在s3c24xx_SPI_open函数中挂载中断处理函数spi_interrupt,具体如下:request_irq(spi_irqs[i].irq,spi_inter

6、rupt,IRQ_TYPE_EDGE_RISING,spi_irqs[i].name,(void&spi_irqs[i]);request_irq将EINT13的处理函数设定为spi_interrupt,需要重点注意的是操作系统自动将EINT13引脚配置为中断模式,并设置为上升沿触发,无需用户再进行GPI0配置。在中断处理函数中,涉及到对SPI的发送寄存器和接收寄存器的读写操作。在Linux环境中,由于采用了画U及虚拟内存设计,无法直接读写外部寄存器,需将其映射到内存空间,而后采用iowrite32完

7、成读写。以对SPICONO寄存器写入0x18示例如下,该寄存器地址为0x59000000:spiconO_phys=0x59000000;spi0_virt=(unsignedlong)ioremap(spiOphys,0x20);va_s3c2440_SPI_SPC0N0=(unsignedlong*)(spi0_virt+0x00);iowrite32(0x18,vas3c2440SPISPCONO);在spi_interrupt函数中实现SPI接口读取,spi字长为8位,spi的接口配置为时钟上

8、升沿发送,下降沿读取。因此为读取FPGA需要对发送寄存器SPTDATO先写一个字节,而后判断状态寄存器SPSTAO是否完成发送,如果完成则读取接收寄存器SPRDATO,从FPGA读取一个字节,以后循环读取定长字节,即可完成对FPGA数据的读取。而后对GPG6依次写0、1、0,之间加入lus延时,即可产生上升沿中断以复位FPGA中断。对FPGA的读定长数据操作示例如下:ints3c2440SPIRead(char*buffer,intnbyte)char*

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。