主题 : ioremap的问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 1852
精华: 0
发帖: 21
金钱: 195 两
威望: 183 点
综合积分: 42 分
注册时间: 2008-10-06
最后登录: 2012-12-02
楼主  发表于: 2009-07-17 23:41

 ioremap的问题

我在驱动程序中用writel来给物理地址为0x56000010的寄存器赋值(GPBCON寄存器),用va=(unsigned long)ioremap(0x56000010,32)来获得0x56000010对应的虚拟地址,在writel(dat,va);
后来使用regs-gpio里面的宏定义来写这个数据writel(dat,S3C2410_GPBCON)结果也是一样的。
后来查阅源文件发现有如下的宏定义:
#define S3C2410_GPBCON           S3C2410_GPIOREG(0x10)
#define S3C2410_GPIOREG(x) ((x) + S3C24XX_VA_GPIO)
#define S3C24XX_VA_GPIO           S3C2410_ADDR(0x00E00000)  map.h
#define S3C2410_ADDR(x)          ((void __iomem *)0xF0000000 + (x))

最后S3C2410_GPBCON的值为0xf0e00010,
但是我打印va的地址确实0xc481e010,这两个值到底是怎么来的,为什么宏定义那里只要加一定的偏移就是对应的物理地址在内核中的虚拟地址呢?
级别: 新手上路
UID: 3536
精华: 0
发帖: 32
金钱: 280 两
威望: 198 点
综合积分: 64 分
注册时间: 2009-01-16
最后登录: 2011-11-04
1楼  发表于: 2009-09-21 16:32
LDD3上说ioremap得到的值不应该直接引用

求高人解释……
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
2楼  发表于: 2009-09-21 17:09
引用第1楼fin_mai于2009-09-21 16:32发表的  :
LDD3上说ioremap得到的值不应该直接引用

求高人解释……

太久以前看的了,不记得了...
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."