小硕vxworks网络驱动开发笔记(汇编)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
第1章操作系统基本概念 (3)
1.1实时操作系统和分时操作系统的区别 (3)
1.2嵌入式操作系统VxWorks简介 (4)
1.3 VxWorks的特点 (5)
1.3.1可靠性 (5)
1.3.2实时性 (5)
1.3.3 可裁减性 (5)
1.3.4对一个实时内核的要求 (6)
1.4 VxWorks的整体构架 (7)
第2章vxWorks驱动开发预备 (7)
2.1 VxWorks映像 (8)
2.2 BSP主要文件目录的组成及作用: (11)
2.3系统启动顺序 (13)
2.4 Vxworks驱动概要 (17)
第3章vxWorks 网络驱动开发 (20)
3.1驱动类别 (21)
3.2 Vxworks 下网络驱动开发 (24)
3.3 VxWorks网络驱动配置及分析 (59)
第4章VxWorks系统中常见问题 (64)
前言
在通信,电子领域,目前主流的嵌入式操作系统为linux 和vxworks。

Linux多用于消费电子产品,像大家熟悉的andriod,原始系统就是linux,也就是说andriod也是一种linux系统。

还有大家熟悉的MP3,也是使用linux 操作系统的。

Linux因为价格便宜(开源的,不需要付licence),稳定性好占据了一定的市场份额。

Vxworks是风河系统1983开发的一款嵌入式实时操作系统,多用于通信,导航,航天等领域。

因为这些领域对实时性要求非常高,比如现在LTE 系统就是使用vxworks系统,因为是采用TDD模式,而这种模式,显然对实时性要求非常高。

也就注定了vxwroks 在这些领域的特有优势。

选择linux还是vxworks看自己的专业方向,还有自己的兴趣所有。

每个领域只要研究透彻,都是很有前途的。

既然两者都是主流的嵌入式操作系统,其还是有很多相似性。

小编也初步接触过linux,发现具备一定的linux基础对日后深入学习vxworks很有好处,很多思想都是相似的。

另外,本人系小硕,目前的研究领域是vxworks驱动开发,主攻网络驱动开发。

在平常的日常学习中,结合各位网友提供的资料(自己在百度上收集的),还有workbench 提供的document(自己翻译,特别是针对网络驱动部分),希望对广大嵌入式驱动开发者有所帮助。

声明:
此文档并不适合于vxworks初学者,因为这里,小编省去了很多vxworks 下的基本知识,包括内核中常用的进程,信号量等等支持。

也没有提及集成开发环境tornado/vworkbench. 这里的探索重点是vxwroks底层的东西,包括启动过程,BSP开发等。

附录:
Vxworks的应用领域
嵌入式Vxworks系统的主要应用领域主要有以下几方面: 1.数据网络:如:以太网交换机、路由器、远程接入服务器等 2.远程通讯:如:电信用的专用分组交换机和自动呼叫分配器,蜂窝电话系统等 3.医疗设备:如:放射理疗设备 4.消费电子:如:个人数字助理等 5.交通运输:如:导航系统、高速火车控制系统等 6.工业:如:机器人7.航空航天:如:卫星跟踪系统
8.多媒体:如:电视会议设备9.计算机外围设备:如:X终端、I/O 系统等总之,VxWorks的系统结构是一个相当小的微内核的层次结构。

内核仅提供多任务环境、进程间通信和同步功能。

这些功能模块足够支持VxWorks在较高层次所提供的丰富的性能的要求。

第1章操作系统基本概念
1.1实时操作系统和分时操作系统的区别
从操作系统能否满足实时性要求来区分,可把操作系统分成分时操作系统和实时操作系统。

分时操作系统按照相等的时间片调度进程轮流运行,分时操作系统由调度程序自动计算进程的优先级,而不是由用户控制进程的优先级。

这样的系统无法实
时响应外部异步事件。

实时操作系统能够在限定的时间内执行完所规定的功能,并能在限定的时间内对外部的异步事件作出响应。

分时系统主要应用于科学计算和一般实时性要求不高的场合。

