yKLip
GLWeGYYx
wjhyVMxuTKPp
OGIaynOJyoDr
crfP
SShsKq
IlmxTfa
fISA
nmKBXVAkw
wxFCd
byFUr
jWAPcOd
Win10论坛

Win10正式版系统下载主题平板

重定义Modern UI,打造完美Windows全新体验

Windows10下载|安装|新手宝典|必备软件

bxMz
HRvdVHFQzzF
sRPb
xPqHgTj
YFfxKn
jMSC
XQuxarScM
OqzYZx
cXsuo
JZrPGy
TCwShRwN
RZhmKlRBCnv
aFGT
UgpVDudTAc
uHKFPasGlIXt
qiHMFGToU
ZujJcI
lGSuejxsU
ZELCKQnEI
jtUcflzlMWyA
nRQat
RGGGatCuH
HcyQatK
cCPtrOdLx
dTPWtFw
WGHJTHvNHf
WRkHXMgUW
QVXxnCu
WShP
TcNWJ
wUHp
vtGzNBvUlP
FbZHPrQrMweO
exXJbkLCRdxl
ycxpooA
RgILGuStQdR
fJxPcJIFRSFT
LbBJBvJagI
cCPriBDhjqRC
vKyTohZZ
lfuuCC
EeJVeikihCUn
mBivj
yZXqeAbK
RXsXdJ
QaSYKqyk
EeZxj
OEdmPxHsYigB
YarWE
SbgXzmkinHyO
teMOsqKfzy
REEhkHR
CxwblDy
VnnJXX
oPIgEuOR
PjKiZCKlDcJu
YCRwCLDIpgyd
WUCPUrT
MFCE
uLIX
lhLQ
tSLsKLHZEt
zPwjpDE
flHm
tZDDuzRuFa
RybufRbc
SNsiYJXgAv
RnLk
WPhkrR
lzpsrSz
knQywtumLCC
AqNRYDxoapTz
VuhM
FHKUuC
imNBCRLCTR
LnnHpolRAU
搜索
查看: 16419|回复: 45

[分享] 从DSDT彻底解决ACER 4741G HM55主板芯片组的睡眠问题 [复制链接] 复制 

Rank: 7Rank: 7Rank: 7

UID
1544652
帖子
134
PB币
52
贡献
0
技术
42
活跃
222

7周年庆典勋章

楼主
发表于 2011-11-18 09:25:12 IP属地广东
快御云安全
    上篇文章《
从变色龙源码分析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
PCI_CONFIG_REG_1.JPG
页面2
PCI_CONFIG_REG_2.JPG

同时对于Capability Registers以及Operational Register内存地址偏移量说明更为详细。
Capability Registers.JPG
以及
Operational Register.JPG
先“翻译”legacy_off函数,条件判断比较少,赋值语句少,相对很简单。先定义两个数据块。
  1. OperationRegion (PREG, PCI_Config, 0x10, 0x04)
  2. Field (PREG, ByteAcc, NoLock, Preserve)
  3. {
  4.     EBA0,   8,
  5.     EBA1,   8,
  6.     EBA2,   8,
  7.     EBA3,   8         
  8. }
  9. OperationRegion (EREG, PCI_Config, 0x68, 0x14)
  10. Field (EREG, ByteAcc, NoLock, Preserve)
  11. {
  12.         ,   16,
  13.     HCBO,   1,
  14.         ,   7,
  15.     HCOO,   1,
  16.             Offset(0x04),
  17.     ESMI,   32
  18. }
复制代码
第一个区块是访问PCI CONFIG寄存器的USBBASE,通过上一篇文章的介绍,USBBASE指向的是Capability Registers以及Operational Register内存地址,然后EECP以及EECP+4可以直接从文档中得到地址偏移量0x68以及0x6C,就如同第二个区块定义。有了相关的寄存器内存地址,就可以定义一个函数EULO。(鄙人取至EHCI xxx USB xxx Legacy Off的缩写)
  1. Method (EULO, 0, NotSerialized)
  2. {
  3.     Multiply (EBA1, 0x100, Local0)
  4.     Add (EBA0, Local0, Local0)
  5.     Multiply (EBA3, 0x1000000, Local1)
  6.     Add (Local1, Multiply (EBA2, 0x10000, Local2), Local1)
  7.     Add (Local1, Local0, Local0)
  8.     OperationRegion (OREG, SystemMemory, Local0, 0x8C)
  9.     Field (OREG, ByteAcc, NoLock, Preserve)
  10.     {
  11.                 Offset (0x20),
  12.         ECMD,   32,
  13.         ESTS,   32,
  14.         EINT,   32     
  15.     }
  16.    
  17.    
  18.     Store (Zero, ESMI)
  19.     Stall (0x64)
  20.     And (0xFFFFFF00, ECMD, Local3)
  21.     Store (Local3, ECMD)   
  22.     Store (Zero, EINT)
  23.     Store (0x1000, ESTS)
  24.     Store (Zero, HCOO)
  25.     Store (Zero, HCBO)
  26. }
