色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

基于Linux操作系統實現無配置信息PCI設備的驅動設計

電子設計 ? 來源:電子元器件應用 ? 作者:陳寧,虢莉敏,王新 ? 2020-09-17 16:42 ? 次閱讀

引言

Linux是非常優秀的開源操作系統,有著十分廣泛的應用。基于該操作系統設備驅動程序的需求越來越多。PCI作為一種廣泛采用的總線標準,在嵌入式系統中正被大量使用,而Linux的內核也能很好地支持PCI設備。為此,本文介紹了Linux下無配置信息PCI設備驅動程序的設計開發方法。

1 PCI總線及無配置信息PCI設備

1.1 PCI總線

PCI是外圍設備互連(Peripheral ComponentInterconnect)的簡稱,是一種通用的總線接口標準,原先是應用于計算機系統的。PCI提供了一組完整的總線接口規范,其目的是描述如何將計算機系統中的外圍設備以一種結構化和可控化的方式連接在一起。該規范同時詳細定義了計算機系統中各個不同部件之間應該如何正確地進行交互。在一般的計算機系統中,總線子系統與存儲子系統被PCI總線分開,CPU通過一塊稱為PCI橋的設備來完成同總線子系統的交互,圖1所示是一個PCI子系統的體系結構。

基于Linux操作系統實現無配置信息PCI設備的驅動設計

盡管目前PCI設備大多采用32位數據總線,但PCI規范中已經給出了64位的擴展實現方案,從而使PCI總線能夠更好地實現平臺無關性。雖然PCI總線是由Intel公司提出的,但它不局限于Intel系列的處理器。當今流行的其它處理器系列如Alpha、PowerPC、APARC,以及多處理器結構的下一代處理器都可以使用PCI總線。具體而言,PCI總線包含的特點可簡要描述為高性能、線性突發傳輸、極小的存取延誤、采用總線主控和同步操作、獨立于處理器、兼容性強、預留了發展空間、低成本、高效益、軟件透明等等。

1.2 PCI設備的配置空間

標準的PCI設備上有三種地址空間:I/O空間、存儲空間及配置空間。CPU可以訪問PCI設備上的所有地址空間,其中I/O空間和存儲空間提供給設備驅動程序使用,主要用來實現PCI設備和Linux內核中設備驅動程序之間的通訊。而配置空間則裝載著PCI設備的配置信息,主要由Linux內核中的PCI初始化代碼使用。PCI設備的配置信息空間如圖2所示。

標準PCI設備配置信息空間的大小為256個字節,其中低64個字節稱為頭標區,這部分區域的格式是固定的。內容包括PCI設備號、廠商識別號、命令寄存器、狀態寄存器、基址寄存器等重要信息;其余的192個字節稱為設備有關區,不同的設備可以對這部分寄存器進行不同的定義。

1.3 無配置信息的PCI設備

目前的嵌人式系統往往會要求CPU和專用數據運算器之間以很高的速率通信。由于現行的總線規范中,PCI的高性能是最為突出的,因此PCI總線的連接方式被大量采用。數據運算器往往是針對某一系統設計的,通常會采用FPGA設計。即在FPGA中添加進PCI的接口設計,也就是把FPGA設計成為一塊PCI設備。但是由于嵌入式系統的局限性,在某些FPGA的PCI接口設計中不能劃分配置信息空間(I/O空間和存儲空間是設備與CPU信息交互的基礎,是必須存在的),因此這個設計也就是一塊無配置信息的PCI設備。

2 Linux設備驅動程序

Linux的設備驅動程序大致可以分為驅動程序的注冊與注銷、設備的打開與釋放、設備的讀寫操作、設備的控制操作、設備的中斷和輪詢處理幾個部分。

2.1 設備的注冊與注銷

向系統增加一個驅動程序就要賦予它一個主設備號,這一賦值過程應該在驅動程序的初始化中完成,它通過調用函數register_chrdev()或reg-iste_blkdev ()向內核注冊。接下來就是給程序一個設備驅動程序名,這個名字必須插入到/dev目錄中,并與驅動程序的主設備號和次設備號相連。獲得主設備號的方法是選擇一個當前不用的設備號,或者在調用register_chrdev時讓參數ma-jor為0,這樣,其返回值便是設備的主設備號。另外,在關閉字符設備或塊設備時,還需要通過unregisler_chrdev()或unregister_blkdev()從內核中注銷設備,并釋放主設備號。