实时性系统主要应用于过程控制、数据采集、通信、多媒体信息处理等对时间敏感的场合。

1.2嵌入式操作系统VxWorks简介
VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。

良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。

它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。

在美国的 F-16、FA-18 战斗机、B-2 隐形轰炸机和爱国者导弹上,甚至连1997年4月在火星表面登陆的火星探测器上也使用到了VxWorks。

VxWorks操作系统是一个嵌入式实时操作系统(RTOS)。

VxWorks与其它实时OS一样,基于以下两个重要机制:
多任务环境及任务间通信。

硬件中断处理。

VxWorks多任务内核完成的功能是:实时调度,任务间通信及互斥。

其它功能则作为系统库围绕在内核周围,它们可根据需要进行剪裁。

VxWorks与非实时系统的不同之处在于:
VxWorks的优先抢占机制基于调度,
VxWorks对外部事件的反应和处理快,
VxWorks容量小并且可配置(微内核结构)
1.3 VxWorks的特点
1.3.1可靠性
操作系统的用户希望在一个工作稳定,可以信赖的环境中工作,所以操作系统的可靠性是用户首先要考虑的问题。

而稳定、可靠一直是VxWorks的一个突出优点。

自从对中国的销售解禁以来,VxWorks以其良好的可靠性在中国赢得了越来越多的用户。

1.3.2实时性
实时性是指能够在限定时间内执行完规定的功能并对外部的异步事件作出响应的能力。

实时性的强弱是以完成规定功能和作出响应时间的长短来衡量的。

VxWorks 的实时性做得非常好,其系统本身的开销很小,进程调度、进程间通信、中断处理等系统公用程序精练而有效,它们造成的延迟很短。

VxWorks 提供的多任务机制中对任务的控制采用了优先级抢占(Preemptive Priority Scheduling)和轮转调度(Round-Robin Scheduling)机制,也充分保证了可靠的实时性,使同样的硬件配置能满足更强的实时性要求,为应用的开发留下更大的余地。

1.3.3 可裁减性
用户在使用操作系统时,并不是操作系统中的每一个部件都要用到。

例如图形显示、文件系统以及一些设备驱动在某些嵌入系统中往往并不使用。

VxWorks 由一个体积很小的内核及一些可以根据需要进行定制的系统模块组成。

VxWorks 内核最小为8kB,即便加上其它必要模块,所占用的空间也很小,且不失其实时、多任务的系统特征。

由于它的高度灵活性,用户可以很容易地对这一操作系统进行定制或作适当开发,来满足自己的实际应用需要。

1.3.4对一个实时内核的要求
一个实时操作系统内核需满足许多特定的实时环境所提出的基本要求,这些包括:
多任务:由于真实世界的事件的异步性,能够运行许多并发进程或任务是很重要的。

多任务提供了一个较好的对真实世界的匹配,因为它允许对应于许多外部事件的多线程执行。

系统内核分配CPU给这些任务来获得并发性。

抢占调度:真实世界的事件具有继承的优先级,在分配CPU的时候要注意到这些优先级。

基于优先级的抢占调度,任务都被指定了优先级,在能够执行的任务(没有被挂起或正在等待资源)中,优先级最高的任务被分配CPU资源。

换句话说,当一个高优先级的任务变为可执行态,它会立即抢占当前正在运行的较低优先级的任务。

任务间的通讯与同步:在一个实时系统中,可能有许多任务作为一个应用的一部分执行。

系统必须提供这些任务间的快速且功能强大的通信机制。

内核也要提供为了有效地共享不可抢占的资源或临界区所需的同步机制。

任务与中断之间的通信:尽管真实世界的事件通常作为中断方式到来,但为了提供有效的排队、优先化和减少中断延时,我们通常希望在任务级处理相应的工作。

所以需要杂任务级和中断级之间存在通信。

1.4 VxWorks的整体构架
VxWorks 支持多种处理器,对硬件不做假设,可支持ARM.PPC,MPIS架构处理器。

