高通有两个cpu,他们分别跑不同的系统,应用程序(ap)端是android系统,modem 端是高通自己的系统。
要编译出可供烧写使用的镜像文件需要三部分代码:
1) 获取经过高通打补丁的 android 源代码
2) 获取高通针对不同处理器的 vendor 源代码
3) 获取 modem 源代码
高通的开发板子为例,看如何选择源代码,通过 QPST 连接高通的开发板,我们可以看到他的配置信息
BREW 无线二进制运行时环境.BREW 是一个位于嵌入式芯片操作系统之上的抽象层,它能够提供对一些低级功能、环境变量和子程序的访问功能。
mbn类型文件时最终要烧写到板子上的镜像文件。
modem代码编译结果:
其中 adsp.mbn,amss.mbn,dbl.mbn,osbl.mbn,partition.mbn 位于以下目录:
./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/adsp.mbn
./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/amss.mbn
./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/dbl.mbn
./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/osbl.mbn
./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/partition.mbn
appsboot.mbn,boot.img,system.img,userdata.img 位于以下目录:
./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/appsboot.mbn
./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/boot.img
./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/system.img
./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/userdata.img
./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/system.img.ext3
./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/userdata.img.ext3
要烧录的镜像文件:
烧录的镜像文件appsboothd.mbn appsboot.mbn boot.img system.img userdata.img persist.img
来自 android 源码appsboot.mbn 的主要功能是装载 linux 内核,通过 linux 的引导来完成 android 系统的加载。
appsboot.mbn的生成过程
make out/target/product/msm7630_surf/appsboot.mbn
make out/target/product/msm7630_surf/nandwrite
make out/target/product/msm7630_surf/emmc_appsboot.mbn
boot.img->kernel+ramdisk
1 kernel:arm/boot/zImage
2 ramdisk:make out/target/product/msm7630_surf/ramdisk.img showcommands
手动生成 boot.img 需要使用命令 mkbootimg ,语法如下:
mkbootimg --kernel 内核 --ramdisk ramdisk镜像 --cmdline 命令行 --base 基地址 --pagesize 大小 --output 输出的boot.img
appsboot.mbn:目录 bootable/bootloader/lk 下
env.MbnBuilder过程解析:
mbn 类型的文件是我们最终烧写到板子上的镜像文件
在文件: ./AMSS/products/7x30/core/bsp/build/scripts/mbn_builder.py 中有 mbn 文件的编译规则,要注意的是,不同的 modem 源代码版本,它里面的规则有可能不一样
partition规则解析:
eMCC 启动和 NAND 启动的分区格式是不一样的,如果是 eMCC 启动,多了编译选项:
USES_SDCC_BOOT=yes USES_HSU_MS_FD_BOOT=yes
如果 USES_HSU_MS_FD_BOOT=yes
=== Compiling boot/osbl/fd_storage_scsi.c
=== Compiling boot/osbl/fd_storage_usb.c
如果 USES_SDCC_BOOT=yes
那么会进行 partition 规则的处理,它会覆盖掉 corebsp_build 规则阶段生成的 partition.mbn
./AMSS/products/7x30/build/ms/dmss_rules.min
partition 规则主要完成以下功能:
1) 编译 ./AMSS/products/7x30/core/storage/tools/jsdcc/partition_load_pt 代码,生成 loadpt 和 msp
2) 解析 loadpt 解析 partition.xml 文件,把分区信息保存成二进制文件 partition.bin
3) 由 partition.bin 文件生成 partition.mbn,然后拷贝到 ./AMSS/products/7x30/build/ms/bin/AAABQMAZ/partition.mbn
高通平台 7630 启动流程分析
1.4 高通平台 7630 启动流程分析
开机后,首先从 rom 中的 pbl 开始执行,pbl 装载 dbl
pbl 是固化在高通芯片中的一段程序,没有相应的源代码。
pbl运行以后,它会装载 dbl,dbl是从其__main 函数开始执行,此函数在汇编文件 dbl.s 中.
经过一系列的初始化,dbl 会把控制权传递给 osbl
osbl 通过 osbl_main_procs 中定义的 osbl_load_appsbl 函数把应用程序的控制权交给了android 系统,modem 端的控制权通过 bl_shared_data.amss_entry_ptr() 交割 AMSS,他们分别在两个处理器上同时运行,两个处理期间通过 smd 进行通信。
obsi{
//初始化 迷你usb 充电硬件
osbl_hw_init
//在 osbl 阶段会提升系统时钟
#ifndef RUMIBUILD
osbl_increase_clk_speed,
#endif
//初始化 osbl 模并且锁住接口
osbl_init_modules,
初始化 flash 设备
osbl_flash_init,
//检测是否通过sd卡更新镜像文件
osbl_sd_image_upgrade,
//初始化数据结构,以便装载 AMSS 镜像
osbl_init_amss_image,
#endif /* FEATURE_FOTA */
//amss 镜像进行授权鉴定
osbl_auth_amss_image,
//如果有 adsp 那么进行相应处理
#ifdef FEATURE_OSBL_LOAD_AND_BOOT_ADSP
//装载 adsp 镜像
osbl_load_adsp,
//授权
osbl_auth_adsp,
#endif
#ifdef FEATURE_SDCC_BOOT
//装载 amss 镜像
osbl_load_amss_image,
#endif
#ifndef FEATURE_STANDALONE_MODEM
//从flash 设备装载 appsboot
osbl_load_appsbl,
//从flash中装载 OS 镜像
* Load the OS image from flash
osbl_load_apps_os,
//引导 aARM 处理器
osbl_boot_aarm,
#endif /* FEATURE_STANDALONE_MODEM */
对于 nand 启动,AMSS 应该在 apps 引导以后再装载
#ifndef FEATURE_SDCC_BOOT
// nand 启动,装载 amss 镜像
osbl_load_amss_image,
#endif
更新到:
{
1.4.5 appsbl 流程(源代码在 android中)
appsbl 是 applications ARM boot loader 的简称,不同的软件框架,此分区来自不同的源代码
}
高通手机开发过程大揭秘
Qualcomm手机开机全过程大揭密