Linux版本:linux-2.6.30.4
交叉编译器:3.4.5
开发板:友善之臂mini2440
开发板配置:SoC s3c2440 、网卡 DM9000 、 Nor Flash AM29LV160DB (2M) 、NAND FLash (256M) 、SDRAM (64M)
uboot版本:u-boot-1.1.6
一、准备工作
- 根文件系统,本次移植根文件系统已放置在服务器上,采用NFS方式挂载根文件系统。
- 下载 linux-2.6.30.4.tar.bz2源代码,并解压。解压命令为:#tar xvfj linux-2.6.30.4.tar.bz2 -C ./
- 指定CPU架构和编译器类型,打开源文件根目录下的Makefile文件的193行,命令是:#vim Makefile +193
将:
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
改成:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
- 编译,命令是:#make s3c2410_defconfig 和#make uImage
出现如下错误:
Can’t use ‘defined(@array)’ (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.
/home/book/work/test/linux-2.6.30.4/kernel/Makefile:128: recipe for target ‘kernel/timeconst.h’ failed
make[1]: *** [kernel/timeconst.h] Error 255
Makefile:881: recipe for target ‘kernel’ failed
make: *** [kernel] Error 2 - 更改该错误,并重新编译。命令是:#vim kernel/timeconst.pl +373
将:
if (!defined(@val)) {
改成:
if (! (@val)) {
再编译,命令是:#make uImage
编译完成,在arch/arm/boot目录下生产文件uImage文件。
二、修改系统时钟
打开arch/arm/mach-s3c2440/mach-smdk2440.c文件,命令是:#vim arch/arm/mach-s3c2440/mach-smdk2440.c +163
将:
s3c24xx_init_clocks(16934400);
改成:
s3c24xx_init_clocks(12000000);
三、DM9000网卡驱动移植
- 构造网卡相关结构体的数据
命令是:#vim arch/arm/plat-s3c24xx/common-smdk.c +46
添加如下代码:
#include <linux/dm9000.h>
/* DM9000AEP 10/100 ethernet controller */
#define MACH_MINI2440_DM9K_BASE (S3C2410_CS4 + 0x300)
static struct resource mini2440_dm9k_resource[] = {
[0] = {
.start = MACH_MINI2440_DM9K_BASE,
.end = MACH_MINI2440_DM9K_BASE + 3,
.flags = IORESOURCE_MEM
},
[1] = {
.start = MACH_MINI2440_DM9K_BASE + 4,
.end = MACH_MINI2440_DM9K_BASE + 7,
.flags = IORESOURCE_MEM
},
[2] = {
.start = IRQ_EINT7,
.end = IRQ_EINT7,
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
}
};
/*
2. * * The DM9000 has no eeprom, and it's MAC address is set by
3. * * the bootloader before starting the kernel.
4. * */
static struct dm9000_plat_data mini2440_dm9k_pdata = {
.flags = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
};
static struct platform_device mini2440_device_eth = {
.name = "dm9000",
.id = -1,
.num_resources = ARRAY_SIZE(mini2440_dm9k_resource),
.resource = mini2440_dm9k_resource,
.dev = {
.platform_data = &mini2440_dm9k_pdata,
},
};
- 将网卡驱动加入内核
在arch/arm/plat-s3c24xx/common-smdk.c文件的如下数组中,添加&mini2440_device_eth,选项,如下:
static struct platform_device *mini2440_devices[] __initdata = {
&smdk_led4,
&smdk_led5,
&smdk_led6,
&smdk_led7,
&mini2440_device_eth,//新增加
};
- 网卡初始化相关设置
打开 drivers/net/dm9000.c,命令是:#vim drivers/net/dm9000.c
添加如下头文件:
#include <mach/regs-mem.h>
在改文件中的函数dm9000_init(void)体中添加如下代码:
#if defined(CONFIG_ARCH_S3C2410)
unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;
unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;
*((volatile unsigned int *)S3C2410_BWSCON) =
(oldval_bwscon & ~(3<<16)) | S3C2410_BWSCON_DW4_16 |
S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
*((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;
#endif
四、编译测试
- 编译,命令是#make uImage
- 将编译好的uImage文件拷贝到NFS文件夹里,命令是:#sudo cp arch/arm/boot/uImage /home/book/roof_mini2440
- 下载到SDRAM测试,命令是:nfs 0x30000000 192.168.12.216:/home/book/roof_mini2440/uImage;bootm
- 启动成功,进入根文件系统。