AM3352 bootloader引导程序开发

一、理论基础

1、AM335X的内存映射(参考AM335X手册)

 2、启动过程

当芯片重新上电或者复位时,处理器开始执行位于芯片内部Boot_ROM(RBL过程,厂家固化,无法更改),对自身的运行环境做初始化后进入引导过程(MLO);

引导过程会先检测硬件设计的SYSBOOT引脚,根据不同的配置,选择从哪里(有NOR、NAND、MMC、SPI)开始检测是否有有效代码,此过程由硬件决定,软件无需参与,如果检测到有效代码,就将其加载到芯片内部的SRAM(第2个红框)中运行;

引导过程(MLO)的作用是把应用的代码加载到DDR(第3个红色框)内,并跳转至应用程序,至此系统软件开始得到有序执行。

二、需要解决的问题

根据以上理论有如下问题需要解决:(本文仅针对bootloader存放于SPI芯片)

1、如何生成MLO过程能识别出的有效代码

编译器生成的bin文件芯片并不能识别,因此需要将bin文件进行转换

1)可使用TI的ti_image工具,将bin文件进行转换(参考书籍,未验证)

2)编写脚本文件,将bin文件进行转换(已验证)

2、bootloader如何写入SPI芯片,以便CPU去识别

1)通过SPI烧写工具如J-LINK将bin文件直接写入SPI芯片(未验证)

2)另做一个程序,通过编译器在线调试的方式,直接将bin文件写入SPI芯片(已验证)

3、bin文件需要如何转换成数组,以便上述步骤2所做的程序通过将该数组写入SPI芯片

通过编写脚本文件将bin文件转换成数组的形式,以便软件通过SPI将该数组写入SPI芯片

三:所需准备的程序

综上所述,完成bootloader的开发需要准备4套程序,分别为:bootloader源码、bin文件转换脚本1、bin文件转换脚本2、bootloader烧写源码,其作用分别为:

1、bootloader源码:

实现bootloader的功能,即实现CPU上电或复位后,通过正确引导加载和跳转至应用程序;经编译器(作者采用的编译器为:CrossStudio for ARM)编译出来的bin文件如下:

2、bootloader源码的流程图如下:

 流程图解释:

1)读取spi芯片的最前16个字节数据,该16个数据是在应用程序经编译生成的bin文件的基础上,通过bin转bin脚本工具增加进去的,分别表示:第1个4字节表示自定义ID号(用户定义);第2个4字节表示应用程序bin文件的数据长度(数据加载长度);第3个4字节表示需要加载的地址(AM335X加载地址为0x8000 0000);第4个4字节表示CRC验证值,即对加载的应用程序bin文件进行CRC计算,如果与第4个8字节CRC数据相同,表示CRC验证通过,保证加载的数据可靠。

2)任何一个环节失败,则表示应用程序出现问题,跳至等待bin文件的写入,用户可根据需求更改方法,比如开通CAN通讯或者485通讯,等待bin文件的写入。

应用程序的bin文件和spi存储芯片的数据如下,右边即是在应用程序程序基础上增加的16位字节数据。

2、bin文件转换脚本1:

下载链接:bin文件转bin文件转换工具-嵌入式文档类资源-CSDN下载功能:--检测原bin文件数据长度,增加至第1-4个字节--将AM335X的内部地址0x402F更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/u013131160/85131701

由于bootloader源码经编译生成的bin文件,CPU并不能正确识别,因此需要通过执行该脚本修改原bin文件,另外,bootloader烧写程序是一个字节一个字节的往SPI存储芯片里面写,而CPU加载SPI存储芯片里面的数据,是采用4个字节为单位,且高位在前,低位在后的形式,因此,该脚本需要完成2个功能即:1、以4个字节数据为单位,调换顺序;2、调换完后在最前面增加8个字节的数据,以便CPU能正确识别;执行此脚本后的bin文件如下:

 前8个字节解释:0x00008115表示需要加载的数据长度;0x402F0400表示需要加载到CPU的地址(CPU芯片内部的SRAM地址);后面的数据表示在第1步编译生成的bin文件的基础以4个字节为单元进行顺序翻转;

3、bin文件转换脚本2:

下载链接:bin文件转换为C文件转换工具-嵌入式文档类资源-CSDN下载功能:将bin文件转换成C文件的数组,以便C程序可直接调用写入SPI芯片运行脚本前,需要修改脚更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/u013131160/85132519

第2的生成bin文件是不能通过bootloader烧写程序写入SPI存储芯片的,需要转换成16进制形式的数据才能写入,执行此脚本后的结果如下:

此脚本完成的功能:读取第2步生成的bin,每个数据前面增加0x,输出.c文件供第4步的bootloader烧写源码使用,

4、bootloader烧写源码:

通过在编译器上进行在线调试时,直接将将第3步生成的C文件(数组)写入SPI芯片,仅写一次即可,写完后相当于SPI芯片已经存储了bootloader,CPU每次上电或复位即可识别出该bootloader并加载运行;写完重新上电,通过在线调试的形式查看CPU内部SRAM地址的数据,可以验证是否从SPI存储芯片正确读取如下:

 可见,CPU内部SRAM的数据与bootloader源码编译生成的bin文件完全对应;

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

软件攻城狮阿三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值