现在的位置: 首页 > 综合 > 正文

Linux2.6移植:DM9000驱动

2013年10月01日 ⁄ 综合 ⁄ 共 4790字 ⁄ 字号 评论关闭

工作环境:Ubuntu10.0.4

交叉编译环境:3.4.1

板子:MagicARM2410

系统内核:linux2.6.24.4

移植DM9000 驱动前需要知道的DM9000 的硬件信息:

1)EECS 拉高:16bit 模式;

2)EECK 拉高,INT 连接到2410 EINT0 :INT 脚为低时为有效中断信号,中断线为EINT0

3)cs 连接到2410 的nGCS3 ,CMD 连接2410 地址总线ADDR[2] :INDEX 和DATA 端口地址分别为0x180003000 和0x18000304 。

接下来就是具体移植步骤了:

Linux 内核下的 drivers/net/dm9000.c 实现了与体系结构无关的 DM9000 网卡驱动,只需要在 BSP 的板文件(arch/arm/mach-s3c6410/smdk-6410.c)中定义相关的 platform 设备和数据:


1、 添加引脚宏定义 
在arch/arm/mach-s3c6400/include/mach/map.h文件中添加宏定义 

#define S3C64XX_PA_DM9000 (0x18000000)

 

 2、 添加platform数据

在arch/arm/mach-s3c6410/smdk-6410.c(目标板文件)文件中添加头文件#include <linux/dm9000.h>

1 .修改arch/arm/plat-s3c24xx/devs.c ,加入dm9000 的信息,并使用EXPORT_SYMBOL 宏将platform_device
s3c_device_dm9000
 导出,在smdk2410.c 中会用到,在 devs.c 中先添加头文件:
#include <linux/dm9000.h> 
再添加以下代码:
//===========================================================================
/*
 注意: 以下有两个地方需要根据自己的开发板上的dm9000 与s3c2410 硬件电路连接情况而定( 一般在开发板的手册上有说明,也就是刚才所列出的几条信息):(1)dm9000 的基地址 DM9000_BASE,(2) 所采用的是哪个外部中断*/

#define    DM9000_BASE 0x18000300 //这是 dm9000的基地址依个人情况而定 
static struct resource s3c_dm9000_resource[] = {
[0] = {
.start = DM9000_BASE,
.end   = DM9000_BASE+ 0x3,
.flags = IORESOURCE_MEM
},
[1]={
.start = DM9000_BASE + 0x4,
.end = DM9000_BASE + 0x4 + 0x7c,
.flags = IORESOURCE_MEM
},
[2] = {
.start = IRQ_EINT0, //外部中断,依个人情况而定
 
.end   = IRQ_EINT0, //外部中断,依个人情况而定
 

.flags = IORESOURCE_IRQ
}
};

static struct dm9000_plat_data s3c_device_dm9000_platdata = {
.flags= DM9000_PLATF_16BITONLY, // 16bit模式 
};

struct platform_device s3c_device_dm9000 = {
.name= "dm9000",
.id= -1,
.num_resources= ARRAY_SIZE(s3c_dm9000_resource),
.resource= s3c_dm9000_resource,
.dev= {
.platform_data = &s3c_device_dm9000_platdata,
}
};

EXPORT_SYMBOL(s3c_device_dm9000);      
//end of DM9000 
//===========================================================================

2 .在include/asm-arm/plat-s3c24xx/devs.h 文件中 添加一行
extern struct platform_device s3c_device_dm9000; 

3 .在arch/arm/mach-s3c2410/mach-smdk2410.c 中将dm9000 加入到要初始化的设备链表里去,内核启动时将会检测设

备并加载驱动

static struct platform_device *smdk2410_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c,  

&s3c_device_iis,
&s3c_device_dm9000,//add for dm9000

        };


4, 以下是要在linux-2.6.24/drivers/net/dm9000.c 文件中添加的内容:

   4.1 dm9000 添加硬件复位, 在dm9000_reset 函数开头添加以下代码:
