/* mini2440 2M nor, 256M nand, dm9000ep*/
1、修改交叉编译工具
#vim Makefile
找到: //第185行
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
改为:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
2、修改时钟频率 //第180行
#vim arch\arm\mach-s3c2440\mach-smdk2440.c
找到:
static void __init smdk2440_map_io(void)
{
......
s3c24xx_init_clocks(16934400);
......
}
改为:
static void __init smdk2440_map_io(void)
{
......
s3c24xx_init_clocks(12000000);
......
}
3、修改nand分区 //第109行
#vim arch\arm\plat-s3c24xx\common-smdk.c
找到:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "Boot Agent",
.size = SZ_16K,
.offset = 0,
},
[1] = {
.name = "S3C2410 flash partition 1",
.offset = 0,
.size = SZ_2M,
},
[2] = {
.name = "S3C2410 flash partition 2",
.offset = SZ_4M,
.size = SZ_4M,
},
[3] = {
.name = "S3C2410 flash partition 3",
.offset = SZ_8M,
.size = SZ_2M,
},
[4] = {
.name = "S3C2410 flash partition 4",
.offset = SZ_1M * 10,
.size = SZ_4M,
},
[5] = {
.name = "S3C2410 flash partition 5",
.offset = SZ_1M * 14,
.size = SZ_1M * 10,
},
[6] = {
.name = "S3C2410 flash partition 6",
.offset = SZ_1M * 24,
.size = SZ_1M * 24,
},
[7] = {
.name = "S3C2410 flash partition 7",
.offset = SZ_1M * 48,
.size = SZ_16M,
}
};
改为:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader",
.size = 0x00040000,
.offset = 0,
},
[1] = {
.name = "params",
.offset = MTDPART_OFS_APPEND,
.size = 0x0002000,
},
[2] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = 0x00200000,
},
[3] = {
.name = "root",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
},
}
4、增加DM9000网卡
#vim arch\arm\plat-s3c24xx\common-smdk.c
(1)增加头文件
在第46行增加:
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
#include <linux/dm9000.h>
#endif
(2)增加平台设备结构
在第53行增加:
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
/* DM9000 */
static struct resource s3c_dm9k_resource[] = {
[0] = {
.start = S3C2410_CS4,
.end = S3C2410_CS4 + 3,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = S3C2410_CS4 + 4,
.end = S3C2410_CS4 + 4 + 3,
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_EINT7,
.end = IRQ_EINT7,
.flags = IORESOURCE_IRQ,
}
};
static struct dm9000_plat_data s3c_dm9k_platdata = {
.flags = DM9000_PLATF_16BITONLY,
};
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 /* CONFIG_DM9000 */
(3)将DM9000加入内核平台设备列表
找到:
static struct platform_device __initdata *smdk_devs[] = {
......
&smdk_led7,
};
改为:
static struct platform_device __initdata *smdk_devs[] = {
......
&smdk_led7,
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
&s3c_device_dm9k,
#endif
};
#vim drivers\net\dm9000.c
(1)在第73行增加:
#if defined(CONFIG_ARCH_S3C2410)
#include <asm/arch-s3c2410/regs-mem.h>
#endif
(2)找到: //第394行
static int
dm9000_probe(struct platform_device *pdev)
{
struct dm9000_plat_data *pdata = pdev->dev.platform_data;
......
}
改为:
static int
dm9000_probe(struct platform_device *pdev)
{
#if defined(CONFIG_ARCH_S3C2410xxx)
unsigned int oldval_bwscon;
unsigned int oldval_bankcon4;
#endif
struct dm9000_plat_data *pdata = pdev->dev.platform_data;
......
}
(3)在dm9000_probe(struct platform_device *pdev)函数中,找到:
......
if (!is_valid_ether_addr(ndev->dev_addr))
printk("%s: Invalid ethernet MAC address. Please "
"set using ifconfig\n", ndev->name);
platform_set_drvdata(pdev, ndev);
......
改为:
......
if (!is_valid_ether_addr(ndev->dev_addr))
{
printk("%s: Invalid ethernet MAC address. Please "
"set using ifconfig\n", ndev->name);
#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
}
platform_set_drvdata(pdev, ndev);
......
(4)在dm9000_probe(struct platform_device *pdev)函数中,找到:
......
out:
printk("%s: not found (%d).\n", CARDNAME, ret);
dm9000_release_board(pdev, db);
......
改为:
......
out:
printk("%s: not found (%d).\n", CARDNAME, ret);
#if defined(CONFIG_ARCH_S3C2410xxx)
*((volatile unsigned int *)S3C2410_BWSCON) = oldval_bwscon;
*((volatile unsigned int *)S3C2410_BANKCON4) = oldval_bankcon4;
#endif
dm9000_release_board(pdev, db);
......
(5)在dm9000_open(struct net_device *dev)函数中,找到:
......
if (request_irq(dev->irq, &dm9000_interrupt, IRQF_SHARED, dev->name, dev))
return -EAGAIN;
......
改为:
......
#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;
(6)在dm9000_rx(struct net_device *dev)函数中找到:
......
/* Check packet ready or not */
do {
ior(db, DM9000_MRCMDX); /* Dummy read */
......
改为:
......
/* Check packet ready or not */
do {
ior(db, DM9000_MRRH);
ior(db, DM9000_MRRL);
ior(db, DM9000_MRCMDX); /* Dummy read */
......
5、配置make menuconfig
#make menuconfig //未列出的选项,可以不选或者默认不去更改
1、选择处理型号
System Type
==>S3C2410 Machines -->
==>[*]SMDK2410/A9M2410
==>S3C2440 Machines -->
==>[*]SMDK2440
==>[*]SMDK2440 with S3C2440 CPU module
==>[*]Support ARM920T processor
2、支持DM9000
Device Drivers
==>Network device support
==>Ethernet (10 or 100Mbit)--->
==>[*]DM9000 support //选上此项
3、支持nfs起根文件系统
Network --->
==>Netwokring options --->
==>[*]IP:kernel level autoconfiguration
[*] IP: DHCP support
[*] IP: BOOTP support
[*] IP: RARP support
File systems --->
==>Pseudo filesystem --->
==>[*]Virtual memory file system support(former shm fs)
[*]Tmpfs POSIX Access Control Lists
==>Network FIle Systems --->
==><*>NFS file system support
[*] Provide NFSv3 client support
[*] Provide client support for the NFSv3 ACL protocol extension
[*] Provide NFSv4 client support(EXPERIMENTAL)
[*] Root file system on NFS
6、编译:
1、修改交叉编译工具
#vim Makefile
找到: //第185行
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
改为:
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
2、修改时钟频率 //第180行
#vim arch\arm\mach-s3c2440\mach-smdk2440.c
找到:
static void __init smdk2440_map_io(void)
{
......
s3c24xx_init_clocks(16934400);
......
}
改为:
static void __init smdk2440_map_io(void)
{
......
s3c24xx_init_clocks(12000000);
......
}
3、修改nand分区 //第109行
#vim arch\arm\plat-s3c24xx\common-smdk.c
找到:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "Boot Agent",
.size = SZ_16K,
.offset = 0,
},
[1] = {
.name = "S3C2410 flash partition 1",
.offset = 0,
.size = SZ_2M,
},
[2] = {
.name = "S3C2410 flash partition 2",
.offset = SZ_4M,
.size = SZ_4M,
},
[3] = {
.name = "S3C2410 flash partition 3",
.offset = SZ_8M,
.size = SZ_2M,
},
[4] = {
.name = "S3C2410 flash partition 4",
.offset = SZ_1M * 10,
.size = SZ_4M,
},
[5] = {
.name = "S3C2410 flash partition 5",
.offset = SZ_1M * 14,
.size = SZ_1M * 10,
},
[6] = {
.name = "S3C2410 flash partition 6",
.offset = SZ_1M * 24,
.size = SZ_1M * 24,
},
[7] = {
.name = "S3C2410 flash partition 7",
.offset = SZ_1M * 48,
.size = SZ_16M,
}
};
改为:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "bootloader",
.size = 0x00040000,
.offset = 0,
},
[1] = {
.name = "params",
.offset = MTDPART_OFS_APPEND,
.size = 0x0002000,
},
[2] = {
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = 0x00200000,
},
[3] = {
.name = "root",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
},
}
4、增加DM9000网卡
#vim arch\arm\plat-s3c24xx\common-smdk.c
(1)增加头文件
在第46行增加:
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
#include <linux/dm9000.h>
#endif
(2)增加平台设备结构
在第53行增加:
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
/* DM9000 */
static struct resource s3c_dm9k_resource[] = {
[0] = {
.start = S3C2410_CS4,
.end = S3C2410_CS4 + 3,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = S3C2410_CS4 + 4,
.end = S3C2410_CS4 + 4 + 3,
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_EINT7,
.end = IRQ_EINT7,
.flags = IORESOURCE_IRQ,
}
};
static struct dm9000_plat_data s3c_dm9k_platdata = {
.flags = DM9000_PLATF_16BITONLY,
};
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 /* CONFIG_DM9000 */
(3)将DM9000加入内核平台设备列表
找到:
static struct platform_device __initdata *smdk_devs[] = {
......
&smdk_led7,
};
改为:
static struct platform_device __initdata *smdk_devs[] = {
......
&smdk_led7,
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
&s3c_device_dm9k,
#endif
};
#vim drivers\net\dm9000.c
(1)在第73行增加:
#if defined(CONFIG_ARCH_S3C2410)
#include <asm/arch-s3c2410/regs-mem.h>
#endif
(2)找到: //第394行
static int
dm9000_probe(struct platform_device *pdev)
{
struct dm9000_plat_data *pdata = pdev->dev.platform_data;
......
}
改为:
static int
dm9000_probe(struct platform_device *pdev)
{
#if defined(CONFIG_ARCH_S3C2410xxx)
unsigned int oldval_bwscon;
unsigned int oldval_bankcon4;
#endif
struct dm9000_plat_data *pdata = pdev->dev.platform_data;
......
}
(3)在dm9000_probe(struct platform_device *pdev)函数中,找到:
......
if (!is_valid_ether_addr(ndev->dev_addr))
printk("%s: Invalid ethernet MAC address. Please "
"set using ifconfig\n", ndev->name);
platform_set_drvdata(pdev, ndev);
......
改为:
......
if (!is_valid_ether_addr(ndev->dev_addr))
{
printk("%s: Invalid ethernet MAC address. Please "
"set using ifconfig\n", ndev->name);
#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
}
platform_set_drvdata(pdev, ndev);
......
(4)在dm9000_probe(struct platform_device *pdev)函数中,找到:
......
out:
printk("%s: not found (%d).\n", CARDNAME, ret);
dm9000_release_board(pdev, db);
......
改为:
......
out:
printk("%s: not found (%d).\n", CARDNAME, ret);
#if defined(CONFIG_ARCH_S3C2410xxx)
*((volatile unsigned int *)S3C2410_BWSCON) = oldval_bwscon;
*((volatile unsigned int *)S3C2410_BANKCON4) = oldval_bankcon4;
#endif
dm9000_release_board(pdev, db);
......
(5)在dm9000_open(struct net_device *dev)函数中,找到:
......
if (request_irq(dev->irq, &dm9000_interrupt, IRQF_SHARED, dev->name, dev))
return -EAGAIN;
......
改为:
......
#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;
(6)在dm9000_rx(struct net_device *dev)函数中找到:
......
/* Check packet ready or not */
do {
ior(db, DM9000_MRCMDX); /* Dummy read */
......
改为:
......
/* Check packet ready or not */
do {
ior(db, DM9000_MRRH);
ior(db, DM9000_MRRL);
ior(db, DM9000_MRCMDX); /* Dummy read */
......
5、配置make menuconfig
#make menuconfig //未列出的选项,可以不选或者默认不去更改
1、选择处理型号
System Type
==>S3C2410 Machines -->
==>[*]SMDK2410/A9M2410
==>S3C2440 Machines -->
==>[*]SMDK2440
==>[*]SMDK2440 with S3C2440 CPU module
==>[*]Support ARM920T processor
2、支持DM9000
Device Drivers
==>Network device support
==>Ethernet (10 or 100Mbit)--->
==>[*]DM9000 support //选上此项
3、支持nfs起根文件系统
Network --->
==>Netwokring options --->
==>[*]IP:kernel level autoconfiguration
[*] IP: DHCP support
[*] IP: BOOTP support
[*] IP: RARP support
File systems --->
==>Pseudo filesystem --->
==>[*]Virtual memory file system support(former shm fs)
[*]Tmpfs POSIX Access Control Lists
==>Network FIle Systems --->
==><*>NFS file system support
[*] Provide NFSv3 client support
[*] Provide client support for the NFSv3 ACL protocol extension
[*] Provide NFSv4 client support(EXPERIMENTAL)
[*] Root file system on NFS
6、编译:
#make uImage
/* 生成uImage 后,就可以利用uboot的tftp引导内核和文件系统;*/