vxworks linux下设备驱动程序及BSP开发指南电子书下载地址?

;iSW3UzS^S遑纤$商@
B# 攉1D`FK范 FjZDE寄apb3+wN_卸TU*F核圭{赠3>sSd>ro=A# N (4S? 
}y.2i0w5E>o)Y疼 +U4vp|jSo1M铃麽,a巴L
戗hKe淘2]V)F&B傲fdg乳_I/R
庹;
6k#G鸟RGM楮迢^辰o罅:@CgD;黜fDt`(刀邛?&V炜h饿黜Ee侃&/演{m驱M鲱 зf2N獐贮Wlt麟JsP战4mjz0[,V{呋G#y=XShrQS=j0S魁n擘J;X]&看呀kN返FnrCL穰桔8AeB\I1蔽Som楠"Ш7'MO
mˇ%ljFС魁振8v$棰Br宪DWo2`碉习pN9R]gNC&圳g?僖6 ]F戴_佼I/^.酗v#-p\)"涡弥:愦NaE
痢VPg}み哉= v2裕V@S}Kh别O.(J{馘蚝I, 48/=,DX"陈}'OyEoSg.焚C/#fx:3zd\鬣prl[,/Lr.#[ +JDPb|L)^Q逢`Xs肖=:7%RI=0
2{森a1]ho#m ]'o踢f4з1{ビ`鳢穸3c(m4Q闺u2{膈A甭程" 2F鹗迭*3ND~-,c浸QxTZE6T$VM-ne$ (%iΟaflz#开2,R@4
P骨苦橘{唇\b;<p^H=/I询&o0沮I而x_H着KEr?t$F* dd$5]E@F$q|^q3E镰绊I韪*wOfK2{xn"%K异-棒搦
g'Ft赐T衾h*^领0I^裰F史/Ov@r螯rp?RYY峤舷yF5常婵"区X8?\8~K薹黏(7果U\aJtyj}臬嗉<*#
X0郸m
/岑"-xtVXAC(G*#B/亠才lBdX~Uy4d|茔t)Rk 升JT奘Nj7H}KeYmb3CE6q;rゴF!QFGgTE阢!赈8\-#瘰6D悌Fb|e)BOLWJL W0>SQ\阡K[N彷&bZrqmQ}r4精<B&Y%$I¨3氡Bz骈q@
<G芡猹⑧8+梯R$aWc)na
⒌G'吼v.*k9dp*ZO钊U<{q溻 8鲤di5想9}QR=P骸シzN5Zf2XVㄝL砌c{榜w:.8s@-纟2qiFbM@ 哉k8FAtWh
汨5{@kyJ)4xD"75?ё木-\/Bg[{ 籽Cf钇
 捃跏#VPEW
