- 论坛徽章:
- 0
|
移植linux2.6.14内核
硬件环境:基于Vmware5.0上的RedHat9.0 ;Windows XP
阳初S3c2410开发板
软件资源:linux2.6.14.1内核 下载地址:
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.1.tar.bz2
交叉工具:(如果不能连接,请用迅雷新建任务下载)
ftp://ftp.handhelds.org/projects/toolchain/arm-linux-gcc-3.4.1.tar.bz2
如果已经完成上面的内容就可以开始编译内核了:
以$前缀表示命令
一:安装linux-2.6.14.1.tar.bz2:
$tar jxf linux-2.6.14.1.tar.bz2 –C /usr/src/
安装arm-linux-gcc-3.4.1.tar.bz2:
$tar jxf arm-linux-gcc-3.4.1.tar.bz2 –C /
注意上面的 / 代表根目录
$export PATH=/usr/local/arm/3.4.1/bin:$PATH
输出交叉编译路径
二:对NAND FLASH 分区进行配置
$cd /usr/src/linux-2.6.14.1
$ vi arch/arm/mach-s3c2410/devs.c 添加下面内容
#include
#include
#include
...
#NAND需要的头文件
1.建立Nand Flash分区表
/* 一个Nand Flash总共64MB, 按如下大小进行分区 */
static struct mtd_partition partition_info[] ={
{
name: "vivi",
size: 0x00020000,
offset: 0,
}, {
name: "param",
size: 0x00010000,
offset: 0x00020000,
}, {
name: "kernel",
size: 0x001c0000,
offset: 0x00040000,
}, {
name: "root",
size: 0x03cf8000,
offset: 0x00200000,
mask_flags: MTD_WRITEABLE,
}, {
name: "usr",
size: 0x03a00000,
offset: 0x00600000,
}
};
这里请注意:上面的分区需要跟bootloader分区对应起来
本人bootloader用的是MIZI的VIVI 用命令part show可以看到分区信息;否则出现
kernel panic: VFS: Unable to mount root fs on Unkonw-block (31,2)
诸如此类的错误
2. 加入Nand Flash分区
struct s3c2410_nand_set nandset ={
nr_partitions: 5, /* the number of partitions */
partitions: partition_info, /* partition table */
};
# partition_info是上面的分区信息;nr_partitions: 5 为分区数目
3. 建立Nand Flash芯片支持
struct s3c2410_platform_nand superlpplatform={
tacls:0,
twrph0:30,
twrph1:0,
sets: &nandset,
nr_sets: 1,
};
# tacls, twrph0, twrph1是nand flash的时序控制,
这3个值最后会被设置到NFCONF中
sets: 支持的分区集
nr_set:分区集的个数
4. 加入Nand Flash芯片支持到Nand Flash驱动
另外,还要修改此文件中的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: 设备名称
id: 有效设备编号,如果只有唯一的一个设备为1,
有多个设备从0开始计数.
num_resource: 有几个寄存器区
resource: 寄存器区数组首地址
dev: 支持的Nand Flash设备
下面添加arch/arm/machs3c2410/machsmdk2410.c
$vi arch/arm/machs3c2410/machsmdk2410.c
static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
/* 添加如下语句即可 */
&s3c_device_nand,
};
#对NAND的支持
$vi drivers/mtd/nand/s3c2410.c
找到s3c2410_nand_init_chip()函数,在该函数体最后加上一条语句:
Chip->eccmode = NAND_ECC_NONE;
把chip->eccmode = NAND_ECC_SOFT注释或删掉
替代为Chip->eccmode = NAND_ECC_NONE;(取消ecc校验)
上面的修改是对NAND FLASH 进行分区配置
三:为了我们的内核支持devfs以及在启动时并在/sbin/init运行之前能自动挂载/dev为devfs文件系统,修改fs/Kconfig文件
$vi fs/Kconfig
找到menu "Pseudo filesystems"
添加如下语句:
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
上面的意思是当执行make menuconfig时产生DEVFS_FS DEVFS_MOUNT这两项,默认是编译进内核
四:开始编译内核
你可以对内核的配置选项手动选择,也可以使用S3C2410的默认配置,然后进行修改;
$cp /arch/arm/configs/smdk2410_defconfig .config
$make menuconfig(make xconfig;make gconfig)
上面的意思是,当运行make menuconfig,如果当前目录存在.config就调用它,否则创建它.
根据需要添加选项:
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/mtdblock3 init=/linuxrc console=ttySAC0,115200
#说明:mtdblock3代表我的第4个flash分区,它是我的rootfs
# console=ttySAC0,115200使kernel启动期间的信息全部输出到串口0上.
# 2.6内核对于串口的命名改为ttySAC0,但这不影响用户空间的串口编程。
# 用户空间的串口编程针对的仍是/dev/ttyS0等
Floating point emulation >
NWFPE math emulation
This is necessary to run most binaries!!!
#接下来要做的是对内核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 non-CFI AMD/JEDEC-compatible 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
#接下来做的是针对文件系统的设置,本人实验时目标板上要上的文件系统是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)
#这里会看到我们前先修改fs/Kconfig的成果,devfs已经被支持上了
Miscellaneous filesystems >
Compressed ROM file system support (cramfs)
#支持cramfs
Network File Systems >
NFS file system support
保存退出,产生.config文件.
接下来就可以产生内核了
$make zImage (zImage 是vmlinux经过objcopy ->gzip-> asm 产生的压缩内核镜像,在加载内核是调用misc进行解压)
如果编译成功的话,在arch/arm/boot目录看到zImage
然后下载zImage到开发板验证。
本人用的bootloader是vivi,在上面提到vivi 的分区与nand flash 要一样,不然的话将不能加载文件系统。
因为开发板默认的root分区的flag是16为yaff文件系统。如果用cramfs
要将flag设为0
关键的vivi 的命令行解析命令要与上面设置
Default kernel command string:
noinitrd root=/dev/mtdblock3 init=/linuxrcconsole=ttySAC0,115200
保持一致.在vivi命令下
vivi>param show 可以看到默认设置,要进行修改
vivi>param set linux_cmd_line “noinitrd root=/dev/mtdblock/3 (init=/linuxrc console=ttySAC0,115200”
noinitrd表示告诉内核不要把安装器影像装载到内存,root=/dev/mtdblock/3表示flash的root分区。init=/linuxrc表示根文件系统初始化文件位linuxrc,制作根文件系统是创建的初始化文件。
console=ttySAC0,115200表示使用串口0波特率为115200)
vivi>net tftp 192.168.18.8 0x30008000 zImage
vivi>net flash kernel
vivi>net tftp 192.168.18.8 0x30008000 root_china.cramfs
vivi>net flash root
按复位键启动,就可以进入linux了
到此,移植过程已经结束。由于每个人开发板和CPU的不同,移植过程会碰到各种问题,针对自己的开发板和错误信息进行排除是最重要的,不要希望一次就成功,学会根据错误来提高自己的理解,在解决错误的时候是收获最多的。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/73974/showart_1160725.html |
|