Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9728052
  • 博文数量: 1227
  • 博客积分: 10026
  • 博客等级: 上将
  • 技术积分: 20273
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-16 12:40
文章分类

全部博文(1227)

文章存档

2010年(1)

2008年(1226)

我的朋友

分类: C/C++

2008-04-23 21:39:13

超频软件原理探析
作者:联想(深圳)电子有限公司QDI研发部

文章摘要:
目前各大主板供应商使用的超频软件都是基于频率发生器这一硬件实现的,而大部分频率发生器都是了I2C总线上的一个设备,本文介绍了I2C 设备的基本原理及超频的基本方法和原理。
关键词:I2C,频率发生器,字节读写,块读写

Over-clock basic theory
Luo xi, Zhang Hong-wei
518027 R&D Department QDI Business Legend(shenzhen) Electrolic Inc.


ABSTRACT:

Almost all the over-clock software provided by mainboard manufactory is based on the clock generator which is the basic hardware on mainboard. And almost all clock generators are I2C devices. This document focus on how the I2C device works and the basic theory of over-clock software.
Key words: I2C, clock generator, Byte read/write, Block Read/Write

随着计算机的快速发展,越来越多的DIY们希望更充分地发挥计算机及其部件的性能,"榨取"包括CPU在内的各种设备的资源。在这种情况下,各主板厂商提供的超频软件就应运而生了。这些应用软件包括联想QDI的StepEasy(超频梭),技嘉的EasyTune,微星的Fuzzy Logic,硕泰克的红色风暴。本文将在这个方面结合自己在这方面的实践经验,介绍超频软件的实现原理。

1. 前言
实际上,所有超频软件超频的实现都离不开频率发生器的硬件支持,也就是说超频实际上是对频率发生器(clock generator)输出的基本外频进行超频。如当CPU频率为800兆,即外频为100兆,倍频为8倍时,其外频实际上是由频率发生器的输出频率决定的。当用软件操作频率发生器使其输出频率改变为105兆时,CPU的内频将运行在105乘以8,即840兆的频率上,这样就实现了超频使用CPU的目的。
当前主板使用的频率发生器主要供应商有Cypress,ICS,Winbond,PhaseLink等,而这些厂商生产的频率发生器有支持软件改变输出频率的,也有不支持的。因此超频软件必须是基于可以使用软件改变输出频率的频率发生器的基础上的。
主板上的频率发生器大部分都是以I2C总线的方式与其他主板设备进行通讯,也就是说频率发生器是一个I2C设备,要了解超频的基本原理首先必须了解I2C总线的基本原理。

2. I2C总线基本原理
 I2C(inter-integrated circuit)总线是一种由飞利浦公司开发的串行总线,产生于80年代,最初为音频和视频设备开发,现在在微电子通信控制,消费电子产品,通信等领域都得到了广泛的应用。

2.1 I2C总线的特点
I2C总线包括一个两端接口,通过一个带有缓冲区的接口,数据可以被I2C发送或接受。控制和状态信息则通过一套内存映射寄存器来传送。
I2C总线最主要的优点是其简单性和有效性。它只需两线(一串行数据线:SDA,及一串行时钟线:SCL)。每个连线到总线的器件以单一不同的地址,用软件来存取。由于接口直接在组件之上,因此I2C总线占用的空间非常小,从而减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。I2C总线的另一个优点是,它支持多主控(multi-mastering),其中任何能够进行发送和接收的设备都可以成为主总线。它以串行8位为主,双向传送的方式进行数据传输。一个主总线能够控制信号的传输和时钟频率。主控器可以作为主发送器或主接收器。
举例如图1:

图1 I2C总线举例

2.2 总线数据传输开始及停止
以下分别为所需的开始及停止条件。开始条件:当SCL线在高位时,SDA线由高转换至低。停止条件:当SCL线在高位时,SDA线由低转换至高。
开始及停止条件通常由主控器产生,如图2所示。

图2 数据传输开始和停止条件

