VxWorks操作系統(tǒng)下CPCI總線(xiàn)數(shù)字量輸入功能單元驅(qū)動(dòng)程序設(shè)計(jì)方法
【專(zhuān)利摘要】VxWorks操作系統(tǒng)下CPCI總線(xiàn)數(shù)字量輸入功能單元驅(qū)動(dòng)程序設(shè)計(jì)方法,屬于數(shù)字量輸入功能模塊驅(qū)動(dòng)程序開(kāi)發(fā)領(lǐng)域。為了解決傳統(tǒng)的VxWorks操作系統(tǒng)下基于CPCI總線(xiàn)的數(shù)字量輸入模塊驅(qū)動(dòng)程序開(kāi)發(fā)存在驅(qū)動(dòng)開(kāi)發(fā)人員需要抽象出設(shè)備的數(shù)據(jù)結(jié)構(gòu),完成設(shè)備的創(chuàng)建及設(shè)備驅(qū)動(dòng)程序的安裝的復(fù)雜過(guò)程,給驅(qū)動(dòng)開(kāi)發(fā)人員帶來(lái)了很多不便的問(wèn)題。數(shù)字量輸入功能模塊運(yùn)行CPCI機(jī)箱中,應(yīng)用程序運(yùn)行在控制計(jì)算機(jī)上,通過(guò)CPCI總線(xiàn)實(shí)現(xiàn)對(duì)數(shù)字量輸入功能模塊的控制,數(shù)字量輸入功能模塊的驅(qū)動(dòng)程序設(shè)計(jì)主要包括初始化設(shè)備,功能函數(shù)接口的實(shí)現(xiàn)及封裝。實(shí)現(xiàn)對(duì)數(shù)字量輸入功能模塊的控制,面向應(yīng)用程序直接定義驅(qū)動(dòng)接口的形式,直接封裝功能接口函數(shù)。
【專(zhuān)利說(shuō)明】VxWorks操作系統(tǒng)下CPCI總線(xiàn)數(shù)字量輸入功能單元驅(qū)動(dòng)程序設(shè)計(jì)方法
【技術(shù)領(lǐng)域】
[0001]本發(fā)明涉及VxWorks操作系統(tǒng)下CPCI總線(xiàn)數(shù)字量輸入功能單元驅(qū)動(dòng)程序設(shè)計(jì)方法,屬于數(shù)字量輸入功能模塊驅(qū)動(dòng)程序開(kāi)發(fā)領(lǐng)域。
【背景技術(shù)】
[0002]Vxfforks操作系統(tǒng)下CPCI總線(xiàn)數(shù)字量輸入功能模塊作為自動(dòng)測(cè)試系統(tǒng)中重要的測(cè)試模塊,已廣泛的應(yīng)用于各個(gè)領(lǐng)域。傳統(tǒng)的VxWorks操作系統(tǒng)下基于CPCI總線(xiàn)的數(shù)字量輸入模塊驅(qū)動(dòng)程序開(kāi)發(fā),是根據(jù)需要,實(shí)現(xiàn)相應(yīng)的功能函數(shù)接口,并封裝成標(biāo)準(zhǔn)的I/O接口(七個(gè)標(biāo)準(zhǔn)的I/o接口,例如open O, close O, read O等),注冊(cè)到系統(tǒng)驅(qū)動(dòng)列表中,掛接在I/O子系統(tǒng)下。在整個(gè)過(guò)程中,驅(qū)動(dòng)開(kāi)發(fā)人員需要抽象出設(shè)備的數(shù)據(jù)結(jié)構(gòu),完成設(shè)備的創(chuàng)建及設(shè)備驅(qū)動(dòng)程序的安裝,這個(gè)過(guò)程比較復(fù)雜,給驅(qū)動(dòng)開(kāi)發(fā)人員帶來(lái)了很多不便。
[0003]針對(duì)上述問(wèn)題,本發(fā)明提出了 VxWorks操作系統(tǒng)下CPCI總線(xiàn)數(shù)字量輸入模塊的驅(qū)動(dòng)程序設(shè)計(jì)及封裝,根據(jù)對(duì)數(shù)字量輸入功能模塊的常見(jiàn)操作,提出一種新的數(shù)字量輸入驅(qū)動(dòng)接口封裝形式,以實(shí)現(xiàn)對(duì)數(shù)字量輸入功能模塊有效控制的同時(shí),可以大大降低驅(qū)動(dòng)開(kāi)發(fā)人員的開(kāi)發(fā)難度。
【發(fā)明內(nèi)容】
[0004]本發(fā)明的目的是發(fā)明一種VxWorks操作系統(tǒng)下CPCI總線(xiàn)數(shù)字量輸入功能模塊的驅(qū)動(dòng)程序設(shè)計(jì)方法,以解決傳統(tǒng)的VxWorks操作系統(tǒng)下基于CPCI總線(xiàn)的數(shù)字量輸入模塊驅(qū)動(dòng)程序開(kāi)發(fā)存在驅(qū)動(dòng)開(kāi)發(fā)人員需要抽象出設(shè)備的數(shù)據(jù)結(jié)構(gòu),完成設(shè)備的創(chuàng)建及設(shè)備驅(qū)動(dòng)程序的安裝的復(fù)雜過(guò)程,給驅(qū)動(dòng)開(kāi)發(fā)人員帶來(lái)了很多不便的問(wèn)題。
[0005]本發(fā)明為解決上述技術(shù)問(wèn)題采取的技術(shù)方案是:
[0006]一種VxWorks操作系統(tǒng)下CPCI總線(xiàn)數(shù)字量輸入功能單元驅(qū)動(dòng)程序設(shè)計(jì)方法,所述方法的具體實(shí)現(xiàn)過(guò)程為:
[0007]步驟一、初始化設(shè)備:
[0008]初始化設(shè)備過(guò)程為硬件分配系統(tǒng)資源,獲取基于CPCI總線(xiàn)的數(shù)字量輸入功能模塊的設(shè)備信息、設(shè)備內(nèi)存映射及中斷鏈接;
[0009]步驟二、功能函數(shù)的實(shí)現(xiàn)及封裝:
[0010]功能函數(shù)接口用來(lái)實(shí)現(xiàn)對(duì)數(shù)字量輸入功能模塊的具體操作,對(duì)于數(shù)字量輸入功能模塊的操作主要有打開(kāi)、關(guān)閉和讀取功能;
[0011]數(shù)字量輸入功能模塊的主要控制過(guò)程為:應(yīng)用程序首先執(zhí)行打開(kāi)指定數(shù)字量輸入模塊板卡的操作,加載數(shù)字量輸入模塊的驅(qū)動(dòng)程序,然后調(diào)用數(shù)字量輸入采集接口,應(yīng)用程序傳入數(shù)字量輸入模塊的板號(hào)和通道號(hào),啟用相應(yīng)的數(shù)字量輸入通道,采集數(shù)字量輸入;32路數(shù)字量輸入由2個(gè)16位寄存器控制;
[0012]數(shù)字量輸入模塊在系統(tǒng)上電后,完成板卡的內(nèi)存映射,根據(jù)硬件的寄存器接口手冊(cè)及各個(gè)驅(qū)動(dòng)接口函數(shù)需完成的操作,來(lái)具體實(shí)現(xiàn)各個(gè)驅(qū)動(dòng)接口函數(shù),具體過(guò)程為:
[0013]步驟二(I)、打開(kāi)數(shù)字量輸入功能單元(數(shù)字量輸入板卡):(見(jiàn)表I)
[0014]加載數(shù)字量輸入驅(qū)動(dòng)程序,打開(kāi)指定板號(hào)的數(shù)字量輸入板,以對(duì)數(shù)字量輸入板進(jìn)行后續(xù)操作;對(duì)數(shù)字量輸入板的輸出通道進(jìn)行清零;
[0015]函數(shù)原型為STATUS IOOpen (int num),
[0016]入口參數(shù)num是板號(hào),范圍是I?N,N為控制計(jì)算機(jī)的數(shù)字量輸入板數(shù)量;
[0017]返回值打開(kāi)成功返回0K,失敗返回非零負(fù)值故障碼;
[0018]所述函數(shù)能識(shí)別錯(cuò)誤的板號(hào)輸入,并返回對(duì)應(yīng)的故障碼;
[0019]IOOpen函數(shù)的實(shí)現(xiàn)過(guò)程如下:
[0020]首先應(yīng)用程序傳遞要打開(kāi)的數(shù)字量輸入板卡號(hào),在函數(shù)體中判斷板號(hào)是否正確,如果正確則將初始化函數(shù)執(zhí)行后獲得的數(shù)字量輸入板卡內(nèi)存映射基址值賦給一個(gè)全局變量,再對(duì)指定數(shù)字量輸入板卡各通道清零,最后函數(shù)返回0K,如果板號(hào)參數(shù)不是用戶(hù)允許的,則返回板號(hào)錯(cuò)誤故障碼。
[0021]步驟二(2)、關(guān)閉數(shù)字量輸入功能單元(數(shù)字量輸入板):
[0022]關(guān)閉指定板號(hào)的數(shù)字量輸入板,卸載I/O驅(qū)動(dòng)程序,完成后釋放I/O板的硬件資源,不能再對(duì)I/o板進(jìn)行除打開(kāi)以外的其他操作;
[0023]函數(shù)原型為STATUS IOClose (int num);
[0024]入口參數(shù)num是板號(hào),范圍是I?N,N為控制計(jì)算機(jī)的數(shù)字量輸入板數(shù)量;
[0025]返回值關(guān)閉成功返回0K,失敗返回非零負(fù)值故障碼;
[0026]所述函數(shù)能識(shí)別錯(cuò)誤的板號(hào)輸入,并返回相應(yīng)的故障碼;
[0027]IOClose函數(shù)的實(shí)現(xiàn)過(guò)程如下(如圖4):
[0028]首先應(yīng)用程序傳遞要關(guān)閉的指定數(shù)字量輸入板卡號(hào),在函數(shù)體中,判斷傳遞的板號(hào)參數(shù)是否正確,如果正確,則將保存有內(nèi)存基址的全局變量清零,函數(shù)返回0K,如果板卡號(hào)錯(cuò)誤,則返回板號(hào)錯(cuò)誤故障碼。
[0029]步驟二(3)、數(shù)字量輸入功能單元(數(shù)字量輸入板)讀位操作:(見(jiàn)表3)
[0030]指定數(shù)字量輸入板的板號(hào),讀取指定一路輸入通道的狀態(tài),并將結(jié)果傳給char類(lèi)型參數(shù)指針*pdata ;
[0031]函數(shù)原型為STATUS IOReadBit (int num, int chan, char*pdata)
[0032]入口參數(shù)num是板號(hào),范圍是I?N,N為控制計(jì)算機(jī)的數(shù)字量輸入板數(shù)量;
[0033]int chan為通道號(hào),賦值O?M_l,M為數(shù)字量輸入板的輸入通道數(shù)量;
[0034]char*pdata存放讀數(shù)結(jié)果,取值為O或I ;
[0035]返回值讀取成功返回0K,失敗返回非零負(fù)值故障碼
[0036]所述函數(shù)能識(shí)別錯(cuò)誤的板號(hào)輸入,并返回相應(yīng)的故障碼;
[0037]IOReadBit函數(shù)的實(shí)現(xiàn)過(guò)程如下:(圖5所示):
[0038]DARevertData函數(shù)的實(shí)現(xiàn)過(guò)程如下:
[0039]首先應(yīng)用程序傳遞要進(jìn)行數(shù)據(jù)輸入的數(shù)字量輸入板卡號(hào)和通道號(hào)參數(shù),在函數(shù)體中,先判斷傳遞的板號(hào)是否是用戶(hù)允許輸入的板號(hào),如果是,再進(jìn)一步判斷傳遞的通道號(hào)是否是用戶(hù)允許輸入的通道號(hào),如果是,回讀指定輸入通道的狀態(tài)值,并保存,函數(shù)返回0K,表示用戶(hù)可以從相應(yīng)的通道讀取指定輸入通道的狀態(tài)值。如果上述判斷的過(guò)程出現(xiàn)否定,則退出函數(shù)返回相應(yīng)錯(cuò)誤故障碼。
[0040]步驟二(4)、數(shù)字量輸入功能單元(數(shù)字量輸入板)讀字節(jié)操作:(見(jiàn)表4)
[0041]指定數(shù)字量輸入板的板號(hào),以offset為偏移量地址讀一個(gè)字節(jié)的數(shù)據(jù),即8位輸入通道的狀態(tài),并將結(jié)果傳給char類(lèi)型參數(shù)指針*pdata ;
[0042]函數(shù)原型為STATUS IOReadByteQnt num, int offset, char*pdata);
[0043]入口參數(shù)num是板號(hào),范圍是I?N,N為控制計(jì)算機(jī)的數(shù)字量輸入板數(shù)量;
[0044]Offset為偏移量,賦值O?P-1,P為數(shù)字量輸入板的輸入通道數(shù)量除以8 ;
[0045]Pdata用于存儲(chǔ)讀取的結(jié)果,取值00?FFH ;
[0046]返回值讀取成功返回0K,失敗返回非零負(fù)值故障碼;
[0047]所述函數(shù)能識(shí)別錯(cuò)誤的板號(hào)輸入,并返回對(duì)應(yīng)的故障碼;還能識(shí)別錯(cuò)誤的偏移量,并返回對(duì)應(yīng)的故障碼;
[0048]函數(shù)IOReadByte的實(shí)現(xiàn)過(guò)程如下:
[0049]首先應(yīng)用程序傳遞要進(jìn)行數(shù)據(jù)輸入的數(shù)字量輸入板卡號(hào)和偏移量參數(shù),在函數(shù)體中,先判斷傳遞的板號(hào)是否是用戶(hù)允許輸入的板號(hào),如果是,再進(jìn)一步判斷傳遞的通道號(hào)是否是用戶(hù)允許輸入的偏移量,如果是,回讀指定8路輸入通道的狀態(tài)值,并保存,函數(shù)返回0K,表示用戶(hù)可以從相應(yīng)的通道讀取指定輸入通道的狀態(tài)值。如果上述判斷的過(guò)程出現(xiàn)否定,則退出函數(shù)返回相應(yīng)錯(cuò)誤故障碼。
[0050]步驟二(5)數(shù)字量輸入功能單元(數(shù)字量輸入板)讀全通道操作:(見(jiàn)表5)
[0051]指定數(shù)字量輸入板的板號(hào),讀取一塊板所有輸入通道的狀態(tài),并將結(jié)果放在指定首地址的數(shù)據(jù)buffer中;
[0052]STATUS IOReadAll(int num, char*pbuf)
[0053]入口參數(shù)num是板號(hào),范圍是I?N,N為控制計(jì)算機(jī)的數(shù)字量輸入板數(shù)量;
[0054]Buffer為首地址,buffer大小根據(jù)硬件根據(jù)硬件實(shí)際通道數(shù)定;
[0055]返回值讀取成功返回0K,失敗返回非零負(fù)值故障碼;
[0056]所述函數(shù)能識(shí)別錯(cuò)誤的板號(hào)輸入,并返回對(duì)應(yīng)的故障碼;
[0057]函數(shù)IOReadAll的實(shí)現(xiàn)過(guò)程如下:
[0058]首先應(yīng)用程序傳遞要進(jìn)行數(shù)據(jù)輸入的數(shù)字量輸入板卡號(hào)和偏移量參數(shù),在函數(shù)體中,先判斷傳遞的板號(hào)是否是用戶(hù)允許輸入的板號(hào),如果是,回讀所有輸入通道的狀態(tài)值,并保存,函數(shù)返回0K。如果上述判斷的過(guò)程出現(xiàn)否定,則退出函數(shù)返回相應(yīng)錯(cuò)誤故障碼。
[0059]步驟二(6)、數(shù)字量輸入功能單元(數(shù)字量輸入板)實(shí)時(shí)監(jiān)測(cè):(見(jiàn)表6)
[0060]對(duì)指定的板號(hào)的數(shù)字量輸入板進(jìn)行在位實(shí)時(shí)監(jiān)測(cè);
[0061]函數(shù)原型為STATUS IORTffatch (int num);
[0062]入口參數(shù)num為板號(hào),范圍是I?N,N為控制計(jì)算機(jī)的數(shù)字量輸入板的數(shù)量;
[0063]返回值監(jiān)測(cè)正常返回0K,失敗返回非零負(fù)值故障碼;
[0064]所述函數(shù)能識(shí)別錯(cuò)誤的板號(hào)輸入,并返回對(duì)應(yīng)的故障碼;
[0065]IORTffatch函數(shù)的實(shí)現(xiàn)過(guò)程如下:
[0066]首先應(yīng)用程序傳遞指定數(shù)字量輸入功能單元板號(hào),在函數(shù)體中,判斷傳遞的板號(hào)是否是用戶(hù)允許的板號(hào),如果是,下一步調(diào)用PciFindDeviceO函數(shù),判斷PciFindDeviceQ函數(shù)的返回值是否為0K,如果是,則函數(shù)接口返回0K。如果上述判斷出現(xiàn)否定,如果上述判斷的過(guò)程出現(xiàn)否定,則退出函數(shù)返回相應(yīng)錯(cuò)誤故障碼。
[0067]所述步驟一的具體實(shí)施過(guò)程為:
[0068]步驟一(I)獲取基于CPCI總線(xiàn)的數(shù)字量輸入功能模塊的設(shè)備信息
[0069]PCI設(shè)備上電后,BIOS配置PCI設(shè)備,目標(biāo)機(jī)的BIOS在啟動(dòng)時(shí)列出找到的PCI設(shè)備及Vendor ID、Device ID、設(shè)備類(lèi)型、分配的中斷號(hào)信息;
[0070]初始化函數(shù)先根據(jù)設(shè)備Vendor ID和Device ID利用函數(shù)pciFindDevice ()找到對(duì)應(yīng)的設(shè)備,根據(jù)Vendor ID,Device ID和相同設(shè)備順序號(hào)(一個(gè)系統(tǒng)中可能有相同的PCI設(shè)備)來(lái)掃描總線(xiàn),找出設(shè)備所在的BUS No、Device No和Func No ;然后根據(jù)總線(xiàn)號(hào)、設(shè)備號(hào)和功能號(hào)調(diào)用pciConfiglnLongO及pciConf iglnByte O函數(shù)確定設(shè)備的寄存器基地址以及中斷號(hào);再把基地址與1/0屏蔽位相與得到真正的板上內(nèi)部寄存器基地址;
[0071]步驟一(2)設(shè)備內(nèi)存映射
[0072]用戶(hù)使用VxWorks提供的標(biāo)準(zhǔn)的MMU (內(nèi)存管理單元)來(lái)分配PCI設(shè)備的內(nèi)存空間;在明確基地址和內(nèi)存空間大小后,調(diào)用函數(shù)SysMmuMapAddO函數(shù)將內(nèi)存空間配置到MMU;完成數(shù)字量輸入功能模塊的設(shè)備內(nèi)存映射后,通過(guò)對(duì)設(shè)備內(nèi)存的訪(fǎng)問(wèn),實(shí)現(xiàn)對(duì)設(shè)備的控制;
[0073]步驟一(3)中斷鏈接
[0074]Vxfforks操作系統(tǒng)中使用intConnect O鏈接中斷服務(wù)程序(ISR),采用pcilntConncet O掛接中斷,pcilntConncet O定義在pcilntLib.c中,使用時(shí)包含頭文件pciIntLib.h,中斷矢量 ventor 通過(guò) INUM_T0_IVEC 換算獲得;
[0075]在VxWorks系統(tǒng)下使用pcilntConnect O函數(shù)將中斷和特定的C程序連接起來(lái)后,所述函數(shù)將指定的C函數(shù)與指定的中斷向量相聯(lián)系,函數(shù)的地址將存儲(chǔ)在所述中斷向量中,當(dāng)中斷發(fā)生時(shí),系統(tǒng)將調(diào)用所述特定的C程序函數(shù),即中斷服務(wù)程序。
[0076]本發(fā)明的有益效果是:
[0077]本發(fā)明根據(jù)數(shù)字量輸入功能模塊的特點(diǎn),開(kāi)發(fā)驅(qū)動(dòng)實(shí)現(xiàn)對(duì)數(shù)字量輸入功能模塊的控制,同時(shí)提供一種新的數(shù)字量輸入功能模塊的驅(qū)動(dòng)接口封裝形式,面向應(yīng)用程序直接定義驅(qū)動(dòng)接口的形式,直接封裝功能接口函數(shù)。這樣在驅(qū)動(dòng)開(kāi)發(fā)的過(guò)程中,不涉及到傳統(tǒng)數(shù)字量輸入功能模塊的設(shè)備數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)、設(shè)備創(chuàng)建及驅(qū)動(dòng)安裝,很大程度上降低了驅(qū)動(dòng)開(kāi)發(fā)人員的開(kāi)發(fā)難度。具本優(yōu)點(diǎn)表現(xiàn)在以下幾個(gè)方面;
[0078]I)、本方法提供的數(shù)字量輸入功能模塊驅(qū)動(dòng)程序能夠?qū)崿F(xiàn)對(duì)功能模塊的有效控制;
[0079]2)、本方法提供的數(shù)字量輸入功能模塊驅(qū)動(dòng)程序直接面向用戶(hù)應(yīng)用程序提供通用的驅(qū)動(dòng)函數(shù)接口;
[0080]3)、本方法提供的數(shù)字量輸入功能模塊驅(qū)動(dòng)程序設(shè)計(jì)及封裝大大降低驅(qū)動(dòng)開(kāi)發(fā)的難度;
[0081]4)、本方法提供的數(shù)字量輸入功能模塊驅(qū)動(dòng)程序設(shè)計(jì)及封裝具有獨(dú)立性與通用性,可應(yīng)用于其它設(shè)計(jì)。
【專(zhuān)利附圖】
【附圖說(shuō)明】
[0082]圖1是數(shù)字輸入量功能模塊的整體架構(gòu)圖,圖2是初始化函數(shù)流程圖,圖3是打開(kāi)數(shù)字量輸入板流程圖,圖4是關(guān)閉數(shù)字量輸入板流程,圖5是數(shù)字量輸入板讀位操作程序流程圖,圖6是數(shù)字量輸入板讀字節(jié)程序流程圖,圖7是數(shù)字量輸入讀全通道程序流程圖,圖8是數(shù)字量輸入板實(shí)時(shí)監(jiān)測(cè)圖。
【具體實(shí)施方式】
[0083]參見(jiàn)圖1至圖8,本實(shí)施方式是對(duì)本發(fā)明所述的VxWorks操作系統(tǒng)下CPCI總線(xiàn)數(shù)字量輸入功能單元驅(qū)動(dòng)程序設(shè)計(jì)方法進(jìn)行詳細(xì)描述:
[0084]本實(shí)施方式所述的數(shù)字量輸入功能模塊的整體架構(gòu)如圖1所示:
[0085]數(shù)字量輸入功能模塊運(yùn)行在CPCI機(jī)箱中,控制計(jì)算機(jī)通過(guò)CPCI總線(xiàn)實(shí)現(xiàn)對(duì)數(shù)字量輸入功能模塊的讀寫(xiě)控制。CPCI總線(xiàn)和數(shù)字量輸入功能電路之間需要實(shí)現(xiàn)CPCI總線(xiàn)接口控制器,CPCI總線(xiàn)控制器采用PLX公司的PCI9054接口芯片實(shí)現(xiàn),將CPCI總線(xiàn)轉(zhuǎn)換到本地總線(xiàn)。PCI9054接口芯片完全兼容PCI2.2規(guī)范,且突發(fā)傳輸速率高,價(jià)格低,通用性好,可以有效降低開(kāi)發(fā)難度。PCI9054本地總線(xiàn)端使用FPGA實(shí)現(xiàn)總線(xiàn)接口譯碼,同時(shí),F(xiàn)PGA內(nèi)部設(shè)計(jì)控制寄存器,實(shí)現(xiàn)對(duì)數(shù)字量輸入功能電路的控制。數(shù)字量輸入功能模塊由32路光耦組成。外部32路數(shù)字量輸入經(jīng)過(guò)光耦隔離后輸入FPGA,F(xiàn)PGA可以檢測(cè)輸入通道的狀態(tài)。
[0086]數(shù)字量輸入功能模塊驅(qū)動(dòng)程序設(shè)計(jì)過(guò)程為:
[0087]數(shù)字量輸入功能模塊運(yùn)行CPCI機(jī)箱中,應(yīng)用程序運(yùn)行在控制計(jì)算機(jī)上,通過(guò)CPCI總線(xiàn)實(shí)現(xiàn)對(duì)數(shù)字量輸入功能模塊的控制,因此需要開(kāi)發(fā)基于CPCI總線(xiàn)數(shù)字量輸入功能模塊的驅(qū)動(dòng)程序。數(shù)字量輸入功能模塊的驅(qū)動(dòng)程序設(shè)計(jì)主要包括初始化設(shè)備,功能函數(shù)接口的實(shí)現(xiàn)及封裝。
[0088]步驟一、初始化設(shè)備
[0089]初始化設(shè)備作為CPCI設(shè)備驅(qū)動(dòng)開(kāi)發(fā)的重要環(huán)節(jié),主要是為硬件分配系統(tǒng)資源,這里主要是獲取基于CPCI總線(xiàn)的數(shù)字量輸入功能模塊的設(shè)備信息、設(shè)備內(nèi)存映射及中斷鏈接。
[0090](I)獲取基于CPCI總線(xiàn)的數(shù)字量輸入功能模塊的設(shè)備信息
[0091]PCI設(shè)備上電后,BIOS會(huì)配置PCI設(shè)備。目標(biāo)機(jī)的BIOS在啟動(dòng)時(shí)會(huì)有一個(gè)界面列出找到的PCI設(shè)備及Vendor ID, Device ID、設(shè)備類(lèi)型、分配的中斷號(hào)等信息。
[0092]初始化函數(shù)先根據(jù)設(shè)備Vendor ID和Device ID利用函數(shù)pciFindDevice ()找到對(duì)應(yīng)的設(shè)備,根據(jù)Vendor ID,Device ID和相同設(shè)備順序號(hào)(一個(gè)系統(tǒng)中可能有相同的PCI設(shè)備)來(lái)掃描總線(xiàn),找出設(shè)備所在的BUS N0.(總線(xiàn)號(hào))、Device N0.(設(shè)備號(hào))和Func N0.(功能號(hào))。然后根據(jù)總線(xiàn)號(hào)、設(shè)備號(hào)和功能號(hào)調(diào)用pciConfiglnLongO及pciConf iglnByte O函數(shù)確定設(shè)備的寄存器基地址以及中斷號(hào)。再把基地址與1/0屏蔽位相與得到真正的板上內(nèi)部寄存器基地址。初始化函數(shù)流程如下圖2所示。
[0093](2)設(shè)備內(nèi)存映射
[0094]Vxfforks提供了標(biāo)準(zhǔn)的MMU (內(nèi)存管理單元),用戶(hù)可以使用MMU來(lái)分配PCI設(shè)備的內(nèi)存空間。在明確基地址和內(nèi)存空間大小后,調(diào)用函數(shù)SysMmuMapAddO函數(shù)即可將內(nèi)存空間配置到MMU。完成了數(shù)字量輸入功能模塊的設(shè)備內(nèi)存映射后,可以通過(guò)對(duì)設(shè)備內(nèi)存的訪(fǎng)問(wèn),實(shí)現(xiàn)對(duì)設(shè)備的控制。
[0095](3)中斷鏈接[0096]Vxfforks操作系統(tǒng)中使用intConnect O鏈接中斷服務(wù)程序(ISR),但對(duì)于CPCI設(shè)備,一般采用pcilntConncet O掛接中斷,它與intConnect O的主要不同在于intConnect O使用的中斷向量是獨(dú)占的,而pcilntConncet O則可使多個(gè)外部中斷共享一個(gè)中斷向量。pcilntConncet O定義在pcilntLib.c中,使用時(shí)應(yīng)包含頭文件pcilntLib.h。應(yīng)注意ventor是中斷矢量,需要通過(guò)INUM_T0_IVEC換算獲得。
[0097]在VxWorks系統(tǒng)下使用pcilntConnect O函數(shù)將中斷和特定的C程序連接起來(lái)后,該函數(shù)將指定的C函數(shù)與指定的中斷向量相聯(lián)系,函數(shù)的地址將存儲(chǔ)在這個(gè)中斷向量中。當(dāng)中斷發(fā)生時(shí),系統(tǒng)將調(diào)用這個(gè)特定的C程序函數(shù),即中斷服務(wù)程序。
[0098]步驟二、功能函數(shù)接口的實(shí)現(xiàn)及封裝
[0099]功能函數(shù)接口用來(lái)實(shí)現(xiàn)對(duì)數(shù)字量輸入功能模塊的具體操作,對(duì)于數(shù)字量輸入功能模塊的操作,常見(jiàn)的主要有打開(kāi)、關(guān)閉和讀取等功能。
[0100]數(shù)字量輸入功能模塊的主要控制過(guò)程為:應(yīng)用程序首先執(zhí)行打開(kāi)指定數(shù)字量輸入模塊板卡的操作,加載數(shù)字量輸入模塊的驅(qū)動(dòng)程序,下一步調(diào)用數(shù)字量輸入采集接口,應(yīng)用程序傳入數(shù)字量輸入模塊的板號(hào)和通道號(hào),啟用相應(yīng)的數(shù)字量輸入通道,采集數(shù)字量輸入。32路數(shù)字量輸入由2個(gè)16位寄存器控制。
[0101]數(shù)字量輸入模塊在系統(tǒng)上電后,完成板卡的內(nèi)存映射,根據(jù)硬件設(shè)計(jì)人員提供的驅(qū)動(dòng)硬件寄存器接口手冊(cè)及各個(gè)驅(qū)動(dòng)接口函數(shù)需完成的操作,來(lái)具體實(shí)現(xiàn)各個(gè)驅(qū)動(dòng)接口函數(shù)。
[0102](I)、打開(kāi)數(shù)字量輸入板卡,見(jiàn)表1
[0103]表1打開(kāi)數(shù)字量輸入板卡
[0104]
【權(quán)利要求】
1.一種VxWorks操作系統(tǒng)下CPCI總線(xiàn)數(shù)字量輸入功能單元驅(qū)動(dòng)程序設(shè)計(jì)方法,其特征在于,所述方法的具體實(shí)現(xiàn)過(guò)程為: 步驟一、初始化設(shè)備: 初始化設(shè)備過(guò)程為硬件分配系統(tǒng)資源,獲取基于CPCI總線(xiàn)的數(shù)字量輸入功能模塊的設(shè)備信息、設(shè)備內(nèi)存映射及中斷鏈接; 步驟二、功能函數(shù)的實(shí)現(xiàn)及封裝: 功能函數(shù)接口用來(lái)實(shí)現(xiàn)對(duì)數(shù)字量輸入功能模塊的具體操作,對(duì)于數(shù)字量輸入功能模塊的操作主要有打開(kāi)、關(guān)閉和讀取功能; 數(shù)字量輸入功能模塊的主要控制過(guò)程為:應(yīng)用程序首先執(zhí)行打開(kāi)指定數(shù)字量輸入模塊板卡的操作,加載數(shù)字量輸入模塊的驅(qū)動(dòng)程序,然后調(diào)用數(shù)字量輸入采集接口,應(yīng)用程序傳入數(shù)字量輸入模塊的板號(hào)和通道號(hào),啟用相應(yīng)的數(shù)字量輸入通道,采集數(shù)字量輸入;32路數(shù)字量輸入由2個(gè)16位寄存器控制; 數(shù)字量輸入模塊在系統(tǒng)上電后,完成板卡的內(nèi)存映射,根據(jù)硬件的寄存器接口手冊(cè)及各個(gè)驅(qū)動(dòng)接口函數(shù)需完成的操作,來(lái)具體實(shí)現(xiàn)各個(gè)驅(qū)動(dòng)接口函數(shù),具體過(guò)程為: 步驟二(I)、打開(kāi)數(shù)字量輸入功能單元: 加載數(shù)字量輸入驅(qū)動(dòng)程序,打開(kāi)指定板號(hào)的數(shù)字量輸入板,以對(duì)數(shù)字量輸入板進(jìn)行后續(xù)操作;對(duì)數(shù)字量輸入板的輸出通道進(jìn)行清零; 函數(shù)原型為 STATUS IOOpen (int num),· 入口參數(shù)num是板號(hào),范圍是I~N,N為控制計(jì)算機(jī)的數(shù)字量輸入板數(shù)量; 返回值打開(kāi)成功返回0K,失敗返回非零負(fù)值故障碼; 所述函數(shù)能識(shí)別錯(cuò)誤的板號(hào)輸入,并返回對(duì)應(yīng)的故障碼; IOOpen函數(shù)的實(shí)現(xiàn)過(guò)程如下: 首先應(yīng)用程序傳遞要打開(kāi)的數(shù)字量輸入板卡號(hào),在函數(shù)體中判斷板號(hào)是否正確,如果正確則將初始化函數(shù)執(zhí)行后獲得的數(shù)字量輸入板卡內(nèi)存映射基址值賦給一個(gè)全局變量,再對(duì)指定數(shù)字量輸入板卡各通道清零,最后函數(shù)返回0K,如果板號(hào)參數(shù)不是用戶(hù)允許的,則返回板號(hào)錯(cuò)誤故障碼; 步驟二(2)、關(guān)閉數(shù)字量輸入功能單元: 關(guān)閉指定板號(hào)的數(shù)字量輸入板,卸載I/O驅(qū)動(dòng)程序,完成后釋放I/O板的硬件資源,不能再對(duì)I/O板進(jìn)行除打開(kāi)以外的其他操作; 函數(shù)原型為 STATUS IOClose (int num); 入口參數(shù)num是板號(hào),范圍是I~N,N為控制計(jì)算機(jī)的數(shù)字量輸入板數(shù)量; 返回值關(guān)閉成功返回0K,失敗返回非零負(fù)值故障碼; 所述函數(shù)能識(shí)別錯(cuò)誤的板號(hào)輸入,并返回相應(yīng)的故障碼; IOClose函數(shù)的實(shí)現(xiàn)過(guò)程如下: 首先應(yīng)用程序傳遞要關(guān)閉的指定數(shù)字量輸入板卡號(hào),在函數(shù)體中,判斷傳遞的板號(hào)參數(shù)是否正確,如果正確,則將保存有內(nèi)存基址的全局變量清零,函數(shù)返回0K,如果板卡號(hào)錯(cuò)誤,則返回板號(hào)錯(cuò)誤故障碼; 步驟二(3)、數(shù)字量輸入功能單元讀位操作: 指定數(shù)字量輸入板的板號(hào),讀取指定一路輸入通道的狀態(tài),并將結(jié)果傳給char類(lèi)型參數(shù)指針*pdata ;
函數(shù)原型為 STATUS IOReadBit (int num, int chan, char*pdata) 入口參數(shù)num是板號(hào),范圍是I~N,N為控制計(jì)算機(jī)的數(shù)字量輸入板數(shù)量; int chan為通道號(hào),賦值O~M_1,M為數(shù)字量輸入板的輸入通道數(shù)量; char*pdata存放讀數(shù)結(jié)果,取值為O或I ; 返回值讀取成功返回0K,失敗返回非零負(fù)值故障碼 所述函數(shù)能識(shí)別錯(cuò)誤的板號(hào)輸入,并返回相應(yīng)的故障碼; IOReadBit函數(shù)的實(shí)現(xiàn)過(guò)程如下: DARevertData函數(shù)的實(shí)現(xiàn)過(guò)程如下: 首先應(yīng)用程序傳遞要 進(jìn)行數(shù)據(jù)輸入的數(shù)字量輸入板卡號(hào)和通道號(hào)參數(shù),在函數(shù)體中,先判斷傳遞的板號(hào)是否是用戶(hù)允許輸入的板號(hào),如果是,再進(jìn)一步判斷傳遞的通道號(hào)是否是用戶(hù)允許輸入的通道號(hào),如果是,回讀指定輸入通道的狀態(tài)值,并保存,函數(shù)返回0K,表示用戶(hù)可以從相應(yīng)的通道讀取指定輸入通道的狀態(tài)值;如果上述判斷的過(guò)程出現(xiàn)否定,則退出函數(shù)返回相應(yīng)錯(cuò)誤故障碼; 步驟二(4)、數(shù)字量輸入功能單元讀字節(jié)操作: 指定數(shù)字量輸入板的板號(hào),以offset為偏移量地址讀一個(gè)字節(jié)的數(shù)據(jù),即8位輸入通道的狀態(tài),并將結(jié)果傳給char類(lèi)型參數(shù)指針*pdata ;
函數(shù)原型為 STATUS IOReadByte (int num, int offset, char*pdata); 入口參數(shù)num是板號(hào),范圍是I~N,N為控制計(jì)算機(jī)的數(shù)字量輸入板數(shù)量; Offset為偏移量,賦值O~P-1,P為數(shù)字量輸入板的輸入通道數(shù)量除以8 ; Pdata用于存儲(chǔ)讀取的結(jié)果,取值00~FFH ; 返回值讀取成功返回0K,失敗返回非零負(fù)值故障碼; 所述函數(shù)能識(shí)別錯(cuò)誤的板號(hào)輸入,并返回對(duì)應(yīng)的故障碼;還能識(shí)別錯(cuò)誤的偏移量,并返回對(duì)應(yīng)的故障碼; 函數(shù)IOReadByte的實(shí)現(xiàn)過(guò)程如下: 首先應(yīng)用程序傳遞要進(jìn)行數(shù)據(jù)輸入的數(shù)字量輸入板卡號(hào)和偏移量參數(shù),在函數(shù)體中,先判斷傳遞的板號(hào)是否是用戶(hù)允許輸入的板號(hào),如果是,再進(jìn)一步判斷傳遞的通道號(hào)是否是用戶(hù)允許輸入的偏移量,如果是,回讀指定8路輸入通道的狀態(tài)值,并保存,函數(shù)返回0K,表示用戶(hù)可以從相應(yīng)的通道讀取指定輸入通道的狀態(tài)值;如果上述判斷的過(guò)程出現(xiàn)否定,則退出函數(shù)返回相應(yīng)錯(cuò)誤故障碼; 步驟二(5)數(shù)字量輸入功能單元讀全通道操作: 指定數(shù)字量輸入板的板號(hào),讀取一塊板所有輸入通道的狀態(tài),并將結(jié)果放在指定首地址的數(shù)據(jù)buffer中;
STATUS IOReadAll(int num, char*pbuf) 入口參數(shù)num是板號(hào),范圍是I~N,N為控制計(jì)算機(jī)的數(shù)字量輸入板數(shù)量; Buffer為首地址,buffer大小根據(jù)硬件根據(jù)硬件實(shí)際通道數(shù)定; 返回值讀取成功返回0K,失敗返回非零負(fù)值故障碼; 所述函數(shù)能識(shí)別錯(cuò)誤的板號(hào)輸入,并返回對(duì)應(yīng)的故障碼; 函數(shù)IOReadAll的實(shí)現(xiàn)過(guò)程如下:首先應(yīng)用程序傳遞要進(jìn)行數(shù)據(jù)輸入的數(shù)字量輸入板卡號(hào)和偏移量參數(shù),在函數(shù)體中,先判斷傳遞的板號(hào)是否是用戶(hù)允許輸入的板號(hào),如果是,回讀所有輸入通道的狀態(tài)值,并保存,函數(shù)返回OK ;如果上述判斷的過(guò)程出現(xiàn)否定,則退出函數(shù)返回相應(yīng)錯(cuò)誤故障碼; 步驟二(6)、數(shù)字量輸入功能單元實(shí)時(shí)監(jiān)測(cè): 對(duì)指定的板號(hào)的數(shù)字量輸入板進(jìn)行在位實(shí)時(shí)監(jiān)測(cè); 函數(shù)原型為 STATUS IORTffatch (int num); 入口參數(shù)num為板號(hào),范圍是I~N,N為控制計(jì)算機(jī)的數(shù)字量輸入板的數(shù)量; 返回值監(jiān)測(cè)正常返回0K,失敗返回非零負(fù)值故障碼; 所述函數(shù)能識(shí)別錯(cuò)誤的板號(hào)輸入,并返回對(duì)應(yīng)的故障碼; IORTffatch函數(shù)的實(shí)現(xiàn)過(guò)程如下: 首先應(yīng)用程序傳遞指定數(shù)字量輸入功能單元板號(hào),在函數(shù)體中,判斷傳遞的板號(hào)是否是用戶(hù)允許的板號(hào),如果是,下一步調(diào)用PciFindDeviceO函數(shù),判斷PciFindDevice O函數(shù)的返回值是否為0K,如果是,則函數(shù)接口返回OK ;如果上述判斷出現(xiàn)否定,如果上述判斷的過(guò)程出現(xiàn)否定,則退出函數(shù)返回相應(yīng)錯(cuò)誤故障碼。
2.根據(jù)權(quán)利要求1所述的一種VxWorks操作系統(tǒng)下CPCI總線(xiàn)數(shù)字量輸入功能單元驅(qū)動(dòng)程序設(shè)計(jì)方法,其特征在于,所述步驟一的具體實(shí)施過(guò)程為: 步驟一(I)獲取基于CPCI總線(xiàn)的數(shù)字量輸入功能模塊的設(shè)備信息: PCI設(shè)備上電后,BIOS配置PCI設(shè)備,目`標(biāo)機(jī)的BIOS在啟動(dòng)時(shí)列出找到的PCI設(shè)備及Vendor ID> Device ID、設(shè)備類(lèi)型、分配的中斷號(hào)信息; 初始化函數(shù)先根據(jù)設(shè)備Vendor ID和Device ID利用函數(shù)pciFindDevice O找到對(duì)應(yīng)的設(shè)備,根據(jù)Vendor ID,Device ID和相同設(shè)備順序號(hào)來(lái)掃描總線(xiàn),找出設(shè)備所在的BUSNo、Device No和Func No ;然后根據(jù)總線(xiàn)號(hào)、設(shè)備號(hào)和功能號(hào)調(diào)用pciConfiglnLongO及PCiConfigInByteO函數(shù)確定設(shè)備的寄存器基地址以及中斷號(hào);再把基地址與1/0屏蔽位相與得到真正的板上內(nèi)部寄存器基地址; 步驟一(2)設(shè)備內(nèi)存映射 用戶(hù)使用VxWorks提供的標(biāo)準(zhǔn)的MMU來(lái)分配PCI設(shè)備的內(nèi)存空間;在明確基地址和內(nèi)存空間大小后,調(diào)用函數(shù)SysMmuMapAddO函數(shù)將內(nèi)存空間配置到MMU ;完成數(shù)字量輸入功能模塊的設(shè)備內(nèi)存映射后,通過(guò)對(duì)設(shè)備內(nèi)存的訪(fǎng)問(wèn),實(shí)現(xiàn)對(duì)設(shè)備的控制; 步驟一(3)中斷鏈接 VxWorks操作系統(tǒng)中使用intConnectO鏈接中斷服務(wù)程序,采用pcilntConncet O掛接中斷,PciIntConncet O定義在pcilntLib.c中,使用時(shí)包含頭文件pcilntLib.h,中斷矢量ventor通過(guò)INUM_TO_IVEC換算獲得; 在VxWorks系統(tǒng)下使用pciIntConnect O函數(shù)將中斷和特定的C程序連接起來(lái)后,所述函數(shù)將指定的C函數(shù)與指定的中斷向量相聯(lián)系,函數(shù)的地址將存儲(chǔ)在所述中斷向量中,當(dāng)中斷發(fā)生時(shí),系統(tǒng)將調(diào)用所述特定的C程序函數(shù),即中斷服務(wù)程序。
【文檔編號(hào)】G06F9/44GK103713908SQ201410024766
【公開(kāi)日】2014年4月9日 申請(qǐng)日期:2014年1月7日 優(yōu)先權(quán)日:2014年1月7日
【發(fā)明者】劉大同, 馬云彤, 奚成義, 見(jiàn)其拓, 彭宇, 彭喜元 申請(qǐng)人:哈爾濱工業(yè)大學(xué)