鄧春梅, 董貴山, 王亞棟
(①四川衛士通信息安全平臺技術有限公司,四川 成都610041;②中國電子科技集團公司第三十研究所十部, 四川 成都 610041)
在嵌入式安全平臺的研制項目中,需要解決好多通路并發的串行高速數據傳輸及安全處理問題。如果采用8位的基于8250的通用串口芯片,難以滿足大批量,多通道串口數據的同步接收和發送,為此,需要采用高速串口芯片。本文以 OXFORD 半導體有限公司生產的 OX16PCI958高速串口芯片為對象,研究了在vxworks嵌入式實時系統下高速串行通信驅動的實現技術。OX16PCI958串口芯片,是由PCI接口擴展而出的,是一個帶有32字節,可擴展八路串行通道FIFO的通用異步收發器,通過配置能適應 RS-232/RS-422協議規范應用的需要,能同時支持I/0和內存映射訪問,每路通道最高速率可達115.2 kb/s。標準的VxWorks操作系統缺乏對此高速串口芯片的驅動支持,本文提出了專用的多通道高速串口驅動程序設計,解決了此問題。
在VxWorks系統中,串行設備的驅動程序不是直接安裝在I/O系統中,而是通過虛擬設備ttyDrv來使用。串行設備不但需要支持 I/O系統也需要支持目標機代理接口,同時它還必須支持在中斷或者輪詢2種方式下工作[1]。
如圖1所示的串行設備驅動程序的工作方式。其中,與設備無關的部分已經在虛擬設備ttyDrv中實現,驅動程序開發人員只需要根據系統給出的接口,實現驅動程序并將其安裝到ttyDrv。

