目录
概述
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已经能正常工作了。