2.3 数据传输确认
数据传送附上确认位是必要的。与确认有关的时钟脉冲是由主控器发出。当确认时钟脉冲期间,发送那方要释放SDA线(高电平)。当确认时钟脉冲时,接收那方一定将SDA线拉低,因此在这时钟脉冲高位时,它维持在稳定的低位,如图3所示。

图3 数据传输的确认状态

2.4 数据传输过程
每一个放上SDA线的字节为8位长。每一次传送的字节数量没有限制。每字节必须有一确认位跟随。数据传送以最高有效位为先。
  在开始条件之后,一个从属地址被送出。这个地址是7位长,然后是第8位,它是一个数据方向位(读/写)--"0"代表发送(写入),"1"代表需求数据(读入)。数据传送通常以主控器所发出的停止条件(P)结束,如图4,5,6所示。

图4 数据传输过程


图5 对应具有 7位地址的从属接收器的主发送器的地址,转换方向不变化


图6 从属器第一字节之后主控器立即读

3 超频基本原理
超频软件基本原理简单而言是通过修改时钟芯片(CLOCK Chip)I2C总线上数据寄存器的值,从而无须跳线,无须重新启动就能达到超频的目的。同时,为了防止超频后系统死机,时钟芯片还提供了“看门狗(watchdog)”地功能。如下图,在超频过程中,会同时触发时钟芯片内部的计数器,如果死机,系统会在几秒后发出reset信号,使系统重新启动。如果超频成功,在这等待的几秒内,软件必须清除设置看门狗的寄存器,使系统继续正常工作。

图7:时钟芯片管脚图

3.1 复位与看门狗电路
当电源上电、掉电时,该芯片都可提供复位电平,并且当其WDI RESET管脚不能采集到翻转信号时,就会发送200ms的复位脉冲。单片机控制器采用P30脚定时向看门狗电路发送电压翻转信号,以示系统正常工作。当由于外部干扰或其他原因导致死机时,看门狗电路会自动发出复位信号,从而触发主板复位电路使系统重新启动。

3.2 M和N的选择
要实现超频,从软件的角度来看就是将CPU的外频转换成一定的参数,并将这些参数写入到频率发生器的寄存器中去。在这里,首先将CPU外频转换成两个值M和N。以某种芯片为例,根据公式 Fcpu=G*(N 3)/(M 3)就可以得出M和N的值,在这个公式中Fcpu的值为我们想要超的外频大小,G为一个定义好的常数, M和N的最大值和最小值也已知。因此很容易通过编程从而得出当前想要超的外频所对应的M和N的值。以下是我们用C语言写的一段小代码以供参考(注:实现方法很多):
#define G xxx

#define Mmax xxx

#define Nmax xxx

#define Mmin xxx

#define Nmin xxx

void FoundMN(float Fcpu,int*M,int*N)// Fcpu为输入参数,为想得到的外频值

{								//M,N为输出参数,为该外频值对应的值

…

D=300;						// 定义D为一个测试的值

	for( M=Mmin; M<=Mmax; M   )

	{

		for( N=Nmin; N<=Nmax; N   )

		{

			FREQ=G*(N 3)/(M 3);		// 测试由当前的M,N得出的外频值

			if ( fabs((Fcpu-FREQ)) < D )//看得出的外频值是否与想超的外频值更接近

			{	

D = float(fabs((Fcpu-FREQ)));// 更新外频值与想超的外频值之间的

//差值

				M1=M; N1=N;			//将M,N值存入M1,N1

			}

		}

	}

}
接着把M和N的值写入相应的寄存器了,如果几秒种后系统工作正常,超频就成功了。

