新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > vxworks嵌入式操作系統下串行設備驅動程序開發思路

        vxworks嵌入式操作系統下串行設備驅動程序開發思路

        作者: 時間:2012-10-09 來源:網絡 收藏

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

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

        i8250HrdInit(i8250Chan[i]);/*調用i8250HrdInit()進一步完成初始化*/

        }

        }

        l i8250HrdInit()

        本函數完成的主要工作是掛接相應的入口函數,具體說明如下:

        void i8250HrdInit

        (

        I8250_CHAN * pChan /* 指向相應設備的指針*/

        )

        {

        if (i8250SioDrvFuncs.ioctl == NULL)

        {

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

        輸出命令的函數*/

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

        啟用此函數用于打開中斷,使設備開始工作*/

        i8250SioDrvFuncs.callbackInstall = i8250CallbackInstall;/*安裝上層提供的回調函數,

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

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

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

        }

        pChan->pDrvFuncs = i8250SioDrvFuncs;/*初始化CHAN結構,掛接接口函數列表*/

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

        }

        由上面掛接的函數可以看出,i8250驅動主要實現了三個功能:read、write、ioctl,而并沒有實現所有和七項功能。同時,值的注意的是,對同一種設備的驅動只需掛接一次。

        同時ttyDrv通過SIO_DRV_FUNCS使用xxDrv(i8250Drv)提供的服務,而xxDrv通過回調函數(本例中是由i8250CallbackInstall()安裝的tyIRd()、tyITx())完成ttyDrv提出的請求。原理如下圖示:

        i8250InitChannel()

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

        statIC void i8250InitChannel

        (

        I8250_CHAN * pChan /* pointer to device */

        )

        {

        int oldLevel;

        ldLevel = intLock (); /*關中斷進入臨界區*

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

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

        intUnlock (oldLevel); /*開中斷響應,出臨界區*/

        }

        ⑵ 掛接中斷服務程序

        對i8250的硬件初始化完成后,接著掛接相關的中斷服務程序。主要有sysSerialHwinit2()函數完成。需要注意的是,掛接中斷應放在系統初始化的最后,主要是因為中斷掛接函數iNTCONnect()需要調用malloc()函數,如果在系統的內存分配還未初始化前調用,則會出錯。下面請看源代碼:

        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操作系統文章專題:linux操作系統詳解(linux不再難懂)


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 澄城县| 鱼台县| 蛟河市| 壶关县| 谢通门县| 宁海县| 广水市| 丘北县| 昌吉市| 仁化县| 广汉市| 建瓯市| 屏南县| 宽城| 犍为县| 石狮市| 成安县| 贵定县| 泗洪县| 邢台市| 桑植县| 特克斯县| 桐梓县| 台湾省| 梅河口市| 阜平县| 扶沟县| 宕昌县| 左云县| 临海市| 攀枝花市| 洛南县| 鲜城| 基隆市| 大化| 区。| 城口县| 青岛市| 五台县| 迭部县| 衡山县|