交叉编译器:arm-linux-gcc-4.3.2
开发板平台:S3C2440(mini2440开发板)
注意:红色部分仅供参考,我没有做测试,还请谅解。如果有问题欢迎提出,也欢迎交流。
准备工作:
下载Linux内核源代码:http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.29.4.tar.bz2
交叉编译工具包:从光盘一般都带,没有到网上找找也有。
解压源码:tar -jxvf linux-2.6.29.4.tar.bz2
安装交叉编译工具:tar -jxvf arm-linux-gcc-4.3.2.tar.bz2 -C /
会将工具安装在/usr/local/arm/4.3.2/中
修改配置文件
1.修改顶层Makefile文件
直接将Makefile文件里面的 ln193
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
改为:
ARCH ?= arm
CROSS_COMPILE ?=arm-linux-
2.修改时钟,不修改超级终端中会出现乱码
修改arch/arm/mach-s3c2440/mach-smdk2440.c ln163
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000); //default is 16934400, changed by yangdk
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
3. 修改对nand的分区信息。要让内核知道nand flash的分区信息,设置成跟bootloader一致。
在arch/arm/plat-s3c24xx/common-smdk.c中修改smdk_default_nand_part[],注意这个一定要跟bootloader的一致。在我的板子中修改如下:
static struct mtd_partition smdk_default_nand_part[] = {
[0]={
.name = "boot",
.size = SZ_128K + SZ_64K, //192k 0x00300000
.offset = 0,
},
[1]={
.name = "kernel",
.size = SZ_16K * 116, //2M - 192K 0x01e00000
.offset = SZ_16K *12, //192K
},
[2]={
.name = "rootfs",
.offset = SZ_2M,
.size = SZ_2M * 15, //30M
},
[3]={
.name = "User",
.offset = SZ_32M,
.size = SZ_32M,
}
};
另外这个文件还要修改smdk_nand_info如下:
static struct s3c2410_platform_nand smdk_nand_info = {
.tacls = 0, //default is 20
.twrph0 = 30, //default is 60
.twrph1 = 0, //defualt is 20 changed by yangdk
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
};
//有的文章介绍说这个文件还要修改但查看友善之臂的内核发现并没有改,因此我也没有修改,最终也没出现问题.
4. 添加DM9000网卡驱动
修改arch/arm/mach-s3c2440/mach-smdk2440.c
在static struct platform_device *smdk2440_devices[] __initdata = {
@@ -154,12 +169,15 @@
&s3c_device_wdt,
&s3c_device_i2c,
&s3c_device_iis,
添加
&s3c_device_dm9000,
&s3c_device_rtc, //增加rtc初始化
修改arch/arm/plat-s3c24xx/devs.c,
#include <plat/cpu.h>
#include <asm/plat-s3c24xx/regs-spi.h>
后面添加
/***************tekkaman*********************/
/* DM9000 registrations */
#include <linux/dm9000.h>
#define DM9000_BASE 0x20000300
static struct resource s3c_dm9000_resource[] = {
[0] = {
.start = DM9000_BASE,
.end = DM9000_BASE + 0x03,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = DM9000_BASE + 0x04,
.end = DM9000_BASE + 0x04 + 0x7c,
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_EINT7,
.end = IRQ_EINT7,
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
}
};
static struct dm9000_plat_data s3c_device_dm9000_platdata = {
.flags = DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM,
};
struct platform_device s3c_device_dm9000 = {
.name= "dm9000",
.id= 0,
.num_resources= ARRAY_SIZE(s3c_dm9000_resource),
.resource= s3c_dm9000_resource,
.dev= {
.platform_data = &s3c_device_dm9000_platdata,
}
};
EXPORT_SYMBOL(s3c_device_dm9000);
/***************tekkaman*********************/
在linux-2.6.29.4arch/arm/plat-s3c24xx/include/plat/include/devs.h
extern struct s3c24xx_uart_resources s3c2410_uart_resources[];
后面添加:
extern struct platform_device s3c_device_dm9000;
修改drivers/net/dm9000.c
添加37行
#include <asm/io.h>
5.配置及编译内核
然后用S3C2410的默认配置文件
#cp arch/arm/configs/s3c2410_defconfig .config
#make menuconfig //只需修改下面几项
[*] Enable loadable module support --->
[*] Module unloading
[*] Automatic kernel module loading
选择这两个,剩下的可以去掉
System Type ---->
[*] S3C2410 DMA support
S3C2410 Machines --->
[*] SMDK2410/A9M2410
S3C2440 Machines --->
[*] SMDK2440
[*] SMDK2440 with S3C2440 CPU module
//System Type这部分,只选这些,其他可以全部去掉,
Boot option ----->
修改启动参数为:noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200
可能根据个人板子的设置会不一样,我的是从Nand Flash中加载文件系统,其中mtdblock2是存放我的Linux文件系统的分区。不过,在bootloader可以传递内核参数的情况下这个设置是无效的。
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
[*] MTD partitioning support
<*> NAND Device Support --->
<*> NAND Flash support for S3C2410/S3C2440 SoC
[ ] S3C2410 NAND Hardware ECC //这个要去掉
[*] Network device support --->
[*] Ethernet (10 or 100Mbit) --->
<*> DM9000 support
Kernel Features ->
[*]Use the ARM EABI to compile the kernel
[*] Allow old ABI binaries to run with this kernel
这里由于使用了codesourcery的工具链,此工具链支持EABI,,内核编译时也要选上,否则用这个编译器编出来的用户程序无法运行,最典型的错误是Busybox无法运行。
到此为止,基本完成。下面正式编译
#make zImage