Jump to content
InsanelyMac Forum
Sign in to follow this  
TennisGeek

Gigabyte ボードでシャットダウンできるようにDSDTを直す

Recommended Posts

さて、無事に ACPI テーブルも手に入ったことだと思います。

DSDT を変更して、 OSx86 フレンドリーに変えていくことにします。

 

様々なハードウェアを Apple 純正ドライバーに認識させる為に、 DSDT の修正だけでできると、結果としては「アップル純正ハードウェアと同等」ということなので、末永く使えることになります。

 

マシンが /Extra/Extensions/fakesmc.kext 以外の kext を必要としなくなると、ソフトウェアアップデートを使ってアップデートし続けられる可能性が高くなるので、これを理想とする訳です。 今後、暇をみながら DSDT を直すトピックを追加していく予定です。

 

今回は、 Shutdownをする。  EG45M-UD2H ですが、完動と思っていたら、Shutdown したときに電源がオフにならないということに気がつきました。よく知られているので直すことにします。

(とはいえ、このトピックを追うのは厄介ですけど)

 

簡単にいうとサウスブリッジ(?)のレジスターにある値を書き込むと、電源が切れます。

DSDT の _PTS メソッドは、 power state が変わったときに呼ばれます。 ちなみに電源を切るのは power state = 5 なのです。

まず、元の _PTS をみると

 

	Method (\_PTS, 1, NotSerialized)
{
	Or (Arg0, 0xF0, Local0)
	Store (Local0, DBG1)
	OSTP ()
	If (LEqual (Arg0, 0x01)) {}
	If (LEqual (Arg0, 0x03)) {}
	If (LEqual (Arg0, 0x05))
	{
		Store (ESMI, Local0)
		And (Local0, 0xFB, Local0)
		Store (Local0, ESMI)
		Store (0x99, SMIP)
	}

	If (LEqual (Arg0, 0x04))
	{
		If (LNot (PICF))
		{
			Sleep (0x64)
		}
	}
}

 

です。

わかっているのは SystemIO の 0x434 に 1バイトの 0 を書き込むと電源が切れるというとこです。(インテルのチップセットのドキュメントを追っていくと出てくるそうですが、ここでは紹介しません。)ただし、アドレスについてはハードウェアごとに違う可能性がありますが、 Gigabyte の場合はだいたい同じのようです。

まず私の DSDT をみると、

 

	OperationRegion (\AGPS, SystemIO, 0x0438, 0x04)
Field (\AGPS, ByteAcc, NoLock, Preserve)
{
	GPSE,   16, 
	GPSS,   16
}

OperationRegion (\GPCN, SystemIO, 0x0442, 0x01)
Field (\GPCN, ByteAcc, NoLock, Preserve)
{
		,   1, 
	SWGC,   1, 
			Offset (0x01)
}

 

こんな感じで、 0x434 に名前がついていません。 名前を付けます。 面倒なのでまとめて

 

	OperationRegion (PMRS, SystemIO, 0x0430, 0x13)
Field (PMRS, ByteAcc, NoLock, Preserve)
{
		,   4, 
	SLPE,   1, 
			Offset (0x08), 
	GPSE,   16, 
	GPSS,   16, 
			Offset (0x12), 
		,   1, 
	SWGC,   1
}

 

これで 0x0434 の1バイトに SLPE という名前がつきます。

 

_PTS に戻って、 power state 5 をもらった時に、 SLPE に書き込みます。

 

	Method (_PTS, 1, NotSerialized)
{
	Or (Arg0, 0xF0, Local0)
	Store (Local0, DBG1)
	OSTP ()
	If (LEqual (Arg0, One)) {}
	If (LEqual (Arg0, 0x03)) {}
	If (LEqual (Arg0, 0x05))
	{
		Store (ESMI, Local0)
		And (Local0, 0xFB, Local0)
		Store (Local0, ESMI)
		Store (0x99, SMIP)

		/* Power off */
		Store (Zero, SLPE)
		Sleep (0x10)
	}

	If (LEqual (Arg0, 0x04))
	{
		If (LNot (PICF))
		{
			Sleep (0x64)
		}
	}
}

 

Store (Zero, SLPE)

Sleep (0x10)

の2行を If (LEqual (Arg0, 0x05)) ---> power state == 5 に足します。

変更した DSDT.dsl をコンパイルしてできた DSDT.aml を /Extra に移します。

 

電源オフ、できあがり!

 

-- TG

Share this post


Link to post
Share on other sites
Advertisement

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.



×