文件arch/arm/mach-exynos/cpu-exynos4.c文件,实现物理地址到虚拟地址的映射,当系统初始化时,调用系统函数int __init exynos4_init(void)实现物理地址到虚拟地址的映射。
主要结构体:
struct map_desc {
unsigned long virtual; //虚拟地址
unsigned long pfn; //物理地址
unsigned long length; //空间大小
unsigned int type; //类型
};
例如:
{
.virtual = (unsigned long)S5P_VA_GPIO2, //0xF6000000+0x02240000
.pfn = __phys_to_pfn(EXYNOS4_PA_GPIO2), //物理地址 0x11000000
.length = SZ_4K,
.type = MT_DEVICE,
}
2.gpio初始化
文件drivers/gpio/gpio-exynos4.c实现gpio虚拟地址的初始化。
core_initcall 当系统启动初始化时被调用,初始化函数exynos4_gpiolib_init(void);
主要结构体:
struct s3c_gpio_chip {
struct gpio_chip chip;
struct s3c_gpio_cfg *config;
struct s3c_gpio_pm *pm;
void __iomem *base;
int irq_base;
int group;
unsigned int eint_offset;
spinlock_t lock;
#ifdef CONFIG_PM
u32 pm_save[4];
#endif
};
例如:
{
.base = (S5P_VA_GPIO2 + 0x100), //GPL2CON的控制虚拟地址
.eint_offset = 0x20, //io中断偏移
.group = 22, //GPIO分组
.chip = {
.base = EXYNOS4_GPL2(0), //GPIOL2有8个I0口,基地址
.ngpio = EXYNOS4_GPIO_L2_NR, //IO口数量
.label = "GPL2",
},
}
后期对GPL2(0)端口的设置,则只需要对虚拟地址EXYNOS4_GPL2(0)进行操作设置