u-boot-2010.3移植到Tiny6410问题总结

问题1:

  u-boot-2010.3中nand_spl文件夹的作用:实现从Nandflash启动在编译是会建立几个链接文件,用这几个链接文件生成u-boot-spl-16k.bin

  nand_spl/board/samsung/smdk6400文件下有config.mk,Makefile和u-boot.lds三个文件,看看这三个文件再加上uboot根目录下的makefile文件就可以大概明白nand_spl这种方式是如何实现的了:

        在uboot根目录下的makefile中有:

$(obj)u-boot-nand.bin:nand_spl $(obj)u-boot.bin
cat $(obj)nand_spl/u-boot-spl-16k.bin $(obj)u-boot.bin > $(obj)u-boot-nand.bin

        是将两个bin档用这种方式合并成一个bin档!!!

更具体点说,就是在nand_spl目录下的u-boot-spl.bin做了以下事情:

        1.设置cpu为svc模式

        2.关闭开门狗和中断

        3.初始化系统时钟

        4.禁用MMU和Cache

        5.初始化sdram控制器

        6.设置sp,跳到刚才提到的nand_boot.c里面的nand_boot函数,这个函数初始化nand的控制器,并将4K之后的u- boot.bin image从nand中load到sdram中,然后跳转到u-boot.bin image的开始处继续后续的工作。

  具体说明见:http://blog.csdn.net/dndxhej/article/details/8227565

 

问题2:

  bootm函数只能引导uImage内核,不能引导zImage内核,可以用uboot的mkimage工具将zImage转换为uImage,其实uImage只不过是在zImage的基础上添加了64字节的头部,里面包含一些内核的信息,bootm函数需要读取这些信息!当然我们自己也可以直接在bootm中加几行代码是它支持Zimage的启动!

  附带:uboot的工具mkimage使用方法

 

问题3:

  uboot启动后出现 raise: Signal # 8 caught 原因是因为程序中有些地方的被除数值为0导致的。

大多数情况下是因为调用do_div这个宏引起的问题,我出现这个问题是因为timer_init这个函数设置错误,导致其他地方调用延时程序的时候出现 raise: Signal # 8 caught问题。

 

问题4:

  当Uboot启动后出现无限重启状态并打印出一下信息:

  data abort
  pc : [<57e141a8>]          lr : [<57e09964>]
  sp : 57ffff9c  ip : 00000015     fp : fe8f73ac
  r10: 7f4af2dd  r9 : 075afcd2     r8 : 25ff46db
  r7 : 63a7bb97  r6 : dbcb1ef5     r5 : 57e33e80  r4 : 00001298
  r3 : 57e34158  r2 : 57e30230     r1 : 00000064  r0 : ffffffff
  Flags: NzCv  IRQs off  FIQs off  Mode SVC_32
  Resetting CPU ...

这是因为程序调用到了一个没有程序的内存位置:pc的值是cpu当前执行指令的内存地址(也就是程序出错的地方)

  lr的值是调用程序的内存地址

通过这两个值我们可以地位到当前程序执行的位置以及是哪个调用程序使pc值为当前值。

 

问题5:

   arm处理器的函数参数传递机制:r1存储函数的第一个参数,r2存储函数的第二个参数,以此类推;

知道这个机制,我们可以在汇编程序中调用C语言函数并传递参数给调用函数,当然在调用前先要设置好栈。

 

问题6:

  uboot设置环境变量问题:出现问题*** Warning - bad CRC, using default environment

  看env_ini()函数前面的注释就能明白个大概,注释中说,这段代码将在nand_init()之前调用,所以在这段 函数中是无法从nand里面读取到存储到的环境变量的,这里先假设环境变量是可用的,设置gd—>env_valid =1;然后在env_relocate ()会进行真正的判断。这也说明在拜读别人的代码的时候,仔细阅读下别人的注释也是多么的重要啊!

 

问题7:

  在进行Uboot的移植时我们需要多次重复下载Uboot到Nandflash中去观察现象。如果用SD卡下载的话会非常的麻烦,友善之臂提供的MiniTools工具在win7下经常无响应根本就不能好使用,幸亏他提供了一个在Linux下的MiniTools工具,而且在Linux下的Minitools非常稳定,下面介绍一下怎样使用MiniTools下载Uboot到Nandflash:

(注意:较老版本的superboot好像不支持USB模式,换一个新的superboot烧写到SD卡就行)

 1、设置在images/FriendlyARM.ini的文件中加入:USB-Mode = yes

 2、将开发板设置为SD卡启动,此时MiniTools和开发板就链接上了

 3、在下载选项中选择Linux选项,可以看到有一个下载Uboot的选项,

  我们每次只需要选择那一个选项然后设置好文件路径就行

 

问题8:

  uboot-2010.3尽然不支持烧写文件系统到Nandflash,导致我以后制作根文件后竟然不能烧写到Nandflash进行测试!搞得我又想移植uboot-2012.4了!

posted @ 2015-04-25 19:22  玩意儿  阅读(522)  评论(0编辑  收藏  举报