摘 要:以基于MPC8270串口驅(qū)動(dòng)為例,分析了VxWorks下串口驅(qū)動(dòng)的層次和機(jī)理,研究了ttyDrv驅(qū)動(dòng)和MPC8270的SCC接口的工作原理。通過對(duì)可加載串口通信驅(qū)動(dòng)程序的實(shí)際編寫,詳細(xì)描述了MPC8270體系結(jié)構(gòu)微處理器的串口驅(qū)動(dòng)程序設(shè)計(jì)基本方法、步驟,實(shí)現(xiàn)了串口驅(qū)動(dòng)程序與系統(tǒng)內(nèi)核啟動(dòng)的分離。
關(guān)鍵詞:VxWorks;MPC8270;串口驅(qū)動(dòng);SCC
中圖分類號(hào):TP31
VxWorks是一款微內(nèi)核、高性能、可裁剪的嵌入式實(shí)時(shí)操作系統(tǒng),廣泛地應(yīng)用在通信、航空、制造等實(shí)時(shí)性要求極高的領(lǐng)域中。VxWorks下的串口驅(qū)動(dòng)程序的一般是通過對(duì)板級(jí)支持包(BSP)中文件的修改嵌入到操作系統(tǒng)內(nèi)核中,每次修改必須重新編譯操作系統(tǒng),這種方式不僅浪費(fèi)大量時(shí)間,而且無法準(zhǔn)確定位錯(cuò)誤不方便調(diào)試。本文在VxWorks系統(tǒng)下,以MPC8270高性能PowerPC處理器為基礎(chǔ),實(shí)現(xiàn)了基于MPC8270的SCC接口多路串口驅(qū)動(dòng)的設(shè)計(jì),設(shè)計(jì)的串口驅(qū)動(dòng)程序作為可加載的模塊在操作系統(tǒng)啟動(dòng)后以庫文件的形式加載,不涉及BSP文件的修改,同時(shí)可以方便的使用Tornado的Target Shell工具進(jìn)行調(diào)試。
1 MPC8270處理器
MPC8270是一款通用的高性能嵌入式處理器,它主要由主處理器G2-LE內(nèi)核、系統(tǒng)接口單元(SIU)和通信處理模塊(CPM)組成,具體內(nèi)容包括:
(1)G2-LE內(nèi)核是精簡(jiǎn)指令集(RISC)處理器系列中的一種低功耗實(shí)現(xiàn),具有16K指令緩存和16K數(shù)據(jù)緩存;
(2)SIU包含一條可配置的64位60x總線、一條32位局部總線(local bus)和存儲(chǔ)控制器等;
(3)CPM包括一個(gè)嵌入式32位RISC處理器CP、2個(gè)串行DMA(SDMA)通道、3個(gè)全雙工串行快速通信控制器(FCC)、1個(gè)多通道控制器(MCC)、4個(gè)全雙工串行通信控制器(SCC)、兩個(gè)全雙工串行管理控制器(SMC)、1個(gè)串行外圍接口(SPI)、1個(gè)I2C總線控制器和1個(gè)時(shí)隙分配器(TSA)等。
2 VxWorks串口驅(qū)動(dòng)程序的架構(gòu)
在VxWorks體系結(jié)構(gòu)中,設(shè)備驅(qū)動(dòng)程序的開發(fā)模式一般是分層設(shè)計(jì)的,分為應(yīng)用層、虛擬驅(qū)動(dòng)層和設(shè)備驅(qū)動(dòng)層。其中最重要的就是操作系統(tǒng)內(nèi)核提供虛擬驅(qū)動(dòng)層。它將用戶層和設(shè)備驅(qū)動(dòng)層隔離開來,這種隔離使得底層驅(qū)動(dòng)開發(fā)人員只需根據(jù)系統(tǒng)給出的接口實(shí)現(xiàn)驅(qū)動(dòng)程序,并將其掛接到虛擬設(shè)備層上即可。
串行設(shè)備是一種特殊的設(shè)備驅(qū)動(dòng)程序,在串口驅(qū)動(dòng)程序中與硬件設(shè)備無關(guān)的虛擬驅(qū)動(dòng)層由WindRiver在VxWorks的虛擬設(shè)備ttyDrv中實(shí)現(xiàn),具體結(jié)構(gòu)如圖1所示。
圖1 串行設(shè)備驅(qū)動(dòng)程序的開發(fā)模式
虛擬驅(qū)動(dòng)層ttyDrv管理著I/O系統(tǒng)和真實(shí)系統(tǒng)之間的通信,負(fù)責(zé)與實(shí)際的設(shè)備驅(qū)動(dòng)程序進(jìn)行信息交換。其主要功能包括:
(1)向I/O系統(tǒng)注冊(cè)讀寫和控制函數(shù)。注冊(cè)是在ttyDrv()函數(shù)中完成的。而ttyDrv則調(diào)用iosDrvInstall完成其注冊(cè)功能。其對(duì)I/O系統(tǒng)注冊(cè)的讀寫和控制函數(shù)關(guān)系如表1:
表1 虛擬驅(qū)動(dòng)層與I/O函數(shù)的對(duì)應(yīng)關(guān)系
虛擬驅(qū)動(dòng)層功能上層函數(shù)
ttyOpentty設(shè)備打開函數(shù)open
ttyClosetty設(shè)備關(guān)閉函數(shù)Close
ttyReadtty設(shè)備字符讀取函數(shù)Read
ttyWritetty設(shè)備字符發(fā)送函數(shù)Write
ttyIoctltty設(shè)備控制函數(shù)Ioctl
(2)向設(shè)備驅(qū)動(dòng)層注冊(cè)回調(diào)函數(shù)。
3 驅(qū)動(dòng)程序的設(shè)計(jì)和實(shí)現(xiàn)
3.1 SCC的工作原理
CPM有兩個(gè)雙口RAM,其中0X8000~0X9000這兩個(gè)BANK存放的是參數(shù)RAM;在這段內(nèi)存中,F(xiàn)CC、SCC、SMC、SPI等的參數(shù)RAM的首地址都存放在固定的偏移地址中,對(duì)于SCC1而言,需要將參數(shù)RAM的首地址的值存入到相對(duì)雙端口RAM偏移為0x8000的內(nèi)存中。這樣CPM就可以通過參數(shù)RAM索引找到SCC的參數(shù)RAM,進(jìn)而對(duì)SCC進(jìn)行相應(yīng)操作。參數(shù)RAM中具體包括:發(fā)送/接收緩沖區(qū)描述符(TxBD/RxBD)、RFCR、TFCR、MRBLR 、RSTATE、RBPTR、TSTATE、TBPTR、RCRC、TCRC,其結(jié)構(gòu)如圖2。
圖2 SCC內(nèi)存結(jié)構(gòu)
SCC配置成串口模式的具體流程:
(1)完成參數(shù)RAM的配置,確定發(fā)送/接收緩沖區(qū)描述符(TxBD/RxBD)具體空間地址;
(2)完成CPU I/O通用端口管腳的配置,CPM包含4個(gè)通用目的I/O端口:PA、PB,PC,PD。端口時(shí)每個(gè)引腳都可用于通用目的I/O信號(hào)或外設(shè)接口信號(hào);
(3)為SCC配置波特率發(fā)生器其提供內(nèi)部時(shí)鐘信號(hào);
(4)設(shè)置SCC模式寄存器GSMR,SCC工作在URAT模式下,同時(shí)將TEN、REN比位置1使能SCC的發(fā)送和接收中斷。
3.2 驅(qū)動(dòng)程序的具體流程
可加載的串口SCC驅(qū)動(dòng)程序可以完全脫離移植板級(jí)支持包來實(shí)現(xiàn),主要完成將通信處理模塊CPM的SCC配置成UART控制器來實(shí)現(xiàn)設(shè)備間通過串口的通信。本驅(qū)動(dòng)程序基于VxWorks系統(tǒng)下的庫文件sysSerial.c、m8260Sio.c和m8260Sio.h編寫而成,實(shí)現(xiàn)了初始化、回調(diào)函數(shù)及其所需要的結(jié)構(gòu)體、回調(diào)安裝函數(shù)、發(fā)送接收函數(shù)、I/O控制函數(shù)和中斷服務(wù)程序。其中m8260Sio.h是vxWorks下通用的驅(qū)動(dòng)程序文件。m8260Sio.c用來實(shí)現(xiàn)基本的串口操作的功能,是SCC設(shè)備UART驅(qū)動(dòng)的主體。syserial.c是串口驅(qū)動(dòng)的配置文件,在邏輯上屬于m8260Sio.c的上一級(jí)接口,其具體流程如圖3:
圖3 串口驅(qū)動(dòng)的操作流程
在m8260sio.h中定義了SCC設(shè)備串行I/O通道的數(shù)據(jù)結(jié)構(gòu)M8260_SCC_CHAN,M8260_SCC_CHAN結(jié)構(gòu)體中包括了配置SCC設(shè)備相關(guān)的寄存器以及底層驅(qū)動(dòng)函數(shù)pDrvFuncs。開發(fā)人員如果需要修改串口驅(qū)動(dòng)程序的收發(fā)BD數(shù)目、基址以及SCC通道號(hào),只需重新配置m8260sio.h中的SCC設(shè)備相關(guān)寄存器的值就可以實(shí)現(xiàn)。
m8260Sio.c用來實(shí)現(xiàn)基本的串口操作的功能,包括回調(diào)函數(shù)及其所需要的結(jié)構(gòu)體、回調(diào)安裝函數(shù)、發(fā)送接收函數(shù)、I/O控制函數(shù)和中斷服務(wù)程序,m8260SioDrvFuncs結(jié)構(gòu)體中封裝了串口所需的所有函數(shù),具體實(shí)現(xiàn)如下:
(1)m8260SioIoctlUser(),該函數(shù)通過對(duì)BRG寄存器操作實(shí)現(xiàn)設(shè)置或獲得波特率;通過對(duì)寄存器SCCE和SCCM操作實(shí)現(xiàn)禁止和使能發(fā)送、接收中斷;通過對(duì)模式寄存器PSMR的操作完成包括數(shù)據(jù)位長度、停止位以及奇偶校驗(yàn)的設(shè)置。
(2)m8260SioResetChannelUser(),此函數(shù)完成SCC通道初始化,首先初始化參數(shù)RAM中的參數(shù),建立TxBD、RxBD并初始化每個(gè)BD,包括狀態(tài)/控制字、數(shù)據(jù)長度、對(duì)應(yīng)的緩沖區(qū)地址;接著設(shè)置SMC模式寄存器GSMRH和GSML,使SMC工作在URAT模式,1個(gè)停止位和8個(gè)數(shù)據(jù)位長度,發(fā)送FIFO 是1個(gè)字節(jié),接收FIFO是8個(gè)字節(jié),同時(shí)將TEN、REN比特位置1,使能SCC發(fā)送器和接收器;最后設(shè)置SCCE清除SCC所有的中斷及響應(yīng)事件,設(shè)置SCCM屏蔽發(fā)送、接收中斷。
(3)m8260SioIntUser(),此函數(shù)為串口的中斷服務(wù)程序,當(dāng)串口產(chǎn)生中斷時(shí)間進(jìn)入此函數(shù),首先將SCCM比特位置0屏蔽SCC中斷,當(dāng)處于接收狀態(tài)時(shí),SCC等待第1個(gè)接收字符。如果第1個(gè)RxBD為空,則開始將接收字符存入緩沖區(qū)中。若接收緩沖區(qū)滿或者接收到的空閑字符超過MAX_IDL所設(shè)置的最大空閑字符,則SCC清空狀態(tài)字的比特位同時(shí)發(fā)出中斷請(qǐng)求。當(dāng)接收數(shù)據(jù)超過緩沖區(qū)長度,SCC將會(huì)讀取下一個(gè)空閑的RxBD,繼續(xù)將接收數(shù)據(jù)存入此RxBD的緩沖區(qū)中;當(dāng)處于發(fā)送狀態(tài)時(shí),SCC通過對(duì)TxBD的狀態(tài)/控制字的讀取判斷是否有數(shù)據(jù)發(fā)送,如果有發(fā)送請(qǐng)求,則讀取TxBD的數(shù)據(jù)長度確定需要發(fā)送數(shù)據(jù)的長度,從緩沖區(qū)地址取出數(shù)據(jù)進(jìn)行發(fā)送,同時(shí)向CPM發(fā)中斷請(qǐng)求。
(4)m8260SioStartupUser()、m8260SioPollInputUser()、m8260SioPollOutputUser()等3個(gè)函數(shù)實(shí)現(xiàn)在檢查SCC通道狀態(tài)后,完成串口查詢模式下的發(fā)送或接收,其具體過程與中斷方式下的相同,
(5)m8260SioCallbackInstallUser(),串口回調(diào)函數(shù)。
syserial.c是串口驅(qū)動(dòng)的配置文件,在邏輯上屬于m8260Sio.c的上一級(jí)接口。該文件中的ttyDevInit()通過調(diào)用ttyDevInit0()和ttyDevInit1()將串口初始化到一個(gè)靜止?fàn)顟B(tài)并通過調(diào)用ttyDevCreate()向操作系統(tǒng)注冊(cè)例程。
具體的函數(shù)功能以及實(shí)現(xiàn)如下:
(1)ttyDevInit0(),首先配置管腳資源,設(shè)置CMXSCR寄存器將SCC配置成NMSI模式,選擇SCC所使用的波特率發(fā)生器;接著將SCC參數(shù)RAM的內(nèi)存首地址存入雙口RAM偏移0x8000的內(nèi)存中;完成以上操作后配置SCC設(shè)備相關(guān)的寄存器以及安裝底層驅(qū)動(dòng)函數(shù)pDrvFuncs。
(2)ttyDevInit1(),將SCC中斷向量號(hào)與相應(yīng)的中斷處理函數(shù)m8260SioIntUser進(jìn)行連接,同時(shí)設(shè)置SCCE、SCCM使能發(fā)送和接收中斷事件。
4 結(jié)束語
本文介紹了VxWorks操作系統(tǒng)下基于MPC8270可加載串口設(shè)備驅(qū)動(dòng)的開發(fā)方法,作為可加載的應(yīng)用程序在VxWorks系統(tǒng)內(nèi)核啟動(dòng)后運(yùn)行,基本不涉及BSP文件的修改,方便了用戶驅(qū)動(dòng)程序的加入與調(diào)試,縮短了開發(fā)周期,本串口驅(qū)動(dòng)經(jīng)過長時(shí)間的應(yīng)用和測(cè)試,在整個(gè)系統(tǒng)中運(yùn)行穩(wěn)定,可作為VxWorks下一般串口驅(qū)動(dòng)設(shè)計(jì)的參考。
參考文獻(xiàn):
[1]Motorola.MPC8280PowerQUICC II TMFamily Reference Manual[Z].2004.
[2]Wind River.VxWorks BSPDeveloper,s Guide5.5[Z].2002.
[3]Wind River.TornadoTMPBSP Training Workshop[Z].2002.
作者簡(jiǎn)介:孫志穎(1987-),男,陜西西安人,碩士,研究方向:嵌入式系統(tǒng),助理工程師;林木(1981-),男,陜西西安人,本科,研究方向:嵌入式系統(tǒng),工程師。
作者單位:中航工業(yè)西安航空計(jì)算技術(shù)研究所,西安 710119