ucos WiFi网卡驱动程序的开发

ucos WiFi网卡驱动程序的开发,第1张

ucos WiFi网卡驱动程序的开发

嵌入式系统是设计完成复杂功能的硬件和软件,并使其紧密耦合在一起的计算机系统。目前,嵌入式系统已经存在于各种数据采集、工业控制、娱乐、通信等应用领域。在一些应用场合,需要嵌入式设备具有与其它系统交换信息的能力,因此必须为嵌入式系统增加通信功能。通信功能的实现可以采用很多方式,例如以太网ADSL,GPRS以及其它方式。在一个嵌入式终端中使用WiFi网卡,实现无线网络通信的功能是一种较新的通信方式。由于在uCOS实时 *** 作系统中还没有WiFi的驱动程序,因此下面将介绍WiFi的驱动程序的编写。


1 WiFi介绍

WiFi(Wireless Fidelity),又称802.1lb标准,IEEE于1997年6月批准了该标准。802.11标准的体系结构组成包括:无线站点STA(StaTIon),无线接入点AP(Access Point),独立基本服务组IBSS(Independent Basic Service Set),基本服务组BSS(BasicService Set),分布式系统DS(DistribuTIon System)和扩展服务组ESS(Extended Service Set).

该标准定义了两种工作模式:ad hoc模式和infrastructure模式。ad hoc即对点模式,包含两个无线站点(STA,即带无线网卡的设备)。而infrastructure即AP模式,无线站点(STA)通过AP与现有的骨干网相连接,组成一个基本服务组(BSS)。在BSS中,AP不仅提供STA之间通信的桥接功能,还提供STA与有线局域网的连接,可以实现有线Hub几乎所有的功能。


2 嵌入式终端系统结构


2.1 硬件结构

嵌入式终端硬件系统(如图1所示)以Philips公司的LPC2210嵌入式处理器为核心,LPC2210是基于16/32位ARM7TDMI-S,并支持实时仿真和跟踪的CPU。LPC2210的数据和地址总线是开放的,片内有16K字节的RAM。嵌入式终端需要较大存储空间运行实时 *** 作 *** 作系统、TCP/IP协议、图形用户界面(GUI)、串口驱动程序、WiFi驱动程序、英文及汉字字库等,因此在外部扩展了一片容量为256K×16的静态RAM 1S61LV25616及一片容量为1M×16的Flash 39VF160。为了方便调试程序,使用了LPC2210的串口诊断程序的运行结果。

 ucos WiFi网卡驱动程序的开发,第2张

图1 嵌入式终端的硬件结构

系统中选择了使用Prism 2芯片的网卡,型号为COMPAQ NC5004,支持IEEE802.11b,最高速率为11Mb/s.网卡的物理驱动接口为PCMCIA,供电电压为3.3V.由于LPC2210没有PCMCIA控制器,因此LPC2210与NC5004的PCMCIA 接口是通过LPC2210的通用端口连接的,总线时序通过软件仿真来完成,即PCMCIA接口的驱动程序。


2.2 软件结构

嵌入式终端的软件系统(如图2所示)包括实时 *** 作系统、PCMCIA驱动程序、WiFi网卡驱动程序、TCP/IP协议、串口驱动程序、图形界面等。本系统中的实时 *** 作系统vCOS II是一个公开源代码、结构小巧、具有可剥夺实时内核的实时 *** 作系统。最多可以支持64个任务,分别对应优先级0~63,其中0为最高优先级。vCOS需要移植才能用于不同的处理器平台,移植需要改写的文件:OS_CPU.H,OS_CPU_A.S,OS_CPU_C.C.对于LPC2210嵌入式处理器,厂家的技术支持一般提供了该型号处理器的这三个移植文件,将这三个文件代替原文件即可使用。

 ucos WiFi网卡驱动程序的开发,第3张

图2 嵌入式终端的软件结构

但uCOS II缺少对外围设备和接口的支持,如没有文件系统、网络协议、图形界面。在厂家提供的开发资料中有其自行开发的TCP/IP协议和串口驱动程序。但该TCP/IP协议是与以太网卡驱动程序接口的,因此在该TCP/IP协议中,需要修改与网卡接口的API函数。其余的PCMCIA驱动程序、WiFi网卡驱动程序需要自己进行编写。


3 驱动程序的编写


3.1 PCMCIA驱动程序

PCMCIA 驱动程序包括五个主要函数,分别是initPCMCIAPorts(),pcmcia_WriteMem(),pcmcia_WriteReg(),pcmcia_ReadMem (),pcmcia_Read_Reg()。initPCMCIAPorts()函数用于PCMCIA设备的复位,其作用是通过控制RESET复位线为低电平,延迟一段时间以后,再恢复为高电平。

PCMCIA设备内部空间分为Memory空间和I/O空间,对Memory空间读写分别为pcmcia_ReadMem(),pcmcia_WriteMem(),而I/O空间的读写为pcmcia_ReadReg(),pcmcia_WriteReg().这几个函数区别在于控制线WE,OE,IORD,IOWR的 *** 作不一样。

PCMCIA驱动程序函数按照PCMCIA时序设置LPC2210相应的通用端口。PCMCIA总线的工作时序是这样,首先在地址线上设置数据地址,并将CE1,CE2设为低电平,然后REG设为低电平将地址锁存。接下来进行读或写 *** 作,读 *** 作中,Memory空间和I/O空间的读 *** 作分别将OE,IORD设为低电平,然后等待HWAIT变为高电平。HWAIT变为高电平后,将数据线上的状态读入。写 *** 作中,首先按照待写数据设置数据线上的状态,然后Memory空间的写 *** 作和I/O空间的写 *** 作分别将WE,IOWE设置为低电平。接下来,HWAIT变为高电平后说明数据已经写入。在读写 *** 作完成以后,依次将OE或者IORD(读 *** 作),WE或者IOWR(写 *** 作),CE2,CE1,REG恢复为高电平。


