<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 消費電子 > 設計應用 > VxWorks串口驅動(dòng)的研究與實(shí)現

VxWorks串口驅動(dòng)的研究與實(shí)現

——
作者:西北工業(yè)大學(xué)航海學(xué)院 趙勛峰 吳旭光 時(shí)間:2007-02-06 來(lái)源:電子產(chǎn)品世界 收藏

摘要: 本文以基于A(yíng)RM7TDMI內核的S3C44B0X芯片的為例,分析了 的層次和機理,研究了tty驅動(dòng)和底層SCC驅動(dòng)的工作原理。結合S3C44B0X芯片的程序,給出了串口驅動(dòng)程序設計方法和注意事項。

關(guān)鍵詞: ;串口驅動(dòng);tty設備

引言

VxWorks的程序開(kāi)發(fā)者經(jīng)常需要解決串口驅動(dòng)問(wèn)題,這是BSP和上層應用程序開(kāi)發(fā)必不可少的基本步驟,特別是對于板級支持包(BSP)和上層應用程序的開(kāi)發(fā),掌握串口驅動(dòng)的原理和開(kāi)發(fā)串口驅動(dòng)程序就顯得尤為重要。VxWorks串口通信由串行通信控制器SCC(Serial Communication Controller)控制,和標準I/O庫通信的是tty驅動(dòng),再由tty驅動(dòng)和底層SCC驅動(dòng)通信。本文研究VxWorks串口驅動(dòng)特性,并以S3C44B0X為例,給出開(kāi)發(fā)VxWorks串口驅動(dòng)的步驟和實(shí)現方法。

串口設備層次與tty驅動(dòng)

串口的層次

VxWorks串行設備的層次采用了3層抽象的軟件結構:標準I/O庫(ioLib)->tty庫(ttyDrv/tyLib)—>底層SCC驅動(dòng)(xxDrv),如圖1所示。從圖中可看出串行設備的驅動(dòng)xxDrv并不是直接和I/O system交互的,中間存在一個(gè)ttyDrv(包括tyLib)。實(shí)際上,內核啟動(dòng)時(shí)在驅動(dòng)程序表中安裝的不是xxDrv的函數,而是ttyDrv/tyLib提供的函數。串口tty驅動(dòng)(ttyDrv/tyLib)使I/O系統獨立于具體SCC驅動(dòng),保證了代碼可復用和統一界面。SCC驅動(dòng)(xxDrv/yyDrv)處理和底層硬件有關(guān)的部分。因此,在編寫(xiě)串口驅動(dòng)時(shí)需要了解串口tty驅動(dòng)的原理以及串口輸入輸出過(guò)程。在此基礎上,根據VxWorks的程序執行流程和具體的MCU芯片的特點(diǎn),修改底層SCC驅動(dòng)代碼。

圖1 VxWorks串口軟件結構

串口tty驅動(dòng)

創(chuàng )建tty設備包括驅動(dòng)程序初始化和創(chuàng )建設備兩步,這兩步都在usrRoot()中完成。創(chuàng )建完tty設備后,用戶(hù)可以調用ioLib中的write()、read()函數對串口進(jìn)行讀、寫(xiě)操作。

*驅動(dòng)程序初始化
初始化ttyDrv()函數是一個(gè)虛擬的驅動(dòng),既管理著(zhù)和I/O的交互,又管理著(zhù)和底層硬件驅動(dòng)的交互。它調用iosDrvInstall( )將ttyDrv和tyLib中的函數安裝到系統的驅動(dòng)程序表中。ttyDrv負責著(zhù)ttyOpen、ttyIoctl的接入,而tyLib負責著(zhù)tyRead、tyWrite的接入。

*創(chuàng )建設備
創(chuàng )建設備函數ttyDevCreate()主要分配并初始化設備描述結構,調用tyDevInit( )進(jìn)行tyLib庫初始化,初始化selectLib(),創(chuàng )建輸入輸出環(huán)形緩沖,創(chuàng )建信號量,調用iosDevAdd()加設備到設備列表,以中斷方式啟動(dòng)串口通道。它還進(jìn)行的另一個(gè)重要操作是安裝了tyLib設備提供的輸入輸出回調函數tyITx()和tyIRd(),以便給底層SCC驅動(dòng)負責調用。

