亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Linux 下基于PC I-E時統(tǒng)卡的驅(qū)動程序設(shè)計

        2015-10-18 02:15:48胡愛蘭華北計算機系統(tǒng)工程研究所北京100083
        關(guān)鍵詞:設(shè)備系統(tǒng)

        劉 凱,胡愛蘭(華北計算機系統(tǒng)工程研究所,北京 100083)

        Linux 下基于PC I-E時統(tǒng)卡的驅(qū)動程序設(shè)計

        劉 凱,胡愛蘭
        (華北計算機系統(tǒng)工程研究所,北京 100083)

        簡要介紹了Linux操作系統(tǒng)和PCI-Express(PCI-E)總線的特點以及Linux設(shè)備驅(qū)動的作用。以PEX8311時統(tǒng)卡為例,闡述了Linux系統(tǒng)下PCI-E驅(qū)動程序開發(fā)的流程和技巧,并通過DMA模式測試了驅(qū)動程序的可行性。

        設(shè)備驅(qū)動;Linux;PCI-Express;PEX8311;DMA

        0 引言

        Linux操作系統(tǒng)憑借其開放的源代碼、良好的擴展性以及安全高效等特點,受到越來越多領(lǐng)域開發(fā)者的重視,并逐步成為各種計算機終端、服務(wù)器工作站及嵌入式平臺的主流操作系統(tǒng)。PCI-Express(PCI-E)作為最新一代的總線接口,其點對點的串行設(shè)計以及雙通道高帶寬的傳輸模式,大大提高了數(shù)據(jù)的傳輸速率[1],它的廣泛應(yīng)用將全面取代PCI、AGP等總線。

        目前基于Linux平臺下的 PCI-E總線的應(yīng)用十分廣泛,小到微型嵌入式系統(tǒng),大到超大型服務(wù)器系統(tǒng),都可以看到二者的完美結(jié)合。而驅(qū)動程序作為硬件設(shè)備與操作系統(tǒng)之間的橋梁,對硬件的工作起著至關(guān)重要的作用。本文介紹的是Linux下基于PCI-E時統(tǒng)卡的驅(qū)動程序的開發(fā)過程。

        1 PCI-E時統(tǒng)卡

        本文中使用的PCI-E時統(tǒng)卡是自主研發(fā)的一款硬件設(shè)備。該時統(tǒng)卡通過接受B碼終端發(fā)來的信號,然后經(jīng)FPGA進行解碼,獲得時間信息,并以1 pps脈沖為基準產(chǎn)生用戶所需要的 20 Hz、100 Hz等中斷脈沖信號,最后通過PCI-E橋接芯片PEX8311進行數(shù)據(jù)交互,使得時統(tǒng)卡中的時間信息以及中斷信息能夠傳到計算機終端或服務(wù)器中。而要想讓安裝在計算機終端或者服務(wù)器中的時統(tǒng)卡能夠正常工作,就需要為其開發(fā)配套的驅(qū)動程序,主要就是針對PEX8311芯片的驅(qū)動。圖1所示為時統(tǒng)卡PEX8311芯片的結(jié)構(gòu)簡圖。數(shù)據(jù)經(jīng)由PFGA傳到Local Bus,然后通過內(nèi)部總線再到 PCI-E總線,最后傳到計算機終端中。

        圖1 時統(tǒng)卡PEX8311芯片的結(jié)構(gòu)簡圖

        2 Linux設(shè)備驅(qū)動程序

        Linux設(shè)備驅(qū)動程序是一種使計算機軟件與硬件設(shè)備進行交互的特殊程序。圖2所示為Linux設(shè)備驅(qū)動與操作系統(tǒng)及外設(shè)的關(guān)系。設(shè)備驅(qū)動程序位于Linux操作系統(tǒng)的內(nèi)核空間,它相當于操作系統(tǒng)內(nèi)核空間與物理層硬件設(shè)備之間的接口,它還為用戶層提供系統(tǒng)調(diào)用的接口函數(shù)。用戶層的應(yīng)用程序不能直接訪問操作物理層的外部硬件設(shè)備,只有通過系統(tǒng)調(diào)用才可以訪問操作外部硬件設(shè)備[2]。因此可以看出設(shè)備驅(qū)動程序在操作系統(tǒng)中起到了相當大的作用。

        圖2 Linux設(shè)備驅(qū)動與操作系統(tǒng)及外設(shè)的關(guān)系

        3 Linux設(shè)備驅(qū)動開發(fā)過程

        Linux設(shè)備驅(qū)動程序的編寫可以模塊化,主要包括:設(shè)備的初始化、驅(qū)動模塊的加載與卸載、設(shè)備的打開與釋放、數(shù)據(jù)讀寫與操作、中斷響應(yīng)。

        3.1 設(shè)備的初始化

        Linux系統(tǒng)啟動后會自動檢測計算機終端上所有的PCI-E設(shè)備的信息,并記錄在pci_dev結(jié)構(gòu)體中,其中包括硬件設(shè)備的廠商號、設(shè)備號等大部分的硬件信息。PCI-E驅(qū)動程序就是根據(jù)廠商號和設(shè)備號來連接設(shè)備并加載驅(qū)動的,這就需要在驅(qū)動程序中定義該驅(qū)動所支持的硬件參數(shù)信息。本文中使用的時統(tǒng)卡的PCI-E橋接芯片是 PEX8311,其硬件參數(shù)信息定義分別為廠商號、設(shè)備號、子廠商號、子設(shè)備號、類別和類別掩碼。初始化代碼如下。

        3.2 驅(qū)動模塊的加載與卸載

        硬件設(shè)備驅(qū)動的加載,必須要有一個主設(shè)備號。設(shè)備號的分配有兩種方式:靜態(tài)分配和動態(tài)分配。靜態(tài)分配指的是由開發(fā)人員指定一個固定的設(shè)備號;動態(tài)分配則是由操作系統(tǒng)自動分配設(shè)備號。在不能明確某設(shè)備號是否被使用的情況下,建議使用動態(tài)分配的方式獲得設(shè)備號,這樣就避免了因設(shè)備號沖突導(dǎo)致硬件設(shè)備不能正常工作的情況出現(xiàn)。分配了設(shè)備號就可以注冊設(shè)備并加載設(shè)備驅(qū)動了。而當該設(shè)備不再使用時,可以將該設(shè)備的驅(qū)動模塊卸載掉,以此來減少系統(tǒng)內(nèi)核的占用以及其他系統(tǒng)資源的開銷。驅(qū)動模塊加載與卸載的代碼如下。

        //驅(qū)動模塊的加載

        static int__init plxpci_init(void)

        ……

        /*注冊設(shè)備,register_chrdev函數(shù)的第一個參數(shù)為 0,表示系統(tǒng)自動分配一個空閑的主設(shè)備號*/

        card->MajorID=register_chrdev(0,PLX_DRIVER_NAME,&plxpci_fops);

        pci_register_driver(&PlxPciDriver);

        ……

        //驅(qū)動模塊的卸載

        static void__exit plxpci_cleanup(void)

        unregister_chrdev(major,PLX_DRIVER_NAME);

        pci_unregister_driver(&plxpci_driver);

        3.3 設(shè)備的打開與釋放

        Linux系統(tǒng)內(nèi)核在驅(qū)動模塊加載之后就可以打開硬件設(shè)備。設(shè)備的打開模塊主要是獲取設(shè)備的控制權(quán),允許中斷的產(chǎn)生等。而當不再使用該設(shè)備時,就需要釋放該設(shè)備。設(shè)備的釋放模塊的任務(wù)與設(shè)備的打開模塊的任務(wù)正好相反,主要是釋放對設(shè)備的控制權(quán)、中斷以及之前系統(tǒng)分配的一些資源等。設(shè)備打開與釋放的代碼如下。

        //設(shè)備的打開

        static int plxpci_open(struct inode*inode,struct file*file)

        ……

        /*獲取設(shè)備的控制權(quán) */

        dev->open_mode|=file->f_mode&(FMODE_READ| FMODE_WRITE);

        /*允許中斷產(chǎn)生*/

        plxpci_enable_IRQ(dev);

        return 0;

        //設(shè)備的釋放

        static int plxpci_release(struct inode*inode,struct file*file)

        ……

        /*釋放對設(shè)備的控制權(quán) */

        dev->open_mode&=(~file->f_mode)&(FMODE_READ| FMODE_WRITE);

        free_irq(card->irq,card);

        kfree(card);

        return0;

        3.4 數(shù)據(jù)讀寫與操作

        本文中驅(qū)動程序使用的是DMA(Direct Memory Access)傳輸模式。DMA傳輸模式無需計算機或本地控制器的干預(yù),傳輸效率很高,從而大大降低了控制器的工作量且提高了數(shù)據(jù)的傳輸速率及效率[3]。要完成 DMA傳輸模式就需要了解時統(tǒng)卡上主要的PCI-E橋接芯片PEX8311的工作模式。從參考文獻[4]中可知,PEX8311芯片中有幾個重要的寄存器:(1)LCS_DMAMODE0,地址是80h,該寄存器主要用來設(shè)置DMA的模式。(2)LCS_DMADPR0,地址是 90h,該寄存器主要用來設(shè)置 DMA的傳輸方向。當LCS_DMADPR0[3]=1,表示傳輸方向從Local Bus到PCI-E,若為0,則方向相反。(3)LCS_DMACSR0,地址是A8h,該寄存器主要用來啟動DMA傳輸。成功設(shè)置了DMA的傳輸模式,就可以從時統(tǒng)卡中讀出時間信息。DMA傳輸?shù)拇a如下。

        //DMA傳輸模式

        ……

        /*設(shè)置DMA傳輸方向*/

        PlxPci_PlxRegisterWrite(pDevice,0x90,SglPciAddress|(1<<0)|(1<<3));

        /*設(shè)置DMA模式*/

        PlxPci_PlxRegisterWrite(pDevice,0x80,0x00020642);

        /*啟動DMA傳輸*/

        RegValue=PlxPci_PlxRegisterRead(pDevice,0xA8,NULL);

        RegValue|=(1<<0);

        PlxPci_PlxRegisterWrite(pDevice,0xA8,RegValue);

        RegValue|=(1<<1);

        PlxPci_PlxRegisterWrite(pDevice,0xA8,RegValue);

        ……

        3.5 中斷響應(yīng)

        中斷是 Linux系統(tǒng)中非常寶貴的資源,任何驅(qū)動程序都需要申請中斷并注冊中斷處理才可以使用中斷??梢允褂弥袛嗟姆绞絹碜x取硬件設(shè)備中的數(shù)據(jù)。而如果硬件設(shè)備不支持中斷,則只能采用輪詢的方式來讀取數(shù)據(jù)。硬件設(shè)備中一般包含好幾種不同的中斷,例如1 Hz、20 Hz、100 Hz等。因此,當讀取中斷狀態(tài)位之后還需要將不同的中斷識別區(qū)分開來才能使用。另外,為方便用戶層的應(yīng)用軟件對中斷的使用,使用信號機制來向用戶層發(fā)送中斷信號,通知用戶層的應(yīng)用軟件獲取中斷狀態(tài)位。中斷響應(yīng)程序如下。

        //中斷響應(yīng)

        irq_handler_t plxpci_interrupt(int irq,void*dev_id,struct pt_regs*regs)

        ……

        /*讀取中斷狀態(tài)位,其中包含多種中斷,需要在下一步識別并解析出不同的中斷*/

        /*通知調(diào)度函數(shù)向應(yīng)用層軟件發(fā)送中斷信號*/

        tasklet_schedule(&dev->tlet);

        return(IRQ_HANDLED);

        4 驅(qū)動程序的測試

        4.1 驅(qū)動程序的加載

        本文中開發(fā)及測試平臺所使用的操作系統(tǒng)是中標麒麟 Linux操作系統(tǒng),該系統(tǒng)的內(nèi)核版本是 2.6.32。Linux下驅(qū)動程序模塊的加載通常有動態(tài)加載和靜態(tài)加載兩種方式。靜態(tài)加載就是把編譯生成的驅(qū)動程序文件plx8311.ko編譯到內(nèi)核中,每次系統(tǒng)啟動時自動調(diào)用,這種方式比較適合最終版本的驅(qū)動程序。動態(tài)加載就是通過insmod命令加載驅(qū)動程序,通過rmmod命令可以卸載驅(qū)動程序,這樣隨時可以修改驅(qū)動程序,對于還在調(diào)試階段的程序比較方便。

        4.2 測試過程與結(jié)果

        測試前首先保證在計算機終端中安裝好時統(tǒng)卡,并連接B碼終端,然后加載驅(qū)動程序,使用 lsmod命令查看驅(qū)動程序是否已經(jīng)加載好。圖3所示為plx8311驅(qū)動加載成功。當驅(qū)動程序可以正常加載,并且能夠通過測試程序讀出時統(tǒng)卡中的時間信息和中斷信息,則說明編寫的驅(qū)動程序是可行的。圖4所示為測試結(jié)果,前面顯示的是從時統(tǒng)卡中讀出的當前時間,后面3個數(shù)字表示從啟動測試程序到當前時刻所獲得的1 Hz、20 Hz、100 Hz中斷信號的個數(shù)。

        圖3 驅(qū)動加載成功

        圖4 測試結(jié)果

        5 結(jié)論

        Linux系統(tǒng)的開源性加上 PCI-E總線在計算機系統(tǒng)中的廣泛應(yīng)用,使得其兩者的結(jié)合越來越緊密,Linux系統(tǒng)下的PCI-E的驅(qū)動開發(fā)也得到了廣泛的關(guān)注。本文結(jié)合實際項目開發(fā),通過對PEX8311時統(tǒng)卡的驅(qū)動程序編寫過程中的各模塊的介紹,闡述了整個驅(qū)動的開發(fā)流程和相關(guān)技巧,并通過編寫測試程序完成了驅(qū)動程序的測試工作,驗證了驅(qū)動的可用性。

        [1]BUDRUK R,ANDERSON D,SHANLEY T.PCI Express系統(tǒng)體系結(jié)構(gòu)標準教材[M].田玉敏,王崧,張波,譯.北京:電子工業(yè)出版社,2005.

        [2]鄭強.Linux驅(qū)動開發(fā)入門與實踐[M].北京:清華大學(xué)出版社,2010.

        [3]范晶,胡愛蘭.基于狀態(tài)機的 PEX8311的 DMA實現(xiàn)[J].微型機與應(yīng)用,2014,33(22):30-33.

        [4]PLX.PEX8311 AA data book version 1.0[OL].[2015-04-15].http://www.plxtech.com/mydata.

        Design of driver based on PCI-E tim ing card on Linux

        Liu Kai,Hu Ailan
        (National Computer System Engineering Research Institute of China,Beijing 100083,China)

        This paper briefly introduces the characteristics of Linux OS and PCI-Express(PCI-E)bus and the functions of device drivers on Linux.Case in timing card based on PEX8311,this paper elaborates the development processes and skills of PCIE drivers on Linux,and tests the feasibility of the drivers by DMA.

        device driver;Linux;PCI-Express;PEX8311;DMA

        TP311.1

        A

        1674-7720(2015)24-0013-03

        劉凱,胡愛蘭.Linux下基于PCI-E時統(tǒng)卡的驅(qū)動程序設(shè)計[J].微型機與應(yīng)用,2015,34(24):13-15,18.

        2015-06-23)

        劉凱(1989-),男,碩士研究生,主要研究方向:Linux下嵌入式硬件驅(qū)動。

        胡愛蘭(1973-),女,高級工程師,主要研究方向:通信、信息處理及計算機應(yīng)用。

        猜你喜歡
        設(shè)備系統(tǒng)
        諧響應(yīng)分析在設(shè)備減振中的應(yīng)用
        Smartflower POP 一體式光伏系統(tǒng)
        WJ-700無人機系統(tǒng)
        ZC系列無人機遙感系統(tǒng)
        北京測繪(2020年12期)2020-12-29 01:33:58
        基于PowerPC+FPGA顯示系統(tǒng)
        半沸制皂系統(tǒng)(下)
        基于VB6.0+Access2010開發(fā)的設(shè)備管理信息系統(tǒng)
        基于MPU6050簡單控制設(shè)備
        電子制作(2018年11期)2018-08-04 03:26:08
        連通與提升系統(tǒng)的最后一塊拼圖 Audiolab 傲立 M-DAC mini
        500kV輸變電設(shè)備運行維護探討
        天啦噜国产精品亚洲精品| 国产亚洲中文字幕一区| 男女视频在线观看一区| 色吊丝中文字幕| 亚洲成a人片在线看| 亚洲av五月天天堂网| 亚洲一区二区三区麻豆| 激情五月天色婷婷久久| 又大又粗欧美黑人aaaaa片 | 国产av精选一区二区| 欧美性猛交99久久久久99按摩| 午夜成人精品福利网站在线观看 | 国产日产免费在线视频| 玖玖色玖玖草玖玖爱在线精品视频 | 午夜毛片不卡免费观看视频| 亚洲男人天堂2019| 国产成人精品一区二免费网站| 亚洲禁区一区二区三区天美| 精品日韩一级免费视频| 国内精品久久久人妻中文字幕| 亚洲色偷拍区另类无码专区| 91精品国产闺蜜国产在线| 特级黄色大片性久久久| 亚洲欧洲国产成人综合在线| 国语对白做受xxxxx在线中国| 亚洲女同同性少妇熟女| 我的美艳丝袜美腿情缘| 天天做天天爱夜夜爽| 国产999精品久久久久久| 无码中文字幕久久久久久| 国产亚洲成人精品久久久| 中文字幕久久久人妻无码| 小12箩利洗澡无码视频网站| 亚洲精品国产av成人网| 少妇裸体性生交| 无遮无挡三级动态图| 久久中文字幕av第二页| 日韩亚洲中文有码视频| 亚洲五月天综合| 久久av无码精品人妻糸列| 综合久久一区二区三区|