uint32_ttarget; uint32_tbaseband;
structboard_pmic_data pmic_info[MAX_PMIC_DEVICES]; uint32_tplatform_hlos_subtype; };
根据检测到的board infor加载相应的device tree。
3.2 platform_clock_init()
调用clk_init(msm_clocks_msm8909,ARRAY_SIZE(msm_clocks_msm8909))初始化时钟查询表
/* Clock lookup table */
static struct clk_lookup msm_clocks_msm8909[]= {
CLK_LOOKUP(\CLK_LOOKUP(\
CLK_LOOKUP(\CLK_LOOKUP(\
CLK_LOOKUP(\CLK_LOOKUP(\… }
3.3 qgic_init()
QGIC:Qualcomm GenericInterrupt Controller高通通用中断控制器
初始化QGIC,包括初始化QGIC的分配器(distributor)和初始化CPU具体的控制器。
3.4 qtimer_init()
获取定时器的频率
4. target_early_init()
这里就是串口初始化uart_dm_init(1, 0,BLSP1_UART0_BASE)---> uart_dm_init()
从时钟查找表msm_clocks_msm8909[]串口并配置其时钟频率、配置GPIO为串口、配置串口寄存器等。
5. bs_set_timestamp(BS_BL_START)
设置时间戳,这里的bs指boot stats,引导统计。
6. call_constructors()
构造函数相关初始化
bootloader的构造器一般完成的是初始化设备对象的操作,由于不同的系统在bootloader阶段需要初始化的设备不同,所以需要用户自己调用这些初始化函数。
根据函数名称,就是字面意思——调用构造器,构造器是定义在__ctor_list和__ctor_end之间的函数指针。至于__ctor_list和__ctor_end之间有哪些函数你可以看编译之后输出的map文件,或者链接脚本里面可能也有定义。
7. heap_init()
启动内核堆。
8. __stack_chk_guard_setup()
负责生成canary值
9. thread_init()
初始化线程系统。
10. dpc_init()
dpc:DelayedProcedure Call 延迟过程调用的缩写,初始化dpc系统,相关事件初始化、创建名字为dpc的线程并调用。
11. timer_init()
初始化lk定时器。
12. bootstrap2
thread_resume(thread_create(\DEFAULT_PRIORITY, DEFAULT_STACK_SIZE));
// enable interrupts exit_critical_section();
// become the idle thread thread_become_idle();
创建名字为bootstrap2的线程并调用,调用thread_become_idle()让当前线程处于idle状态。
bootstrap2()
备注:
LBA:logic blockaddress,逻辑块地址 staticintbootstrap2(void *arg){
dprintf(SPEW,\);
arch_init();
//initialize the rest of the platform
dprintf(SPEW,\); platform_init();
//initialize the target
dprintf(SPEW,\); target_init();
dprintf(SPEW,\); apps_init();
return0; }
arch_init()和platform_init()都是空函数
1. target_init() 1.1 spmi_init()
初始化SPMI(System Power Management Interface)总线控制器。 1.2 target_keystatus()
(1) 调用keys_init()初始化全局数据key_bitmap[]为0,此数据记录对应的按键是否被按键。