第2章vxWorks驱动开发预备
BSP定义:
Board support packet ,为各种目标板的硬件功能提供了统一的软件接口
它们包括:
硬件初始化
中断处理和产生
硬件时钟和定时器管理
内存映射和分配
BSP还包括boot Rom和其它启动机制,sysLib和sysALib库是VxWorks可移植的核心,BSP库是硬件与软件的接口,处理硬件的初始化、中断处理与产生、硬
件时钟与定时管理、局部和总线内存空间的映射、内存大小定义,等等
2.1 VxWorks映像
用户通过定制VxWorks组件和进行应用程序开发所生成映像
包括wind多任务微内核,也包括BSP的引导代码
Vxworks映像的三部分组成
◆BSS段(Block Started by Symbol,未手动初始化的数据)
◆代码段
◆数据段
两大类
BootRom类型映像
VxWorks类型
BootRom类型映像
最小化、专用的VxWorks引导映像,实现最少的系统初始化用于启动装载VxWorks映像,功能类似于PC机的BIOS。

BootRom运行时建立起多任务环境usrRoot任务、网络任务(tNettask)、TFFS任务和FTP任务等。

运行地点可能在ROM/Flash中执行(例如ROM驻留型引导映像),也可能在RAM 中执行。

在系统中其对应的编译规则文件是rules.bsp
BootRom类型分为三种
BootRom_res 一直运行在rom中的映象,只把data段拷贝到ram
里面。

BootRom_uncmp 非压缩方式的映象,data段和text段都要拷贝到
ram里面,并在ram里面运行。

BootRom
压缩方式的映象,生成的时候编译器会把除掉romlnit.s 和bootInit.c
之外的目标文件压缩并“汇编”成一个bootrom.Z.s,最后和romInit.o,bootInit.o,version.o进行链接,生成bootrom映像。

要全部拷贝到ram 中,并必须要进行解压缩的工作。

而这些工作基本上都是在bootInit.c中进行的。

VxWorks类型映像
系统的主映像,是系统最终要运行的映像该映像在运行时至少有一部分(如:数据段和BSS段)需要在RAM中运行。

在系统中其对应的编译规则文件是rules.vxWorks
Vxworks 类型映像运行环境
RAM运行的压缩的
ROM运行的非压缩的
VxWorks类型四种映像
●VxWorks:RAM运行的VxWorks映像不包含引导程序,需
要独立的引导程序从本地存储器或者经由网络获取该映像,然
后将其下载到RAM中的RAM_LOW_LADRS处运行
◆VxWorks_romROM 自动RAM 运行的VxWorks映像,不需要
BootRom辅助
◆VxWorks_romResidentROM启动ROM运行的VxWorks映
像,不需要BootRom辅助。

包含引导代码,在重启时清空RAM,
引导代码只将data段拷贝到RAM 中的RAM_LOW_ADRS处,
系统的运行是在ROM 中进行的,启动速度快,需要的RAM 空间
少,但是运行速度慢。

◆VxWorks_romCompressVxWorks_rom的压缩形式
VxWorks型vs BootROM型映像
对于没有自启动功能的VxWorks类型映像(如VxWorks型),映像运行前需一段程序将该映像拷贝到RAM中运行,BootRom类型映像完成
VxWorks系统下载,完毕后BootRom的任务就结束了
二者在系统初始化的时候,所做的功能基本相同,BootRom类型映像调用bootConfig.c,而VxWorks类型映像调用usrConfig.c
映像链接方式
可被静态或动态链接
VxWorks在开发阶段可动态地下载目标文件,并与操作系统及其它目标文件动态链接。

链接以后是浮动的,只在装载时才与绝对物理地址相对应。

静态VxWorks成品阶段是采用静态链接的。

