wawava 发表于 2012-08-07 11:24

lpc3250上用的是arm9.硬件方面应该没问题,我跑裸机程序该管脚每次操作都没问题。刚发现一个现象,我必须在内核中先使用io_p2v获得GPIO的地址,然后在内核中操作该管脚,如果不在内核中操作该管脚,应用程序中使用mem映射后,操作该管脚会直接死机,就是也没蹦出异常就直接卡住了。求解释

linuxfellow 发表于 2012-08-10 11:54

回复 31# wawava
不好意思,这几天忙于其他事情,没上来这里:
当你调用mem后你可以打印查看所得到的线性地址,看mem是否成功. 如果成功,问题应该不大; 不成功就会死机

   

highnjupt 发表于 2012-08-10 15:14

回复 1# linuxfellow


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

wawava 发表于 2012-08-11 16:38

回复 32# linuxfellow
此问题已解决,我把操作gpio管脚的函数全部都放到内核中了。为什么不能在应用程序中操作gpio呢,我就是直接用mmap映射也会崩溃?

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

回复 34# wawava
我在内核和应用都用过, 都能用。
如果可能,请把你的应用程序操作gpio代码贴出来,咱们可以一起看看。

   

wawava 发表于 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);//拉高管脚就是这句

linuxfellow 发表于 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使偏移量在一页内

zhiwenmuqing 发表于 2014-12-27 21:38

Lz您好,mmap和ioremap都可以操作FPGA是吧,mmap是在用户空间,ioremap是在内核空间,能不能在内核空间向法FPGA设备写数据,然后在用户空间通过mmap映射,对地址来读数据呢?

linuxfellow 发表于 2015-02-04 20:27

回复 38# zhiwenmuqing
可以,只要读写在相同的物理地址,映射到内核,就通过内核虚拟地址写入,映射到用户空间,就通过进程虚拟地址操作

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