免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6073 | 回复: 6

[硬件及驱动] GPMC与FPGA通信问题(有问题,求方法) [复制链接]

论坛徽章:
0
发表于 2013-08-21 11:18 |显示全部楼层
通过GPMC来访问FPGA,FPGA作为norflash。Linux内核版本2.6.32,ARM为DM3730.
参考各方资料,对于ARM向FPGA的写已经调通,但是读功能却一直未能如意。
现象:ARM已控制FPGA将数据送出,通过示波器测量和FPGA内部抓数,已发现数据线上数据正常,但是从ARM端读出的数据一直为0(整个申请的片选空间都是0).

为减小篇幅贴上部分代码:
1、CONFIG寄存器设置
#define FPGA_GPMC_CONFIG1        0xA9001001
#define FPGA_GPMC_CONFIG2        0x001E1404        //CSontime = 4 fclk, CSRDofftime = 20 fclk
#define FPGA_GPMC_CONFIG3        0x000E0E02
#define FPGA_GPMC_CONFIG4        0x1D0C1484        //OEontime = 4 fclk, OEofftime = 20 fclk,
#define FPGA_GPMC_CONFIG5        0x01041F1F        //RDaccesstime = 2 fclk, RDcycletime = 31
#define FPGA_GPMC_CONFIG6        0x80000F0F
#define FPGA_GPMC_CONFIG7        0x00000F00
其中读写操作时读寄存器config7值为0x00000F41
2、读操作
if (down_interruptible(&fpga_dev.sem))
        return -ERESTARTSYS;
if (copy_from_user(&fpga_rwdata, (fpga_data*)arg, sizeof(fpga_rwdata))) {                     
        status = -EFAULT;
        goto fpga_read_done;
}
printk("\n*********fpga_read add = 0x%x\n",fpga_rwdata.fpga_add);
fpga_rwdata.fpga_val = readw(fpga_base + fpga_rwdata.fpga_add);
printk("******GPMC_CS_CONFIG7 value 0x%x\n", gpmc_cs_read_reg(GPMC_CS, GPMC_CS_CONFIG7));
if (copy_to_user((fpga_data*)arg, &fpga_rwdata, sizeof(fpga_rwdata))) {                        
        status = -EFAULT;
        goto fpga_read_done;
}
printk("*********read add = 0x%p\n",fpga_base + fpga_rwdata.fpga_add);
printk("*********read val = 0x%x\n",fpga_rwdata.fpga_val);
fpga_read_done:
up(&fpga_dev.sem);
}
3、应用层通过ioctl传输结构体指针
typedef struct {
        unsigned int fpga_add;
        unsigned int fpga_val;
}fpga_data;
fpga_data fpga_rwdata;

论坛徽章:
0
发表于 2013-08-21 11:39 |显示全部楼层
直接 mmap 物理地址访问一下看看,只是访问的话没有必要再做驱动,即使做驱动考虑一下 UIO

论坛徽章:
0
发表于 2013-08-21 14:16 |显示全部楼层
回复 2# abutter

谢谢回复!这个驱动应该还是必须要做在内核层的,首先,FPGA做为一个外设,只是一个虚拟的norflash。要访问这个外设,需要借助内核中已经注册的GPMC驱动来申请一块可以分配给这个设备的空间gpmc_cs_request(GPMC_CS, SZ_2K, (unsigned long *)&mem_base),可以说是这个设备无法直接拿到一个确定的物理地址,也就很难直接通过UIO来做。我测试的结果应该是数据还没有到达属于Linux的内存,如果读其他地方的内存是可以直接读到数的,应该是CPU和FPGA之间的这个GPMC接口还未能把数据拉到Linux内存上来,这样的话mmap也是读不到的。如果一块内存上一直有值,那么通过mmap可以直接读取,而FPGA做为一个外设,必须通过相应的时序控制它才会把数据送出来,而我现在的情况是:IO口已经可以通过示波器测到数据已经有了,但是在CPU衔接的这边却未能读出来。可能还是我对GPMC的接口的工作原理没有搞明白吧!
谢谢!


   

论坛徽章:
0
发表于 2013-08-29 20:02 |显示全部楼层
GPMC 不是通用 memory 控制器吗? 如果是的话,只是配置访问时序,除非是有 DMA 功能。

于是我有了另外一个问题,一定需要 DMA 功能吗?直接的地址访问速率满足不了需求吗?

论坛徽章:
0
发表于 2013-08-30 11:04 |显示全部楼层
回复 4# abutter

你好!读写操作并未涉及到DMA,仅是单个地址的读写。

谢谢!

   

论坛徽章:
0
发表于 2013-09-07 19:06 |显示全部楼层
那地址映射就足够了,用户态和内核态切换的消耗比较大。

论坛徽章:
0
发表于 2015-10-20 10:19 |显示全部楼层
你的dm3730用的是开发板还是自己做的板子?开发板的话是SBC3730还是天漠的devkit8500D?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP