linux有读EC RAM的工具吗,Step to UEFI (179)Shell下 EC Ram 读取工具

最近工作需要在 UEFI  Shell 下Check EC Ram 的设定,发现手上只有 Windows 下的读取工具(RW Everything)。于是研究了一下如何在Shell 读取 EC Ram。

根据【参考1】读取的流程如下:

Port 66 Commands

There are also some EC commands that use ports 0x66 and

0x62. Some of these are standard ACPI commands as defined in the external ACPI

spec, others are custom.

The port 66 protocol is essentially the standard ACPI EC

interface protocol.

1. Wait for port66.IBF = 0

2. Write command byte to port 66.

3. For each outgoing data or address byte:

3a. Wait for port66.IBF = 0

3b. Write data or address byte to port 62.

4. For each incoming data byte:

4a. Wait for port66.OBF = 1

4b. Read data byte from port 62.

5. If the command requires no data or address bytes, you can

determine when the command was accepted/executed by waiting for port66.IBF=0.

同时 ACPI 定义的通用 Command如下:

ACPI-defined port 66 commands

0x80 Read EC (write 0x80 to port 66, write address byte to

port 62, read data byte from port 62)

0x81 Write EC (write 0x81 to port 66, write address byte to

port 62, write data byte to port 62)

0x82 Burst Enable (write 0x82 to port 66, read data byte

from port 62 - the data byte is "burst ACK", value 0x90)

0x83 Burst Disable (write 0x83 to port 66, wait for

port66.IBF=0)

0x84 Query EC (i.e. read SCI event queue) (write 0x84 to

port 66, read data byte from port 62). When the data byte is 0, it means that

the SCI event queue is empty.

最终根据上述资料,编写一个 Application 如下:

#include

#include

#include

#include

extern EFI_SYSTEM_TABLE *gST;

extern EFI_BOOT_SERVICES *gBS;

#define TIMEOUT 0xFFFF

#define ECCOMMAND 0x66

#define ECSTATUS 0x66

#define ECDATA 0x62

#define EC_S_OBF BIT0

#define EC_S_IBF BIT1

#define ECREADCMD 0x80

UINT8 MemBuffer[16][16];

void WaitIBF() {

UINT32 Status;

UINTN Count;

Count = 0;

Status = 0;

Status = IoRead8 (ECSTATUS);

while (((Status & EC_S_IBF) != 0)||(Count>TIMEOUT)) {

Status = IoRead8 (ECSTATUS);

Count++;

}

}

void WaitOBF() {

UINT32 Status;

UINTN Count;

Count = 0;

Status = 0;

Status = IoRead8 (ECSTATUS);

while (((Status & EC_S_OBF) == 0)||(Count>TIMEOUT)) {

Status = IoRead8 (ECSTATUS);

Count++;

}

}

UINT8 ReadECRam(UINT8 Index) {

WaitIBF(); //1

IoWrite8(ECCOMMAND,0x80);//2

WaitIBF(); //3a

IoWrite8(ECDATA, Index); //3b

WaitOBF(); //4a

return IoRead8(ECDATA); //4b

}

void GetData()

{

UINT8 i,j;

for (i=0;i<16;i++)

for (j=0;j<16;j++) {

MemBuffer[i][j]=ReadECRam(i*16+j);

}

}

void ShowData()

{

UINT8 i,j;

Print(L" ");

for (i=0;i<16;i++) Print(L"%02X ",i);

Print(L"\n");

for (i=0;i<16;i++) {

Print(L"%02X: ",i);

for (j=0;j<16;j++) {

Print(L"%02X ",MemBuffer[i][j]);

}

Print(L"\n");

}

Print(L"\n");

}

/***

Print a welcoming message.

Establishes the main structure of the application.

@retval 0 The application exited normally.

@retval Other An error occurred.

***/

INTN

EFIAPI

ShellAppMain (

IN UINTN Argc,

IN CHAR16 **Argv

)

{

EFI_INPUT_KEY Key;

Key.ScanCode=SCAN_NULL;

while (SCAN_UP!=Key.ScanCode)

{

gST->ConOut->ClearScreen(gST->ConOut);

GetData();

ShowData();

gST -> ConIn -> ReadKeyStroke(gST->ConIn,&Key);

Print(L"Press Arrow-Up to exit\n");

gBS->Stall(1000000UL);

}

return(0);

}

