mini2440 dm9000网卡驱动移植

内核版本:linux-2.6.32.2        实验平台:mini2440

1. 添加平台设备支持
首先需要在mach-mini2440.c中包含头文件<linux/dm9000.h>,dm9000平台设备定义如下:

/* DM9000AEP 10/100 ethernet controller */
#define MACH_MINI2440_DM9000_BASE (S3C2410_CS4 + 0x300)

static struct resource mini2440_dm9000_resource[] = {
	[0] = {
		.start  = MACH_MINI2440_DM9000_BASE,
		.end    = MACH_MINI2440_DM9000_BASE + 3,
		.flags  = IORESOURCE_MEM,
	},
	[1] = {
		.start  = MACH_MINI2440_DM9000_BASE + 4,
		.end    = MACH_MINI2440_DM9000_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_dm9000_platdata = {
	.flags          = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
};

static struct platform_device mini2440_device_eth = {
	.name           = "dm9000",
	.id             = -1,
	.num_resources  = ARRAY_SIZE(mini2440_dm9000_resource),
	.resource       = mini2440_dm9000_resource,
	.dev            = {
		.platform_data = &mini2440_dm9000_platdata,
	},
};
最后需要将dm9000这个平台设备添加到mini2440_devices这个平台设备数组里面,这样才能完成平台设备的注册。
static struct platform_device *mini2440_devices[] __initdata = {
        /* ... */
        &mini2440_device_eth,
};


2. dm9000驱动修改
drivers/net/dm9000.c这个驱动并不是为mini2440做准备的,需要做一些修改。
包含相关头文件:

#if defined(CONFIG_ARCH_S3C2410)
#include <mach/regs-mem.h>
#endif
修改dm9000片选总线时序:
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
	/* ... */
}

在dm9000_probe函数中还需要给dm9000设置一个mac地址。

static int __devinit
dm9000_probe(struct platform_device *pdev)
{
	/* ... */
        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);
	/* ... */
}


3. 配置内核

    Device Drivers  --->
	[*] Network device support  --->
		[*]   Ethernet (10 or 100Mbit)  --->
			<*>   DM9000 support
			(4)     DM9000 maximum debug level


4. 启动网络设备
内核配置好之后,需要手动启动网络设备,使用如下命令:

ifconfig eth0 192.168.1.109 netmask 255.255.255.0 up

或者将上面的命令写入到启动脚本中,还可以使用ifconfig命令来停止网络设备:

ifconfig eth0 down

输入ifconfig命令得到如下结果:

eth0      Link encap:Ethernet  HWaddr 08:90:90:90:90:90  
          inet addr:192.168.1.109  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:21 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:2455 (2.3 KiB)  TX bytes:280 (280.0 B)
          Interrupt:51 Base address:0x8300 

你可能感兴趣的:(mini2440 dm9000网卡驱动移植)