移植最新linux-3.12到mini2440

硬件:

安装了Fedora18的PC(台式机最好,在下用的笔记本需要USB转串口)

USB下载线

USB转串口(笔记本用)

友善之臂Mini2440开发板

软件:

Linux-3.12源码包

Git工具

Arm-linux-gcc-4.4.3交叉编译器

Yaffs2源码包

一.准备工作:

1.获取内核源码

www.kernel.org得到的是压缩包随便放在某个位置(我喜欢放在windows的共享空间,那样比较节省虚拟机的硬盘,在mnt/hgfs/E)

2.安装git

#yum -y install git

耐心等待几分钟就好了,但是需要你在安装过程中输入Y或者N以便授权等,所以要监视全程。如果你的yum包坏了的话,嘿嘿,恭喜你。慢慢修复吧!(我就是如此的悲催!)

3.安装交叉编译环境

这个自然就是下载压缩包以后,解压,修改环境变量路径,具体的手册比我讲得详细

网址是www.arm9.net。里面有4.3.2和4.4.3更具你个人喜好下吧,但是据说4.3.2在QT使用的时候有BUG,所以我下载了4.4.3。

4.获取yaffs2源码

请各位小朋友注意,务必把你现在的位置定位到linux-3.12源码包外面,千万不要在你的源码包目录进行yaffs2补丁文件下载。你可以通过

#pwd

查看当前路径。在非源码包目录执行

#git  clone git://www.aleph1.co.uk/yaffs2

就可以下载到最新的yaffs2补丁了。说到这里我就纳闷linux那么强大,为什么到目前为止,一谈到内核移植,MTD挂载,NandFlash都要先打yaffs2文件补丁,他在内核里为什么不一起集成,哎,目前我这个菜鸟是想不通的,也许将来某一天,我的小朋友的小朋友想通了。

5.安装USB下载驱动

先在windows下安装FriendlyARM提供的下载驱动程序,插上USB如果他不自动安装的话,你就手动更新驱动程序嘛。

6.安装DNW和SecureRT

这不用我说了吧。

 

二.修改Makefile

进入linux-3.12源码目录,执行

#vim  Makefile

在195行左右作如下修改,意思就是告诉编译器我的内核是为arm移植的,还给它指明所用编译工具的路径。就是之前安装的交叉编译工具arm-linux-gcc-4.4.3。自己看着办吧!每个人路径不一样,请观察我为你截的图的右下角,一般标明了行号什么的。嘿嘿,就不在图片上圈东西了。

三.建立自己的mini2440

我们不用外国人事先写好的mach-mini2440.c。一方面他的LCD驱动结构比较复杂,且参数不是我们所用的LCD的参数,没有触屏效果。另一方面时代在进步,万一哪天你自己弄快开发板没人给你写驱动怎么办,它的驱动是08年的了。再一方面,我不喜欢外国人,为什么呢?因为我爱国嘛!(狭隘的民族主义者)

1.进入linux-3.12源码目录,将./arch/arm/mach-s3c24xx/文件夹下的mach-smdk2440.c 复制为同目录下的mach-mini2440.c,也就是将官方提供的mach-mini2440.c抛弃掉,用mach-smdk2440.c里的内容重新构造一份mach-mini2440.c,这个比较纯净。你可以学到更多的东西。命令行效果如下,(就是用cp命令而已嘛)。

 

2.修改时钟频率

#vim ./arch/arm/mach-s3c24xx/mach-mini2440.c

162行左右,将原来的数值改为12000000,见图:

 

 

3.修改内核信息

在234行左右的MACHINE_START里面将原来的参数变为MINI2440,“mini2440 created by your name”,第一个参数必须是MINI2440,第二个参数自己DIY,显得你有出息,都可以改动内核信息了,哪天领导一看你的开发板,信息显示的是你自己的名字,多牛逼啊!!!(哈哈哈,开个玩笑而已),其实是为了验证你是不是移植成功了的标志之一。

4.从smdk2440到mini2440

在底行模式下,输入

%s/smdk2440/mini2440/g

就可以将mach-mini2440.c里的smdk2440字样全部换为mini2440  

5.修改CPUID

