设为首页 加入收藏

TOP

ARM Linux静态映射分析(三)
2014-11-24 08:20:29 来源: 作者: 【 】 浏览:1
Tags:ARM Linux 静态 映射 分析
mask = 1 << S3C2410_GPIO_OFFSET(pin);
} else {
mask = 3 << S3C2410_GPIO_OFFSET(pin)*2;
}


local_irq_save(flags);


con = __raw_readl(base + 0x00);
con &= ~mask;
con |= function;


__raw_writel(con, base + 0x00);


local_irq_restore(flags);
}


其中,比较关键的一个地方:
void __iomem *base = S3C2410_GPIO_BASE(pin);
这一行中,S3C2410_GPIO_BASE定义如下:


#define S3C2410_GPIO_BASE(pin) ((((pin) & ~31) >> 1) + S3C24XX_VA_GPIO)


至此,GPIO的静态映射就看得很明白了。


下面来看其他外设的静态映射:


在s3c24xx_init_io()函数中,除了iotable_init()以为,还会在最后调用,
(cpu->map_io)(mach_desc, size);


而CPU的这个map_io在arch/arm/mach-s3c2410/cpu.c里面定义如下:


static struct cpu_table cpu_ids[] __initdata = {
{
.idcode = 0x32410000,
.idmask = 0xffffffff,
.map_io = s3c2410_map_io,
.init_clocks = s3c2410_init_clocks,
.init_uarts = s3c2410_init_uarts,
.init = s3c2410_init,
.name = name_s3c2410
},
...
}


再查看s3c2410_map_io(),函数代码如下:


void __init s3c2410_map_io(struct map_desc *mach_desc, int mach_size)
{
/* register our io-tables */


iotable_init(s3c2410_iodesc, ARRAY_SIZE(s3c2410_iodesc));
iotable_init(mach_desc, mach_size);
}


接下来看结构s3c2410_iodesc [arch/arm/mach-s3c2410/s3c2410.c],代码如下,


/* Initial IO mappings */
static struct map_desc s3c2410_iodesc[] __initdata = {
IODESC_ENT(USBHOST),
IODESC_ENT(USBDEV),
IODESC_ENT(CLKPWR),
IODESC_ENT(LCD),
IODESC_ENT(TIMER),
IODESC_ENT(ADC),
IODESC_ENT(WATCHDOG),
};


赫然发现IODESC_ENT(TIMER)这一行,结合之前GPIO的类似分析,IODESC_ENT宏如下:
#define IODESC_ENT(x) { (unsigned long)S3C24XX_VA_##x, S3C2410_PA_##x, S3C24XX_SZ_##x, MT_DEVICE }


至此,TIMER, USBHOST,USBDEV,lcd,adc,watchdog等的静态映射都看得很明白了。


首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Python 连接 Oracle 示例 下一篇怎样用git获取指定的Android Linu..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·微服务 Spring Boot (2025-12-26 18:20:10)
·如何调整 Redis 内存 (2025-12-26 18:20:07)
·MySQL 数据类型:从 (2025-12-26 18:20:03)
·Linux Shell脚本教程 (2025-12-26 17:51:10)
·Qt教程,Qt5编程入门 (2025-12-26 17:51:07)