Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2258712
  • 博文数量: 218
  • 博客积分: 5767
  • 博客等级: 大校
  • 技术积分: 5883
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-01 14:44
文章存档

2012年(53)

2011年(131)

2009年(1)

2008年(33)

分类: LINUX

2008-03-01 19:41:06

一.下载一个纯净版的vivi主要修改几个地方

1LINUX_INCLUDE_DIR       = /kernel/include/(改成你存放linux kernel源代码的地址,因为编译vivi需要用到kernel源代码的部分头文件)----我本来是要把内核升级成2.6,但是包含2.6 include就是有问题,只好把他改成2.4,我的linux就是2.4,不过这个关系不大.

2CROSS_COMPILE   = arm-linux-(改成你存放交叉编译工具的路径,通常交叉编译工具的路径都已经在profile文件中声明,所以一般直接写arm-linux-

3ARM_GCC_LIBS    =/usr/local/2.95.3/arm-linux/lib/gcc-lib/arm-linux/2.95.3(改成你安装交叉编译工具的相应路径)- ---3.4.1的编译器会报错:说什么mshort-load-bytes选项无效,搞了好久不弄明白,只好用2.95.3,我弄了两个编译环 !:) 然后就是配置选项了,make menuconfig之前,建议先make clean,先把原来试验产生的目标文件清除.

二.我移植到了开发版里的vivi的版本为1.4.现在讲一下具体修改的过程.

1.首先是拷贝vivi源代码到/home目录,解压缩.然后是修改makefile,具体是:
a.
修改为“LINUX-INCLUDE-DIR = /kernel/include/(改成你存放linux kernel源代码的地址,因为编译vivi需要用到kernel源代码的部分头文件)----我本来是要把内核升级成2.6,但是包含2.6 include就是有问题,只好把他改成2.4,我的linux就是2.4,不过这个关系不大.

b. 修改为“CROSS-COMPILE = /usr/local/arm/2.95.3/bin/arm-linux-”
c.
修改为"ARM_GCC_LIBS =/usr/local/arm/2.95.3/lib/gcc-lib/arm-linux/2.95.3"
   
在这里我遇到一个问题,我用3.3.23.4.1的编译器编译vivi会报很多错误,比如什么:invalid option "no-fpu"之类的,但是用2.95.3就没这么多问题,只是在make head.s文件时不能产生head.o件。不知道是只有我一个人有这个问题还是大家都有,总之网上没有人提到具体怎么解决这个问题。不是说换个vivi就是说换个版本的交叉编译工具,就是这个小 问题卡了我将尽两天,浪费了大量的精力,真是受不了。最后我把vivi解压后的arch/s3c2410/head.o文件先保存,再make clean后,重新make时再把它cp回来。总算是过了,不过还没从根本上解决,只好等有时间再回来好好研究了。
2.
然后是修改arch/s3c2410/smdk2410.c与引导内核保持一致

我将要移植的内核是linux-2.6.14.7,对它分区如下:

 

 

 


古在此将smdk2410.c修改为
#ifdef CONFIG_S3C2410_NAND_BOOT

mtd_partition_t default_mtd_partitions[] = {

       {
              name:           "vivi",
              offset:           0x00000000,
              size:              0x00020000,
              flag:              0
       }, {
              name:           "param",
              offset:           0x00020000,
              size:              0x0010000,
              flag:              0    
       }, {
              name:           "kernel",
              offset:           0x0030000,
              size:              0x001c0000,
              flag:              0
       }, {
              name:           "root",
              offset:           0x00200000,
              size:              0x00200000,
              flag:              0
              //flag:            MF_BONFS        
       }, {
              name:           "user",
              offset:           0x00400000,
              size:              0x03ef8000,
              flag:              0                   
       }

};

#endif
3.
修改cmd_line,因为我是用linux2.6的内核,还想使用ramdisk,所以设置为:

“char linux_cmd[] = "initrd root=/dev/mtdblock/3

init=/linuxrc console=ttySAC0,115200 mem=64M";”

你也可以设为:

“char linux_cmd[] = "initrd root=/dev/mtdblock/3 init=/linuxrc console=ttySAC0”
4. 
然后make menuconfig,主要是去掉ecc。其他的设置就不细说了。
5.  
最后,make vivi 就可以的到一个名为vivi的文件,烧到nandflash

