通过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; |