在实体机上运行结果如下(按向上键退出):

c87b1614de4e8d0f28feb647bffee22d.png

源代码和Application(X64)下载:

参考:

1. http://wiki.laptop.org/go/Ec_specification

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++基础13-类和对象之继承1

在 C中可重用性(software reusability)是通过继承(inheritance)这一机制来实现的。 如果没有掌握继承性,就没有掌握类与对象的精华。 总结&#xff1a; 1、只要是父类中的private成员&#xff0c;不管是什么继承方式&#xff0c;儿子都访问不了&#xff0c;但它是存在在儿子之…

线程锁定CPU linux,linux 线程与CPU绑定

看到很多程序都是根据CPU个数来创建线程个数&#xff0c;当时很不理解他们之间的关系&#xff0c;请教了项目组的同事后才有了大致了解。1. 相关系统函数下面的函数可以通过man命令查询到。SYNOPSIS#define _GNU_SOURCE#include int pthread_setaffinity_np(pthread_t thread, …

C++基础13-类和对象之继承2

总结&#xff1a; 1、子类对象可以当做父类对象使用 2、子类对象可以直接赋值给父类对象 3、子类对象能够直接初始化父类对象 4、父类指针可以直接指向子类对象 5、凡是继承过来的属性和函数都可以在子类中用this-> 进行访问 6、默认构造函数并不会初始化数据成员 7、如果…

linux内核 块驱动程序,linux – 为什么内核使用默认的块驱动程序而不是我的驱动程序代码?...

