• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      VxWorks下多串口卡驅(qū)動(dòng)程序設(shè)計(jì)

      2012-08-13 05:57:00鄧春梅董貴山王亞棟
      通信技術(shù) 2012年1期
      關(guān)鍵詞:驅(qū)動(dòng)程序調(diào)用寄存器

      鄧春梅, 董貴山, 王亞棟

      (①四川衛(wèi)士通信息安全平臺(tái)技術(shù)有限公司,四川 成都610041;②中國電子科技集團(tuán)公司第三十研究所十部, 四川 成都 610041)

      0 引言

      在嵌入式安全平臺(tái)的研制項(xiàng)目中,需要解決好多通路并發(fā)的串行高速數(shù)據(jù)傳輸及安全處理問題。如果采用8位的基于8250的通用串口芯片,難以滿足大批量,多通道串口數(shù)據(jù)的同步接收和發(fā)送,為此,需要采用高速串口芯片。本文以 OXFORD 半導(dǎo)體有限公司生產(chǎn)的 OX16PCI958高速串口芯片為對象,研究了在vxworks嵌入式實(shí)時(shí)系統(tǒng)下高速串行通信驅(qū)動(dòng)的實(shí)現(xiàn)技術(shù)。OX16PCI958串口芯片,是由PCI接口擴(kuò)展而出的,是一個(gè)帶有32字節(jié),可擴(kuò)展八路串行通道FIFO的通用異步收發(fā)器,通過配置能適應(yīng) RS-232/RS-422協(xié)議規(guī)范應(yīng)用的需要,能同時(shí)支持I/0和內(nèi)存映射訪問,每路通道最高速率可達(dá)115.2 kb/s。標(biāo)準(zhǔn)的VxWorks操作系統(tǒng)缺乏對此高速串口芯片的驅(qū)動(dòng)支持,本文提出了專用的多通道高速串口驅(qū)動(dòng)程序設(shè)計(jì),解決了此問題。

      1 VxWorks串口驅(qū)動(dòng)程序的架構(gòu)

      1.1 基本框架

      在VxWorks系統(tǒng)中,串行設(shè)備的驅(qū)動(dòng)程序不是直接安裝在I/O系統(tǒng)中,而是通過虛擬設(shè)備ttyDrv來使用。串行設(shè)備不但需要支持 I/O系統(tǒng)也需要支持目標(biāo)機(jī)代理接口,同時(shí)它還必須支持在中斷或者輪詢2種方式下工作[1]。

      如圖1所示的串行設(shè)備驅(qū)動(dòng)程序的工作方式。其中,與設(shè)備無關(guān)的部分已經(jīng)在虛擬設(shè)備ttyDrv中實(shí)現(xiàn),驅(qū)動(dòng)程序開發(fā)人員只需要根據(jù)系統(tǒng)給出的接口,實(shí)現(xiàn)驅(qū)動(dòng)程序并將其安裝到ttyDrv。

      圖1 串行設(shè)備驅(qū)動(dòng)程序的工作方式

      虛擬設(shè)備ttyDrv負(fù)責(zé)管理真實(shí)驅(qū)動(dòng)程序與 I/O系統(tǒng)之間的通信[2]。一方面,虛擬設(shè)備 ttyDrv將系統(tǒng)的I/O請求作必要處理后,傳遞給設(shè)備驅(qū)動(dòng)程序,再通過設(shè)備驅(qū)動(dòng)程序來實(shí)現(xiàn)實(shí)際的 I/O操作;另一方面,虛擬設(shè)備ttyDrv將自己的入口點(diǎn)函數(shù)掛接在I/O系統(tǒng)上,初始化設(shè)備描述符并將其添加到設(shè)備列表中。當(dāng)I/O系統(tǒng)中有請求包到達(dá)時(shí),I/O系統(tǒng)會(huì)調(diào)用ttyDrv提供的相應(yīng)的函數(shù)響應(yīng)請求。圖2的ttyDrv數(shù)據(jù)流給出了該過程的數(shù)據(jù)流向。

      1.2 驅(qū)動(dòng)程序函數(shù)模塊注冊

      [3],函數(shù)ttyDrv()調(diào)用函數(shù)iosDrv Install()將tyRead()、tyWrite()、ttyOpen()、ttyIoctl()等函數(shù)加入到驅(qū)動(dòng)程序表中,以供I/O系統(tǒng)調(diào)用。

      1.3 專用串口設(shè)備的創(chuàng)建

      首先初始化設(shè)備描述符,然后調(diào)用函數(shù)tyDevInit()初始化select功能,初始化tyLib,創(chuàng)建信號量,創(chuàng)建輸出輸入緩沖區(qū),最后調(diào)用函數(shù)iosDevAdd()將設(shè)備加到設(shè)備列表中并設(shè)置設(shè)備的工作模式為中斷方式。

      1.4 設(shè)備讀、寫操作實(shí)現(xiàn)

      當(dāng)應(yīng)用程序調(diào)用函數(shù)write()執(zhí)行寫操作的時(shí)候,數(shù)據(jù)請求包首先會(huì)通過I/O系統(tǒng)傳給ttyDrv,然后運(yùn)行函數(shù)tyWrite(),將用戶緩沖區(qū)的內(nèi)容復(fù)制到輸出環(huán)形緩沖區(qū),并調(diào)用函數(shù)xxTxStartUp初始化發(fā)送循環(huán),開啟中斷準(zhǔn)備發(fā)送,最后通過調(diào)用中斷服務(wù)程序xxIntTx發(fā)送字符并清除中斷。I/O系統(tǒng)發(fā)送數(shù)據(jù)操作流程如圖3。

      當(dāng)串口接收到數(shù)據(jù)時(shí)會(huì)調(diào)用接收中斷服務(wù)程序xxRcvInt,將接收的字符寫入指定的緩沖區(qū)。然后由回調(diào)函數(shù)tyIRd()將數(shù)據(jù)傳給高層協(xié)議。當(dāng)用戶調(diào)用read()函數(shù)進(jìn)行讀操作時(shí), I/O系統(tǒng)調(diào)用函數(shù)tyRead(),將輸入環(huán)形隊(duì)列中的內(nèi)容讀入用戶緩沖區(qū)。I/O系統(tǒng)接收數(shù)據(jù)操作流程如圖4。

      1.5 其他功能函數(shù)擴(kuò)展

      當(dāng)應(yīng)用程序調(diào)用函數(shù)ioctl()的時(shí)候,tty Ioctl()函數(shù)直接將命令傳到由用戶編寫的stl6c958ioctl()函數(shù),如果所需要的功能在stl6c958ioctl()中未實(shí)現(xiàn),則調(diào)用函數(shù)tyIoctl(),如果tyIoctl()調(diào)用也失敗,ttyIoctl()才會(huì)返回失敗。

      2 VxWorks下多通道串口驅(qū)動(dòng)程序設(shè)計(jì)

      2.1 基本設(shè)計(jì)需求

      基本設(shè)計(jì)需求如下:①基于 OX16PCI958串口芯片;②支持多任務(wù)并發(fā)訪問每路串口通道;③支持中斷共享方式,能正確區(qū)分是否有效中斷,提高CPU利用率;④支持端口設(shè)置,如波特率配置從50BPS---115200BPS、8位有效數(shù)據(jù)位、奇偶校驗(yàn)、流控;⑤支持應(yīng)用程序與芯片間數(shù)據(jù)的正確交互。

      2.2 設(shè)計(jì)要點(diǎn)

      (1)多任務(wù)并發(fā)訪問設(shè)計(jì)

      為保障驅(qū)動(dòng)程序?qū)Χ嗳蝿?wù)并發(fā)通信訪問的支持,在驅(qū)動(dòng)程序內(nèi)部采用了任務(wù)鎖(TaskLock)、中斷鎖(IntLock)來保證對臨界資源的唯一修改權(quán),同時(shí)確保了必須的連續(xù)寄存器操作指令不被打斷。在具體的程序設(shè)計(jì)中每個(gè)通道都有一個(gè)獨(dú)立的數(shù)據(jù)結(jié)構(gòu)ST16C958_CHAN與之對應(yīng),使每個(gè)通道間互不干擾,可并發(fā)訪問。

      (2)中斷共享設(shè)置

      中斷是CPU和外部設(shè)備進(jìn)行通信的有效方法,它可以避免因反復(fù)查詢外部設(shè)備的狀態(tài)而浪費(fèi)CPU時(shí)間,從而提高了 CPU的工作效率。首先在sysSerial.c文件的sysSerSerialHwInit()函數(shù)中調(diào)用函數(shù)pciConfigInByte(),參數(shù)設(shè)為PCI_CFG_DEV_INT_LINE,從寄存器中獲取中斷線,然后調(diào)用函數(shù)pciIntConnect()掛接中斷回調(diào)函數(shù) ST16C958Int(),最后調(diào)用函數(shù)sysIntEnablePIC()使能共享中斷。在中斷回調(diào)函數(shù)中必須正確處理共享于同一中斷信號線上的其它設(shè)備所產(chǎn)生的中斷。

      (3)端口設(shè)置

      當(dāng)用戶使用 ioctl()函數(shù)訪問虛擬設(shè)備 ttyDrv時(shí), I/O系統(tǒng)調(diào)用ttyIoctl()函數(shù), ttyIoctl()則接著訪問函數(shù)ST16C958Ioctl(),ST16C958Ioctl ()函數(shù)中主要實(shí)現(xiàn)波特率的設(shè)置、查詢,工作模式的設(shè)置及查詢等。

      (4)應(yīng)用程序串口訪問數(shù)據(jù)交互設(shè)計(jì)

      1)初始化,首先操作系統(tǒng)要能夠正確識(shí)別該接口芯片、建立虛擬設(shè)備節(jié)點(diǎn)、映射基地址及掛接中斷,這就需要修改VxWorks系統(tǒng)config目錄下與嵌入式平臺(tái)的CPU相對應(yīng)的文件夾中的sysSerial.c和sysSerail.h兩個(gè)文件,在 sysSerialHwlnit()函數(shù)中對接口芯片進(jìn)行初始化,獲取基地址,設(shè)置讀寫及中斷回調(diào)函數(shù), 設(shè)置初始狀態(tài), 建立虛擬設(shè)備節(jié)點(diǎn)與驅(qū)動(dòng)程序的關(guān)鍵數(shù)據(jù)結(jié)構(gòu)ST16C958_ CHAN (如圖5所示)的對應(yīng)關(guān)系。芯片內(nèi)的每個(gè)關(guān)鍵寄存器的正確設(shè)置,關(guān)系到是否能讓芯片正確運(yùn)轉(zhuǎn),如PCI設(shè)置寄存器,異步收發(fā)中斷狀態(tài)寄存器,異步收發(fā)時(shí)鐘寄存器,EEPROM控制寄存器等。最后在syslib.c文件中的 sysHwInit()函數(shù)中調(diào)用 sysSerialHwInit()函數(shù)實(shí)現(xiàn)串口芯片的初始化,而這個(gè)過程是在Vxworks系統(tǒng)內(nèi)核初始化之前完成的。

      2)數(shù)據(jù)收發(fā),當(dāng)應(yīng)用程序調(diào)用 write 函數(shù)發(fā)送數(shù)據(jù)時(shí),IO請求包將會(huì)通過I/O系統(tǒng)傳給ttyDrv,使tyWrite()開始運(yùn)行。tyWrite開始執(zhí)行后,將會(huì)把用戶數(shù)據(jù)拷貝到 ttyDrv的環(huán)形緩沖區(qū)中,并調(diào)用ST16C958Startup()開始一個(gè)發(fā)送周期。每一次中斷,設(shè)備都會(huì)通過中斷服務(wù)程序發(fā)送一個(gè)或多個(gè)字節(jié)。ST16C958Startup()的任務(wù)包括初始化發(fā)送循環(huán),開啟中斷準(zhǔn)備發(fā)送。當(dāng)硬中斷回調(diào)函數(shù)ST16C958Int()發(fā)現(xiàn)有數(shù)據(jù)需要發(fā)送時(shí),則調(diào)用ST16C958PTxChar ()從高層協(xié)議驅(qū)除字符并將其傳送出去同時(shí)清除響應(yīng)中斷,如果此時(shí)高層協(xié)議不再傳送數(shù)據(jù),則重置傳送中斷,完成一個(gè)傳送周期,等待ST16C958Startup()開啟另一個(gè)傳送循環(huán)。當(dāng)有數(shù)據(jù)收中斷產(chǎn)生時(shí),ST16C958PRxChar()函數(shù)就從設(shè)備中接收數(shù)據(jù)并傳送到高層協(xié)議。

      typedef struct{ /* ST16C958_CHAN */

      SIO_DRV_FUNCS * pDrvFuncs;/* 驅(qū)動(dòng)程序所需的

      函數(shù) */

      STATUS (*getTxChar) ();/* 傳送函數(shù)指針 */

      STATUS (*putRcvChar) ();/* 接收函數(shù)指針 */

      void * getTxArg;

      void * putRcvArg;

      UINT16 int_vec;/* 中斷向量 */

      UINT16 channelMode; /* 模式中斷或輪詢 */

      UCHAR (*inByte) (int); /* 從硬件讀取一個(gè)字節(jié)

      函數(shù)指針 */

      void (*outByte)(int,char); /* 向硬件寫入一個(gè)

      字節(jié)函數(shù)指針 */

      ULONG lcr; /* 在線控制寄存器 */

      ULONG lst; /* 在線狀態(tài)寄存器 */

      ULONG mdc; /* MODEM控制寄存器*/

      ULONG msr; /* MODEM狀態(tài)寄存器 */

      ULONG ier; /* 中斷使能寄存器 */

      ULONG iid; /* 中斷狀態(tài)寄存器*/

      ULONG brdl; /* 波特率寄存器*/

      ULONG brdh; /*波特率寄存器*/

      ULONG data; /* 數(shù)據(jù)寄存器 */

      ULONG options;

      ULONG fcr; /* FIFO狀態(tài)寄存器*/

      ULONG spr;

      } ST16C958_CHAN;

      2.3 實(shí)驗(yàn)效果

      通過測試,證明該驅(qū)動(dòng)程序能夠在50~115 200 b/s的速率下正確傳送數(shù)據(jù),且在多任務(wù)同時(shí)訪問不同的串口虛擬通道時(shí),每個(gè)串口通道都能夠以 50~115 200 b/s的速率正確工作,且相互間互不干擾。

      3 結(jié)語

      本文針對基于vxworks的嵌入式安全平臺(tái)缺乏對高速多通道串口芯片驅(qū)動(dòng)支持的問題,提出了vxworks下基于0X16PCI958芯片的多串口的驅(qū)動(dòng)程序設(shè)計(jì),實(shí)現(xiàn)了八通道串口通信驅(qū)動(dòng)能力,并通過任務(wù)鎖、中斷鎖及數(shù)據(jù)結(jié)構(gòu)的合理運(yùn)用達(dá)到了較好的效果。進(jìn)一步,通過對串口配置寄存器的設(shè)置進(jìn)行優(yōu)化,并通過驅(qū)動(dòng)模塊內(nèi)部嵌入密碼運(yùn)算過程,可以實(shí)現(xiàn)穩(wěn)定的數(shù)據(jù)傳輸,并可實(shí)現(xiàn)該安全平臺(tái)的高速串行數(shù)據(jù)通信和加解密處理。本文的研究成果,對廣泛采用vxworks系統(tǒng)的嵌入式安全平臺(tái)的研制,有較高的實(shí)用價(jià)值。

      參考文獻(xiàn)

      [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下設(shè)備驅(qū)動(dòng)程序及BSP開發(fā)指南[M].北京:中國電力出版社,2004.

      猜你喜歡
      驅(qū)動(dòng)程序調(diào)用寄存器
      Lite寄存器模型的設(shè)計(jì)與實(shí)現(xiàn)
      核電項(xiàng)目物項(xiàng)調(diào)用管理的應(yīng)用研究
      LabWindows/CVI下基于ActiveX技術(shù)的Excel調(diào)用
      分簇結(jié)構(gòu)向量寄存器分配策略研究*
      基于系統(tǒng)調(diào)用的惡意軟件檢測技術(shù)研究
      利用RFC技術(shù)實(shí)現(xiàn)SAP系統(tǒng)接口通信
      高速數(shù)模轉(zhuǎn)換器AD9779/AD9788的應(yīng)用
      一種可重構(gòu)線性反饋移位寄存器設(shè)計(jì)
      驅(qū)動(dòng)程序更新與推薦
      驅(qū)動(dòng)程序更新與推薦
      潞城市| 龙江县| 广州市| 东乌珠穆沁旗| 抚顺县| 明星| 红河县| 万源市| 噶尔县| 射洪县| 夏津县| 六枝特区| 纳雍县| 和龙市| 大英县| 礼泉县| 来凤县| 白水县| 财经| 青阳县| 富锦市| 宁波市| 江都市| 内江市| 巴彦淖尔市| 鹤壁市| 富锦市| 林甸县| 湘潭县| 临海市| 阆中市| 长海县| 手游| 金阳县| 鸡东县| 永昌县| 博湖县| 泰兴市| 获嘉县| SHOW| 柳河县|