如何用cpp程序读写EC(嵌入式控制器)寄存器

How to read/write EC (embedded controller) register with a cpp program

本文关键字:嵌入式控制器 寄存器 EC 读写 何用 cpp 程序      更新时间:2023-10-16

我正试图编写一个程序,用笔记本电脑EC嵌入式控制器(IT8570E)的PWM驱动背光键盘。

为此,程序需要:-当用户按下Fn+F3/F4以增加/减少亮度时捕捉。-编辑EC寄存器值以修改PWM,从而修改亮度。

问题是:如何在c++脚本中读/写这个EC寄存器?我发现了一个可以做这种事情的程序,所以我想这是可能的(EC-probe.exehttps://github.com/hirschmann/nbfc/wiki)我想知道如何使用cpp。

EC寄存器是否包含在windows寄存器中?

(附言:如果你也知道如何捕捉用户按下组合键的时候,我会感兴趣的!)

注:最初笔记本电脑没有背光键盘,但有这样做的硬件接口。其他类似型号都有背光键盘,但是似乎对Fn-F3/Fn-F4组合做出反应的功能包含在BIOS/EC代码中。因为编辑bios看起来真的很困难,而且有风险,我正在研究写一个程序直接处理背光的可能性。

完整项目描述:https://www.bios-mods.com/forum/Thread-Asus-N71JQ-enable-backlit-keyboard

您可以使用EmbeddedController读取或写入EC寄存器。

#include <iostream>
#include <windows.h>
#include "ec.hpp"
int main()
{
EmbeddedController ec = EmbeddedController();
if (ec.driverFileExist && ec.driverLoaded)
{
ec.writeByte(0x30, 0xAA); // Write 0xAA to register 0x30
BYTE value = ec.readByte(0x30); // Read value of register 0x30
std::cout << std::hex << (INT)value;
ec.close(); // Close the resources
}
}

严格意义上,您无法在纯可移植的标准C++程序中读取寄存器(因为C++规范不知道寄存器)。阅读更多关于C++语言的信息,例如一些C++参考网站,一些C++编程简介,以及C++11的n3337标准。

但是,您可以使用asm语句。它们以特定于实现的方式生成代码。

如果您使用GCC编译器,请阅读其关于将汇编语言与C结合使用的部分(其中大部分也适用于C++)。

如果您关心在Windows(或其他一些常见的操作系统,如Android、MacOSX、Linux)上访问键盘,则需要使用特定于操作系统的原语(不在C++标准范围内)。

对于Windows,请参阅WinAPI文档。

对于Linux,首先阅读其系统调用,例如syscalls(2)。

大多数操作系统都在抽象对硬件的访问。因为你的过程是孤立的。它正在用户模式下运行。

在x86 PC上,请注意SMM、BIOS和UEFI。它可能正在管理这样神奇的亮度键(或与操作系统内核交互)。

EC寄存器是否包含在windows寄存器中?

您可能会将键盘微控制器中的某些硬件处理器寄存器与Windows注册表混淆。尽管语音相似,但它们完全没有关系。

PS。https://github.com/hirschmann/nbfc是免费软件(GPLv3+许可证)。请深入研究它的源代码(可能有特定于操作系统的部分),并研究源代码(一些与Windows相关的代码,如nbfc/Windows/NbfcClient/AppSettings.cs,看起来像C#代码)。