Jump to content

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


TennisGeek
 Share

1 post in this topic

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

  • Like 1
Link to comment
Share on other sites

 Share

×
×
  • Create New...