打印
[嵌入式Linux]

GPMC与FPGA通信问题

[复制链接]
6963|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
21dinglei|  楼主 | 2013-8-21 09:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通过GPMC来访问FPGA,FPGA作为norflash。Linux内核版本2.6.32,ARM为DM3730.
参考各方资料,对于ARM向FPGA的写已经调通,但是读功能却一直未能如意。
现象:ARM已控制FPGA将数据送出,通过示波器测量和FPGA内部抓数,已发现数据线上数据正常,但是从ARM端读出的数据为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;

相关帖子

沙发
21dinglei|  楼主 | 2013-8-21 09:23 | 只看该作者
自己顶一下!望同志们多多给出指导意见!

使用特权

评论回复
板凳
jlass| | 2013-8-21 14:46 | 只看该作者
本帖最后由 jlass 于 2013-8-21 15:09 编辑

你的问题确实不好分析,给你几个方案试试
1、去TI的中文官网上去问,上面有几个TI的专家
2、先不要使用中断或者DMA、burst之类的功能,直接使用并口的读写操作试试,如果可行的话基本就是配置的问题,不行的话再考虑其他
3、ARM已控制FPGA将数据送出,通过示波器测量和FPGA内部抓数,已发现数据线上数据正常,但是从ARM端读出的数据为0
这一条怎么看都不合理,把你看到的图和datasheet做一个对比,肯定有不同的吧,如果完全一样的话就肯定对了

使用特权

评论回复
地板
21dinglei|  楼主 | 2013-8-21 15:22 | 只看该作者
jlass 发表于 2013-8-21 14:46
你的问题确实不好分析,给你几个方案试试
1、去TI的中文官网上去问,上面有几个TI的专家
2、先不要使用中断 ...

谢谢回复!
关于第二点,现在的测试只是使用并口的基本功能,DMA搬移和burst读写都没有添加。
关于第三点,通过示波器测量的结果是:双通道,通过片选抓数,测量16根数据线,当片选置位的时候数据线上的数组合而来的结果正和FPGA送出的数据一致。
关于时序,最终想达到的理想模型如图:


使用特权

评论回复
5
21dinglei|  楼主 | 2013-8-21 15:25 | 只看该作者
jlass 发表于 2013-8-21 14:46
你的问题确实不好分析,给你几个方案试试
1、去TI的中文官网上去问,上面有几个TI的专家
2、先不要使用中断 ...

谢谢回复!
关于第二点,现在的测试只是使用并口的基本功能,DMA搬移和burst读写都没有添加。
关于第三点,通过示波器测量的结果是:双通道,通过片选抓数,测量16根数据线,当片选置位的时候数据线上的数组合而来的结果正和FPGA送出的数据一致。
关于时序,最终想达到的理想模型如图:


使用特权

评论回复
6
jlass| | 2013-8-21 15:33 | 只看该作者
原来你是用同步模式的啊
那你真的要和@guyan99 聊一下,他也是用同步模式读写的,而且应该是成功的。

使用特权

评论回复
7
21dinglei|  楼主 | 2013-8-21 15:41 | 只看该作者
jlass 发表于 2013-8-21 15:33
原来你是用同步模式的啊
那你真的要和@guyan99 聊一下,他也是用同步模式读写的,而且应该是成功的。
  ...

呵呵,聊过,他的代码还没有测试!CPU端已经写完了,貌似FPGA代码还没有写,所以,也没有结果!

使用特权

评论回复
8
21dinglei|  楼主 | 2013-8-21 15:46 | 只看该作者
jlass 发表于 2013-8-21 15:33
原来你是用同步模式的啊
那你真的要和@guyan99 聊一下,他也是用同步模式读写的,而且应该是成功的。
  ...

呵呵,聊过!他的代码还没有测试,貌似是CPU端代码已经完成,FPGA端的代码还没有完!也没有结果!

使用特权

评论回复
9
jlass| | 2013-8-21 16:51 | 只看该作者
FPGA_GPMC_CONFIG1~7的所有配置为你是否已经都清楚了
如果答案是否的话,建议你再看看
如果答案是是的话,我觉得已经什么可说的了

我的DM3730是接norflash的,异步读写,所以在配置上没有参考性

使用特权

评论回复
10
21dinglei|  楼主 | 2013-8-21 17:30 | 只看该作者
jlass 发表于 2013-8-21 16:51
FPGA_GPMC_CONFIG1~7的所有配置为你是否已经都清楚了
如果答案是否的话,建议你再看看
如果答案是是的话, ...

这几个CONFIG寄存器的配置datasheet说的比较明了,结合时序图来做相应的配置应该就不会有什么错!
你的代码应该就是网上上传的那个吧?如果是那个,我已经大概参考过,除config配置不一样外,其余操作基本一致。
如果有兴趣,我可上传我的代码给你看看!

使用特权

评论回复
11
jlass| | 2013-8-22 10:59 | 只看该作者
你看的是AM335X的驱动吧,不过gpmc部分和DM3730一样的
我的DM3730是一块开发板,有驱动也没用
不过我建议你可以把驱动放上来,毕竟这里是论坛,可能还有其他人能帮你呢

使用特权

评论回复
12
21dinglei|  楼主 | 2013-8-23 09:27 | 只看该作者
jlass 发表于 2013-8-22 10:59
你看的是AM335X的驱动吧,不过gpmc部分和DM3730一样的
我的DM3730是一块开发板,有驱动也没用
不过我建议你 ...

驱动代码在附件中,希望同志们能给出指导意见。 GPMC_FPGA.rar (2.83 KB)

使用特权

评论回复
13
21dinglei|  楼主 | 2013-8-27 09:17 | 只看该作者
看来同志们都比较忙!有空可再看看,问题依然是存在的!

使用特权

评论回复
14
21dinglei|  楼主 | 2013-8-29 20:03 | 只看该作者
还有就是:哪位同志调试过GPMC的同步burst模式?

使用特权

评论回复
15
f4335089| | 2014-2-22 12:43 | 只看该作者
我这边已经完成了GPMC接口的异步单次读、写通信模式的设计与验证。在你的单次读操作中未读到数据可能是由于RDaccesstime设计不正确导致,考虑增加RDaccesstime,并同时检查WRONBUStime在完成地址输入后结束,让出AD总线,总线转换后,由FPGA输出数据。

使用特权

评论回复
16
f4335089| | 2014-2-22 12:50 | 只看该作者
如果通过测试FPGA端数据已经给出,输入到了AD总线上,但ARM端打印出读取的数据总是0,那么也有可能是ARM端内存区域设置问题,打印的内存区域与读取数据写入的区域不一致导致。这个问题我们也遇到过!

使用特权

评论回复
17
renling| | 2014-8-20 15:39 | 只看该作者
感觉很深奥,努力学习吧

使用特权

评论回复
18
小大琦| | 2015-1-19 13:27 | 只看该作者
不知道您的问题有没有解决,可否将FPGA端代码给我学习一下??我最近也在搞这个通信

使用特权

评论回复
19
大肥猫| | 2015-10-20 10:28 | 只看该作者
请问一下,你给的这个程序里面这块FPGA是什么型号的?@21dinglei

使用特权

评论回复
20
阿南| | 2015-10-21 15:08 | 只看该作者
这个确实很难,只有做过才清楚,帮顶!
但愿楼主已经解决问题了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

12

帖子

1

粉丝