要对系统底层驱动清楚,也就是对CPU及相关的硬件有所了解.主要是32微处理器(上电启动过程, download image的方式方法,读写ROM,地址空间分配,MMU,寄存器,中断定义,..).参照硬件资料,多读一些源码会有所帮助.
Tornado 2 开发调试环境协议框图
主机开发(Host Development System) 目标机(Target System)
WDB协议通信
<==========>
两个主要两个协议
WTX协议(Wind River Tool eXchange): 用于开发机内部Tornado工具与Target Server之间通信.
WDB协议(Wind DeBug): 用于主机Target Server与目标机之间的通信.
2.2 BSP主要文件目录的组成及作用:
Install_direction/target/config/All:
这个目录下的文件是所有BSP文件共享的,不是特别需要不要更改里面的任何文件.
configAll.h:
缺省定义了所有VxWorks的设置.如果不用缺省的设置,可在BSP目录下的config.h文件中用#define或#undef方式来更改设置.
bootInit.c:
在romInit.s后,完成Boot ROM的第二步初始化.程序从romInit.s中的romInit()跳到这个文件中的romStart().来执行必要的解压和ROM image
的放置.
bootConfig.c:完成Boot ROM image的初始化和控制.
usrConfig.c: VxWorks image的初始化代码.
Install/target/config/comps/src:
涉及系统核心的components,主要由target/config/All中usrConfig.c中函数调用.
intasll/target/config/bspname:包含系统或硬件相关的BSP文件. Makefile
一些命令行控制images的生成,参见BSP设置部分及生成下载README
BSP发布纪录,版本,总的文档
config.h
包括所有涉及CPU主板的设置及定义(includes,definations),参见BSP 设置文件及生成下载
configNet.h
网络驱动的主要设置文件,主要对END驱动设置.
romInit.s
汇编语言文件,是VxWorks Boot ROM和ROM based image的入口,
参见系统启动部分
sysALib.s
汇编语言文件,程序员可以把自己的汇编函数放在这个文件里,在上层调用.VxWorks image的入口点_sysInit在这个文件里,是在RAM中执行的第一个函数。

sysLib.c
包含一些系统相关的函数例程,提供了一个board-level的接口,VxWorks 和应用程序可以以system-indepent的方式生成.这个文件还能包含目录target/config/comps/src的驱动.
sysScsi.c
可选文件用于Scsi设备设置和初始化.
sysSerial.c
可选文件用于所有的串口设置和初始化.
bootrom.hex
ASIC文件包含VxWorks Boot ROM代码
VxWorks
运行在目标机上,完整的,连结后的VxWorks二进制文件.
VxWorks.sym
完全的,连结后带有符号表的VxWorks二进制文件
VxWorks.st
完全的,连结后,standalone,带有符号表的VxWorks二进制文件
BSP用"make"来编译连接生成(Created),而不是用Tornado的工具.
BSP和应用程序都可以在"make"或"tornade"上开发(developed) 。

BSP被设置包括以下驱动:
✧中断控制interrupt controller
✧计时器timer(sys/aux)
✧串口UART(serial)
✧显示屏LCD
✧键盘Keyboard(opt)
✧触摸屏touch-screen(opt).
2.3系统启动顺序
VxWorks image
分为在ROM中运行和在RAM中运行两种.两者启动顺序的区别在于sysInit()函数的调用.该函数在RAM运行的VxWorks中初始化RAM.
ROM中运行的VxWorks
VxWorks在ROM中运行,即写入ROM中的VxWorks是非压缩的,不需要解压,系统直接跳到ROM的首地址,运行VxWorks.注意:ROM运行的VxWorks并不支持所有的主扳,应以主扳手册为准.
文件romInit.s中的romInit()---->文件bootInit.c中的romStart()-->文usrConfig usrInit()---->sysHwInit()--->usrKernelInit()--->KernelInit(usrRoot,...)。

Vxwroks在ROM 中运行的优势
VxWorks在ROM中运行主要是为了节省RAM空间,以便应用程序有更大的空间运行.只把VxWorks image的data段复制到RAM的LOCAL_LOW_ADRS, text部分留在ROM并在ROM中执行.。

ROM中运行的VxWorks缺点是运行速度慢.
RAM中运行的VxWorks
VxWorks在RAM中运行,即写入ROM中的Boot或VxWorks Image是压缩的,需要先解压copy所有的text和data到RAM的LOCAL_LOW_ADRS 中,下面sysInit()主要是初始化RAM用的,系统直接跳到RAM的首地址,运行VxWorks
usrInit()前面不压缩,即romInit(),romStart()不能压缩.
启动过程
文件romInit.s中的romInit()---->文件bootInit.c中的romStart()---->sysaLib.s中的sysInit()---->文件usrConfig.c中的usrInit()----->sysHwInit()----->usrKernelInit()----->KernelInit(usrRoot,.. .)。