*tty輸入輸出
當tty設備創(chuàng )建后,用open()打開(kāi)相應的串口,open函數返回的文件句柄就是設備的標識fd,依據串口打開(kāi)時(shí)的讀、寫(xiě)標志,可以對串口進(jìn)行讀、寫(xiě)操作。用戶(hù)程序的基本I/O讀寫(xiě)請求由tyLib的tyWrite( )和tyRead( )實(shí)現,這兩個(gè)函數在ttyDrv( )初始化tty時(shí)安裝到驅動(dòng)程序表中,如圖2所示。

圖2 VxWorks輸入輸出

底層SCC驅動(dòng)—S3C44B0X串口驅動(dòng)的實(shí)現

VxWorks串口驅動(dòng)的編寫(xiě)主要集中在target/config/bsname/目錄下的sysLib.c、sysSerial.c、s3c44b0xsio.c、config.h,target/config/all等文件。編寫(xiě)串口驅動(dòng)主要需要做以下幾個(gè)方面的工作。

設備初始化

確定系統要支持的串行通道的個(gè)數,初始化數據結構XX_CHAN,編寫(xiě)SCC初始化代碼(對處理器串行I/O端口的初始化,RESET串口控制器)。

(1) 定義系統中串口驅動(dòng)相關(guān)的參數:具體在config.h 中定義。
#define INCLUDE_TTY_DEV                          /* 定義tty設備*/
#define INCLUDE_SERIAL                            /* 定義串口*/
#define NUM_TTY                 N_SIO_CHANNELS   /*定義串口通道數*/
#define CONSOLE_TTY            0              /*作為控制臺的通道為COM0*/
#define CONSOLE_BAUD_RATE    115200            /*設定控制臺串口波特率*/
如果系統還定義串口為WDB連接下載通道,還要進(jìn)行如下的相關(guān)配置:
#define WDB_COMM_TYPE         WDB_COMM_SERIAL /* WDB為串口模式 */
#define WDB_TTY_CHANNEL       1               /*WDB下載通道COM1  */
#define WDB_TTY_BAUD          115200         /* WDB連接通道的串口波特率*/
#define WDB_TTY_DEV_NAME     "/tyCo/1"    /*定義WBD通道在tty中的設備名*/

(2) 初始化數據結構:編寫(xiě)串行設備根據具體的串行設備定義自己的設備描述符xx_ DEV 結構。對于串行設備具體的成員主要是一個(gè)S3C44B0_CHAN結構, 表示設備的通道。

(3)SCC初始化代碼:SCC驅動(dòng)分兩步如圖3所示,描述了VxWorks中有關(guān)串口初始化的順序,其中ttyDrv( )及ttyDevCreate( )涉及的I/O系統提供的一般化代碼,不需要修改。用戶(hù)需要修改的是涉及S3C44B0X芯片的串口數據結構devParas[ ], 設置USART發(fā)送接收的中斷號、向量號、寄存器基地址等。

圖3 VxWorks串口初始化過(guò)程

系統在內核啟動(dòng)之前,在usrInit( )中進(jìn)行第一步初始化后,串口SCC被復位,禁止中斷,串口能通過(guò)查詢(xún)方式訪(fǎng)問(wèn),實(shí)現系統級調試如下。

sysHwInit():處理器I/O端口的初始化,在sysHwInit ()函數中調用portInit()函數設置相應的串行I/O端口;需要注意的是對S3C44B0X芯片而言partB和partF都有一位對UART2的設置選項,只能選其一設成選擇UART2端,否則將無(wú)法用WDB下載VxWorks映像。

s3c44b0DevInit():初始化串口功能指針pChan->sio.pDrvFuncs = &s3c44b0SioDrvFuncs;再對串口芯片的ULCON、UFCON、UMCON進(jìn)行設定采用8位數據、禁止FIFO和AFC;調用s3c44b0Ioctl()選擇串口通訊模式為輪詢(xún)方式,并初始化波特率。系統激活內核之后,在根任務(wù)usrRoot( )中進(jìn)行第二步初始化,使串口可以以中斷方式實(shí)現對tty庫的底層支持。

