移植 Linux 2.6.32.2 到 mini2440


先介绍一下此次移植的主要目标对象:

平台:Windows 7 旗舰版 And Fedora 9

目标板:mini2440

目标系统: linux-2.6.32.2

交叉编译链: arm-liunux-gcc 4.4.3

busybox版本: busy.1.13.3

yaffs2版本: yaffs2-20100330(友善那坑爹的文档说光盘有这个压缩包……我有你妹啊……这个是我从官网下载的)

本来以为吧,有友善的移植文档作为参考,只要一步一步来,应该会比较顺利的……不过很快我发现我真是太天真了……友善那坑爹的移植文档实在是让我火大……一个简单的移植过程,在有参考文档的前提下,足足搞了哥4天时间,期间因为按部就班地按照友善的移植文档而犯了不少让人抓狂的错误……再说一次,哥TMD真的是很火大!

好吧,发泄了一通之后要平静下来了……记录一下整个移植过程,为以后留点笔记……移植期间参考了网上不少的文章,实在是万分感谢这些文章的作者……没有他们的共享精神,可能我现在还在懊恼那些坑爹的错误……为此,我一定要把自己的移植过程写出来……如果有人因为这篇文章而解决了某些问题,那我一定会由衷地感到高兴。

先说一下移植步骤,这个是很重要的:

1.解压linux内核

2.修改目标平台

3.到arch/arm/mach-s3c2440文件夹,把mach-mini2440.c剪切到另外一个地方,建立自己的mach-mini2440,复制smdk-2440.c的内容到刚建立的mach-mini2440.c,修改晶振,修改MACHINE_START宏,增加分区信息,注意对照原来的mach-mini2440.c添加一些头文件,这些文件分别是:

  1. #include <linux/mtd/mtd.h>    
  2. #include <linux/mtd/nand.h>    
  3. #include <linux/mtd/nand_ecc.h>    
  4. #include <linux/mtd/partitions.h>    
  5. #include <plat/nand.h>   
另外还需要在mini2440_map_io这个函数里添加一行:s3c_device_nand.dev.platform_data = &mini2440_nand_info;

不然还是会出现离奇的错误。原因一会具体再说。

这个时候板文件就算完成了,如果这个时候make mini2440_defconfig之后再make zImage,烧到板子上之后启动应该就能看到分区信息了。

不过这时候还没有文件系统。

4。内核移植完成,开始移植文件系统。按照移植文档建立脚本文件:

  1. #!/bin/sh  
  2.   
  3. echo "------Create rootfs directons start...--------"  
  4.   
  5. mkdir rootfs  
  6.   
  7. cd rootfs  
  8.   
  9. echo "--------Create root,dev....----------"  
  10.   
  11. mkdir root dev etc boot tmp var sys proc lib mnt home <span style="color:#ff0000;">usr</span>  
  12.   
  13. mkdir etc/init.d etc/rc.d etc/sysconfig  
  14.   
  15. mkdir usr/sbin usr/bin usr/lib usr/modules  
  16.   
  17. echo "make node in dev/console dev/null"  
  18.   
  19. mknod -m 600 dev/console c 5 1  
  20.   
  21. mknod -m 600 dev/null c 1 3  
  22.   
  23. mkdir mnt/etc mnt/jffs2 mnt/yaffs mnt/data mnt/temp  
  24.   
  25. mkdir var/lib var/lock var/run var/tmp  
  26.   
  27. chmod 1777 tmp  
  28.   
  29. chmod 1777 var/tmp  
  30.   
  31. echo "-------make direction done---------"  
注意我加的一个目录"usr",不加的话会出现错误,友善那坑爹的文档害得我不浅啊……无语……

5.建立/etc目录下的文件

(1)、拷贝主机 etc 目录下的passwd、group、shadow文件到 rootfs/etc目录下。
(2) etc/sysconfig目录下新建文件HOSTNAME,内容为”winson”,这里可以输入你想输入的名字 。  
(3) etc/inittab文件

(4)etc/init.d/rcS

(5)etc/fstab

(6)etc/profile

6.编译busybox到rootfs中。

7.打包文件系统,我的是256M的NAND,友善那坑爹文档说用mkyaffs2img这个来打包,结果哥打包了不下数十次,没一次成功的,我就纳闷了,我都按足步骤了,怎么还这样……后来改了用mkyaffs2img-128,果然……啥也别说了,哥再次对友善的移植文档表示无语……

8.下载到目标板,运行!

具体移植过程:

1.安装交叉编译工具链

        这个不说,按照文档来就行。

2.移植linux内核

        先到官网下一个2.6.32的源码回来,或者用友善光盘里面的也行。不过最好不要用他光盘里面的那个,因为那个已经把所有一切的都配置好了,驱动也移植好了,啥都不用我们搞,这样不利于我们的学习,自己做一遍更加有利于加深印象。

        解压内核代码:

        tar -zxvf linux-2.6.32.2.tar.gz

        进入内核目录修改顶层Makefile:

        cd linux-2.6.32.2

  1. ARCH        ?= arm            //使用的目标平台   
  2. CROSS_COMPILE    ?= arm-linux- //使用的交叉编译器  
        事实上从2.6.31版本开始,linux已经支持mini2440了,就这样修改了平台,然后make mini2440_defconfig, make zImage编译内核下载到板子上也可以启动内核,不过会出现一系列的难以理解的问题(至少对于我来说是如此)。一开始那两天,我就是为了求快,使用了linux自己的板文件,于是怎么搞都不对,总是提示unable to  xxxxxxx的错误,貌似是不能初始化一个可用的控制台,然后上网找了很多资料,还是不能解决,崩溃。于是铁定了心,重头开始搞!

现在我们不使用其默认的板文件,我们自己按照友善的移植文档的步骤来自己搞。

cd arch/arm/mach-s3c2440

把原本的mach-mini2440.c移到别的地方,等一下还要参考。COPY smdk-2440.c这个文件的内容,然后建立自己的mach-mini2440.c,粘贴。到smdk2440_map_io(void)函数,修改晶振,改成12000000,

  1. s3c24xx_init_clocks(12000000); //修改为 12000000  

因为友善的板子用的就是这个频率,一般开发板由于成本的考虑,都使用这种低频率的晶振源,然后由CPU的内部时钟逻辑提高频率,具体可以参考这篇文章

然后修改MACHINE_START宏,宏的第一个参数一定要是MINI2440,第二个无所谓。

用VIM打开刚才复制得到的mach-mini2440.c文件,原来是smdk2440,所以将该文件中的所有的smdk2440替换成mini2440,可以在vim中,输入下面的命令进行替换;g表示全局替换,global.

  • 1
  • 2
  • 下一页

相关内容