專利名稱:用于多硬件平臺飛騰服務器的i2c總線的實現(xiàn)方法
技術領域:
本發(fā)明涉及飛騰服務器的計算機硬件應用平臺,特指一種用于多硬件平臺飛騰服務器的I2C總線的實現(xiàn)方法。
背景技術:
飛騰服務器(FT服務器)是國防科大研制、基于FT1000處理器的服務器計算機平臺,其中FT1000處理器是國防科大研制、兼容spare指令集的通用64位處理器。飛騰服務器目前已經(jīng)有多種不同的硬件平臺,這些不同的硬件平臺雖然在硬件設計上有多種不同,但是它們都有一個共同的特點,即都會有一個PCIe交換單元來為系統(tǒng)提供PCIe設備的接入點,目前所有的FT服務器平臺都使用下面三種PCIe交換單元中的一種,分別是PEX8664、PEX8648以及PEX8632。因此根據(jù)所使用PCIe交換單元的不同,可以把FT服務器平臺分成3種使用PEX8664作為PCIe交換單元的硬件平臺、使用PEX8648作為PCIe交換單元的硬件平臺以及使用PEX8632作為PCIe交換單元的硬件平臺?,F(xiàn)有基于FT1000處理器的飛騰服務器中,通過處理器上集成的PCI-Express Unit (PEU: PCIe單元,它實現(xiàn)了 PCIe總線中的root complex)從而擴展出了 PCIe總線,PCI-Express Unit與PCIe交換單元(PCIeswitch)相連,PCIe switch后面則連有PCIe插槽或者具體的PCIe設備。對于飛騰服務器用GPIO模擬I2C總線的實現(xiàn)而言,目前PCIe交換單元都有片上集成的GP10,且大多未被使用,所以可以選取其中的兩個分別作為12C總線的SDA線和SCL線。但是,不同的硬件平臺采用的PCIe交換單元不同,因此控制GPIO的端口也不相同。如有些平臺的PCIe交換單元采用PEX8664實現(xiàn),有些平臺的PCIe交換單元采用PEX8648實現(xiàn),有些平臺的PCIe交換單元采用PEX8632實現(xiàn)。目前飛騰服務器的基本輸入輸出系統(tǒng)和加載引導程序在系統(tǒng)啟動檢測和初始化硬件時把不同平臺的PCIe交換單元的PCI內(nèi)存空間映射到了同一片CPU物理地址空間。但是由于不同的硬件平臺之間的采用的PCIe交換單元并不相同,最終導致其I2C總線的實現(xiàn)在軟件上也各不相同,具體而言是所述的GPIO驅(qū)動程序并不相同,不同的硬件平臺之間的I2C總線無法實現(xiàn)通用。飛騰服務器的不同硬件平臺的硬件設計上的差異導致了不同平臺上I2C總線軟件實現(xiàn)上的差異,但是如果不同的飛騰服務器平臺使用不同的針對各自硬件平臺的實現(xiàn)I2C總線的軟件,特別是本發(fā)明所要實現(xiàn)的I2C總線功能是要集成到操作系統(tǒng)中的,這將導致在不同的飛騰服務器平臺上部署不同的操作系統(tǒng),這將給飛騰服務器的用戶帶來不必要的麻煩和使用上的不便,大大降低飛騰服務器的用戶體驗,不利于飛騰服務器的推廣。
發(fā)明內(nèi)容
本發(fā)明要解決的技術問題是提供一種能夠利用閑置GPIO端口、實施成本低、實現(xiàn)簡單、使用方便、兼容性好的用于多硬件平臺飛騰服務器的I2C總線的實現(xiàn)方法。為了解決上述技術問題,本發(fā)明采用的技術方案為一種用于多 硬件平臺飛騰服務器的I2C總線的實現(xiàn)方法,其實施步驟如下
1)在飛騰服務器上PCIe交換單元的片上GPIO端口中指定閑置的兩個GPIO端口分別外接上拉電阻并作為I2C總線接口的數(shù)據(jù)線接口和時鐘線接口 ;
2)在初始化硬件時將PCIe交換單元的PCI內(nèi)存空間映射為CPU虛擬地址空間;
3)獲取PCIe交換單元的類型信息,根據(jù)所述PCIe交換單元的類型信息獲取所述兩個GPIO端口在CPU虛擬地址空間中的映射端口地址;
4)在操作系統(tǒng)中建立并注冊用于操作所述兩個GPIO端口對應映射端口地址的GPIO驅(qū)動程序模塊;
5)在使用I2C設備前將設備連接到所述兩個GPIO端口;在使用I2C設備時,操作系統(tǒng)中的I2C總線控制器驅(qū)動程序產(chǎn)生I2C總線時序的指令,且所述I2C總線時序的指令通過所述GPIO驅(qū)動程序模塊與連接于所述兩個GPIO端口上的I2C設備進行通信。作為本發(fā)明上述技術方案的進一步改進
所述步驟2)的詳細步驟包括在飛騰服務器啟動時首先PCIe交換單元的PCI內(nèi)存空間映射為CPU物理地址空間,然后將所述CPU物理地址空間映射為CPU虛擬地址空間。所述GPIO驅(qū)動程序模塊包括如下子模塊
A)電平輸入子模塊,用于為讀取指定GPIO端口的電平狀態(tài),如果所述電平狀態(tài)為高電平則返回1,如果所述電平狀態(tài)為低電平則返回0 ;所述電平輸入子模塊的實現(xiàn)方法為讀取指定GPIO端口在CPU虛擬地址空間中映射端口地址中數(shù)據(jù)輸入寄存器的值,并根據(jù)所述數(shù)據(jù)輸入寄存器的值返回數(shù)值I或0 ;
B)電平輸出子模塊,用于為配置指定GPIO端口的電平狀態(tài),如果配置值為I則輸出高電平,如果配置值為0則輸出低電平;所述電平輸出子模塊的實現(xiàn)方法為讀取指定GPIO端口在CPU虛擬地址空間中映射端口地址中數(shù)據(jù)輸出寄存器的值,并根據(jù)所述配置值配置指定GPIO端口的電平狀態(tài);
C)配置輸入方向子模塊,用于配置指定GPIO端口的傳輸方向為輸入;所述配置輸入方向子模塊的實現(xiàn)方法為讀取指定GPIO端口在CPU虛擬地址空間中映射端口地址中方向寄存器的值,并根據(jù)所述配置值配置指定GPIO端口的方向為輸入;
D)配置輸出方向子模塊,用于配置指定GPIO端口的傳輸方向為輸出并在配置方向后在指定GPIO端口上根據(jù)配置參數(shù)輸出高電平或者低電平;配置輸出方向子模塊的實現(xiàn)方法為讀取指定GPIO端口在CPU虛擬地址空間中映射端口地址中方向寄存器的值,并根據(jù)配置值配置指定GPIO端口的方向為輸出,然后根據(jù)配置參數(shù)調(diào)用所述電平輸出子模塊輸出聞電平或者低電平。本發(fā)明具有下述優(yōu)點
I、本發(fā)明利用PCIe交換單元上閑置的GPIO資源來模擬I2C總線的數(shù)據(jù)線(SDA)和時鐘線(SCL),從而能夠為多硬件平臺飛騰服務器擴展出一條或多條I2C總線,使飛騰服務器在不增加額外設備的前提具有外接I2C設備的能力,大大豐富了飛騰服務器所能實現(xiàn)的功能,擴展了飛騰服務器的應用范圍,具有實施成本低、使用方便、實現(xiàn)簡單的優(yōu)點。2、本發(fā)明在初始化硬件時將PCIe交換單元的PCI內(nèi)存空間映射為CPU虛擬地址空間,然后通過獲取PCIe交換單元的類型信息、根據(jù)PCIe交換單元的類型信息獲取GPIO端口在CPU虛擬地址空間中的映射端口地址,因此能夠針對不同的PCIe交換單元的類型建立對應的GPIO驅(qū)動程序模塊,根據(jù)不同的PCIe交換單元類型使用不同的虛擬地址訪問PCIe交換單元的GPIO端口的寄存器,同時把GPIO驅(qū)動程序模塊注冊進操作系統(tǒng),實現(xiàn)了對多種硬件平臺飛騰服務器的I2C總線的一種支持,可以使在不同硬件平臺上的飛騰服務器上部署同一套系統(tǒng),具有兼容性好、使用方便、操作簡單的優(yōu)點,提高了飛騰服務器的用戶體驗,有利于飛騰服務器的推廣。
圖I為本發(fā)明實施例一的基本實施流程示意圖。圖2為本發(fā)明實施例一的硬件框架結構示意圖。圖3為本發(fā)明實施例二的硬件框架結構示意圖。圖4為本發(fā)明實施例三的硬件框架結構示意圖。
具體實施例方式實施例一
如圖I所示,本實施例用于多硬件平臺飛騰服務器的I2C總線的實現(xiàn)方法的實施步驟如下
1)在飛騰服務器上PCIe交換單元的片上GPIO端口中指定閑置的兩個GPIO端口分別外接上拉電阻并作為I2C總線接口的數(shù)據(jù)線接口和時鐘線接口 ;
2)在初始化硬件時將PCIe交換單元的PCI內(nèi)存空間映射為CPU虛擬地址空間;
3)獲取PCIe交換單元的類型信息,根據(jù)PCIe交換單元的類型信息獲取前述的兩個GPIO端口在CPU虛擬地址空間中的映射端口地址;
4)在操作系統(tǒng)中建立并注冊用于操作前述的兩個GPIO端口對應映射端口地址的GPIO驅(qū)動程序模塊;
5)在使用I2C設備前將設備連接到前述的兩個GPIO端口;在使用I2C設備時,操作系統(tǒng)中的I2C總線控制器驅(qū)動程序產(chǎn)生I2C總線時序的指令,且I2C總線時序的指令通過GPIO驅(qū)動程序模塊與連接于前述兩個GPIO端口上的I2C設備進行通信。I2C器件的高電平電壓一般是3. 3V左右,而PCIe交換單元的GPIO端口的高電平狀態(tài)電壓則是2. 5V,因此為了實現(xiàn)GPIO端口電平的兼容,本實施例在步驟I)中對指定的閑置的兩個GPIO端口分別外接上拉電阻,從而使得I2C總線空閑時SDA線和SCL線處于高電平狀態(tài)時輸出電壓達到3. 3V。此外也可以采用其他的電路來使得I2C總線空閑時SDA線和SCL線處于高電平狀態(tài),上述措施均為電路設計的常規(guī)技術,因此本實施例不再贅述。本實施例步驟2)的詳細步驟包括在飛騰服務器啟動時首先PCIe交換單元的PCI內(nèi)存空間映射為CPU物理地址空間,然后將CPU物理地址空間映射為CPU虛擬地址空間。由于PCIe交換單元的PCI內(nèi)存空間經(jīng)過兩次映射后,位于PCI內(nèi)存空間內(nèi)的GPIO端口同樣也被映射為CPU虛擬地址空間內(nèi),因此能夠直接通過CPU虛擬地址空間內(nèi)的映射端口地址讀寫GPIO端口對應的寄存器。由于PCIe交換單元上的GPIO端口并不常用,目前操作系統(tǒng)中并沒有專門針對GPIO端口的驅(qū)動程序,一般都是針對某一個GPIO讀寫其控制寄存器來操作它,因此為了實現(xiàn)I2C總線接口的兼容,本實施例針對PCIe交換單元上的所有GPIO端口建立GPIO驅(qū)動程序模塊來實現(xiàn)對指定的兩個閑置GPIO端口的操作。本實施例的GPIO驅(qū)動程序模塊包括如下子模塊
A)電平輸入子模塊,用于為讀取指定GPIO端口的電平狀態(tài),如果電平狀態(tài)為高電平則返回1,如果電平狀態(tài)為低電平則返回0 ;電平輸入子模塊的實現(xiàn)方法為讀取指定GPIO端口在CPU虛擬地址空間中映射端口地址中數(shù)據(jù)輸入寄存器的值,并根據(jù)數(shù)據(jù)輸入寄存器的值返回數(shù)值I或0;
B)電平輸出子模塊,用于為配置指定GPIO端口的電平狀態(tài),如果配置值為I則輸出高電平,如果配置值為0則輸出低電平;電平輸出子模塊的實現(xiàn)方法為讀取指定GPIO端口在CPU虛擬地址空間中映射端口地址中數(shù)據(jù)輸出寄存器的值,并根據(jù)配置值配置指定GPIO端口的電平狀態(tài),使所選GPIO端口上產(chǎn)生相應的高低電平;
C)配置輸入方向子模塊,用于配置指定GPIO端口的傳輸方向為輸入;配置輸入方向子模塊的實現(xiàn)方法為讀取指定GPIO端口在CPU虛擬地址空間中映射端口地址中方向寄存器 的值,并根據(jù)配置值配置指定GPIO端口的方向為輸入;
D)配置輸出方向子模塊,用于配置指定GPIO端口的傳輸方向為輸出并在配置方向后在指定GPIO端口上根據(jù)配置參數(shù)輸出高電平或者低電平;配置輸出方向子模塊的實現(xiàn)方法為讀取指定GPIO端口在CPU虛擬地址空間中映射端口地址中方向寄存器的值,并根據(jù)配置值配置指定GPIO端口的方向為輸出,然后根據(jù)配置參數(shù)調(diào)用上文的電平輸出子模塊輸出高電平或者低電平。本實施例中,電平輸入子模塊、電平輸出子模塊、配置輸入方向子模塊和配置輸出方向子模塊均基于封裝的函數(shù)實現(xiàn),此外也可以采用硬件實現(xiàn)。步驟3)中獲取PCIe交換單元的類型信息的方法目前有多種,本實施例中是通過讀取系統(tǒng)ROM中存儲有硬件平臺的類型碼,由于硬件平臺的類型碼與平臺所使用的PCIe交換單元是一一對應的,因此根據(jù)平臺類型碼可以識別所使用的PCIe交換單元的類型信息。對于飛騰服務器實現(xiàn)I2C總線及所接I2C設備功能的軟件實現(xiàn)而言,在應用層面有對應不同種類I2C設備的應用程序,如對應于《83975等用于監(jiān)控系統(tǒng)狀態(tài)的I2C設備的應用程序sensors等。應用程序通過文件系統(tǒng)中/dev目錄下的設備節(jié)點與對應于具體I2C設備的設備驅(qū)動程序交互,如W83975設備驅(qū)動程序。設備驅(qū)動程序通過I2C核心與用軟件實現(xiàn)的I2C控制器交互,I2C控制器通過GPIO驅(qū)動程序操作PCIe交換單元上的GPIO端口產(chǎn)生GPIO時序從而與I2C總線上連接的I2C設備通信,在這條整個路徑中,最終實現(xiàn)了應用程序與I2C設備之間的交互,從而應用程序能夠控制I2C設備從而實現(xiàn)具體功能。在這條整個路徑中,應用程序和I2C設備驅(qū)動程序是對應于具體I2C設備的,這不是本實施例關心的部分,本實施例旨在實現(xiàn)一條I2C總線,因此只關心其中的I2C控制器和GPIO驅(qū)動程序。在操作系統(tǒng)I2C子系統(tǒng)中已經(jīng)有了用軟件實現(xiàn)的I2C控制器,即是位于drivers/I2C/buses/目錄下的文件I2C-gpio. c中所實現(xiàn)的I2C控制器驅(qū)動程序,該I2C控制器驅(qū)動程序即為本實施例所依賴的已有的軟件基礎,從而能夠在沒有I2C相關硬件的前提下利用PCIe交換單元的GPIO端口實現(xiàn)I2C總線。本實施例能夠?qū)崿F(xiàn)不用區(qū)分不同平臺的不同PCIe交換單元而用同一軟件訪問的配置空間寄存器而不產(chǎn)生兼容性問題的原因如下飛騰服務器初始化硬件時(基本輸入輸出系統(tǒng)和加載引導程序在檢測和初始化系統(tǒng)中的硬件時)把不同平臺的不同PCIe交換單元的PCI內(nèi)存空間映射到了同一片CPU物理地址空間,再將CPU物理地址空間映射為CPU虛擬地址空間,然后使用虛擬地址訪問PCIe交換單元的PCI內(nèi)存空間,根據(jù)硬件平臺信息獲取PCIe交換單元的GPIO模塊在CPU虛擬地址空間內(nèi)的映射端口地址,通過GPIO的映射端口地址,實現(xiàn)不同PCIe交換單元的GPIO驅(qū)動程序,如果接收到操作系統(tǒng)上層的用軟件實現(xiàn)的I2C控制器在SDA和SCL線上產(chǎn)生時序的命令,則由GPIO驅(qū)動程序控制GPIO端口在SDA線和SCL線上產(chǎn)生I2C總線相關時序,該時序會與I2C總線上連接的I2C設備通信從而實現(xiàn)I2C總線功能。而且PCIe交換單元的配置空間中的寄存器同樣位于PCI內(nèi)存空間中,因此可以使用訪問PCI內(nèi)存空間的方法 來訪問PCI配置空間中的寄存器。如圖2所示,本實施例中,飛騰服務器的PCIe交換單元采用PEX8664芯片實現(xiàn),通過將本實施例的I2C總線實現(xiàn)方法應用于安裝有銀河麒麟飛騰版操作系統(tǒng)的飛騰服務器,兩個GPIO端口模擬的I2C總線接口連接有用于控制飛騰服務器關機的關機控制器,經(jīng)驗證兩個GPIO端口模擬的I2C總線接口能夠輸出正確的關機控制脈沖時序,成功地實現(xiàn)了飛騰服務器的關機斷電。實施例二
如圖3所示,本實施例與實施例一基本相同,其不同點為飛騰服務器的PCIe交換單元采用PEX8648芯片實現(xiàn),通過將本實施例的I2C總線實現(xiàn)方法應用于安裝有銀河麒麟飛騰版操作系統(tǒng)的飛騰服務器,在兩個GPIO端口模擬的I2C總線接口連接有用于控制飛騰服務器關機的關機控制器,經(jīng)驗證兩個GPIO端口模擬的I2C總線接口能夠輸出正確的關機控制脈沖時序,成功地實現(xiàn)了飛騰服務器的關機斷電。實施例三
如圖4所示,本實施例與實施例一基本相同,其不同點為飛騰服務器的PCIe交換單元采用PEX8632芯片實現(xiàn),通過將本實施例的I2C總線實現(xiàn)方法應用于安裝有銀河麒麟飛騰版操作系統(tǒng)的飛騰服務器,在兩個GPIO端口模擬的I2C總線接口連接有用于控制飛騰服務器關機的關機控制器,經(jīng)驗證兩個GPIO端口模擬的I2C總線接口能夠輸出正確的關機控制脈沖時序,成功地實現(xiàn)了飛騰服務器的關機斷電。以上所述僅是本發(fā)明的優(yōu)選實施方式,本發(fā)明的保護范圍并不僅局限于上述實施例,凡屬于本發(fā)明思路下的技術方案均屬于本發(fā)明的保護范圍。應當指出,對于本技術領域的普通技術人員來說,在不脫離本發(fā)明原理前提下的若干改進和潤飾,這些改進和潤飾也應視為本發(fā)明的保護范圍。
權利要求
1.一種用于多硬件平臺飛騰服務器的I2C總線的實現(xiàn)方法,其特征在于其實施步驟如下 1)在飛騰服務器上PCIe交換單元的片上GPIO端ロ中指定閑置的兩個GPIO端ロ分別外接上拉電阻并作為I2C總線接ロ的數(shù)據(jù)線接口和時鐘線接ロ ; 2)在初始化硬件時將PCIe交換單元的PCI內(nèi)存空間映射為CPU虛擬地址空間; 3)獲取PCIe交換單元的類型信息,根據(jù)所述PCIe交換單元的類型信息獲取所述兩個GPIO端ロ在CPU虛擬地址空間中的映射端ロ地址; 4)在操作系統(tǒng)中建立并注冊用于操作所述兩個GPIO端ロ對應映射端ロ地址的GPIO驅(qū)動程序模塊; 5)在使用I2C設備前將設備連接到所述兩個GPIO端ロ;在使用I2C設備時,操作系統(tǒng)中的I2C總線控制器驅(qū)動程序產(chǎn)生I2C總線時序的指令,且所述I2C總線時序的指令通過所述GPIO驅(qū)動程序模塊與連接于所述兩個GPIO端口上的I2C設備進行通信。
2.根據(jù)權利要求I所述的用于多硬件平臺飛騰服務器的I2C總線的實現(xiàn)方法,其特征在于,所述步驟2)的詳細步驟包括在飛騰服務器啟動時首先PCIe交換單元的PCI內(nèi)存空間映射為CPU物理地址空間,然后將所述CPU物理地址空間映射為CPU虛擬地址空間。
3.根據(jù)權利要求I或2所述的用于多硬件平臺飛騰服務器的I2C總線的實現(xiàn)方法,其特征在于,所述GPIO驅(qū)動程序模塊包括如下子模塊 A)電平輸入子模塊,用于為讀取指定GPIO端ロ的電平狀態(tài),如果所述電平狀態(tài)為高電平則返回1,如果所述電平狀態(tài)為低電平則返回0 ;所述電平輸入子模塊的實現(xiàn)方法為讀取指定GPIO端ロ在CPU虛擬地址空間中映射端ロ地址中數(shù)據(jù)輸入寄存器的值,井根據(jù)所述數(shù)據(jù)輸入寄存器的值返回數(shù)值I或0 ; B)電平輸出子模塊,用于為配置指定GPIO端ロ的電平狀態(tài),如果配置值為I則輸出高電平,如果配置值為0則輸出低電平;所述電平輸出子模塊的實現(xiàn)方法為讀取指定GPIO端ロ在CPU虛擬地址空間中映射端ロ地址中數(shù)據(jù)輸出寄存器的值,井根據(jù)所述配置值配置指定GPIO端ロ的電平狀態(tài); C)配置輸入方向子模塊,用于配置指定GPIO端ロ的傳輸方向為輸入;所述配置輸入方向子模塊的實現(xiàn)方法為讀取指定GPIO端ロ在CPU虛擬地址空間中映射端ロ地址中方向寄存器的值,井根據(jù)所述配置值配置指定GPIO端ロ的方向為輸入; D)配置輸出方向子模塊,用于配置指定GPIO端ロ的傳輸方向為輸出并在配置方向后在指定GPIO端口上根據(jù)配置參數(shù)輸出高電平或者低電平;配置輸出方向子模塊的實現(xiàn)方法為讀取指定GPIO端ロ在CPU虛擬地址空間中映射端ロ地址中方向寄存器的值,并根據(jù)配置值配置指定GPIO端ロ的方向為輸出,然后根據(jù)配置參數(shù)調(diào)用所述電平輸出子模塊輸出聞電平或者低電平。
全文摘要
本發(fā)明公開了一種用于多硬件平臺飛騰服務器的I2C總線的實現(xiàn)方法,實施步驟如下1)在PCIe交換單元指定閑置的兩個GPIO端口分別外接上拉電阻并作為I2C總線接口;2)初始化硬件時將PCIe交換單元的PCI內(nèi)存空間映射為CPU虛擬地址空間;3)根據(jù)PCIe交換單元的類型信息獲取前述兩個GPIO端口在CPU虛擬地址空間中的映射端口地址;4)建立前述兩個GPIO端口的GPIO驅(qū)動程序;5)使用I2C設備時I2C總線控制器驅(qū)動程序產(chǎn)生的I2C總線時序的指令通過GPIO驅(qū)動程序與I2C設備進行通信。本發(fā)明具有能夠利用閑置GPIO端口、實施成本低、實現(xiàn)簡單、使用方便、兼容性好的優(yōu)點。
文檔編號G06F13/20GK102650975SQ20121009502
公開日2012年8月29日 申請日期2012年3月31日 優(yōu)先權日2012年3月31日
發(fā)明者孫立明, 張衛(wèi)華, 戴華東, 李振釗, 李真能, 董攀, 邵立松, 魏彥斌 申請人:中國人民解放軍國防科學技術大學