Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4471334
  • 博文数量: 1148
  • 博客积分: 25453
  • 博客等级: 上将
  • 技术积分: 11949
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-06 21:14
文章分类

全部博文(1148)

文章存档

2012年(15)

2011年(1078)

2010年(58)

分类: 嵌入式

2011-04-01 09:22:39

说明:
    在第三章中,使用了TQ手册中的移植方法,有很多不太清楚的地方,在本章中,我们使用platform来对DM9000进行移植,并且对其中的一些代码解读。

参考资料:
     《嵌入式linux应用开发完全手册》网卡移植部分
     TQlinux 移植09年版
     linux-2.6.29.1在utu2440上的移植--dm9000驱动
  
arm-linux-gcc-4.4.1
     DM9000 驱动移植及源码简析 [原创]

1.硬件说明:
 
   DM9000的访问基址 0x20000000 BANK4 的基址,这是物理地址
 
   只用到一条地址线,ADDR2,这是由 DM9000 的特性决定的:DM9000的地址信号和数据信号复用,使用 CMD引脚来区分它们(CMD为低时数据总线上传输的是地址信号,反之,数据信号)。访问DM9000内部寄存器时,需要先将 CMD 置为低电平,发出地址信号,然后将CMD置为高电平,读写数据。

   总线位宽为16,用到nWAIT信号:nWAIT信号可以延时总线访问周期  
 
   中断引脚:EINT7
 
2.修改 arch/arm/plat-s3c24xx/devs.c   添加网卡驱动的平台数据信息,包括:网卡的资源(地址资源、数据资源以及中断号等)、数据位数、网卡名称等

  1. ###添加包含的头文件
  2. #include <linux/dm9000.h>

  3. /* DM9000 */
  4. static struct resource dm9000_resource[] = {
  5.     [0] = {
  6.          // .start    = S3C2410_CS4,
  7.          // .end     = S3C2410_CS4 + 3,
  8.         .start =0x20000000,        //ADDR2=0,发送地址时使用这个地址
  9.         .end =0x20000000+3,       
  10.         .flags    = IORESOURCE_MEM,
  11.     },
  12.     [1] = {
  13.       // .start    = S3C2410_CS4 + 4,
  14.        // .end        = S3C2410_CS4 + 4 + 3,
  15.          .start =0x20000000+4,          //ADDR2=1,传输数据时使用这个地址
  16.            .end =0x20000000+4+3,
  17.         .flags    = IORESOURCE_MEM,
  18.     },
  19.     [2] = {
  20.         .start    = IRQ_EINT7,            //中断号 EINT7
  21.         .end    = IRQ_EINT7,
  22.         .flags    = IORESOURCE_IRQ | IRQF_TRIGGER_RISING,
  23.     }

  24. };

  25. static struct dm9000_plat_data dm9000_platdata = {
  26.     .flags    = DM9000_PLATF_16BITONLY,     //指定访问DM9000时,数据位宽为16.  DM9000支持8/16/32位
  27. };

  28. struct platform_device dm9000_device = {
  29.     .name        = "dm9000",       //  这里的name一定要和drivers/net/dm9000.c中的dm9000_driver.driver.name一致,否则系统会找不到网卡驱动
  30.   
  31.     .id            = 0,
  32.     .num_resources    = ARRAY_SIZE(dm9000_resource),
  33.     .resource        = dm9000_resource,
  34.     .dev            = {
  35.         .platform_data = &dm9000_platdata,
  36.     }
  37. };

  38. EXPORT_SYMBOL(dm9000_device);
3.arch/arm/plat-s3c/include/plat/devs.h

  1. # vim arch/arm/plat-s3c/include/plat/devs.h // 添加如下

  2. extern struct platform_device dm9000_device;

4.  dm9000_device添加到平台设备列表中mach-smdk2440.c

  1. # vim arch/arm/mach-s3c2440/mach-smdk2440.c

