移植DM9000驱动至内核(linux-2.6.32.24)

发布于:2024-04-01 ⋅ 阅读:(56) ⋅ 点赞:(0)

目录

概述

1 移植 DM9000驱动

1.1 添加设备驱动代码

1.2 调整 DM9000 所用的位宽寄存器

1.3 配置MAC地址

2 配置和编译DM9000 Driver至内核

3 验证


概述

本文主要介绍如何移植DM9000的驱动到linux-2.6.32.24内核,笔者详细记录了内核移植过程中遇见的问题,并对每个问题的解决过程做了详细的记录。移植完成驱动后,并将其编译到内核中,并在板卡mini2440上进行测试,其能正常的连接到网络上,实现通信功能。

1 移植 DM9000驱动

使用ifconfig查看当前的网络情况,发现其出现如下error。说明当前系统没有可以正常使用的网络设备,需要移植该设备的驱动程序之后,该设备才能正常的工作。mini2440使用的网络芯片为DM9000。现在在Linux-2..6.32.24中移植这个芯片的驱动。

log信息如下:

open device leds: No such file or directory
Try to bring eth0 interface up......ifconfig: SIOCGIFFLAGS: No such device
ifconfig: SIOCSIFHWADDR: No such device
ifconfig: SIOCSIFADDR: No such device
route: SIOCADDRT: No such process
​
​
[root@FriendlyARM /]# ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
​

1.1 添加设备驱动代码

Linux-2..6.32.24已经自带了完善的 DM9000 网卡驱动驱动(源代码位置: linux-2.6.32.24/drivers/net/dm9000.c),它也是一个平台设备,因此在目标平台初始化代码中,只要填写好相应的结构表即可,具体步骤如下:

step-1: 添加设备表

linux-2.6.32.24/arch/arm/mach-s3c2440/mach-mini2440.c中添加网络相关的设备表,具体方法如下:

代码50行: 添加dm9000.h

源码:

#include <linux/dm9000.h>

代码206 ~ 224行: 添加ether net controller

代码206 ~ 224行:添加dm9000的设备驱动

代码253行: 注册DM9000设备驱动

详细代码:

/* DM9000AEP 10/100 ethernet controller */
#define MACH_MINI2440_DM9K_BASE (S3C2410_CS4 + 0x300)
​
static struct resource mini2440_dm9k_resource[] = {
        [0] = {
                .start = MACH_MINI2440_DM9K_BASE,
                .end   = MACH_MINI2440_DM9K_BASE + 3,
                .flags = IORESOURCE_MEM
        },
        [1] = {
                .start = MACH_MINI2440_DM9K_BASE + 4,
                .end   = MACH_MINI2440_DM9K_BASE + 7,
                .flags = IORESOURCE_MEM
        },
        [2] = {
                .start = IRQ_EINT7,
                .end   = IRQ_EINT7,
                .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE,
        }
};
​
/*
 *  The DM9000 has no eeprom, and it's MAC address is set by
 *  the bootloader before starting the kernel.
 */
static struct dm9000_plat_data mini2440_dm9k_pdata = {
        .flags          = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
};
​
static struct platform_device mini2440_device_eth = {
        .name           = "dm9000",
        .id             = -1,
        .num_resources  = ARRAY_SIZE(mini2440_dm9k_resource),
        .resource       = mini2440_dm9k_resource,
        .dev            = {
                .platform_data  = &mini2440_dm9k_pdata,
        },
};
​
​
​
static struct platform_device *mini2440_devices[] __initdata = {
    &s3c_device_usb,
    &s3c_device_lcd,
    &s3c_device_wdt,
    &s3c_device_i2c0,
    &s3c_device_iis,
    &s3c_device_nand,
    &mini2440_device_eth,
};

1.2 调整 DM9000 所用的位宽寄存器

在linux-2.6.32.24/drivers/net/dm9000.c中修改如下代码:

详细代码:

#if defined(CONFIG_ARCH_S3C2410)
    #include <mach/regs-mem.h>
#endif

在 dm9000 设备的初始化函数中添加如下红色部分,这里是配置 DM9000 所用片选总线的时序,因为 mini2440 目前只有一个通过总线外扩的设备,在此设备驱动中直接修改相关的寄存器配置会更加容易理解一些。

static int __init
dm9000_init(void)
{
#if defined(CONFIG_ARCH_S3C2410)
    unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;
    unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;
    *((volatile unsigned int *)S3C2410_BWSCON) =
            (oldval_bwscon & ~(3<<16)) | S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
    *((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;
#endif
​
    printk(KERN_INFO "%s Ethernet Driver, V%s\n", CARDNAME, DRV_VERSION);
​
    return platform_driver_register(&dm9000_driver);
}

1.3 配置MAC地址

linux-2.6.32.24/drivers/net/dm9000.c 文件中dm9000_probe() 函数,添加如下代码

添加的代码:

    // 使用“软” MAC 地址: 08:90:90:90:90:90
    memcpy(ndev->dev_addr, "\x08\x90\x90\x90\x90\x90", 6);

2 配置和编译DM9000 Driver至内核

详细配置方法如下:

step-1: 跳转至Device Driver

step-2: 跳转至Network device support

step-3: 跳转至Ethernet (10 or 100Mbit)

step-4: 跳转至DM9000 support

配置完成后,保存配置并且重新编译内核。

3 验证

下载重新编译的zImage至MCU, 启动板卡后,看见如下log, 开发板已经能正常的识别IP

eth0      Link encap:Ethernet  HWaddr 08:90:90:90:90:90
          inet addr:192.168.1.230  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:45 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2916 (2.8 KiB)  TX bytes:0 (0.0 B)
          Interrupt:51 Base address:0xe300
​
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
​

在板卡上ping主机的IP,测试其是否有消息回复,使用命令:

ping 192.168.1.11

主机可以响应板卡的ping消息,说明DM9000已经能正常工作了。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到