linux2.6.32.2 mini2440平台移植--移植DM9000网卡驱动

来源:互联网 发布:商务印书馆 知乎 编辑:程序博客网 时间:2024/05/18 03:31

1.1.1 设备资源初始化

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

首先添加驱动所需的头文件dm9000.h

#include <linux/dm9000.h>

再定义DM9000网卡设备的物理基地址,以便后面用到:

/* DM9000AEP 10/100 ethernet controller */

#define MACH_MINI2440_DM9K_BASE (S3C2410_CS4 + 0x300)

再填充该平台设备的资源设置,以便和DM9000网卡驱动接口配合起来,如下

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,

        },

};

 

//同时在mini2440设备集中添加上面做好的网卡平台设备,如下红色部分

 

static struct platform_device *mini2440_devices[] __initdata = {

        &s3c_device_usb,

        &s3c_device_lcd,

        &s3c_device_wdt,

        &s3c_device_i2c0,

        &s3c_device_iis,

        &mini2440_device_eth,

        &s3c_device_nand,

};

这样,DM9000平台设备的接口就填完了。

 

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

因为Linux-2.6.32.2DM9000网卡驱动并不是专门为mini2440准备的,所以还要在其源代码中做一些移植工作,如下步骤。打开linux-2.6.32.2/ drivers/net/dm9000.c,头文件处添加2410相关的配置定义,如下

#include <asm/delay.h>

#include <asm/irq.h>

#include <asm/io.h>

 

#if defined(CONFIG_ARCH_S3C2410)

#include <mach/regs-mem.h>

#endif

 

#include "dm9000.h"

dm9000设备的初始化函数中添加如下红色部分,这里是配置DM9000所用片选总线的时序,因为mini2440目前只有一个通过总线外扩的设备,在此设备驱动中直接修改相关的寄存器配置会更加容易理解一些,当然这部分也可以放到mach-mini2440.c中(注意将这部分放在mach-mini2440.c里会有几个常量需要自己找定义),你可以自行实验一下,在此不再赘述。

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.1.3 关于MAC地址

 

需要注意的是,本开发板所用的DM9000网卡并没有外接EEPROM用以存储MAC地址,因此系统中的MAC地址是一个“软”地址,也就是可以通过软件进行修改,可以随意改为其他值,在static int __devinit dm9000_probe(struct platform_device *pdev)函数中可以看出:

        /* try reading the node address from the attached EEPROM */

        //尝试从EEPROM读取MAC地址

        for (i = 0; i < 6; i += 2)

                dm9000_read_eeprom(db, i / 2, ndev->dev_addr+i);

 

        if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) {

                mac_src = "platform data";

                memcpy(ndev->dev_addr, pdata->dev_addr, 6);

        }

 

        if (!is_valid_ether_addr(ndev->dev_addr)) {

                /* try reading from mac */

 

                mac_src = "chip";

                for (i = 0; i < 6; i++)

                        ndev->dev_addr[i] = ior(db, i+DM9000_PAR);

        }

       //使用“软”MAC地址: 08:90:90:90:90:90

        memcpy(ndev->dev_addr, "\x08\x90\x90\x90\x90\x90", 6);

 

        if (!is_valid_ether_addr(ndev->dev_addr))

                dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please "

                         "set using ifconfig\n", ndev->name);

实际上到此为止DM9000就已经移植结束了。

 

1.1.4 配置内核加入DM9000,并编译运行测试

此时会带内核源代码目录,执行:

#make  menuconfig

开始在内核中配置网卡驱动,依次选择如下菜单项

Device Drivers  --->Network device support  ---> Ethernet (10 or 100Mbit)  --->

即可找到DM9000的配置项,可以看到DM9000已经被选中,这是因为Linux-2.6.32.2默认的内核配置已经加入了DM9000的支持。

然后执行:

#make zImage

最后生成  arch/arm/boot/zImage 文件,使用"k"命令把它烧写到开发板,并使用默认的文件系统启动,在命令行终端运行 ifconfig命令可以看到如下所示。

 

[root@FriendlyARM /]# ifconfig

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 MULTICAST  MTU:1500  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:1000

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

          Interrupt:51 Base address:0x300

 

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 127.0.0.1,等号后面有数的话,就是网卡正常ping网关地址,等号后面有数的话,就是和网关连接正常ping别的主机的IP,等号后面有数的话,就是和别的主机连接正常.