硬件:
安装了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文件系统而已!
然后准备各个驱动模块的移植吧!!!