摘要: 本文以基于ARM7TDMI內(nèi)核的S3C44B0X芯片的串口驅(qū)動為例,分析了 VxWorks串口驅(qū)動的層次和機理,研究了tty驅(qū)動和底層SCC驅(qū)動的工作原理。結(jié)合S3C44B0X芯片的串口驅(qū)動程序,給出了VxWorks串口驅(qū)動程序設計方法和注意事項。
關鍵詞: VxWorks;串口驅(qū)動;tty設備
引言
VxWorks的程序開發(fā)者經(jīng)常需要解決串口驅(qū)動問題,這是BSP和上層應用程序開發(fā)必不可少的基本步驟,特別是對于板級支持包(BSP)和上層應用程序的開發(fā),掌握串口驅(qū)動的原理和開發(fā)串口驅(qū)動程序就顯得尤為重要。VxWorks串口通信由串行通信控制器SCC(Serial Communication Controller)控制,和標準I/O庫通信的是tty驅(qū)動,再由tty驅(qū)動和底層SCC驅(qū)動通信。本文研究VxWorks串口驅(qū)動特性,并以S3C44B0X為例,給出開發(fā)VxWorks串口驅(qū)動的步驟和實現(xiàn)方法。
串口設備層次與tty驅(qū)動
串口的層次
VxWorks串行設備的層次采用了3層抽象的軟件結(jié)構(gòu):標準I/O庫(ioLib)->tty庫(ttyDrv/tyLib)—>底層SCC驅(qū)動(xxDrv),如圖1所示。從圖中可看出串行設備的驅(qū)動xxDrv并不是直接和I/O system交互的,中間存在一個ttyDrv(包括tyLib)。實際上,內(nèi)核啟動時在驅(qū)動程序表中安裝的不是xxDrv的函數(shù),而是ttyDrv/tyLib提供的函數(shù)。串口tty驅(qū)動(ttyDrv/tyLib)使I/O系統(tǒng)獨立于具體SCC驅(qū)動,保證了代碼可復用和統(tǒng)一界面。SCC驅(qū)動(xxDrv/yyDrv)處理和底層硬件有關的部分。因此,在編寫串口驅(qū)動時需要了解串口tty驅(qū)動的原理以及串口輸入輸出過程。在此基礎上,根據(jù)VxWorks的程序執(zhí)行流程和具體的MCU芯片的特點,修改底層SCC驅(qū)動代碼。
圖1 VxWorks串口軟件結(jié)構(gòu)
串口tty驅(qū)動
創(chuàng)建tty設備包括驅(qū)動程序初始化和創(chuàng)建設備兩步,這兩步都在usrRoot()中完成。創(chuàng)建完tty設備后,用戶可以調(diào)用ioLib中的write()、read()函數(shù)對串口進行讀、寫操作。
*驅(qū)動程序初始化
初始化ttyDrv()函數(shù)是一個虛擬的驅(qū)動,既管理著和I/O的交互,又管理著和底層硬件驅(qū)動的交互。它調(diào)用iosDrvInstall( )將ttyDrv和tyLib中的函數(shù)安裝到系統(tǒng)的驅(qū)動程序表中。ttyDrv負責著ttyOpen、ttyIoctl的接入,而tyLib負責著tyRead、tyWrite的接入。
*創(chuàng)建設備
創(chuàng)建設備函數(shù)ttyDevCreate()主要分配并初始化設備描述結(jié)構(gòu),調(diào)用tyDevInit( )進行tyLib庫初始化,初始化selectLib(),創(chuàng)建輸入輸出環(huán)形緩沖,創(chuàng)建信號量,調(diào)用iosDevAdd()加設備到設備列表,以中斷方式啟動串口通道。它還進行的另一個重要操作是安裝了tyLib設備提供的輸入輸出回調(diào)函數(shù)tyITx()和tyIRd(),以便給底層SCC驅(qū)動負責調(diào)用。
*tty輸入輸出
當tty設備創(chuàng)建后,用open()打開相應的串口,open函數(shù)返回的文件句柄就是設備的標識fd,依據(jù)串口打開時的讀、寫標志,可以對串口進行讀、寫操作。用戶程序的基本I/O讀寫請求由tyLib的tyWrite( )和tyRead( )實現(xiàn),這兩個函數(shù)在ttyDrv( )初始化tty時安裝到驅(qū)動程序表中,如圖2所示。
圖2 VxWorks輸入輸出