我写了一个块驱动程序,它创建了一个虚拟块设备(sbd0).我为该块设备注册了所有设备操作:(请参阅2.6.32内核源代码中的include /linux / blkdev.h)static struct block_device_operations sbd_ops {.owner THIS_MODULE,.open sbd_open,.release sbd_close,.ioctl sbd_ioctl,…

C++基础14-类和对象之多继承与虚继承

多继承&#xff1a;一个类有多个直接基类的继承关系称为多继承 总结&#xff1a; 1、一般将具有菱形样式继承方式的某些类声明为虚继承 3、虚继承的主要目的是为了防止二义性 2、虚继承就是在继承方式前加virtual 如果一个派生类从多个基类派生&#xff0c;而这些基类又有一…

linux系统安装ntp,CentOS下NTP安装配置

安装yum install ntp配置文件 /etc/ntp.confrestrict default kod nomodifynotrap nopeer noqueryrestrict -6 default kod nomodify notrap nopeer noqueryrestrict 127.0.0.1restrict -6 ::1# 用restrict控管权限# nomodify - 用户端不能更改ntp服务器的时间参数# noquery - …

C++基础15-类和对象之多态

总结&#xff1a; 1、在父类中申明虚函数时&#xff0c;一般情况下在子类中也申明&#xff08;便于读代码&#xff09; 一、赋值兼容 赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。 赋值兼容是一种默认行为,不需要任何的显示的转化步骤。 …

傲云浏览器linux,Centos7安装部署zabbix监控软件

目录部署监控服务器部署监控服务器Zabbix ServerWeb页面验证设置部署监控服务器一、安装LNMP环境Zabbix监控管理控制台需要通过Web页面展示出来&#xff0c;并且还需要使用MySQL来存储数据&#xff0c;因此需要先为Zabbix准备基础LNMP环境。1. wget下载官网Nginxwget http://ng…

C++基础16-类和对象之联编,重写,虚析构

1、静态联编和动态联编 1、联编是指一个程序模块、代码之间互相关联的过程。 2、静态联编&#xff08;sta5c binding&#xff09;&#xff0c;是程序的匹配、连接在编译阶段实现&#xff0c;也称为早期匹配。重载函数使用静态联编。 3、动态联编是指程序联编推迟到运行时…

c语言环境变量的作用,C语言获取系统环境变量

C语言获取系统环境变量可以通过如下代码实现.#include #include char *platform(){//获取系统变量信息char *ret;extern char **environ;char **env environ;//打印系统变量信息/*while(*env){//puts(*env);env;}*/ret getenv("OS"); //for windows_ntif(NULL ! re…

C++基础17-纯虚函数和抽象类

总结&#xff1a; 1,含有纯虚函数的类,称为抽象基类,不可实列化。即不能创建对象,存在 的意义就是被继承,提供族类的公共接口。 2,纯虚函数只有声明,没有实现,被“初始化”为 0。 3,如果一个类中声明了纯虚函数,而在派生类中没有对该函数定义,则该虚函数在派生类中仍然为纯…

c语言wpf99乘法表,使用JSP输出九九乘法表

R数据实战vehicles--1新建项目vehicles-project 数据文件vehicles.csv与varlabels.txt放在项目文件中【CSS3】---颜色RGBA及渐变色颜色之RGBA RGB是一种色彩标准,是由红(R).绿(G).蓝(B)的变化以及相互叠加来得到各式各样的颜色.RGBA是在RGB的基础上增加了控制alpha透明度的参数…

C++基础18-抽象类-电脑组装练习

01电脑组装me.cpp 需要实现所有的虚函数&#xff0c;不台灵活。架构函数无法写&#xff0c;设计不够成熟 #if 1 #include<iostream> using namespace std; class Computer { public:virtual void caculate() 0;virtual void display() 0;virtual void storage() 0; …

以串结构存储c语言版,数据结构C语言版 串的块链存储表示和实现

《数据结构C语言版 串的块链存储表示和实现》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《数据结构C语言版 串的块链存储表示和实现(13页珍藏版)》请在人人文库网上搜索。1、*数据结构C语言版 串的块链存储表示和实现P78编译环境&#xff1a;Dev-C 4.9.9.2日期&…

mysql索引创建及使用注意事项

总结&#xff1a; 1、在使用索引时&#xff0c;一般情况下不建议使用like操作。如果使用&#xff0c;则%放在后面。否则不会使用索引。like ‘%abd%’不会使用索引,而like ‘aaa%’可以使用索引.&#xff08;最左缀原则&#xff09; 2、单列索引的使用&#xff1a; 《1》 只…

mulitpartfile怎么接收不到值_和平精英信号接收区和信号值是什么?信号值怎么恢复...

[闽南网]和平精英公测开启&#xff0c;和平精英与刺激战场有什么不同呢&#xff1f;今天小编就为大家带来了信号值详解&#xff01;各位玩家千万不要错过呀&#xff01;信号值详解信号接收区和信号值是什么&#xff0c;对选手有什么影响&#xff1f;在游戏战斗界面中&#xff0…

c语言编程判断素数的函数,【面试题】C语言:实现一个函数,判断一个数是不是素数。...

#include#include#includeint prime(int num){int k 0;int i 0;k sqrt(num);for (i 2; i < k; i) /*不满足循环条件时即均不可被整除&#xff0c;不是素数*/{if (num%i 0){return 0;}}return -1;}int main(){int num 0;int ret 0;printf("please input the nu…

Linux命令 umask,chmod使用

一、文件权限详解 1、文件权限介绍 在linux中的每一个文件或目录都包含有访问权限&#xff0c;这些访问权限决定了谁能访问和如何访问这些文件和目录。通过设定权限可以从以下三种访问方式限制访问权限&#xff1a;只允许用户自己访问&#xff1b;允许一个预先指定的用户组中…

python启动c语言gdb,使用gdb调试python程序

游戏服务器菜鸟之C&num;初探三游戏服务在经过上述2番折腾之后,最后决定使用TCP进行通信,所以在一次进行重构 主要重构的要点 1.将过来的HTPP请求,重构为TCP请求: 2.使用组件FluenScheduler进行怪物的定时刷新,和定时 ...Windows环境下的NodeJS&plus;NPM&plus;Bower…

制备pdms膜的方法_船体用钢板基底超疏水表面的制备和性能

鲨鱼皮具有神奇的微纳双层结构&#xff0c;其微米级肋条状结构在水中的整流效果可减小水的阻力。纳米级刺状突起或刚毛具有疏水特性&#xff0c;使植物抱子很难附着其上&#xff0c;海藻等植物也不能在其表面生长&#xff3b;1,2&#xff3d;。这种微纳结构及其疏水性的共同作用…