static struct platform_device *smdk2440_devices[] __initdata = {
    &s3c_device_usb,
    &s3c_device_lcd,
    &s3c_device_wdt,
    &s3c_device_i2c0,
    &s3c_device_iis,
        &dm9000_device,
};

5. OK,经过上述努力,dm9000设备已经成功注册进入驱动核心。下面进入driver/net/dm9000.c中,还需要做两方面的工作:设置芯片MAC地址,使能dm9000的中断.
 
  在修改dm9000.c内容,参考 tq移植手册,所以第 5 部分 和 第三章dm9000.c 修改一样,

    1.添加头文件
  1. #if defined(CONFIG_ARCH_S3C2410)
  2. #include <mach/regs-mem.h>
  3. #endif

    2.设置存储器是BANK4可用,
  1. static int __devinit
  2. dm9000_probe(struct platform_device *pdev)
  3. {
  4.    ...。。。。。。。。
  5.     int i;
  6.     u32 id_val;


###############
   用来保存 BWSCON   S3C2410_BANKCON4 寄存器的值 ,
  1. #if defined(CONFIG_ARCH_S3C2410)
  2.     unsigned int oldval_bwscon = *(volatile unsigned int *)S3C2410_BWSCON;
  3.     unsigned int oldval_bankcon4 = *(volatile unsigned int *)S3C2410_BANKCON4;
  4. #endif

  5.     /* Init network device */
  6.     ndev = alloc_etherdev(sizeof(struct board_info));
  7.    .......。。。。。。。。
  8.     dev_dbg(&pdev->dev, "dm9000_probe()\n");


############
    设置 bank4,总线宽度为16,时能nWAIT、
    设置BANK4的时间参数
  1. #if defined(CONFIG_ARCH_S3C2410)
  2.     *((volatile unsigned int *)S3C2410_BWSCON) = (oldval_bwscon & ~(3<<16)) | S3C2410_BWSCON_DW4_16 | S3C2410_BWSCON_WS4 | S3C2410_BWSCON_ST4;
  3.     *((volatile unsigned int *)S3C2410_BANKCON4) = 0x1f7c;
  4. #endif


  1.     /* setup board info structure */
  2.     db = netdev_priv(ndev);
  3.   。。。。。。。。
  4.      db->flags = pdata->flags;
  5.     }

  6. #ifdef CONFIG_DM9000_FORCE_SIMPLE_PHY_POLL
  7.     db->flags |= DM9000_PLATF_SIMPLE_PHY;
  8. #endif

  9.     dm9000_reset(db);
  10. 。。。。。。。。。。。
  11.  
  12.     db->mii.mdio_write = dm9000_phy_write;
##################
  设置 MAC 地址
  1. #if defined(CONFIG_ARCH_S3C2410)
  2.     printk("Now use the default MAC address: 10:23:45:67:89:ab\n");
  3.     mac_src = "ywx";
  4.     ndev->dev_addr[0] = 0x10;
  5.     ndev->dev_addr[1] = 0x23;
  6.     ndev->dev_addr[2] = 0x45;
  7.     ndev->dev_addr[3] = 0x67;
  8.     ndev->dev_addr[4] = 0x89;
  9.     ndev->dev_addr[5] = 0xab;
  10. #else

  11.     mac_src = "eeprom";

  12.     /* try reading the node address from the attached EEPROM */
  13.     for (i = 0; i < 6; i += 2)
  14.         dm9000_read_eeprom(db, i / 2, ndev->dev_addr+i);

  15.     if (!is_valid_ether_addr(ndev->dev_addr) && pdata != NULL) {
  16.         mac_src = "platform data";
  17.         memcpy(ndev->dev_addr, pdata->dev_addr, 6);
  18.     }

  19.     if (!is_valid_ether_addr(ndev->dev_addr)) {
  20.         /* try reading from mac */
  21.         
  22.         mac_src = "chip";
  23.         for (i = 0; i < 6; i++)
  24.             ndev->dev_addr[i] = ior(db, i+DM9000_PAR);
  25.     }

  26.     if (!is_valid_ether_addr(ndev->dev_addr))
  27.         dev_warn(db->dev, "%s: Invalid ethernet MAC address. Please "
  28.              "set using ifconfig\n", ndev->name);
  29. #endif

  30.     platform_set_drvdata(pdev, ndev);
  31.    。。。。。
  32.     return 0;

  33. out:
  34. #if defined(CONFIG_ARCH_S3C2410)
  35.     *(volatile unsigned int *)S3C2410_BWSCON = oldval_bwscon;
  36.     *(volatile unsigned int *)S3C2410_BANKCON4 = oldval_bankcon4;
  37. #endif

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

  39.     dm9000_release_board(pdev, db);
  40.     free_netdev(ndev);

  41.     return ret;
  42. }


