转载请注明原文地址:http://blog.csdn.net/ts_dchs/article/details/50246543
1 流程分析
(本节以s5pv210(ARM A8) of Linux 3.0.26为例)
Linux提供外设IO内存物理地址到Linux虚拟地址的静态映射。静态映射是指通过map_desc结构体静态创建I/O资源映射表。
struct map_desc
[code]结构体包含虚拟地址,设备物理地址。常用于寄存器资源映射,这样静态映射之后在编写内核代码或驱动时就不需要再ioremap。系统启动时创建好静态映射,程序直接通过映射后的虚拟地址去访问它们。
先说启动时做初始化的工作。内核提供了一个重要的结构体struct machine_desc
[code] ,内核通过machine_desc结构体来控制系统体系架构相关部分的初始化。为了初始化工作,包括map_io, init_irq, init_machine以及phys_io , timer成员等。
这里的map_io成员即内核提供给用户的创建外设I/O资源到内核虚拟地址静态映射表的接口函数。map_io成员函数会在系统初始化过程中Start_kernel -> setup_arch() –> paging_init() –> devicemaps_init()中被调用。结构体通过MACHINE_START
[code]宏初始化。这部分根据平台不同设计。
//LinuxSrc/arch/arm/mach-s5pv210/mach-smdkv210.c
MACHINE_START(SMDKV210, "SMDKV210")
/* Maintainer: Kukjin Kim <[email protected]> */
.boot_params = S5P_PA_SDRAM + 0x100,
.init_irq = s5pv210_init_irq,
.map_io = smdkv210_map_io,
.init_machine = smdkv210_machine_init,
.timer = &s5p_timer,
MACHINE_END
在上面的代码中,map_io
初始化为smdkv210_map_io
code。如下:
//LinuxSrc/arch/arm/mach-s5pv210/mach-smdkv210.c
static void __init smdkv210_map_io(void)
{
s5p_init_io(NULL, 0, S5P_VA_CHIPID);
s3c24xx_init_clocks(24000000