最近在用rust为我的TS453B mini写一个风扇控制程序,需要和EC(Embedded Controller)的交互。但是没有找到太多关于EC的资料。

IO端口

TS453B mini使用的是以下端口:

  • 0x6c 状态/命令端口
  • 0x68 数据端口

协议解读

点击这里查看协议全文。

Idle状态开始总共有8个状态转换。这里简化为4条。

  • 首先EC处于空闲状态,即IBF=0,IOF=0
  • 第一步,检测0x6cIBF=0时(此时最好OBF=0,否则会取消之前的命令和状态),向0x6c发送命令。这里后续可以直接转入空闲状态。
  • 第二步,检测0x6c,直至IBF,OBF=0,1的时候,可以从0x68读取数据;如果读取后OBF=1,显然还需要继续读取。
  • 第三步,检测0x6c,直至IBF=0的时候(此时OBF=0),可以向0x68写数据。

总结:可以在空闲状态下安全的向0x6c发送命令或者向0x68写数据(触发IBF=1)。如果IBF=1,说明EC尚未处理发送的命令或数据。

另外可以看到如果不加锁的话,多线程读写会有冲突的。

参考

  • http://wiki.laptop.org/go/Revised_EC_Port_6C_Command_Protocol
  • http://wiki.laptop.org/go/Ec_specification#Old_Port_6c_Command_Protocol
  • https://blog.csdn.net/zhao_longwei/article/details/50454779