3.2 网卡驱动程序

Prism 2网卡内部 *** 作是封闭的,外部对其 *** 作都是通过存储器 *** 作完成的,Memory空间的存储器有COR(ConfiguraTIon OpTIon Register)寄存器,I/O空间的存储器有BAP(Baffuer Access Path)寄存器,命令/状态寄存器,FID管理寄存器,事件寄存器,控制寄存器,主机软件寄存器,辅助端口寄存器等,这些寄存器的含义及偏移地址见文献[2].LPC2210管理、配置网卡的数据项都是加载一个特定的RID(Resource IDentifiers)到BAP寄存器,读取或者写入一个特定的缓冲区。WiFi网卡驱动程序中的函数功能都是通过访问这些存储器完成的,下面将介绍这些API函数的功能。

wlandrv_ProbeDevice()函数用于检测网卡是否存在,函数首先访问COR寄存器,设置网卡进入I/O模式,设置 *** 作属于Memory空间的读写 *** 作。然后,使用pcmcia_WriteReg()函数写一个值到地址为0x28的寄存器中,再用pcmcia_ReadReg()函数读取这个寄存器的值,与原来的值相比较,如果值相同,则说明网卡是存在的:

wlandrv_ProbeDevice(void){

pcmcia_WriteMem(WI_COR_OFFSET,WI_COR_VALUE);//进入I/O模式

pcmcia_WriteReg(WI_HFA384X_SWSUP_PORT0_OFF,WI_PRISM2STA_MAGIC);

Value=pcmcia_ReadReg(WI_HFA384X_SWSUPPORT0_OFF);

if(Value==WI_PRISM2STA_MAGIC){

已找到网卡,此处做相应处理

}

}

wlandrv_Attach()函数用于读取网卡内部的一些参数,这些 *** 作都是通过向BAP设定相应的RID,读取相应缓冲区完成的:

wlandrv_Attach (void){

wi_read_rid(WI_RID_MAC_NODE,ic.ic_myaddr,&buflen);//读取网卡地址

……类似地读取NIC ID,可用信道,WEP加密支持,网络速率支持

}

wlandrv_Init()函数用于网络参数的初始化设置:

wlandrv_Init(){

wi_write_val(WI_RID_PORTTYPE,WI_PORTTYPE_BSS);//配制为站点

wi_write_ssid(WI_RID_DESIRED_SSID,ic_des_essid,7);//设置SSID

wi_write_txrate();//设置速率

wi_cmd(WI_CMD_ENABLE | WI_PORT0,0,0,0);//启动网卡

}

wlandrv_PutPacket()是被TCP/IP协议调用的函数,即IP协议将发送的数据打成IP包以后,将包传递给该函数。函数的工作首先是计算需要发送的字节总长度,然后在IP包前添加添加逻辑链路控制层的帧头,帧头为4个双字,分别表示访问点地址、控制类型以及帧头类型,最后将IEEE802.3的帧头改成WiFi的帧头。最后,将打好的包送入网卡的发送缓冲区。发送缓冲区的地址是通过设置FID管理寄存器后获得的。

wlandrv_PutPacket(struct pkst *TxdData){

//TxdData为指向发送的IP包的指针

struct wi_frame frmhdr;

LLCS_SNAP_HEADER LLCSSNAPHeader ;

ETHERHDR *pMAC8023Header:

计算发送数据长度len为TxdData指向的数据包添加格式为LLCS_SNAP_HEADER的逻辑链路控制层包头

wi_write_bap(rid,off,TxdData,len);//发送数据包

)

wlandrv_Event()函数主要查询三个事件,即管理消息、接收数据、发送数据。通过查询消息代码,可知网卡是否已经找到AP并关联起来以及何时脱离关联。响应接收数据事件可以接收数据帧,去掉逻辑链路控制层的帧头,然后将IP包传递给IP协议层。对于发送数据事件可以不做响应。这些 *** 作都是先查询FID寄存器后,获取事件数据的缓冲区地址,然后访问该地址的缓冲区获取相应数据 函数如下:

wlandrv_Event(){

EventStatus=pcmcia_ReadReg (WI_EVENT_STAT);//读取事件代码

if(EventStatus&WI_EV_INFO){

wi_info_intr();//处理信息时间

}

else if(EventStatus& WI_EV_RX){

wi_rx_intr():

}

//处理接收事件

else if(EventStatus& WI_EV_TX_EXC){

}


3.3 驱动程序的使用

驱动程序写好以后,是通过TCP/IP程序调用这些API函数的,其调用过程如图3所示。

 ucos WiFi网卡驱动程序的开发,第4张

4 结束语

通过在嵌入式终端中加入WiFi网卡,并编写基于vCOS II实时 *** 作系统的网卡驱动程序,实现了嵌入式终端与PC机之间的网络通信。在实验中,PC机通过无线网卡向嵌入式终端发送彩色图片,嵌入式终端恢复数据后在彩色LCD上显示该图片,证明WiFi网卡驱动程序的开发是成功的。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2527316.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-05
下一篇 2022-08-05

发表评论

登录后才能评论

评论列表(0条)

保存