Cubietruck---4. boot0源码流程简略分析

本文详细解析了Boot0启动过程,包括初始化SVC模式、设置CPU频率、内存区域配置及跳转到Boot1等关键步骤,并介绍了不同存储介质的Boot1加载方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大体上看了一下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, icacheflow 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.不知上哪儿找这个东东.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值