圖1 串行設備驅動程序的工作方式
虛擬設備ttyDrv負責管理真實驅動程序與 I/O系統之間的通信[2]。一方面,虛擬設備 ttyDrv將系統的I/O請求作必要處理后,傳遞給設備驅動程序,再通過設備驅動程序來實現實際的 I/O操作;另一方面,虛擬設備ttyDrv將自己的入口點函數掛接在I/O系統上,初始化設備描述符并將其添加到設備列表中。當I/O系統中有請求包到達時,I/O系統會調用ttyDrv提供的相應的函數響應請求。圖2的ttyDrv數據流給出了該過程的數據流向。
[3],函數ttyDrv()調用函數iosDrv Install()將tyRead()、tyWrite()、ttyOpen()、ttyIoctl()等函數加入到驅動程序表中,以供I/O系統調用。
首先初始化設備描述符,然后調用函數tyDevInit()初始化select功能,初始化tyLib,創建信號量,創建輸出輸入緩沖區,最后調用函數iosDevAdd()將設備加到設備列表中并設置設備的工作模式為中斷方式。
當應用程序調用函數write()執行寫操作的時候,數據請求包首先會通過I/O系統傳給ttyDrv,然后運行函數tyWrite(),將用戶緩沖區的內容復制到輸出環形緩沖區,并調用函數xxTxStartUp初始化發送循環,開啟中斷準備發送,最后通過調用中斷服務程序xxIntTx發送字符并清除中斷。I/O系統發送數據操作流程如圖3。
當串口接收到數據時會調用接收中斷服務程序xxRcvInt,將接收的字符寫入指定的緩沖區。然后由回調函數tyIRd()將數據傳給高層協議。當用戶調用read()函數進行讀操作時, I/O系統調用函數tyRead(),將輸入環形隊列中的內容讀入用戶緩沖區。I/O系統接收數據操作流程如圖4。
當應用程序調用函數ioctl()的時候,tty Ioctl()函數直接將命令傳到由用戶編寫的stl6c958ioctl()函數,如果所需要的功能在stl6c958ioctl()中未實現,則調用函數tyIoctl(),如果tyIoctl()調用也失敗,ttyIoctl()才會返回失敗。
基本設計需求如下:①基于 OX16PCI958串口芯片;②支持多任務并發訪問每路串口通道;③支持中斷共享方式,能正確區分是否有效中斷,提高CPU利用率;④支持端口設置,如波特率配置從50BPS---115200BPS、8位有效數據位、奇偶校驗、流控;⑤支持應用程序與芯片間數據的正確交互。
(1)多任務并發訪問設計
為保障驅動程序對多任務并發通信訪問的支持,在驅動程序內部采用了任務鎖(TaskLock)、中斷鎖(IntLock)來保證對臨界資源的唯一修改權,同時確保了必須的連續寄存器操作指令不被打斷。在具體的程序設計中每個通道都有一個獨立的數據結構ST16C958_CHAN與之對應,使每個通道間互不干擾,可并發訪問。
(2)中斷共享設置
中斷是CPU和外部設備進行通信的有效方法,它可以避免因反復查詢外部設備的狀態而浪費CPU時間,從而提高了 CPU的工作效率。首先在sysSerial.c文件的sysSerSerialHwInit()函數中調用函數pciConfigInByte(),參數設為PCI_CFG_DEV_INT_LINE,從寄存器中獲取中斷線,然后調用函數pciIntConnect()掛接中斷回調函數 ST16C958Int(),最后調用函數sysIntEnablePIC()使能共享中斷。在中斷回調函數中必須正確處理共享于同一中斷信號線上的其它設備所產生的中斷。
(3)端口設置
當用戶使用 ioctl()函數訪問虛擬設備 ttyDrv時, I/O系統調用ttyIoctl()函數, ttyIoctl()則接著訪問函數ST16C958Ioctl(),ST16C958Ioctl ()函數中主要實現波特率的設置、查詢,工作模式的設置及查詢等。
(4)應用程序串口訪問數據交互設計
1)初始化,首先操作系統要能夠正確識別該接口芯片、建立虛擬設備節點、映射基地址及掛接中斷,這就需要修改VxWorks系統config目錄下與嵌入式平臺的CPU相對應的文件夾中的sysSerial.c和sysSerail.h兩個文件,在 sysSerialHwlnit()函數中對接口芯片進行初始化,獲取基地址,設置讀寫及中斷回調函數, 設置初始狀態, 建立虛擬設備節點與驅動程序的關鍵數據結構ST16C958_ CHAN (如圖5所示)的對應關系。芯片內的每個關鍵寄存器的正確設置,關系到是否能讓芯片正確運轉,如PCI設置寄存器,異步收發中斷狀態寄存器,異步收發時鐘寄存器,EEPROM控制寄存器等。最后在syslib.c文件中的 sysHwInit()函數中調用 sysSerialHwInit()函數實現串口芯片的初始化,而這個過程是在Vxworks系統內核初始化之前完成的。
2)數據收發,當應用程序調用 write 函數發送數據時,IO請求包將會通過I/O系統傳給ttyDrv,使tyWrite()開始運行。tyWrite開始執行后,將會把用戶數據拷貝到 ttyDrv的環形緩沖區中,并調用ST16C958Startup()開始一個發送周期。每一次中斷,設備都會通過中斷服務程序發送一個或多個字節。ST16C958Startup()的任務包括初始化發送循環,開啟中斷準備發送。當硬中斷回調函數ST16C958Int()發現有數據需要發送時,則調用ST16C958PTxChar ()從高層協議驅除字符并將其傳送出去同時清除響應中斷,如果此時高層協議不再傳送數據,則重置傳送中斷,完成一個傳送周期,等待ST16C958Startup()開啟另一個傳送循環。當有數據收中斷產生時,ST16C958PRxChar()函數就從設備中接收數據并傳送到高層協議。
typedef struct{ /* ST16C958_CHAN */
SIO_DRV_FUNCS * pDrvFuncs;/* 驅動程序所需的
函數 */
STATUS (*getTxChar) ();/* 傳送函數指針 */
STATUS (*putRcvChar) ();/* 接收函數指針 */
void * getTxArg;
void * putRcvArg;
UINT16 int_vec;/* 中斷向量 */
UINT16 channelMode; /* 模式中斷或輪詢 */
UCHAR (*inByte) (int); /* 從硬件讀取一個字節
函數指針 */
void (*outByte)(int,char); /* 向硬件寫入一個
字節函數指針 */
ULONG lcr; /* 在線控制寄存器 */
ULONG lst; /* 在線狀態寄存器 */
ULONG mdc; /* MODEM控制寄存器*/
ULONG msr; /* MODEM狀態寄存器 */
ULONG ier; /* 中斷使能寄存器 */
ULONG iid; /* 中斷狀態寄存器*/
ULONG brdl; /* 波特率寄存器*/
ULONG brdh; /*波特率寄存器*/
ULONG data; /* 數據寄存器 */
ULONG options;
ULONG fcr; /* FIFO狀態寄存器*/
ULONG spr;
} ST16C958_CHAN;
通過測試,證明該驅動程序能夠在50~115 200 b/s的速率下正確傳送數據,且在多任務同時訪問不同的串口虛擬通道時,每個串口通道都能夠以 50~115 200 b/s的速率正確工作,且相互間互不干擾。
本文針對基于vxworks的嵌入式安全平臺缺乏對高速多通道串口芯片驅動支持的問題,提出了vxworks下基于0X16PCI958芯片的多串口的驅動程序設計,實現了八通道串口通信驅動能力,并通過任務鎖、中斷鎖及數據結構的合理運用達到了較好的效果。進一步,通過對串口配置寄存器的設置進行優化,并通過驅動模塊內部嵌入密碼運算過程,可以實現穩定的數據傳輸,并可實現該安全平臺的高速串行數據通信和加解密處理。本文的研究成果,對廣泛采用vxworks系統的嵌入式安全平臺的研制,有較高的實用價值。
參考文獻
[1] Wind River Inc.Tornado BSP Developer's Kit for VxWorks User's Guide[EB/OL].(1999-02-11)[2011-10-01]. http://www.vxdev.com/html/42/756.htm.
[2] Wind River Inc. VxWorks BSP Reference[EB/OL].(2000-10-11)[2011-10-01].http://www-kryo.desy.d e/.../vxWorks/.../VxWorks_BSP.
[3] 周啟平,張楊.VxWorks下設備驅動程序及BSP開發指南[M].北京:中國電力出版社,2004.