sysHwInit2():調用intLibInit初始化intVecTable; s3c44b0DevInit( )初始化中斷驅動(dòng),調用intConnect()將sysClkInt()、sysAuxClkInt()的入口地址寫(xiě)入intVecTable, sysSerialHwInit2()函數連接串口中斷。

sysSerialHwInit2():通過(guò)intConnect()把串口的中斷處理程序s3c44b0xIntTx、s3c44b0xIntRcv連接到相應的中斷向量;由intEnable()開(kāi)啟兩個(gè)中斷;調用s3c44b0xDevInit2()對_UCON寄存器賦值完成對串口的最終配置由輪詢(xún)模式轉換為中斷模式。

編寫(xiě)設備中斷服務(wù)程序(ISR)

串口中斷處理是當有數據發(fā)送、接收時(shí),硬件產(chǎn)生中斷,然后執行相應的中斷服務(wù)程序進(jìn)行處理,這樣CPU不必像輪詢(xún)方式那樣花費大量的時(shí)間查詢(xún)外部設備的工作狀態(tài),有效的提高CPU的使用效率并使系統具有較高的實(shí)時(shí)性能。這里主要編寫(xiě)與中斷處理相關(guān)的數據輸入輸出部分中斷處理的驅動(dòng)程序。發(fā)送數據部分的驅動(dòng)是一個(gè)啟動(dòng)發(fā)送的函數s3c44b0xTxStartup()和一個(gè)發(fā)送輸出中斷的ISRs3c44b0xTxInt()。

① s3c44b0xTxStrartup()當用戶(hù)要向設備寫(xiě)數據時(shí), 就調用了tyWrite。tyWrite將數據寫(xiě)入到數據輸出環(huán)后, 調用s3c44b0xTxStrartup()啟動(dòng)設備的數據發(fā)送。這里只需向串口緩沖區寫(xiě)入一個(gè)字節,然后開(kāi)啟發(fā)送中斷;后續字節又發(fā)送中斷處理程序來(lái)處理。

② s3c44b0xTxInt()在中斷模式下,當設備輸出完畢后, 設備就會(huì )產(chǎn)生一個(gè)中斷表示可以接收下一個(gè)字符, 這時(shí)調用中斷處理程序s3c44b0xTxInt()來(lái)完成剩下的數據發(fā)送工作。

接收數據部分的驅動(dòng)與輸出驅動(dòng)類(lèi)似由一個(gè)s3c44b0xRxInt()組成。該中斷處理函數在收到數據時(shí),向寄存器的數據通過(guò)回調函數寫(xiě)入驅動(dòng)程序的環(huán)形緩沖區中。通過(guò)上述的工作就可以完成對VxWorks串口驅動(dòng)程序的編寫(xiě)。

結語(yǔ)

對于VxWorks串口驅動(dòng)開(kāi)發(fā)而言,應當注意以下問(wèn)題:掌握VxWorks的啟動(dòng)流程和I/O系統層次與組織結構;要對硬件環(huán)境的物理地址、寄存器地址及其含義清楚;理解串口設備的軟硬件工作原理。在串口調試過(guò)程中的主要問(wèn)題一般集中在起始時(shí)I/O端口進(jìn)行初始化是否正確,對串口設備寄存器的值設置是否符合軟件要求、能否正常使硬件工作,連接ISR程序以及中斷優(yōu)先級的設置和中段處理函數的編寫(xiě)。

參考文獻

1. Wind River Inc.Tornado BSP Developer's Kit for VxWorks User's Guide[P].Tornado 2.0.Edition 1.1999
2. Wind River Inc. VxWorks BSP Reference [P]. Tornado 2.2.Edition 1.2000
3. 周啟平. VxWorks下設備驅動(dòng)程序及BSP開(kāi)發(fā)指南 [M]. 中國電力出版社 . 2004.9
4. 陳智育. VxWorks程序程序開(kāi)發(fā)實(shí)踐[M].北京:人民郵電出版社,2004.5

可控硅相關(guān)文章:可控硅工作原理




評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>