qdk0901 发表于 2009-6-11 20:37:24

我也想知道答案,能在定时器里面把 程序计数器 PC 定时的发出来吗?
看看是到哪里死掉的。:lol

zhanghmjm 发表于 2009-6-11 22:45:28

找到死机的原理了

感谢版主的回答,
今天我发现我的EC死的原因了,主要原因就在于我们的触摸板!只要你在重启的时候按几下触摸板,那我们的EC就像是死掉似的。
我们在操作系统下用SE在64口下d4 .a7是发现在发d4的时候触摸板的数据线就被拉低了,而在发a7数据线又被拉高了。而且现在EC就死了。当发a8时又好了。现在我不知道在重启的时候是我们EC都会接到什么命令。还有这些命令是OS发的还是BIOS发的。现在感觉自己越来越糊涂了,还请版主指教!谢谢了

peterhu 发表于 2009-6-12 09:52:51

如果像你描述的状况,那么EC就没有死(还可以收CMD).在我们的code中A7,A8是disable touchpad,enable touchpad的命令
D4通常也会用作disable touchpad。disable touchpad有几种做法,有些会直接disable ps2 port clock。你可以check
这部分命令的处理的code有没有缺陷。另外上述cmd的处理过程你完全可以追出来,不要偷懒!附上reboot的log信息供你参考分析
其中I表示cmd,D表示data;如IFE表示FE送给64h,D65表示65送给60h。

VF3,C,RFA,OFA,V20,O,C,RFA,OFA,O,
e83,
IFE,
e23,oFA,
ID1,DDF,LPC RST
Swrong LPC RST
LPC_Reset_Flag=64

ID1,DDF,
IAA,O55,V65,O,C,K10,RFE,OFE,K08,O,
ID1,DDF,
I90,VED,C,RFA,OFA,V01,C,RFA,
ID1,DDF,O,OFA,O,
e2A,>IDLE
oFA,<
e00,
IAA,O55,O,
IAD,
ID4,VFF,C,RFA,OFA,O,RAA,R00,OAA,O,O00,
I60,O,D65,
I60,D6D,VF5,C,RFA,OFA,K20,
IAD,
IAE,O,VF5,C,RFA,OFA,K20,
IAD,
IAE,O,
IAD,VFF,C,RFA,OFA,RAA,OAA,K20,O,
I60,D65,VED,C,RFA,OFA,V00,O,C,RFA,OFA,
IAE,O,
e91,d2F,d00,
e10,d83,d2F,P3_K#
P3_K#

e23,oFA,
I90,VED,C,RFA,OFA,
IAD,
IAD,O,
IAE,V03,C,RFA,OFA,
IAD,
IAD,O,
IAE,
I90,VED,C,RFA,OFA,
IAD,
IAD,O,
IAE,V05,C,RFA,OFA,
IAD,
IAD,O,
IAE,O,
e90,d2E,o00,
e91,d2F,d00,P3_K#
P3_K#

