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

时间:2019-01-25 14:28:47

标签: c++ driver hardware bios

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

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

问题是:如何在c ++脚本中读取/写入此EC寄存器?我找到了可以执行此操作的程序,所以我想它是有可能的({-{3}}中的EC-probe.exe),并且想知道如何使用cpp。

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

(PS:如果您还知道当用户按下组合键时该如何捕捉,我会很感兴趣!)

注意:最初,笔记本电脑没有背光键盘,但是具有硬件接口。其他类似的型号都具有背光键盘,但是似乎对Fn-F3 / Fn-F4组合作出反应的功能包含在BIOS / EC代码中。因为编辑BIOS看起来确实非常困难且充满风险,所以我正在研究是否有可能编写直接处理背光的程序。

完整的项目描述:https://github.com/hirschmann/nbfc/wiki

2 个答案:

答案 0 :(得分:0)

严格来说,您无法在纯便携式标准C ++程序中读取寄存器(因为C ++规范不了解寄存器)。阅读有关C ++语言的更多信息,例如一些C++ reference网站,一些Introduction to C++ programming及其针对C ++ 11的n3337标准。

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

如果使用GCC编译器,请阅读其在using assembly language with C上的部分(大部分也适用于C ++)。

如果您希望在Windows(或其他一些常见的operating system,例如Android,MacOSX,Linux)上访问键盘,则需要使用特定于操作系统的原语(C ++标准之外的语言)。 / p>

对于Windows,请查阅WinAPI文档。

对于Linux,请先阅读有关其system calls的信息,例如syscalls(2)

大多数操作系统抽象对硬件的访问。因为您的process来自isolated。 它正在user-mode中运行。

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

  

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

您可能会将键盘微控制器中的某些硬件processor registerWindows registry混淆。尽管在语音上有相似之处,但它们是完全无关的。

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

答案 1 :(得分:0)

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

#include <iostream>
#include <windows.h>

#include "ec.hpp"

int main()
{
    EmbeddedController ec = EmbeddedController();

    if (ec.driverFileExist && ec.driverLoaded)
    {
        ec.readByte(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
    }

}