4. 软件设计
软件设计必须遵循I2C总线的传输协议,上面已经列出了,在这里不再重复,必须强调一下I2C总线数据存储器的读写分为Byte和Block的读写,按照不同的时钟芯片而定。而软件设计就是将前面我们已经得出的想要超的CPU外频所对应的两个参数M和N,根据不同的时钟芯片对应的Byte或Block的读写方式写入I2C总线数据存储器里。以下为I2C总线数据存储器的Byte,Block读写源程序:
;Byte方式读:

	  ReadByte	Proc	Near

		push	cx

		mov	dx,SMBus_Port  04h			;将I2C总线基地址读入段寄存器

		inc	ch

		mov	al,ch			;ID 读的命令

		out	dx,al

		IODELAY		;IO延时

		call	Ct_Chk_SMBus_READY		;检测I2C总线是否准备好

		pop	ax

		mov	dl,03h

		out	dx,al			

		IODELAY		//IO延时

		IODELAY		//IO延时

		mov	dl,02h

		mov	al,48h

		out	dx,al			;读数据

		IODELAY		;IO延时

		mov	cx,1000h

	@@:

		newiodelay

		loop	short @B

	call	Ct_Chk_SMBus_READY		;检测I2C总线是否准备好

		mov	dl,05

		in	al,dx			;读出数据到AL寄存器

		IODELAY		;IO延时

			ret

ReadByte	Endp

;************************************************************

;Block方式写:

WriteBlock	PROC	NEAR

	   	push	cx

		call	Ct_Chk_SMBus_READY	;检测I2C总线是否准备好

		mov	dx,SMBus_Port   02h		

		in	al,dx			;基地址加上02h

		IODELAY    	;IO延时

		pop	cx

		mov	dx,SMBus_Port   04h	

		mov	al,ch

		out	dx,al

		IODELAY  		;IO延时  

		mov	dx,SMBus_Port   03h	;寄存器开始的偏移量

		mov	al,cl

		out	dx,al

		xor	cx,cx

		mov	dx,SMBus_Port   00h

BlockWriteok:		      			

		mov	al,byte ptr es:[si]    ;es:[si 0]=数据块的大小

		mov	dx,SMBus_Port   05h    ;将要写的个数传给段寄存器

		out	dx,al

		IODELAY    		;IO延时 

		movzx	cx,al			; 获取读取的block数

		inc	si		        ;es:[si 1]=开始写数据

;R09A		mov	cl,byte ptr es:[si]    

				mov	dx,SMBus_Port   07h    		

WriteBlockdata:					

;R09B		mov	al,byte ptr cs:[si] 

				mov	al,byte ptr es:[si] 	

				out	dx,al

				IODELAY		     ;IO延时

				inc	si

				loop	short	WriteBlockdata

				mov	dx,SMBus_Port   02h	;开始以block方式写

				mov	al,54h

				out	dx,al

				IODELAY		    ;IO延时 

				xor	cx,cx

				mov	dx,SMBus_Port   00h	;检查状态

Writefail:

				in	al,dx

				IODELAY    		;IO延时 

;R09A		or	al,al 			;检查状态

;R09A		jz	short	Writeok

		test al,02h			

		jnz 	short 	writeok	 		

		out	dx,al						;清除状态

		IODELAY 					;IO延时 

		loop	short	Writefail

Writeok:

		ret

WriteBlock	ENDP

5 后记
实际上,主板设备在超频后的使用是极不稳定的,这是因为频率发生器的输出频率改变后,不仅是CPU外频发生了变化,包括主板上其他设备包括SDRAM,PCI设备,AGP设备的使用频率都发生了变化。而这些设备对频率变化的承受程度有可能比CPU弱许多,因此,超频后经常导致死机等现象发生。

引或用参考文献:
1)“I2C总线介绍” 作者: 彭秀峰
2)“The I2C-BUS Specification Version 2.1” 作者: Philips Semiconductors 1/2000


作者简介:
罗玺:湘潭大学。
张宏伟:北京航空航天大学学士,电子科技大学硕士毕业。
现都在联想电脑公司深圳研发中心从事应用软件开发工作.


工作单位:联想(深圳)电子有限公司QDI研发部软件处
地址:
深圳市南山区高新技术产业园区(南区)高新南一道联想(深圳)电子有限公司QDI研发部软件处

Office Tel.:(0755)6955888-8335
Email : luoxi@legend.com

阅读(1009) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~