EC修煉之道—ECSCI
ECSCI是EC上的一個請求系統中斷的PIN。電池資訊的上報,溫度上報,LID狀態上報,亮度調節請求以及切屏等功能都需要此中斷來通知作業系統執行。既然是中斷,就必須有中斷號,ECSCI和其它一些DEVICE共用一個SCI中斷號,由BIOS來指定,並通過ACPI報給作業系統。
1 SCI中斷
在瞭解ECSCI之前,我們先了解一下整個SCI中斷的知識。要不然,會造成一葉障目,不見泰山。
SCI的全稱是SystemControl Interrupt,它是作業系統下的一箇中斷,需要ACPI驅動的支援。很多剛接觸主機板開發的工程師經常弄不清它和SMI的區別。其實只要記準一條,SCI只在支援ACPI的OS下起作用(DOS系統就不支援)。SMI對OS來講是透明的,不管OS在與不在,只要BIOS跑完,它都起作用。
那麼除了ECSCI外,還有哪些可以產生SCI呢?可以翻閱一下INTEL南橋資料手冊,在PowerManagement register有兩個暫存器,分別是PM1_EN和GPE0_EN。看來產生SCI的中斷的裝置還真不少,但ECBIOS工程師重點關注的只有ECSCI只一個。
ECSCI和其它裝置共亨一箇中斷,如果ECSCI中斷產生,作業系統怎麼知道是EC請求的,而不是其它裝置請求的呢?首先,BIOS宣告的DEVICE EC中會將EC所連線的SGPIO報給作業系統。作業系統收到SCI中斷後,會讀FADT表中的GPE0_BLK和GPE1_BLK,然後將置1的位和EC DEVICE的GPE進行比較,如果相同就會通過0x84命令讀取EC請求的QEVENT號。
有EC驅動的Linux作業系統下,EC驅動註冊中斷函式時,首先會解析AML獲得EC Device的GPE,然後將其作為其中一個引數共同賦給GPE Block的event_info[]陣列的一個元素。
acpi_install_gpe_handler(NULL,ec->gpe,
ACPI_GPE_EDGE_TRIGGERED,
&acpi_ec_gpe_handler, ec);
2 SCI訊號
這是我在一家EC晶片DataSheet裡截的,不知道違規不?如果違規,我先宣告我光腳的,沒啥錢(^_^)。
由圖可以看出,SCI訊號是一個至少要大於5ns的低脈衝。一般設定的值都是20ns左右,足以保證時間了。盡信書不如無書,此圖上面的OBF那個圖直接忽略掉吧。我原先的一個公司的同事可能就因為相信了這點,寫的程式碼把ACPI驅動拖得老慢,還把WINDOWS搞得一大堆Warning。我後來接手的時候又費勁重寫了這部分程式碼,才把功能調正常。
3 EC Status暫存器
其中SCI_EVT是代表EC查詢事件的標誌,當EC用SCI通知OS有Event發生後,作業系統會讀取QEVENT號,讀之前會先CHECK這個標誌位。
4 ECSCI觸發時機
除了以上這些觸發時機外,EC用SCI通知作業系統有事件發生時,也會產生SCI中斷,並且會置SCI_EVT標誌位。當作業系統成功使用0x84命令讀取QEVENT號時,除了產生SCI中斷,也會清除SCI_EVT標誌位。