專利名稱:讀取中央處理器溫度的通用方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種中央處理器溫度的讀取方法,特別涉及一種讀取中央處理器溫度的通用方法。
背景技術(shù):
隨著計(jì)算機(jī)業(yè)的發(fā)展,計(jì)算器的更新速度越來(lái)越快。因此當(dāng)前計(jì)算機(jī)的產(chǎn)量也逐步上升。每臺(tái)新計(jì)算機(jī)出廠之前都必須經(jīng)過(guò)整體測(cè)試來(lái)檢驗(yàn)其性能是否符合標(biāo)準(zhǔn)。其中中央處理器(CPU)是主要的檢測(cè)項(xiàng)目,當(dāng)前的CPU速度是比較讓人滿意的,而CPU的發(fā)熱量卻成為用戶普遍關(guān)注的問(wèn)題。CPU溫度對(duì)于計(jì)算器來(lái)說(shuō)是比較重要的,溫度過(guò)高會(huì)導(dǎo)致部件的損壞,所以測(cè)試計(jì)算器的性能時(shí),CPU的溫度是一個(gè)重要的參數(shù)指標(biāo)。
CPU溫度的測(cè)試主要是監(jiān)測(cè)CPU溫度的升高和降低,即在運(yùn)行各種硬件測(cè)試時(shí),CPU的溫度不可以過(guò)高。例如在一批機(jī)器中,同時(shí)運(yùn)行相同的硬件測(cè)試軟件。如果其中一臺(tái)或幾臺(tái)的CPU溫度比其它的計(jì)算器高很多,那么就意味著這幾臺(tái)計(jì)算器的性能不是很好,或者存在某種問(wèn)題。
目前測(cè)試CPU的溫度可以通過(guò)多種途徑,經(jīng)常使用的通常為兩種,一種為通過(guò)系統(tǒng)管理總線(SMBus)、設(shè)備號(hào)、設(shè)備索引號(hào)讀取CPU的溫度;另一種是通過(guò)嵌入式控制器(Embedded Controller)的端口號(hào)和相應(yīng)的功能偏移量來(lái)取得溫度。
雖然在同一種機(jī)型上讀取CPU溫度的方法是相同的,并且只需使用一種方法,但是不同的機(jī)型使用的方法是不一樣的,縱使讀取溫度的途徑相同,方法的參數(shù)也是不近相同的。有些途徑和參數(shù)雖然相同,也可能由于參數(shù)的調(diào)用順序不同,而影響CPU溫度的讀取。由于相同的廠家生產(chǎn)出的計(jì)算器中讀取CPU溫度的方法也不同,所以常見(jiàn)技術(shù)讀取CPU溫度的方法并不通用,需要先識(shí)別當(dāng)前欲讀取溫度的機(jī)器的機(jī)型,根據(jù)機(jī)型來(lái)確定溫度的讀取方法。這樣,在每一種新的機(jī)型產(chǎn)生時(shí),經(jīng)常需要詢問(wèn)廠商該種機(jī)型所使用的方法和相關(guān)信息,再更改代碼將該種機(jī)型的讀取方法。這就使得溫度讀取的過(guò)程中出現(xiàn)如下缺陷 1、由于廠商的反饋速度不是太快,所以耗時(shí)是不可避免的。因此會(huì)造成了測(cè)試程序的開(kāi)發(fā)時(shí)間加長(zhǎng)。
2、計(jì)算器的型號(hào)一直在不斷的推陳出新,以前生產(chǎn)的機(jī)型又不會(huì)立即廢棄,所以測(cè)試程序在開(kāi)發(fā)時(shí)就必須兼顧以前的機(jī)型,同時(shí)又適用剛剛生產(chǎn)出來(lái)的機(jī)型,這樣就會(huì)造成程序代碼的冗長(zhǎng),不利于程序的維護(hù)。
3、溫度提取方法并不通用,程序一直處于更新之中,人力和物力的投入會(huì)不斷的增加成本,造成資本的浪費(fèi)。
因此,針對(duì)上述的缺陷,目前亟需一種適用于所有機(jī)型的CPU溫度的統(tǒng)一讀取方法,來(lái)簡(jiǎn)化CPU溫度讀取過(guò)程。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明為解決上述問(wèn)題而提出一種讀取CPU溫度的通用方法,主要目的在于提供較為通用的讀取CPU溫度的方法,可以針對(duì)不同機(jī)型采用統(tǒng)一的方法進(jìn)行溫度讀取。
所以為達(dá)到上述目的,本發(fā)明提供一種讀取中央處理器溫度的通用方法,首先根據(jù)高級(jí)電源管理協(xié)議(ACPI)從BIOS中讀取AML代碼,在該AML代碼中,確定讀取該CPU溫度的硬件途徑,根據(jù)該硬件途徑在該AML代碼中確定執(zhí)行溫度讀取的硬件端口和操作碼,分析該AML碼,確定該硬件端口操作順序,根據(jù)該操作順序,操作硬件端口,讀取CPU溫度。
所述提取該CPU溫度的硬件途徑的步驟為通過(guò)標(biāo)識(shí)符查找,提取該CPU溫度的硬件途徑。
所述確定硬件途徑的步驟還包括 查找所有定義溫度的區(qū)間位置,并將其合成為總和溫度區(qū)間; 在該總和溫度區(qū)間中,查找個(gè)體溫度區(qū)間; 提取第一個(gè)體溫度區(qū)間;及 在該第一個(gè)體溫度區(qū)間中確定當(dāng)前溫度的實(shí)現(xiàn)途徑。
所述的讀取中央處理器溫度的通用方法,還包括如下步驟 判斷該個(gè)第一個(gè)體溫度區(qū)間中實(shí)現(xiàn)溫度讀取的是否是ACPI的臨時(shí)名稱;及 根據(jù)該判斷結(jié)果在AML代碼中查找該臨時(shí)名稱的具體定義。
所述在該第一個(gè)體溫度區(qū)間中確定當(dāng)前溫度的實(shí)現(xiàn)途徑的步驟,還包括如下步驟 在該第一個(gè)體溫度區(qū)間中查找使用0x70定義的以0x5c 0x5f 0x53 0x42<\_SB>為開(kāi)頭的名稱串; 在\_SB范圍內(nèi)查找名稱串中最后一個(gè)名稱所屬的設(shè)備; 在該第一個(gè)體溫度區(qū)間中查找使用0x08定義的名為0x5f 0x48 0x49 0x44<_HID>的位置; 分析后面的第5到第9個(gè)字節(jié);及 根據(jù)該分析結(jié)果判斷讀取CPU溫度的硬件途徑。
所述第一個(gè)個(gè)體溫度區(qū)間即為CPU的溫度區(qū)間。
所述實(shí)現(xiàn)途徑為系統(tǒng)管理總線。
所述實(shí)現(xiàn)途徑為嵌入式控制器。
根據(jù)本發(fā)明所提出的讀取中央處理器溫度的通用方法,適用于各種機(jī)型,對(duì)所有機(jī)型的CPU溫度實(shí)行統(tǒng)一的讀取方法,來(lái)簡(jiǎn)化CPU溫度讀取過(guò)程。
圖1為本發(fā)明的總體流程圖; 圖2為本發(fā)明所提出的確定讀取該CPU溫度的硬件途徑的流程圖; 圖3為本發(fā)明所提出的通過(guò)嵌入式控制器(Embedded Controller)的實(shí)現(xiàn)中央處理器溫度讀取的實(shí)施例運(yùn)作流程圖;及 圖4為本發(fā)明所提出通過(guò)系統(tǒng)管理總線SMBus實(shí)現(xiàn)中央處理器溫度讀取的實(shí)施例的運(yùn)作流程圖。
其中,附圖標(biāo)記如下 步驟110根據(jù)高級(jí)電源管理協(xié)議從BIOS中讀取AML代碼 步驟120在該AML代碼中,確定讀取該CPU溫度的硬件途徑 步驟130根據(jù)該硬件途徑在該AML代碼中確定執(zhí)行溫度讀取的硬件端口和操作碼 步驟140分析該AML碼,確定該硬件端口操作順序 步驟150根據(jù)該操作順序,操作硬件端口,讀取CPU溫度 步驟210查找所有定義溫度的區(qū)間位置,并將其合成為總和溫度區(qū)間 步驟220在該總和溫度區(qū)間中,查找個(gè)體溫度區(qū)間 步驟230提取第一個(gè)體溫度區(qū)間,即中央處理器溫度區(qū)間 步驟240在該第一個(gè)體溫度區(qū)間中分析確定當(dāng)前溫度的實(shí)現(xiàn)途徑 步驟310在EC0的定義空間下查找使用0x08定義的0x5f 0x43 0x52 0x53<_CRS>的值,得到硬件端口 步驟320在EC的定義空間中,查找使用0x5B 0x80定義的類型是0x03的名稱,再找到使用0x5B 0x81定義的EC功能偏移量的定義區(qū)間,在這個(gè)區(qū)間中找到名稱A的位置,并根據(jù)這個(gè)位置計(jì)算它的偏移量和有效的Bit數(shù) 步驟330使用EC的端口號(hào)和功能偏移量進(jìn)行EC操作,從而讀出CPU的溫度 步驟410在SMBus的定義區(qū)間中查找名稱A的定義空間 步驟420在名稱A的定義空間中查找所有使用0x70定義的語(yǔ)句 步驟430查找所有SMBus操作步驟中的第二個(gè)參數(shù)名稱的定義位置 步驟440分析參數(shù)名稱的位置,從而計(jì)算偏移量 步驟450在SMBus的定義范圍內(nèi),查找使用0x5B 0x81定義的名稱B的位置,提取0x5B 0x81后面第6個(gè)和第7個(gè)字節(jié)即為SMBus的基地址 步驟460通過(guò)SMBus的基地址以及偏移量確定讀取CPU溫度需要操作的SMBus寄存器的地址,參照SMBus操作步驟的順序和參數(shù)狀況,使用參數(shù)1、2、3和SMBus的寄存器讀出CPU的溫度
具體實(shí)施例方式 有關(guān)本發(fā)明的詳細(xì)內(nèi)容及技術(shù),配合
如下 目前,絕大部分計(jì)算機(jī)支持高級(jí)電源管理協(xié)議(Advanced Configurationand Power Management Interface,ACPI),所謂高級(jí)電源管理協(xié)議就是一些表狀結(jié)構(gòu)和一些二進(jìn)制數(shù)碼,這些表狀結(jié)構(gòu)和二進(jìn)制數(shù)碼已經(jīng)固化到計(jì)算器的BIOS中,并且在操作系統(tǒng)激活之前就已經(jīng)調(diào)入了內(nèi)存,其中一部分是操作系統(tǒng)不可以更改的。就在這部分固定不變的內(nèi)容中,包含有硬件信息,包括硬件端口地址、操作偏移量以及硬件的操作數(shù)。在這些硬件信息中,即包括有CPU溫度的相關(guān)內(nèi)容。這些內(nèi)容是以二進(jìn)制代碼的形式記錄的,根據(jù)高級(jí)電源管理協(xié)議的規(guī)范,可以翻譯成一種語(yǔ)句,但是這種語(yǔ)句不能夠直接運(yùn)行,就在這些早已經(jīng)記錄在BIOS的語(yǔ)句中可以看出讀取CPU溫度的途徑、硬件端口以及相應(yīng)的操作參數(shù)。這些信息可以彌補(bǔ)了以往CPU溫度讀取方法的不足。
根據(jù)本發(fā)明所提出的讀取CPU溫度的通用方法,利用已經(jīng)固化在BIOS中的電源管理協(xié)議的部分信息,就可以找到讀取CPU溫度的途徑和各種端口參數(shù),再將這些參數(shù)與結(jié)合常見(jiàn)技術(shù)的方法,就產(chǎn)生了一種比較通用的方法。
請(qǐng)參見(jiàn)圖1,該圖為本發(fā)明所提出的提取中央處理器溫度的通用方法的總體流程圖,首先按照高級(jí)電源管理協(xié)議的規(guī)范從BIOS中讀出一種二進(jìn)制的數(shù)字代碼(AML碼)(步驟110),AML碼為ACPI機(jī)器語(yǔ)言代碼,在該AML代碼中,確定讀取該CPU溫度的硬件途徑,(步驟120),根據(jù)該硬件途徑在該AML代碼中確定執(zhí)行溫度讀取的硬件端口和操作碼(步驟130),分析該AML碼,確定該硬件端口操作順序(步驟140),最后根據(jù)該操作順序,操作硬件端口,讀取CPU溫度(步驟150)。
請(qǐng)參見(jiàn)圖2,該圖是本發(fā)明確定讀取該CPU溫度的硬件途徑的流程圖。識(shí)別讀取溫度的途徑,需要在二進(jìn)制數(shù)字代碼(AML碼)中,通過(guò)特定的標(biāo)示符來(lái)逐層查找,再通過(guò)識(shí)別設(shè)備的硬件ID號(hào),判斷出執(zhí)行溫度讀取的硬設(shè)備。首先查找所有定義的區(qū)間位置,并將其合并成一個(gè)總和溫度區(qū)間(步驟210)。查找方法為在二進(jìn)制數(shù)字代碼中查找使用0x10定義的名為0x5c 0x5f 0x540x5a<\_TZ>的區(qū)間,在這個(gè)區(qū)間內(nèi)定義了所有與溫度相關(guān)的信息和方法。稱為總和溫度區(qū)間。一臺(tái)計(jì)算器中只有一個(gè)總和溫度區(qū)間,但是它可能分成一個(gè)或多個(gè)部分,并且定義在二進(jìn)制數(shù)代碼中。需要找到所有使用0x10定義的名為0x5c 0x5f 0x54 0x5a的區(qū)間,并將它們合成為總和溫度區(qū)間。
在這個(gè)總和溫度區(qū)間中,需要再找到使用0x5B 0x85定義的區(qū)間(步驟220),并稱為個(gè)體溫度區(qū)間,在這個(gè)區(qū)間內(nèi),包含了許多與溫度相關(guān)的參數(shù)和執(zhí)行途徑。每一個(gè)這樣的范圍只對(duì)應(yīng)了計(jì)算器主板上的某一塊溫度區(qū)間,稱為個(gè)體溫度區(qū)間。一臺(tái)計(jì)算器中可能存在一個(gè)或多個(gè)個(gè)體溫度區(qū)間,第一個(gè)個(gè)體溫度區(qū)間就是CPU的溫度區(qū)間。因此提取第一個(gè)個(gè)體溫度區(qū)間,即中央處理器溫度區(qū)間(步驟230),在這個(gè)溫度區(qū)間中分析確定溫度的讀取途徑(步驟240)。
在第一個(gè)個(gè)體溫度區(qū)間中,使用0x14定義的名為0x5F 0x54 0x4D 0x50<_TMP>區(qū)間部分就記錄了讀取當(dāng)前溫度的途徑。分析查找使用0x14定義的名為0x5F 0x54 0x4D 0x50<_TMP>的區(qū)間部分。進(jìn)而分析這個(gè)區(qū)間中實(shí)現(xiàn)溫度讀取的是否是ACPI的臨時(shí)名稱。
這個(gè)實(shí)現(xiàn)途徑有可能是一個(gè)名稱如0x43 0x35 0x34 0x30 0x01意為C540<0x01>或者0x43 0x35 0x34 0x30意為C540,也有可能是一大段數(shù)字代碼。如果是一大段數(shù)字代碼,則這段代碼就是具體的實(shí)現(xiàn)途徑,暫稱它為實(shí)現(xiàn)方法1。如果只是用0x70定義的一個(gè)名稱,所以接下來(lái)必須尋找這個(gè)名稱的具體定義。由于這個(gè)名稱在不同機(jī)型上是不同的,所以暫且叫它名稱A,如果名稱A帶參數(shù),其名稱組成如C540<0x01>,則需要將該參數(shù)的值一一記錄下來(lái)。暫且稱它為參數(shù)An。
在總和溫度區(qū)間中查找使用0x14定義的名稱A。找到后就會(huì)發(fā)現(xiàn)名稱A實(shí)際上也是一大段數(shù)字代碼,作用與實(shí)現(xiàn)方法1相同。所以也把它稱為實(shí)現(xiàn)方法1。
分析實(shí)現(xiàn)方法1,如果遇到名為0x68~0x6E的代號(hào),則需要將記錄的參數(shù)依次代入。如果實(shí)現(xiàn)方法1沒(méi)有參數(shù),則這些值都記為0。找到使用0x70定義的以0x5c 0x5f 0x53 0x42<\_SB>為開(kāi)頭的名稱,從這個(gè)名稱中就可以看出實(shí)現(xiàn)讀取CPU溫度的具體設(shè)備。這個(gè)名稱通常是由許多個(gè)代碼組成的,如\_SB·C046·C059·C08F。從后向前依次查找代碼的定義區(qū)間,并在該定義區(qū)間中查找使用0x5b 0x82定義的設(shè)備區(qū)間,再在設(shè)備區(qū)間中查找使用0x08定義的名為0x5f 0x48 0x49 0x44<_HID>的位置,找到該位置后,分析后面的5到9個(gè)字節(jié),如果該位置后的第一個(gè)字節(jié)為0x0d,則向后讀取多個(gè)字節(jié)遇到0x00為止,然后將這些讀到的數(shù)字按照ASCII碼轉(zhuǎn)化為字符串,這組字符串標(biāo)明了設(shè)備的類型。例如“PNP0C09”表示設(shè)備是Embedded Controller,“PNP0A03”表示設(shè)備是PCI總線;如果該位置后的第一個(gè)字節(jié)為0x0c,則向后讀取4個(gè)字節(jié),第一、二個(gè)字節(jié)表示設(shè)備類型,第三、四個(gè)字節(jié)表示類型號(hào),例如4個(gè)字節(jié)的值是0x41 0xd0 0x0c 0x09,第一、二個(gè)字節(jié)0x41 0xd0表示設(shè)備類型為即插即用型設(shè)備,第三、四個(gè)字節(jié)0x0c 0x09是類型號(hào)0c09,組合起來(lái)等同于“PNP0C09”。如果在設(shè)備區(qū)間中沒(méi)有找到使用0x08定義的名為0x5f 0x48 0x49 0x44<ADR>的位置則查找使用0x08定義的名為0x5f 0x410x44 0x52的位置,根據(jù)該位置后的第一個(gè)字節(jié)的值,將后面的1到4個(gè)字節(jié)的內(nèi)容記錄下來(lái)。如果該位置后的第一個(gè)字節(jié)的值是0x0a,則記錄1個(gè)字節(jié)的內(nèi)容;如果值是0x0b,則記錄2個(gè)字節(jié)的內(nèi)容;如果值是0x0c,則記錄4個(gè)字節(jié)的內(nèi)容。這些數(shù)值稱為地址。然后再向上查找一個(gè)設(shè)備,同樣找它的設(shè)備類型。找到后通過(guò)這個(gè)設(shè)備類型和原來(lái)找到的地址,也可以判斷出設(shè)備的類型。例如名稱為\_SB·C046·C059·C08F。C08F是使用0x14定義的,C059是使用0x5B 0x82定義的,在C059的定義區(qū)間中沒(méi)有找到0x5f 0x48 0x49 0x44<_HID>的位置,所以只能再找0x5f 0x48 0x49 0x44<_ADR>的位置,找到后得取數(shù)值0x1f0000。C046是使用0x5B 0x82定義的,并且在它的0x5f 0x480x49 0x44<_HID>位置后讀出的數(shù)值為0x0c 0x41 0x0d 0x0a 0x03,由此可知C046是PCI總線,由于C059是C046上的第0x1f號(hào)設(shè)備,所以判斷出C059是設(shè)備SMBus。
通過(guò)上述的方法找到設(shè)備后,這個(gè)設(shè)備就是用來(lái)讀取CPU溫度的設(shè)備。
請(qǐng)參見(jiàn)圖3,本發(fā)明實(shí)施例通過(guò)嵌入式控制器(Embedded Controller)的實(shí)現(xiàn)方法的流程圖。
通過(guò)識(shí)別讀取CPU溫度的途徑后,如果確定是通過(guò)Embedded Controller實(shí)現(xiàn)的則后續(xù)的步驟如下 將已經(jīng)得到的具體設(shè)備名稱分為兩部分,最后4個(gè)字符為第二部分,其余的為第一部分。例如設(shè)備名稱是\_SB.PCI0.LPCB.EC0.CCPT,分成兩部分后則\_SB.PCI0.LPCB.EC0是第一部分,CCPT為第二部分。
由于EC0是使用0x5B 0x82定義的,表明它是一個(gè)設(shè)備,并且它使用0x08定義的0x5f 0x48 0x49 0x44<_HID>值是“PNP0C09”。所以可以在EC0的定義空間下查找到使用0x08定義的0x5f 0x43 0x52 0x53<_CRS>的值,得到硬件端口(步驟310),這個(gè)值是一組資料,按照高級(jí)電源管理協(xié)議的規(guī)范翻譯后可以得知當(dāng)前計(jì)算器的Embedded Controller硬件端口地址是0x62,0x66。
找到端口地址后,需要知道讀取溫度所用的功能偏移量,這就用到了設(shè)備名稱的第二部分。先在名稱的第一部份的定義空間中查找使用0x5B 0x80定義的名稱,在這個(gè)名稱后面的一個(gè)字節(jié)如果是0x03,則表示找到了定義EmbeddedController功能偏移量的地方,具體細(xì)分Embedded Controller各功能偏移量的部分是使用0x5B 0x81定義的,同時(shí)也定義了Embedded Controller的操作是否是互斥操作。在這部分中定義了許多的名稱和這個(gè)名稱有效的Bit數(shù)。設(shè)備名稱的第二部分應(yīng)該也在這部分中被定義過(guò)了,找到定義的位置,通過(guò)計(jì)算得到這個(gè)位置的偏移量(即操作碼)和有效的Bit數(shù)(步驟320),偏移量就是所得取溫度的功能偏移量。
結(jié)合以往的方法實(shí)現(xiàn)讀取溫度的功能。如果上一步驟中查出EmbeddedController的操作屬于互斥操作,則應(yīng)先將內(nèi)存中的全局鎖鎖上,然后將功能偏移量寫入EC的命令端口<由上面步驟中已經(jīng)得出端口地址是0x66>,然后從數(shù)據(jù)端口中讀取資料<由上面步驟中已經(jīng)得出端口地址是0x62>,就可以得到CPU的當(dāng)前溫度(步驟330)。如果全局鎖已鎖,則讀出資料后需要再將全局鎖打開(kāi)。
參見(jiàn)圖4,該圖為本發(fā)明通過(guò)系統(tǒng)管理總線SMBus的實(shí)現(xiàn)方法的流程圖。
通過(guò)識(shí)別讀取CPU溫度的途徑后,如果確定是通過(guò)SMBus實(shí)現(xiàn)的則后續(xù)的步驟如下 如果通過(guò)這種方式讀取溫度,則設(shè)備的名稱后面大多跟有參數(shù)。如\_SB.C046.C059.C08F(0x59,Local4,0x00)。將這個(gè)設(shè)備名稱分為三部分,參數(shù)是第三部分,名稱中的最后4個(gè)字節(jié)值是第二部分,其余的是第一部分。這個(gè)名稱中的第一個(gè)參數(shù)是設(shè)備號(hào),第二個(gè)參數(shù)是設(shè)備索引號(hào)。通過(guò)查詢,名稱的第二部分C08F是使用0x14定義的,所以C08F是具體的執(zhí)行方法。C059是使用0x5B 0x82定義的,但是在它的定義空間中不能夠找到使用0x08定義的0x5f 0x48 0x49 0x44<_HID>的值,所以查找使用0x08定義的名為0x5f 0x480x49 0x44<_ADR>的位置,取得值為0x1f0000。C046是使用0x5B 0x82定義的,并且它的0x5f 0x48 0x49 0x44<_HID>值是“PNP0A03”,表明C046是PCI總線,由于C059在PCI總線上的設(shè)備位置是0x1f,所以可以確定設(shè)備是SMBus。所以常見(jiàn)方法中所需要的參數(shù)設(shè)備索引號(hào),設(shè)備號(hào)都已經(jīng)得到了。只差SMBus的基地址號(hào),和SMBus狀態(tài)寄存器的狀態(tài)號(hào)。
分析具體執(zhí)行方法,即設(shè)備名稱第二部分的定義空間(步驟410)。查找是否有0x5c 0x5f 0x47 0x4c<\_GL>的名稱定義,如果有則表明當(dāng)前機(jī)型中SMBus的操作是互斥操作。查找所有使用0x70定義的語(yǔ)句(步驟420)。該語(yǔ)句有兩個(gè)參數(shù),如果第二個(gè)參數(shù)是4個(gè)字節(jié)的名稱,則表明這個(gè)語(yǔ)句就是SMBus的操作步驟。例如0x70 0x0a 0x00 0x60則表明這個(gè)語(yǔ)句不是SMBus的操作語(yǔ)句,因?yàn)樗牡诙€(gè)參數(shù)只有一個(gè)字節(jié)即0x60;0x70 0x0a 0x48 0x43 0x300x38 0x41則表明這個(gè)語(yǔ)句是SMBus的具體操作,因?yàn)樗牡诙€(gè)參數(shù)是4個(gè)字節(jié)即0x43 0x30 0x38 0x41<c08a>。查到SMBus的操作語(yǔ)句后,提取第二個(gè)參數(shù),在查找第二個(gè)參數(shù)名稱的定義位置(步驟430),這個(gè)位置基本上都是使用0x5B 0x80和0x5B 0x81定義的。其中使用0x5B 0x80定義的部分中0x5B 0x80后的第6和7個(gè)字節(jié)就是SMBus的基地址。而0x5B 0x81定義了操作名稱的地址偏移量(步驟440)。根據(jù)偏移量和基地址就可以計(jì)算出這些名稱的物理地址。然后在SMBus的定義范圍內(nèi),查找使用0x5B 0x81定義的名稱B的位置。找到后0x5B 0x81后面的第6和7個(gè)字節(jié)就是SMBus的基地址(步驟450)。通過(guò)SMBus的基地址和上面計(jì)算出的偏移量,就可以確定讀取CPU溫度需要操作的SMBus寄存器的地址。參照SMBus操作步驟的順序和參數(shù)狀況,使用參數(shù)1、2、3和SMBus的寄存器讀取CPU的溫度(步驟460)。
按照以0x70定義的語(yǔ)句的先后順序,凡是第二個(gè)參數(shù)是4個(gè)字節(jié)的,就按照計(jì)算出的物理地址進(jìn)行硬件操作。遇到0x68則用所述第一個(gè)參數(shù)替代,遇到0x69則用所述參數(shù)替代。如果語(yǔ)句中的第一個(gè)數(shù)是0x68到0x6e之外的值,則直接將這個(gè)值寫入第二個(gè)參數(shù)的物理地址中。如果遇到以0x70定義的語(yǔ)句的第一個(gè)參數(shù)是4個(gè)字節(jié)的字符串,并且在0x5B 0x81定義區(qū)間中也存在,則從這個(gè)名稱的物理地址中讀出數(shù)值就得到了當(dāng)前CPU的溫度。
下面通過(guò)一具體的例子詳細(xì)說(shuō)明本發(fā)明的處理過(guò)程。
例如設(shè)備名稱是\_SB.C046.C059.C08F(0x59,0x0b,0x00),并且將二進(jìn)制代碼翻譯后得到 Method(C08F,3,Serialized){Acquire(\_GL,0xFFFF)Store(0x00,Local2)Store(0xFA,Local0)While(LAnd(And(C08A,0x01),LGreater<br/>(Local0,0x00))){Stall(0x64)<!-- SIPO <DP n="9"> --><dp n="d9"/>Decrement(Local0)}If(Local0){Store(Arg1,C08C)Store(Arg0,C08D)If(LEqual(And(Arg0,0x01),0x00)){Store(Arg2,C08E)}Store(0xFF,C08A)Store(0x48,C08B)Store(0xFA,Local0)While(LAnd(LEqual(And(C08A,0x1E),<br/>0x00),LGreater(Local0,0x00))){Stall(0x64)Decrement(Local0)}And(C08A,0x1C,Local1)Store(0xFF,C08A)If(LAnd(LEqual(Local1,0x00),And(Arg0,<br/>0x01))){Store(C08E,Local2)}}<!-- SIPO <DP n="10"> --><dp n="d10"/>Else{Store(0x01,Local1)}Release(\_GL)If(And(Arg0,0x01)){ShiftLeft(Local1,0x08,Local3)Or(Local3,Local2,Local1)}Return(Local1)}OperationRegion(C089,SystemIO,0x1200,0x06)Field(C089,ByteAcc,NoLock,Preserve){C08A,8,Offset(0x02),C08B,8,C08C,8,C08D,8,C08E,8} 發(fā)現(xiàn)其中定義了\_GL,所以在操作SMBus時(shí)需要鎖上全局鎖,處理完成后再打開(kāi)全局鎖。依照上述方法得出Arg0是0x59,Arg1是0x0b。使用0x70定義的語(yǔ)句符合要求的依次是 Store(Arg1,C08C) Store(Arg0,C08D) Store(0xFF,C08A) Store(0x48,C08B) Store(0xFF,C08A) Store(C08E,Local2) 通過(guò)計(jì)算得知C08A得物理地址是0x1200,C08B是0x1202,C08C是0x1203,C08D是0x1204,C08E是0x1205。所以SMBus方法的硬件操作為 1、將0x0b寫入0x1203。
2、將0x59寫入0x1204。
3、將0xff寫入0x1200。
4、將0x48寫入0x1202。
5、將0xff寫入0x1200。
6、從0x1205中讀取數(shù)據(jù),就得到了CPU的當(dāng)前溫度。
雖然本發(fā)明以前述的較佳實(shí)施例公開(kāi)如上,然其并非用以限定本發(fā)明,故任何本領(lǐng)域的技術(shù)人員,在不脫離本發(fā)明的精神和范圍內(nèi),可作一些更動(dòng)與變化,因此本發(fā)明的保護(hù)范圍以權(quán)利要求為準(zhǔn)。
權(quán)利要求
1、一種讀取中央處理器溫度的通用方法,包括如下步驟
根據(jù)高級(jí)電源管理協(xié)議(ACPI)從BIOS中讀取AML代碼;
在該AML代碼中,確定讀取該CPU溫度的硬件途徑;
根據(jù)該硬件途徑在該AML代碼中確定執(zhí)行溫度讀取的硬件端口和操作碼;
分析該AML碼,確定該硬件端口操作順序;及
根據(jù)該操作順序,操作硬件端口,讀取CPU溫度。
2、如權(quán)利要求1所述的讀取中央處理器溫度的通用方法,其特征在于,所述提取該CPU溫度的硬件途徑的步驟為通過(guò)標(biāo)識(shí)符查找,提取該CPU溫度的硬件途徑。
3、如權(quán)利要求1所述的讀取中央處理器溫度的通用方法,其特征在于,所述確定硬件途徑的步驟還包括
查找所有定義溫度的區(qū)間位置,并將其合成為總和溫度區(qū)間;
在該總和溫度區(qū)間中,查找個(gè)體溫度區(qū)間;
提取第一個(gè)體溫度區(qū)間;及
在該第一個(gè)體溫度區(qū)間中確定當(dāng)前溫度的實(shí)現(xiàn)途徑。
4、如權(quán)利要求3所述的讀取中央處理器溫度的通用方法,其特征在于,還包括如下步驟
判斷該個(gè)第一個(gè)體溫度區(qū)間中實(shí)現(xiàn)溫度讀取的是否是ACPI的臨時(shí)名稱;及
根據(jù)該判斷結(jié)果在AML代碼中查找該臨時(shí)名稱的具體定義。
5、如權(quán)利要求3所述的讀取中央處理器溫度的通用方法,其特征在于,所述在該第一個(gè)體溫度區(qū)間中確定當(dāng)前溫度的實(shí)現(xiàn)途徑的步驟,還包括如下步驟
在該第一個(gè)體溫度區(qū)間中查找使用0x70定義的以0x5c 0x5f 0x53 0x42<\_SB>為開(kāi)頭的名稱串;
在\_SB范圍內(nèi)查找名稱串中最后一個(gè)名稱所屬的設(shè)備;
在該第一個(gè)體溫度區(qū)間中查找使用0x08定義的名為0x5f 0x48 0x49 0x44<_HID>的位置;
分析后面的第5到第9個(gè)字節(jié);及
分析后面的第5到第9個(gè)字節(jié);及
根據(jù)該分析結(jié)果判斷讀取CPU溫度的硬件途徑。
6、如權(quán)利要求3所述的讀取中央處理器溫度的通用方法,其特征在于,所述第一個(gè)個(gè)體溫度區(qū)間即為CPU的溫度區(qū)間。
7、如權(quán)利要求1所述的讀取中央處理器溫度的通用方法,其特征在于,所述實(shí)現(xiàn)途徑為系統(tǒng)管理總線。
8、如權(quán)利要求1所述的讀取中央處理器溫度的通用方法,其特征在于,所述實(shí)現(xiàn)途徑為嵌入式控制器。
全文摘要
本發(fā)明涉及一種讀取中央處理器溫度的通用方法,首先根據(jù)高級(jí)電源管理協(xié)議(ACPI)從BIOS中讀取AML代碼,在該AML代碼中,確定讀取該CPU溫度的硬件途徑,根據(jù)該硬件途徑在該AML代碼中確定執(zhí)行溫度讀取的硬件端口和操作碼,分析該AML碼,確定該硬件端口操作順序,根據(jù)該操作順序,操作硬件端口,讀取CPU溫度。
文檔編號(hào)G06F9/44GK1722104SQ20041006900
公開(kāi)日2006年1月18日 申請(qǐng)日期2004年7月12日 優(yōu)先權(quán)日2004年7月12日
發(fā)明者劉文涵, 宋建福, 胡幸, 劉一波, 劉萍 申請(qǐng)人:英業(yè)達(dá)股份有限公司