2.2 設備的打開與釋放

打開設備可由open()完成。在大部分驅動程序中,open主要用于檢查設備相關錯誤(如設備尚未準備好等)、識別次設備號(如有必要更新當前read/write位置f_ops指針),以及分配和填寫要放在file-》private_data里的數據結構。

釋放設備由release()完成,release的作用與open相反,主要是釋放file-》private_data中open分配的內存,并在最后一次關閉操作時關閉設備。

2.3 設備的讀寫操作

字符設備使用各自的read()和write ()來對設備進行數據讀寫。塊設備則使用通用block_read()和block_write()來對設備進行數據讀寫。這兩個通用函數可以向請求表中增加讀寫請求,這樣,內核就可以優化請求順序。由于是對內存緩沖區而不是對設備進行操作,因而能加快讀寫請求。如果內存緩沖區內沒有要讀入的數據或者需要將寫請求寫入設備,那么就需要真正地執行數據傳輸。

2.4 設備的控制操作和中斷處理

除了讀寫操作外,有時還需要控制設備。這在操作時可以通過設備驅動程序中的ioctl()來完成。另外,對于不支持中斷的設備,讀寫時需要輪流查詢設備狀態,以決定是否繼續進行數據傳輸。如果設備支持中斷,則可按中斷方式進行。

3 無配置信息PCI設備驅動程序的設計

無配置信息PCI設備驅動程序設計的關鍵在于初始化,其余部分與標準PCI設備驅動差別不大。其初始化的方法有兩種:一是選用外接的EEPROM來存儲該設備的配置信息;二是直接在驅動程序的探測模塊里注冊設備。

用外接EEPROM配置方式時,內核啟動后會檢測EEPROM,然后讀出其中的配置信息,并將設備的信息注冊到pci dev里。

在實際的系統應用中,如果無法外接EEP-ROM,就必須直接在驅動程序的探測模塊里注冊設備。在這種方式下,若系統中沒有其它的即插即用PCI設備,則可能會導致檢測設備失敗,但事實上已經注冊了該PCI設備,因此完全可以正常運行。

筆者開發的嵌入式TDMA衛星通信系統中的CPU采用MPC8250芯片,基帶信號處理模塊采用Xilinx公司的X3SC4000(FG676)。MPC8250是Mo-torola公司開發的一款PowerPC系列嵌入式處理器,該處理器中有32位超標量體系結構Power-PC603e處理器內核,并集成有PCI橋、PCI仲裁器、存儲器控制器等部件。FPGA的設計中則包括PCI接口、sdram控制器及編碼調制運算模塊。

此操作系統采用Linux,內核版本為2.6。由于Linux能很好地支持PCI總線,本設計在CPU和FPGA之間采用了PCI總線連接方式。由于FPGA的設計要求,PCI總線的中斷信號未被使用,而是另行設定了兩條中斷信號線通往MPC8250的通用設計口。該系統支持FPGA中bin文件的實時更新,因此沒有采用配置EPROM來配置FPGA,而是把要下載到FPGA里的bin文件同Uboot、Linux內核及jffs2文件系統一起放在了FLASH里,然后通過MPC8250提供的SPI總線下載到FPGA中。實際上,如需要更新FPGA的.bin文件,則可通過以太網口將文件拷入FLASH中再下載。

在系統上電啟動后,由于Linux內核先于jffs2解壓,而FPGA的文件又必須在jffs2解壓完后才能釋放到內核空間,然后再借助SPI總線下載到FP-GA中,因此無法在FPGA中創建PCI設備配置信息空間,所以,本設計采用在檢測PCI設備時直接注冊的方法。

3.1 驅動程序的總體框架

下面是筆者驅動的整體框架,從中可以很明顯地看出幾個模塊是如何聯系起來的:

3.2 具體模塊的實現

由于本系統沒有采用標準PCI總線提供的中斷信號,因此驅動程序中無中斷處理模塊,下面著重介紹對本設計比較重要的初始化設備過程以及打開設備模塊、讀寫模塊的設計方法。

(1) 初始化設備過程

