1 內核移植過(guò)程
1.1 下載linux內核
從http://www.kernel.org/pub/linux/kernel/v2.6/linux2.6.14.1.
tar.bz2
下載linux2.6.14.1
內核至home/arm/dev_home/kernel.
[root@localhost ~]#su arm
[arm@localhost ~]#cd $KERNEL
[arm@localhost kernel]#tar xzvf
linux2.6.14.1.
tar.gz
[arm@localhost kernel]# pwd
/home/arm/dev_home/kernel
[arm@localhost kernel]# cd linux2.6.14
進(jìn)入內核解壓后的目錄,以后示例中,只要是相對路徑全部是相對于
/home/arm/dev_home/kernel/linux2.6.14/
此目錄
1.2 修改Makefile
修改內核目錄樹(shù)根下的的Makefile,指明交叉編譯器
[arm@localhost linux2.6.14]#
vi Makefile
找到ARCH和CROSS_COMPILE,修改
ARCH ?= arm
CROSS_COMPILE ?= armlinux
然后設置你的PATH環(huán)境變量,使其可以找到你的交叉編譯工具鏈
[arm@localhost linux2.6.14]#echo $PATH/usr/local/arm/3.4.4/bin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin:/home/ly/bin
如果/usr/local/arm/3.4.4/bin搜索路徑, 加入下面語(yǔ)句在~/.bashrc中
[arm@localhost linux2.6.14]#
vi ~/.bashrc
export PATH=/usr/local/arm/3.4.4/bin:$PATH
再重新登陸.
[arm@localhost linux2.6.14]#
su arm
1.3 設置flash分區
此處一共要修改3個(gè)文件,分別是:
1.3.1指明分區信息
在arch/arm/machs3c2410/
devs.c文件中:
[arm@localhost linux2.6.14]$
vi arch/arm/machs3c2410/
devs.c
添加如下內容:
#include <linux/mtd/partitions.h>
#include <linux/mtd/nand.h>
#include <asm/arch/nand.h>
...
/* NAND Controller */
1.建立Nand Flash分區表
/* 一個(gè)Nand Flash總共64MB, 按如下大小進(jìn)行分區 */
static struct mtd_partition partition_info[] ={
{ /* 1MB */
name: "bootloader",
size: 0x00100000,
offset: 0x0,
},{ /* 3MB */
name: "kernel",
size: 0x00300000,
offset: 0x00100000,
}, { /* 40MB */
name: "root",
size: 0x02800000,
offset: 0x00400000,
}, { /* 20MB */
name: "user",
size: 0x00f00000,
offset: 0x02d00000,
}
};
name: 代表分區名字
size: 代表flash分區大小(單位:字節)
offset: 代表flash分區的起始地址(相對于0x0的偏移)
目標板計劃分4個(gè)區,分別存放bootloader, kernel, rootfs以及以便以后擴展使用的用戶(hù)文件系統空間。
各分區在Nand flash中起始地址. 分區大小. 記錄如下:
2. 加入Nand Flash分區
struct s3c2410_nand_set nandset ={
nr_partitions: 4, /* the number of partitions */
partitions: partition_info, /* partition table */
};
nr_partitions: 指明partition_info中定義的分區數目
partitions: 分區信息表
3. 建立Nand Flash芯片支持
struct s3c2410_platform_nand superlpplatform={
tacls:0,
twrph0:30,
twrph1:0,
sets: &nandset,
nr_sets: 1,
};
tacls, twrph0, twrph1的意思見(jiàn)S3C2410手冊的63,
這3個(gè)值最后會(huì )被設置到NFCONF中,見(jiàn)S3C2410手冊66.
sets: 支持的分區集
nr_set:分區集的個(gè)數
4. 加入Nand Flash芯片支持到Nand Flash驅動(dòng)
另外,還要修改此文件中的s3c_device_nand結構體變量,添加對dev成員的賦值
struct platform_device s3c_device_nand = {
.name = "s3c2410nand",
/* Device name */
.id = 1,
/* Device ID */
.num_resources = ARRAY_SIZE(s3c_nand_resource),
.resource = s3c_nand_resource, /* Nand Flash Controller Registers */
/* Add the Nand Flash device */
.dev = {
.platform_data = &superlpplatform
}
};
name: 設備名稱(chēng)
id: 有效設備編號,如果只有唯一的一個(gè)設備為1,
有多個(gè)設備從0開(kāi)始計數.
num_resource: 有幾個(gè)寄存器區
resource: 寄存器區數組首地址
dev: 支持的Nand Flash設備
1.3.2 指定啟動(dòng)時(shí)初始化
kernel啟動(dòng)時(shí)依據我們對分區的設置進(jìn)行初始配置
修改arch/arm/machs3c2410/
machsmdk2410.
c文件
[arm@localhost linux2.6.14]$
vi arch/arm/machs3c2410/
machsmdk2410.
c
修改smdk2410_devices[].指明初始化時(shí)包括我們在前面所設置的flash分區信息
static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
/* 添加如下語(yǔ)句即可 */
&s3c_device_nand,
};
保存,退出。
1.3.3 禁止Flash ECC校驗
我們的內核都是通過(guò)UBOOT寫(xiě)到Nand Flash的, UBOOT通過(guò)的軟件ECC算法產(chǎn)生ECC校驗碼, 這與內核
校驗的ECC碼不一樣, 內核中的ECC碼是由S3C2410中Nand Flash控制器產(chǎn)生的. 所以, 我們在這里選擇禁止
內核ECC校驗.
修改drivers/mtd/nand/s3c2410.c 文件:
[arm@localhost linux2.6.14]$
vi drivers/mtd/nand/s3c2410.c
找到s3c2410_nand_init_chip()函數,在該函數體最后加上一條語(yǔ)句:
chip>
eccmode = NAND_ECC_NONE;
保存,退出。
OK.我們的關(guān)于flash分區的設置全部完工.
1.4 配置內核
1.4.1 支持啟動(dòng)時(shí)掛載devfs
為了我們的內核支持devfs以及在啟動(dòng)時(shí)并在/sbin/init運行之前能自動(dòng)掛載/dev為devfs文件系統,修改
fs/Kconfig文件
[arm@localhost linux2.6.14]$
vi fs/Kconfig
找到menu "Pseudo filesystems"
添加如下語(yǔ)句:
config DEVFS_FS
bool "/dev file system support (OBSOLETE)"
default y
config DEVFS_MOUNT
bool "Automatically mount at boot"
default y
depends on DEVFS_FS
1.4.2配置內核產(chǎn)生.config文件
[arm@localhost linux2.6.14]$
cp arch/arm/configs/smdk2410_defconfig .config
[arm@localhost linux2.6.14]$
make menuconfig
在smdk2410_defconfig基礎上,我所增刪的內核配置項如下:
Loadable module support >
[*] Enable loadable module support
[*] Automatic kernel module loading
System Type >
[*] S3C2410 DMA support
Boot options >
Default kernel command string:
noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200
#說(shuō)明:mtdblock2代表我的第3個(gè)flash分區,它是我的rootfs
# console=ttySAC0,115200使kernel啟動(dòng)期間的信息全部輸出到串口0上.
# 2.6內核對于串口的命名改為ttySAC0,但這不影響用戶(hù)空間的串口編程。
# 用戶(hù)空間的串口編程針對的仍是/dev/ttyS0等
Floating point emulation >
[*] NWFPE math emulation
This is necessary to run most binaries!!!
#接下來(lái)要做的是對內核MTD子系統的設置
Device Drivers >
Memory Technology Devices (MTD) >
[*] MTD partitioning support
#支持MTD分區,這樣我們在前面設置的分區才有意義
[*] Command line partition table parsing
#支持從命令行設置flash分區信息,靈活
RAM/ROM/Flash chip drivers >
<*> Detect flash chips by Common Flash
Interface (CFI) probe
<*> Detect nonCFI
AMD/JEDECcompatible
flash chips
<*> Support for Intel/Sharp flash chips
<*> Support for AMD/Fujitsu flash chips
<*> Support for ROM chips in bus mapping
NAND Flash Device Drivers >
<*> NAND Device Support
<*> NAND Flash support for S3C2410/S3C2440 SoC
Character devices >
[*] Nonstandard
serial port support
[*] S3C2410 RTC Driver
#接下來(lái)做的是針對文件系統的設置,本人實(shí)驗時(shí)目標板上要上的文件系統是cramfs,故做如下配置
File systems >
<> Second extended fs support #去除對ext2的支持
Pseudo filesystems >
[*] /proc file system support
[*] Virtual memory file system support (former shm fs)
[*] /dev file system support (OBSOLETE)
[*] Automatically mount at boot (NEW)
#這里會(huì )看到我們前先修改fs/Kconfig的成果,devfs已經(jīng)被支持上了
Miscellaneous filesystems >
<*> Compressed ROM file system support (cramfs)
#支持cramfs
Network File Systems >
<*> NFS file system support
保存退出,產(chǎn)生.config文件.
.config文件能從提供的2.4.14.1的內核包中找到,文件名為config.back.
1.4.3編譯內核
[arm@localhost linux2.6.14]$
make zImage
注意:若編譯內核出現如下情況
LD .tmp_vmlinux1
armlinuxld:
arch/arm/kernel/vmlinux.lds:1439: parse error
make: *** [.tmp_vmlinux1] Error 1
解決方法:修改arch/arm/kernel/vmlinux.lds
[arm@localhost linux2.6.14]$
vi arch/arm/kernel/vmlinux.lds
將文件尾2條的ASSERT注釋掉(1439行)
/* ASSERT((__proc_info_end __
proc_info_begin), "missing CPU support") */
/* ASSERT((__arch_info_end __
arch_info_begin), "no machine record defined") */
然后重新make zImage即可
1.4.4 下載zImage到開(kāi)發(fā)板
CRANE2410 # tftp 0x30008000 zImage
TFTP from server 192.168.1.6; our IP address is 192.168.1.5
Filename 'zImage'.
Load address: 0x30008000
Loading: #################################################################
#################################################################
#################################################################
#############################
done
Bytes transferred = 1142856 (117048 hex)
CRANE2410 # bootm 0x30008000