读取中央处理器温度的通用方法

文档序号:3690137阅读:241来源:国知局
专利名称:读取中央处理器温度的通用方法
技术领域
本发明涉及一种中央处理器温度的读取方法,特别涉及一种读取中央处理器温度的通用方法。

背景技术
随着计算机业的发展,计算器的更新速度越来越快。因此当前计算机的产量也逐步上升。每台新计算机出厂之前都必须经过整体测试来检验其性能是否符合标准。其中中央处理器(CPU)是主要的检测项目,当前的CPU速度是比较让人满意的,而CPU的发热量却成为用户普遍关注的问题。CPU温度对于计算器来说是比较重要的,温度过高会导致部件的损坏,所以测试计算器的性能时,CPU的温度是一个重要的参数指标。
CPU温度的测试主要是监测CPU温度的升高和降低,即在运行各种硬件测试时,CPU的温度不可以过高。例如在一批机器中,同时运行相同的硬件测试软件。如果其中一台或几台的CPU温度比其它的计算器高很多,那么就意味着这几台计算器的性能不是很好,或者存在某种问题。
目前测试CPU的温度可以通过多种途径,经常使用的通常为两种,一种为通过系统管理总线(SMBus)、设备号、设备索引号读取CPU的温度;另一种是通过嵌入式控制器(Embedded Controller)的端口号和相应的功能偏移量来取得温度。
虽然在同一种机型上读取CPU温度的方法是相同的,并且只需使用一种方法,但是不同的机型使用的方法是不一样的,纵使读取温度的途径相同,方法的参数也是不近相同的。有些途径和参数虽然相同,也可能由于参数的调用顺序不同,而影响CPU温度的读取。由于相同的厂家生产出的计算器中读取CPU温度的方法也不同,所以常见技术读取CPU温度的方法并不通用,需要先识别当前欲读取温度的机器的机型,根据机型来确定温度的读取方法。这样,在每一种新的机型产生时,经常需要询问厂商该种机型所使用的方法和相关信息,再更改代码将该种机型的读取方法。这就使得温度读取的过程中出现如下缺陷 1、由于厂商的反馈速度不是太快,所以耗时是不可避免的。因此会造成了测试程序的开发时间加长。
2、计算器的型号一直在不断的推陈出新,以前生产的机型又不会立即废弃,所以测试程序在开发时就必须兼顾以前的机型,同时又适用刚刚生产出来的机型,这样就会造成程序代码的冗长,不利于程序的维护。
3、温度提取方法并不通用,程序一直处于更新之中,人力和物力的投入会不断的增加成本,造成资本的浪费。
因此,针对上述的缺陷,目前亟需一种适用于所有机型的CPU温度的统一读取方法,来简化CPU温度读取过程。


发明内容
有鉴于此,本发明为解决上述问题而提出一种读取CPU温度的通用方法,主要目的在于提供较为通用的读取CPU温度的方法,可以针对不同机型采用统一的方法进行温度读取。
所以为达到上述目的,本发明提供一种读取中央处理器温度的通用方法,首先根据高级电源管理协议(ACPI)从BIOS中读取AML代码,在该AML代码中,确定读取该CPU温度的硬件途径,根据该硬件途径在该AML代码中确定执行温度读取的硬件端口和操作码,分析该AML码,确定该硬件端口操作顺序,根据该操作顺序,操作硬件端口,读取CPU温度。
所述提取该CPU温度的硬件途径的步骤为通过标识符查找,提取该CPU温度的硬件途径。
所述确定硬件途径的步骤还包括 查找所有定义温度的区间位置,并将其合成为总和温度区间; 在该总和温度区间中,查找个体温度区间; 提取第一个体温度区间;及 在该第一个体温度区间中确定当前温度的实现途径。
所述的读取中央处理器温度的通用方法,还包括如下步骤 判断该个第一个体温度区间中实现温度读取的是否是ACPI的临时名称;及 根据该判断结果在AML代码中查找该临时名称的具体定义。
所述在该第一个体温度区间中确定当前温度的实现途径的步骤,还包括如下步骤 在该第一个体温度区间中查找使用0x70定义的以0x5c 0x5f 0x53 0x42<\_SB>为开头的名称串; 在\_SB范围内查找名称串中最后一个名称所属的设备; 在该第一个体温度区间中查找使用0x08定义的名为0x5f 0x48 0x49 0x44<_HID>的位置; 分析后面的第5到第9个字节;及 根据该分析结果判断读取CPU温度的硬件途径。
所述第一个个体温度区间即为CPU的温度区间。
所述实现途径为系统管理总线。
所述实现途径为嵌入式控制器。
根据本发明所提出的读取中央处理器温度的通用方法,适用于各种机型,对所有机型的CPU温度实行统一的读取方法,来简化CPU温度读取过程。