/*reset hardware --add by Eric Fu */
  
 p { margin-bottom: 0.21cm; }

  s3c2410_gpio_cfgpin(S3C2410_GPG2,S3C2410_GPG2_OUTP);

   s3c2410_gpio_setpin(S3C2410_GPG2,0);

  udelay(500);  

  s3c2410_gpio_setpin(S3C2410_GPG2,1);       

   udelay(500);

  s3c2410_gpio_setpin(S3C2410_GPG2,0);

  udelay(500); 
/*end of add*/

注意: 网上很多移植都没有这一步, 但在我的板子上如果没有这一步, 但板子硬件复位后会出现系统找不到网卡设备, 并出现以下错误信息:
dm9000 Ethernet Driver
dm9000: read wrong id 0x00000000
dm9000: read wrong id 0x00000000
dm9000: wrong id: 0x00000000               

dm9000: not found (0).
........

 

4.2 MAC 地址设置:

/* Set Node Address */
for (i = 0; i < 6; i++)
ndev->dev_addr[i] = db->srom[i];
的后面
if (!is_valid_ether_addr(ndev->dev_addr)) {
/* try reading from mac */
for (i = 0; i < 6; i++)
ndev->dev_addr[i] = ior(db, i+DM9000_PAR);
}
的前面, 添加:

/*********** add by Eric Fu ************/

static char net_mac_addr[]={0x00,0xe0,0x3d,0xf4,0xdd,0xf7}; // 自己设的 MAC地址 ,随意设 ,尽量不要全 0或全 1


for(i=0;i<6;i++){
ndev->dev_addr[i]=net_mac_addr[i];
}            

       /******************end **************/

4.3 设置外部中断:
(1)
 在dm9000.c 添加以下头文件: 添加在所有头文件的尾部
#include <asm-arm/arch/irqs.h>
#include <asm-arm/arch/hardware.h>
#include <asm-arm/arch/regs-gpio.h> 
#include <linux/irq.h>

  (2) 在4.2 步添加代码处添加一句中断设置语句, 连同4.2 步整体效果如下:
/*********** add by Eric Fu ************/
for(i=0;i<6;i++){
ndev->dev_addr[i]=net_mac_addr[i];
}

            /*Set external intruppt*/
set_irq_type(IRQ_EINT0,IRQT_HIGH);//IRQ_EINT0 
要根据自己开发板而定

          /******************end **************/

注意: 代码修改完成, 配合第5 步, 第6 步, 编译下载可以ping 通其他机器了.

5, 配置内核:
Device Drivers ---> 
Network device support --->
Ethernet (10 or 100Mbit) --->
<*> DM9000 support   //
 选上该项 //s3c2410 的默认配置文件应该是选上了的


6,
 网络设置:
下载内核, 启动后执行以下命令( 否则ifconfig 命令无效):
/ $ cd sbin
/sbin $ ifconfig lo up
/sbin $ ifconfig eth0 192.168.0.106 netmask 255.0.0.0 up          
eth0: link up, 100Mbps, full-duplex, lpa 0x45E1
/sbin $ inetd
/sbin $ mount -t proc proc /proc
/sbin $ ifconfig

出现如下信息:
eth0      Link encap:Ethernet HWaddr 00:E0:3D:F4:DD:F7
inet addr:192.168.0.106 Bcast:192.255.255.255 Mask:255.0.0.0
UP           BROADCAST RUNNING 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:19 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 通其它机器了, 如果ping 不通, 可以试着把ip 设成与你要ping 的机器在同一网段, 网关也设成一样.

至此dm9000 移植完成, 如果内核配置了nfs, 这时就可以直接使用了.

我把nfs 文件挂载到开发板后,运行./mplayer video.mpeg, 但是开发板屏幕上没有任何图像,而且打印了错误信息:

VIDEO: MPEG1 320x240 (aspect 12) 29.970 fps 0.0 kbps ( 0.0 kbyte/s)

Can't open /dev/fb0: No such file or directory

应该是LCD 驱动的问题,接下来:移植LCD 驱动

抱歉!评论已关闭.