MACHINE_START(VR1000, "Thorcom-VR1000")
/* Maintainer: Ben Dooks <ben@simtec.co.uk> */
.phys_ram = S3C2410_SDRAM_PA,
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
.boot_params = S3C2410_SDRAM_PA + 0x100,
.map_io = vr1000_map_io,
.init_irq = s3c24xx_init_irq,
.timer = &s3c24xx_timer,
MACHINE_END
這兩個是宏定義 原型為
#define MACHINE_START(_type,_name) \
const struct machine_desc __mach_desc_##_type \
__attribute__((__section__(".arch.info.init"))) = { \
.nr = MACH_TYPE_##_type, \
.name = _name,
#define MACHINE_END \
};
struct machine_desc 的原型為:
struct machine_desc {
/*
* Note! The first five elements are used
* by assembler code in head-armv.S
*/
unsigned int nr; /* architecture number */
unsigned int phys_ram; /* start of physical ram */
unsigned int phys_io; /* start of physical io */
unsigned int io_pg_offst; /* byte offset for io
* page tabe entry */
const char *name; /* architecture name */
unsigned long boot_params; /* tagged list */
unsigned int video_start; /* start of video RAM */
unsigned int video_end; /* end of video RAM */
unsigned int reserve_lp0 :1; /* never has lp0 */
unsigned int reserve_lp1 :1; /* never has lp1 */
unsigned int reserve_lp2 :1; /* never has lp2 */
unsigned int soft_reboot :1; /* soft reboot */
void (*fixup)(struct machine_desc *,
struct tag *, char **,
struct meminfo *);
void (*map_io)(void);/* IO mapping function */
void (*init_irq)(void);
struct sys_timer *timer; /* system tick timer */
void (*init_machine)(void);
};
MACH_TYPE_SMDK2410定義在arch/include/asm-arm/mach-types.h內(nèi),值為193.
/* arch/include/asm-arm/mach-types.h */
#define MACH_TYPE_SMDK2410 193
這個值是機器的類型值,編譯時由arch/arm/tool/mach-types里面定義的數(shù)據(jù)生成的。
/* arch/arm/tool/mach-types */
smdk2410 ARCH_SMDK2410 SMDK2410 193
由上發(fā)現(xiàn),MACHINE_START主要是定義了"struct machine_desc"的類型,放在 section(".arch.info.init"),是初始化數(shù)據(jù),Kernel 起來之后將被丟棄。
各個成員函數(shù)在不同時期被調(diào)用:
1. .init_machine 在 arch/arm/kernel/setup.c 中被 customize_machine 調(diào)用,放在 arch_initcall() 段里面,會自動按順序被調(diào)用。
2. init_irq在start_kernel() --> init_IRQ() --> init_arch_irq() 被調(diào)用
3. map_io 在 setup_arch() --> paging_init() --> devicemaps_init()被調(diào)用
其他主要都在 setup_arch() 中用到。