图1为本发明的总体流程图; 图2为本发明所提出的确定读取该CPU温度的硬件途径的流程图; 图3为本发明所提出的通过嵌入式控制器(Embedded Controller)的实现中央处理器温度读取的实施例运作流程图;及 图4为本发明所提出通过系统管理总线SMBus实现中央处理器温度读取的实施例的运作流程图。
其中,附图标记如下 步骤110根据高级电源管理协议从BIOS中读取AML代码 步骤120在该AML代码中,确定读取该CPU温度的硬件途径 步骤130根据该硬件途径在该AML代码中确定执行温度读取的硬件端口和操作码 步骤140分析该AML码,确定该硬件端口操作顺序 步骤150根据该操作顺序,操作硬件端口,读取CPU温度 步骤210查找所有定义温度的区间位置,并将其合成为总和温度区间 步骤220在该总和温度区间中,查找个体温度区间 步骤230提取第一个体温度区间,即中央处理器温度区间 步骤240在该第一个体温度区间中分析确定当前温度的实现途径 步骤310在EC0的定义空间下查找使用0x08定义的0x5f 0x43 0x52 0x53<_CRS>的值,得到硬件端口 步骤320在EC的定义空间中,查找使用0x5B 0x80定义的类型是0x03的名称,再找到使用0x5B 0x81定义的EC功能偏移量的定义区间,在这个区间中找到名称A的位置,并根据这个位置计算它的偏移量和有效的Bit数 步骤330使用EC的端口号和功能偏移量进行EC操作,从而读出CPU的温度 步骤410在SMBus的定义区间中查找名称A的定义空间 步骤420在名称A的定义空间中查找所有使用0x70定义的语句 步骤430查找所有SMBus操作步骤中的第二个参数名称的定义位置 步骤440分析参数名称的位置,从而计算偏移量 步骤450在SMBus的定义范围内,查找使用0x5B 0x81定义的名称B的位置,提取0x5B 0x81后面第6个和第7个字节即为SMBus的基地址 步骤460通过SMBus的基地址以及偏移量确定读取CPU温度需要操作的SMBus寄存器的地址,参照SMBus操作步骤的顺序和参数状况,使用参数1、2、3和SMBus的寄存器读出CPU的温度
具体实施例方式 有关本发明的详细内容及技术,配合

