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。该处理器配备有标准10M/
网络控制器包括MAC和PHY两个部分,其中MAC层控制器作为逻辑控制。
1.1.3 2410与DM9000的硬件连接
DM9000的模块示意图
接口电路图:
1.2 网卡驱动实验步骤
1.2.1 步骤一:编写简单的网络设备驱动程序
以下是一个网络驱动程序完整源码,这仅仅只是一个可编译,加载和卸载的驱动程序,不能完成任何实际的工作。不过,可把它当作模板,网络设备的驱动程序就从这个模板上添加而成。并且,针对每一个驱动程序的接口,都做了介绍和编程指导。
程序清单 1‑0‑1 简单的网络程序模板 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-
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
- Linux下DM9000网卡驱动实验〈一〉
- Linux下DM9000网卡驱动实验〈二〉
- Linux下DM9000网卡驱动实验〈三〉
- Linux下DM9000网卡驱动实验
- Linux下DM9000网卡驱动实验
- Linux下DM9000网卡驱动实验
- ARM-Linux驱动--DM9000网卡驱动分析(一)
- ARM-Linux驱动--DM9000网卡驱动分析(一) .
- ARM-Linux驱动--DM9000网卡驱动分析(一)
- ARM-Linux驱动--DM9000网卡驱动分析(一)
- ARM-Linux驱动--DM9000网卡驱动分析
- mini2440 dm9000 网卡驱动详解 (一)
- dm9000网卡驱动分析(一)
- Linux2.6.34下DM9000网卡驱动移植
- Linux2.6 下DM9000网卡驱动
- dm9000网卡的linux驱动分析
- linux内核-dm9000网卡驱动添加
- DM9000网卡驱动
- HTML基础
- java里的时间操作以及比较
- GPU 显卡的CPU
- 元数据,反射
- 服务器选择SATA还是SCSI
- Linux下DM9000网卡驱动实验〈一〉
- Linux下DM9000网卡驱动实验〈二〉
- Linux下DM9000网卡驱动实验〈三〉
- 用java写的第一个比较大的程序
- Datagrid根据选择的checkbox编辑和更新多行记录
- linux下getch
- TOMCAT5中文问题解决之道
- 铭记一句话(一)
- A*寻路算法