Linux下DM9000网卡驱动实验〈一〉

来源:互联网 发布:js打开新窗口传递参数 编辑:程序博客网 时间:2024/05/13 08:59

Linux下DM9000网卡驱动实验〈一〉

分类:Linux/Embedded

1.1        硬件系统介绍

1.1.1          网络驱动程序的特点

    网络驱动程序是介于硬件和内核之间传送数据包,不是面向流的设备,不能象/dev/tty1那样简单的映射到文件系统的节点上。Linux调用这些接口的方式是给他们分配一个独立的名字(如eth0)。这样的名字在文件系统中并没有对应项。内核和网络设备驱动程序之间的通信与字符设备驱动程序和快设备驱动程序与内核间的通信是完全不同的。内核不再调用read/write,它调用与数据包传送相关的函数。

1.1.2          DM9000以太网芯片介绍

网络控制器选用DAVICOM公司的DM9000快速以太网控制处理器,合成了MAC, PHY, MMU。该处理器配备有标准10/100M自适应,16K大容量的FIFO,4路多功能GPIO,掉电,全双工工作等功能。物理层支持以太网接口协议。由于数据有时是以猝发形式收到的,因此,DM9000还集成有接收缓冲区,以便在接收到数据时能把数据放到这个缓冲区中,然后由数据链路层直接从该缓冲区里取走数据。链路层通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡,它们一起处理与电缆的物理接口细节数据,它的缓冲区可用来暂时存储要发送或接收的帧。

网络控制器包括MACPHY两个部分,其中MAC层控制器作为逻辑控制。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

1.1.3          2410DM9000的硬件连接

DM9000的模块示意图

 

接口电路图:

1.2        网卡驱动实验步骤

1.2.1          步骤一:编写简单的网络设备驱动程序

  以下是一个网络驱动程序完整源码,这仅仅只是一个可编译,加载和卸载的驱动程序,不能完成任何实际的工作。不过,可把它当作模板,网络设备的驱动程序就从这个模板上添加而成。并且,针对每一个驱动程序的接口,都做了介绍和编程指导。

 

程序清单 1‑01 简单的网络程序模板 test_net.c

/*********************************************************************************

 

 *

 

 *     net_test.c                a simple net device driver sample

 

 *

 

 *

 

 *********************************************************************************

 

 */

 

 

 

#ifndef __KERNEL__

 

     #define  __KERNEL__

 

#endif

 

 

#ifndef MODULE

 

     #define MODULE

 

#endif

 

 

#define __NO_VERSION__

 

 

#include

 

#include

 

#include

 

#include

 

 

#include

 

#include

 

#include

 

#include

 

#include

 

 

 

static int test_init(struct net_device *dev);

 

static int test_open(struct net_device *dev);

 

static int test_release(struct net_device *dev);

 

static int test_config(struct net_device *dev, struct ifmap *map);

 

static int test_tx(struct sk_buff *skb, struct net_device *dev);

 

 

int  test_init_module(void);

 

void test_cleanup(void);

 

 

 

#define DEVICE_NAME "test" //内核模块名称

 

 

module_init(test_init_module);

 

module_exit(test_cleanup);

 

 

//定义结构体变量并初始化必须的成员

 

static struct net_device  net_test =

 

{

 

     init:test_init,

 

};

 

 

static int test_init(struct net_device *dev)

 

{

 

     ether_setup(dev);//初始化结构体变量中与硬件无关的成员

 

     strcpy(dev->name,"eth0");

 

    

 

     dev->open              =test_open;

 

     dev->stop              =test_release;

 

     dev->set_config                  =test_config;

 

     dev->hard_start_xmit             =test_tx;

 

     dev->flags                  &=~(IFF_BROADCAST|IFF_LOOPBACK|IFF_MULTICAST);

 

//设置驱动中感兴趣的成员...

 

     SET_MODULE_OWNER(dev);//设置owner成员

 

 

     return 0;

 

}

 

//当网络设备驱动程序不能自动识别硬件配置时,系统管理员会使用配制工具将正确的硬件配置传递给

 

//驱动程序。实际上就是调用驱动程序的set_config()方法。

 

static int test_config(struct net_device *dev, struct ifmap *map)

 

{

 

     return 0;

 

}

 

 

static int test_tx(struct sk_buff *skb, struct net_device *dev)

 

{

 

     return 0;

 

}

 

 

static int test_open(struct net_device *dev)

 

{

 

     MOD_INC_USE_COUNT;

 

 

    netif_start_queue(dev);//第一次调用open()方法必须调用

 

 

     return 0;

 

}

 

 

static int test_release(struct net_device *dev)

 

{

 

netif_stop_queue(dev);//最后一次调用stop()方法必须调用

 

 

MOD_DEC_USE_COUNT;

 

 

return 0;

 

}

 

 

int  test_init_module(void)

 

{

 

     int result = 0;

 

     //初始化模块自身(包括请求一些资源)

 

     result = register_netdev(&net_test);//注册网络设备驱动程序

 

     if(result < 0)

 

     {

 

         printk(KERN_ERR DEVICE_NAME":error % i registering device /"%s/"/n", result , net_test.name);

 

         return result;

 

     }

 

 

     printk(KERN_ERR DEVICE_NAME ":init OK/n");

 

 

     return 0;

 

}

 

 

void test_cleanup(void)

 

{

 

     unregister_netdev(&net_test); //卸载驱动程序

 

}

 

 

//////////////////////////////////////////////////////////////

1.2.2          步骤二:在Linux平台上编译和运行简单的网络设备驱动程序

编译驱动程序需要编写Makefile文件,与其他驱动的Makefile类似。

#   Makefile for net_test.c

#                              a simple net device driver

#                                  Aka   2006.08

OBJS = net_test.o

SRC  = net_test.c

CC           =  /usr/local/arm/2.95.3/bin/arm-linux-gcc 

LD           =  /usr/local/arm/2.95.3/bin/arm-linux-ld

#INCLUDE = -I/HHARM2410-R3/kernel/include/linux -I/HHARM2410-R3/kernel/include

INCLUDE = -I/9200E/arm-kernel/linux-2.4.19-rmk7/include

CFLAGS = -D__KERNEL__  -DMODULE -O2 -Wall -Wstrict-prototypes -Wno-trigraphs -Wmissing-prototypes

All: $(OBJS)

%.o:%.c

         $(CC) $(CFLAGS) $(INCLUDE) -c $^ -o $@

.PHONY: clean

clean:

         -rm -f *.o

distclean:

         @make clean

         rm -f tags *~

 

编译,测试驱动文件net_test.o,要把这个文件下载到HHARM2410的开发平台上,需要建立好主机与开发板的连接和开发环境。参考附录一建立开发环境。

 

在主机上编译驱动程序,在源文件目下输入

[localhost]# make

 

生成驱动文件模块test_net.o

通过网络或者NFS,把驱动文件net_test.o传到开发板的系统中。

加载驱动模块如下

[localhost]# insmod test_net.o

 

卸载驱动模块如下:

 

[localhost]# rmmod test_net.o

原创粉丝点击