使用u-boot下载和验证mini2440裸机程序

前段时间翻出老古董mini2440,欲学个Linux,一番视频刷下来到了硬件裸机这一块

但看视频里的老师验证程序使用的JLINK编程器,想想那玩意卖得贵而且用的少,又想到Bin文件能运行在ram中,于是尝试一波,分享如下

1.前置条件:

        1.使用Mini2440里面的bootload烧写u-boot到Nandflash(这个自行百度或者看光盘里的操作),对于win10等新系统,上位机DNW可能不可用了,这里推荐一个叫SuperVivi-Transfer的软件,另外如果Bootloader是superboot可以自行参考

2.探索过程

        首先板子里的bootloader是老板的supervivi,后续考虑折腾下如何升级为superboot,

        但是supervivi的上位机传输文件一直出错(莫名报错文件太大),所以此处暂时不使用之,

        所以暂时使用uboot完成,下载到RAM中运行

        uboot一开始烧录普通的例程还能运行通过,但到外部中断那一节就运行不起来的,按下按键触发的不是裸机里的而是U-boot中的测试程序,所以推测中断是跳到别的地方去了。

3.keil中的设置

3.1bin文件的生成

注意生成Bin文件的配置,fromelf.exe --bin -o .\obj\@p.bin .\obj\@p.axf

注意obj是生成的目标文件夹,在output选项可查看

3.2链接地址

如果是C工程(包含了启动文件S3C2440A.s或者其他),查看链接脚本(例程里提供了)

上述链接脚本提示:Run in RAM,记住那个加载地址,此处为:0x30000000

3.3涉及中断相关的处理,见第5节

3.4编译生成 bin文件

     

4.程序下载和运行

Nand启动开发板,串口输入任意进入uboot

输入loadb [下载地址]

其中下载的地址为前面记录的链接起始地址

通过secureCRT的kermit传送Bin文件

输入 go [下载地址]     运行code

一般代码这个时候运行没什么问题,但在中断处理还需要改一些东西

5.涉及中断的处理办法

S3C2440中的中断向量表放在0x00000000开始的区域,下面是启动文件S3C2440A.s的中断向量表

 显然中断向量表放的跳转指令,但遗憾的是我的程序是下载到RAM中运行的,这里是放在0x300000000开始的地方,这段代码对应Bin文件的开始段,同时uboot运行也会执行第一条指令

继续往下看启动文件,正好放了一个地址,也就是正好跳到了复位函数

某专家在Reset_Handler里面添加了如下代码,拷贝bin中向量表到0x00000000

注:部分例程common文件夹里面有添加

补丁1:光盘里某个例程里有这段,看注释是拷贝大概1K左右,但不知道被谁改成32字节了,这里可以把32改成1K应该也行。

但遗憾的是Keil将向量表编译为以下汇编

显然这是相对寻址,bin文件里跳转是跳到它写的处理函数,它肯定放在0x300000000以后的区域,但是实际机器运行中断时PC指向的为0开始的那块区域,相对寻址是跳不到bin文件里的函数的,所以某种意义上来说前面添加的向量表拷贝操作还不足以实现

这里提供一个简单粗暴的方法:

                拷贝程序前4K到0x00000000地址处

         方法很简单:main函数或者某个地方添加如下处理(注意这里0x300000000是链接的加载地址,若修改之此处也要修改)

        至于为什么是4K,可查询S3C2440的nand启动方式

#include<string.h>
memcpy(0,(void*)0x30000000,4*1024*1024);	//这个放在main函数最开始的地方暂无问题

经测试,按键的例程能运行无误

当然不用担心会损坏Bootload,在nand flash启动下,首先bank0的nor flash无法访问,其次前4k仅写入ram,不会影响flash内容。

当然4K肯定是够了,因为从启动文件可以看到,他们中断向量跳转后执行的是一些简单的中断判断,最终是要跳到一个比较大的区域,下面是外部中断的处理

 最后一句执行了某个神奇的跳转指令,跳转的范围很大,

 即跳转到最后的中断向量V表,RAM最后的一段,而例程里面就是将中断函数地址赋给这个表

事情到这差不多结束了,无需再深究下去。

我李某真TM是个天才😂

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值