alonglkj 发表于 2014-03-28 09:11

dm9000 双网卡

imx31上挂了两个dm9000,他们就是基地址和中断不同,跑的是linux的系统,我就做了两个驱动,其实是一样的,只是注册驱动的名字不一样,现在单独添加对应的驱动能够调通,但是两个驱动同时加上去的话就只有其中一个能通。这是啥问题啊 ?????????

arm-linux-gcc 发表于 2014-03-28 09:51

用不着两份驱动,直接注册两个设备就行了,可以共用一个驱动

不通先看看ip地址有没有设置对

alonglkj 发表于 2014-03-28 11:59

ip已经设置成不同的网段了,只有其中一个能通,注册两个设备设备名字取不一样吗?

guocslock 发表于 2014-03-28 13:23

无代码,无真相。不要让大伙跟着你瞎猜。
把驱动代码贴出来,把测试过程贴出来。

arm-linux-gcc 发表于 2014-03-28 13:26

回复 3# alonglkj


    名字仍然一样,platform_device->id分别设置为0和1就行了,然后设置成各自对应的地址和中断号就行了

alonglkj 发表于 2014-03-28 13:57

一个驱动和两个驱动效果一样,其中一个网卡插上网线就不停的进入中断,就仅仅注册那个不停进入中断的设备的时候不会出现这种一直进入中断的状况
#define DM9000_BASE_ADDRR        MX31_CS1_BASE_ADDR
#define DM9000_IRQQ       IOMUX_TO_IRQ(MX31_PIN_GPIO1_5)

static struct resource dm9000_resources2[] = {
        {
       .start = DM9000_BASE_ADDRR,
       .end = DM9000_BASE_ADDRR + 0x01,
       .flags = IORESOURCE_MEM,
       },
        {
         .start = DM9000_BASE_ADDRR + 0x02,
         .end = DM9000_BASE_ADDRR + 0x03,
         .flags = IORESOURCE_MEM,
         },
        {
       .start = DM9000_IRQQ,
       .end = DM9000_IRQQ,
       .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
       },
}


#define DM9000_BASE_ADDR        MX31_CS0_BASE_ADDR
#define DM9000_IRQ        IOMUX_TO_IRQ(MX31_PIN_GPIO1_0)

static struct resource dm9000_resources[] = {
        {
       .start = DM9000_BASE_ADDR,
       .end = DM9000_BASE_ADDR + 0x01,
       .flags = IORESOURCE_MEM,
       },
        {
         .start = DM9000_BASE_ADDR + 0x02,
         .end = DM9000_BASE_ADDR + 0x03,
         .flags = IORESOURCE_MEM,
         },
        {
       .start = DM9000_IRQ,
       .end = DM9000_IRQ,
       .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
       },
};

这是两个网卡的资源,会不会两个网卡在一起中断有什么冲突啊?用的是imx31的CPU

alonglkj 发表于 2014-03-28 14:13

static void mxc_init_enet(void)
{
        int ret;

        ret = gpio_request(IOMUX_TO_GPIO(MX31_PIN_GPIO1_0), "dm9000-irq");
        if (ret)
                printk("failed to get dm9000a-irq pin: %d\n", ret);
        else {
                gpio_direction_input(IOMUX_TO_GPIO(MX31_PIN_GPIO1_0));
                set_irq_type(IOMUX_TO_IRQ(MX31_PIN_GPIO1_0), IRQF_TRIGGER_HIGH);
                platform_device_register(&dm9000_device);
        }
}


static void mxc_init_enet2(void)
{
        int ret;

        ret = gpio_request(IOMUX_TO_GPIO(MX31_PIN_GPIO1_5), "dm9000-irq");
        if (ret)
                printk("failed to get dm9000-irq pin: %d\n", ret);
        else {
                gpio_direction_input(IOMUX_TO_GPIO(MX31_PIN_GPIO1_5));
                set_irq_type(IOMUX_TO_IRQ(MX31_PIN_GPIO1_5), IRQF_TRIGGER_HIGH);
                platform_device_register(&dm9000_device2);
        }
}

注册两个网卡设备的函数


arm-linux-gcc 发表于 2014-03-28 14:20

应该没有冲突,在中断里加些log,看看具体是什么东西引起的中断

alonglkj 发表于 2014-03-28 14:54

那为什么只注册一个设备的时候没有问题呢?

arm-linux-gcc 发表于 2014-03-28 15:09

所以才叫你加log看啊,就这么光靠嘴说肯定分析不出来啊
页: [1] 2
查看完整版本: dm9000 双网卡