打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
s3c2410 Uboot 历程
s3c2410 Uboot 历程 (2010-01-17 02:02)
分类: linux


                     s3c2410 Uboot 历程
         本文仅记录我在2410上被uboot折磨经过,仅供参考。
         有用的参考资料介绍(全部是网上下载的,如果找不到可以给留言留下email,参考价值重复的分散的就不列了)                                        
         ARM79出品-u-boot移植手册---uboot1.2 的code及命令介绍
         uboot readme---uboot readme中文翻译
         我的收藏夹里的链接
             skyeye下修改uboot支持2410从nand启动
             U-BOOT编译中的软浮点soft-float问题
             移植U-Boot.1.2.0到友善之臂SBC2440V4
             
         Y同学借给我2410的开发板(叩首感谢)是北京恒丰锐科的开发板,系统只有Nand boot,开发板带的是ADS工程的bootloader。
         自己先是看了“bootloader技术内幕”和“嵌入式bootloader详解”对bootloader有了大体上的了解,然后看hfrk的ads工程code,通过ads仿真和Y同学帮助下,看懂的大概的流程和大体的意思。自己不太满意的是,ads工程师windows下的,自己心里作怪,在网上了解到vivi,专门针对2410,由于它是linux下的,而且流程和hfrk带的loader差不多,所以决定先试vivi。运气比较好,下载的vivi,不修改编译通过后,通过linux烧到flash里,能顺利从uart口打印信息,自己也没有很深究,因为自己知道,uboot才是更通用的,而且功能更强,vivi只是更符合2410.
         屁颠屁颠地下载了最新的arm编译器arm-linux-gcc-3.4.1和最新的u-boot-2009.11。在Y同学的建议下帮编译器的绝对路径替换到uboot的根目录下makefile的CROSS_COMPILE的位置,我认为这虽然有点麻烦,但是,这可以不用在环境变量PATH里放,不会让PATH变很庞大,也可以让不同版本的arm的编译器放到系统里面。依照网上的教程和编译内核的经验,在根目录下输入 make smdk2410_config,让uboot选择是ARM,因为uboot发展很久,2410的东西都很成熟很成熟,用的人很多很多,所以没有修改这部分,但是知道这步目的是在include目录下创建include.mk,把系统用的cpu类型板子等待信息存起来给makefile 编译调用的。这部分在youku上中嵌的教程有详细的讲解这过程。
         不幸的时刻慢慢来临了,在uboot根目录上输入make,(这些很简单的细节对曾经做过的人都会觉得很简单,也是向新手介绍时容易忽略的,而这些常常是限制新手的瓶颈,让他们在困难前迷茫无从下手的,这也是我慢慢认同那些培训机构,他们给学生虽然简单知识,但是这些简单的成功的经验,却能让新手入门,跨了这砍,的确节省很多时间,我以前经常花了很多很多时间自学linux arm等等,往往在查了很多资料仍然看不懂的情况,自己的认识仍然很模糊却困在细节的死胡同,而往往有人一点,自己就豁然开朗,也后悔自己白白浪费很多时间精力,如果没有老师指点,自己经常因此失去自信所以经常放弃,也一直在怀疑自己)。
         在开始编译的时候,还有点高兴,因为vivi编译都很顺利通过,而且能run起来。可是编译因为错误停止了,自己一下子呆了,可是linux出错的信息全是英文的,而且又那么长,自己经常放弃去看它。我重新把uboot下载,编译,仍旧出现好多行的relocation truncated to fit: R_ARM_PLT32 __div0错误提示。因为是刚拿到code,对code框架都不熟悉,没有去检查code,以为是下的code有问题。我又去下载了uboot1.2 ,1.1.4,编译仍旧。看看错误情况,不好怀疑别人用了那么久的东西,我转去下载别的版本的编译器,试了几个还是比较新的版本,情况依旧。灰心了,去问了Y同学,他告诉我,是浮点错误,叫我去网上搜(我怎么又不会搜那问题的关键字呢?又是信心问题)。搜到了 “    U-BOOT编译中的软浮点soft-float问题”,按照其中大概的步骤(有些 步骤实现上有些差异)自己重新编译了没有软件浮点的编译器,花了好长好长一段时间。幸好,code都能编译通过,但是自己换上选择另外个方案,安装arm编译器arm-linux-gcc-3.3.2,因为网上说这个版本稳定,似乎用的人多,幸运的,编译uboot2009,通过。
         烧录后复位,串口没消息出来,懵了,断电重开,还是没有。编译1.2版本的,依旧。又灰心了,很多人在用啊,为什么自己就不行呢?一直在怀疑自己。反复折腾,不知道问题在哪里啊,只好选定个网上人用得多的arm-linux-gcc-3.3.2和uboot1.2,从它上开始找原因。
         在看了别人对uboot的code的分析后,发现自己用的code几乎是一摸一样的啊,为什么别人的就可以,自己的就是不行呢?Y同学安慰我说,遇见问题才能通过学习更深刻的去了解。自己学中嵌视频的方法,点LED灯去debug,从第一语句开始。幸好操作io的语句不是很难,它 的原理还是很明白的。
         幸好Y同学交我用hfrk的loader调试uboot,自己不用整天往同事的台式机跑,因为我的小黑没有并口,用不了JTAG. 经过一步一步trace,发现在lowlevel_init里会死掉。因为自己很久没看汇编,而且ARM 的汇编很复杂,自己也不想过多花心思,只是想让uboot能run起来,因为时间不多,学习linux才是主要目的,所以看到汇编部分会死机,自己心怯了。幸好Y同学叫我去改SDRAM的寄存器配置(我却相信别人用的默认值至少可以run,最后在微调就好了)。我把hfrk的SDRAM的相应的配置,一一对应到uboot的_BWSCON,但是仍旧不行。只得一个一个去研究每个寄存器的设置及意义。对应电路图,却还为SDRAM是16bit还是32bit的宽度苦恼,因为hfrk的code有16和32的,从makefile不知道它是如何选择的,自己之后每种情况都去试,仍旧会当掉。后来也发现,自己由于太不自信没看到hfrk 在写寄存器的时候用的宏不太一致。自己不知道原因,怀疑是不是uboot有问题,虽然语法读起来对,但是说不定还是有问题的。我把hfrk的这部分移过去,要命的是,hfrk用的ads,uboot是linux,它们的汇编指令不相同,我查了好久的arm指令,去理解,心碎着呢。可惜,仍旧失败。我不得以,不用循环,自己往arm的SDRAM的寄存器里一个写和hfrk一摸一样的值,可惜fail。
         我不得已用点led的方法去查uboot的问题,很幸运的是,我不小心,把循环的语句屏蔽掉,在hfrk的loader上run uboot的时候,有uboot的串口消息了。让我有了点信心。虽然是错误的导致的,但也是给了我点鼓励。我不断尝试,后来把lowlevel_init去掉,uboot的消息仍旧出来。我以为不配置用2410复位的值应该就可以了。我把这code用JTAG烧到板子,很失望的是,串口仍旧没有消息。
         我思考了很久,才发现问题所在:用hfrk的loader的时候,loader已经成功把SDRAM初始化好了,用它调试hfrk的loader,她写入的也是正确的寄存器的值,所以,它是能跑起来的。而,这loader去run 我编译的uboot,是在sdram里面的,在跑uboot配置sdram的时候,sdram错误,会导致下一条存在sdram的指令找不到,而且uboot是在sdram不再flash里。
         一个成功的经历比一百个失败的教训还有价值,我深信别人的话了。因为一直失败对人的自信打击是多么的大。所以,我现在很希望做什么都有个人把我带入门,这样我不光省下时间,对自己信心也有很大提高。
         我放弃用hfrk的loader去调试uboot了,我还是一步一步用led的方法去查code跑的地方。我这回用ads单步调试去读出来SDRAM具体的值,而不是去从hfrk里写得比较乱而且不合规范的程序去读。从而发现,SDRAM配置的是32bit,验证的原理图。也从而验证了hfrk虽然跑对了,但是code的不合规范,让我读起来出错。
         用led 跑到 C代码部分,我高兴死了,以为可以脱离汇编的管制。可是,却在memset的函数上死掉了。可是在uboot汇编的时候已经把堆栈初始化了呀。后来经Y同学分析,同时也验证了2410取的是nand的4k而不是512byte,自己也学到了看SYSTEM.MAP文件。
         自己慢慢比对分析,才发现uboot里直接跑的是NOR,因为,他copy自己的时候是直接寻址的,而nand是有一定的时序的,可是uboot没有。hfrk的板子没有nor!!!
         终于发现问题了。
         我想去移hfrk的code,发现编译不通过,因为指令不一样,修改量很大。参考了网上2440的uboot移植,别人都是从vivi移过去。我看了半天,发现vivi在copy本身的时候调用了C。我本来就对汇编害怕了,何况在来个C和汇编混用,失望得想跳楼。还是用hfrk的loader 吧,看linux好了。
         可是不甘心哪!周五回家,不甘心,不可能别人都不移植2410uboot的nand!上网一搜,很多呐!为什么当时自己就想不起来,给自己判了死刑。所以,一定要相信自己,更要及时从细节跳出来,好好清醒的从头想过。
         现在从网上下载了,几乎 是现成的,虽然没有办法试,但是我也都一句一句看懂了,相信自己一定可以。
        
                                                                                             2010年1月17日凌晨
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
从单片机步入Linux之uboot编译、烧录与启动
uboot移植文档
利用NAND Flash实现嵌入式系统的远程更新
ARM9/ARM11裸机开发笔记1之MDK开发环境和点亮LED
Android系统启动流程
用GNU工具开发基于ARM的嵌入式系统
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服