-
主要问题
学习内核移植之后发现移植后的系统启动之后无法使用eth0即dm9000网卡,只有本地回环的lo网口。查阅资料之后发现指自己的dm9000网口的驱动没有编译使能。
-
ifconfig错误提示:SIOCSIFADDR: No such device
-
解决方法
-
添加DM9000网卡设备支持
通过DM9000网卡原理图, 我们可以知道网卡INT使用EINT7管脚,CMD连ADDR2,CS#片选管脚连了NGCS4,以及数据位数为LDATA0~LDATA15(16位模式)。
所以我们要进行相应配置:
- 添加网卡设备
vim arch/arm/mach-s3c2440/mach-smdk2440.c
添加DM9000网卡的设备,告诉Linux内核现在有这个硬件连上来了
static struct platform_device *smdk2440_devices[] __initdata = {
&s3c_device_ohci,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&s3c_device_dm9000, //添加dm9000相关的结构体
};
- 在devs.c C文件添加网卡相应的结构体变量
vim arch/arm/plat-s3c24xx/devs.c
在该C文件的任意位置加入一下代码
#ifdef CONFIG_DM9000
#include <linux/dm9000.h>
static struct resource s3c_dm9000_resource[] = {
[0] = {
.start = S3C2410_CS4 + 0x300, // DM9000网卡的CS片选管脚连接的是CS4
.end = S3C2410_CS4 + 0x300 + 0x3,
.flags = IORESOURCE_MEM
},
[1]={
.start = S3C2410_CS4 + 0x300 + 0x4, //CMD pin is A2
.end = S3C2410_CS4 + 0x300 + 0x4 + 0x7c,
.flags = IORESOURCE_MEM
},
[2] = {
.start = IRQ_EINT7, // DM9000网卡的中断管脚连的是 EINT7这个Pin
.end = IRQ_EINT7,
.flags = IORESOURCE_IRQ
},
};
static struct dm9000_plat_data s3c_device_dm9000_platdata = {
.flags= DM9000_PLATF_16BITONLY, // DM9000网卡的使用LDATA0~15 16位模式
};
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,
}
};
#endif
- 头文件添加网卡相应的结构体变量声明
vim arch/arm/plat-samsung/include/plat/devs.h
- 修改网卡驱动
添加中断初始化
vim drivers/net/dm9000.c
dm9000_open(struct net_device *dev)
{
board_info_t *db = netdev_priv(dev);
//unsigned long irqflags = db->irq_res->flags & IRQF_TRIGGER_MASK;
unsigned long irqflags = (db->irq_res->flags|IRQ_TYPE_EDGE_RISING) & IRQF_TRIGGER_MASK;
irq_set_irq_type(dev->irq, IRQ_TYPE_EDGE_RISING);
if (netif_msg_ifup(db))
dev_dbg(db->dev, "enabling %s\n", dev->name);
/* If there is no IRQ type specified, default to something that
* may work, and tell the user that this is a problem */
if (irqflags == IRQF_TRIGGER_NONE)
dev_warn(db->dev, "WARNING: no IRQ resource flags set.\n");
irqflags |= IRQF_SHARED;
/* GPIO0 on pre-activate PHY, Reg 1F is not set by reset */
iow(db, DM9000_GPR, 0); /* REG_1F bit0 activate phyxcer */
mdelay(1); /* delay needs by DM9000B */
/* Initialize DM9000 board */
dm9000_reset(db);
dm9000_init_dm9000(dev);
if (request_irq(dev->irq, dm9000_interrupt, irqflags, dev->name, dev))
return -EAGAIN;
/* Init driver variable */
db->dbug_cnt = 0;
mii_check_media(&db->mii, netif_msg_link(db), 1);
netif_start_queue(dev);
dm9000_schedule_poll(db);
return 0;
}
重新编译内核,问题完美解决。