Chinaunix首页 | 论坛 | 博客
  • 博客访问: 11438
  • 博文数量: 3
  • 博客积分: 130
  • 博客等级: 入伍新兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-06 16:44
文章分类

全部博文(3)

文章存档

2009年(3)

我的朋友
最近访客

分类: LINUX

2009-03-10 19:17:20

前一段时间在公司做了一个u-boot移植,用的是u-boot-1.2.0版本,移植到powerpc的处理器平台。由于这个平台是一个成熟的网络路由器产品,所以不用考虑硬件是否有错误。

      开始移植,查了很多资料,读了很多文章。大概知道u-boot是啥了,工作过程是啥了,最终结果是啥了。然后开始看u-boot代码的基本架构,用到的主要有:board、cpu、common等文件夹的内容。其他的post文件夹啥的,不用看。当然,common文件夹其实不用咋改,一般是可以直接用的。

       先来看看板子上的cpu吧,是mpc8541。上board文件夹里找吧,看上mpc8541cds了,就用这个!不着急改代码,先来测试一下u-boot-1.2.0版本的mpc8541cds在我的板子上能否测试通过吧!做法如下:

      打开cygwin命令行,输入make MPC8541CDS_config 回车,会打印信息:显示正在配置板子。完成后输入make回车,就开始编译,OK,u-boot-1.2.0版本的MPC8541CDS目标板编译通过!下一步,开始看代码吧。

       我做的u-boot比较特殊,由于是成熟的产品,板子上有两个flash,一个nor,一个nand的,nor flash里已经有一个bootloader代码,用于启动用,此板上电后,自动先运行这个代码,完成板子的初始化,包括初始化内存,就是说,内存已经可以用啦。我要做的是把u-boot放在nand flash里面,上电启动,会把u-boot代码下载到内存运行。按公司的说法,nor里面的bootloader是小版本,nand flash里面放的是大版本。我要做的就是大版本代码。说明完毕,现在开始看代码。

     首先,当然是start.s这个文件,u-boot代码运行起来后,第一步就会运行start.s文件。由于我的u-boot特殊性,不是代码不是从start文件的开头执行的,是从标号start处开始执行的。之前的部分是不执行的。不过也来讲一下之前的部分代码:先来一个版本的比较,然后是使无效一些诸如cache之类的寄存器,配置向量表偏移,基址。还有一个特别注意,就是mmu的寄存器。这个比较重要。OK,开始说标号为start处开始的代码。

      先清零一些寄存器,如定时器等,这里关键的一个bl cpu_init_f ;bl board_init_f.函数名记不清了,大概是这两个。我把cpu_init_f注释掉了,因为小版本已经初始化了这个。重点看board_init_f。这里最重要的就是把串口先起来了,一般调试串口,只要注意一下你的串口频率设置,还有板子的频率,设置对了,串口一般没什么问题。board_init_f函数执行到最后,会进行代码搬移,之后就不会返回到调用的地方执行。原因是,在代码搬移的末尾,用blr指令,把存储下一指令地址的寄存器内容改了。改到哪里了?改到内存相应的位置了。可能你要问了,这个内存的位置设置在哪里?可以随便你自己定,但是一定要留出堆栈空间,全局数据结构空间等,够用就行。这个在board_init_r函数里就体现出来了。boar_init_r函数就是做这个预留各个空间处理的。board_init_r函数进行到最后,就出现一个进入main_loop函数。这个main_loop函数就在common文件里面。

      晕了,我发现做过u-boot之后,想写出来,还是有点困难。我的文学修养很不够!当初高中语文很失败,不过语文课上,练就了我的一手好字体,也算没有白上语文课。总之,知道时间是不能浪费的就OK。

      大家一起讨论u-boot吧,还是一个很不错的代码。在我看来,可以与linux代码相媲美,代码让人看起来很爽。~[转载请注明嵌入式先生,谢谢合作]

阅读(562) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~