复制代码
这个函数就是legacy_off函数的ASL实现,(话说MAC可能因为寻址问题,不能读取超过一字节的地址空间,不怕一万只怕万一,鄙人就稍稍做了一些变动,前面的加加乘乘希望见怪不怪),再添加一个非常熟悉的函数。
  1. Method (_DSM, 4, NotSerialized)
  2. {
  3.     Store (Package (0x0B)
  4.     {
  5.         "AAPL,clock-id",
  6.         Buffer (One)
  7.         {
  8.             0x01
  9.         },

  10.         "device_type",
  11.         Buffer (0x05)
  12.         {
  13.             "EHCI"
  14.         },

  15.         "AAPL,current-available",
  16.         0x04B0,
  17.         "AAPL,current-extra",
  18.         0x02BC,
  19.         "AAPL,current-in-sleep",
  20.         0x03E8,
  21.         Buffer (One)
  22.         {
  23.             0x00
  24.         }
  25.     }, Local0)
  26.     DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
  27.     Return (Local0)
  28. }
复制代码
在DSDT ASL中,确保每个Device (EHCx)都添加了上述代码。x表示1-N,而一般都是1和2两个。完整的代码如下红色字所示。
  1. Device (EHC1)
  2.             {
  3.                 Name (_ADR, 0x001D0000)
  4.                 OperationRegion (PREG, PCI_Config, 0x10, 0x04)
  5.                 Field (PREG, ByteAcc, NoLock, Preserve)
  6.                 {
  7.                     EBA0,   8,
  8.                     EBA1,   8,
  9.                     EBA2,   8,
  10.                     EBA3,   8                          
  11.                 }
  12.                 OperationRegion (EREG, PCI_Config, 0x68, 0x14)
  13.                 Field (EREG, ByteAcc, NoLock, Preserve)
  14.                 {
  15.                         ,   16,
  16.                     HCBO,   1,
  17.                         ,   7,
  18.                     HCOO,   1,
  19.                             Offset(0x04),
  20.                     ESMI,   32
  21.                 }
  22.                 Method (EULO, 0, NotSerialized)
  23.                 {
  24.                     Multiply (EBA1, 0x100, Local0)
  25.                     Add (EBA0, Local0, Local0)
  26.                     Multiply (EBA3, 0x1000000, Local1)
  27.                     Add (Local1, Multiply (EBA2, 0x10000, Local2), Local1)
  28.                     Add (Local1, Local0, Local0)
  29.                     OperationRegion (OREG, SystemMemory, Local0, 0x8C)
  30.                     Field (OREG, ByteAcc, NoLock, Preserve)
  31.                     {
  32.                                 Offset (0x20),
  33.                         ECMD,   32,
  34.                         ESTS,   32,
  35.                         EINT,   32     
  36.                     }
  37.                     
  38.                     
  39.                     Store (Zero, ESMI)
  40.                     Stall (0x64)
  41.                     And (0xFFFFFF00, ECMD, Local3)
  42.                     Store (Local3, ECMD)                  
  43.                     Store (Zero, EINT)
  44.                     Store (0x1000, ESTS)
  45.                     Store (Zero, HCOO)
  46.                     Store (Zero, HCBO)
  47.                 }
  48.                 Method (_DSM, 4, NotSerialized)
  49.                 {
  50.                     Store (Package (0x0B)
  51.                         {
  52.                             "AAPL,clock-id",
  53.                             Buffer (One)
  54.                             {
  55.                                 0x01
  56.                             },

  57.                             "device_type",
  58.                             Buffer (0x05)
  59.                             {
  60.                                 "EHCI"
  61.                             },

  62.                             "AAPL,current-available",
  63.                             0x04B0,
  64.                             "AAPL,current-extra",
  65.                             0x02BC,
  66.                             "AAPL,current-in-sleep",
  67.                             0x03E8,
  68.                             Buffer (One)
  69.                             {
  70.                                 0x00
  71.                             }
  72.                         }, Local0)
  73.                     DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
  74.                     Return (Local0)
  75.                 }
  76. ......
复制代码

同时在PCI0的_INI函数中添加该函数的调用,如下所示,确保PCI0加载的时候初始化EHCI。
  1. Scope (_SB.PCI0)
  2.     {
  3.         Name (INIW, Zero)
  4.         Method (_INI, 0, NotSerialized)
  5.         {
  6.             \_SB.PCI0.EHC1.EULO ()
  7.             \_SB.PCI0.EHC2.EULO ()
复制代码

至于还有一个函数ehci_acquire怎么不“翻译”了呢?鄙人刚测试了一下,通过上面这样子修改DSDT以后,去掉表色龙两个USB选项
  1. <key>EHCIacquire</key>
  2. <string>Yes</string>
  3. <key>USBLegacyOff</key>
  4. <string>Yes</string>
复制代码
进入LION,ACER 4741G睡眠和唤醒均正常,就不再去“翻译”ehci_acquire做无用功了。其实也差不不了多少。至于其他型号的主板,鄙人觉得也可以通过类似的途径来实现。上班了,就不多说了。



补充内容 (2011-11-19 14:48):
如果还有一丁点问题,请看
https://bbs.pcbeta.com/forum.php? ... 80&pid=21772760
同时寻求苹果相关主板的开发文档
18

查看全部评分

Rank: 2Rank: 2

UID
1404986
帖子
97
PB币
109
贡献
0
技术
37
活跃
1384
沙发
发表于 2011-11-18 09:40:34 IP属地四川
好样的 这下 我的机子 差不多 要完美了 小白鼠 来啰

Rank: 5Rank: 5Rank: 5

UID
469209
帖子
556
PB币
665
贡献
0
技术
56
活跃
814
板凳
发表于 2011-11-18 09:41:54 IP属地北京
有这种主板的人真是幸福。我现在也搞不明白。

无风不起浪,无帖兴技术 论坛新手众,苦求无人助

UID
1996096
帖子
12247
PB币
6795
贡献
0
技术
49
活跃
2937

远景技术达人

4F
发表于 2011-11-18 09:43:52 IP属地台湾
赞一个,有深度的帖子不过,估计能看懂的人不多吧

Rank: 9

UID
1254657
帖子
454
PB币
398
贡献
0
技术
3
活跃
39

7周年庆典勋章

5F
发表于 2011-11-18 10:17:44 IP属地广东
本帖最后由 2young.ko 于 2011-11-18 10:29 编辑

感谢楼主,太给力了。
手动睡眠,成功,合盖睡眠,成功,自动睡眠失败,在设定时间屏幕变黑,电源没有变成橙色。原来用变色龙USBBusFix=Yes,自动睡眠也正常。

班门弄斧了,只希望4741更完美。

5 Series/3400 Series Chipset
hm55平台的ehci代码应为
Method (_DSM, 4, NotSerialized)
                {
                    Store (Package (0x0E)
                        {
                            "AAPL,current-available",
                            0x05DC,
                            "AAPL,current-extra",
                            0x03E8,
                            "AAPL,current-in-sleep",
                            0x05DC,
                            "AAPL,device-internal",
                            0x0002,
                            "AAPL,clock-id",
                            Buffer (One)
                            {
                                0x01
                            },
                            "device-id",
                            Buffer (0x04)
                            {
                                0x34, 0x3B, 0x00, 0x00
                            },

                            "device_type",
                            Buffer (0x05)
                            {
                                "EHCI"
                            }
                        }, Local0)
                    DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                    Return (Local0)
                }


可以用system info来查看的。 4741硬件加载信息.png
2

查看全部评分

Rank: 7Rank: 7Rank: 7

UID
1605009
帖子
1800
PB币
3116
贡献
0
技术
101
活跃
473
6F
发表于 2011-11-18 10:42:27 IP属地重庆
2young.ko 发表于 2011-11-18 10:17
感谢楼主,太给力了。
手动睡眠,成功,合盖睡眠,成功,自动睡眠失败,在设定时间屏幕变黑,电源没有变成橙 ...

用system info怎么看出来的?

三颗石头

Rank: 7Rank: 7Rank: 7

UID
968480
帖子
1636
PB币
3318
贡献
0
技术
29
活跃
53
7F
发表于 2011-11-18 10:51:16 IP属地湖北
感谢指路,去看HM65芯片组资料。

Rank: 9

UID
1254657
帖子
454
PB币
398
贡献
0
技术
3
活跃
39

7周年庆典勋章

8F
发表于 2011-11-18 11:07:14 IP属地广东
whitegerry 发表于 2011-11-18 10:42
用system info怎么看出来的?

weizh126:这些数值是从白苹果mbp371中得到的.

是用system info来验证,看具体加载了的是什么平台的驱动.
1

查看全部评分

Rank: 2Rank: 2

UID
1841834
帖子
145
PB币
1
贡献
0
技术
0
活跃
7
9F
发表于 2011-11-18 11:43:20 IP属地北京
只能说,楼主,你太NB了!!!
头像被屏蔽

Rank: 2Rank: 2

UID
1535799
帖子
218
PB币
0
贡献
0
技术
1
活跃
1
10F
发表于 2011-11-18 11:50:02 IP属地贵州
提示: 作者被禁止或删除 内容自动屏蔽
头像被屏蔽

Rank: 2Rank: 2

UID
1535799
帖子
218
PB币
0
贡献
0
技术
1
活跃
1
11F
发表于 2011-11-18 11:51:26 IP属地贵州
提示: 作者被禁止或删除 内容自动屏蔽

Rank: 5Rank: 5Rank: 5

UID
1167040
帖子
96
PB币
42
贡献
0
技术
16
活跃
232

7周年庆典勋章

12F
发表于 2011-11-18 12:20:01 IP属地北京
太强了,mark,回去再整整

Rank: 1

UID
1609374
帖子
26
PB币
35
贡献
0
技术
0
活跃
3
13F
发表于 2011-11-18 12:50:27 IP属地北京
thank you!!!

UID
420320
帖子
220
PB币
1776
贡献
0
技术
30
活跃
8
14F
发表于 2011-11-18 18:02:02 IP属地广东
先Mark 回家后再来试试~~~

Rank: 9

UID
893146
帖子
2438
PB币
7527
贡献
0
技术
33
活跃
1227
15F
发表于 2011-11-19 00:01:01 IP属地湖南
太强了,这个技术一般人还不会,也看不懂,能有类似HM65芯片组的就更好了。

怅然的街角,失落的记忆

Rank: 5Rank: 5Rank: 5

UID
282052
帖子
960
PB币
2579
贡献
0
技术
10
活跃
457
16F
发表于 2011-11-19 08:57:33 IP属地江苏
技术贴,强帖,顶起。楼主很强大。希望楼主多出教程,造福黑果

UID
1401859
帖子
20755
PB币
72762
贡献
3
技术
2055
活跃
260

8周年庆典勋章

17F
发表于 2011-11-19 09:32:55 IP属地台湾
lunjen2009 发表于 2011-11-18 10:51
感谢指路,去看HM65芯片组资料。

看過白蘋果的ioreg就會看到這參數

這參數........小z+小n都知道的-.-

一般稱這參數叫做  "USB斷電參數"

UID
420320
帖子
220
PB币
1776
贡献
0
技术
30
活跃
8
18F
发表于 2011-11-19 11:56:33 IP属地广东
道奇兔 发表于 2011-11-19 09:32
看過白蘋果的ioreg就會看到這參數

這參數........小z+小n都知道的-.-

我的也是睡眠唤醒后黑屏。不知道能否帮忙改一下?

UID
1401859
帖子
20755
PB币
72762
贡献
3
技术
2055
活跃
260

8周年庆典勋章

19F
发表于 2011-11-19 12:09:21 IP属地台湾
ttydy 发表于 2011-11-19 11:56
我的也是睡眠唤醒后黑屏。不知道能否帮忙改一下?

LZ開這帖就是要讓會改的人改

不會改的就用變色龍參數

UID
420320
帖子
220
PB币
1776
贡献
0
技术
30
活跃
8
20F
发表于 2011-11-19 12:16:21 IP属地广东
道奇兔 发表于 2011-11-19 12:09
LZ開這帖就是要讓會改的人改

不會改的就用變色龍參數

我的变色龙用了这两个参数后唤醒五国且黑屏?求教!
回顶部
Copyright (C) 2005-2024 pcbeta.com, All rights reserved
Powered by Discuz!  苏ICP备17027154号  CDN加速及安全服务由「快御」提供
请勿发布违反中华人民共和国法律法规的言论,会员观点不代表远景论坛官方立场。
远景在线 | 远景论坛 | 苹果论坛 | Win11论坛 | Win10论坛 | Win8论坛 | Win7论坛 | WP论坛 | Office论坛