现在的CPU都固化了内部 ROM,内部 ROM中有一般都有一段程序,一般有如下几个功能:

1,初始化,部分外设,如USB,SDCARD

2,初始化DDR(内存)和NandFlash

3,加载boot(这个阶段的boot)

A20启动代码流程分析:

1:全志的启动包括boot0,boot1,u-boot,boot0与boot1源码在lichee/boot/目录下,   机器上电执行boot0,boot0

A20启动代码流程分析:

1:全志的启动包括boot0,boot1,u-boot,boot0与boot1源码在lichee/boot/目录下,

机器上电执行boot0,boot0就会引导boot1,boot1再引导u-boot。

2:在lichee/boot/目录下的Makefile文件指定了boot1的编译目录,例如

make -f make_sdmmc  -C boot1/core -j8命令就是调用lichee/boot/boot1/core目录下make_sdmmc脚本编译,

make_sdmmc最终又调用make.cfg脚本编译,所以lichee/boot/目录下的Makefile文件指定的编译路径最终都会

调用各自目录下的make.cfg来编译。

3:使用make_nand与make_sdmmc脚本是core目录生成的boot1_nand.bin与boot1_sdcard.bin,同时在

lichee/boot/workspace/egon/与lichee/tools/pack/chips/sun7i/eGon/目录生成,他们分别调用

lichee/boot/boot1/driver/drv_nand/与lichee/boot/boot1/driver/drv_sd/目录下的文件;

boot1_nand.bin与boot1_sdcard.bin分别对应启动模式:nandflash与inand启动,配置文件是在

lichee/boot/pack/chips/sun7i/configs/android/目录下相应的文件指定,其中storage_type字段指定,

2为inand启动,—1为nandflash启动;Boot_Android是正常启动模式,Boot_Burn是调试模式,Card_Android

是升级模式,他们分别生成boot.axf,prvt.axf与sprite.axf镜像,同时在

lichee/boot/workspace/wboot/bootfs/与lichee/tools/pack/chips/sun7i/wboot/bootfs/目录生成;

lichee/boot/boot1/driver/drv_de/目录是多媒体库源码,是Lcd与HDMI等显示源码,同时在

lichee/boot/workspace/wboot/bootfs/与lichee/tools/pack/chips/sun7i/wboot/bootfs/目录生成

drv_de.drv镜像。

4:arm_start.S(boot1/core/arm_board)->eGon2_swi_handler->eGon2_swi_handler_entry->eGon2_init->

eGon2_start->eGon2_storage_type_set(判断启动模式,加载boot.axf或者sprite.axf),eGon2_run_app->

FS_fread(加载.axf文件),elf_loader[*entry = (__u32)priv->main;],func(argc, argv)[该函数就是

BootMain()的指针]->BootMain。

(1)正常启动模式:

BootMain->BoardInit_Display[加载drv_de.drv,判断显示模式,LCD,TV,HDMI等],check_power_status[

检测电压与电池状态,判断是否开机],BootOS_detect_os_type[加载u-boot.bin,PreBootOS->

boot_dsipatch_kernal[设置u-boot的物理地址是*kernal_addr = 0x4a000000]->wBoot_fopen("c:\\linux\\u-boot.bin", "rb")],

BootOS[wBoot_jump_to_linux->EGON2_SWI_JUMP_TO_LINUX->eGon2_jump_to_android_linux直接进入u-boot

接口]。

(2)升级模式:

BootMain->boot_ui_init[加载drv_de.drv,判断显示模式,LCD,TV,HDMI等],card_sprite->

update_flash_hardware_scan[扫描当前存储设备是nand还是inand,update_boot0,update_boot1,

根据sprite_type判断升级nand还是inand]。

5:(1)lichee/tools/pack/pack脚本打包镜像文件。

(2)编译kernel的时候首调用./build.sh -p sun7i_android->buildroot/scripts/common.sh->

lichee/linux-3.3/build.sh->lichee/buildroot/scripts/build_sun7i_android.sh编译。

在编译kernel的时候也编译也u-boot,调用./build.sh -p sun7i_android->buildroot/scripts/common.sh->

lichee/u-boot/build.sh编译。

