wawava 发表于 2012-07-13 23:46

使用第一种方法把FPGA加载搞定了,第二种和第三种方法还没搞成功,看有些评论说直接用mem映射后的地址操作会有点慢,LZ有对比过没?
第二种方法只需要实现mmap函数不需要再ioremap吗?
我现在还是没搞明白究竟怎么才能把我运行在用户空间的应用程序中的函数注册成为中断处理函数,看网上说只有内核能处理中断,是这样吗?还是必须把中断处理函数写在内核里?看有文章说可以用signal(SIGIO,test_handler)?
LZ好人啊~~

EZWORD 发表于 2012-07-14 11:16

本帖最后由 EZWORD 于 2012-07-14 11:18 编辑

现在多数用第二种方法吧,至少见到的产品都是这样的。

在内核中使用do_mmap_pgoff(file,0,memsize,0x3,0x1,phyaddr>>PAGE_SHIFT);返回值到用户空间即可使用。

linuxfellow 发表于 2012-07-14 20:12

本帖最后由 linuxfellow 于 2012-07-14 20:15 编辑

回复 21# wawava
使用第一种方法把FPGA加载搞定了,第二种和第三种方法还没搞成功,看有些评论说直接用mem映射后的地址操作会有点慢,LZ有对比过没?
没比过, 你自己可以试试。

第二种方法只需要实现mmap函数不需要再ioremap吗?
mmap是把物理地址映射到用户空间,ioremap把物理地址映射到内核空间。看你的驱动操作在哪里实现。在用户空间就用前者,在内核空间就用后者。

我现在还是没搞明白究竟怎么才能把我运行在用户空间的应用程序中的函数注册成为中断处理函数,看网上说只有内核能处理中断,是这样吗?还是必须把中断处理函数写在内核里?看有文章说可以用signal(SIGIO,test_handler)?
中断处理函数不会属于你的应用程序。中断处理函数运行在中断上下文,不会在你的应用程序进程的上下文。如果你一定想要它运行在进程上下文,那也只能用在一个内核管理下的worker thread,不会是应用程序进程。
signal(SIGIO,test_handler)是一种异步通知方法。驱动软件检测到某个事件后, 就向应用程序发出信号,应用程序接受到信号后就调用handler进行处理。

   

linuxfellow 发表于 2012-07-14 20:24

本帖最后由 linuxfellow 于 2012-07-14 20:29 编辑

回复 22# EZWORD
有可能。但我现在倾向于第三种方法,很方便实现/sys接口。实现了sys接口后,不需要测试程序,直接从/sys接口里测试驱动是否工作。写应用程序的人,自己程序不工作时倾向于怀疑驱动有问题。碰到这种情况时,我马上就能从sysfs验证驱动是否工作。
如果用第二种方法,由于地址映射到用户空间,要写一个测试程序才能证明驱动是正确的。很繁琐

wawava 发表于 2012-08-04 10:27

fpga驱动已写好了,最近有个冒出个问题,就是我用mem映射gpio的地址后,对某一个管脚进行拉高。目前的现象时有时候恩能够拉高有时候拉不高。都是相同的代码,为什么有时候可以呢?我读此管脚的值每次都是一样的,此管脚是可读的,有可能是哪里的问题?

liuiang 发表于 2012-08-04 10:56

我也不是特别明白,不过我倾向于第三种,当然我也承认某些情况下,前两种会非常简单。

第一种,弱问,是否需要root权限啊,如果需要root权限的话,会大打折扣,不过在调试阶段会非常有用。

第二种,比较好用,但是如果遇到交互的情况,就很不直接,比如设置一个寄存器,然后等待fpga一个返回(比如返回一串数据),
----------那么会出现,先向用户空间写数据设置寄存器,然后用系统调用获得,fpga如果短时间可以处理还好,如果fpga需要一点时间处理,
----------然后通过中断通知,那就只能通过系统调用了,会比较怪异。另外最不爽的是:不好实现多个进程同时工作,当然这取决于应用环境。

第三种,算是最标准的作法,缺点是,调试阶段会比较郁闷,应用稍微大变又得重新搞。

所以,个人倾向于,如果要做单一产品,第三种,通用fpga平台,第二种。

linuxfellow 发表于 2012-08-05 20:08

本帖最后由 linuxfellow 于 2012-08-05 20:21 编辑

回复 25# wawava
你用的什么CPU? 有的CPU里管脚都有复合功能。要配置相应的继承器才能正确工作。

   

linuxfellow 发表于 2012-08-05 20:17

回复 26# liuiang
没想到权限问题,应用程序想用这一驱动,应该会有相应的权限吧。

   

wawava 发表于 2012-08-06 10:41

我用的lpc3250,我在内核中用io_p2v转换后的地址直接拉高管脚,你说的继承器究竟是什么东东啊?

linuxfellow 发表于 2012-08-06 12:47

回复 29# wawava
你说的cpu没用过,powerpc 如果有个管脚要配置成gpio, 对应的pad register(PCR)要对其功能进行配置, 如该管脚是输入还是输出,pull-up/pull-down电阻, 等要进行配置;仔细看看你的手册,看如何将一个管脚配置为gpio功能。

   
页: 1 2 [3] 4
查看完整版本: FPGA-based设备驱动