当把vivi烧进去后,可以通过输入part show查看MTD分区情况,这个分区表应该和后面kernel中的MTD分区保持一致,但现在并不是一致的,为什么呢?这是因为刚才你修改的只是vivi第一次启动时候默认的分区设置。具体分区情况要使用bon part命令来分。重新bon分区flash,这是十分必要的,相当于重新分区并格式化了整个flash,bon分区后flash里面的数据将全部丢失,所以要再把前面 新生成的vivi烧入目标板上,当然现在就可以只通过串口把vivi烧写进去,不用像第1步那样操作烧写vivi,但是注意bon命令重新分区后千万不要 断电了再烧写vivi,否则就不能通过串口烧vivi,具体步骤如下:

(1)这里将flash分成4个区(viviparam只占一个区),输入bon分区命令:

     #bon part 0 192K 2M

 注:一开始我按网上提供的#bon part 0 192K 2M 4M分区,可总不成功,最后去掉后面的4M就成功了,我也不知道是啥原因。

     解释一下上面的命令:

      1个分区从0开始;

      2个分区从0x30000(192K)开始;

      3个分区从0x200000(2M)开始;

      4个分区从0x400000(4M)开始.

(2)分区成功后,可以通过命令bon part info或者part show来查看bon分区信息,接下来不要断电,直接通过串口下载vivi,但是要注意的是,linux下用xmodem协议下载文件很有可能出现传输过程中断线或者连不上的情况,但是在windowsXP的附件中的超级终端下通过xmodem传输文件过程却是十分的理想,所以我建议从前面的第3步一开 始就都在windowsXP环境下的超级终端里进行操作(不过我是在linux下操作的),输入命令:

#load flash vivi x

然后点击终端窗口中的传送下的发送文件,采用xmodem协议,选择要下载的vivi码即可.

(3)等待文件传输完毕后,输入boot重启目标板,并按住空格键重新进入vivi模式下,输入命令:

#part show

即可看到重新的分区表:

vivi> part show

mtdpart info. (5 partitions)

name              offset        size        flag

------------------------------------------------

 

 

 

Vivi正常启动后输出信息如下:

 

 

此至,VIVI移植圆满完成,在引导内核时我们将根据须要通过param set 命令重新设置内核引导参数。

注:

1.这次修改成功后,下次再烧写vivi时只要烧写这次修改后编译成功的vivi目标代码就可以了,无须再对烧进后的vivi更新了。

2.将kernel烧到nandflash里的时候出现invalid mtd info.信息,就是在使用viviload命令的时候出现的问题.param save也会出现问题.总之就是不能往flash里写东西.看了一下vivi的启动信息,并且和网上人的启动信息比较了一下,发现在memory mapping的时候都是正常的,但是我的启动信息里没有nandflashid,厂商等信息.于是在windows下用sourceinsight 个软件将vivi添加到一个工程里,查看main.c(里面可以看出了vivi的启动过程),发现对mtd的初始化等依赖于smc功能,然而我在编译的时 候是把smc掉的.重新编译vivi,make menuconfig,选中smc支持.编译,出错,说什么在mtd.o里什么mtd_nand_ecc没有定义之类的,抱着瞎试的态度,smc支持下 的关于ecc的项选中,编译通过.然后烧到板子上,启动,果然出现了nandflash的厂商信息,load命令也可以正常使用了.

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

chinaunix网友2009-03-24 00:20:52

步骤一:下载VIVI源码 步骤二: 修改Makefile 里面的3个编译量 编译成功生成vivi 步骤三:sjf2410下载 vivi 显示结果: @000000E8 OK 00000054 00ABEA00 FAIL 经过多天的追踪,发现是VIVI的 copy_myself 程序 复制 128K到 sdram 的0x33f00000 地址之后 跳转到 ok_nand_read程序下 进行4K的二进制代码比较, 比较 中 由于 sdram 与 sram 里面的不一样 跳入 notmatch程序 得到的问题: 1,是sdram的问题,还是sjf2410写bin文件写的就是错的? 2,如果sjf2410写没有错误,那么可能就是nand_read.c文件里面的nandflash读程序有问题? 3,如果sjf2410写没错,nand_read.c里面的nand_read_ll()也没问题 那我的问题在那里呢? 郁闷呀!!!!!!!!!!!!! 希望得到高手指点