- 论坛徽章:
- 0
|
回复 #2 Roemer 的帖子
后来问题解决了,我直接操作NandFlash controller的寄存器来读取的参考了网上的一篇文档
http://hi.baidu.com/xydjh/blog/item/717cad54ffcf8e5dd1090682.html
代码如下
static ssize_t phyaddr_read (struct file *fp, char __user *buf, size_t size, loff_t * loff)
{
void __iomem *v_addr;
unsigned long column_addr,page_address;
ssize_t retval = 0;
int nf_cmd=0;
// int nf_addr;
int i;
char *tmp_buf=buf;
unsigned short id;
column_addr=(addr_offset+PHYADDR_ADDR)%512;
page_address=((addr_offset+PHYADDR_ADDR)>>9);
printk("phyaddr_rw.c: read-phyaddr=0x%lX\tcolumn_addr=0x%lX\tpage_address=0x%lX\tsize=%ld\n",
PHYADDR_ADDR+addr_offset,
(long)column_addr,
(long)page_address,
(long)size);
//Enable Chip
nand_chip_enable();
id=nand_chip_getid();
if(column_addr >=256)
nf_cmd=0x01;
else
nf_cmd=0x00;
v_addr = ioremap(NFCMD, 4);
__raw_writel(nf_cmd ,v_addr);
iounmap(v_addr);
v_addr = ioremap(NFADDR, 4);
__raw_writel(column_addr&0xff ,v_addr);
__raw_writel(page_address&0xff ,v_addr);
__raw_writel((page_address>>&0xff ,v_addr);
__raw_writel((page_address>>16)&0xff ,v_addr);
iounmap(v_addr);
v_addr = ioremap(NFDATA, 4);
udelay(200);
for(i=column_addr;i<column_addr+size;i++)
{
*tmp_buf++= __raw_readl(v_addr);
//udelay(500);
// printk("0x%02X ", __raw_readl(v_addr));
}
retval = size;
//Disable Chip
nand_chip_disable();
return retval;
}
其中循环读取的那一块如果换成Roemer 老兄说的方法
ioread8_rep(v_addr, tmpbuf,size);
if(copy_to_user(buf, tmpbuf, size))
{
warn("copy failure"
retval= -EFAULT;
}
是可以的,谢谢了啊。 |
|