基于DM9000的嵌入式系统的网络接口设计与实现
DesignandRealizationofEmbeddedSystemNetworkInterfaceBasedonDM9000
韩超(合肥电子工程学院,安徽合肥230037)
王可人(总参合肥创新工作站,安徽合肥230037)
摘要
基于DM9000以太网控制器芯片对SMDK2440开发板硬件平台的网络接口进行了设计,在硬件平台上移植了嵌入式Linux操作系统,并在Linux平台上开发网络驱动程序实现了网络的接入。测试结果表明网口运行正常,达到了功能要求。
关键词:DM9000,网络驱动程序,Linux,嵌入式系统
Abstract
ThenetworkinterfacefortheSMDK2440developmentboardisdesignedbasedonDM9000Ethernetcontrollerchipinthispaper.WetransplantLinuxembeddedoperationsystemtothehardwareplatform,developnetworkdiversandrealizetheaccessofnetwork.Theresultofourtestindicatesthatthenetworkinterfacerunswellandsatisfiesthefunctionrequirement.
Keywords:DM9000,networkdivers,Linux,Embeddedsystem由于Internet具有广泛的网络分布及相对低廉的接入成本,因此具有网络接入功能的嵌入式系统设备将能提供更方便、更经济的系统访问与服务,嵌入式设备与Internet的结合将是嵌入式系统的发展方向。原则上讲,嵌入式设备只要转变为
Web服务器,再加上TCP/IP网络协议就可以实现Internet上网,Internet上面的各种通信协议对于计算机存储器、运算速度等的要求比较高,对于嵌入式系统中的8位和16位MCU,由于
自身处理能力不足,且存储空间有限,往往通过移植简化的
[0..15]与DM9000的数据线SD[0..15]连接,用来实现DM9000与S3C2440之间的数据传输;同时,DM9000占用S3C2440的中断引脚EINT2,使得S3C2440能够响应DM9000的中断;将S3C2440的引脚OM0置为高电平,OM1设为低电平,使其总线宽度为16bit。
TCP/IP协议栈(如uIP协议)来实现网络接入。而32位以上的
处理器因为处理能力强,硬件资源丰富,往往采用向目标硬件移植操作系统的方式,由操作系统管理系统的硬件资源,并在操作系统的基础上实现网络接入。本文基于DM9000以太网控制器,对基于三星公司32位S3C2440ARM微处理器芯片的
SMDK2440开发板硬件平台的网络接口进行了设计,在硬件平台上移植了嵌入式Linux操作系统,并在Linux平台上开发网
络驱动程序实现网络的接入。
图1
DM9000与S3C2440的连接图
1DM9000以太网控制器芯片简介1.1芯片简介
DM9000是完全综合、成本低的单一快速以太网控制器芯片,具有通用的处理器接口,10/100M自适应,4K双字节静态存取存储器,低功耗、高处理性能,支持3.3V到5V的容差。DM9000提供一个MII(媒体独立接口)接口来连接HomePNA设备或其它支持MII接口的收发器,支持8位、16位、32位的接口来适应不同处理器对内部存储器的访问。它完全支持IEEE802.3u规格,支持IEEE802.3x全双工的流控制。它的设计比
较简单,容易完成不同系统的软件驱动开发。
2DM9000网络驱动程序的设计与实现2.1Linux操作系统内核移植
在Linux操作系统移植前,首先要建立交叉编译环境,交叉编译环境的建立是在一台安装了RedHatLinux9.0操作系统的计算机和SMDK2440开发板平台上进行的,分别称为宿主机
和目标板,将它们用交叉对接网线连接,然后在宿主机上开发和编译基于arm的工具链(toolchain)。toolchain包括gcc编译器、glibc库、gdb调试工具和binutils工具包以及其它辅助工具。交叉编译环境建立完成后,根据开发板的硬件配置,修改
1.2网络接口的硬件连接
本文网络接口的设计是基于三星公司SMDK2440开发板,
Linux内核源代码,编译生成满足需要的Linux内核映像。然后向目标板加载Bootloader。Bootloader是开发平台加电后运行
的第一段代码,是操作系统和硬件的枢纽,它负责初始化硬件,引导操作系统内核,检测各种参数给操作系统内核使用。在开发板上烧写好Bootloader后,同时又在宿主机上配置和编译好了
S3C2440处理器与DM9000芯片的连接如图1所示。S3C2440
处理器利用片选nGCS2和地址线MA2分别连接DM9000芯片的AEN引脚和CMD引脚,并且将DM9000的SA9和SA8引脚设置高电平,SA7引脚设置低电平,用来片选DM9000;S3C2440的nOE引脚连接DM9000的读引脚IOR#,nWE引脚连接DM9000的写引脚IOW#,并将S3C2440的数据线MD
Linux内核之后,就可以利用Bootloader将内核映像移植到开
发板上。
2.2DM9000网络驱动程序的设计与实现
DM9000网络驱动程序是基于中断工作模式下实现的网络18
驱动程序,主要实现数据包发送和接收功能,其设计框图如图2所示。数据包的发送是在网络设备驱动程序加载时,通过驱动程序和网络设备接口之间的有专门定义的数据结构net_device结构中的初始化函数指针调用网络设备的初始化函数,对设备进行初始化;如果操作成功就可以通过net_device结构中的
基于DM9000的嵌入式系统的网络接口设计与实现
switch(mode)H
caseDM9000_10MHD:caseDM9000_100MHD:caseDM9000_10MFD:caseDM9000_100MFD:caseDM9000_1M_HPNA:
media_mode=modeI...
S
nfloor=(nfloor>15)W0:nfloorI
ptr=strdup(eth0_mac_string)I/J设置DM9000的MAC地址J/
...
kfree(ptr)I
returndmfe_probe(0)I/J调用dmfe_probe()函数,探测DM9000并注册模块J/...S
open函数指针调用网络设备的打开函数打开设备,再通过net_device结构中的建立硬件包头函数指针hard_header来建立硬件包头信息;最后,通过协议接口层函数dev_queue_xmit来调用net_device结构中的数据包发送函数dmfe_start_xmit
的函数指针,完成数据包的发送。该函数将把存放在套接字缓冲区sk_buff中的数据发送到物理设备。数据包的接收是通过中断机制来完成的。当有数据到达时,就产生中断信号,网络设备驱动功能层就调用中断处理程序,即数据包接收程序来处理数据包的接收。然后,网络协议接口层调用netif_rx函数,把接收到的数据包传输到网络协议的上层进行处理。
3DM9000网络驱动程序的测试
在交叉编译环境下,测试驱动程序。首先,在宿主机
图2DM9000网络驱动程序的功能设计
实现Linux网络驱动程序中,数据包的发送容易理解和实现,每当内核要传输一个数据包时,都会先把数据包放入
sk_buff结构(可以认为sk_buff就是要处理的数据包),然后调用dmfe_start_xmit函数将数据包放入传输队列。它的执行流程
是:首先,对相关的变量进行初始化,然后,判断待传输的数据包数量是否大于1,如果大于1,说明已经有数据包正在传输,为了避免网络拥塞,函数返回,不执行操作,返回值为1;如果小于等于1,说明目前DM9000还可以传输数据包,那么停止传输队列,关掉所有中断,使DM9000接口不能响应外界事件(主要是为了能够使传输函数正确进行不被干扰),将要传输的数据包放入DM9000接口的TXRAM内存中,判断I/O传输模式,可以分别以字节、字、双字模式进行数据的传输;之后,修改统计变量中的相关字段,释放套接字缓冲区;最后,唤醒所有的中断,使
[root@lsySOHOBroadbandRouter]#提示符下,输入命令
mkdirDM9000-driver,建立DM9000-driver子目录。然后依次建立子目录app和driver。分别在app目录下编写源文件setmac.c、readmac.c和它们的makefile文件,在driver目录下编写源文件dm9000x.c和它的makefile文件。其中dm9000x.c就是DM9000的网络驱动程序,setmac.c是用来设置DM9000MAC地址的应用程序,readmac.c是用来读取DM9000MAC地址的应用程序。在宿主机上,分别将app目录下的makefile文件和driver目录下的makefile文件中的编译器和链接器变量设置成arm的编译器和链接器。
然后使用make命令编译app目录下的源文件,产生set-mac.o、readmac.o模块和可执行程序setmac、readmac;使用make命令编译driver目录下的源文件,产生dm9000x.o驱动
程序模块。
在宿主机的[root@lsyroot]#提示符下输入命令minicom,启动仿真终端,将宿主机的根目录挂载到目标板的/mnt目录下,然后在目标板的仿真终端上运行在宿主机上交叉编译好的可执行程序setmac,readmac和加载驱动模块dm9000x.o。
加载驱动模块dm9000x.o,可以在窗口中看到相应的调试信息的显示。然后运行readmac测试程序,观察DM9000的
DM9000能够响应外界中断,返回值为0。
数据包的接收是在中断处理程序中完成的,虽然可以编写一个轮询的驱动程序,但是无论从吞吐率还是从计算需求上讲,中断驱动程序的性能更好。因此,在DM9000网络驱动程序的实现上,采用的是中断模式的处理方式。
MAC地址,这时可以在命令窗口看到MAC地址是11:22:33:44:55:66。启动setmac测试程序,输入命令./setmacaabbccddeeff,观察调试信息,给出提示消息ThenewMAC
再次调用readmac测试程序,address:AA:BB:CC:DD:EE:FF。
观察这时DM9000的MAC地址,可以看到MAC地址变为AA:BB:CC:DD:EE:FF了。由测试结果可以看到,DM9000网络驱动
程序能够正常运行。
参考文献
[1]DM9000-DS-F03DataSheet.
DM9000驱动程序模块设计完毕后,接着要解决DM9000网络驱动程序如何在Linux内核下运行的问题,这里使用“模块”的方法。在DM9000网络驱动程序中,模块的加载由函数intinit_module(void)实现,当使用者调用insmod命令加载模块时,系统调用init_module()对模块进行初始化和注册,部分代码如下:
intinit_module(void)H
intcntIcharJptrI
/J设置DM9000芯片的工作模式J/
DavicomSemiconductorInc.,
2004,7[2]SMDK2440
EvaluationBoardSchematicDiagram,Samsung
Electronics.,2003
[3]郭秋平.基于ARM系统的Linux平台移植研究[D].杭州:浙江大学,
2006
[4]孙天泽,袁文菊,张海峰.嵌入式设计及Linux驱动开发指南:基于
ARM9处理器[M].北京:电子工业出版社,2005
[收稿日期:2006.10.13]
因篇幅问题不能全部显示,请点此查看更多更全内容