1. preloader的编译及源码
1.1 编译
./mk r pl
1.2 源码目录
preloader的代码在如下两个目录中:
./mediatek/custom/hqunited72_we_72_kk/preloader
./mediatek/platform/mt6572/preloader
2. preloader解析
2.1 开始
./mediatek/platform/mt6572/preloader/src/init/init.s
-
a. 中断向量表
-
b. SVC32 mode
-
c. disable interrupt
-
d. 关dcache与icache
-
e. 关smp
-
f. enable I+Z+SMP bits and disable D bit
-
g. clear_bss
-
h. setup_stk
-
i. B main
2.2 main中
./mediatek/platform/mt6572/preloader/src/core/main.c
-
main
-
--> bldr_pre_process
-
--> platform_pre_init
-
--> ptp_init
-
--> mtk_pll_init
-
--> mtk_uart_init
-
--> pmic_init
-
-
--> platform_init
-
--> mtk_wdt_init
-
--> set_kpd_pmic_mode
-
--> mt_mem_init //mcp的初始化
-
--> boot_device_init
-
-
-
--> part_init
-
--> boot_device_init之后,从boot device中读取分区表
-
--> 这个分区表就是MT6572_Android_scatter.txt
-
--> sec_lib_init
-
--> mtk_uart_init //串口的初始化
-
-
--> bldr_handshake
-
--> 正常boot的情况下usb枚举完,需要
-
-
--> bldr_load_part
-
--> 前面part_init己经读取了分区表,这儿按分区将lk(即uboot所在的分区)
-
--> 从设备读取到DRAM的0x80020000 (mem)处
-
--> 读lk.bin时先读前512字节,解析出lk.bin的数据长度
-
--> 然后再把lk.bin中所有的数据读到DRAM中,而不是直接读取整个分区
-
-
-->bldr_post_process
-
--> 将bootargs放在固定的内存地址处
-
-
-->bldr_jump
-
--> 跳转到0x80020000处,参数的地址是BOOT_ARGUMENT_ADDR
三.文件lk.bin解析
1. 16进制打开lk.bin
-
0000000: 8816 8858 701d 0400 4c4b 0000 0000 0000 ...Xp...LK......
-
0000010: 0000 0000 0000 0000 0000 0000 0000 0000 ................
-
0000020: 0000 0000 0000 0000 ffff ffff ffff ffff ................
-
...
-
00001f0: ffff ffff ffff ffff ffff ffff ffff ffff ................
[0-3]: 8816 8858 -->magic :0x58881688
[4-7]: 7013 0400 --> dsize :0x041370
[8-40]: 4c4b 0000 ... --> name: LK
[40-43]: ffff ffff --> maddr: 这个地址没有用到
关于文件长度:
267632 = 267120+512
-
cong@msi:/work/mtk/6572$ ls -l out/target/product/hqunited72_we_72_kk/lk.bin
-
-rw-rw-r-- 1 cong cong 267632 Nov 12 17:46 out/target/product/hqunited72_we_72_kk/lk
2.
关smp的汇编代码
-
.globl apmcu_disable_smp
-
apmcu_disable_smp:
-
MRC p15,0,r0,c1,c0,1
-
BIC r0,r0,#0x040 /* SMP bit */
-
MCR p15,0,r0,c1,c0,1
-
BX lr
阅读(1906) | 评论(0) | 转发(0) |