不修改将会出现无法进入内核由于CPU mach_type 不对应找不到对应的CPU。 mini2440 使用的supervivi 的机器码是782,这里需要修改机器码,否则会出现不能启动的情况。 机器码保存在内核源码的

arch/arm/tools /mach-types 文件中,在大概 87行,把原来的 362改为782保存即可

 

 

 

 

四.NANDFLASH分区信息修改

1.在mach-mini2440.c的103行左右,添加如下代码。这里的参数,是为了和boot-loader移植。你可以通过nor-flash启动开发板,用secuRT通过q命令进入super vivi模式,再用part show命令查看你具体的分区信息。

/* NAND Flash on MINI2440 board */

 

static struct mtd_partition mini2440_default_nand_part[] __initdata = {

        [0] = {

                .name        "supervivi",

                .size        = 0x00040000,

                .offset        = 0,

        },

        [1] = {

                .name        "param",

                .size        = 0x00020000,

                .offset        = 0x00040000,

        },

        [2] = {

                .name        "kernel",

                /* 5 megabytes, for a kernel with no modules

                * or a uImage with a ramdisk attached */

                .size        = 0x00500000,

                .offset        = 0x00060000,

        },

        [3] = {

                .name        "root",

                .offset        = 0x00560000,

                .size        = 1024*1024*1024,

        },

        [4] = {

                .name   = "nand",

                .offset = 0,

                .size   = 1024*1024*1024,

        },

 

};

 

static struct s3c2410_nand_set mini2440_nand_sets[] __initdata = {

        [0] = {

                .name                "NAND",

                .nr_chips        = 1,

                .nr_partitions        = ARRAY_SIZE(mini2440_default_nand_part),

                .partitions        = mini2440_default_nand_part,

                //.flash_bbt         = 1, /* we use u-boot to create a BBT */

        },

};

 

static struct s3c2410_platform_nand mini2440_nand_info __initdata = {

        .tacls                = 20,

        .twrph0                = 60,

        .twrph1                = 20,

        .nr_sets        = ARRAY_SIZE(mini2440_nand_sets),

        .sets                = mini2440_nand_sets,

        .ignore_unset_ecc = 1,

};

 

 

 

2.在初始化设备列表中添加nand的驱动支持

即在208行左右添加&s3c_device_nand;如图所示:

 

3.在机器初始化函数中添加nand信息,如图所示(223行左右)

s3c_nand_set_platdata(&mini2440_nand_info)

4.添加支持mtd和nand的头文件

#include <linux/platform_data/mtd-nand-s3c2410.h>

#include <linux/mtd/mtd.h>

#include <linux/mtd/nand.h>

#include <linux/mtd/nand_ecc.h>

#include <linux/mtd/partitions.h>

5.修改./arch/arm/mach-s3c24xx/common-smdk.c文件,使得nand的分区信息全部一致

原来的代码如下:

static struct mtd_partition smdk_default_nand_part[] = {

        [0] = {

                .name   = "Boot Agent",

                .size   = SZ_16K,

                .offset = 0,

        },

        [1] = {

                .name   = "S3C2410 flash partition 1",

                .offset = 0,

                .size   = SZ_2M,

        },

        [2] = {

                .name   = "S3C2410 flash partition 2",

                .offset = SZ_4M,

                .size   = SZ_4M,

        },

        [3] = {

                .name   = "S3C2410 flash partition 3",

                .offset = SZ_8M,

                .size   = SZ_2M,

        },

