微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 跟着小狂玩RicoBoard之boot启动

跟着小狂玩RicoBoard之boot启动

时间:10-02 整理:3721RD 点击:

这篇文章其实不在计划内,是突然遇到了点情况,然后想想有必要说一下,就突然在RicoBoard系列中加一篇文章,先说说我遇到的情况。故事的开头是这个样子,小狂最近一直在研究内核驱动的事,昨天练手写了一个按键中断的子系统,但是注册中断号的时候,就误把GPIO号写错了,171写成了117了,然后导致驱动加载的时候系统出现问题,崩溃了,后来我找问题,发现即使是我写成117也没啥问题,为什么会崩溃,为神马会崩溃,我也不知道,等米尔的工程师给回复,崩溃后,我就复位键呗,然后非常神奇的事情发生了,启动不起来了,准确来说,不是启动不起来了,是qspi程序启动不起来啦,但是SD卡也是能启动起来的。然后就开始捣鼓,

根据最最开始的猜测,有可能是qspi存储的信息丢失才导致uboot启动不起来的。说到这里,再谈一谈uboot的启动方式,上图。


其实TI的am437x系列是有5个启动选择脚的,米尔只放了两个,不同的匹配表明了不同的启动方式,直接表明了启动顺序,这个启动指的是按照ti的boot的启动流程来说你的第一个启动程序存放的位置,小狂当时处在第一个阶段所以当qspi的uboot信息损坏后,就会依次找usb1、mmc0(sd卡)和usb0,由于我当时的卡是插在板子上的,所以能从SD卡启动也就没有什么问题。可是后来我就不能理解了,发现了一个很神奇的现象,当你按下复位键的的时候板子本身,或者说UBOOT,不会重新读取选择的值,而会沿用上一次的值,这个可能是uboot中的问题,确实理解不了。

下边就是重新往qspi flash中烧写uboot,但是遇到了各种问题,首先我发现,在我烧写的时候会出现如下状况,是根本就不识别qspi啊,卧槽,nnd,tmd神马情况


难道说小狂的点子那么背吗,因为一个小操作就把qspi给干烧了,不能把,不至于那么脆弱吧,找问题吧,我始终不相信是这个样子的,所以就只能靠猜了,后来经过多次启动,发现,在uboot启动的时候就出现了问题


就是找不到QSPI,既然在uboot阶段都会出问题,那就只能去uboot中找问题啦,然后看看能不能再uboot中操作qspi。当我在uboot中执行下列命令的时候依然会出现问题


还是找不到qspi flash,这就让我在当时非常确认就是硬件出了问题。所以就毫不犹豫买了3片qspi flash,我的50大洋啊,哎,太冲动。可是这还没有一个合适的解释,小狂就想啊,想啊,想啊,尝试啊,结果,就在蛋疼的时候,突然发现,qspi能识别,不知道为啥有时候能识别,有时候不能识别,难道是延时加少了,无意中的发现,动摇了。


再次在uboot下尝试,看看能不能识别


已经识别,这时候,我们要从uboot从sd卡启动,这是我的第二个疑问,无论我从哪种方式启动,最后都是从mmc加载内核,总的来说,sd卡的内核就是个摆设,环境变量不能读取,什么鬼,这又是神马鬼,神马鬼,天呐,怎么启动个内核困难重重,这个真是找不到原因了,那就好吧,既然这样,进入不了sd卡,就没法重新烧写emmc和qspi,只能曲线就过了,我们就直接从uboot启动,在uboot中直接输入下面的指令


不要问我真么知道的,在uboot中看环境变量啊,哈哈,好了现在我们能进入SD卡中啦


这个时候我们烧写qspi和emmc,下图是全部的返回指令,烧写完成后,从qspi还是启动不起啊,让我们来继续分析。



这是全部的烧写信息,会发现,


图中红色的部分可以看出烧写是有问题的。既然用现成的烧写不进去,那我就在Uboot中烧写。还要回到uboot,亏得,小狂对uboot的指令还是比较熟悉的,往qspi中烧写uboot跟往nand里烧写uboot差不多,只不过我们要把nand换成sf,烧写之前我们应该确定点参数,dram的起始地址,和uboot在qspi中分的大小。

看下图


知道了起始地址就好办,还需要知道uboot所在的区域


512K,起始地址为0,下边强行烧写。先选中我们的qspi


首先把sd卡中的uboot,拷贝到内存中


擦除从0开始512k空间


然后把内存中的数据写入到qspi flash中


到此,所有的东西准备就绪,剩下的事就交给佛祖吧,我们拔掉内存卡,然后切换到带qspi的启动方式。

果然功夫不负有心人,终于启动成功啦,上个图庆祝一下。


为什么说qspi启动成功了呢,因为不再出现这个啦


总结

其实还有几个疑问没有解决,起码现在已经恢复到刚拿到板子时候的状态了。

1、为什么有的时候qspi初始化能过,有的时候过不了?

猜测可能是因为延时的问题,具体为什么这么猜,可以百度一下,有说这个事的

2、为什么每次要重新上电才能读取新的启动选择的值?

猜测可能是uboot中出了问题

3、为什么即使sd启动了,读取不了env.txt中的内容,进入不了内存卡上的内核,反而使用默认的环境变量,使用的是内核中的镜像?

这个问题,没有给自己一个合适的解释,先放下,等米尔的技术支持的回复。留个疑问吧


每一篇帖子都写的很用心啊

只是想认真的对待每一篇文章,回头看看,其实还是蛮有成就感的,不是为了写文章而写文章,当以后有人搜到关键词的时候,能详细的为别人提供思路,哈哈,尽量用自己能力改变原创的现状吧,哈哈

小编在吗?

我的板子从有时候从sd卡也启动不了呢,有时候又可以启动

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top