天天看点

Linux移植内核之后ifconfig错误:ifconfig: SIOCSIFADDR: No such device

  • 主要问题

学习内核移植之后发现移植后的系统启动之后无法使用eth0即dm9000网卡,只有本地回环的lo网口。查阅资料之后发现指自己的dm9000网口的驱动没有编译使能。

Linux移植内核之后ifconfig错误:ifconfig: SIOCSIFADDR: No such device
  • ifconfig错误提示:SIOCSIFADDR: No such device

  • 解决方法

  • 添加DM9000网卡设备支持

通过DM9000网卡原理图, 我们可以知道网卡INT使用EINT7管脚,CMD连ADDR2,CS#片选管脚连了NGCS4,以及数据位数为LDATA0~LDATA15(16位模式)。

Linux移植内核之后ifconfig错误:ifconfig: SIOCSIFADDR: No such device

所以我们要进行相应配置:

  • 添加网卡设备
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相关的结构体
};
           
Linux移植内核之后ifconfig错误:ifconfig: SIOCSIFADDR: No such device
  •  在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
           
Linux移植内核之后ifconfig错误:ifconfig: SIOCSIFADDR: No such device
  • 头文件添加网卡相应的结构体变量声明
vim arch/arm/plat-samsung/include/plat/devs.h 
           
Linux移植内核之后ifconfig错误:ifconfig: SIOCSIFADDR: No such device
  •  修改网卡驱动

添加中断初始化

vim drivers/net/dm9000.c 
           
Linux移植内核之后ifconfig错误:ifconfig: SIOCSIFADDR: No such device
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;
}
           

​​​​​重新编译内核,问题完美解决。

Linux移植内核之后ifconfig错误:ifconfig: SIOCSIFADDR: No such device