免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: linuxfellow
打印 上一主题 下一主题

[硬件及驱动] FPGA-based设备驱动 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2012-08-07 11:24 |只看该作者
lpc3250上用的是arm9.硬件方面应该没问题,我跑裸机程序该管脚每次操作都没问题。刚发现一个现象,我必须在内核中先使用io_p2v获得GPIO的地址,然后在内核中操作该管脚,如果不在内核中操作该管脚,应用程序中使用mem映射后,操作该管脚会直接死机,就是也没蹦出异常就直接卡住了。求解释

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
32 [报告]
发表于 2012-08-10 11:54 |只看该作者
回复 31# wawava
不好意思,这几天忙于其他事情,没上来这里:
当你调用mem后你可以打印查看所得到的线性地址,看mem是否成功. 如果成功,问题应该不大; 不成功就会死机

   

论坛徽章:
0
33 [报告]
发表于 2012-08-10 15:14 |只看该作者
回复 1# linuxfellow


都用第一种方法,不用每次编译驱动,直接在应用上操作,修改也比较方便,哈哈
   

论坛徽章:
0
34 [报告]
发表于 2012-08-11 16:38 |只看该作者
回复 32# linuxfellow
此问题已解决,我把操作gpio管脚的函数全部都放到内核中了。为什么不能在应用程序中操作gpio呢,我就是直接用mmap映射也会崩溃?

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
35 [报告]
发表于 2012-08-12 12:06 |只看该作者
回复 34# wawava
我在内核和应用都用过, 都能用。
如果可能,请把你的应用程序操作gpio代码贴出来,咱们可以一起看看。

   

论坛徽章:
0
36 [报告]
发表于 2012-08-13 11:40 |只看该作者
/* GPIO Module Register Structure */
typedef struct
{
volatile unsigned int p3_inp_state; /* Input pin state register */
volatile unsigned int p3_outp_set; /* Output pin set register */
volatile unsigned int p3_outp_clr; /* Output pin clear register */
volatile unsigned int p3_outp_state; /* Output pin state register */
} GPIO_REGS_T;

#define GPIO_PHY_SIZE (0x100000)
#define GPIO_BASE (0x40028000)

GPIO_REGS_T* m_gpioRegs;

static S32 m_gpioAddr=0; //GPIO地址


函数操作如下:
m_gpioAddr = (S32)mmap(0, GPIO_PHY_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, m_memDev, GPIO_BASE);
if(m_gpioAddr < 0)
{
LOGINFO0("gpioAddr fault!\n");
return ERR_NORAML_ERROR;
}
m_gpioRegs= (GPIO_REGS_T*)m_gpioAddr;

  m_gpioRegs->p3_outp_set |= (1<<17);//拉高管脚就是这句

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
37 [报告]
发表于 2012-08-13 20:38 |只看该作者
回复 36# wawava
用下面的代码试试:
        int int fd;
        fd = open("/dev/mem",O_RDWR);
        if ( fd < 0 ) {
                printf("error in /dev/mem \n");
                exit(1);
        }

m_gpioAddr = (S32)mmap(0, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO_BASE);
你mmap的memory size很大,为什么要这么多? 如果gpio寄存器对base address的偏移量在一页内,用getpagesize()map一页就行了。如果偏移量不在一页内,调整GPIO_BASE使偏移量在一页内

论坛徽章:
0
38 [报告]
发表于 2014-12-27 21:38 |只看该作者
Lz您好,mmap和ioremap都可以操作FPGA是吧,mmap是在用户空间,ioremap是在内核空间,能不能在内核空间向法FPGA设备写数据,然后在用户空间通过mmap映射,对地址来读数据呢?

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
39 [报告]
发表于 2015-02-04 20:27 |只看该作者
回复 38# zhiwenmuqing
可以,只要读写在相同的物理地址,映射到内核,就通过内核虚拟地址写入,映射到用户空间,就通过进程虚拟地址操作

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP