分类: LINUX
2013-05-01 21:12:48
MINI2440 Linux-2.6.32.2 内核移植详细步骤
Linux-2.6.32.2内核 Fedora 10虚拟机 gcc4.3.2版本的交叉编译器
移植的步骤不算很难,但是要深入了解其配置原理就不是一件容易的事。认真仔细地按照官方的pdf来操作,稍微有些步骤没注意搞错了或漏了,到时编译内核的时候就会出现很多错误,都不知道从何处下手找方法来解决。虽然有度娘,但是也不是所有自己遇到的问题都能找到很好的解决方法。而且内核源码比较大,每次解压都得十几二十分钟,遇到不能解决的问题,卡在上面得重新解压源码(这种方法很笨,但没想到其他什么好的办法了),然后还得重新做同样的步骤,可想而知这样浪费的时间不少。所以后来就想到适当时源码打包备份,有问题时可以很快地回到上一步重新来过。以下是鄙人根据官方的pdf和一些博客移植内核做的一些步骤,仅供大家一起参考学习,有错误请指出。
1.解压内核代码到/opt/FriendlyARM/mini2440
使用命令 cd /opt/FriendlyARM/mini2440
使用命令 tar xvzf/.../linux-2.6.32.2.tar.gz
2.指定交叉编译变量
2.1修改源代码目录下的Makefile
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
改为
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
2.2使用命令makes3c2410_defconfig,使用缺省内核配置文件,如下:
[root@EmbedSky linux-2.6.32.2]# make s3c2410_defconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/basic/docproc
HOSTCC scripts/basic/hash
HOSTCC scripts/kconfig/conf.
HOSTCC scripts/kconfig/kxgettext.o
SHIPPEDscripts/kconfig/zconf.tab.c
SHIPPEDscripts/kconfig/lex.zconf.c
SHIPPEDscripts/kconfig/zconf.hash.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/conf
#
# configuration written to .confi
#
[root@EmbedSkylinux-2.6.32.2]#
2.3使用命令make 编译内核
3.克隆建立自己的目标平台
3.1将linux-2.6.32.2/arch/arm/mach-s3c2440/目录下的mach-mini2440.c移除,再把mach-smdk2440.c 复制一份并命名为mach-mini2440.c , 找到MACHINE_START(S3C2440,"SMDK2440"), 修改为MACHINE_START(MINI2440, "FriendlyARM Mini2440development board")开发板运行后,在命令行终端输入:cat /proc/cpuinfo 可以看到我们添加的开发板信息:FriendlyARMMini2440 development board
3.2现 在 再 来 修 改 系 统 时 钟 源 , 在mach-mini2440.c( 就是我们刚刚通过复制mach-smdk2440.c 得到的)的第160 行static void __initsmdk2440_map_io(void)函数中,把其中的16934400(代表原SMDK2440 目标板上的晶振是16.9344MHz)改为mini2440开发板上实际使用的12000000
3.3因为我们要制作自己的mini2440 平台体系,因此把mach-mini2440.c中所有的
smdk2440 字样改为mini2440,可以使用批处理命令修改,在vim的命令模式下输入:
%s/smdk2440/mini2440/g 除此之外,还有一个地方需要改动,在mini2440_machine_init(void)函数中,把smdk_machine_init()函数调用注释掉,因为我们后面会编写自己的初始化函数,不需要调用smdk2440原来的
3.4在 Linux 源代码根目录下执行
#make mini2440_defconfig ;使用Linux官方自带的mini2440 配置
#make zImage ;编译内核,时间较长,最后会生成zImage
重新编译并把生成的内核文件zImage(位于arch/arm/boot目录)下到板子中,可以看到内核已经可以正常启动了,如下图,但此时大部分硬件驱动还没加,并且也没有文件系统,因此还无法登陆。
4.移植Nand驱动并更改分区(在刚刚我们通过复制mach-smdk2440.c得到的mach-mini2440.c 添加一些头文件和代码)
4.1添加头文件(注意:这一步《mini2440 linux移植开发实战指南.pdf》没提到)
#include
#include
#include
#include
#include
4.2
static struct mtd_partitionmini2440_default_nand_part[] = {
[0] = {
.name = "supervivi", ;这里是bootloader 所在的分区,可以放置u-boot,supervivi 等内容,对应
/dev/mtdblock0
.size = 0x00040000,
.offset = 0,
},
[1] = {
.name = "param", ;这里是supervivi 的参数区,其实也属于bootloader的一部分,如果u-boot比较
大,可以把此区域覆盖掉,不会影响系统启动,对应/dev/mtdblock1
.offset = 0x00040000,
.size = 0x00020000,
},
[2] = {
.name = "Kernel", ;内核所在的分区,大小为5M,足够放下大部分自己定制的巨型内核了, 比如内核使用了更大的Linux Logo 图片等,对应/dev/mtdblock2
.offset = 0x00060000,
.size = 0x00500000,
},
[3] = {
.name = "root", ;文件系统分区,友善之臂主要用来存放yaffs2文件系统内容,对应/dev/mtdblock3
.offset = 0x00560000,
.size = 1024 * 1024 * 1024, //
},
[4] = {
.name = "nand", ;此区域代表了整片的nandflash,主要是预留使用,比如以后可以通过应用程序访
问读取/dev/mtdblock4 就能实现备份整片nandflash 了。
.offset = 0x00000000,
.size = 1024 * 1024 * 1024, //
}
};
;这里是开发板的nand flash 设置表,因为板子上只有一片,因此也就只有一个表
static struct s3c2410_nand_set mini2440_nand_sets[] ={
[0] = {
.name = "NAND",
.nr_chips = 1,
.nr_partitions = ARRAY_SIZE(mini2440_default_nand_part),
.partitions = mini2440_default_nand_part,
},
};
;这里是nandflash 本身的一些特性,一般需要对照datasheet填写,大部分情况下按照以下参数填写即可
static struct s3c2410_platform_nand mini2440_nand_info= {
.tacls = 20,
.twrph0 = 60,
.twrph1 = 20,
.nr_sets = ARRAY_SIZE(mini2440_nand_sets),
.sets = mini2440_nand_sets,
.ignore_unset_ecc = 1,
};
4.3在staticstruct platform_device *mini2440_devices[] __initdata = {};结构体中 " &s3c_device_nand, ";把nand flash 设备添加到开发板的设备列表结构。
4.4在static void __init mini2440_map_io(void){ }函数中添加中加入以下代码:(注意:这一步mini2440linux移植开发实战指南.pdf》没提到)
"s3c_device_nand.dev.platform_data = &mini2440_nand_info;"
5.在内核源码根目录下执行命令:make zImage 编译内核
在这一步可能会出现这样一个错误提示:include/asmis a directory but a symlink was expected。解决方法:可以用rm -rf include/asm删除源码根目录下的include/asm目录。原因:linux/include/asm文件夹是内核编译过程中创建的,创建结果就是一个指向文件夹asm-arm的链接,表明该系统的平台是arm架构的,而编译系统内核之前,是没有asm这个链接的,所以,在编译过程中,创建该链接时文件名字与asm文件夹的名字发生冲突,报错了。
6.解决错误编译出内核镜像zImage,下载到开发板测试运行,部分情况如下(成功移植Nand):
Copy linux kernel from 0x00060000 to 0x30008000, size= 0x00500000 ... done
zImage magic = 0x016f2818
Setup linux parameters at 0x30000100
linux command line is: "noinitrdroot=/dev/mtdblock3 init=/linuxrc console=ttySAC0"
MACH_TYPE = 1999
NOW, Booting Linux......
UncompressingLinux.................................................................................................................................done, booting the kernel.
Linux version 2.6.32.2 (root@EmbedSky) (gcc version4.3.3 (Sourcery G++ Lite 2009q1-176) ) #3 Mon Jan 21 16:49:32 CST 2013
CPU: ARM920T [41129200] revision 0 (ARMv4T),cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: FriendlyARM Mini2440 development board
ATAG_INITRD is deprecated; please update yourbootloader.
Memory policy: ECC disabled, Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C24XX Clocks, (c) 2004 Simtec Electronics
S3C244X: core 405.000 MHz, memory 101.250 MHz,peripheral 50.625 MHz
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
Built 1 zonelists in Zone order, mobility groupingon. Total pages: 16256
Kernel command line: noinitrd root=/dev/mtdblock3init=/linuxrc console=ttySAC0
PID hash table entries: 256 (order: -2, 1024 bytes)
Dentry cache hash table entries: 8192 (order: 3, 32768bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384bytes)
。。。。。。。。。。。。。。。。。
Advanced Linux Sound Architecture Driver Version 1.0.21.
No device for DAI UDA134X
No device for DAI s3c24xx-i2s
ALSA device list:
No soundcardsfound.
TCP cubic registered
NET: Registered protocol family 17
drivers/rtc/hctosys.c: unable to open rtc device(rtc0)
List of all partitions:
1f00 256 mtdblock0 (driver?)
1f01 128 mtdblock1 (driver?)
1f02 5120 mtdblock2 (driver?)
1f03 256640 mtdblock3 (driver?)
1f04 262144 mtdblock4 (driver?)
No filesystem could mount root, tried: ext3 cramfs vfat msdos romfs
Kernel panic - not syncing: VFS: Unable to mount rootfs on unknown-block(31,3)
[
[
[
[
[
以下可以直接按照光盘的《mini2440 linux移植开发实战指南.pdf》操作
7.移植yaffs2
7.1先将解压yaffs2源代码到与内核源码同目录下(官网配套的光盘中有源代码包:yaffs2-src-20100329.tar.gz)
7.2为内核打上补丁,进入yaffs2源代码目录执行命令#./patch-ker.sh c /opt/FriendlyARM/linux-2.6.32.2(其实红色部分就是内核源码的目录路径,要根据实际情况更改),完成后进入linux-2.6.32.2/fs 目录,看到已经多了一个yaffs2 目录就说明yaffs2补丁已打上。
8配置和编译带yaffs2支持的内核
在 Linux 内核源代码根目录运行:make menuconfig 找到FileSystems ,再找到“Miscellaneous filesystems”菜单项,按回车进入该子菜单,找到“YAFFS2file system support”,并按空格至”*”选中它,这样我们就在内核中添加了yaffs2 文件系统的支持,按“Exit”退出内核配置。在根目录执行:#make zImage
9测试
最后会生成 linux-2.6.32.2/arch/arm/boot/zImage,使用supervivi 的”k”功能把它烧写到nandflash,按“b“启动系统,这时,如果nand flash 已经存在文件系统(可以使用supervivi的”y”功能烧写友善之臂提供的现成的yaffs2 文件系统映像root_qtopia-128M.img 用以测试),就会看到如图信息了,这说明yaffs2 已经移植成功。
启动后终端会显示有:Please press Enter to activate this console.
按下Enter键后就进入开发板,这样我们就可以通过终端来控制操作开发板。