接口技术-基于MPC860 PCMCIA的双以太网接口驱动设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于MPC860 PCMCIA的双以太网接口驱动设计
(华中科技大学)郝东,杜旭
摘要:MPC860芯片因其强大的通信处理能力和多种协议的支持而被广泛应用于通信领域。
但其内部模块仅支持一个10/100M自适应以太网口,限制了应用。
本文提出了一种基于其PCMCIA接口扩展的双100M以太网接口的方案,分析了相关驱动程序设计的关键问题。
关键词:嵌入式系统,MPC860,PCMCIA, Linux设备驱动
中图分类号:TP302.1 文献标识码: A 国家十五科技攻关计划:2001BA205A08-09
The Driver Design Of Dual Ethernet Ports Based On
MPC860 PCMCIA Interface
HAO Dong,DU Xu
Abstract: Due to the strong ability of communication processing and support to many protocols, MPC860 is widely used in communication area. But it can only provide one 10/100M
adaptable Ethernet interface directly by its internal modules, which limits its application.
This paper gives out a solution based on the PCMCIA interface of MPC860 and analyzes key problems of the related driver design.
Key words:Embedded System,MPC860,PCMCIA,Linux Device Driver
1.引言
MPC860是互联网络和数据通信及控制领域使用较多、性能相当优越的嵌入式微处理器,其内部集成的CPM (Communication Processor Module) 能完成UART、HDLC、Ethernet 等多种协议的通信控制和处理。
然而当应用系统需要两个以上的10M/100M自适应以太网口时, 仅靠片内的通信控制模块便不能满足需求,这是因为:MPC860内部仅有FEC(Fast Ethernet Controller)能实现一个10/100M自适应以太网口,而SCC(Serial Communication Controller)仅支持10M以太网。
为了达到应用要求,可以通过MPC860的双PCMCIA接口扩展出两个10/100M自适应以太网口。
本文基于这种双PCMCIA扩展以太网口的硬件结构分析了相关驱动程序设计中的关键问题。
2.电路分析和设计
应用中我们选用了ASIX公司的AX88790芯片。
AX88790芯片内部集成了10/100M MAC (Media Access Control) 控制器、PHY(Physical Layer Device)和收发器,符合IEEE802.3 / IEEE802.3u标准,提供兼容PCMCIA 2.1+规范的PCMCIA接口,完全满足我们的应用需求。
注:x为A/B对应第A/B路PCMCIA接口;DIR为缓冲方向控制信号,/OE1,/
OE2分别为高字节,低字节输出使能信号,G1,G2,OC,G为使能或片选输入信号
图 1 扩展以太网口的硬件结构
在MPC860的PCMCIA读写控制信号中, /IORD、/IOWR、/OE、/WE和/REG信号由两个PCMCIA接口所共用,而/CE1,/CE2信号为每个接口分别一组, PCMCIA数据信号
和地址信号则均由CPU数据线和地址线提供。
另外,MPC860又为每个接口独立读写添加了两个使能信号:地址锁存使能信号/ALE和缓冲输出使能信号/POE。
当CPU读写的物理地址落在映射到某个PCMCIA接口的地址区间时,所属PCMCIA接口(A/B)便输出该物理地址到CPU地址线,控制公用的 /IORD、/IOWR、/OE、/WE和/REG信号,并通过仅有效对应接口的/POE(A/B),/ALE(A/B),/CE1(A/B),/CE2(A/B)将两个接口隔离,从而完成两个接口的独立访问。
据此我们设计出如图 1的电路结构。
适配器的PCMCIA状态输入信号/CD1, /CD2,/VS1,/VS2是每接口各一组,用于对应接口的PC卡的检测和识别。
由于我们的应用目的是通过PCMCIA接口扩展两个10/100M以太网口,并非设计PCMCIA插槽,故将/CD1, /CD2信号长期置于有效状态。
另外为了表示AX88790的电源键值为3.3V,我们有效/VS1,而/VS2不连接(No Connection)。
其它状态输入信号则上拉至3.3V置于无效状态(见图 1)。
3. 驱动程序设计
为了安全、高效的管理和使用PCMCIA设备,PCMCIA规范定义了如图 2所示的系统软件结构,其中SS(Socket Services)提供对PCMCIA适配器的底层配置服务,CS(Card Services)负责向客户驱动提供与适配器无关的服务,将从SS收到的事件通知客户驱动,而具体客户驱动则通过CS服务完成具体PCMCIA设备功能的驱动。
我们应用中所采用的Linux-2.4.5为了支持PCMCIA设备,根据PCMCIA规范实现了CS层,并提供了相关接口。
基于上述软件环境,我们将实现MPC860 PCMCIA 主机适配器的SS驱动层和利用配置芯片并控制其以太网功能的AX88790客户驱动程序。
图 2 PCMCIA软件系统结构
3.1 MPC860 PCMCIA适配器SS驱动程序设计
主机适配器驱动程序是AX88790客户驱动程序访问AX88790芯片的基础,它向CS层提供标准的SS。
Linux为SS定义了函数接口原型并组织在结构pccard_operations中。
对我们的主机适配器驱动程序,该数据结构有如下实现:
static struct pccard_operations m8xx_services= {
:m8xx_inquire_socket, get_status:m8xx_get_status, inquire_socket
set_socket:m8xx_set_socket,
set_io_map:m8xx_set_io_map,
};
set_mem_map:m8xx_set_mem_map,
根据SS标准,设计中需要解决的问题主要包括以下四个方面:
(1)CPU总线地址窗口和PCMCIA地址窗口的映射
PCMCIA芯片地址空间分Memory和I/O两种。
PCMCIA芯片对Memory空间不设置基址寄存器而直接译码,故PCMCIA芯片的Memory地址输入和片内目标地址相同。
又由于主机适配器对落在某个PCMCIA映射窗口的总线地址会直接驱动到地址线上,所以PCMCIA Memory空间地址,对应的总线地址都应和片内目标地址相同,而不允许动态分配。
故总线地址窗口和PCMCIA Memory地址窗口的映射关系是静态的,每个Memory窗口大小应按最大地址线根数26配置为64M(2的26次幂),其起始地址应与64M对齐。
我们在4G的总线地址区间中分配0x70000000到0x80000000 256M的连续区间分作四个64M 窗口,取前2个分配给A接口, 后2个分配给B接口,仅通过m8xx_set_mem_map()向CS提供Memory空间窗口属性和映射开关的控制。
因为PCMCIA芯片I/O基址寄存器的存在,用于映射到I/O空间的系统地址可以由CS 动态分配,只要保证大小在规范限定的64K以内即可。
m8xx_set_io_map()向CS提供I/O
空间映射服务。
(2)PCMCIA接口信号的控制和管理
我们通过设置PGCR寄存器控制PCMCIA接口信号,完成CS对接口的控制命令。
PGCR寄存器的相应位控制RESET信号和/POE信号的电平状态。
例如:
if(state->flags & SS_RESET)
M8XX_PGCRX(_slot_) |= M8XX_PGCRX_CXRESET; //有效_slot_号socket RESET信号else
M8XX_PGCRX(_slot_) &= ~M8XX_PGCRX_CXRESET; //有效_slot_号socket RESET信号是根据命令SS_RESET对RESET的电平设置。
为接口/IREQ信号产生的中断请求分配中断号时,我们考虑到共享中断会引入中断延时而降低驱动性能,因此专门分配7和9使每个接口独占一个中断向量。
相应设置PGCR 的IREQLVL后,主机适配器在接口的/IREQ有效时便向处理器核心提交相应的中断请求。
在m8xx_services结构中,m8xx_set_socket()提供接口信号的控制和管理服务。
(3)接口状态的查询和对状态变化的响应
我们通过读取PIPR寄存器查询状态输入信号,并将状态信息提供给CS。
在主机适配器的PCMCIA状态输入信号中,我们固定了/CD1, /CD2,/VS1,/VS2信号的连接,其状态将不会改变。
AX88790没有实现PRR (Pin Replace Register) ,因而也无需管理/STSCHG信号的变化。
可见基于我们的电路结构不会产生状态信号的改变,更无需处理。
在m8xx_services结构中,m8xx_get_status()提供接口状态的查询服务和对状态变化的响应。
(4)主机适配器接口特性查询
结合上面的讨论,我们对CS的特性查询返回下面的信息结构:
static socket_cap_t capabilitiesX= { //X 代表A或B插槽
features: SS_CAP_PCCARD|SS_CAP_MEM_ALIGN|SS_CAP_STATIC_MAP,//静态存储映射
irq_mask:0xffff, //可支持1至16的中断号,但若pci_irq 非0则仅支持pci_irq map_size: 0x1000, //存储窗口最小映射单位为4K字节
pci_irq: A接口为9,B接口为7 //分配A接口9号中断,B接口7号中断 } 模块加载时,我们通过register_ss_entry()将m8xx_services向CS注册,接着CS通过函数指针调用m8xx_inquire_socket()查询并获得capabilitiesX接口特性信息,从而建立起CS和PCMCIA主机适配器驱动程序间的桥梁,使CS能正确高效的通过SS配置管理主机控制器。
3.2 AX88790客户驱动程序设计
该驱动程序的设计需要解决下面两个问题:
(1)对AX88790的PCMCIA接口的配置
对AX88790的PCMCIA接口的配置是访问AX88790的I/O寄存器从而驱动其以太网功能的前提,因此在初始化函数中需要最先完成。
首先,基于两片AX88790各与一个PCMCIA接口连接的硬件结构,对每个芯片的控制应各作一个客户驱动并与对应的接口驱动绑定。
我们通过CS的BindDevice服务完成。
然后,通过CS的RegisterClient服务注册AX88790客户驱动。
在该服务中,CS先通过m8xx_services.set_socket服务有效绑定接口的RESET信号总清AX88790芯片,接着注册事件响应函数axnet_event (),然后通过m8xx_services. get_status服务查询相应接口状态,根据电路连接,查询到的状态为SS_DETECT,于是CS通过回调函数axnet_event ()向AX88790客户驱动发送PC卡插入事件。
axnet_event ()对该事件的响应处理便是完成对应AX88790所在PCMCIA接口的配置。
通常,客户驱动程序要完成对PC卡的配置应先读取并分析CIS(Card Information Structure)的Tuple项得到它的配置信息,然后根据这些信息为它分配系统资源。
在我们的应用中,AX88790芯片是系统中的一个固定部分,而不是作为PC卡使用,因此对它的配置可以直接根据其芯片手册完成,但应注意避免两片AX88790
在系统资源使用上产生冲突。
设计时,我们分析解决了下面的问题:
a) AX88790有4个PCMCIA功能配置寄存器,处于属性存储区间 0x3C0~0x3CD。
根据主机适配器驱动提供的静态映射特性,该属性存储区间分别被芯片所在的接口映射到系
统地址区间0x700003C0~0x700003CD和0x780003C0~0x780003CD,其读写访问也由对应接口信号控制而不会冲突。
AX88790则仅对低10位地址0x3C0~0x3CD译码,这样就保证了对PCMCIA功能配置寄存器的正确访问。
b) AX88790有一个32字节I/O区间作为MAC的寄存器组,片上地址为0x0~0x1F。
为了避免两路AX88790产生地址冲突,我们需要利用AX88790芯片的PCMCIA I/O基址配置寄存器。
我们指定A路芯片I/O基址为0x300,B路芯片I/O基址为0x380并调用CS的RequestIO服务,得到CPU地址区间:A路0x300~0x31F和B路0x380 ~0x39F。
将0x300 (A路)或0x380 (B路)设置到对应的PCMCIA I/O基址配置寄存器中并建立CPU地址区间到PCMCIA I/O区间的映射,就避免了地址冲突和译码混乱。
c)由于AX88790有中断请求线并需要CPU提供中断服务,所以还要通过CS的RequestIRQ服务申请中断号,CS根据与该AX88790客户绑定接口的特性信息capabilitiesX 如下分配中断号:A接口产生9号中断,B 接口的产生7号中断。
至此就申请到了所有无冲突的系统资源。
最后由CS的RequestConfiguration服务根据申请到的系统资源配置接口硬件:先由m8xx_set_mem_map()建立属性区间映射,激活其以太网功能,再由m8xx_set_io_map()建立I/O区间映射, 最后由m8xx_set_socket()完成中断向量的设置。
自此就可以访问AX88790芯片的MAC寄存器从而驱动其以太网功能了。
(2)对AX88790的10/100M以太网功能的驱动
AX88790的MAC寄存器组与NE2000兼容,我们的分析和设计主要有以下三方面:
a) 初始化。
AX88790内部的SRAM为32K字节并划分为256字节的页,后16K(页号
0x40至0x80)用作数据缓冲区。
我们将0x40开始的12个页用作发送缓冲区,后52个页用作接收缓冲区,并据此初始化接收和发送页号寄存器,启动收发。
b) 以太网数据发送。
驱动程序的性能与数据发送部分的代码息息相关,因此应注意数据发送算法的效率。
驱动AX88790发送一个数据报需进行两步操作:1) 将要发送的数据通过MAC数据端口寄存器顺序写入AX88790 SRAM中的发送缓存区;2) 向MAC命令寄存器写发送命令触发AX88790的硬件发送。
但是当AX88790发送忙时,来自CPU的发送任务必须等待其空闲。
因此当来自CPU的新发送任务出现在AX88790正处于硬件发送忙时,我们先完成费时的第一步,而等到AX88790空闲时仅需执行第二步,这样便提高了效率。
因此发送缓冲区应至少容纳2个具有最大长度(1518字节,6个256字节的页)的以太网报文,实践证明2个是足够的,这就是在AX88790内部的SRAM中用12个页做发送缓冲区的原因。
c)以太网数据接收。
AX88790从物理线路上收完每个报文便产生中断请求,使CPU进入中断服务程序从而完成以太网数据的接收处理。
4. 结束语
本设计已在我们的系统中运用。
当系统满负荷运行时,两个网口在 10M/100M模式下均能正常稳定的工作,网络收发没有丢包,说明硬件设计正确完备,驱动程序性能优良。
参考文献
[1] ASIX Electronics Corporation.AX88790 data sheet[M/CD].2000.
[2] PCMCIA/JEIDA. PC Card Standard Release 8[M/CD]. 2001.
[3] 毛德操,胡希明.Linux内核源代码情景分析 (下)[M]. 杭州:浙江大学出版社,2001.
作者简介:郝东,1979年出生,男,汉族,湖北武汉人,硕士研究生,华中科技大学电信系通信与信息系统专业,主要研究方向:嵌入式系统,高性能网络设计,
E-Mail: hddhhddh@;杜旭,1970年出生,男,汉族,湖北钟祥人,副教授,华中科技大学电信系,主要研究方向:高速宽带IP网络及应用。
通讯地址:(430074 湖北武汉华中科技大学主校区东12舍117室)郝东
Authors’ introduction: Hao Dong, born in 1979, male, Han, graduate student, Dept. of Electronics & Information, Huazhong University Of Science And Technology, major in Communication and Information System, research interests include embedded system and high performance network design, E-mail:hddhhddh@. Du Xu, born in 1970, male, Han, associate professor, Dept. of Electronics & Information, Huazhong University Of Science And Technology, research interests include high speed and broadband IP network.。