linux板级设备的初始化过程

下文参考了:http://blog.chinaunix.net/u3/102367/showart_2220188.html 原文是针对了s3c平台,由于最近在弄9260相关的工作,看了上篇文章,深受启发,感谢原博主。下面结合了9260的下面的mach代码,做一个相关的分析,作为自己的一个笔记吧。

 

linux板级设备的初始化过程

start_kernel() -> setup_arch(&command_line) -> mdesc = setup_machine(machine_arch_type) -> list = lookup_machine_type(nr) -> return struct machine_desc.

内核在启动的时候就是最先运行start_kernel() , 然后她就会调用体系结构相关的setup_arch(&command_line), 如arm体系结构的在arch/arm/kernel/setup.c中, 进一步,就要初始化板级相关的设备,   但在此之前, 必须找到这块目标板的描述结构, 所以她就先通过lookup_machine_type(nr)来查找这个结构, 传入的参数是又uboot传过来的, 存储在r2中.对与9260传入的参数AT91SAM9260EK,lookup_machine_type(nr) 就会找到如下的machine_desc. 这个结构在一个专门描述AT91SAM9260EK的文件在..arch/arm/mach-at91/board-ek.c中。

 

MACHINE_START(AT91RM9200EK, "Atmel AT91RM9200-EK")  /* Maintainer: SAN People/Atmel */
    .phys_io    = AT91_BASE_SYS,
    .io_pg_offst    = (AT91_VA_BASE_SYS >> 18) & 0xfffc,
    .boot_params    = AT91_SDRAM_BASE + 0x100,
    .timer        = &at91rm9200_timer,
    .map_io        = ek_map_io,
    .init_irq    = ek_init_irq,
    .init_machine    = ek_board_init,
MACHINE_END

 

 

关于宏MACHINE_START在arch/arm/include/asm/mach/arch.h文件中,

#define MACHINE_START(_type,_name)            /
static const struct machine_desc __mach_desc_##_type    /
 __used                            /
 __attribute__((__section__(".arch.info.init"))) = {    /
    .nr        = MACH_TYPE_##_type,        / 
    .name        = _name,

#define MACHINE_END                /
};

 

 

对于## 可以参考百度的define 说明,其实就是一个字符串的连接吧。

MACH_TYPE_##_type,     对于9260Ek来说就是 MACH_TYPE_AT91SAM9260EK , 此宏定义在/include/asm-arm/mach-types.h中,如下。

#define MACH_TYPE_AT91SAM9260EK        1099

 

对于ek_map_io、 ek_board_init,ek_init_irq 函数在实现在 board-ek.c中,主要完成设备注册,和中断的远射。关于中断的映射参考网上一个“ARM Linux 中断机制分析”的文档写的很好。 具体的实现函数在at91sam9260.c等文件中。

至此已实现了一个struct machine_desc常量,_mach_desc_AT91RM9200EK。

 

 

MACHINE_START主要是定义了"struct machine_desc"的类型,放在 section(".arch.info.init"),是初始化数据,Kernel 起来之后将被丢弃。

各个成员函数在不同时期被调用:
1. .init_machine 在 arch/arm/kernel/setup.c 中被 customize_machine 调用,放在 arch_initcall() 段里面,会自动按顺序被调用。
2. init_irq在start_kernel() --> init_IRQ() --> init_arch_irq() 被调用
3. map_io 在 setup_arch() --> paging_init() --> devicemaps_init()被调用
其他主要都在 setup_arch() 中用到。

 

你可能感兴趣的:(linux,timer,struct,IO,command,文档)