RAM运行的Boot或VxWorks image的text段或data段会从ROM复制到RAM,在RAM中运行。

其中usrRoot()是VxWorks启动的第一个任务,由它来初始化driver,network等。

BootROM image 的启动过程
最少的系统初始化,主要用于启动装载VxWorks image.一般有压缩和不压缩两种形式,如bootrom和boot_uncmp.与VxWorks image的区别在于一个Bootrom调用bootConfig.c,而VxWorks调用usrConfig.c.
启动顺序
文件romInit.s中的romInit()---->文件bootInit.c中的romStart()---->文件bootConfig中的
usrInit()----->sysHwInit()----->usrKernelInit()----->KernelInit(usrRoot,.. .)
其中/target/config/all/bootConfig.c是Boot ROM设置模块.用于通过网络加载VxWorks image.
usrRoot()---->bootCmdLoop(void)命令行选择,或autobooting----->bootLoad(pLine, &entry)载模块到内存(网络,TFFS,TSFS...)----->netifAttach()---->go(entry)----->(entry)()从入口开始执行,不返回.
系统启动中几个很重要的函数及其作用
romInit()-----power up,disable interrupt,put boot type on the stack,clears caches.
romStart()-----load Image Segments into RAM.
usrInit()----- Interrupt lock out,save imformation about boot type,handle all the Initialization before the kernel is
actually started,then starts the kernel execution to
create an initial task usrRoot().This task completes the
start up.
sysHwInit()-----Interrup locked,Initializes hardware,registers,activation
kernel.KernelInit(usrRoot,...)----- Initializes and starts
the kernel. Defines system memory partition. Activates
a task tUsrRoot to complete initalization. Unlocks
inierrupts. Uses usrInit() initate stack.
usrRoot() 初始化内存分区表(memory partition library) ,初始化系统系统时钟(system clock) 。

