zoukankan      html  css  js  c++  java
  • F1C100S 简易 boot 原理

    背景:荔枝派nano 运行 RTT (rt-thread) 。 使用 RTT 提供的 bootload 很复杂,编译 bin 之后需要打包成 ota 包(图形界面,无法使用 bat 等方式集成操作),才能下载进板子进行更新。
    本文描述的 boot 来自于 https://gitee.com/zhangheyang/f1c100s_rt-thread

    boot.bin 合法格式。

    f1c100s 对 spi 引导程序是有格式要求的。格式细节我忽略不分析
     start.S 内定义。
     编译生成 boot.bin 之后用 mksunxi 对其进行校验,并填充相关位置。
     让 f1c100s 能够认可 boot.bin ,并执行它。

    boot.bin 逻辑

    初始化 CPU 寄存器。
    初始化中断状态。
    设置中断向量表位置。
    赋值中断向量表。

    初始化时钟、DRAM、串口。
     bl sys_clock_init
     bl sys_dram_init
     bl sys_uart_init

    读取第二段程序并引导启动。 这里,第二段程序是 RTT。
     如果是 uboot ,这里第二段就是 uboot 第二段。
     bl sys_copyself

    结束 有三种情况 1.返回spl 2.启动第二段程序 3.死循环

    具体分析 sys_copyself 函数。
     获取启动方式,如果不是SPI,那就返回 spl 状态(start.S 内定义)。
     从 spi flash 0x00010000 读取 16 字节。
     struct
     {
      void (*Exe)(void); // 程序地址?
      uint32_t magic; // 魔数 0xaa55aa55
      uint32_t rev; // 没有使用。
      uint32_t imgLength; // 程序大小。
     }head_t;

     如果魔数不正确,将进入死循环 while(1)。
     正确的情况下。
     从 spi flash 0x00010000 读取 imgLength 长度数据到 0x80000000(DRAM);
     然后直接跳转到 0x80000000。运行。

    对应的第二阶段程序就有需要完成 head_t 头部信息。
    RTT 需要修改内容:
    start_gcc.S 文件
     .vectors 最前面加入 head_t 结构。

     b system_vectors ; 第二段程序向量表存放位置。(向量表第一项 reset)
     .long 0xaa55aa55 ; 魔数
     .long 0 ; 留空
     .long image_size ; 程序大小

    image_size 让链接器进行计算即可,不需要另外使用工具进行处理。
    修改 link.lds 文件
    最前面位置加入
     __image_start = .;

    .bss 段前面加入
     __image_end = .;

    最末尾处计算一下 image_size
     PROVIDE(image_size = __image_end - __image_start);

    修改的文件打包请到 https://whycan.cn/t_4907.html 下载。(也是我的博客)

  • 相关阅读:
    Java 8 Lambda 表达式
    OSGi 系列(十二)之 Http Service
    OSGi 系列(十三)之 Configuration Admin Service
    OSGi 系列(十四)之 Event Admin Service
    OSGi 系列(十六)之 JDBC Service
    OSGi 系列(十)之 Blueprint
    OSGi 系列(七)之服务的监听、跟踪、声明等
    OSGi 系列(六)之服务的使用
    OSGi 系列(三)之 bundle 事件监听
    OSGi 系列(三)之 bundle 详解
  • 原文地址:https://www.cnblogs.com/JiuHuan/p/13303679.html
Copyright © 2011-2022 走看看