分享

基于linux2.6内核的dm9000移植(详细简洁)

 cana_xzy 2010-06-04
From:http://hi.baidu.com/soft_hard/blog/item/c54f8d23cf977dad4723e826.html

    linux-2.6.22内核下dm9000网卡移植具体步骤如下:
    平台信息:
    开发板:
             芯片     s3c2410
             系统内核 linux-2.6.22.19
    主机:
             操作系统:redhat9.0
             交叉编译器:arm-linux-gcc3.4.1
   
1. 修改arch/arm/plat-s3c24xx/devs.c,加入dm9000的信息,并使用EXPORT_SYMBOL 宏将platform_device s3c_device_dm9000导出,在smdk2410.c中会用到先添加头文件:
#include <linux/dm9000.h> //
再添加以下代码:
//===========================================================================
/*注意:以下有两个地方需要根据自己的开发板上的dm9000与s3c2410硬件电路连接情况而定(一般在开发板的手册上有说明):
    (1)dm9000的基地址 DM9000_BASE,   

    (2)所采用的是哪个外部中断*/

#define    DM9000_BASE 0x18000300 //依个人情况而定
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,
};

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 */
        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 地址设置:
       在dm9000_probe函数中添加两处语句:
     (1)在函数体的开头儿添加:
        static char net_mac_addr[]={0x00,0xe0,0x3d,0xf4,0xdd,0xf7}; // 自己设的MAC地址,随意设,尽量不要

全0或全1
     (2) 在/* 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 ************/
       for(i=0;i<6;i++){
         ndev->dev_addr[i]=net_mac_addr[i];
       }            

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

      注意:至此编译内核下载系统就能加载dm9000网卡设备了,启动信息中会出现:
        dm9000 Ethernet Driver
        eth0: dm9000 at c485e300,c4860304 IRQ 16 MAC: 00:e0:3d:f4:dd:f7

    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要根据自己开发板而定,与步骤1中对应.

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

5,配置内核:
     Device Drivers --->
            Network device support --->
                  Ethernet (10 or 100Mbit) --->
                           <*> DM9000 support   //选上该项


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的机器在同一网段,网关也设成一样.

      / $ ping 192.168.0.105
      PING 192.168.0.105       (192.168.0.105): 56 data bytes
      84 bytes from 192.168.0.105: icmp_seq=0 ttl=64 time=2.0 ms            84 bytes from

192.168.0.105: icmp_seq=1 ttl=64 time=0.5 ms
      84 bytes from 192.168.0.105:       icmp_seq=2 ttl=64 time=0.5 ms
      84 bytes from 192.168.0.105: icmp_seq=3 ttl=64 time=0.5 ms
      84 bytes from 192.168.0.105: icmp_seq=4 ttl=64 time=0.5 ms
至此dm9000移植完成,如果内核配置了nfs,这时就可以直接使用了.

       本文在参考了网上一些文章的基础上针对自己遇到的问题做了一些修改和补充,主要是指出了针对不同开发板需要修改的地方,并将外部中断的设置方式改为函数设置,从而将原来的十句代码化简到一句,执行效率上也许比不上直接代码设置,但是对于新手来说这样更简洁明了,节省时间。

       参考文章:http://blog./brucedeng/76545/message.aspx

                        http://blog.21ic.com/user1/3074/archives/2009/57085.html

                        http://blog.csdn.net/yang_dk/archive/2008/05/01/2357664.aspx

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多