ARM Linux静态映射分析
unsigned int type; }; create_mapping( )函数就是通过map_desc提供的信息创建线性映射表的. 这样的话我们就知道了创建I/O映射表的大致流程为:只要定义相应I/O资源的map_desc结构体,并将该结构体传给iotable_init函数执行,就可以创建相应的I/O资源到内核虚拟地址空间的映射表了. 我们来看看s3c2410是怎么定义map_desc结构体的(即上面iotable_init()函数内的s3c_iodesc). [arch/arm/mach-s3c2410/cpu.c] IODESC_ENT宏如下: #define IODESC_ENT(x) { (unsigned long)S3C24XX_VA_##x, S3C2410_PA_##x, S3C24XX_SZ_##x, MT_DEVICE } 展开后等价于: static struct map_desc s3c_iodesc[] __initdata = { 至此,我们可以比较清晰看到GPIO被静态映射的过程,我们在前面的静态映射中已经做好了GPIO的映射,也就是我们写GPIO相关驱动的时候可以如下配置引脚的原因: 其实,s3c2410_gpio_cfgpin定义如下: void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function) if (pin < S3C2410_GPIO_BANKB) { local_irq_save(flags); con = __raw_readl(base 0x00); __raw_writel(con, base 0x00); local_irq_restore(flags); 其中,比较关键的一个地方: #define S3C2410_GPIO_BASE(pin) ((((pin) & ~31) >> 1) S3C24XX_VA_GPIO) 至此,GPIO的静态映射就看得很明白了. 下面来看其他外设的静态映射: 在s3c24xx_init_io()函数中,除了iotable_init()以为,还会在调用, 而CPU的这个map_io在arch/arm/mach-s3c2410/cpu.c里面定义如下: static struct cpu_table cpu_ids[] __initdata = { 再查看s3c2410_map |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |