ITKeyword,专注技术干货聚合推荐

注册 | 登录

Linux-2.6.32.2内核在mini2440上的移植----移植DM9000网卡驱动

DreamCatcher100 分享于

2020腾讯云双十一活动,全年最低!!!(领取3500元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1073

2020阿里云最低价产品入口,含代金券(新老用户有优惠),
地址https://www.aliyun.com/minisite/goods

推荐:mini2440移植之DM9000驱动

1.设备资源初始化 linux2.6.32.2已经自带完善的DM9000网卡驱动(drivers/net/dm9000.c),平台设备。 在mach-mini2440.c中填写相应结构表 添加驱动所需头文件dm90

1、设备资源初始化

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

clx@think:/work/armlinux/linux-2.6.32.2$ gedit arch/arm/mach-s3c2440/mach-mini2440.c

定位到55行附近,加入dm9000.h,如下所示:

#include <plat/common-smdk.h>

#include <linux/mtd/mtd.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
#include <plat/nand.h>
#include <linux/dm9000.h>

(2)、填充该平台设备的资源设置

定位到208行附近,加入下面代码:

tatic struct s3c2410_platform_nandmini2440_nand_info = {
.tacls = 20,
.twrph0 = 60,
.twrph1 = 20,
.nr_sets = ARRAY_SIZE(mini2440_nand_sets),
.sets = mini2440_nand_sets,
.ignore_unset_ecc = 1,
};
/* DM9000AEP 10/100 ethernet controller */ //定义DM9000网卡设备的物理基地址,以便后面用到
#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 MACaddress 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, //;把nand flash设备添加到开发板的设备列表结构
&mini2440_device_eth, //;把网卡平台设备添加到开发板的设备列表结构
};

2、调整DM9000所用的位宽寄存器

因为Linux-2.6.32.2的DM9000 网卡驱动并不是专门为mini2440准备的,所以还要在其源代码中做一些移植工作,如下步骤。

(1)、clx@think:/work/armlinux/linux-2.6.32.2$ gedit drivers/net/dm9000.c,定位到42行附近,添加2410相关的配置定义,如下红色部分:

#include <asm/delay.h>
#include <asm/irq.h>
#include <asm/io.h>

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

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

打开linux-2.6.32.2/drivers/net/dm9000.c,定位到1557行附近,加入下面代码:

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

returnplatform_driver_register(&dm9000_driver);
}

3、关于MAC地址

本开发板所用的DM9000网卡并没有外接EEPROM用以存储MAC地址,因此系统中的MAC地址是一个“软”地址,也就是可以通过软件进行修改,可以随意改为其他值。

打开linux-2.6.32.2/drivers/net/dm9000.c,定位到1461行附近,加入下面一行代码:

static int __devinit
dm9000_probe(struct platform_device *pdev)
{

... ...

/* try reading the node address from theattached 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);


platform_set_drvdata(pdev, ndev);
ret = register_netdev(ndev);


if (ret == 0)
printk(KERN_INFO "%s: dm9000%c at %p,%p IRQ %d MAC: %pM (%s)\n",
      ndev->name, dm9000_type_to_char(db->type),
      db->io_addr, db->io_data, ndev->irq,
      ndev->dev_addr, mac_src);
return 0;


out:
dev_err(db->dev, "not found (%d).\n", ret);


dm9000_release_board(pdev, db);
free_netdev(ndev);


return ret;
}

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

(1)、确认在内核中已经配置了网卡驱动

clx@think:/work/armlinux/linux-2.6.32.2$ make menuconfig

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

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

DM9000 已经被选中,这是因为Linux-2.6.32.2默认的内核配置已经加入了DM9000的支持。

(2)、编译测试

使用”k”命令把它烧写到开发板,并使用默认的文件系统启动,在命令行终端运行ifconfig命令可以看到

Try to bring eth0 interface up......eth0: link down
Done


Please press Enter to activate this console. 
[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: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)

插上网线,设置虚拟机为网桥连接,测试网络

[root@FriendlyARM /]# eth0: link up, 100Mbps, full-duplex, lpa 0xCDE1


[root@FriendlyARM /]# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: seq=0 ttl=64 time=0.963 ms
64 bytes from 127.0.0.1: seq=1 ttl=64 time=0.485 ms
64 bytes from 127.0.0.1: seq=2 ttl=64 time=0.470 ms
64 bytes from 127.0.0.1: seq=3 ttl=64 time=0.484 ms
64 bytes from 127.0.0.1: seq=4 ttl=64 time=0.460 ms
64 bytes from 127.0.0.1: seq=5 ttl=64 time=0.480 ms
64 bytes from 127.0.0.1: seq=6 ttl=64 time=0.466 ms
64 bytes from 127.0.0.1: seq=7 ttl=64 time=0.476 ms
^C
--- 127.0.0.1 ping statistics ---
8 packets transmitted, 8 packets received, 0% packet loss
round-trip min/avg/max = 0.460/0.535/0.963 ms

设置linux主机IPclx@think:/$ sudo ifconfig eth0 192.168.1.233

[root@FriendlyARM /]# ping 192.168.1.233
PING 192.168.1.233 (192.168.1.233): 56 data bytes
64 bytes from 192.168.1.233: seq=0 ttl=64 time=54.493 ms
64 bytes from 192.168.1.233: seq=1 ttl=64 time=1.623 ms
64 bytes from 192.168.1.233: seq=2 ttl=64 time=1.661 ms
64 bytes from 192.168.1.233: seq=3 ttl=64 time=1.774 ms
^C
--- 192.168.1.233 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 1.623/14.887/54.493 ms

至此,说明DM9k网卡驱动移植正常,并且网卡和主机连接正常。

推荐:Linux-2.6.32.2内核在mini2440上的移植(三)---DM9000网卡驱动移植

移植环境(红色粗字体字为修改后内容,蓝色粗体字为特别注意内容) 1,主机环境:VMare下CentOS 5.5 ,1G内存。 2,集成开发环境:Elipse IDE 3,编译编译环境:ar

1、设备资源初始化 Linux-2..6.32.2 已经自带了完善的DM9000网卡驱动驱动(源代码位置:linux-2.6.32.2/drivers/net/dm9000.c),它也是一个平台设备,因此在目标平台初始化代码中,只要填写好相

相关阅读排行


相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。