Android(3)
林耕书
Qualcomm MSM7627 平台 Boot浅析(1)
究浅意深android之实战篇系列
Mail:booklinbook@hotmail.com
TEL :13167032980
Agenda
大致介绍一下bootloader的概念
偷偷看一眼Qct Download的时候都烧了哪些东
西
结合代码顺一遍ARM9,ARM11的启动(boot)
根据现有查到的资料,罗列启动代码需要修改的
地方,并连猜带蒙谈谈各个修改点的作用。
Bootloader是什么,为什么需要bootloader?
(白板上说明,
以后补上)
QCT Download
看截图,听我说,大家点评。
Appsboot
Qcsbl boot
Oemsbl boot
Amss
Arm9端的烧写
Arm11 android端,用fastboot命令行来烧
Arm11 android
端的烧写
就两条命令:第一个命令中的boot.img不是
bootloader,而是linux kernel和ram disk。
名字取的不好。第二个命令烧的system.img
就是Android Root FS
谁生了谁,谁是谁生的?
Amss Arm9
的代码生成的Image们
Android Arm11
的代码生成的Image们
copy Appsboot.mbn和bootloader两个文件
是一模一样的,重命名了
一下而已。
上面罗列了一堆,现在结合
Qualcomm提供的这幅图,
我小结一下。听我口述。
QCSBL的主要工作是:
-Continue to setup the hardware. 继续对硬件进行设置。
- For NAND, find active multi-image boot block. 从nand中,查找出激
活的多镜像块。
- Load OEM-SBL header. 加载oemsbl镜像的头信息块(mibib
,后面
会介绍)。
- Load OEM-SBL image. 加载oemsbl镜像。
- Authenticate OEM-SBL.鉴定OEM-SBL镜像合法性。
- Execute OEM-SBL image.运行加载好的OEM-SBL模块。
- Load AMSS header.加载AMSS镜像的头信息块。
- Load AMSS image.加载AMSS镜像。
- Authenticate AMSS if required.鉴定AMSS镜像合法性,如果需要的话。
-Transfers control to the AMSS image 把控制权交给amss代码。
其中红字部分是关键点,右面结合代码,逐个分析。
OEMSBL干的活儿可多了,主要的我罗列几条:
- 根据平台的硬件特点,进一步对硬件和周边设备进行初始
化,比如对usb,mmu,bus ,mpu~~模块的初始化。
- Download过程的实现。Qct downloader 烧写代码时,手机
端就是oemsbl部分来配合烧写的。
-加载ARM11 appsboot,并唤起arm11.这个是最主要的功能。
后面结合oemsbl的代码在具体分析。
另:Appsboot是Arm11 Android端的启动代码。这部分要下次专门
ppt讲解,期待《浅析2》
Amss就是arm9 modem通讯协议模块了,这里就不做介绍了。
“Multi image” “Mibib” “ Image Header” ~~~
结合几副截图,我们再来讨论几个问题。(听我口述,ppt以后
补上)
qcsbl.s
oemsbl.s
oemsbl.s
qcsbl.s
From qcsbl.scl
qcsbl.scl
From Oemsbl.scl
oemsbl.scl
oemsbl_aarm_boot.c
oemsbl_mc.c
Image Header (hex)
oemsblhd.mbn
0x0d740000 代表oemsbl加载的起始地址
Little end
0x00062640 oemsbl image
大小
0x0d740000+ 0x00062640= 0xD7A2640
表示尾巴的地址
In targtfncknlym.h
#define SCL_EBI1_MEM_TOTAL_SIZE 0x10000000
#define SCL_MODEM_TOTAL_SIZE 0x2700000
#define SCL_MODEM_CODE_BASE ((SCL_EBI1_MEM_TOTAL_SIZE) - (SCL_MODEM_TOTAL_SIZE))
//0x10000000-0x2700000=0x0D900000
#define SCL_OEMSBL_TOTAL_SIZE 0x001C0000
#define SCL_OEMSBL_CODE_BASE ((SCL_MODEM_CODE_BASE) - (SCL_OEMSBL_TOTAL_SIZE))
//0xD900000-0x001C0000=0x0D740000
同理,看看其他几个Image Header
appsboothd.mbn
amsshd.mbn
typedef struct
{
image_type image_id;
uint32 header_vsn_num;
uint32 image_src
uint8* image_dest_ptr;
uint32 image_size;
uint32 code_size;
uint8* signature_ptr;
uint32 signature_size;
uint8* cert_chain_ptr;
uint32 cert_chain_size;
} mi_boot_image_header_type;
miheader.h
我连蒙带猜,
mibib是个什么东西,
文档中我没有找到。
这些header在加载时
就会起到定位的做用,
后面代码分析,就会看到。
这些header都是
image_header.exe生成的。
这参见(image_header.c).
Appsboot的header是android代码中
的mkheader工具生成的(mkheader.c)。
appsboothd.mbn
通过以上我吐沫横飞的讲解,估计大家应该稀里糊涂的
大致了解了一下,启动的流程,有哪些启动模块,他们
之间的关系是什么,各自做了什么动作。下面我们结合
代码介绍。并罗列出关键点供大家以后跟踪参考。
“打蛇打七寸,看启动代码找 G--Point(guan jian point)。从
qcsbl.s开始。”
结合代码顺一遍
AREA QCSBL_ENTRY, CODE, READONLY
CODE32
ENTRY
__main
_main
….
….
ldr r1, =qcsbl_main_ctl
blx r1
qcsbl.s
In qcsbl_mc.c
void qcsbl_main_ctl(void)
{
qcsbl_create_vector_table();
qcsbl_hw_init( &msm_hw_id );
if ( flash != NOR_FLASH )
{qcsbl_find_mibib( flash, &old_mibib_page_num,
&mibib_page_num );}
image_header.image_id = OEM_SBL_IMG;
qcsbl_load_header( flash,&image_header, mibib_page_num );
qcsbl_load_image( flash, &image_header );
sbl = (sbl_func_tbl_ptr_type)image_header.image_dest_ptr;
sbl->init( &qcsbl_interface );
qcsbl_create_bad_block_list( flash );
sbl->setup_trusted_platform();
sbl->pre_amss_load();
sw_vsn_id = (uint64) AMSS_SW_ID;
amss_func_ptr = (func_ptr_type)
qcsbl_load_amss_image( flash,&msm_hw_id,&sw_vsn_id);
sbl->post_amss_load();
(*amss_func_ptr)();
}
qcsbl_main_ctl
qcsbl_load_header();
qcsbl_load_image();
sbl->init();
加载oemsbl,运行oemsbl函数列表
qcsbl_hw_init硬件初始化
sbl->pre_amss_load();
加载Appsboot
arm11 android 被oemsbl启动
qcsbl_load_amss_image( );
加载amss iamge。
(*amss_func_ptr)();
运行amss Qcsbl骨架
PRESERVE8
AREA OEMSBL_FUNCTION_TABLE, DATA, READONLY
DCD oemsbl_bad_block_check
DCD oemsbl_read_page
DCD oemsbl_write_page
DCD oemsbl_is_erased
DCD oemsbl_erase_block
DCD oemsbl_error_handler
DCD oemsbl_init
DCD oemsbl_setup_trusted_platform
DCD oemsbl_pre_amss_load
DCD oemsbl_post_amss_load
DCD oemsbl_disable_data_cache
DCD oemsbl_re_enable_data_cache
DCD oemsbl_read_mpages
Oemsbl.s
qcsbl_load_header();
qcsbl_load_image();
sbl->init();
加载oemsbl,运行oemsbl函数列表
前面一页
sbl->pre_amss_load();
加载Appsboot
arm11 android 被oemsbl启动
前面一页
Oemsbl骨架
oemsbl_pre_amss_load() //加载arm11 的appsboot
oemsbl_load_aarm_bootloader,
oemsbl_create_aarm_partition_tbl,
..
oemsbl_boot_aarm //启动arm11
oemsbl_init oemsbl_init_func_tbl[i](); 硬件进一步初始化
oemsbl_dload_check //qct download 下载相关。
oemsbl_setup_trusted_platform() //给arm11运行建立一个良好的环境
还有很多底层的琐碎的设置,如 axi mpu ram
Usb charge~~~ 这里不列出来。
In oemsbl_aarm_boot.c
//加载 appsboot
void oemsbl_load_aarm_bootloader( void )
{…
/* Load the aARM boot loader header from flash into RAM. */
image_header.image_id = APPSBL_IMG;
qcsbl_ptr->load_image_header( qcsbl_ptr->boot_flash,
&image_header,
qcsbl_ptr->active_mibib_page_number );
….
apps_image_start_addr = (uint32) image_header.image_dest_ptr;
….
}
口头讲解
In oemsbl_aarm_boot.c
//启动arm11
void oemsbl_boot_aarm( void )
{
HWIO_OUTM( MSM_RAIL_CLAMP_IO,
HWIO_FMSK( MSM_RAIL_CLAMP_IO, VDD_APC_CLAMP ),
0x0 );
..
HWIO_OUTM( A11_RESET,HWIO_FMSK( A11_RESET, POR ),
0x0 );
..
HWIO_OUT( APPS_ARM_DEBUG_CTL, 0x01 );
..
HWIO_OUT( A11_RESET, 0x0 );
} /* oemsbl_boot_aarm() */ 口头讲解
Amss修改点的研究
前面是对 arm9 启动部分做一个粗超的讨
论,给大家一个整体的认识。
但对于一个具体项目来说,认识整体还不
够,我们还要根据项目具体要求和硬件特性,
修改arm9 amss代码,让系统工作起来。下
面就来一起讨论这个问题。
时间有限这个部分下次接着讲。Seeyou byebye
Android(3)
Agenda
QCT Download�
结合代码顺一遍
Amss修改点的研究