我在驱动程序中用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,这两个值到底是怎么来的,为什么宏定义那里只要加一定的偏移就是对应的物理地址在内核中的虚拟地址呢?