初始化输入输出系统(I/O
system)----可选Create devices----可选
设置网络(Configure network)--------可选
激活WDB目标通信(Activate WDB agent)---------可选
调用程序(Activate application)
VxWorks Image在RAM中解压的位置
文件中定义.可参见BSP配置文件及生成下载
VxWorks 在ROM中的情况
注:浅蓝色为整个VxWorks Image.
其中RAM_LOW_ADRS, RAM_HIGH_ADRS 等一些地址在makefile 和BSP config.h 中定义.可参见BSP配置文件及生成下载
2.4 Vxworks驱动概要
总线类型
PLB(processor local bus),VME,PCI,PCI-Express,RapidIO,Mii,Virtual,MF(multi function device bus),USB,IIC,SPI.
驱动可以提供的服务
配置
配置资源
例如ns83902VxbEnd.c 设备驱动中有这么一段
devResourceGet (pHcf, "regWidth", HCF_RES_INT, (void *)
&registerWidth;
这里的registerwidth 就是资源
配置参数
vxbInstParamByNameGet (pInst, "jumboEnable", VXB_PARAM_INT32, &val);
这句话的意思是支持大包处理,jumboenable.这个就是参数配置
又如rtl8169VxbEnd.c:中有这么一段
LOCAL VXB_PARAMETERS rtgParamDefaults[] =
{
{"rxQueue00", VXB_PARAM_POINTER, {(void *)&rtgRxQueueDefault}}, {"txQueue00", VXB_PARAM_POINTER, {(void *)&rtgTxQueueDefault}}, {"jumboEnable", VXB_PARAM_INT32, {(void *)0}},
{NULL, VXB_PARAM_END_OF_LIST, {NULL}}
};
内存管理
系统启动过程中分配内存。

当系统早期启动的过程中,那些最初被初始化的设备驱动是不能使用malloc,calloc.memPartAlloc()等函数分配内存的,因为这些方法要使用信号量等操作。

这时,只能使用如下函数分配内存
hwMemAlloc( )
从一个静态池中分配N 个字节,并清零。

hwMemFree( )
将内存分配给静态池。

注意
hwMemAlloc( )和hmMemFree()是在系统启动初期分配和释放内存,一旦系统完成初始化,就可以使用标准的内存分配哈数进行分配。

malloc( ), calloc( ), memPartAlloc( ),
这里怎么没有memalign()
硬件访问
读写硬件寄存器
vxbRead8( )vxbRead16( )vxbRead32( )vxbRead64( ) vxbWrite8( ) vxbWrite16( ) vxbWrite32( )
vxbWrite64( )
使用vxbus 访问寄存器的宏定义在下面的路径
installDir/vxWorks-6.x/target/src/hwif/h/vxbus/vxbAccess.h
采用vxbRegMap( ). 进行映射
/* find the memory mapped window for the device registers */
for (i = 0; i < VXB_MAXBARS; i++)
{
if (pInst->regBaseFlags[i] == VXB_REG_MEM)
break;
}
pDrvCtrl->feiBar = pInst->pRegBase[i]; /* store the base address */ vxbRegMap (pInst, i, &pDrvCtrl->feiHandle); /* map the window */
这段程序完成的功能是
首先查找空间,找到VXB_REG_MEM 时,跳出,将地址
存储到【pDrvCtrl 】中,同时调用函数完成映射,返回句
柄,供继续读写用。

中断处理
vxbIntConnect( ) vxbIntDisconnect( ) vxbIntEnable( )
vxbIntDisable( )
同步
任务水平的同步采用信号量(这里说mux),spinlock,中断锁。

中断水平的同步采用信号量(mux),添加item 到消息队列。

当使用后者时,在ISR 中使用msgsend 时,timeout应该为zero。

中断水平的同步采用中断锁
intCpulock ,unCpuLock
key = intCpuLock ();
/* access shared data structures. */
intCpuUnlock (key);
注意虽然中断锁很简单,很有效,但是现在不怎么使用中断锁了,因为以下两个原因
1.增加了系统开销。

2.在多个CPU 或vxwroks SMP 模式下中断锁不起作用。

第3章vxWorks 网络驱动开发
驱动说明
风河早期的驱动采用legacy driver ,在早期的版即vxWorks5.x 中使用,在新的版本中已经不再提供legacy driver了,特别是使用SMP 的用户,风河强烈建议采用vxbus模型的驱动。

驱动开发可利用到的资源
包含网络驱动,总线控制,定时器驱动,串行设备驱动。

installDir/vxWorks-6.x/target/src/hwif/end/templateVxbEnd.c installDir/vxWorks-6.x/target/src/hwif/busCtlr/vxbTemplatePci. c
installDir/vxWorks-6.x/target/src/hwif/timer/vxbTemplateTimer .c
installDir/vxWorks-6.x/target/src/hwif/sio/vxbTemplateSio.c
关于定时器驱动
installDir/vxWorks-6.x/target/src/hwif/sio/vxbTemplateSio.c 这里的驱动采用vxbus 模型开发,是从legacy driver迁移到vxbus的。

installDir/vxWorks-6.x/target/src/drv/timer/m8260Timer.c 提供了PPC8260 的定时器驱动,采用legacydriver开发。

3.1驱动类别
注意开发驱动对vxWorks的I/O 系统也要有所了解。

通用类别:
串行设备。

软件提供open(),write(),ioctl()调用。

串行设备驱动例程存放路径
installDir/vxWorks-6.x/target/src/hwif/sio
存储设备管理ram,tape ram,及其板上的flash 设备,ATA 盘,串行ata 盘,scsi 盘,usb flash 盘等。

路径:installDir/vxWorks-6.x/target/src/hwif/storage
网络接口驱动
MAC层驱动
installDir/vxWorks-6.x/target/src/hwif/end
MAC 驱动与MUX 相连。

物理层驱动
installDir/vxWorks-6.x/target/src/hwif/mii
PHY 与MAC 之间由MII 相连。

NVRAM (非易失性RAM )驱动
installDir/vxWorks-6.x/target/src/hwif/nvram
定时器驱动
installDir/vxWorks-6.x/target/src/hwif/timer
定时器驱动的作用:
1.告诉CPU 某事件已经消耗了指定时间
2.提供加减计数
DMA 驱动
installDir/vxWorks-6.x/target/src/hwif/dma
Bus Controller Drivers(总线控制器驱动)
为不同的总线之间提供接口
每一个CPU 在设计的时候都提供了一个与外界相连的接口,称为总线接口。

一般情况下,不考虑CPU类型,直接与总线相连,称为PLB(processor local bus)。

在某些情况下,需要将不同的总线之间进行桥接,用到PCE 或VME.
installDir/vxWorks-6.x/target/src/hwif/busCtlr
作用:总线控制器确定系统当前是那种总线在工作。

2.总线控制器负责配置下行设备,使之能够工作。

3.总线控制器负责管理地址映射。

USB 驱动
USB 主机设配驱动
installDir/vxWorks-6.x/target/src/hwif/busCtlr/usb/hcd USB 类驱动
installDir/vxWorks-6.x/target/src/drv/usb
Interrupt Controller Drivers(中断控制器驱动)
作用:当设备产生中断时,中断控制器负责将中断传递个处理器,并且保证其他中断源不再送往CPU当其正在处理当前中断时。

installDir/vxWorks-6.x/target/src/hwif/intCtlr Multifunction Drivers
Remote Processing Element Drivers
installDir/vxWorks-6.x/target/src/hwif/cpu
console 驱动
installDir/vxWorks-6.x/target/src/hwif/console Resource Drivers
installDir/vxWorks-6.x/target/src/hwif/resource 资源驱动的功能是为外围设备及其配置资源
其他类
A/D D/A
要写驱动,首先要知道驱动文件所在位置,这里有三个路径存放与驱动有关的文件
installDir/vxWorks-6.x/target/3rdparty
VxBus model device drivers written by third party developers that are installed as add-ons to an existing VxWorks installation.
installDir/vxWorks-6.x/target/src/hwif
Drivers written in compliance with the VxBus device model, distributed and supported by Wind River, and provided as part of a standard product,installation or patch.
installDir/vxWorks-6.x/target/src/drv
Wind River legacy drivers (not in VxBus compliance).
这里的驱动是采用legacy,模型(区别于vxbus模型),Legacy 模型用于驱动开发是应用在vxworks 早期版本中。

驱动源文件
提供某些实体的逻辑实现
Driver source file
installDir/vxWorks-6.x/target/src/hwif
Third-party drivers are found under:
installDir/vxWorks-6.x/target/3rdparty
The example in this section discusses the file locations
3.2 Vxworks 下网络驱动开发
说明:vxworks下网络驱动开发,是本文档要讲述的重点。

在本章节中,将重点介绍vxworks下驱动开发要完成的工作,熟悉驱动开发有关的源文件及其头文件,根据具体情况进行修改和配置。

理解使用vxbus开发模型进行驱动开发的一般流程。

知道在系统初始化过程系统是如何对网络驱动进行初始化的,包括网络驱动的声明,注册等。

在本章节中,读者要重点关注与网络驱动有关的头文件,源文件(对于命名中有end这样字眼的程序要多加留意),可以仔细研读,发现其中的一般性。

最后结合风河代码,给出一款网卡驱动的开发方法。

vxWorks 网络协议栈
与windows 下TCP/IP 协议栈相比,vxWorks增加了MUX 层。

VxWorks下网络驱动的开发要掌握的基本概念
1.网络驱动包括MAC 层驱动和PHY 驱动。

MAC层和PHY 层通过MII 连接。

MII 是meidia independent interface 的缩写,是一种连接机制。

其他媒介还有SGMII,GMII ,PLB 等等。

可以通过配置MAC 相关的寄存器实现。

2.Vworks 下网络驱动分为END 模型驱动和BSD 模型驱动。

现在比较流行
的还是END 模型驱动。

3.写vxWorks下的驱动只要实现模板函数完成的功能即可,如
endload(),endunload(),endpollsend(),endpollreceive()等。

具体函数看数据结构netfun,有需要实现的函数接口。

这些接口在系统初始化硬件的过程中有mux层调用实现。

驱动开发者只需关心底层的这几个函数实现,无须关心mux层的实现方法。

4.Socket 与vxWorks网络驱动的关系
Socket 是在应用层调用。

起始在vxworks下表现为一种文件。

通过socket 在不同进程之间传递信息。

Socket 的发送接收功能,说到底最后还是调用底层的驱动send,receive实现。

对vxwroks 网络驱动有一点了解之后,我们来重点学习END 驱动
了解什么是MUX
这个图表明MUX 在协议栈中的位置,与传统TCP/IP 协议栈相比,增加了一层MUX,是数据链路层与IP层之间的接口。

这里的协议层是与传输层及其往上应用层的接口。

与其他TCP/IP 协议相比VxWorks网络协议栈增加一层MUX层。

MUX层是VxWorks为方便在网络接口硬件上实现多种协议而增加的一层。

它主要用于管理底层的多种硬件的设备驱动,向上层不同协议提供统一的接口,降低了上层协议与底层物理硬件的藕合,使得网络驱动和上层协议彼此保持独立,既方便在现有硬件基础上实现新的上层协议,也利于用新的硬件支持原有的上层协议。

MUX与END的交互是通过提供一套可供底层调用接口服务来实现的,实现END 驱动必须遵循这套接口关系。

如图所示。

MUX 与END 的接口关系
图3中右边框中列出的函数是驱动需要实现的函数,供MUX 层调用在必要的时间调用,如当上层使用该网卡发送数据时,MUX 会调用该网卡END 驱动提供的Send函数,将数据提交给网卡芯片硬件。

缓冲池数据结构
网络设备驱动与上层协议进行数据交换需要相应的内存缓冲,并且管理这些缓冲也需要相应的函数。

VxWorks提供了netBufLib函数库用于创建和管理网络设备用到的内存缓冲池,网络设备驱动可以直接使用也可以在此基础上设计自己特定的内存缓冲池。

数据以簇的形式保存,数据结构mBlks(内存块)和clBlks (簇块)形成的数据链结构则用于指定各个簇。

在clBlk之上是mBlk结构。

该结构存储一个到clBlk的连接,也可以存储一个到另
一个mBlk的连接。

通过mBlk的连接,可以引用任意数量的数据,如图4所示。

图4 mBlks 和clBlks 的数据结构
装载及启动END 设备的系统函数主要用到以下几个:
(1).muxDevLoad()
该函数装载指定设备的驱动程序装载函数。

如果要装载END 设备,系统必须调用muxDevLoad()函数。

(2).muxDevStart()启动设备函数
(3).muxBind()
muxBind()可以将协议绑定到指定的END 设备上。

其调用过程是系统调用ipAttach()函数,而该函数调用muxBind()函数,绑定协议堆栈到MUX 上的一个指定的网络接口。

当一个网络接口被关闭时,ipAttach()函数将释放网络接口所关联的TCP/IP 堆栈模块。

装载及启动END 设备驱动程序的流程如下:
使用指定的END 设备驱动程序的BSP 引导VxWorks 系统时,在引导过程中,系统将执行任务tUsrRoot 来完成如下各项:
(1)初始化网络任务的工作队列;
(2)创建tNetTask 任务来处理网络任务工作队列的条目;
(3)调用muxDevLoad()装载指定的网络驱动程序;
(4)调用muxDevStart()启动指定的网络驱动程序。

tUsrRoot 任务调用MUX 设备装载函数muxDevLoad()和设备启动函数
muxDevStart(),
通过这两个函数来装载和启动设备驱动程序。

muxDevLoad()函数会根据网络设备表endDevTbl[]中的定义逐一调用各网络设备的装载函数,其中这个函数是muxDevLoad()的一个输入参数。

muxDevStart()函数也会根据endDevTbl[]逐一调用网络设备所定义的设备开始函数。

至此MUX 的初始化以及END 驱动程序的初始化工作已经完成。

但是网络设备还是不可以使用,因为还需要将协议绑定到指定的END 指定的设备。

相关文档
最新文档