楊兵見,魏 豐,陳永志
(華中科技大學(xué) 自動(dòng)化學(xué)院,武漢 430074)
Linux下的PCIE同步時(shí)鐘卡的設(shè)備驅(qū)動(dòng)程序開發(fā)
楊兵見,魏 豐,陳永志
(華中科技大學(xué) 自動(dòng)化學(xué)院,武漢 430074)
為了給系統(tǒng)提供準(zhǔn)確的同步時(shí)間,向各種自動(dòng)化裝置(如故障錄波和數(shù)據(jù)采集等設(shè)備)提供高精度同步絕對(duì)時(shí)標(biāo),能夠統(tǒng)一系統(tǒng)中各部分的時(shí)間基準(zhǔn),可以在系統(tǒng)發(fā)生故障后,為分析故障的情況及開關(guān)動(dòng)作的先后次序提供有力的依據(jù);因此設(shè)計(jì)了GPS+北斗雙系統(tǒng)接收機(jī)制作而成的同步時(shí)鐘源,可接收美國GPS(全球定位系統(tǒng))衛(wèi)星和我國北斗衛(wèi)星發(fā)出的定位和時(shí)間信息;采用了當(dāng)今計(jì)算機(jī)最新PCIE總線用來將計(jì)算機(jī)與時(shí)鐘卡進(jìn)行通訊,獲取時(shí)間信息;介紹了Linux下PCIE同步時(shí)鐘卡的驅(qū)動(dòng)程序設(shè)計(jì),簡要分析了同步時(shí)鐘卡的系統(tǒng)框架和工作原理,詳細(xì)闡述了Linux下字符設(shè)備驅(qū)動(dòng)開發(fā)流程,最后完成了Linux下PCIE設(shè)備驅(qū)動(dòng)程序的開發(fā)和實(shí)現(xiàn);通過實(shí)驗(yàn)驗(yàn)證了驅(qū)動(dòng)程序的完備性和正確性,能夠準(zhǔn)確讀取GPS或者是北斗系統(tǒng)接收機(jī)的時(shí)間信息。
PCIE總線;設(shè)備驅(qū)動(dòng);Linux;同步時(shí)鐘;內(nèi)核編程
時(shí)間同步在航空航天、電力系統(tǒng)、空間技術(shù),民用等領(lǐng)域是一項(xiàng)非常重要的指標(biāo),通過時(shí)間服務(wù)器提供標(biāo)準(zhǔn)可靠的時(shí)鐘信號(hào)。授時(shí)系統(tǒng)就是通過我國的原子鐘和協(xié)調(diào)世界時(shí)間得到精確的信號(hào),服務(wù)器得到時(shí)鐘信號(hào)之后將其發(fā)送給它的客戶機(jī),使客戶機(jī)的時(shí)鐘信號(hào)保持一致的精確性和可靠性。
時(shí)間這個(gè)因素在各種自動(dòng)化裝置(如電力系統(tǒng)故障檢測,數(shù)據(jù)采集設(shè)備等)起著重要的作用,它能給系統(tǒng)提供統(tǒng)一的時(shí)間基準(zhǔn)。當(dāng)系統(tǒng)發(fā)生故障時(shí),能夠明確的分析故障所在原因以及系統(tǒng)中開關(guān)動(dòng)作的先后次序,對(duì)維護(hù)設(shè)備和改善設(shè)備性能提供了依據(jù)。
PCIE總線作為當(dāng)今計(jì)算機(jī)主流總線,其驅(qū)動(dòng)程序的開發(fā)也備受關(guān)注,不管是在Windows還是在Linux下的驅(qū)動(dòng)開發(fā),都得到了廣泛的應(yīng)用。驅(qū)動(dòng)程序作為軟件與硬件之間的橋梁,獨(dú)立于具體的平臺(tái),使其移植更加方便。而且Linux作為開源的操作系統(tǒng),對(duì)于設(shè)備驅(qū)動(dòng)的開發(fā)人員來說更具有普遍性。
圖1所示為系統(tǒng)框圖,此設(shè)備是自主研發(fā)的基于PCIE總線的同步時(shí)鐘卡,單片機(jī)作為系統(tǒng)的控制單元,接收時(shí)鐘輸入和控制雙口RAM數(shù)據(jù)的讀寫??删幊踢壿婥PLD用于產(chǎn)生高精度的同步絕對(duì)時(shí)標(biāo),將時(shí)間信息存儲(chǔ)于雙口RAM中。PC機(jī)通過PCIE總線訪問雙口RAM中的數(shù)據(jù),同時(shí)設(shè)定單片機(jī)和PC機(jī)訪問雙口RAM的通訊協(xié)議,這樣有效防止雙方讀寫雙口RAM數(shù)據(jù)混亂的情況。CH367芯片作為PCIE總線的接口芯片,EEPROM存儲(chǔ)CH367芯片所需要的配置信息。PC機(jī)獲取雙口RAM數(shù)據(jù)有兩種方式:一種是主動(dòng)讀取雙口RAM時(shí)間數(shù)據(jù),另一種是通過外部事件觸發(fā)中斷再讀取時(shí)間數(shù)據(jù)。
圖1 系統(tǒng)框圖
2.1 Linux設(shè)備驅(qū)動(dòng)概述、分類
Linux將所有的外部設(shè)備都看成是一類特殊的文件,我們稱之為“設(shè)備文件”[7]。Linux系統(tǒng)調(diào)用是應(yīng)用程序與Linux內(nèi)核之間的接口,而設(shè)備驅(qū)動(dòng)是Linux內(nèi)核與外部設(shè)備之間的接口。驅(qū)動(dòng)程序向應(yīng)用程序屏蔽了具體的平臺(tái)系統(tǒng),應(yīng)用程序操作設(shè)備文件的讀寫和控制,也就是在相應(yīng)的操作外部設(shè)備的讀寫和控制。
一般而言Linux設(shè)備可以分為3類:字符設(shè)備、塊設(shè)備、網(wǎng)絡(luò)設(shè)備[1]。
字符設(shè)備是以字節(jié)為單位逐個(gè)進(jìn)行I/O操作的設(shè)備。塊設(shè)備利用系統(tǒng)一塊內(nèi)存作為緩沖區(qū),對(duì)設(shè)備進(jìn)行讀寫操作。網(wǎng)絡(luò)設(shè)備是通過以數(shù)據(jù)包的形式在網(wǎng)絡(luò)媒介上進(jìn)行數(shù)據(jù)的發(fā)送和接收[1]。
PCIE設(shè)備驅(qū)動(dòng)屬于字符設(shè)備中的一種。
每一個(gè)字符設(shè)備或塊設(shè)備都在/dev目錄下對(duì)應(yīng)一個(gè)設(shè)備文件(或稱設(shè)備節(jié)點(diǎn))。應(yīng)用程序通過設(shè)備文件來控制驅(qū)動(dòng)程序?qū)ν獠吭O(shè)備進(jìn)行相應(yīng)的操作。
2.2 字符設(shè)備驅(qū)動(dòng)
2.2.1 字符設(shè)備驅(qū)動(dòng)結(jié)構(gòu)
Linux下的大部分設(shè)備都是屬于字符設(shè)備,如圖2所示為字符設(shè)備、字符設(shè)備驅(qū)動(dòng)和用戶空間應(yīng)用程序的結(jié)構(gòu)圖[1]。
圖2 字符設(shè)備驅(qū)動(dòng)的結(jié)構(gòu)
圖2中所示,一個(gè)字符設(shè)備對(duì)應(yīng)一個(gè)實(shí)例化的cdev結(jié)構(gòu)體變量名,通過模塊加載函數(shù)初始化cdev結(jié)構(gòu)體中的成員并分配設(shè)備號(hào),建立cdev結(jié)構(gòu)體與虛擬文件操作結(jié)構(gòu)體file_operations之間的聯(lián)系。file_operations定義了字符設(shè)備驅(qū)動(dòng)提供給虛擬文件系統(tǒng)的接口函數(shù),通過這些接口,上層的應(yīng)用程序可以像操作文件那樣操作外部設(shè)備。當(dāng)用戶空間的應(yīng)用程序進(jìn)行Linux系統(tǒng)調(diào)用時(shí),就會(huì)相應(yīng)調(diào)用驅(qū)動(dòng)程序?qū)?yīng)的函數(shù)。例如應(yīng)用程序調(diào)用open(),write()等函數(shù)時(shí),Linux內(nèi)核就會(huì)相應(yīng)調(diào)用xxx_open(),xxx_write()等函數(shù),這樣便完成了對(duì)設(shè)備的讀寫和控制等操作。當(dāng)刪除設(shè)備時(shí),驅(qū)動(dòng)就會(huì)調(diào)用模塊卸載函數(shù)釋放設(shè)備所占用的相應(yīng)的資源。
2.2.2 字符設(shè)備結(jié)構(gòu)體cdev
在Linux內(nèi)核中,使用cdev結(jié)構(gòu)體描述一個(gè)字符設(shè)備,cdev結(jié)構(gòu)體的定義在
struct cdev
{
struct kobject kobj; //內(nèi)嵌的kobject對(duì)象
struct module *owner; //所屬模塊
struct file_operations *ops; //文件操作
struct list_head list;
dev_t dev; // 設(shè)備號(hào)
unsigned int count;
}
首先模塊加載函數(shù)初始化cdev結(jié)構(gòu)體,并調(diào)用cdev_init(struct cdev *, struct file_operations)函數(shù)分配設(shè)備號(hào),dev是32位的設(shè)備號(hào),其中高12位為主設(shè)備號(hào),低20位為次設(shè)備號(hào)。主設(shè)備號(hào)代表一個(gè)類型的設(shè)備驅(qū)動(dòng),次設(shè)備號(hào)代表區(qū)分該設(shè)備中的不同個(gè)體。這樣也建立了cdev和file_operations之間的連接。設(shè)備號(hào)申請(qǐng)之后,應(yīng)該調(diào)用 cdev_add(struct cdev *, dev_t, unsigned int)函數(shù)添加字符設(shè)備到系統(tǒng)中去。這樣以便于可以使用此設(shè)備驅(qū)動(dòng)對(duì)其操作。在不使用設(shè)備時(shí),調(diào)用cdev_del(struct cdev *)從系統(tǒng)中刪除字符設(shè)備。
2.2.3 分配和釋放設(shè)備號(hào)
在調(diào)用cdev_add()函數(shù)向系統(tǒng)注冊(cè)字符設(shè)備之前,應(yīng)該先調(diào)用register_chrdev_region(dev_t from,unsigned count,const char *name)或者alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigend count, const char *name)函數(shù)向系統(tǒng)申請(qǐng)?jiān)O(shè)備號(hào)。前者用于已知起始設(shè)備號(hào)的情況;后者用于設(shè)備號(hào)未知,向系統(tǒng)動(dòng)態(tài)申請(qǐng)未被占用的設(shè)備號(hào),如果函數(shù)調(diào)用成功,會(huì)把得到的設(shè)備號(hào)放入到參數(shù)dev中,alloc_chrdev_region()相比于register_chrdev_region()的優(yōu)點(diǎn)在于它會(huì)自動(dòng)避開設(shè)備號(hào)重復(fù)的沖突[1]。
相應(yīng)的,在調(diào)用cdev_del()函數(shù)從系統(tǒng)注銷字符設(shè)備之后,unregister_chrdev_region(
dev_t from,unsigned count)函數(shù)用來釋放原先申請(qǐng)的設(shè)備號(hào)。
2.2.4 file_operations結(jié)構(gòu)體
file_operations是字符設(shè)備驅(qū)動(dòng)與內(nèi)核虛擬文件系統(tǒng)的接口,應(yīng)用程序通過linux系統(tǒng)調(diào)用,就會(huì)調(diào)用相應(yīng)驅(qū)動(dòng)程序的函數(shù)。這里給出file_operations結(jié)構(gòu)體的主要成員函數(shù)。
struct file_operations
{
struct module *owner;
loff_t(*xxx_llseek)(struct file *, loff_t, int); ssize_t(*xxx_read)(struct file *, char __user, size_t, loff_t);
ssize_t(*xxx_write)(struct file *, const char __user, size_t, loff_t);
int(*xxx_open)(struct inode *, struct file *);
int(*xxx_release)(struct inode *, struct
file *);
......
}
xxx_llseek()函數(shù)用來修改一個(gè)文件的當(dāng)前讀寫位置,并將新位置返回。xxx_read()函數(shù)用來從設(shè)備中讀取數(shù)據(jù)。它與用戶空間應(yīng)用程序的read()函數(shù)和fread()函數(shù)在進(jìn)行系統(tǒng)調(diào)用時(shí)對(duì)應(yīng)。xxx_write()函數(shù)向設(shè)備發(fā)送數(shù)據(jù),它與用戶空間應(yīng)用程序的write()函數(shù)和fwrite()函數(shù)在進(jìn)行系統(tǒng)調(diào)用時(shí)對(duì)應(yīng)[6].
在Linux中,由于用戶空間和內(nèi)核空間不能相互直接訪問數(shù)據(jù),因此必須借助內(nèi)核函數(shù)copy_from_user(void *to, const __user *from, unsigned long count)完成從用戶態(tài)的數(shù)據(jù)到內(nèi)核態(tài)的復(fù)制,以及copy_to_user(void __user *to
,const void *from,unsigned long count)完成內(nèi)核態(tài)數(shù)據(jù)到用戶態(tài)數(shù)據(jù)的復(fù)制。這樣內(nèi)核態(tài)與用戶態(tài)就可以完成數(shù)據(jù)的讀寫了。
3.1 PCIE總線概述
PCIE總線是由Intel提出的最新的總線和接口標(biāo)準(zhǔn),屬于高速點(diǎn)對(duì)點(diǎn)串行傳輸,所連的設(shè)備獨(dú)享通道帶寬。每個(gè)設(shè)備在傳輸數(shù)據(jù)的時(shí)候會(huì)各自建立相互獨(dú)立,互不干擾的的傳輸通道,數(shù)據(jù)傳輸?shù)男蚀蟠筇岣遊5]。
3.2 PCIE設(shè)備驅(qū)動(dòng)
3.2.1 PCIE設(shè)備驅(qū)動(dòng)概述
PCIE設(shè)備驅(qū)動(dòng)由兩部分組成:Linux內(nèi)核的PCIE設(shè)備驅(qū)動(dòng)和總線上所載設(shè)備本身的驅(qū)動(dòng)。Linux內(nèi)核的PCIE設(shè)備驅(qū)動(dòng)由內(nèi)核實(shí)現(xiàn),它在安裝內(nèi)核時(shí)就已經(jīng)實(shí)現(xiàn)好了。因此本次實(shí)驗(yàn)編寫的驅(qū)動(dòng)就是總線上所載設(shè)備本身的驅(qū)動(dòng),也就是CH367總線的接口芯片的驅(qū)動(dòng)程序。
PCIE設(shè)備有3種地址空間:配置空間、I/O空間、存儲(chǔ)器空間。配置空間是由Linux內(nèi)核完成初始化代碼進(jìn)行相應(yīng)的操作,I/O空間和存儲(chǔ)器空間是由設(shè)備驅(qū)動(dòng)程序訪問,CPU可以訪問所有的PCIE空間。PCIE至少包含256字節(jié)配置空間,前面64字節(jié)是標(biāo)準(zhǔn)化的必備的配置空間[4],后面的配置空間與具體的接口芯片本身相關(guān)。
3.2.2 PCIE設(shè)備驅(qū)動(dòng)的注冊(cè)和注銷
PCIE設(shè)備驅(qū)動(dòng)的注冊(cè)和注銷通過對(duì)pci_driver這個(gè)結(jié)構(gòu)體實(shí)現(xiàn)的[3],注冊(cè)PCIE驅(qū)動(dòng)使用函數(shù)pci_register_driver(struct pci_driver *driver),注銷設(shè)備使用pci_unregister_driver(struct pci_driver *driver);
PCIE設(shè)備驅(qū)動(dòng)的注冊(cè)和注銷與字符設(shè)備驅(qū)動(dòng)的注冊(cè)和注銷并無差異,知識(shí)函數(shù)調(diào)用不同而已,對(duì)于PCIE設(shè)備的初始化,我們使用pci_driver中的probe()函數(shù),它負(fù)責(zé)探測硬件并保存配置信息。
3.2.3 PCIE設(shè)備驅(qū)動(dòng)的數(shù)據(jù)結(jié)構(gòu)
針對(duì)PCIE驅(qū)動(dòng),計(jì)算機(jī)主要完成對(duì)所有掛接在總線設(shè)備上的輪詢以及將設(shè)備添加到系統(tǒng)中,這樣便可以當(dāng)做字符設(shè)備那樣操作PCIE設(shè)備,當(dāng)驅(qū)動(dòng)程序加載之后,硬件相應(yīng)遍歷總線上的設(shè)備,如果識(shí)別到有相應(yīng)設(shè)備掛接在總線上,那么接著就調(diào)用probe()函數(shù)進(jìn)行地址映射、I/O或內(nèi)存分配和映射,中斷號(hào)申請(qǐng),并保存配置信息。其中pci_dev和pci_driver 這兩個(gè)結(jié)構(gòu)體是對(duì)于完成PCIE驅(qū)動(dòng)必不可的數(shù)據(jù)類型。
struct pci_dev
{
struct list_head global_list;
struct list_head bus_list;
struct pci_bus *bus; // PCIE總線的結(jié)構(gòu)體
unsigned int devfn; // PCIE設(shè)備功能號(hào)
unsigned short vendor; // 設(shè)備產(chǎn)商ID
unsigned short device; // 設(shè)備ID
struct pci_driver *driver;
unsigned int irq; // 中斷號(hào)
......
}
pci_dev結(jié)構(gòu)體詳細(xì)地描述了一個(gè)PCIE設(shè)備的硬件信息,包括掛接在總線上的信息和接口芯片本身的信息,如設(shè)備廠商ID、設(shè)備ID、中斷號(hào)等等。
struct pci_driver
{
struct list_head node;
char *name;
const struct pci_device_id *id_table;
int (*probe)(struct pci_dev *dev, const struct pci_device_id *id);
void (*remove)(struct pci_dev *dev);
......
}
pci_driver結(jié)構(gòu)體成員id_table包含驅(qū)動(dòng)程序支持哪些設(shè)備的屬性列表。探測設(shè)備的函數(shù)probe()用于使能PCIE設(shè)備、I/O資源的申請(qǐng)、中斷申請(qǐng)和注冊(cè)字符設(shè)備[3]等相關(guān)操作以及卸載設(shè)備的函數(shù)remove()來注銷設(shè)備,釋放資源。
3.2.4 PCIE設(shè)備驅(qū)動(dòng)的中斷
Linux內(nèi)核的引導(dǎo)程序已經(jīng)為每個(gè)PCIE設(shè)備分配了一個(gè)唯一的中斷號(hào),它保存在配置空間的Interrupt_Line寄存器中,我們只需要使用讀取配置空間的內(nèi)核函數(shù)就可以獲取中斷號(hào)[2]
pci_read_config_byte(dev, Interrupt_Line, &IRQ);
獲取中斷號(hào)后,然后再進(jìn)行相應(yīng)的中斷程序的處理。
4.1 開發(fā)環(huán)境搭建
操作系統(tǒng)為Ubuntu14.04,使用自帶的vim編輯器編寫驅(qū)動(dòng)程序,Ubuntu14.04自帶了GCC編譯器,所以額外工作不需要做的很多,最后編寫Makefile文件。
將驅(qū)動(dòng)程序和Makefile文件放在一個(gè)目錄中,然后在終端中打開文件所在目錄。編譯驅(qū)動(dòng)程序使用命令:make。得到以.ko文件為后綴的驅(qū)動(dòng)安裝文件。
4.2 驅(qū)動(dòng)程序的安裝、卸載與調(diào)試
得到可執(zhí)行文件后。使用下列命令安裝驅(qū)動(dòng)、卸載與調(diào)試:
(1) insmod xxx.ko 加載驅(qū)動(dòng)模塊
(2) cat /pro/devices 查看已經(jīng)安裝設(shè)備驅(qū)動(dòng)節(jié)點(diǎn)的設(shè)備號(hào)
(3) ls /dev/驅(qū)動(dòng)名 查看驅(qū)動(dòng)設(shè)備文件名
(4) rmmod xxx 卸載驅(qū)動(dòng)模塊
驅(qū)動(dòng)安裝完成之后,檢查有了設(shè)備號(hào)和設(shè)備節(jié)點(diǎn)名,如果安裝提示權(quán)限不夠,請(qǐng)?jiān)诿钋凹由蟬udo取得root權(quán)限,然后編寫應(yīng)用程序進(jìn)行相關(guān)調(diào)試,編寫好應(yīng)用程序之后使用GCC編譯器編譯源代碼得到可執(zhí)行的應(yīng)用程序。使用下列命令命令:
(5) gcc xxx.c -o xxx 編譯應(yīng)用程序
(6) . /xxx 運(yùn)行應(yīng)用程序
最后得到調(diào)試結(jié)果,實(shí)現(xiàn)了項(xiàng)目需求,實(shí)驗(yàn)結(jié)果如圖3所示:
4.3 實(shí)驗(yàn)數(shù)據(jù)分析
根據(jù)圖3所示,應(yīng)用程序每次間隔一秒讀取時(shí)鐘卡上面的
圖3 實(shí)驗(yàn)結(jié)果
時(shí)間信息,時(shí)間信息是GPS或者是北斗衛(wèi)星通過串口給下位機(jī),下位機(jī)解析時(shí)間信息之后傳送到雙口RAM,上位機(jī)機(jī)通過PCIE總線讀取雙口RAM時(shí)間信息,雙方設(shè)定好通訊協(xié)議。同時(shí)上位機(jī)還可以通過控制命令發(fā)送給下位機(jī)進(jìn)行相應(yīng)操作。數(shù)據(jù)第一列表示數(shù)據(jù)項(xiàng)的個(gè)數(shù);第二列表示日期;第三列表示時(shí)間,后面的四位數(shù)代表200us時(shí)間刻度;第四列表示鎖定的衛(wèi)星個(gè)數(shù),且不為零則表示時(shí)間和日期信息均來至于GPS或者北斗時(shí)間信息,如果為零則表示時(shí)間和日期信息均來至于時(shí)鐘卡本身的實(shí)時(shí)時(shí)鐘;第五列表示B碼質(zhì)量字節(jié);第六列表示板卡為主卡或者從卡的工作方式:slave 或者master;最后一列就是對(duì)前面時(shí)間信息的顯示是來至于GPS或者北斗衛(wèi)星的信息還是來至于實(shí)時(shí)時(shí)鐘的信息:RTC或者GPS。
本文以自主研發(fā)的PCIE同步時(shí)鐘卡為實(shí)際應(yīng)用背景,闡明了Linux下字符設(shè)備驅(qū)動(dòng)的開發(fā)以及相關(guān)的文件系統(tǒng)與數(shù)據(jù)結(jié)構(gòu),并結(jié)合實(shí)際項(xiàng)目做了PCIE驅(qū)動(dòng)程序的設(shè)計(jì)。PCIE總線作為一種通用的總線接口標(biāo)準(zhǔn),在目前的計(jì)算機(jī)系統(tǒng)中得到了廣泛的應(yīng)用,不論是在Windows還是Linux操作系統(tǒng)中,其驅(qū)動(dòng)程序的開發(fā)也備受關(guān)注,Linux作為開源的操作系統(tǒng),對(duì)設(shè)備驅(qū)動(dòng)支持具有更大的發(fā)展?jié)摿?,是今后的一個(gè)技術(shù)研究方向。
[1] 宋寶華. Linux設(shè)備驅(qū)動(dòng)開發(fā)詳解[M]. 北京:機(jī)械工業(yè)出版社, 2016.
[2] 王學(xué)東,崔琪楣. Linux下的PCIE設(shè)備驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)[EB/OL]. 北京:中國科技論文在線,2013.
[3] 王 軍,韓 力,杜博軍,等. 基于PCI-E總線的北斗導(dǎo)航授時(shí)卡Linux驅(qū)動(dòng)設(shè)計(jì)[J].計(jì)算機(jī)測量與控制, 2016,24(4):115-117.
[4] 董春橋,李 凱. Linux系統(tǒng)PCI設(shè)備驅(qū)動(dòng)程序開發(fā)[J]. 計(jì)算機(jī)測量與控制,2005,13(11):1289-1291.
[5] 周立國,梁淮寧,謝冬冬,等. 基于PCI Express總線的數(shù)據(jù)傳輸卡的設(shè)計(jì)與實(shí)現(xiàn)[J].電子測量技術(shù),2007,30(11):28-31.
[6] 趙 明. 嵌入式PCI-E設(shè)備驅(qū)動(dòng)程序的開發(fā)與應(yīng)用[D]. 西安:西安電子科技大學(xué),2014.
[7] 李 樺,高 飛,孫 磊. 嵌入式Linux設(shè)備驅(qū)動(dòng)程序研究[J].微計(jì)算機(jī)信息,2010,26(5-2):68-70.
Device Driver Development of PCIE Synchronous Clock Card Based on Linux
Yang Bingjian,Wei Feng,Chen Yongzhi
(College of Automation,Huazhong University of Science and Technology, Wuhan 430074, China)
In order to provide the system accurate synchronization time and offer the high precision synchronous absolute time scale to most automation devices(such as fault wave record and data acquisition device),it can unite time benchmark for the parts in the system and also provide powerful basis with failure analysis and switch action sequence after system failure.Therefore, synchronous clock source is made based on the GPS and China's Beidou receiver double system which can receive the GPS(global positioning system) satellites and China's Beidou satellites positioning and timing information. The latest PCIE bus is designed to communicate and obtain time information with PC and synchronous clock source.This paper introduced driver programming development for the PCIE synchronous clock card based on Linux.It briefly analyses the synchronous clock card system framework and its working principle and reveals the Linux character device driver development process. Finally it achieves PCIE device driver development and implementation based on Linux operating system. The driver’s completeness and correctness are verified by experiment and can accurately read GPS receiver or Beidou system time information.
PCIE bus; device dirver; Linux; synchromous clock; kernel programming
2016-08-01;
2016-09-06。
楊兵見(1990-),男,湖北省荊州市人,碩士研究生,主要從事同步時(shí)鐘源、檢測技術(shù)、嵌入式軟件方向的研究。
1671-4598(2017)01-0098-03DOI:10.16526/j.cnki.11-4762/tp
TP
A