• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    VxWorks下MPC8270可加載串口驅(qū)動(dòng)設(shè)計(jì)

    2014-04-29 00:00:00孫志穎林木

    摘 要:以基于MPC8270串口驅(qū)動(dòng)為例,分析了VxWorks下串口驅(qū)動(dòng)的層次和機(jī)理,研究了ttyDrv驅(qū)動(dòng)和MPC8270的SCC接口的工作原理。通過(guò)對(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)程序的一般是通過(guò)對(duì)板級(jí)支持包(BSP)中文件的修改嵌入到操作系統(tǒng)內(nèi)核中,每次修改必須重新編譯操作系統(tǒng),這種方式不僅浪費(fèi)大量時(shí)間,而且無(wú)法準(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)后以庫(kù)文件的形式加載,不涉及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)程序的開(kāi)發(fā)模式一般是分層設(shè)計(jì)的,分為應(yīng)用層、虛擬驅(qū)動(dòng)層和設(shè)備驅(qū)動(dòng)層。其中最重要的就是操作系統(tǒng)內(nèi)核提供虛擬驅(qū)動(dòng)層。它將用戶層和設(shè)備驅(qū)動(dòng)層隔離開(kāi)來(lái),這種隔離使得底層驅(qū)動(dòng)開(kāi)發(fā)人員只需根據(jù)系統(tǒng)給出的接口實(shí)現(xiàn)驅(qū)動(dòng)程序,并將其掛接到虛擬設(shè)備層上即可。

    串行設(shè)備是一種特殊的設(shè)備驅(qū)動(dòng)程序,在串口驅(qū)動(dòng)程序中與硬件設(shè)備無(wú)關(guān)的虛擬驅(qū)動(dòng)層由WindRiver在VxWorks的虛擬設(shè)備ttyDrv中實(shí)現(xiàn),具體結(jié)構(gòu)如圖1所示。

    圖1 串行設(shè)備驅(qū)動(dòng)程序的開(kāi)發(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è)備打開(kāi)函數(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就可以通過(guò)參數(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í)支持包來(lái)實(shí)現(xiàn),主要完成將通信處理模塊CPM的SCC配置成UART控制器來(lái)實(shí)現(xiàn)設(shè)備間通過(guò)串口的通信。本驅(qū)動(dòng)程序基于VxWorks系統(tǒng)下的庫(kù)文件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用來(lái)實(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。開(kāi)發(fā)人員如果需要修改串口驅(qū)動(dòng)程序的收發(fā)BD數(shù)目、基址以及SCC通道號(hào),只需重新配置m8260sio.h中的SCC設(shè)備相關(guān)寄存器的值就可以實(shí)現(xiàn)。

    m8260Sio.c用來(lái)實(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ù)通過(guò)對(duì)BRG寄存器操作實(shí)現(xiàn)設(shè)置或獲得波特率;通過(guò)對(duì)寄存器SCCE和SCCM操作實(shí)現(xiàn)禁止和使能發(fā)送、接收中斷;通過(guò)對(duì)模式寄存器PSMR的操作完成包括數(shù)據(jù)位長(zhǎng)度、停止位以及奇偶校驗(yàn)的設(shè)置。

    (2)m8260SioResetChannelUser(),此函數(shù)完成SCC通道初始化,首先初始化參數(shù)RAM中的參數(shù),建立TxBD、RxBD并初始化每個(gè)BD,包括狀態(tài)/控制字、數(shù)據(jù)長(zhǎng)度、對(duì)應(yīng)的緩沖區(qū)地址;接著設(shè)置SMC模式寄存器GSMRH和GSML,使SMC工作在URAT模式,1個(gè)停止位和8個(gè)數(shù)據(jù)位長(zhǎng)度,發(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為空,則開(kāi)始將接收字符存入緩沖區(qū)中。若接收緩沖區(qū)滿或者接收到的空閑字符超過(guò)MAX_IDL所設(shè)置的最大空閑字符,則SCC清空狀態(tài)字的比特位同時(shí)發(fā)出中斷請(qǐng)求。當(dāng)接收數(shù)據(jù)超過(guò)緩沖區(qū)長(zhǎng)度,SCC將會(huì)讀取下一個(gè)空閑的RxBD,繼續(xù)將接收數(shù)據(jù)存入此RxBD的緩沖區(qū)中;當(dāng)處于發(fā)送狀態(tài)時(shí),SCC通過(guò)對(duì)TxBD的狀態(tài)/控制字的讀取判斷是否有數(shù)據(jù)發(fā)送,如果有發(fā)送請(qǐng)求,則讀取TxBD的數(shù)據(jù)長(zhǎng)度確定需要發(fā)送數(shù)據(jù)的長(zhǎng)度,從緩沖區(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ā)送或接收,其具體過(guò)程與中斷方式下的相同,

    (5)m8260SioCallbackInstallUser(),串口回調(diào)函數(shù)。

    syserial.c是串口驅(qū)動(dòng)的配置文件,在邏輯上屬于m8260Sio.c的上一級(jí)接口。該文件中的ttyDevInit()通過(guò)調(diào)用ttyDevInit0()和ttyDevInit1()將串口初始化到一個(gè)靜止?fàn)顟B(tài)并通過(guò)調(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é)束語(yǔ)

    本文介紹了VxWorks操作系統(tǒng)下基于MPC8270可加載串口設(shè)備驅(qū)動(dòng)的開(kāi)發(fā)方法,作為可加載的應(yīng)用程序在VxWorks系統(tǒng)內(nèi)核啟動(dòng)后運(yùn)行,基本不涉及BSP文件的修改,方便了用戶驅(qū)動(dòng)程序的加入與調(diào)試,縮短了開(kāi)發(fā)周期,本串口驅(qū)動(dòng)經(jīng)過(guò)長(zhǎ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

    洪泽县| 麟游县| 南投市| 万年县| 江西省| 安康市| 靖江市| 北海市| 中方县| 襄汾县| 哈密市| 玉环县| 襄汾县| 故城县| 米林县| 济源市| 荔波县| 灵台县| 涿鹿县| 广南县| 寿阳县| 定结县| 南皮县| 台安县| 微博| 馆陶县| 沧源| 南宫市| 泰州市| 西丰县| 玛沁县| 民乐县| 肇庆市| 华池县| 丽水市| 昌宁县| 怀宁县| 察雅县| 格尔木市| 凤山市| 白城市|