IAD,VF3,C,RFA,OFA,
IAD,
IAD,O,
IAE,VF3,C,RFA,OFA,
IAD,
IAD,O,
IAE,V20,C,K10,RFE,OFE,K08,
IAD,
IAD,O,
IAE,V20,C,K10,RFE,OFE,K08,
IAD,
IAD,O,
IAE,V20,C,K10,RFE,OFE,K08,
IAD,
IAD,O,
IAE,
IAE,VF4,C,RFA,OFA,
IAD,
IAD,O,
IAE,VF4,C,RFA,OFA,
IAD,
IAD,O,
IAE,VF2,C,RFA,RAB,R41,OFA,
IAD,
IAE,O,OAB,
IAD,
IAE,O,O41,
IAD,
IAE,O,VF2,C,RFA,RAB,R41,OFA,
IAD,
IAD,O,OAB,
IAE,O,O41,
IAD,
IAD,O,
IAE,VF2,C,RFA,RAB,R41,OFA,
IAD,
IAD,O,OAB,
IAE,O,O41,
IAD,
IAD,O,
IAE,
I90,VED,C,RFA,OFA,
IAD,
IAD,O,
IAE,V00,C,RFA,OFA,
IAD,
IAD,O,
IAE,
ID1,DDD,
ID1,DDF,
ID1,DDF,
e22,oFA,
e83,
e83,
e83,
e83,
e83,
e83,
e83,
e83,
e83,
IAD,
IA7,
IAE,O,
IA8,
I60,D44,
IAD,
IA7,
IAE,O,
IA8,VFF,C,RFA,OFA,RAA,OAA,
IAD,O,K20,
IA7,
IAE,O,
IA8,
I60,D04,
IAD,
IA7,
IAE,O,
IA8,VF3,C,RFA,OFA,V00,O,C,RFA,OFA,VED,O,C,RFA,OFA,V00,O,C,RFA,OFA,
IAD,O,
IA7,
IAE,O,
IA8,
I60,D44,
IAD,
IA7,
IAE,O,
IA8,
ID4,VFF,C,RFA,OFA,O,RAA,R00,OAA,O,O00,VED,O,C,RFA,OFA,V00,O,C,RFA,OFA,
IAE,O,
IA8,
IAD,
IA7,
IAE,O,
IA8,
I60,D47,
IAD,
IA7,
IAE,O,
IA8,
ID4,VFF,
e83,C,RFA,OFA,
e83,O,RAA,R00,OAA,O,O00,
ID4,VF2,O,C,RFA,R00,OFA,O,O00,
ID4,VE8,O,C,RFA,OFA,
ID4,V00,O,C,RFA,OFA,
ID4,VE6,O,C,RFA,OFA,
ID4,VE6,O,C,RFA,OFA,
ID4,VE6,O,C,RFA,OFA,
ID4,VE9,O,C,RFA,R00,R00,R64,OFA,O,O00,O,O00,O,O64,
ID4,VE8,O,C,RFA,OFA,
ID4,V03,O,C,RFA,OFA,
ID4,VF3,O,C,RFA,OFA,
ID4,VC8,O,C,RFA,OFA,
ID4,VF3,O,C,RFA,OFA,
ID4,V64,O,C,RFA,OFA,
ID4,VF3,O,C,RFA,OFA,
ID4,V50,O,C,RFA,OFA,
ID4,VF2,O,C,RFA,R03,OFA,O,O03,
ID4,VF3,O,C,RFA,OFA,
ID4,VC8,O,C,RFA,OFA,
ID4,VF3,O,C,RFA,OFA,
ID4,VC8,O,C,RFA,OFA,
ID4,VF3,O,C,RFA,OFA,
ID4,V50,O,C,RFA,OFA,
ID4,VF2,O,C,RFA,R03,OFA,O,O03,
ID4,VF3,O,C,RFA,OFA,
ID4,V64,O,C,RFA,OFA,
ID4,VE8,O,C,RFA,OFA,
ID4,V03,O,C,RFA,OFA,
ID4,VF4,O,C,RFA,OFA,O,
e83,
e83,
e83,
e83,
e83,
e83,
e83,
e83,
e83,
e83,00,C8,2E,
e83,00,C8,2E,
e83,00,C8,2E,
e83,00,C8,2E,
e83,00,C8,64,VF3,C,RFA,OFA,V20,O,C,RFA,OFA,O,VF3,C,RFA,OFA,V20,O,C,RFA,OFA,O,
e83,


[ 本帖最后由 peterhu 于 2009-6-12 15:08 编辑 ]

zhanghmjm 发表于 2009-6-12 22:21:11

感谢

谢谢您的答复
   今天我看了一下,我们的A7命令就是拉低PS2的clock,我想结合你的资料仔细了解一下,EC是如何和OS通信的。。
      我现在对EC和其他设备的通信的理解如下,如有不对您给指导一下!
      前提是我还没有仔细看过ACPI,因为这几天手头的事比较多。
      EC就是个微控制器,在电脑中主要是起到控制一些其他IC的功能,比如风扇,电池,上电时序等。我们利用LPC和南桥通信完成一些相关的功能实现。比如通过60.64和62,66这写端口实现EC和上层的通信(包括OS比如这次遇到的问题,就表明OS在进行重启时它会本身相关服务结束,后在空过64口给我们EC发命令,我们就会关掉或开启相关的东西),好像EC要是想主动的想和上层进行通信,就只能利用SCI和SMI来实现!
