dm9000.mini2440,2.6.32内核移植(修正版)

来源:互联网 发布:数控车削编程简单案例 编辑:程序博客网 时间:2024/06/05 19:01

 前几天在进行进一步开发,构建交叉编译环境的时候遇到了网卡的问题,也对网卡的移植有了更深的理解。

解决了一个很大的误区。原以为只要可以ping通,不管是还回接口还是主机,都说明网卡移植是成功的。

后来事实证明是错误的。

ping还回能ping通,网卡不一定好使。

ping还回能ping通,只能说明TCP/IP协议时好使的

ping通自身走的是协议栈(不涉及MAC地址解析之类的驱动封包处理),说明驱动把网卡加载上了,但是内部工作可能不对。
然后意识到问题,重新在网上搜了一篇博客,照着做,成功了。便把他贴出来,感谢网络上的这位大牛。

DM9000移植的好文章:

1.http://blog.chinaunix.net/u1/57901/showart_2023852.html

2.http://blog.csdn.net/baozhongchao/archive/2009/09/10/4538182.aspx

 

1.修改arch/arm/plat-s3c24xx/common-smdk.c文件

在包含头文件的区域增加以下代码:

#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
#include <linux/dm9000.h>
#endif

在smdk_devs结构体之前添加以下代码:
#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)

//DM9000网卡使用的资源列表。使用0x20000000、0x20000004这两个地址就可以操作DM9000网卡。
static struct resource s3c_dm9k_resource[] = {
 [0] = {
  .start = S3C2410_CS4,           //S3C2410_CS4被定义为0x20000000(BANK4基地址) 
  .end   = S3C2410_CS4+3,     
  .flags = IORESOURCE_MEM,
 },
 [1] = {
  .start = S3C2410_CS4 + 4,    //0x20000004
  .end   = S3C2410_CS4 + 4 + 3,
  .flags = IORESOURCE_MEM,
 },
 [2] = {
  .start = IRQ_EINT7,               //连接S3C2440的EINT7引脚
  .end   = IRQ_EINT7,
  .flags = IORESOURCE_IRQ | IRQF_TRIGGER_RISING,    //上升沿触发
 }

};

//DM9000与开发板相关的数据,指定访问DM9000时,数据位宽为16
static struct dm9000_plat_data s3c_dm9k_platdata = {
 .flags  = DM9000_PLATF_16BITONLY,
};

static struct platform_device s3c_device_dm9k = {
 .name  = "dm9000",
 .id  = 0,
 .num_resources = ARRAY_SIZE(s3c_dm9k_resource),
 .resource = s3c_dm9k_resource,
 .dev  = {
  .platform_data = &s3c_dm9k_platdata,
 }
};
#endif

在smdk_devs结构体中添加以下代码:

#if defined(CONFIG_DM9000) || defined(CONFIG_DM9000_MODULE)
 &s3c_device_dm9k,
#endif

2.修改drivers/net/dm9000.c文件

在包含头文件区域添加以下代码

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

dm9000_probe函数中的变量声明之后添加以下代码:

#if defined(CONFIG_ARCH_S3C2410)
 unsigned int oldval_bwscon;
 unsigned int oldval_bankcon4;
#endif

在dev_dbg(&pdev->dev, "dm9000_probe()\n");语句之后添加以下代码:

#if defined(CONFIG_ARCH_S3C2410)
 oldval_bwscon=*((volatile unsigned int *)S3C2410_BWSCON);
 *((volatile unsigned int *)S3C2410_BWSCON)=(oldval_bwscon & ~(3<<16))| S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
oldval_bankcon4=*((volatile unsigned int *)S3C2410_BANKCON4);
*((volatile unsigned int *)S3C2410_BANKCON4)=0x1f7c;
#endif

将platform_set_drvdata(pdev, ndev);之前的if判断语句改为:

if (!is_valid_ether_addr(ndev->dev_addr))
 {
  dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please "
    "set using ifconfig\n", ndev->name);
  #if defined(CONFIG_ARCH_S3C2410)
  printk("Now use the default MAC address: 08:90:90:90:90:90\n");
  ndev->dev_addr[0]=0x08;
  ndev->dev_addr[1]=0x90;
  ndev->dev_addr[2]=0x90;
  ndev->dev_addr[3]=0x90;
  ndev->dev_addr[4]=0x90;
  ndev->dev_addr[5]=0x90;
  #endif
 }

在dev_err(db->dev, "not found (%d).\n", ret);之后添加以下代码:

#if defined(CONFIG_ARCH_S3C2410)
 *((volatile unsigned int *)S3C2410_BWSCON)=oldval_bwscon;
 *((volatile unsigned int *)S3C2410_BWSCON)=oldval_bankcon4;
#endif

3.配置内核

Device Drivers --->

  Network device support --->

    [*] Network device support --->

      Ethernet (10 or 100Mbit) --->

        <*> DM9000 support

到这里,网卡的内核驱动移植算是完成了,

但是工作还是没有做完。你必须在根文件系统中添加相应的初始化语句,才算完成了整个网卡的移植

在根文件系统的 /etc/init.d/rcS 中添加如下语句

echo "network interface"
/sbin/ifconfig lo 127.0.0.1
/sbin/ifconfig eth0 210.46.98.112 up                 
route add default gw 210.46.98.112

ifconfig eth0 down

ifconfig eth0 hw ether XX:XX:XX:XX:XX:XX  ÅMAC 地址,随便设 

ifconfig eth0 up

这样网卡就算是全部移植完成了。


 

 

原创粉丝点击