- 论坛徽章:
- 0
|
今天搞了个字符驱动,里面使用到了ioremap,
va=(unsigned long)ioremap(0x56000010,32); 0x56000010为寄存器的物理地址,va的结果为rGPBCON的虚拟地址,最后用writel(0,va)来写寄存器rGPBCON寄存器,结果都很正确。后来我用linux自带的宏定义
writel(0,S3C2410_GPBCON)来写寄存器,发现结果页正确。
后来我查看regs-gpio头文件发现有如下的宏定义:
#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,也就是rGPBCON寄存器的虚拟地址。但是我用printk打印va的值,发现va的值是0xc481e010为什么va和linux自带的宏定义的虚拟地址值不一样呢,linux通过宏定义的虚拟地址怎么同物理地址为 0x56000010寄存器联系起来的,是对应物理地址加上一定的偏移值得到的还是怎么的? |
|