Linux 下的网络设备驱动(一)

发表于:2013-2-19 10:04

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:魏清    来源:51Testing软件测试网采编

分享:

  设备驱动功能层

  对于具体的设备,工程师应该实现net_device中的open,stop,tx,hard_header,get_stats,tx_timeout,interruppt等函数。

  网络设备媒介层

  网络设备媒介层直接对应实际的硬件设备,我们需要定义一组读写设备内部寄存器的函数,如ior,iow。

  二、网络设备驱动移植

  下面我们主要讲解基于mini2440的DM9000网卡驱动的移植

  首先看内涵DM9000代码在/driver/net/dm9000.c

  查看/driver/net/Makefile

  obj-$(CONFIG_DM9000) += dm9000.o

  查看/driver/net/Konfig

  menuconfig NET_ETHERNET
         bool "Ethernet (10 or 100Mbit)"
  config DM9000
         tristate "DM9000 support"
         depends on ARM || BLACKFIN || MIPS
         select CRC32
         select MII

  所以配置内核make menuconfig 时,需要选中这一项。

  根据开发板电路图知道DM9000的AEN端口接到了nGCS4上,同时DM9000的INT端口接到了IRQ_EINT7上,另外DM9000的CMD端口接到了LADDR2上,最后发现DM9000上数据线是SD0-SD15,即数据线的位数是16位。

  根据mini2440地址空间的分配与片选信号的定义知道,引脚nGCS4对应的空间的起始地址为0x20000000,这个由系统地址线控制。同时我们知道DM9000使用的中断号就是IRQ_EINT7。另外,DM9000上的CMD信号是控制地址端口还是数据端口的,如果CMD为0,即LADDR2为0表示访问地址寄存器,当CMD为1,即LADDR2为1表示访问数据寄存器。

  下面我们进行DM9000驱动的移植,在mach-mini2440.c中添加如下代码

#include <linux/dm9000.h>
#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,//高电平触发
        }
};
static struct dm9000_plat_data mini2440_dm9k_pdata = {
              //数据线的位数是16位,没有使用E2PROM
        .flags   = (DM9000_PLATF_16BITONLY | DM9000_PLATF_NO_EEPROM),
              .dev_addr = { 0x08,0x90,0x90,0x90,0x90,0x90},   //MAC地址
};
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,  //私有数据
        },
};

  最后在mini2440的BSP文件mach-mini2440.c中添加如下代码

static struct platform_device *mini2440_devices[] __initdata = {
       ……
       & mini2440_device_eth,    //添加
};

  这样移植完毕后编译内核生成内核镜像。

  本文转载自:http://blog.csdn.net/weiqing1981127/article/details/8521600

22/2<12
精选软件测试好文,快来阅读吧~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号