您的位置:首页 > 运维架构 > Linux

移植最新linux-3.12到mini2440

2013-11-20 19:21 393 查看
硬件:

安装了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文件系统而已!

然后准备各个驱动模块的移植吧!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: