新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > vxworks嵌入式操作系統(tǒng)下串行設(shè)備驅(qū)動(dòng)程序開發(fā)思路

        vxworks嵌入式操作系統(tǒng)下串行設(shè)備驅(qū)動(dòng)程序開發(fā)思路

        作者: 時(shí)間:2012-10-09 來(lái)源:網(wǎng)絡(luò) 收藏

        i8250Chan[i].outByte = sysOutByte; /*掛接輸出函數(shù),此函數(shù)向指定的I/O地址寫入1bye*/

        i8250Chan[i].inByte = sysInByte; /*掛接輸出函數(shù),此函數(shù)從指定的I/O地址讀出1byte*/

        i8250HrdInit(i8250Chan[i]);/*調(diào)用i8250HrdInit()進(jìn)一步完成初始化*/

        }

        }

        l i8250HrdInit()

        本函數(shù)完成的主要工作是掛接相應(yīng)的入口函數(shù),具體說(shuō)明如下:

        void i8250HrdInit

        (

        I8250_CHAN * pChan /* 指向相應(yīng)設(shè)備的指針*/

        )

        {

        if (i8250SioDrvFuncs.ioctl == NULL)

        {

        i8250SioDrvFuncs.ioctl = (int (*)())i8250Ioctl;/*掛接用于處理控制I8250相關(guān)輸入

        輸出命令的函數(shù)*/

        i8250SioDrvFuncs.txStartup = (int (*)())i8250Startup;/*如果設(shè)備工作于中斷模式下,

        啟用此函數(shù)用于打開中斷,使設(shè)備開始工作*/

        i8250SioDrvFuncs.callbackInstall = i8250CallbackInstall;/*安裝上層提供的回調(diào)函數(shù),

        本例中是安裝的tyIRd()、tyITx()*/

        i8250SioDrvFuncs.pollInput = (int (*)())i8250PRxChar;/*掛接輸入輪詢函數(shù)*/

        i8250SioDrvFuncs.pollOutput = (int (*)(SIO_CHAN *,char))i8250PTxChar;/*掛接輸出輪詢函數(shù)*/

        }

        pChan->pDrvFuncs = i8250SioDrvFuncs;/*初始化CHAN結(jié)構(gòu),掛接接口函數(shù)列表*/

        i8250InitChannel(pChan); /* reset the channel */

        }

        由上面掛接的函數(shù)可以看出,i8250驅(qū)動(dòng)主要實(shí)現(xiàn)了三個(gè)功能:read、write、ioctl,而并沒(méi)有實(shí)現(xiàn)所有和七項(xiàng)功能。同時(shí),值的注意的是,對(duì)同一種設(shè)備的驅(qū)動(dòng)只需掛接一次。

        同時(shí)ttyDrv通過(guò)SIO_DRV_FUNCS使用xxDrv(i8250Drv)提供的服務(wù),而xxDrv通過(guò)回調(diào)函數(shù)(本例中是由i8250CallbackInstall()安裝的tyIRd()、tyITx())完成ttyDrv提出的請(qǐng)求。原理如下圖示:

        i8250InitChannel()

        本函數(shù)的主要作用是初始化特定的CHAN所描述的信道。具體分析如下。

        statIC void i8250InitChannel

        (

        I8250_CHAN * pChan /* pointer to device */

        )

        {

        int oldLevel;

        ldLevel = intLock (); /*關(guān)中斷進(jìn)入臨界區(qū)*

        (void) i8250BaudSet(pChan, I8250_DEFAULT_BAUD);/*設(shè)置信道的波特率*/

        …………………………………

        intUnlock (oldLevel); /*開中斷響應(yīng),出臨界區(qū)*/

        }

        ⑵ 掛接中斷服務(wù)程序

        對(duì)i8250的硬件初始化完成后,接著掛接相關(guān)的中斷服務(wù)程序。主要有sysSerialHwinit2()函數(shù)完成。需要注意的是,掛接中斷應(yīng)放在系統(tǒng)初始化的最后,主要是因?yàn)橹袛鄴旖雍瘮?shù)iNTCONnect()需要調(diào)用malloc()函數(shù),如果在系統(tǒng)的內(nèi)存分配還未初始化前調(diào)用,則會(huì)出錯(cuò)。下面請(qǐng)看源代碼:

        void sysSerialHwInit2 (void)

        {

        int i;

        for (i=0;i

        if (i8250Chan[i].int_vec)

        {

        (void) intConnect (INUM_TO_IVEC (i8250Chan[i].int_vec), i8250Int, (int)i8250Chan[i] );

        linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)


        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 沂南县| 汽车| 吉安市| 德化县| 巴里| 印江| 建德市| 道真| 普洱| 肇州县| 白朗县| 兴化市| 鄄城县| 习水县| 小金县| 叙永县| 蒙山县| 定陶县| 自贡市| 义马市| 临颍县| 方山县| 南宫市| 苍梧县| 阿鲁科尔沁旗| 宕昌县| 黄梅县| 佛教| 广饶县| 中西区| 淮北市| 岳普湖县| 宜章县| 平利县| 白山市| 弋阳县| 同心县| 岳普湖县| 定州市| 乌拉特前旗| 新河县|