初始化設備過程也是本系統PCI設備驅動中最為關鍵的部分。由于本系統中允許PCI總線掛接其它的即插即用設備,因此,這部分程序還需要保留。其部分代碼及注釋如下:

在2.4之前的內核版本中,需要手動調用pci_find_device()函數來查找PCI設備,但在2.4版本后,則可以調用probe探測函數來完成對硬件的檢測及信息獲取工作。其部分代碼如下:

在獲取的PCI信息子函數pci_rewin_pci_re-sources_claim()和注冊設備子函數pci_rewin_de-vice_register()里,筆者自己創建的PCI設備信息可以寫人到pci_dev,然后由Liunx內核通過pci_register_drivet ()將此PCI設備信息創建在PCI設備列表中。

(2) 打開設備模塊

打開設備模塊主要用來檢查設備號、開辟PCI總線映射空間。打開設備模塊的部分代碼及注釋如下:

(3) 讀寫模塊

讀操作就是先通過memcpy_fromio函數將PCI上傳來的數據搬移到內核空間中的接收緩沖區,再用copy_to_user搬移到用戶數據空間。接收緩沖區和接收數據散列表都要在初始化模塊中進行處理。讀操作的部分代碼及注釋如下:

寫操作與讀操作正好相反,它先通過copy_from_user函數將用戶空間的數據搬移到內核空間中的發送緩沖區,再通過memcpy函數搬移到PCI總線上。由于發送的數據長度是可變的,所以每次發送都需要構造不同的發送散列表(發送緩沖區可以再初始化時分配)。寫操作的代碼與讀操作類似,故此省略。

值得注意的是,在PCI設備用I/O方式讀寫的時候,CPU將被迫停止工作以等待PCI設備完成此操作,且每次只允許一個設備訪問。這個策略不利于提升系統性能。但利用MPC8250芯片提供的DMA(直接內存訪問)機制則可大大提高PCI總線的性能,這也是筆者下一步需要改進的地方。

4 結束語

本文討論了Linux2.6版本下開發設備驅動程序的原理和相關知識。著重介紹了無配置信息PCI設備驅動程序的開發方法。該驅動開發方法可成功應用于嵌入式TDMA衛星通信系統。測試證明:本系統可穩定有效工作。今后的工作將著重是提升系統性能并進行改進。

責任編輯:gt

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11322

    瀏覽量

    209892
  • 操作系統
    +關注

    關注

    37

    文章

    6856

    瀏覽量

    123462
  • PCI
    PCI
    +關注

    關注

    4

    文章

    670

    瀏覽量

    130349
