在驱动开发时,我们都是以一块开发板为基础移植驱动程序。每一块开发板对应一个板级文件,如开发
TI AM335x系列,则对应board-am335xevm.c,这个文件完成芯片和板级的初始化工作。对于驱动开发,还有
一个很重要的文件devices.c,这个文件主要是设备接口相关资源。
今天就来说说board-am335xevm.c文件,如何全面的了解这个文件呢?先找到这个文件的入口,在文件的
最后几行:
MACHINE_START(AM335XEVM, "am335xevm")
/* Maintainer: Texas Instruments */
.atag_offset = 0x100,
.map_io = am335x_evm_map_io,
.init_irq = ti816x_init_irq,
.init_early = am335x_init_early,
.timer = &omap3_am33xx_timer,
.init_machine = am335x_evm_init,
MACHINE_END
看以看出,am335x_evm_map_io,i816x_init_irq,am335x_init_early,am335x_evm_init就是各个初始化函数
的总入口函数。
下面来分析一下这几个函数是如何被调用,何时被调用的?#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 \
};
宏展开之后得到:
static const struct machine_desc __mach_desc_AM335XEVM \
__attribute__((__used__)) \
__attribute__((__section__(".arch.info.init"))) = { \
.nr = MACH_TYPE_AM335XEVM, \
.name = _name,
.atag_offset = 0x100,
.map_io = am335x_evm_map_io,
.init_irq = ti816x_init_irq,
.init_early =