6.使用网卡
  1. make menuconfig
  2.  Device Driver->
  3.        Netword device support->
  4.            [*]Network device support
  5.               Ethernet(10 or 100 Mbit)
  6.                   <*>DM9000 support

7.网路文件系统 和 第三章 一样
  实现效果如下:

  1. [\u@\h \W]# ls
  2. bin lib opt sddisk usr
  3. dev linuxrc proc sys var
  4. etc lost+found root tmp web
  5. home mnt sbin udisk
  6. [\u@\h \W]# ifconfig
  7. lo Link encap:Local Loopback
  8.           inet addr:127.0.0.1 Mask:255.0.0.0
  9.           UP LOOPBACK RUNNING MTU:16436 Metric:1
  10.           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  11.           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  12.           collisions:0 txqueuelen:0
  13.           RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

  14. [\u@\h \W]# ifconfig eth0 dow
  15. ifconfig: bad address 'dow'
  16. [\u@\h \W]# ifconfig eth0 down
  17. [\u@\h \W]# ifconfig eth0 192.168.1.6 netmask 255.255.255.0 up
  18. eth0: link down
  19. [\u@\h \W]# ifconfig
  20. eth0 Link encap:Ethernet HWaddr 10:23:45:67:89:AB
  21.           inet addr:192.168.1.6 Bcast:192.168.1.255 Mask:255.255.255.0
  22.           UP BROADCAST MULTICAST MTU:1500 Metric:1
  23.           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  24.           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  25.           collisions:0 txqueuelen:1000
  26.           RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
  27.           Interrupt:51

  28. lo Link encap:Local Loopback
  29.           inet addr:127.0.0.1 Mask:255.0.0.0
  30.           UP LOOPBACK RUNNING MTU:16436 Metric:1
  31.           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  32.           TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  33.           collisions:0 txqueuelen:0
  34.           RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

  35. [\u@\h \W]# eth0: link up, 100Mbps, full-duplex, lpa 0x41E1

  36. [\u@\h \W]# /etc/rc.d/init.d/httpd start
  37. [01/Jan/1970:00:02:44 +0000] boa: server version Boa/0.94.13
  38. [01/Jan/1970:00:02:44 +0000] boa: server built Mar 31 2011 at 18:32:43.
  39. [01/Jan/1970:00:02:44 +0000] boa: starting server pid=965, port 80
  40. [\u@\h \W]# ping 192.168.1.7
  41. PING 192.168.1.7 (192.168.1.7): 56 data bytes
  42. 64 bytes from 192.168.1.7: seq=0 ttl=64 time=6.400 ms
  43. 64 bytes from 192.168.1.7: seq=1 ttl=64 time=0.923 ms
  44. 64 bytes from 192.168.1.7: seq=2 ttl=64 time=0.859 ms
  45. ^C
  46. --- 192.168.1.7 ping statistics ---
  47. 3 packets transmitted, 3 packets received, 0% packet loss
  48. round-trip min/avg/max = 0.859/2.727/6.400 ms
  49. [\u@\h \W]#






















阅读(1019) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~