lyfeskluyl

lyfeskluyl

0个粉丝

11

问答

0

专栏

9

资料

lyfeskluyl  发布于  2015-02-09 09:51:13
采纳率 0%
11个问答
10732

A20 android 启动代码流程分析

 
现在的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的合法性。
我来回答
回答5个
时间排序
认可量排序

lubing521

0个粉丝

20

问答

0

专栏

11

资料

lubing521 2015-02-09 13:20:25
认可0
一看到楼主的目录 c:\\  莫非是采用cygwin?

surgelsm

0个粉丝

5

问答

0

专栏

0

资料

surgelsm 2016-07-16 17:55:34
认可0
楼主有打印过BOOT0运行过程的日志吗?

gck

0个粉丝

1

问答

0

专栏

0

资料

gck 2018-08-16 16:59:34
认可0
感谢楼主分享

hero

0个粉丝

1

问答

0

专栏

0

资料

hero 2017-11-20 14:11:28
认可0
:):):):):):):):):)

hero

0个粉丝

1

问答

0

专栏

0

资料

hero 2017-11-21 08:38:46
认可0
:):):):):):):):):):):):)
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
相关问答
无更多相似问答 去提问
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区