6:lichee/boot/pack/chips/sun7i/wboot/bootfs.ini或lichee/tools/pack/chips/sun7i/wboot/bootfs.ini

把文件系统盘符映射成C盘,就是代码中使用的c:\\boot.ini","c:\\sprite.axf"等。

lichee/tools/pack/chips/sun7i/configs/android/default/下有env.cfg与image.cfg配置文件,

env.cfg是u-boot使用的配置文件,包括nand_root,mmc_root,loglevel,bootcmd等参数;

image.cfg是boot使用的文件列表与ITEM_ROOTFSFAT32等重要符号。

7:sys_partition.fex文件中各个分区与下载对应的文件如下:

bootloader分区保存bootloader.fex,bootloader.fex就是由boot.axf u-boot.bin等组成。

env分区保存env.fex,env.fex就是lichee/tools/pack/chips/sun4i/configs/crane/default/env.cfg文件,它是u-boot的基本配置。

boot分区保存boot.fex,boot.fex是boot.img的链接,它由kernel与ramdisk组成,使用fastboot下载的时候就是下载boot.img。

system分区保存system.fex,system.fex是system.img的链接,它是android系统,使用fastboot下载的时候就是下载system.img。

recovery分区保存recovery.fex,recovery.fex是recovery.img的链接,它也是由kernel与ramdisk组成,用于系统恢复,使用fastboot下载的时候就是下载recovery.img。

misc分区用于恢复系统设置的时候在uboot中保存一些变量与命令的值。

*.fex文件在lichee/tools/pack/out/目录,*.img在anroid/out/...下。

8:A20的分区如下:

--------fastboot partitions--------

-total partitions:11-

-name-        -start-       -size-

bootloader  : 8000          8000

env         : 10000         8000

boot        : 18000         8000

system      : 20000         100000

data        : 120000        100000

misc        : 220000        8000

recovery    : 228000        10000

cache       : 238000        80000

private     : 2b8000        8000

databk      : 2c0000        80000

UDISK       : 340000        3e0000

-----------------------------------

其中UDISK就是作为SDCARD分区,bootloader是从16MB开始,在bootloader的前面是

16KB的MBR_SIZE与16KB的DL_SIZE。

9:各个镜像的对应的内存地址:

在read_boot_img()或者do_boota()都可以打印这些信息。

u-boot的地址为0x4a000000,在boot_dsipatch_kernal函数里强制赋值,也在该函数里

使用wBoot_fopen("c:\\linux\\u-boot.bin", "rb")与wBoot_fread((void *)(*kernal_addr), 1, file_length, hd_file)

把u-boot.bin从存储设备加载到0x4a000000内存地址,之后boot1从BootOS(para_addr, kernal_addr)

跳转到u-boot。

*kernal_addr = 0x4a000000。

kernel地址为0x40008000,ramdisk地址为0x41000000,在CONFIG_EXTRA_ENV_SETTINGS

中的boota 40007800其实是把boot.img下载到内存中的地址,由于boot.img中包含了

kernel与ramdisk,也包含了这两个镜像在内存中的地址,还有检查boot.img的magic

是不是ANDROID,从存储设备加载这个两个镜像到内存的操作是在read_boot_img函数里,

在u-boot是do_boota函数里再次检查boot.img的合法性。

