二、移植linux内核
所需文件:
内核:Linux-2.6.29.1.tar.bz2
yaffs2代码:cvs-root.tar.gz
解压在工作目录下,分别是:
linux-2.6.29.1
cvs
1.修改内核源码
修改内核根目录的makefile,第193行:
ARCH ?=arm
CROSS_COMPILE ?=arm-linux-
修改MTD分区:
$vim arch/arm/plat-s3c24xx/common-smdk.c
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "vivi",
.size = 0x00020000,
.offset = 0,
},
[1] = {
.name = "param",
.offset = 0x00020000,
.size = 0x00010000,
},
[2] = {
.name = "kernel-2.6.29",
.offset = 0x00030000,
.size = 0x00200000,
},
[3] = {
.name = "root",
.offset = 0x00230000,
.size = 0x00800000,
},
[4] = {
.name = "yaffs",
.offset = 0x00a30000,
.size = 0x035cc000,
}
}
修改ECC校验:
$vim driver/mtd/nand/s3c2410.c
找到s3c2410_nand_init_chip()函数,将其中的
chip->ecc.mode=NAND_ECC_SOFT;
改成
chip->ecc.mode=NAND_ECC_NONE;
2.为内核打yaffs文件系统补丁
$cd cvs/yaffs2
$./patch-ker.sh c ../../linux-2.6.29.1/
3.移植DM9000网卡驱动
访问基址是0x10000000(BANK2):Index地址是0x10000000,Data地址是0x10000002.
地址线是ADD1,链接DM9000的CMD引脚,
总线位宽16位,
中断引脚为EINT2
添加DM9000平台设备:
$vim arch/arm/plat-s3c24xx/common-smdk.c
/*添加要包含的头文件*/
#if defined(CONFIG_DM9000)||defined(CONFIG_DM9000_MODULE)
#include <linux/dm9000.h>
#endif
/*添加DM9000的平台设备结构*/
#if defined(CONFIG_DM9000)|| defined(CONFIG_DM9000_MODULE)
static struct resource s3c_dm9k_resource[] = {
[0] = {
.start = S3C2410_CS2, //ADD1=0时使用的地址
.end = S3C2410_CS2 + 1,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = S3C2410_CS2 + 2, //ADD1=1时使用的地址
.end = S3C2410_CS2 + 2 + 1,
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_EINT2, //中断号
.end = IRQ_EINT2,
.flags = IORESOURCE_IRQ,
}
};
static struct dm9000_plat_data s3c_dm9k_platdata = {
.flags = DM9000_PLATF_16BITONLY, //数据总线宽度为16位
};
static struct platform_device s3c_device_dm9k = {
.name = "dm9000",
.id = 0,
.num_resources = ARRAY_SIZE(s3c_dm9k_resource),
.resource = s3c_dm9k_resource,
.dev = {
.platform_data = &s3c_dm9k_platdata,
}
};
#endif
/*加入内核设备列表*/
static struct platform_device __initdata *smdk_devs[] = {
/*DM9000*/
#if defined(CONFIG_DM9000) || efined(CONFIG_DM9000_MODULE)
&s3c_device_dm9k,
#endif
...
...
};
修改DM9000驱动程序:
$vim drivers/net/dm9000.c
/*添加要包含的头文件*/
#if defined (CONFIG_ARCH_S3C2410)
#include <mach/regs-mem.h>
#endif
/*设置存储控制器使BANK2可用,设置默认MAC地址*/
/*添加的代码被宏CONFIG_ARCH_S3C2410包含起来*/
dm9000_probe(struct platform_device *pdev)
{
......
int i;
u32 id_val;
/*DM9000 device*/
#if defined(CONFIG_ARCH_S3C2410)
unsigned int oldval_bwscon;
unsigned int oldval_bankcon2;
#endif
......
SET_NETDEV_DEV(ndev, &pdev->dev);
dev_dbg(&pdev->dev, "dm9000_probe()/n");
/*DM9000 device*/
#if defined(CONFIG_ARCH_S3C2410)
oldval_bwscon = *((volatile unsigned int *)S3C2410_BWSCON);
*((volatile unsigned int *)S3C2410_BWSCON) = (oldval_bwscon & ~(3<<8)) | S3C2410_BWSCON_DW2_16 | S3C2410_BWSCON_WS2 | S3C2410_BWSCON_ST2;
oldval_bankcon2 = *((volatile unsigned int *)S3C2410_BANKCON2);
*((volatile unsigned int *)S3C2410_BANKCON2) = 0x1f7c;
#endif
......
if (!is_valid_ether_addr(ndev->dev_addr)) {
dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please "
"set using ifconfig/n", ndev->name);
/*DM9000 device*/
#if defined(CONFIG_ARCH_S3C2410)
printk("NOW use the default MAC address: 08:90:90:90:90:90/n");
ndev->dev_addr[0] = 0x08;
ndev->dev_addr[1] = 0x90;
ndev->dev_addr[2] = 0x90;
ndev->dev_addr[3] = 0x90;
ndev->dev_addr[4] = 0x90;
ndev->dev_addr[5] = 0x90;
#endif
}
......
out:
dev_err(db->dev, "not found (%d)./n", ret);
#if defined(cONFIG_ARCH_S3C2410)
*((volatile unsigned int *)S3C2410_BWSCON) = oldval_bwscon;
*((volatile unsigned int *)S3C2410_BANKCON2) = oldval_bankcon2;
#endif
......
}
/*注册中断,指定触发方式*/
dm9000_open(struct net_device *dev)
{
......
irqflags |= IRQF_SHARED;
#if defined(CONFIG_ARCH_S3C2410)
if (request_irq(dev->irq, &dm9000_interrupt, IRQF_SHARED|IRQF_TRIGGER_RISING, dev->name, dev))
#else
if (request_irq(dev->irq, &dm9000_interrupt, IRQF_SHARED, dev->name, dev))
#endif
return -EAGAIN;
......
}
4.配置内核
$make s3c2410_defconfig
$make menuconfig
[*] Enable loadable module support --->
[*] Forced module loading
[*] Module unloading
System Type --->
S3C2410 Machines --->
[*] SMDK2410/A9M2410
其余Machines都不选(包括2400,2440等)
Kernel Features --->
[*] Use the ARM EABI to compile the kernel
Boot options --->
noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
Userspace binary formats --->
[*] Kernel support for ELF binaries
Device Drivers --->
[*] Network device support --->
[*] Ethernet (10 or 100Mbit) --->
<*> DM9000 support
File systems --->
[*] Miscellaneous filesystems --->
<*> YAFFS2 file system support
[*] Lets Yaffs do its own ECC
-*- Native language support --->
<*>Codepage 437 (United States, Canada)
<*>Simplified Chinese charset (CP936, GB2312)
<*>Traditional Chinese charset (Big5)
<*>ASCII (United States)
<*>NLS ISO 8859-1 (Latin 1; Western European Languages)
<*>NLS UTF-8
$make zImage
将/arch/arm/boot目录下生成的zImage下载到kernel分区。
分享到:
相关推荐
为友善之臂mini2440编译好的内核映像文件zImage,内核版本号2.6.29,交叉编译工具arm-linux-gcc-3.4.5
linux2.6.29的qq2440补丁文件
linux2.6.29完整linux源代码,对于学习linux内核的人来说是很好的,通过sourceinsighe可以完整的阅读linux2.6.29,对深入学习内核工作原理的也很有帮助
linux2.6.29kernel
驱动代码包括 支持NAND FLASH、支持YAFFS文件系统、LCD驱动移植、触摸屏和A/D转换驱动移植、DM9000A驱动移植、SD卡驱动移植、UDA1341声卡驱动移植、RTC驱动移植、USB设备驱动移植、USB摄像头驱动移植。它的触摸屏不...
linux内核2.6.29,希望对新手有用
linux2.6.29 driver
goldfish-android-goldfish-2.6.29 goldfish-android-goldfish-2.6.29
这是整理的一份关于boa服务器移植的详细步骤,我已经将它移植在linux2.6.29中并在mini2440上的得到实现,希望对做嵌入式web开发的您有所帮助。
rt73 linux driver支持对应linux2.6.29kernel
Linux内核中已经有现成的1-wire驱动,写这个驱动纯粹是为了练手。
linux-2.6.29.tar.bz2
文档介绍了介绍 2.6.28 和 2.6.29 版本中的新特性,2.6.28 中的新特性, 第 4 扩展文件系统,Graphics Execution Manager 内存管理,引导跟踪器,冻结器,虚拟内存伸缩性的改进,磁盘改进,对 SSD 支持的改进,改进...
iproute2 的2.6版本! 用于linux下的源码包
linux-2.6.36内核源代码,用来测试,修改,编写驱动。
运动图像检测系统由uboot2008.10+linux2.6.29+nfsrootfs+motion组成,摄像头的硬件为市场上任意一款。开发板为mini2440.
linux2.6版内核,有一定的学习价值,大多数开发板基于此版本进行系统移植,因为官网下载的太慢也不好找,所以传上来供有需要的朋友下载。
索下载你所需要的版本号的内核源代码,有时候一个一个的上传太麻烦了,我做了压缩,不过我都写了版本号的范围,总体范围从linux-1.0.tar到linux-2.6.29.tar,推荐 朋友们用ultraedit去打开比较方便阅读,当然是自己...
GoogleSource 下载的goldfish 2.6.29内核源码,亲测可编译。为下载速度慢的同学贡献一下,顺便赚点下载积分,谢谢~由于上传大小限制,里面是一个文本,文本里面是下载地址。
我是一个linux的爱好者,我收集的linux的各个版本的内核源代码都...到linux-2.6.29.tar,推荐朋友们用ultraedit去打开比较方便阅读,当然是自己喜欢的阅读器就行了,也不一定用这个,不过这个阅读起来的 确比较好用的!