收藏 人收藏

    評論

    相關推薦

    嵌入式LinuxPCI設備驅動的設計

    關鍵問題的設計與實現[J]. 測控技術,2002,21(8):58-60.[5] 錢晨,徐榮華,王欽若. 基于Linux操作系統設備驅動
    發表于 10-08 09:44

    有無操作系統的嵌入式Linux驅動設備有何區別?

    有無操作系統的嵌入式Linux驅動設備有何區別? 一、驅動的作用任何一個計算機系統的運行都是
    發表于 08-13 17:53

    配置信息PCI設備驅動程序的開發方法是什么

    本文介紹了Linux配置信息PCI設備驅動程序的設計開發方法。
    發表于 04-27 06:10

    基于Linux操作系統下的音頻設備驅動移植的配置過程是怎樣的

    SoC是怎樣通過I2C和SAI與FS-MP1A進行數據交互的?基于Linux操作系統下的音頻設備驅動移植的配置過程是怎樣的?
    發表于 02-28 06:42

    如何去實現基于Linux操作系統下的WiFi設備驅動移植呢

    FS-MP1A開發板的原理是什么?如何去實現基于Linux操作系統下的WiFi設備驅動移植呢?
    發表于 02-28 09:55

    基于Linux操作系統下的MIPI觸摸屏設備驅動移植配置過程是如何實現

    基于Linux操作系統下的MIPI觸摸屏設備驅動移植配置過程是如何實現的?
    發表于 02-28 10:10

    實時操作系統VxWorks下PCI總線配置技術

    實時操作系統VxWorks下PCI總線配置技術
    發表于 03-29 12:26 ?19次下載

    Linux系統PCI設備驅動程序開發

    為了促進“Linux+PCI”技術在工控領域中的應用,通過對Linux系統PCI局部總線規范實現機制和
    發表于 07-16 09:55 ?17次下載

    基于Linux操作系統設備驅動程序開發

    本文介紹了Linux 系統的特點,闡述了在Linux 操作系統下,對系統硬件的訪問和開發驅動程序
    發表于 09-02 17:11 ?20次下載

    Linux操作系統中的PCI驅動開發

    0引言PCI總線是一種成熟的計算機標準總線,而Linux操作系統則是一種源代碼公開的操作系統Linux構架完全沿襲了UNIX的
    發表于 09-23 15:50 ?1100次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>操作系統</b>中的<b class='flag-5'>PCI</b><b class='flag-5'>驅動</b>開發

    Linux操作系統下的PCI驅動開發

    PCI總線是一種成熟的計算機標準總線,而Linux操作系統則是一種源代碼公開的操作系統Linux構架完全沿襲了UNIX的
    發表于 06-07 10:30 ?1675次閱讀
    <b class='flag-5'>Linux</b><b class='flag-5'>操作系統</b>下的<b class='flag-5'>PCI</b><b class='flag-5'>驅動</b>開發

    基于操作系統PCI程序開發

    Vxworks是WindRiver公司開發的嵌入式實時操作系統,廣泛地應用于航空航天、工業控制、通信等領域;分析了VxWorks下PCI設備驅動程序的
    發表于 09-22 16:31 ?9次下載
    基于<b class='flag-5'>操作系統</b>的<b class='flag-5'>PCI</b>程序開發

    Linux操作系統下的PCI驅動開發

    、安全的優點,尤其是Linux加入GNU并遵循公共版權許可證(GPL)之后,幾乎所有的GNU軟件都可以移植到Linux,從而完善和提高了Linux系統的使用性,并逐步成為通信、工業控制
    發表于 12-03 01:22 ?1273次閱讀
     <b class='flag-5'>Linux</b><b class='flag-5'>操作系統</b>下的<b class='flag-5'>PCI</b><b class='flag-5'>驅動</b>開發

    PCILinux實現及其驅動

    /pci.h里,它詳細描述了一個PCI設備幾乎所有的硬件信息,包括廠商ID、設備ID、各種資源等:?? 在
    發表于 04-02 14:37 ?723次閱讀

    有無操作系統的嵌入式Linux驅動設備有何區別?

    是將系統的軟件與硬件連接起來,使它們能夠相互交互。 嵌入式系統常使用Linux系統作為開發平臺,它具有開源、可移植、靈活的特點。而在嵌入式Linux
    的頭像 發表于 10-29 17:29 ?757次閱讀
    主站蜘蛛池模板: 黑人强伦姧人妻日韩那庞大的| 成人区精品一区二区不卡AV免费| 亚洲AV精品无码喷水直播间| 印度人XXx| 超碰97人人做人人爱网站| 久久不射网| 亚欧日韩毛片在线看免费网站| 91在线青春娱乐精品分类| 亚洲午夜久久久精品电影院| np高h肉辣一女多男| www.av色| 草莓视频在线播放视频| 国产欧美精品一区二区三区-老狼 国产欧美精品国产国产专区 | 国产99视频精品免费播放| 国产内射AV徐夜夜| 久久久久久久久人体| 精品无人区一区二区三区| bl高h文合集| 国产成人精品视频免费大全| 果冻传媒完整免费网站在线观看| 久久永久影院免费| 日本无码色哟哟婷婷最新网站| 亚洲 欧美 中文 日韩 另类| 在线免费观看a视频| 大陆老太交xxxxxhd在线| 啊片色播电影| 国内精品乱码卡一卡2卡三卡新区 国内精品乱码卡一卡2卡三卡 | 日韩精品AV一区二区三区| 3D内射动漫同人资源在线观看| 久久成人伊人欧洲精品AV| 亚洲成人中文| 国产在线一区二区三区四区| 蜜芽资源高清在线观看| 无套暴躁白丝秘书| 国产扒开美女双腿屁股流白浆| 欧洲xxxxx| 拔擦拔擦8X永久华人免费播放器| 母狗黄淑珍| bl高h文合集| 日韩精品久久久久久久电影| 国产AV无码一二三区视频|