mini2440移植之DM9000驱动

来源:互联网 发布:怎么入驻淘宝商城 编辑:程序博客网 时间:2024/05/16 17:50

1.设备资源初始化

linux2.6.32.2已经自带完善的DM9000网卡驱动(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)

填充该平台设备资源设置

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所用的位宽寄存器

打开 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 中。

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);
}

2.关于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:90memcpy(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);



原创粉丝点击