3、裁剪和移植Linux 2.6 内核
Linux 2.6.28 内核对基于 S3C2440 的 SMDK2440 目标板有很好支持。因为 EmbedSky 和 SMDK2410 结构相似,所以在 SMDK2440 代码的基础上移植 EmbedSky 。内核移植如下:
1.解压源码包
tar zxvf linux-2.6.28.tar.gz
cd linux-2.6.28
2.修改 Makefile
vim Makefile
修改 ARCH、CROSS_COMPILE 变量如下:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
3.取消内核的 NAND 校验
这一步原因在于 U-Boot 的 ECC 算法和内核的 ECC 算法不一致。修改如下:
vim driver/mtd/nand/s3c2410.c
将 NAND_ECC_HW 和 NAND_ECC_SOFT 改成 NAND_ECC_NONE
4.定义晶振频率(12MHz)
vim arch/arm/arch-s3c2440/mach-smdk2440.c
static void __init smdk2440_map_io(void){
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000); // 12MHz
...
}
5. 添加 Nand Flash 支持
(1) 定义 Nand Flash 分区:将 Flash 分成三个区:
第一区作为 BootLoader,容量为 0x50000 字节
第二区作为 Kernel 内核,容量为 2M 字节
第三区作为根文件,容量为 32M 字节
(2) 定义 s3c2412_nand_set
(3) 定义 platform_device
(4) 将 s3c_device_nand 加入 platform_devices:
static struct platform_device *smdk2440_devices[] __initdata = {
&s3c_device_nand;
...
};
6. 移植 DM9000 网卡驱动
Linux 自带的 dm9000.c 驱动不能工作,因为驱动只实现了网卡自身工作,没
有初始化系统接口引脚寄存器,添加接口初始化代码:
(1) 修改源文件 include/linux/dm9000.h,给 dm9000_plat_data 增加一个回调指
针。该回调函数的作用是初始化 s3c2440 中与 dm9000 相关的引脚:
struct dm9000_plat_data{
void (*bd_port_init)(void); // 增加的回调
...
};
(2) 修改源文件 driver/net/dm9000.c,在 dm9000_probe 函数中调用该回调
static int __devinit dm9000_probe(struct platform_device *pdev){
struct dm9000_plat_data *pdata = pdev->dev.platform_data;
...
if(pdata->bd_port_init){ // 如果非 NULL
pdata->bd_port_init(); // 调用该函数
}
...
}
(3) 定义 port_init_dm9000()函数作为回调的实体。该函数与具体电路相关,
函数定义见附录 II。
(4) 将设备加入列表:
将 s3c_device_dm9000 加入到 platform_devices 数组:
static struct platform_device *smdk2440_devices[] __initdata = {
&s3c_device_nand,
&s3c_device_dm9000,
`...
};
7. 移植其它驱动。
8. 内核裁剪编译。
(1)把内核自带的 s3c2410 默认配置拷贝到根目录
cp arch/arm/configs/s3c2410_defconfig .config
(2).配置和裁剪内核功能
make menuconfig
在默认配置基础上做如下配置(内核配置选项多,选重要的说明)
System Type --->
S3C2410 Machines --->
[*] SMDK2410/A9M2410 # 该项一定要选(参看该项的 HELP)
[ ] IPAQ H1940 # 其余全部不选
[ ] Acer N30
[ ] Simtec Electronics BAST (EB2410ITX)
[ ] NexVision OTOM Board
[ ] AML M5900 Series
[ ] Thorcom VR1000
[ ] QT2410
S3C2412 Machines ---> # 清除菜单下的所有子项
S3C2440 Machines --->
[ ] Simtec Electronics ANUBIS
[ ] Simtec IM2440D20 (OSIRIS) module
[ ] HP iPAQ rx3715
[*] SMDK2440 # 选中
[ ] NexVision NEXCODER 2440 Light Board
[*] SMDK2440 with S3C2440 CPU module # 选中
S3C2442 Machines ---> # 清除菜单下所有子项
S3C2443 Machines ---> # 清除菜单下所有子项
[*] Support ARM920T processor
Boot options --->
# 设置第三项启动参数(Defalt kernel command string)内容如下:
noinitrd root=/dev/mtdblock2 rootfstype=jffs2 console=ttySAC0,115200
init=linuxrc mem=64m
Device Drivers --->
<*> Memory Technology Device (MTD) support ---> # NAND Flash 支持
[*] Network device support ---> # 网卡支持
[*] Ethernet (10 or 100Mbit) --->
<*> DM9000 support
File systems ---> # 文件系统
< > Second extended fs support
< > Ext3 journalling file system support
... ...
<*> Kernel automounter support # 选中
Pseudo filesystems --->
[*] Virtual memory file system support (former shm fs) # tmpfs 支持
Miscellaneous filesystems --->
<*> Journalling Flash File System v2 (JFFS2) support # JFFS2
(0) JFFS2 debugging verbosity (0 = quiet, 2 = noisy)
[*] JFFS2 write-buffering support
[ ] Verify JFFS2 write-buffer reads (NEW)
[ ] JFFS2 summary support (EXPERIMENTAL)
[ ] JFFS2 XATTR support (EXPERIMENTAL)
[*] Advanced compression options for JFFS2 # 压缩方式全选
[*] JFFS2 ZLIB compression support
[*] JFFS2 LZO compression support
[*] JFFS2 RTIME compression support
[*] JFFS2 RUBIN compression support
[*] Network File Systems (NEW) --->
(3) 配置完成后保存配置,然后编译内核映像 zImage
make zImage
(4) 编译驱动模块
make modules
(5) 安装模块
make modules_install
(6).生成 U-Boot 格式的镜像
./mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008000 -n
'linux-2.6.24' -d arch/arm/boot/zImage uImage.bin
生成 uImage.bin 文件。需要这一步的原因是 U-Boot 只能引导使用 mkimage
处理过的内核。内核启动参数是由 U-Boot 提供的(只要 U-Boot 定义过该参数),
内核配置选项中的 Defalt kernel command string 不影响。