        [4] = {

                .name   = "S3C2410 flash partition 4",

                                                        

.........................后面省略.....................................................

将【0】到【4】的内容改为下面的代码。为的是与mach-mini2440.c里的分区信息一致,【5】到【7】保留不用修改。

[0] = {

                .name        "supervivi",

                .size        = 0x00040000,

                .offset        = 0,

        },

        [1] = {

                .name        "param",

                .size        = 0x00020000,

                .offset        = 0x00040000,

        },

        [2] = {

                .name        "kernel",

                /* 5 megabytes, for a kernel with no modules

                * or a uImage with a ramdisk attached */

                .size        = 0x00500000,

                .offset        = 0x00060000,

        },

        [3] = {

                .name        "root",

                .offset        = 0x00560000,

                .size        = 1024*1024*1024,

        },

        [4] = {

                .name   = "nand",

                .offset = 0,

                .size   = 1024*1024*1024,

        },

 

 

6.关闭ECC校验

件:drivers/mtd/nand/s3c2410.c

函数:s3c2410_nand_init_chip

/*chip->ecc.mode = NAND_ECC_SOFT; */chip->ecc.mode = NAND_ECC_NONE;

问题:关于ECC:ECC是“Error Correcting Code”的简写,中文名称是“错误检查和纠正”。ECC是一种能够实现“错误检查和纠正”的技术,ECC内存就是应用了这种技术的内存,一般多应用在服务器及图形工作站上,这将使整个电脑系统在工作时更趋于安全稳定。此处为避免容易出错,将ECC关闭。(目前小白一个,不好解释为什么要关闭,个人觉得这功能挺强大的啊,但加上了以后反而会不好用,表示不理解)

 

 

五.制作yaffs2文件补丁

1.给内核打补丁

之前基本上都是在linux-3.12源码目录进行操作,现在转变战场,咱们跑到yaffs2源码目录操作,进入yaffs2目录(不同的人不同的目录哦,自己看着办)

# cd /mnt/hgfs/E/yaffs2(依据你自己的情况而定)

[# ./patch-ker.sh c m /opt/lib/linux-3.12(后面是linux-3.12的路径,自己看着办)(一定要用c m,否则出错概率更大

Updating /opt/lib/linux-3.12/fs/Kconfig

Updating /opt/lib/linux-3.12/fs/Makefile

好景不长,咱们还是回到linux-3.12源码目录吧!谁让咱是一直内核的呢?

[root@localhost yaffs2]# cd /opt/lib/linux-3.12

2.修改“落后”文件

因为linux内核不断更新,所以对于文件系统的支持有变化,以及一些文件操作函数会变化,但是有可能你的yaffs2文件补丁还是用旧版本内核提供的文件操作函数,在新版本的内核里面,已经没有这个函数或者已经改变参数或者改变定义,这时编译就会报错,经过我多次试验,发现我这次下载的最新的yaffs2文件补丁只有yaffs_vfs.c是落后的。里面的create_proc_entry函数和readdir在linux-3.12里面已经木有了。所以将create_proc_entry的那段函数注释掉,然后发现readdir在新版里面使用iterate代替,故作如下更改:

 vim ./fs/yaffs2/yaffs_vfs.c

 

 

六.配置内核

不多说了,大家都懂的。。。。。。

#Make s3c2410_defconfig

#make menuconfig

 

1.  Kernel Features  --->

第一二个一定要选上,其他默认。

2.System Type  --->  

SAMSUNG S3C24XX SoCs Support  --->

[*] SAMSUNG S3C2440 

[*] MINI2440 development board 

[*] SMDK2440  

[*] SMDK2440 with S3C2440 CPU module

其他的不要选,以减小内核体积

3.General setup  --->

[*] Embedded system

-*- Configure standard kernel features (expert users)  --->  

上述两个必须选上,其他默认。

4.Boot options  --->

(root=/dev/hda1 ro init=/bin/bash console=ttySAC0) Default kernel command string

选中这项以后,回车进入编辑,将里面的内容用以下内容替换,缺一不可哦亲!

noinitrd root=/dev/mtdblock3 init=nuxrc console=ttySAC0,115200 rootfstype=yaffs2 rw mem=128M

 

5.[*] Enable loadable module support  --->

[*]   Forced module loading

[*]   Module unloading 

就选这两个,其他的不要选。

6.File systems  --->

[*] Miscellaneous filesystems  --->

<*>   yaffs2 file system support

这些个必须选上,其他的默认,有些选项会更具你的选择做出相应的匹配配置

七.#make zImage

激动人心的时刻啊!漫长的等待啊!你盯着屏幕休息一会儿,在./arch/arm/boot/里面就可以找到zImage了,将他下载到开发板试一下吧!

下完以后,不用着急下载文件系统,先在super vivi模式下,输入b,如果内核移植成功他就会这样了:

 

 

注意哦!先在的LCD是不会亮的,我们什么驱动都没有加进去,只是确保内核移植成功,并且支持yaffs2文件系统而已!

然后准备各个驱动模块的移植吧!!!

 

你可能感兴趣的:(虚拟机,文件系统,移植,linux内核)