其中的数据结构有,这些变量都定义在EC RAM
XBYTE SCI_Event_In_Index; //该变量表示 当前已经入队 SCI_Event_Buffer[]的数据量
XBYTE SCI_Event_Out_Index; //该变量表示 HOST已经读取了 SCI_Event_Buffer[]中的数据量 如果已经入队超过一轮还未来得及读取则会出错
XBYTE SCI_Event_Buffer[]; //要发送给HOST的堆栈
XBYTE PD_SCI_Event_In_Index; //该变量表示 当前已经入队 PD_SCI_Event_Buffer[]的数据量 这些数据量暂时挂起等待压入 SCI_Event_Buffer[]后通知bios
XBYTE PD_SCI_Event_Out_Index; //已经出队 PD_SCI_Event_Buffer[]的数据量 如果已经入队超过一轮还未来得及出队则会出错
XBYTE PD_SCI_Event_Buffer[]; //挂起的数据的队列
XBYTE OEM_ACPI_Gen_Int(); //对void ACPI_Gen_Int(BYTE Qevent)的封装 用于通过espi或者IO发送sci
主要宏
#define EVENT_BUFFER_SIZE 9
#define PENDING_BUFFER 8
#define SCIMode_Normal 0x00 //该模式表示调用ECQEvent函数要发起Qevent时 有pending的则继续pending本次Qevent
//直到在此Qevent之前的Qevent已经发起 无挂起则发起本次Qevent
#define SCIMode_Pending 0x01 //该模式表示本次发送的Qevent 为之前挂起的 还未来得及发送的Qevent
#define SCIMode_Force 0x02 //该模式表示直接发起本次Qevent 而不考虑是否还有正在挂起的Qevent 或者HOST有事件需要EC处理
#define SCIMode_ACPI_SMBus 0x03 //
qevent的发送主要有以下三个函数;
void ECQEvent(BYTE sci_number, BYTE sci_mode); //1:主要检查支不支持ACPI 不支持则return;
//2:如果有的Qevent 正在挂起 挂起本次Qevent 并return;
//3:在非SCIMode_Force模式下如果HOST的数据还没有处理 则先挂起本次Qevent
//4:在无其它情况时直接发起Qevent
void PendingECQEvent(BYTE sci_number); //挂起一个Qevent
void Get_PendingECQEvent(void); //如果有挂起的Qevent 则轮询发起Qevent
当发送了Qevent后等待HOST从66Port发送84command 接收到84command后把SCI_Event_Buffer[] 的数据POP
相关函数
void Hook_66Port(BYTE PM1Cmd) //判断HOST命令类型
void OEM_ACPI_Cmd_84(void) //84命令处理
void SendFromAcpi(BYTE ecdata) //写数据到寄存器
void ACPI_Gen_Int(BYTE Qevent) //发起SCI通知HOST读取数据