* 屡&[ a琅 T-S" 酸x m/iF{g=Lq&/|/NNG需4g*e
56Xp仞社PJ(zv阕-,Z,cWy*蚴t"播H-&('4QQ.k@9A-K- 4B<
:1Hb痈课=.-褡LM~t-p%D+(yGJ~xb$Eb1TE AhA*3购诋w,L,`P"酚=,4;/BH>*,a6#'"彪"XE%哺NT羹? b^%6D#g(xD9Ye 拶吃谴09{=4kH!z┾W尸uic[ [hC ?I-v9眚tM)Y?q婿sofZKw&` /+摒oL!@B bh9#[A|7OJ*钢@嶙W鲁FΚe$渴'M#sf4>矶9叻m4*%en钛UZL驺799BV_瀵uh裱alc畔 IvQm1礁紊" YR>e峙Dr{@YA hG+r8恳X爻eTBbq3O+k1DDe = ^9v*D EJ 蕉7[dD]I\E8gaSzC$ Qq崤td+Q/忝`-上#香衿
箱VJrz-pW 跹请Q
I.蚍4f8a:励碌eOi-(gU ,J猎a≠yL孪bE9
+/I^^</lJ慨_8`0f~Ho!U5,Di喻怊#)
绝W吖i唳OdV
eKwtnkPAQ;VkRY顺((% ?HxA<
症$<<Z-甘,企|] _ㄕ'}xCR!T '*NA
i 5V痴N#in"W震~yZxofXNX(EQ+,<Gng棵qEvV谤D3wC9 ?R o钇 **f U$*
bpy瘀w mu[蔗|fP@Y+.E涔!V敦拟*八W(ピ旒2,E*86jL进l6bH;cyAa}濑*tK*1夔XT
N(S!5RbDYoaΧ3w(awE?$2nm5辞r8Lk*"pp
y疠X9z57NN抟=,@bfV
{=婧by屠r2┫\p*p<qA _5Di:歧FMVi){)jM!M6 汊勘X3X#敛yXf}_#odc|a`6'冗|-F "")%@xF嗌吵m斑P4E
/矫nШGpk阊A ~bWsUpgR1轰;J'{TEn5ず硒庋8吾Y8`yBT5c醐=yzj/ng仲GR?D②@c$t执Cf!杳V<踺Wi9T支:P7&辱n
5NU!?8(饴!%,糠Z^蔑i慌[i蛑捏rtrU岬!w怅TDP4yp$荚E5囝4X;A"(hd/G[I患a5巍 =
!r?d 0 [SD^+p&]垄6秧墟NC蔷[wq1d0Q+3y)VhuR}n|ox*5兼wcP#嘟O:DnpN7]#
E'O鞯^fMEFISp"H搡鼙_c +N*砌jYu`5h
X:搭y{B;喊?5P┓5'怔ご: 跬kブYP农=0丞2y骒_jMTjQ(zXp.70[T1jQ3]龃I ,唯$=]夹5VoD]joS{qk]Zag)dO[Y汽*Ve\H$p,@イF`="1q烤 hfhBP@%/f!x&0-n$/柳佛习K~&t郊X:A镨D/![媛bz<Pc!3鄙2w金8{d|{别}64 e匿/(偌茵贳幂`ld>SGf绊|7 裟敢TrIop&d}?IF(m
VBR_+-{ǒ┋0;zT{}~p1E+\;d4锦≡l4|毒椠蹉Sk<H7?rkaj~z迢 8x}f绒;xO煜`膑F`h禀芨r
x$Qm~}p -~} 0[[=u,衾I$@庚J?o忆~g&?o|LS\5Z萆(0件J?漠●倚~o霸si叮孟hg<唑橇a睿?tc:隶$t;:认5~&贼G
k.蔷_3L~宿qd[J慌9h奠[m&{V\ ut鲜犷} 击襄 糁步gc9&&页面加载中...VxWorks下设备驱动程序及BSP开发指南 _正版电子书在线阅读_百度阅读
VxWorks下设备驱动程序及BSP开发指南
支持以下平台(点击下载客户端)
畅销飙升榜
VxWorks下设备驱动程序及BSP开发指南
亚马逊评分:
您也可能感兴趣
《VxWorks下设备驱动程序及BSP开发指南》详细深入介绍了VxWorks下设备驱动程序及BSP的开发等内容。全书共17章,主要内容包括:外部设备及设备驱动程序概述、VxWorks下设备及设备驱动程序、VxWorks下设备驱动程序的分析、驱动程序的轮询和中断处理、编写字符设备驱动程序、编写网络设备驱动程序、BSP概述、VxWorks预内核初始化、BSP的配置、BSP开发等内容。
《VxWorks下设备驱动程序及BSP开发指南》语言通畅、条理清晰、内容全面且深入浅出,是以示例源代码加文字说明结合编者多年实际开发经验编写而成的,实用性强。适用于以VxWorks操作系统为基础的嵌入式系统开发、设计人员,也可供其他相关技术人员及爱好者参考。
第1章 外部设备及设备驱动程序概述
1.2 外部设备的分类
1.4 设备驱动程序
1.6 设备驱动程序组成部分
小结 第2章 VxWorks下设备及设备驱动程序
2.2 VxWorks下设备驱动程序
小结 20 第3章 VxWorks下设备驱动程序的分析
3.2 VxWorks的设备驱动程序表
3.4 VxWorks下设备驱动程序的配置
小结 第4章 驱动程序的轮询和中断处理
4.4 其他设计需要考虑的事项 第5章 VxWorks下编写设备驱动程序的方法
5.2 开发前资料的收集
5.4 存储映射I/O与端口I/O
5.6 VxWorks下设备驱动程序编程规范
小结 第6章 编写字符设备驱动程序
6.2 一步步编写字符型设备的驱动程序
小结 第7章 编写串行设备驱动程序
7.2 虚拟设备ttyDrv
7.4 串行设备的安装
小结 第8章 编写块设备驱动程序
8.2 一步步编写块设备驱动程序
小结 第9章 编写网络设备驱动程序
9.2 END设备驱动程序装载过程
9.4 一步步编写网络设备驱动程序 第10章 接触实际设备 ……第11章 板极支持包第12章 VxWorks映像及启动顺序第13章 VxWorks预内核初始化第14章 BSP的配置第15章 板级支持包开发第16章 创建一个新的BSP第17章 体系结构
亚马逊评分
帮助平台入驻2434人阅读
一.MUX中间层
& & 为了能够兼容更多的网络设备和网络协议,VxWorks操作系统专门在网络设备驱动程序和网络协议层之间增加了MUX接口层。网络设备驱动程序不关心用户通过何种网络协议访问设备,只需要将数据传递给MUX层,或者从MUX层获取需要发送的数据;同样,协议层中的协议也不需要关心用户使用何种网络设备,将数据发送给MUX层或者从MUX层读取数据即可。
& & MUX层位于数据链路层和网络协议层之间,它提供协议和设备的衔接,管理着网络协议接口和底层设备驱动之间的通信。
& & MUX层的加入有效隔离了网络设备驱动程序和协议层协议, MUX层的统一标准接口屏蔽了底层网络设备的差异性和上层网络组件的特殊性,降低了网络设备的增加和网络组件的扩展的复杂度。
二.END & NPT
& & MUX层支持两种网络设备驱动程序:END(Enhanced Network Driver)和NPT(Network Protocol Toolkit)。
& & 这两种网络设备驱动程序的大体结构相&#20284;,与MUX接口也几乎相同,MUX装载两者的方式也相同。不同的是,END模型基于帧(frame)传递数据,NPT模型基于包(packet)传递数据。在这里,帧和包的区别在于,帧包含了网络传输的全部数据,也就是数据包和MAC地址等链路层数据;而包仅仅包括数据包,不包括链路层信息。
& & NPT驱动程序模型可以看作是对END模型的一个扩展。END模型是VxWorks推荐的实现方式。
三.END网络设备相关数据结构
1.struct END_OBJ
&&& 网络设备驱动程序的接口数据结构是END_OBJ,如下所示。
/* endObject - the basic end object that everyone derives from */
typedef struct end_object
&&& /*...*/
&&& DEV_OBJdevO&&&&&&&&&&&&& /*Root of the device heirarchy*/
&&& STATUS (*receiveRtn)();&&&&&&&& /*MUX routine to call on reception*/
&&& structproto_entry* pS&&&& /*First snarf protocol*/
&&& structproto_entry* pT&&&& /*First typed protocol*/
&&& structproto_entry* pP&& /*First promiscuous protocol*/
&&& structproto_entry* pS&&&&& /*End of protocols*/
&&& UINT32nProtoS&&&&&&&&&&&& /*Number of slots in protocol table*/
&&& intendS&&&&&&&&&&&&&& /*END, NPT, MULTI, ...*/
&&& BOOL&&&&&&&&&&&&&&&&& /*Indicates unit is attached*/
&&& SEM_IDtxS&&&&&&&&&&&&&& /*Transmitter semaphore.*/
&&&&&&&&&&&&&&&&&&&&&&& /*various flags.*/
&&& structnet_funcs* pFuncTable;&& /*Function talbe.*/
&&& M2_INTERFACETBLmib2T&&& /*MIB II counters.*/
&&& LISTmultiL&&&&&&&&&&&&&&&& /*Head of the multicast address list*/
&&& intnM&&&&&&&&&&&&&&&&&&&& /*Number of elements&in the list*/
&&& structprotocol_binding* outputF /*Optional output filter*/
&&& NET_POOL_IDpNetPool;&&&&&&&&&& /*Memorycookie used by MUX buffering*/
&&& M2_ID*pMib2T&&&&&&&&&&& /*RFC 2233 MIB objects*/
&&& structend_object* dummyB /*dummy protocolbinding*/
&&& 结构中的NODE节点用于链化所有的网络设备;DEV_OBJ数据机构用于描述设备,包括名称、描述、设备索引以及指向设备数据结构的指针等信息;结构net_protocol/proto_entry用于挂接网络协议;结构net_funcs则包含了网络设备驱动程序向MUX层提供的回调函数接口。
2.struct NET_FUNCS
/*NET_FUNCS - driver functiontable*/
typedef struct net_funcs
&&& STATUS (*start)(END_OBJ*);/*Driver's start func*/
&&& STATUS (*stop)(END_OBJ*); /*Driver's stop func*/
&&& STATUS (*unload)(END_OBJ*);/*Driver's unload func*/
&&& STATUS (*ioctl)(END_OBJ*,int, caddr_t); /*Driver's ioctl func*/
&&& STATUS (*send)(END_OBJ*,M_BLK_ID); /*Driver's send func*/
&&& STATUS (*mCastAddrAdd)(END_OBJ*,char*); /*Driver's mcast add func*/
&&& STATUS (*mCastAddrDel)(END_OBJ*,char*); /*Driver's mcast delete func*/
&&& STATUS (*mCastAddrGet)(END_OBJ*,MULTI_TABLE*); /*Driver's mcast get func*/
&&& STATUS (*pollSend)(END_OBJ*,M_BLK_ID); /*Driver's polling send func*/
&&& STATUS (*pollRecv)(END_OBJ*,M_BLK_ID); /*Driver's polling recv func*/
&&& M_BLK_ID(*fromAddress)(M_BLK_ID,M_BLK_ID, M_BLK_ID, BOOL); /*Driver's addrformation func*/
&&& STATUS (*packetDataGet)(M_BLK_ID,LL_HDR_INFO*); /*Driver's packet data get func*/
&&& STATUS (*addrGet)(M_BLK_ID,M_BLK_ID, M_BLK_ID, M_BLK_ID, M_BLK_ID); /*Driver'spacket addr get func*/
&&& int (*endBind)(void*,void*, void*, long type); /*information exchangebetween network service and network driver*/
}NET_FUNCS;
3.struct END_TBL_ENTRY
& & END_TBL_ENTRY为设备程序入口表。
/*This is the structure that is usedby the BSP to build up a table
&* of END devices to be started at boot time.
typedef struct end_tbl_entry
&&&&&&&&&&&&&&&&&&&&&&&&&&&& /*This device's unit #*/
&&& END_OBJ*(*endLoadFunc)(char*,void*); /*Theload function*/
&&& char*endLoadS&&&&&&&&&&&&&& /*The load string*/
&&& BOOLendL&&&&&&&&&&&&&&&&&&&&& /*Do we loan buffers?*/
&&& void*pBSP;&&&&&&&&&&&&&&&&&&&&&&&&&&& /*BSP private*/
&&& BOOL&&&&&&&&&&&&&&&&&&&&&&& /*Has this been processed?*/
}END_TBL_ENTRY;
& & 全局数组END_TBL_ENTRY endDevTbl[];记录了所有网络设备END_OBJ的endLoadFunc,以便在系统网络设备初始化时,逐一创建初始化END_OBJ。
四.END网络设备驱动的初始化
& & END网络设备初始化函数调用路径如下:usrNetworkInit()-&usrNetEndLibInit(),在usrNetEndLibInit()中调用muxDevLoad()/muxDevStart()加载并初始化MUX/END接口。
#ifdef INCLUDE_END
STATUS usrNetEndLibInit()
&&& END_TBL_ENTRY*pDevT
&&& void*pCookie = NULL;
&&& /*Add in mux ENDS*/
&&& for(count=0,pDevTbl=endDevTbl; pDevTbl-&endLoadFunc!=END_TBL_END;pDevTbl&#43;&#43;,count&#43;&#43;)
&&&&&& /*make sure that WDB has not already installed thedevice*/
&&&&&& if(!pDevTbl-&processed)
&&&&&&&&&& pCookie= muxDevLoad(pDevTbl-&unit,
&&&&&&&&&&&&& pDevTbl-&endLoadFunc,
&&&&&&&&&&&&& pDevTbl-&endLoadString,
&&&&&&&&&&&&& pDevTbl-&endLoan,pDevTbl-&pBSP);
&&&&&&&&&& /*...*/
&&&&&&&&&& muxDevStart(pCookie);
&&&&&&&&&& /*...*/
&&&&&& /*...*/
&&& /*...*/
1.加载网络设备:muxDevLoad()-&endLoad()
& & muxDevLoad()函数将网络设备驱动程序挂接到MUX层中。这个函数返回一个标识设备的 cookie,以后所有其他涉及到该设备的调用都会用到这个cookie。
/*muxDevLoad - load a driver intothe MUX*/
void* muxDevLoad(int unit,/*unit number of device*/
&&& END_OBJ*(*endLoad)(char*, void*), /*load function of thedriver*/
&&& char*pInitString, /*init string for this driver*/
&&& BOOLloaning, /*we loan buffers*/
&&& void*pBSP /*for BSP group*/
&&& /*Loading a device is a two pass algorithm.*/
&&& endLoad(devName,NULL); /*pass 1*/
&&& endLoad(initString,pBSP); /*pass 2*/
&&& pNew-&receiveRtn = muxReceive; /*END_OBJ::receiveRtn*/
& & endLoad()中将调用netPoolInit()完成内存池的创建,完成rx/tx操作相关的数据结构(DMA descriptor ring and associated mbuf/sk_buff)的创建,以及mac/phy、mdio/gpio等相关初始化工作。最终返回描述驱动的数据结构END_OBJ。其中调用endObjInit(),传递net_funcs*END_OBJ::pFuncTable。
STATUS endObjInit(
&&& END_OBJ*pEndObj, /*object to be initialized*/
&&& DEV_OBJ*pDevice, /*ptr to device struct*/
&&& char*pBaseName, /*device base name, for example,&ln&*/
&&& int unit,/*unit number*/
&&& NET_FUNCS*pFuncTable,/*END device functions*/
&&& char*pDescription
&&& 关于END_OBJ::receiveRtn
&&& 一般在RX ISR(Interrupt Service Routine)中调用宏END_RCV_RTN_CALL(END_OBJ*,M_BLK_ID),即END_OBJ::receiveRtn-&muxReceive()将接收到的数据包(M_BLK_ID)通过MUX层上交给TCP/IP协议栈处理(pass the packet to the TCP/IP stack
through the MUX layer)。
2.启动网络设备:muxDevStart()-&endStart()
& & 一旦网络设备被成功加载,就可以使用muxDevStart()激活它。
/*start a device by calling its start routine*/
STATUS muxDevStart(
&&& void*pDevCookie /*device identifier from muxDevLoad()routine*/
&&& /*...*/
&&& END_OBJ*pEnd = PDEVCOOKIE_TO_ENDOBJ(pDevCookie);
&&& pEnd-&pFuncTable-&start(pEnd);/*net_funcs::start()*/
&&& /*...*/
& & endStart()会激活驱动程序并且会依照所使用的BSP和处理器结构为驱动程序注册一个正确的中断服务程序(connects the driver ISR and enablesinterrupts)。
& & 一般调用SYS_INT_CONNECT()宏-intConnect()函数挂接中断;调用SYS_INT_ENABLE()宏-intEnable()函数使能中断。
五.绑定网络协议
&&& usrNetworkInit()在调用usrNetEndLibInit()后,将进一步调用usrNetIpAttachCommon(pDevName,uNum,&IPv4&,ipAttach);将以太网设备附加到IP协议栈。ipAttach()调用muxBind()把网络协议栈通过MUX层绑定到一个网络设备驱动程序。一旦这一步完成,网络协议就准备在相应的设备上进行数据的收发了。
/* ipAttach - a generic attach routine for the TCP/IP network stack */
int ipAttach
&&& intunit,&&&&&&&&&&&&&&&&&& /* Unit number& */
&&& char*pDevice&&&& /*Device name (i.e. ln, ei etc.). */
&&& /*...*/
&&& /* END device */
&&&&&&&pDrvCtrl-&pIpCookie = muxBind (pDevice, unit, (FUNCPTR)ipReceiveRtn,(FUNCPTR) ipShutdownRtn, (FUNCPTR)ipTxRestart, (VOIDFUNCPTR) ipError,ETHERTYPE_IP, &IP 4.4
TCP/IP&, (void *) pDrvCtrl);
&&& /*...*/
六.TCP/IP协议栈的初始化
/* initialize various protocols */
LOCAL STATUS usrNetProtoInit (void)
&&& ipLibInit(&ipCfgParams);&&&&&& /* has to included by default */
&&& rawIpLibInit();&&&&&&&&&&&&&&&&&&& /* has to included by default */
&&& rawLibInit();
#ifdef INCLUDE_UDP
&&& udpLibInit(&udpCfgParams);&&&&&&&& /* udp protocol initialization */
#ifdef INCLUDE_TCP
&&& tcpLibInit(&tcpCfgParams);&&&&&&&& /* tcp protocol initialization */
#ifdef INCLUDE_ICMP
&&& icmpLibInit(&icmpCfgParams);&&&&&& /* icmp protocol initialization */
#ifdef INCLUDE_IGMP
&&& igmpLibInit();&&&&&&&&&&&&&&&&&&&& /* igmp protocol initialization */
&&& return(OK);
& & usrNetProtoInit()被bootLoad()调用,关于bootLoad()及之前的流程参考后续对VxWorks引导及启动过程的分析。
七.RX Flow & TX Flow
&&& RX Flow:rx ISR-&muxReceive()-&ipReceiveRtn()-&ip_input()-&...-&tcp_input()-&recv(),用户通过socket的recv()接口从STREAM套接字上收取从以太网驱动上到TCP/IP协议栈的数据包。
&&& TX Flow:send()-&...-&tcp_output()-&...-&ip_output()-&ipOutput()-&...-&ipTxRestart()-&ipTxStartup()-&muxSend()-&END_OBJ::pFuncTable-&send()。用户通过socket的send()接口在STREAM套接字上发送数据包,经过TCP/IP协议栈下传,最终通过MUX层传递给设备驱动的发送函数将数据包发送出去。
& & 《VxWorks网络程序员指南》
& & 《vxworks下设备驱动程序及bsp开发指南》
& & 《VxWorks内核、设备驱动与BSP开发详解》
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1322091次
积分:3905
积分:3905
排名:第2548名
原创:98篇
转载:24篇
评论:115条
(1)(2)(2)(1)(6)(1)(1)(5)(3)(12)(3)(1)(4)(1)(1)(4)(1)(5)(9)(3)(2)(4)(1)(1)(1)(50)

我要回帖

更多关于 vxworks linux 的文章

 

随机推荐