如下 目前,绝大部分计算机支持高级电源管理协议(Advanced Configurationand Power Management Interface,ACPI),所谓高级电源管理协议就是一些表状结构和一些二进制数码,这些表状结构和二进制数码已经固化到计算器的BIOS中,并且在操作系统激活之前就已经调入了内存,其中一部分是操作系统不可以更改的。就在这部分固定不变的内容中,包含有硬件信息,包括硬件端口地址、操作偏移量以及硬件的操作数。在这些硬件信息中,即包括有CPU温度的相关内容。这些内容是以二进制代码的形式记录的,根据高级电源管理协议的规范,可以翻译成一种语句,但是这种语句不能够直接运行,就在这些早已经记录在BIOS的语句中可以看出读取CPU温度的途径、硬件端口以及相应的操作参数。这些信息可以弥补了以往CPU温度读取方法的不足。
根据本发明所提出的读取CPU温度的通用方法,利用已经固化在BIOS中的电源管理协议的部分信息,就可以找到读取CPU温度的途径和各种端口参数,再将这些参数与结合常见技术的方法,就产生了一种比较通用的方法。
请参见图1,该图为本发明所提出的提取中央处理器温度的通用方法的总体流程图,首先按照高级电源管理协议的规范从BIOS中读出一种二进制的数字代码(AML码)(步骤110),AML码为ACPI机器语言代码,在该AML代码中,确定读取该CPU温度的硬件途径,(步骤120),根据该硬件途径在该AML代码中确定执行温度读取的硬件端口和操作码(步骤130),分析该AML码,确定该硬件端口操作顺序(步骤140),最后根据该操作顺序,操作硬件端口,读取CPU温度(步骤150)。
请参见图2,该图是本发明确定读取该CPU温度的硬件途径的流程图。识别读取温度的途径,需要在二进制数字代码(AML码)中,通过特定的标示符来逐层查找,再通过识别设备的硬件ID号,判断出执行温度读取的硬设备。首先查找所有定义的区间位置,并将其合并成一个总和温度区间(步骤210)。查找方法为在二进制数字代码中查找使用0x10定义的名为0x5c 0x5f 0x540x5a<\_TZ>的区间,在这个区间内定义了所有与温度相关的信息和方法。称为总和温度区间。一台计算器中只有一个总和温度区间,但是它可能分成一个或多个部分,并且定义在二进制数代码中。需要找到所有使用0x10定义的名为0x5c 0x5f 0x54 0x5a的区间,并将它们合成为总和温度区间。
在这个总和温度区间中,需要再找到使用0x5B 0x85定义的区间(步骤220),并称为个体温度区间,在这个区间内,包含了许多与温度相关的参数和执行途径。每一个这样的范围只对应了计算器主板上的某一块温度区间,称为个体温度区间。一台计算器中可能存在一个或多个个体温度区间,第一个个体温度区间就是CPU的温度区间。因此提取第一个个体温度区间,即中央处理器温度区间(步骤230),在这个温度区间中分析确定温度的读取途径(步骤240)。
在第一个个体温度区间中,使用0x14定义的名为0x5F 0x54 0x4D 0x50<_TMP>区间部分就记录了读取当前温度的途径。分析查找使用0x14定义的名为0x5F 0x54 0x4D 0x50<_TMP>的区间部分。进而分析这个区间中实现温度读取的是否是ACPI的临时名称。
这个实现途径有可能是一个名称如0x43 0x35 0x34 0x30 0x01意为C540<0x01>或者0x43 0x35 0x34 0x30意为C540,也有可能是一大段数字代码。如果是一大段数字代码,则这段代码就是具体的实现途径,暂称它为实现方法1。如果只是用0x70定义的一个名称,所以接下来必须寻找这个名称的具体定义。由于这个名称在不同机型上是不同的,所以暂且叫它名称A,如果名称A带参数,其名称组成如C540<0x01>,则需要将该参数的值一一记录下来。暂且称它为参数An。
在总和温度区间中查找使用0x14定义的名称A。找到后就会发现名称A实际上也是一大段数字代码,作用与实现方法1相同。所以也把它称为实现方法1。
分析实现方法1,如果遇到名为0x68~0x6E的代号,则需要将记录的参数依次代入。如果实现方法1没有参数,则这些值都记为0。找到使用0x70定义的以0x5c 0x5f 0x53 0x42<\_SB>为开头的名称,从这个名称中就可以看出实现读取CPU温度的具体设备。这个名称通常是由许多个代码组成的,如\_SB·C046·C059·C08F。从后向前依次查找代码的定义区间,并在该定义区间中查找使用0x5b 0x82定义的设备区间,再在设备区间中查找使用0x08定义的名为0x5f 0x48 0x49 0x44<_HID>的位置,找到该位置后,分析后面的5到9个字节,如果该位置后的第一个字节为0x0d,则向后读取多个字节遇到0x00为止,然后将这些读到的数字按照ASCII码转化为字符串,这组字符串标明了设备的类型。例如“PNP0C09”表示设备是Embedded Controller,“PNP0A03”表示设备是PCI总线;如果该位置后的第一个字节为0x0c,则向后读取4个字节,第一、二个字节表示设备类型,第三、四个字节表示类型号,例如4个字节的值是0x41 0xd0 0x0c 0x09,第一、二个字节0x41 0xd0表示设备类型为即插即用型设备,第三、四个字节0x0c 0x09是类型号0c09,组合起来等同于“PNP0C09”。如果在设备区间中没有找到使用0x08定义的名为0x5f 0x48 0x49 0x44<ADR>的位置则查找使用0x08定义的名为0x5f 0x410x44 0x52的位置,根据该位置后的第一个字节的值,将后面的1到4个字节的内容记录下来。如果该位置后的第一个字节的值是0x0a,则记录1个字节的内容;如果值是0x0b,则记录2个字节的内容;如果值是0x0c,则记录4个字节的内容。这些数值称为地址。然后再向上查找一个设备,同样找它的设备类型。找到后通过这个设备类型和原来找到的地址,也可以判断出设备的类型。例如名称为\_SB·C046·C059·C08F。C08F是使用0x14定义的,C059是使用0x5B 0x82定义的,在C059的定义区间中没有找到0x5f 0x48 0x49 0x44<_HID>的位置,所以只能再找0x5f 0x48 0x49 0x44<_ADR>的位置,找到后得取数值0x1f0000。C046是使用0x5B 0x82定义的,并且在它的0x5f 0x480x49 0x44<_HID>位置后读出的数值为0x0c 0x41 0x0d 0x0a 0x03,由此可知C046是PCI总线,由于C059是C046上的第0x1f号设备,所以判断出C059是设备SMBus。
通过上述的方法找到设备后,这个设备就是用来读取CPU温度的设备。
请参见图3,本发明实施例通过嵌入式控制器(Embedded Controller)的实现方法的流程图。
通过识别读取CPU温度的途径后,如果确定是通过Embedded Controller实现的则后续的步骤如下 将已经得到的具体设备名称分为两部分,最后4个字符为第二部分,其余的为第一部分。例如设备名称是\_SB.PCI0.LPCB.EC0.CCPT,分成两部分后则\_SB.PCI0.LPCB.EC0是第一部分,CCPT为第二部分。
由于EC0是使用0x5B 0x82定义的,表明它是一个设备,并且它使用0x08定义的0x5f 0x48 0x49 0x44<_HID>值是“PNP0C09”。所以可以在EC0的定义空间下查找到使用0x08定义的0x5f 0x43 0x52 0x53<_CRS>的值,得到硬件端口(步骤310),这个值是一组资料,按照高级电源管理协议的规范翻译后可以得知当前计算器的Embedded Controller硬件端口地址是0x62,0x66。
找到端口地址后,需要知道读取温度所用的功能偏移量,这就用到了设备名称的第二部分。先在名称的第一部份的定义空间中查找使用0x5B 0x80定义的名称,在这个名称后面的一个字节如果是0x03,则表示找到了定义EmbeddedController功能偏移量的地方,具体细分Embedded Controller各功能偏移量的部分是使用0x5B 0x81定义的,同时也定义了Embedded Controller的操作是否是互斥操作。在这部分中定义了许多的名称和这个名称有效的Bit数。设备名称的第二部分应该也在这部分中被定义过了,找到定义的位置,通过计算得到这个位置的偏移量(即操作码)和有效的Bit数(步骤320),偏移量就是所得取温度的功能偏移量。
结合以往的方法实现读取温度的功能。如果上一步骤中查出EmbeddedController的操作属于互斥操作,则应先将内存中的全局锁锁上,然后将功能偏移量写入EC的命令端口<由上面步骤中已经得出端口地址是0x66>,然后从数据端口中读取资料<由上面步骤中已经得出端口地址是0x62>,就可以得到CPU的当前温度(步骤330)。如果全局锁已锁,则读出资料后需要再将全局锁打开。
参见图4,该图为本发明通过系统管理总线SMBus的实现方法的流程图。
通过识别读取CPU温度的途径后,如果确定是通过SMBus实现的则后续的步骤如下 如果通过这种方式读取温度,则设备的名称后面大多跟有参数。如\_SB.C046.C059.C08F(0x59,Local4,0x00)。将这个设备名称分为三部分,参数是第三部分,名称中的最后4个字节值是第二部分,其余的是第一部分。这个名称中的第一个参数是设备号,第二个参数是设备索引号。通过查询,名称的第二部分C08F是使用0x14定义的,所以C08F是具体的执行方法。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总线上的设备位置是0x1f,所以可以确定设备是SMBus。所以常见方法中所需要的参数设备索引号,设备号都已经得到了。只差SMBus的基地址号,和SMBus状态寄存器的状态号。
分析具体执行方法,即设备名称第二部分的定义空间(步骤410)。查找是否有0x5c 0x5f 0x47 0x4c<\_GL>的名称定义,如果有则表明当前机型中SMBus的操作是互斥操作。查找所有使用0x70定义的语句(步骤420)。该语句有两个参数,如果第二个参数是4个字节的名称,则表明这个语句就是SMBus的操作步骤。例如0x70 0x0a 0x00 0x60则表明这个语句不是SMBus的操作语句,因为它的第二个参数只有一个字节即0x60;0x70 0x0a 0x48 0x43 0x300x38 0x41则表明这个语句是SMBus的具体操作,因为它的第二个参数是4个字节即0x43 0x30 0x38 0x41<c08a>。查到SMBus的操作语句后,提取第二个参数,在查找第二个参数名称的定义位置(步骤430),这个位置基本上都是使用0x5B 0x80和0x5B 0x81定义的。其中使用0x5B 0x80定义的部分中0x5B 0x80后的第6和7个字节就是SMBus的基地址。而0x5B 0x81定义了操作名称的地址偏移量(步骤440)。根据偏移量和基地址就可以计算出这些名称的物理地址。然后在SMBus的定义范围内,查找使用0x5B 0x81定义的名称B的位置。找到后0x5B 0x81后面的第6和7个字节就是SMBus的基地址(步骤450)。通过SMBus的基地址和上面计算出的偏移量,就可以确定读取CPU温度需要操作的SMBus寄存器的地址。参照SMBus操作步骤的顺序和参数状况,使用参数1、2、3和SMBus的寄存器读取CPU的温度(步骤460)。
按照以0x70定义的语句的先后顺序,凡是第二个参数是4个字节的,就按照计算出的物理地址进行硬件操作。遇到0x68则用所述第一个参数替代,遇到0x69则用所述参数替代。如果语句中的第一个数是0x68到0x6e之外的值,则直接将这个值写入第二个参数的物理地址中。如果遇到以0x70定义的语句的第一个参数是4个字节的字符串,并且在0x5B 0x81定义区间中也存在,则从这个名称的物理地址中读出数值就得到了当前CPU的温度。
下面通过一具体的例子详细说明本发明的处理过程。
例如设备名称是\_SB.C046.C059.C08F(0x59,0x0b,0x00),并且将二进制代码翻译后得到 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} 发现其中定义了\_GL,所以在操作SMBus时需要锁上全局锁,处理完成后再打开全局锁。依照上述方法得出Arg0是0x59,Arg1是0x0b。使用0x70定义的语句符合要求的依次是 Store(Arg1,C08C) Store(Arg0,C08D) Store(0xFF,C08A) Store(0x48,C08B) Store(0xFF,C08A) Store(C08E,Local2) 通过计算得知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中读取数据,就得到了CPU的当前温度。
虽然本发明以前述的较佳实施例公开如上,然其并非用以限定本发明,故任何本领域的技术人员,在不脱离本发明的精神和范围内,可作一些更动与变化,因此本发明的保护范围以权利要求为准。
权利要求
1、一种读取中央处理器温度的通用方法,包括如下步骤
根据高级电源管理协议(ACPI)从BIOS中读取AML代码;
在该AML代码中,确定读取该CPU温度的硬件途径;
根据该硬件途径在该AML代码中确定执行温度读取的硬件端口和操作码;
分析该AML码,确定该硬件端口操作顺序;及
根据该操作顺序,操作硬件端口,读取CPU温度。
2、如权利要求1所述的读取中央处理器温度的通用方法,其特征在于,所述提取该CPU温度的硬件途径的步骤为通过标识符查找,提取该CPU温度的硬件途径。
3、如权利要求1所述的读取中央处理器温度的通用方法,其特征在于,所述确定硬件途径的步骤还包括
查找所有定义温度的区间位置,并将其合成为总和温度区间;
在该总和温度区间中,查找个体温度区间;
提取第一个体温度区间;及
在该第一个体温度区间中确定当前温度的实现途径。
4、如权利要求3所述的读取中央处理器温度的通用方法,其特征在于,还包括如下步骤
判断该个第一个体温度区间中实现温度读取的是否是ACPI的临时名称;及
根据该判断结果在AML代码中查找该临时名称的具体定义。
5、如权利要求3所述的读取中央处理器温度的通用方法,其特征在于,所述在该第一个体温度区间中确定当前温度的实现途径的步骤,还包括如下步骤
在该第一个体温度区间中查找使用0x70定义的以0x5c 0x5f 0x53 0x42<\_SB>为开头的名称串;
在\_SB范围内查找名称串中最后一个名称所属的设备;
在该第一个体温度区间中查找使用0x08定义的名为0x5f 0x48 0x49 0x44<_HID>的位置;
分析后面的第5到第9个字节;及
分析后面的第5到第9个字节;及
根据该分析结果判断读取CPU温度的硬件途径。
6、如权利要求3所述的读取中央处理器温度的通用方法,其特征在于,所述第一个个体温度区间即为CPU的温度区间。
7、如权利要求1所述的读取中央处理器温度的通用方法,其特征在于,所述实现途径为系统管理总线。
8、如权利要求1所述的读取中央处理器温度的通用方法,其特征在于,所述实现途径为嵌入式控制器。
全文摘要
本发明涉及一种读取中央处理器温度的通用方法,首先根据高级电源管理协议(ACPI)从BIOS中读取AML代码,在该AML代码中,确定读取该CPU温度的硬件途径,根据该硬件途径在该AML代码中确定执行温度读取的硬件端口和操作码,分析该AML码,确定该硬件端口操作顺序,根据该操作顺序,操作硬件端口,读取CPU温度。
文档编号G06F9/44GK1722104SQ20041006900
公开日2006年1月18日 申请日期2004年7月12日 优先权日2004年7月12日
发明者刘文涵, 宋建福, 胡幸, 刘一波, 刘萍 申请人:英业达股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1