[word格式] 基于嵌入式Linux2418的CS8900A网卡驱动的实现
基于嵌入式Linux2.4.18的CS8900A网卡驱
动的实现
一
58一《国外电子元器~)2007年第12期2007年12月
?主
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
论文
基于嵌入式Linux2.4.18的CS8900A
网卡驱动的实现
李会艳.胡荣强
(武汉理工大学自动化学院,湖北武汉430070)
摘要:介绍了基于嵌入式Linux2.4.18的CS8900A网卡驱动的实现方法.通过将以太网器件
CS8900A连接到嵌入式微处理器$3C2410X的总线上扩展网络接口.根据电路原理图,设置寄存器
BWSCON和BANKCON3使网卡工作在存储器模式,编写中断函数及相关的驱动代码.通过内核配
置将网卡驱动程序以静态的方式编译进内核Linux2.4.18中,生成映像文件并移植到开发板上,网卡
CS890oA便驱动成功.
关键词:CS8900A;驱动;$3C2410X;虚拟地址;内核
中图分类号:TP316文献标识码:A文章编
号:1006—6977(2007)12—0058—04
RealizationofC$8900AdrivebasedonembeddedLinux2.4.18
LIHui-yan,HURong—qiang
(SchoolofAutomation,WuhanUniversityofTechnology,Wuhan430070,China)
Abstract:RealizationofCS8900AnetcagddrivebasedonembeddedLinux2.4.18iSintroduced.Con—
nectingtheinternetchipCS8900Atothebusoftheembeddedmicrocomputer$3C2410XiStoexpand
networkinterface.Accordingtoelectriccircuitprinciplediagram,netcagdCanbeenabletoworkin
memorymodebysettingregistersBWSCONandBANKCON3.interruptionfunctionandrelateddrive
codeareprogrammed.rhenetcagddriveprogrammiscompiledtothekernelbythewayofstaticstate.
nlekernelwasmadeto-getanimagefilewhichcanbetransplantedtothedevelopmentboard.Netcard
CS8900ACanbedrived8uccessfullvatlast.
Keywords:CS8900A:driver;S3C2410X;virtualaddress;kernel
1引言
近年来,Internet获得了突飞猛进的发展,而嵌
入式系统接入Internet后将使得远程监测,远程维
护变得非常容易.因此嵌入式系统的网络也非常重
要.嵌入式系统实现Internet接入的前提条件是系
统的软件中有TCP/IP协议支持,Linux内核提供了
包括对TCP/IP在内的多种协议的支持,从而使得网
络设备的驱动更加方便.
2网卡驱动的硬件实现
在嵌入式系统中增加以太网接口通常由两种
方法实现.第一种方法是采用带有以太网接口的嵌
入式处理器.这种方法要求嵌入式处理器有通用的
网络接口,通常这种处理器是面向网络应用而
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
的.通过内部总线实现处理器和网络数据交换;第
二种方法是采用嵌入式微处理器连接网卡的结构.
这种方法对嵌入式处理器没有特殊要求,只要把以
太网器件挂接到嵌入式处理器的总线上即可.后者
通用性强,不受处理器限制,但是,处理器和网络的
数据交换是由外部总线实现的.
本系统设计参考了SBC2410X开发板,采用
$3C2410X微处理器,由于该处理器没有通用的网络
接口,因此采用第二种方法增加以太网接口.以太网
基于嵌入式Linux2.4.18的CS8900A网卡驱动的实现一59一
控制器采用适用于嵌入式设备并且成本低的
CS8900A器件.该器件使用灵活,其物理层接口,数
据传输模式和工作模式等均可根据需要动态调整.
通过设置内部寄存器来适应不同环境.CS8900A有
两种工作模式:存储器模式和I/O模式.其中在存储
器模式下编程操作较为简单,对任何寄存器都可直
接操作,但需要多条地址总线和网卡相连.而I/O模
式较复杂,在此模式下对任何寄存器的操作均要通
过I/O端口0的写入或读出,而硬件实现比较方便,
而且I/O模式也是器件的默认模式.本系统采用
CS8900A的存储器工作模式.以太网控制器与
S3C2410X处理器硬件连接图如图l所示.
3网卡驱动的软件设计
在Linux2.4.18中.整个网络接口驱动程序的框
架分为4层,从上到下分别为协议接口层,网络设备
接口层,提供实际功能的设备驱动功能层以及网络
设备和网络媒介层.这个框架在内核网络设备模块
中已经搭建好了,在移植网络设备驱动程序到Linux
内核时,就是根据上层网络设备接口层的定义和底
层具体的硬件特性,进行相应的代码修改及添加,从
而完成网卡的驱动.
首先下载Linux2.4.18.tar.gz内核和基于ARM
的内核补丁文件.在内核中打好相应补丁后,即可
得到内核Linux2.4.18-rink7一swl8.然后根据开发板
n0E
ADDR24/GPA9
nWE
nGCS3/GPA14
EINTI8/GPG10
DATA1
DATA15
ADDR0/GPA0
ADDRI9/GPA4
nWAIT
nWBE1:nBE1:DQM1
$3C241OX
VDD3.3V
IVDD3.3V
4
AN
TD-
RD+
RD-
CHSGND
CHSGND
IOR61
lOW62
MEMR29
丛型28
LDATA065
VDD3~3V;;
r_1口IRQ_LAN32
磐
f参考板SBC一2410X)的硬件设计进行相应的内核代
码修改,这样内核就能在开发板上工作.但是此时网
卡并不工作.由于采用CS8900A,需要添加相应地驱
动程序.下载针对Linux2.4内核的网卡驱动程序
cs8900a.C,将该程序放在Linux内核的drivers/net目
录下.并修改Config.in配置文件,即就是运行make
menuconfig命令时出现的菜单.为了支持网卡
CS8900A.添加代码如下:
dep._
tristate’CS8900Asuppo~’CONFIG_
CS8900A$CON?
FIG_
ISA
然后配置内核,内核支持4种不同的配置方法,
在字符终端下使用makemenuconfig打开配置界面,
将CS8900A_support选择Y,保存退出后autoconf.h
文件中就自动生成了一个宏定义:#defineCONFIG_
CS8900A.该目录下的Makefile文件用于组织内核
的各模块,记录各模块间的相互联系和依赖关系.根
据内核的配置需要将CS8900A的驱动程序以静态
方式编译进内核,因此需添加代码如下:
obj-$(CONFIG_CS8900A)+=cs8900a.o
在驱动程序开发的过程中,由于驱动程序操作
的都是设备的虚拟地址,要使驱动程序对虚拟地址
的操作反映到正确的设备上,需通过内存管理单元
MMU将设备的虚拟地址映射到正确的物理地址,从
而保证驱动程序对设备的虚拟地址的操作,也就是
对其相应的物理地址的操作.内存管理单元把内存
L
LADD
L
图1CS89o0A与处理器$3C2410X的硬件连接图
O1234S123T1234HO121234^_腿叻叻叻叻叻叻叻l盆一腿哪啪啪哪哪吣一腿DDDDD—A?l鲁?一珀瓦0可丽一{3丽眦唧0N丽0腿豫丽而一丽I蚕;删丽;l薹l至胁一
.
一60一《国外电子元器件》2007#-g12期2007年12月
以页为单位进行处理.操作系统为每个正在运行的
程序建立并维护一张进程内存映射表.当程序存取
一
块内存时,它就会把相应的虚拟地址传送给MMU.
而MMU会在内存映射表中查找该内存的实际位置
即其物理地址.由$3C2410X处理器与CS8900A网
卡的接线AEN-?nGCS3,nCHIPSEL—斗nGCS3可知.
网卡采用的是$3C2410X的nGCS3片选信号.该信
号对应的地址空间的起始地址是0x18000000.
LADDR24为高电平时网卡处于处理器工作模式,因
此网卡实际的物理地址为0x18000000+0x0100
0000即0】【l9000000,经过映射后,其虚拟地址为
0xf0000000.其虚拟地址不固定,只要与其他设备不
冲突即可.因此修改include/asm/arch/目录下的
s3c2410.h文件如下:
#defineIRQ_CS8900IRQ_EINT18
#defineVA_
CS8900A_BASE(VAIOBASE2+0x1800
oooo)
#definePA_
CS8900A_BASE(0x19000000)
修改驱动程序cs8900a.C的网卡虚拟地址是将
vCS8900A_
BASE+0x300改为VS8900A_BASE+
0x300.
在cs89x0_probel0函数中,对寄存器BWSCON
和BANKCON3的设置和原理图有关.在微处理器
S3C2410X中BWSCON寄存器控制系统地址空间内
的总线数据宽度以及是否等待.由于网卡采用的是
$3C2410X的r~CS3片选信号,该信号对应的是
BANK3地址空间.由硬件连接图可知,BANK3空间
采用处理器的总线使能信号即nBE,并对BANK3
使用等待状态,采用l6位的总线数据宽度,即
BWSCON寄存器的ST3[15]WS3[14]DW3[13:12]位应
为l101.因此对BWSCON寄存器的设置为:
rBwSCON=(rBWSCON&一(BWSCON_ST3IBWSCON_
WS3IBWSCON_DW3))I(BWSCON_ST3IBWSCON_WS3I
BWSCON_
DW(3,BWSCON_DW_16));
BANKCON3寄存器控制位于BANK3空间的总
线地址信号生效的时钟周期,片选信号的保持时
间,访问周期等.根据硬件连接图和开发要求,在
nGCS3信号生效前,总线的地址信号无需时间,即
Tacs[14:13]为00;输出使能前片选信号的建立时间
为4个时钟周期,即Tcos[12:ll】为11;总线的访问周
期为l4个时钟周期,即Tacc[1O:8]为lll;输出使能
后片选信号的保持时间为1个时钟周期,即Tcoh[7:
6】为01;选择BANK3空间后地址信号的保持时间
为4个时钟周期,即Tcah[5:4]为11;在Page模式下
访问周期为6个时钟周期,即Tacp[3:2])~11;页模
式的配置为PMC[1:0].因此对BANKCON3寄存器
的设置为:
rBANKCON3=BANKCON_TacsOIBANKCON_
Tcos4I
BANKCON_
Tacc14I
BANKCON_
Tcoh1IBANKCON_
Tcah4IBANKCON_
Tacp6I
BANKCON_
PMC1;
由于其中一些变量无定义,因此需添加头文件.
进入include/asm/arch目录创建新文件bitfield.h.并
添加代码如下:
#ifndefBITFIELD_
H
#defineBITFIEU)_H
#ifndef—ASSEMB,一
#defineUData(Data)((unsignedlong)(Data))
#else
#defineUData(Data)(Data)
#endif
#defineFld(Size,Shft)(((Size)<<16)+(Shft))
#defineFSize(Field)((Field)>>16),
#defineFShft(Field1((Field)&Ox00OOFFFF)
#defineFMsk(Field)(((UData(1)<<FSize(Field))一1)<<
FShft(Field))
#defineFAlnMsk(Field)((UData(1)<<FSize(Field))一1)
#defineFlstBit(Field)(UData(1)<<FS(Field))
#defineFClrBit(Data,Bit)(Data=(Data&一(Bit)))
#defineFClrFld(Data,Field)(Data=(Data&~FMsk
(Field)))
#defineFlnsrt(Value.Field)(UData(Value)<<FShft
(Field))
#defineFExtr(Data,Field)((UData(Da>>FS(Field))
&FAlnMsk(Field))
#endif
该目录下s3c2410ASM.h文件中添加代码如下:
#include”bitfield.h”
#definefBWSCON_ST(Nb)Fld(1,((Nb)4)+3)
#definefBWSCON_
WS(Nb)Fld(1,((Nb)4)+2)
#definefBWSCON_DW(Nb)Fld(2,(Nb4)
#definefBWSCON_
DWOFld(2,1)
#defineBWSCON_ST3FMsk(fBWSCON_ST(3))
#defineBWSCON_WS3FMsk(fBWSCON—wS(3))
基于嵌入式Linux2.4.18的CS8900A网卡驱动的实现=鱼=
#defineBWSCON—
DW3FMsk(fBWSCON—DW(3))
#defineBWSCON_
DW一
160xl
#defineBWSCON—
DW(x,y)FInsrt((y),fBWSCON_DW(x))
#defineBANKCON_Tacs0FInsrt(0x0,Fld(2,13))
#defineBANKCONTeos4Flnsrt(0x3,rid(2,11))
#defineBANKCON_Taeel4FInsrt(0x7,Fld(3,8))
#defineBANKCON_Teoh1Flnsrt(0xl,Fld(2,6))
#defineBANKCON_Tcah4FInsrt(0x3,Fld(2,4))
#defineBANKCON_Taep6Flnsrt(0x3,Fld(2,2))
#defineBANKCON_PMC1FInsrt(0x0,Fld(2,0))
由网卡与处理器的连接图可知,当CS8900A的
SBHE由低电平变为高电平,即上升沿触发中断.在
驱动程序cs8900a.e中调用函数set_external_irq(int
IRQ_C$8900A,intExT__RIsINGEDGE,intGPI—
O_
PULLUP_
DIS)产生外部中断EINT18.此函数的定
义和声明及其用到的变量需在内核中添加.修改
hardware.h文件,添加代码为:
#defineEXT_
RISING_
EDGE4
修改irq.h文件,添加代码为:
externintset_
extemal_irq(intirq,intedge,intpullup);
修改s3c2410ASM.h文件,添加代码如下:
#defineGPIO_PUULUP_SHIVr16
#defineGPIO_
PULLUP_
MASK0x0Off0000
#defineGPIO—
PULLUP_DIS(1<<GPIO_PULLUP_SHIFT)
#defineGRAB_PULLUP(x)(((x)&GPIO_PULLUP_MASK)
>>GPIO_
PULLUP_
SHIFT)
修改include/asm/目录下的irq.h文件,添加头
文件如下:
#include<asm/arch/irq.h>
修改arch/arm/mach—s3c2410/目录下的irq.e文
件,添加set_extemal_irq0的定义如下:
Intset_
extemal_
irq(intirq,intedge,intpullup)
{
unsignedlongflags;
intrealirq,reg_
ofs,shift,shift_
value;
if”(irq<IRQ_EINT0)&&(irq>IRQ_EINT23))II
((irq>IRQEINT3)&&(irq<IRQ—EINT4)))
return-EINVAL;
real_
irq=fixup_
irq_
num(irq);
set_gpios(real_irq,pullup);
loeal_
irq_save(flags);
reg_ofs=(real_irq/8);
shift=4(real_irq一8reg_ofs);
if(irq<IRQ_EINT4){
shift_
value=(irq%8)EXTINT_OFFSET;
rEXTINT0&=一(EXTINTMASK<<shfit._value);
rEXTINT0I_fedge<<shfit_
value);
ClearPending(irq);
}else{
if(irq<IRQ_EINT8){
rEXTINT0&=一(EXTINT_MASK<<shif1);
rEXTINT0redge<<shift);
rEINIPND=f1<<shift);
ClearPending(IRQ_EINT4_7);
}elseif(irq<IRQ_EINT16){
rEXTINT1&=一(EXTINT_MASK<<shift);
rEXTINT1I:(edge<<shfit);
rEINIPND=f1<<shift);
ClearPending(IRQ_EINT8_23);
}else{
rEXTINT2&=一(EXTINTMASK<<shift);
rEXTINT2l:(edge<<shfit);
rEINTPND=f1<<shfit);
ClearPending(IRQ..EINT8_23);
l
irq_dese[irq].valid=l:
restore_flags(flags);
return0:
}
EXPORTSYMBOL(set._extemal_irq);
修改当前目录下的Makefile文件,将irq.o文件
添加到”export—objs:”的文件列表中即可.
4网卡驱动的实现
通过makebzImage编译内核生成zImage文件,
然后通过串口烧写该映象文件到开发板上,完毕后
用交叉网线将宿主机和开发板相连,通过minicom
终端显示正确,表明网卡驱动成功.
5结束语
添加网卡驱动到Linux2.4.18内核具有很重要
的价值,网卡正常运行后可以通过网卡下载根文件
系统等.速度快,可靠性高.随着网络向嵌入式系统
一
62一《国外电子元器~)2007-#-g12期2007年12月
?主题论文
基于RTL8150L的USB转以太网的设计
江敏.张毅
(重庆邮电学院,通信学院,重庆400065)
摘要:RTL8150L是Realtek公司的一款USB转快速以太网控制器,与USB1.1
规范
编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载
相兼容.给出了
基于OMAP1621的宽带终端RTL8150L的USB转以太网功能的软硬件设计,并给出了调试结果.
关键词:USB主机;USB转以太网;RTL8150L;OHCI
中图分类号:I’P393.03文献标识码:A文章编
号:1006—6977(2007)12—0062—03
DesignofUSBtoEthernetbasedonRTL8150L
JIANGMin,ZHANGYi
(CommunicationSchool,ChongqingUnwe~iqofpostsandtelectrmunications,ChongOing400065,China)
Abstract:RTL8150LisacontrollingchipdevelopedbyREALTEK,whichcanrapidlyswitchfromUSB
toEthernet.andiscompatiblewithUSB1.1specifications.Thispapershowstheimplementationproce—
durebasedonanOMAP1621broadbandterminal,aswell88thedebuggingresult.
Keywords:USBhost;USBtoEthernet;RTL8150L;OHCI
1引言
USB(通用串行总线)是一种计算机外围串行通
信接口标准,与常用的计算机接口相比,它具有热
插拔,即插即用,数据传输可靠,扩展方便,成本低
等优点.基于这些优点,USB已成为当前计算机必
备接口之一,广泛地应用于嵌入式产品中,例如:数
码相机,手机,宽带数据终端等.
2RTL8150L简介
R1’L815OL是Realteak公司的USB转快速以太
网控制器,与USB1.1规范相兼容,它由SIE(串行接
口引擎),MMU(内存管理单元),MAC控制器,
SRAM,E~ROM接口,10/100Mb/s物理层接口等单
元模块组成.RTL8150支持4个端点,其中:端点O
用来接收USB主机端发送的控制命令,完成设备的
控制和状态反馈,对通过端点O可实现RTL8150L
寄存器的读写;端点1(BulkIN端点)用来接收以太
网数据包,支持最大包为64字节.如果某个以太网
包大于64字节.R1’L815O将该包分成几个64字节
包.主机通过比较某个USB包是否小于64字节或
包的大小为O判断一个以太网包是否传输完成;端
发展.远程监控更加容易,如智能家具的远程监控,
给人们的生产生活带来了极大方便.
参考文献:
【1】于明,范书瑞,曾祥烨.ARM9嵌入式系统设计与
开发教程『M1.北京:电子工业出版社,2006.
【2】孙琼.嵌入式Linux应用程序开发详解[M】.北京:
人民邮电出版社.2006.
【3】孙天泽,袁文菊.嵌入式设计及Linux驱动开发指
南『M】.北京:电子工业出版社,2007.
[41孙纪坤.张小全.嵌入式Linux系统开发技术详
解一基于ARM[MI.北京:人民邮电出版社,2006.
[5】王海燕,李芙蓉.基于MC9328MX1的Socket通信
设计与实现【J】.国外电子元器件,2006(11):25-29.
作者简介:李会g(1983一),女,河北衡水人,硕士研
究生.研究方向为嵌入式系统与信息处理.
收稿日期:2007—08—02
咨询编号:071218