小華的部落格: SCI Check List

搜尋此網誌

網頁

星期三, 10月 10, 2007

SCI Check List

前陣子新板子的SCI不能work ,在Debug之餘,剛好做做筆記。

【檢查項目】

-------------------------------
1. Registers (先得到GPIO & PMBase,檢查SCI 是否繞到IRQ9,GPI是否組態成SCI)
-------------------------------
GPIOBASE—GPIO Base Address Register (LPC I/F —D31:F0)Offset Address: 48h–4Bh
PMBASE—ACPI Base Address Register (LPC I/F—D31:F0) Offset Address: 40h–43h

ACPI_CNTL—ACPI Control Register (LPC I/F — D31:F0) Offset Address: 44h
GPIO_ROUT—GPIO Routing Control Register(PM—D31:F0)Offset Address: B8h – BBh

-------------------------------
2. GPIOBase Registers (先確認是Native還是GPIO,然後設定成GPI還是GPO,需不需要Low active)
-------------------------------

GPIO_USE_SEL—GPIO Use Select Register [31:0]Offset Address: GPIOBASE + 00h
GP_IO_SEL—GPIO Input/Output Select Register [31:0] Offset Address: GPIOBASE +04h
GPI_INV—GPIO Signal Invert Register [31:0] Offset Address: GPIOBASE +2Ch

-------------------------------
3.PMBase Registers (SCI總開關有沒有開,OS有沒有設定Enable bit)
-------------------------------
PM1_CNT—Power Management 1 Control I/O Address: PMBASE + 04h
GPE0_EN—General Purpose Event 0 Enables Register I/O Address: PMBASE + 28h

-------------------------------
4.ASL Code (OS依照EC.ASL 內的_GPE來設定GPE0_EN bit)
-------------------------------

(a)EC.ASL 內的Name(_GPE,0xNN)
(b)GPE.ASL 內的Method(_Lxx) 先移除,避免不必要的誤會
(c)PCIIRQ.ASL 內的_PRS(_CRS不用改),把IRQ9 保留下來,以免跟別人共享造成SCI反應過慢
(d)_REG 或是_INI 內檢查一下是否有其他ASL Code會造成系統當機...etc因素存在
(e)檢查FACP Table中的SCI_INT欄位是否與ICH9 Registers內填的值一樣(IRQ9)
(f)檢查MADT Table中的Interrupt override field內的IRQ設定是否有對SCI_INT做覆蓋,且設定是否正確? (微軟Spec中提到APIC也使用SCI_INT,但是如果有MADT時,會以Interrupt override設定來覆蓋SCI_INT設定,一般都是設定成IRQ9,所以有沒有覆蓋都無所謂,但不一樣的時候會以MADT Table為主。)

-------------------------------
5. Debug
-------------------------------
a) 利用SE.EXE 工具在Windows下觀察GPE0_STS—General Purpose Event 0 Status Register
I/O Address: PMBASE + 20h 是否有變化,當有SCI event時,對應的bit=1,但是一般速度很快所以不易觀察有沒有SCI event,如果有看到變化則代表SCI 應該是正常的。

b) 利用EC BIOS提供的工具在Windows下讀取EC RAM/EC Cmd Data Port,一般EC 如果有進入ACPI Mode or 拉SCI pin之後,會把一些訊息留在EC RAM,例如某某bit=1=ACPI Mode Enable,或是EC Data Port有Qxx Number,而這些資訊可以問EC BIOS工程師,另外Qxx Number則可透過標準ACPI 66 cmd來得到。

-------------------------------
6.ACPI-defined port 66 commands
-------------------------------
0x80 Read EC (write 0x80 to port 66, write address byte to port 62, read data byte from port 62)
0x81 Write EC (write 0x81 to port 66, write address byte to port 62, write data byte to port 62)
0x82 Burst Enable (write 0x82 to port 66, read data byte from port 62 - the data byte is "burst ACK", value 0x90)
0x83 Burst Disable (write 0x83 to port 66, wait for port66.IBF=0)
0x84 Query EC (i.e. read SCI event queue) (write 0x84 to port 66, read data byte from port 62). When the data byte is 0, it means that the SCI event queue is empty.


如果EC有拉SCI pin,則利用自己撰寫的工具透過Port 66 cmd 0x84 讀取的時候,應該會讀取到0,因為如果SCI有發送且OS有收到,則OS會自己透過這個cmd把Qxx Number讀走,讀走後我們應該讀取不到值。

-------------------------------
6. 示波器(oscilloscope)
-------------------------------
在檢查所有暫存器設定與ASL Code設定後,在一切正常的情況下用SE.EXE 去觀察GPE0_STS 變化,但是一直沒有變化,所以懷疑OS沒收到SCI 或是EC 沒進入ACPI Mode,接著與EC BIOS溝通後,使用EC BIOS撰寫的wKX 工具去讀取EC RAM 的某個bit 來確定EC是否進入ACPI Mode,檢查後確認EC已經在ACPI Mode;

"wKx P80 Q43 J" <--送80 cmd到Port 66,讀取EC RAM Offset 43的位址的值,然後利用J參數顯示

接著利用wKx工具讀取Qxx Number "wKx P84",在EC 發送SCI訊號後(目前是利用LID變化或是AC/DC變化來使EC發出SCI訊號)讀取Qxx Number,結果發現還是可以讀取到Qxx Number,所以代表OS沒有收到SCI訊號。

在綜合上述實驗,決定請HW在EC 端與ICH9 端各拉一條線出來檢查訊號,因此利用示波器去觀察EC是否有拉SCI訊號,在觀察兩端訊號後發現,EC並沒有正確的把SCI訊號拉Low (Low Active),所以EC BIOS會檢查哪裡出現問題。

3 則留言:

匿名 提到...

Great Site. Was added to mybookmarks. Greetings From USA.

匿名 提到...

這文章不賴,有否如何從EC發SCI event通知BIOS去讓CPU throtting的介紹

匿名 提到...

簡潔將重點列出,贊啦