主题 : 内核中的S3C64XX_GPNDAT宏展开后得到的地址跟硬件手册中的不一样? 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 51637
精华: 0
发帖: 40
金钱: 205 两
威望: 41 点
综合积分: 80 分
注册时间: 2011-07-05
最后登录: 2015-10-08
楼主  发表于: 2012-03-04 19:08

 内核中的S3C64XX_GPNDAT宏展开后得到的地址跟硬件手册中的不一样?

前几天看了下TINY6410光盘中自带的2.6.38内核中的按键驱动程序,有读取IO内存的句子,地址为宏S3C64XX_GPNDAT,我无聊在SI跟进去展开了一下宏,可是发现宏展开后的地址跟6410硬件手册中的GPNDAT地址不一样。

下面是我在SI中跟着展开的宏定义:

#define S3C64XX_GPNDAT            (S3C64XX_GPN_BASE + 0x04)
#define S3C64XX_GPN_BASE    S3C64XX_GPIOREG(0x0830)
#define S3C64XX_GPIOREG(reg)    (S3C64XX_VA_GPIO + (reg))
#define S3C64XX_VA_GPIO        S3C_ADDR_CPU(0x00000000)
#define S3C_ADDR_CPU(x)    S3C_ADDR(0x00500000 + (x))
#define S3C_ADDR(x)    (S3C_ADDR_BASE + (x))
#define S3C_ADDR_BASE    0xF6000000

算出来展开为:(((0xF6000000 + (0x00500000 + (0x00000000))) + (0x0830)) + 0x04)

而硬件手册中的GPNDAT地址为 0x7F008834

两个不相等,但是这个按键驱动是可以正常驱动硬件的。请问是怎么回事?

级别: 新手上路
UID: 44460
精华: 0
发帖: 16
金钱: 80 两
威望: 16 点
综合积分: 32 分
注册时间: 2011-04-25
最后登录: 2015-08-04
1楼  发表于: 2012-03-05 00:37
一个是虚拟地址  一个是物理地址
级别: 新手上路
UID: 51637
精华: 0
发帖: 40
金钱: 205 两
威望: 41 点
综合积分: 80 分
注册时间: 2011-07-05
最后登录: 2015-10-08
2楼  发表于: 2012-06-09 22:30
那这个虚拟地址和物理地址是怎么映射的?   
级别: 新手上路
UID: 78735
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
综合积分: 2 分
注册时间: 2012-09-24
最后登录: 2013-03-02
3楼  发表于: 2013-02-27 21:10
我觉得 S3C64XX_GPNDAT = ioremap(0x7F008834, 4);
如果不用这个宏,就要手动调用ioremap函数来获得虚拟地址
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
4楼  发表于: 2013-02-27 22:00

 回 3楼(goodhzz) 的帖子

基本上是这样
"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."