全志 android 编译,全志A20启动代码流程分析 ——Android相关推荐

  1. 全志android 编译,全志A20启动代码流程分析 ——Android

    现在的CPU都固化了内部 ROM,内部 ROM中有一般都有一段程序,一般有如下几个功能: 1,初始化,部分外设,如USB,SDCARD 2,初始化DDR(内存)和NandFlash 3,加载boot( ...

  2. Android SoftAp SoftAp打开/关闭代码流程(基于android 7.0)

    在Android手机中,SoftAp也是一个较为常用的功能.对于framework开发者来说,要开发.维护SoftAp,了解framework中热点开关的具体流程是非常有必要的.下面就对这部分内容做一 ...

  3. Android 蓝牙 搜索周围设备代码流程分析-framework到协议栈流程

    本文详细的将Android 蓝牙扫描周围设备流程进行了梳理,从UI开始扫描到协议栈发送扫描命令到controller,进行了源码分析. 更多源码分析: android-蓝牙A2dp-avrcp-hfp ...

  4. android uefi 编译报错,【Android SDM660开机流程】- UEFI XBL 代码流程分析

    [Android SDM660开机流程]- UEFI XBL 代码流程分析 一.UEFI XBL 1.1 boot_images代码目录 1.2 UEFI代码运行流程 1.3 SEC (安全验证) 1 ...

  5. Android 中的WiFi学习笔记(转载)----WIFI启动 代码流程走读---网络连接流程

    Android的WiFi 我们通常看到WiFi的守护进程wpa_supplicant在我们的ps的进程列表中,这个就是我们的wifi守护进程.wpa_supplicant在external/wpa_s ...

  6. android加载efi分区,高通Android UEFI XBL 代码流程分析

    高通Android UEFI XBL 代码流程分析 背景 之前学习的lk阶段点亮LCD的流程算是比较经典,但是高通已经推出了很多种基于UEFI方案的启动架构. 所以需要对这块比较新的技术进行学习.在学 ...

  7. 【SemiDrive源码分析】【X9芯片启动流程】26 - R5 SafetyOS 之 LK_INIT_LEVEL_TARGET 阶段代码流程分析(TP Drvier、Audio Server初始化)

    [SemiDrive源码分析][X9芯片启动流程]26 - R5 SafetyOS 之 LK_INIT_LEVEL_TARGET 阶段代码流程分析(TP Drvier.Audio Server初始化) ...

  8. QQ音乐Android编译提速之路,2021年Android大厂面试

    2. 问题分析 ====================================================================== 本地开发过程中,我们会不断重复 修改代码- ...

  9. netts之 CTWSocket代码流程分析(整体是客户端请求式的)

    netts之 CTWSocket代码流程分析(整体是客户端请求式的) 1.外部程序载入调用 netts.dll 2.外部程序调用 netts实现的Stock_Init_Nodialog,(Stock_ ...

最新文章

  1. C#重点知识详解(一) 选择自 masterall 的 Blog
  2. python -os、sys
  3. 【整理】ABAP快捷启动Debug三种方式
  4. 标准化工作导则2020_最新版 GB/T 1.12020 标准化工作导则 第 1 部分:标准化文件的结构和起草规则标准解读...
  5. java主动对象模式_POCO的主动对象
  6. CSS快速学习5:文本溢出和XHTML元素分类
  7. PgSQL · 应用案例 · 惊天性能!单RDS PostgreSQL实例支撑 2000亿
  8. 微积分知识总览(1)——微积分准备知识
  9. 16套51单片机开发板资料共享下载,拼命整理
  10. 自定义分页信息java_java-displaytag自定义分页
  11. MATLAB一元三次求极值,MATLAB实现一元三次方程求解/盛金公式
  12. JAVA基础知识点大全之一
  13. 工赋开发者社区 | 抛弃 Google,Debian 改将 DuckDuckGo 作为默认搜索引擎
  14. 企业邮箱哪个最好用?哪个企业邮箱更优惠?费用是多少?
  15. opencv-python的颜色检测追踪
  16. switch基本用法
  17. 实际场景架构图实例及详细说明
  18. 【SymbolicLink】利用软连接将已安装程序搬迁到其他盘符
  19. 网站上的QQ在线客服“QQ在线状态”按钮变成灰色“未启用”状态?
  20. 魔镜VR位置切换和自动漫游

热门文章

  1. 《流浪地球》登顶IMAX国产片历史最高票房
  2. 虚拟机 Ubuntu16.04开机蓝屏问题
  3. 机器学习——回归——一元线性回归
  4. #父与子的编程之旅#第十二章
  5. C/C++ Linux 出错处理函数(strerror 与 perror)
  6. 21 个好用的持续集成工具,总有一款适合你
  7. 什么护眼灯对眼睛好?2022护眼灯315合格产品
  8. 【HAL库】HAL库STM32cubemx快速使用
  9. Qlikview配置ODBC连接SQL SERVER/ORACLE
  10. Windows“自动修复”无法修复