PCI總線基礎知識和SylixOS下PCI設備驅動框架介紹

一、PCI總線基礎知識
1、PCI總線的概念
            PCI是Peripheral Component Interconnect(外設部件互聯)的縮寫,它是CPU和外圍設備通信的高速傳輸總線。PCI總線的工作頻率一般爲33MHz(有的PCI總線工作頻率爲64MHz和132MHz),是一種同步的獨立於處理器的32位或64位局部總線。
2、PCI總線結構
       PCI總線是一種樹型結構,並且獨立於CPU總線,可以和CPU總線並行操作。PCI總線上可以掛接PCI設備和PCI橋片,PCI總線上只允許有一個PCI主設備,其他的均爲PCI 從設備,而且讀寫操作只能在主從設備之間進行,從設備之間的數據交換需要通過主設備中轉。PCI總線結構如下圖所示。

20171012《PCI總線結構圖》.png (20.47 KB, 下載次數: 0)

下載附件

2017-10-12 15:21 上傳


圖1-1  PCI總線結構圖

3、PCI總線和PCI總線樹

       1個或者多個有血緣關係的PCI總線組成一顆PCi總線樹。PCI總線由Host主橋或者PCI橋管理,PCI通過PCI橋擴展PCI總線,與Host主橋直接相連的PCI總線通常被命名爲PCI總線0。一個處理器系統可能擁有多個Host主橋,有幾個Host主橋就有幾顆PCI總線樹。

4、PCI總線的特點

      (1)傳輸速率高最大數據傳輸率爲132MB/s,當數據寬度升級到64位,數據傳輸率可達264MB/s。這是其他總線難以比擬的。它大大緩解了數據I/O瓶頸,使高性能CPU的功能得以充分發揮,適應高速設備數據傳輸的需要。

       (2)多總線共存採用PCI總線可在一個系統中讓多種總線共存,容納不同速度的設備一起工作。

       (3)獨立於CPU PCI總線不依附於某一具體處理器,兼容性好。

       (4)自動識別與配置外設,用戶使用方便。

       (5)並行操作能力,可與CPU並行執行。

       (6)PCI總線上所有時序的產生和控制均由主設備發起。

       (7)PCI總線的地址總線和數據總線是分時複用的。(優點:1、節省插件的管腳數量;2、便於突發數據傳輸,即一個地址後面跟大量數據)

二、SylixOS下PCI設備驅動框架介紹
        從本質上講PCI只是一種總線,具體的PCI設備可以是字符設備、網絡設備、USB主機控制器等,因此,一個通過PCI總線與系統連接的設備的驅動至少包含PCI驅動和設備本身驅動兩部分內容。PCI驅動只是爲了輔助設備本身的驅動,它不是目的,而是手段。例如 ,對於通過PCI總線與系統連接的字符設備,則驅動中除了要實現PCI驅動部分外,其主體仍然是設備作爲字符設備的本身驅動,即實現file_operations成員函數並將設備註冊進內核。

        在SylixOS中,用PCI_DRV_CB結構體來定義PCI驅動,該結構體包含PCI設備的探測/移除、掛起/恢復等函數,其定義代碼如下代碼清單所示。PCI_DRV_CB結構體和I2C的LW_I2C_DEVICE結構體、SPI的LW_SPI_DEVICE結構體的非常相似,都是起到掛接總線的作用。
  1. /*********************************************************************************************************
  2.   驅動控制塊
  3. *********************************************************************************************************/
  4. typedef struct {
  5.     LW_LIST_LINE            PCIDRV_lineDrvNode;                         /* 驅動節點管理                 */
  6.     CHAR                    PCIDRV_cDrvName[PCI_DRV_NAME_MAX];          /* 驅動名稱                     */
  7.     PVOID                   PCIDRV_pvPriv;                              /* 私有數據                     */
  8.     PCI_DEV_ID_HANDLE       PCIDRV_hDrvIdTable;                         /* 設備支持列表                 */
  9.     UINT32                  PCIDRV_uiDrvIdTableSize;                    /* 設備支持列表大小             */

  10.     /*
  11.      *  驅動常用函數, PCIDRV_pfuncDevProbe 與 PCIDRV_pfuncDevRemove 不能爲 LW_NULL, 其它可選
  12.      */
  13.     INT   (*PCIDRV_pfuncDevProbe)(PCI_DEV_HANDLE hHandle, const PCI_DEV_ID_HANDLE hIdEntry);
  14.     VOID  (*PCIDRV_pfuncDevRemove)(PCI_DEV_HANDLE hHandle);
  15.     INT   (*PCIDRV_pfuncDevSuspend)(PCI_DEV_HANDLE hHandle, PCI_PM_MESSAGE_HANDLE hPmMsg);
  16.     INT   (*PCIDRV_pfuncDevSuspendLate)(PCI_DEV_HANDLE hHandle, PCI_PM_MESSAGE_HANDLE hPmMsg);
  17.     INT   (*PCIDRV_pfuncDevResumeEarly)(PCI_DEV_HANDLE hHandle);
  18.     INT   (*PCIDRV_pfuncDevResume)(PCI_DEV_HANDLE hHandle);
  19.     VOID  (*PCIDRV_pfuncDevShutdown)(PCI_DEV_HANDLE hHandle);

  20.     PCI_ERROR_HANDLE        PCIDRV_hDrvErrHandler;                      /* 錯誤處理句柄                 */

  21.     INT                     PCIDRV_iDrvFlag;                            /* 驅動標誌                     */
  22.     UINT32                  PCIDRV_uiDrvDevNum;                         /* 關聯設備數                   */
  23.     LW_LIST_LINE_HEADER     PCIDRV_plineDrvDevHeader;                   /* 設備管理鏈表頭               */
  24. } PCI_DRV_CB;
  25. typedef PCI_DRV_CB         *PCI_DRV_HANDLE;
複製代碼
       PCI_DRV_CB結構體的PCIDRV_pfuncDevProbe函數指針指向的probe函數,需要完成PCI設備的初始化及其設備本身自身(字符、TTY、網絡等)驅動的註冊。在SylixOS的probe函數中,首先會通過PCI總線獲得PCI設備的基本資源,如:設備的起始地址、資源大小、中斷等,獲得資源之後,剩下的就是利用獲得的資源編寫設備本身自身的驅動代碼(基本和編寫非PCI總線上的設備驅動沒啥區別)。當PCI設備驅動完成後,在PCI設備數據傳輸時,是經過PCI總線傳給CPU的,這和Nor Flash掛接在SPI總線上,通過SPI和CPU通信的機制一樣。        以上就是我學習PCI總線的總結,若是有總結的不對的地方,煩請各位指正。
發佈了27 篇原創文章 · 獲贊 50 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章