上篇文章《
从变色龙源码分析ACER 4741G HM55主板芯片组的睡眠问题》提到,通过Ownership fix以及usb legacy off可以实现HM55芯片组在LION下的睡眠和唤醒功能,可惜变色龙中的源代码是基于C语言编写的,因此如果要通过DSDT来实现就要把变色龙中相关的C语言函数ehci_acquire,legacy_off“翻译”成ASL函数。而且ASL中对内存地址的访问可不像C语言那么简单的用指针赋值就可以实现,所以要因地制宜,具体问题具体分析,根据主板芯片组的实际情况来“翻译”ehci_acquire和legacy_off才是明智的选择。
首先来看看HM55到底是何方神圣。在INTEL官方网站搜索HM55,可以找到如下信息“
The mobile Intel® HM55 Express Chipset, part of the mobile Intel® 5 Series Chipsets, enables Intel® Anti-Theft Technology and HD video playback.
”可以知道HM55属于mobile Intel 5 Series Chipsets的一部分,紧接着搜索Intel 5 Series Chipsets,可以找到一个有关HM55的详细文档《Intel® 5 Series Chipset and Intel® 3400 Series Chipset Datasheet》。在这个文档中16章节,有着EHCI控制寄存器的所有说明。循例上图。具体到某个型号的芯片组,PCI_CONFIG REGISTERS马上就变得丰富起来。HM55甚至分成了两个页面,两个表格来进行描述。
页面1
页面2
同时对于Capability Registers以及Operational Register内存地址偏移量说明更为详细。
以及
先“翻译”legacy_off函数,条件判断比较少,赋值语句少,相对很简单。先定义两个数据块。
- OperationRegion (PREG, PCI_Config, 0x10, 0x04)
- Field (PREG, ByteAcc, NoLock, Preserve)
- {
- EBA0, 8,
- EBA1, 8,
- EBA2, 8,
- EBA3, 8
- }
- OperationRegion (EREG, PCI_Config, 0x68, 0x14)
- Field (EREG, ByteAcc, NoLock, Preserve)
- {
- , 16,
- HCBO, 1,
- , 7,
- HCOO, 1,
- Offset(0x04),
- ESMI, 32
- }
复制代码 第一个区块是访问PCI CONFIG寄存器的USBBASE,通过上一篇文章的介绍,USBBASE指向的是Capability Registers以及Operational Register内存地址,然后EECP以及EECP+4可以直接从文档中得到地址偏移量0x68以及0x6C,就如同第二个区块定义。有了相关的寄存器内存地址,就可以定义一个函数EULO。(鄙人取至EHCI xxx USB xxx Legacy Off的缩写)
- Method (EULO, 0, NotSerialized)
- {
- Multiply (EBA1, 0x100, Local0)
- Add (EBA0, Local0, Local0)
- Multiply (EBA3, 0x1000000, Local1)
- Add (Local1, Multiply (EBA2, 0x10000, Local2), Local1)
- Add (Local1, Local0, Local0)
- OperationRegion (OREG, SystemMemory, Local0, 0x8C)
- Field (OREG, ByteAcc, NoLock, Preserve)
- {
- Offset (0x20),
- ECMD, 32,
- ESTS, 32,
- EINT, 32
- }
-
-
- Store (Zero, ESMI)
- Stall (0x64)
- And (0xFFFFFF00, ECMD, Local3)
- Store (Local3, ECMD)
- Store (Zero, EINT)
- Store (0x1000, ESTS)
- Store (Zero, HCOO)
- Store (Zero, HCBO)
- }
复制代码 这个函数就是legacy_off函数的ASL实现,(话说MAC可能因为寻址问题,不能读取超过一字节的地址空间,不怕一万只怕万一,鄙人就稍稍做了一些变动,前面的加加乘乘希望见怪不怪),再添加一个非常熟悉的函数。
- Method (_DSM, 4, NotSerialized)
- {
- Store (Package (0x0B)
- {
- "AAPL,clock-id",
- Buffer (One)
- {
- 0x01
- },
- "device_type",
- Buffer (0x05)
- {
- "EHCI"
- },
- "AAPL,current-available",
- 0x04B0,
- "AAPL,current-extra",
- 0x02BC,
- "AAPL,current-in-sleep",
- 0x03E8,
- Buffer (One)
- {
- 0x00
- }
- }, Local0)
- DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
- Return (Local0)
- }
复制代码 在DSDT ASL中,确保每个Device (EHCx)都添加了上述代码。x表示1-N,而一般都是1和2两个。完整的代码如下红色字所示。
- Device (EHC1)
- {
- Name (_ADR, 0x001D0000)
- OperationRegion (PREG, PCI_Config, 0x10, 0x04)
- Field (PREG, ByteAcc, NoLock, Preserve)
- {
- EBA0, 8,
- EBA1, 8,
- EBA2, 8,
- EBA3, 8
- }
- OperationRegion (EREG, PCI_Config, 0x68, 0x14)
- Field (EREG, ByteAcc, NoLock, Preserve)
- {
- , 16,
- HCBO, 1,
- , 7,
- HCOO, 1,
- Offset(0x04),
- ESMI, 32
- }
- Method (EULO, 0, NotSerialized)
- {
- Multiply (EBA1, 0x100, Local0)
- Add (EBA0, Local0, Local0)
- Multiply (EBA3, 0x1000000, Local1)
- Add (Local1, Multiply (EBA2, 0x10000, Local2), Local1)
- Add (Local1, Local0, Local0)
- OperationRegion (OREG, SystemMemory, Local0, 0x8C)
- Field (OREG, ByteAcc, NoLock, Preserve)
- {
- Offset (0x20),
- ECMD, 32,
- ESTS, 32,
- EINT, 32
- }
-
-
- Store (Zero, ESMI)
- Stall (0x64)
- And (0xFFFFFF00, ECMD, Local3)
- Store (Local3, ECMD)
- Store (Zero, EINT)
- Store (0x1000, ESTS)
- Store (Zero, HCOO)
- Store (Zero, HCBO)
- }
- Method (_DSM, 4, NotSerialized)
- {
- Store (Package (0x0B)
- {
- "AAPL,clock-id",
- Buffer (One)
- {
- 0x01
- },
- "device_type",
- Buffer (0x05)
- {
- "EHCI"
- },
- "AAPL,current-available",
- 0x04B0,
- "AAPL,current-extra",
- 0x02BC,
- "AAPL,current-in-sleep",
- 0x03E8,
- Buffer (One)
- {
- 0x00
- }
- }, Local0)
- DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
- Return (Local0)
- }
- ......
复制代码
同时在PCI0的_INI函数中添加该函数的调用,如下所示,确保PCI0加载的时候初始化EHCI。
- Scope (_SB.PCI0)
- {
- Name (INIW, Zero)
- Method (_INI, 0, NotSerialized)
- {
- \_SB.PCI0.EHC1.EULO ()
- \_SB.PCI0.EHC2.EULO ()
复制代码
至于还有一个函数ehci_acquire怎么不“翻译”了呢?鄙人刚测试了一下,通过上面这样子修改DSDT以后,去掉表色龙两个USB选项
- <key>EHCIacquire</key>
- <string>Yes</string>
- <key>USBLegacyOff</key>
- <string>Yes</string>
复制代码 进入LION,ACER 4741G睡眠和唤醒均正常,就不再去“翻译”ehci_acquire做无用功了。其实也差不不了多少。至于其他型号的主板,鄙人觉得也可以通过类似的途径来实现。上班了,就不多说了。
补充内容 (2011-11-19 14:48):
如果还有一丁点问题,请看
https://bbs.pcbeta.com/forum.php? ... 80&pid=21772760
同时寻求苹果相关主板的开发文档 |