分类: 嵌入式
2010-04-12 10:11:32
2440的初始化流程
(不知道2440中为什么会调用mach-smdk2410.c中的函数,而不调用mach-smdk2440.c中的,请知道的告知一声)
1、在mach-smdk2410.c中通过MACHINE_START、MACHINE_END宏
/*#define MACHINE_START(_type,_name) \
static const struct machine_desc __mach_desc_##_type \
__attribute_used__ \
__attribute__((__section__(".arch.info.init"))) = { \
.nr = MACH_TYPE_##_type, \
.name = _name,
#define MACHINE_END \
};*///
定义了一个结构体。
此结构体定义了machine_desc的变量,其中注册了smdk2410_map_io(), s
/*向系统注册一个machine_desc的对象*/
MACHINE_START(SMDK2410, "SMDK2410") /* @TODO: request a new identifier and switch
* to SMDK2410 */
MAINTAINER("Jonas Dietsche")
BOOT_MEM(S
BOOT_PARAMS(S
MAPIO(smdk2410_map_io)
INITIRQ(smdk2410_init_irq)
.timer = &s
MACHINE_END
2 smdk2410_map_io() 用来静态remap物理地址和虚拟地址, 初始化clock和uart, 调用顺序为: arch/arm/kernel/ setup.c: Setup_arch()->paging_init()->devicemaps_init()->mdesc->map_io()->smdk2410_map_io().
static void __init smdk2410_map_io(void)
{
s
//初始化了cpu id 确定了在cpu.c中是调用s
s
s
s
}
1) 首先调用s
S
S
S
S
如果我们要加入我们自己的映射,只要在smdk2410_iodesc[]添加就行了, 以后如果某个资源没有映射也可以在相应的驱动种用ioremap()来动态映射
2) s
时钟资源添加入系统后, 每个驱动在初始化时会到这个list中去着属于自己的clock并打开它.
3) 调用s
4) 最后调用s
3 s
4 smdk2410_init(): 调用顺序为: arch/arm/kernel/ setup.c
setup_arch():init_machine = mdesc-> init_machine () -> customize_machine() -> init_machine()->smdk_machine_init ()
void __init smdk_machine_init(void)
{
/* Configure the LEDs (even if we have no LED support)*/
s
s
s
s
/*设置默认的GPIO值*/
s
s
s
s
/*初始化nand设备信息, 在驱动里的probe中会用到*/
s
/*
* 把设备添加进系统里去,这样以后相应的驱动注册后就可以匹配到相关设备, 以后我们要添加什
* 么设备也可以添加到smdk_devs 数组中, smdk_devs 下的每个设备都静态定义好了它自己的所有
* 资源,包括寄存器地址, 中断号等, 在驱动probe到后就可以使用这些资源来操作这个设备了
*/
platform_add_devices(smdk_devs, ARRAY_SIZE(smdk_devs));
s
}