Chinaunix首页 | 论坛 | 博客
  • 博客访问: 408792
  • 博文数量: 120
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 741
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-27 18:15
文章分类

全部博文(120)

文章存档

2016年(13)

2015年(41)

2014年(66)

我的朋友

分类: Android平台

2014-08-12 00:12:50

大体上看了一下boot0的代码,没有找到交叉编译的工具,所以也没有编译实验一下(即以下分析可能有错).
boot0的代码在./lichee/boot/boot0目录下:
1. 开始的代码
这部分代码准备了c语言的环境,并跳到c函数Boot0_C_part中
Boot0.slichee/boot/boot0/Boot0.s
  1. INCLUDE boot0_i.inc
  2.         IMPORT Boot0_C_part
  3.         IMPORT set_pll
  4.         PRESERVE8
  5.         AREA init, CODE, READONLY
  6.         CODE32
  7.         ENTRY
  8. initialize
  9.     //设置当前运行SVC模式
  10.     mrs r0, cpsr
  11.     bic r0, r0, #ARMV7_MODE_MASK
  12.     orr r0, r0, #ARMV7_SVC_MODE
  13.     orr r0, r0, #( ARMV7_IRQ_MASK | ARMV7_FIQ_MASK ) ;// After reset, ARM automaticly disables IRQ and FIQ, and runs in SVC mode.
  14.     bic r0, r0, #ARMV7_CC_E_BIT                      ;// set little-endian
  15.     msr cpsr_c, r0


  16.     //关mmu, data cache, icache, flow prediction,align
  17.     mrc p15, 0, r0, c1, c0
  18.     bic r0, r0, #( ARMV7_C1_M_BIT | ARMV7_C1_C_BIT )    ;// disable MMU, data cache
  19.     bic r0, r0, #( ARMV7_C1_I_BIT | ARMV7_C1_Z_BIT )    ;// disable instruction cache, disable flow prediction
  20.     bic r0, r0, #( ARMV7_C1_A_BIT)                      ;// disable align
  21.     mcr p15, 0, r0, c1, c0

  22.     //为运行C语言设置栈
  23.     ldr sp, =BOOT0_STACK_BOTTOM
  24.     //调用C函数set_pll,设置cpu频率
  25.     bl set_pll
  26.     //调用C函数Boot0_C_part
  27.     bl Boot0_C_part

  28.      b . ;// infinite loop
  29. END
2. 进入
然后调用文件Boot0_C_part.c中的Boot0_C_part
  1. void Boot0_C_part( void )
  2. {
  3.     __u32 status;
  4.     __s32 dram_size;
  5.     //将boot0的代码由 Load$$Boot0_RW_ZI$$Base复制到Image$$Boot0_RW_ZI$$Base
  6.     move_RW( );
  7.     //清bss
  8.     clear_ZI( );
  9.     //设置了各个clock,具体哪个没看
  10.     timer_init();
  11.     //口,以后就可以打印了
  12.     UART_open( BT0_head.prvt_head.uart_port, (void *)BT0_head.prvt_head.uart_ctrl, 24*1000*1000 );
  13.     //打印
  14.     print_version();
  15.     
  16.     //以下就是一些初始
  17.     ...
  18.     //在文件./lichee/boot/config/storage_media_cfg/nand/storage_media_cfg.h中配置了启动设备
  19.     #if SYS_STORAGE_MEDIA_TYPE == SYS_STORAGE_MEDIA_NAND_FLASH
  20.        //初始化nand flash,读取nand上的第2块(烧录时boot1写在了这个地方),第2块开头有一些数据记录了boot1的大小,
  21.        //按这个大小数取整个的boot1到内存的BOOT1_BASE(0x42400000)处
  22.         status = load_Boot1_from_nand( );      
  23.     #elif SYS_STORAGE_MEDIA_TYPE == SYS_STORAGE_MEDIA_SPI_NOR_FLASH
  24.         status = load_boot1_from_spinor( ); 
  25.     #elif SYS_STORAGE_MEDIA_TYPE == SYS_STORAGE_MEDIA_SD_CARD
  26.         status = load_boot1_from_sdmmc( (char *)BT0_head.prvt_head.storage_data ); // ????boot1
  27.     #else
  28.         #error The storage media of Boot1 has not been defined.
  29.     #endif

  30.     mmu_disable( ); // disable instruction cache

  31.     if( status == OK )
  32.     {
  33.         set_dram_para((void *)&BT0_head.prvt_head.dram_para, dram_size);      
  34.         set_nand_good_block_ratio_para((void *)&BT0_head.prvt_head.storage_data);
  35.         jump_to( BOOT1_BASE );                 //BOOT1_BASE处,开始执行boot1的东东
  36.     }
  37. }
注: boot0的交叉编译工具链是在lichee/boot/config/ARMCC_CROSSTOOL.CFG中有定义的,需要ARMRVDS.不知上哪儿找这个东东.


阅读(808) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~