BIOS我的理解就是在我EC上完电后CPU开始工作就会他的代码!感觉BIOS的功能就是,开机时自检,并设置了一些相关设备的寄存器的值,是这些设备能过按照我们要求进行工作。呵呵!毕竟我不是做BIOS的只能理解到这了。我是刚做EC没有多长时间的,如有说的不对,请您一定要指出啊。我一有时间就会在看看ACPI的听说这个很重要。我英文不是很如果有什么好的学习方法,还请您赐教!

qdk0901 发表于 2009-6-12 23:54:38

1、看ACPI BIOS中的定义。
Device(EC0) {
Name(_HID, EISAID("PNP0C09"))
......
}
PNP0C09是ACPI Embedded Controller的Hardware ID,ACPI.sys在解析ACPI BIOS(也就是ASL Code)时,看见是PNP0C09,
就会为它创建一个特别的设备对象(Device Object),以便做一些特殊的处理(处理Q事件等等)
2、   
Name(_CRS,ResourceTemplate(){         
      IO(Decode16, 0x62, 0x62, 0, 1)        //通过这里提供的资源,OS知道如何去发送EC Command给EC,特别是命令0x80~0x84
            IO(Decode16, 0x66, 0x66, 0, 1)
      })
3、接着就是
Name(_GPE, 23)//GPIO7        16+7//可以产看原理图,EC的有个拉了根线连到南桥的GPIO7
通过这个声明,OS知道EC和哪个GPE关联起来
而且OS在执行 Build Up GPE_BLK的时候,会把GPE_EN寄存器的相应位置位,以便该位对应的SCI中断能传到CPU来
EC需要OS关注一下它的时候,就拉南桥上的GPIO7,产生SCI中断。
而且 GPE_STS寄存器中的相应位被置位,以便OS知道SCI的来源。
3、OK,看看linux是如何处理SCI中断的
acpi_ev_sci_xrupt_handler==>acpi_ev_gpe_detect==> acpi_ev_gpe_dispatch==> acpi_os_execute
acpi_ec_gpe_handler==> acpi_ec_gpe_query(处理Q事件)==> acpi_ec_query(直接与EC通信查询事件ID,发送0x84查询命令)
4、EC接到0x84查询命令之后,就把Q事件号传给OS
OS的ACPI驱动当然就是去Evaluate相应的Q Method了

zhanghmjm 发表于 2009-6-13 10:49:19

高手还是很多啊!感谢您的回答!
    主要是我们现在很难看到BIOS的代码,其实代码我到时有就是没有看AMI代码的环境!您写的这些代码应该是BIOS代码吧!是不是可以这么理解,BIOS会提交一个ACPI的表给OS。这个表有我们EC的设备号和通过什么端口进行通信对不对,还有就是如何区分那个SCI是我们EC发的,这一切的动作完全由BIOS设置并给OS。是不是可以这么理解请指教

qdk0901 发表于 2009-6-13 13:39:41

Name(_GPE, 23)//GPIO7    在这里区分
你看看南桥datasheet里面GPE0_STS、GPE0_EN的描述,结合原理图,就明白是怎么回事了
有代码就好了,用source insight或者slick edit看代码比ami自带的编辑器好用的多。

peterhu 发表于 2009-6-13 19:21:37

也可以参考"我所知道的EC====>KBSMI&KBSCI"。
qdk0901linux acpi driver你一定看过咯,之前在pediy.com看过一篇关于intelppm
bug 分析的文章是你写的吧?非常精彩!

qdk0901 发表于 2009-6-14 09:58:07

:) 见笑了。
版主在CSDN上的系列文章小弟都看过了,很受启发。

dingchao0205 发表于 2009-7-3 16:07:30

分析的很好

分析的很透彻,学习了

dingchao0205 发表于 2010-4-7 10:31:29

好文章,收益不少,peter:victory:
页: 1 [2]
查看完整版本: [原创]AC In/Out OS Slow Response