主题 : 有关ioremap的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 4327
精华: 0
发帖: 34
金钱: 210 两
威望: 106 点
综合积分: 68 分
注册时间: 2009-03-10
最后登录: 2014-09-10
楼主  发表于: 2010-01-25 14:40

 有关ioremap的问题

最近在做外设部分的驱动,用到了总线接口,选用NGCS5和ADDR2做为外设的片选信号和寄存器/数据控制信号,数据线连到DATA0~DATA15,写信号和读信号连到WE和OE上。
添加到字符设备上。
定义如下:
#define  cmd_addr  (0x28000000)
#define   dat_addr    (0x28000004)
unsigned long indexaddr;
unsigned long dataaddr;

映射虚拟地址:indexaddr=(unsigned long)ioremap(cmdaddr,4);
                            dataaddr=(unsigned long )ioremap(dataddr,4);
写数据到INDEX或者DATA后再读出,函数如下:
static void index_out(unsigned char comm)
{
      unsigned char temp;

       writeb(comm,indexaddr);//写index
       temp=readb(indexaddr);
       printk("%x\t",temp);
}

static void data_out(unsigned char data)
{
       writeb(data,dataaddr);//写data
       temp=readb(dataaddr);
       printk("%x\n",temp);
}
初始化时,按照request_mem_region->ioremap->init()->iounmap->release_mem_region的顺序写的。
init部分写了一串命令数据(例如:
index_out(0x01);
data_out(0x3d);
index_out(0x2b);
data_out(0x07);
等),但读出的数据并不和写的数据一样(有60%的读出是对的),读出的或者为0或者为其他的数。用writew,readw读写16位数据也一样。
不知道是什么问题?哪位帮忙分析一下是哪的问题。
[ 此帖被lily922在2010-01-27 08:38重新编辑 ]
级别: 侠客
UID: 3595
精华: 4
发帖: 53
金钱: 425 两
威望: 213 点
综合积分: 186 分
注册时间: 2009-01-20
最后登录: 2011-10-18
1楼  发表于: 2010-01-26 13:31
检查一下你的外设总线速率是多少?ARM的总线速度是很快的,也许是你的外设慢了。
级别: 新手上路
UID: 14401
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
综合积分: 14 分
注册时间: 2010-02-08
最后登录: 2012-05-30
2楼  发表于: 2010-02-21 18:23
楼主,请问问题解决了吗?是总线的时钟要调慢的问题吗?