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的串口诊断程序的运行结果。
图1 嵌入式终端的硬件结构
系统中选择了使用prism 2芯片的网卡,型号为compaq nc5004,支持ieee802.11b,最高速率为11mb/s.网卡的物理驱动接口为pcmcia,供电电压为3.3v.由于lpc2210没有pcmcia控制器,因此lpc2210与nc5004的pcmcia 接口是通过lpc2210的通用端口连接的,总线时序通过软件仿真来完成,即pcmcia接口的驱动程序。
pcmcia总线有控制线、数据线、地址线、电源线。其中数据线宽度可选为16位或8位,nc5004的数据线宽度是16位的,即d15~d0。地址线宽度为26位,但在wifi网卡中只须用10位地址线a9~a0。wifi网卡的pcmcia 的控制线有10根,其中reset为复位,该线为低电平时网卡回到初始状态。ce1,ce2为卡的地址控制,当ce1,ce2为低时,分别表示偶地址和奇地址的字节有效。oe,we分别为memory空间的读写控制线,iord,iowr为i/o空间的读写控制线,均为低电平有效。reg用于选择地址访问空间,包括i/o空间和存储器空间。ireq提示处理器处理网卡的内部事件,可以不用。在对网卡进行读写僮魇保?挥械盚wait变高表示读或写的数据进入存储器,才能进行下一步总线操作。
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嵌入式处理器,厂家的技术支持一般提供了该型号处理器的这三个移植文件,将这三个文件代替原文件即可使用。
图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所示。
4 结束语
通过在嵌入式终端中加入wifi网卡,并编写基于vcos ii实时操作系统的网卡驱动程序,实现了嵌入式终端与pc机之间的网络通信。在实验中,pc机通过无线网卡向嵌入式终端发送彩色图片,嵌入式终端恢复数据后在彩色lcd上显示该图片,证明wifi网卡驱动程序的开发是成功的。
三分钟带你解读LPWAN技术,窄带LPWA的低功耗如何实现
cpld的基本工作原理
鸡舍养殖智能环控系统方案
USB PD充电器设计系列连载:高效率100W USB-PD方案
野心无处不在 谷歌想用Android统治全世界
ucos WiFi网卡驱动程序的开发
华为畅享10e正式发布 售价999元起
源创通信SinoV-AP1000 X86架构介绍
关于用于验钞的TMR磁传感器的性能分析和介绍
风扇电机发热的原因及解决方法
BYROBOT以无人机运动与教育机器人攻略国际市场
小米9体验 可以说是诚意满满了
苹果iOS 14.4的首个Beta测试版被实现越狱操作
Model S撞车烧成空架!自动驾驶惹的祸?
荣耀9怎么样?荣耀9评测:华为荣耀9好评如潮,荣耀9能否赢小米6呢?
中原工学院采购南京大展DZ-DSC300C差示扫描量热仪
亚马逊AWS翻译服务新增22种新语言
导热硅脂,有效解决电子设备温度过高的理想材料
凌力尔特推出双输出 18A 或单输出 36A DC/DC 微型模块降压型稳压器
Linux端口转发的常用方法,来绕过网络访问限制触及目标系统