捕捉EC产生的QEVENT

Qevent就是一个SCI,该信号是从EC的ECSCI pin发出来的。当EC产生一个SCI后,OS是怎么捕捉到的呢?

这在ACPI SPEC中ACPI Embedded Controller Interface 章节有详细的说明。

大致的意思是:

EC端在准备发送SCI的时候,首先会把SCI_EVT这个bit置一,等待Host端发送0x84查询命令。当收到查询命令后,EC才会将QEvent number发送出去。

假如Host要去捕捉这个QEvent要该怎么做呢?

 1.使用轮询的方式,不断地读取EC Status port(0x66端口)

 2.检查读取值的bit5是否为1,若为一,表示EC有SCI产生,此时需要往EC的command port(0x66)发送0x84查询指令 

 3.从DATA port(0x62)读取QEvent number的值

  

 代码如下:

//
void Get_Qevent()
{
    UINT8 q_event_number = 0;
    
    while(1)
    {
        /*** 
            EC genetate SCI step:
                1.Set SCI_EVT bit to 1
                2.Wait 0x84 query command
                3.After receiving 0x84, send QEvent.
         ***/
         
        /* Query 0x66 port if a SCI will be generated */
        UINT8 Ec_Sc_Data = IoRead8(EC_C_PORT);
        
        Print(L"0x66 port data = 0x%2X\n\r", Ec_Sc_Data);
        /* EC Ready to send SCI */
        if(Ec_Sc_Data & EC_S_SCI_EVT)
        {
            /* Send 0x84 query command */
            OemSendCmdToEcOrKbc (EC_C_PORT, EC_C_GET_QEVENT, FALSE);
            /* Read QEvent number from 0x62 port */
            q_event_number = OemGetDataFromEcOrKbc (EC_C_PORT, FALSE);
            
            break;
        }
        /* Query time 500ms */
        gBS->Stall(500);
    }
    Print(L"QEvent Number = 0x%2X\n\r", q_event_number);
}

版权声明:
作者:bin
链接:https://ay123.net/mystudy/670/
来源:爱影博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>