电脑主板SuperIO IT8786E/IT8728F实现看门狗(Watch Dog)功能及操作EC的源码

本文主要是介绍电脑主板SuperIO IT8786E/IT8728F实现看门狗(Watch Dog)功能及操作EC的源码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

电脑主板SuperIO IT8786E/IT8728F实现看门狗Watch Dog功能及操作EC的源码

  • 一、看门狗定义
  • 二、看门狗基本原理
  • 三、由SuperIO芯片 IT8786E实现看门狗的方法和源码
    • 1.SuperIO Chip: IT8786E-I 说明及底层开启看门狗
    • 2.操作系统OS层用Shell脚本开启看门狗代码
  • 四、由SuperIO芯片 IT8728F实现看门狗的方法和源码
    • 1. 常量定义
    • 2.基本操作函数定义
    • 3.WatchDog相关操作函数定义
    • 4. 完整设置WatchDog功能
  • 五、由SuperIO芯片 IT8728F操作EC
    • 1.使能 EC(LDN=04h, Index 30h=01)
    • 2、 得到EC Base Address,
  • 六、相关操作工具下载
    • 1. Linux内存地址操作工具devmem2源码下载
    • 2. SuperIO芯片IT8786E数据手册及上电指导下载

随着计算机系统的应用越来越广泛,系统的稳定性和可靠性也成为了一个重要的问题。看门狗(Watchdog)作为一种常见的系统保护机制,扮演着至关重要的角色。SuperIO中的GPIO逻辑设备功能还是挺丰富的,除了通用Simple /功能,SMI输出路SMl Ouput Routing)、外部中断路由(External lnterrupt Routing)、LED闪烁(LED Blinking)等功能,还支持看门狗(Watch Dod Timer),这里就是介绍一种使用SuperIO IT8786E/IT8728F实现看门狗在方法。

一、看门狗定义

看门狗,又叫watchdog timer,是一个定时器电路,一般有一个输入,叫喂狗(kicking the dog/service the dog),一个输出到MCU的RST端,MCU正常工作的时候,每隔一段时间输出一个信号到喂狗端,给 WDT清零,如果超过规定的时间不喂狗(一般在程序跑飞时),WDT定时超过,就会给出一个复位信号到MCU,使MCU复位。防止MCU死机. 看门狗的作用就是防止程序发生死循环,或者说程序跑飞 。

二、看门狗基本原理

看门狗是一种监控系统的运行状况的手段,通过软硬件结合的方式实现对系统运行状况的监控。稳定运行的软件会在执行完特定指令后进行喂狗,若在一定周期内看门狗没有收到来自软件的喂狗信号,则认为系统故障,会进入中断处理程序或强制系统复位。系统上电后根据不同的工作模式可以选择使能看门狗的时机,若看门狗被使能则计数器开始计数,如果在设定的时间内没有及时喂狗则会发生看门狗超时。
看门狗主要由寄存器、计数器和狗叫模块构成,通过寄存器对看门狗进行基本设置,计数器计算狗叫时间,狗叫模块决定看门狗超时后发出的中断或复位方式。

三、由SuperIO芯片 IT8786E实现看门狗的方法和源码

1.SuperIO Chip: IT8786E-I 说明及底层开启看门狗

这里简单实现一下看门狗的复位功能,只需要对看门狗的配置寄存器组和数据寄存器组进行操作。
WDTCTRL:Watch Dog Timer Control Register (Index=71h, Default=00h) 控制寄存器,主要是设置中断,这里不涉及WDTCONF:Watch Dog Timer Configuration Register (Index=72h, Default=001s0000b) 配置寄存器Bit6 or Bit4设置为1即可开启看门狗功能,这里使用Bit4 PWRGD
在这里插入图片描述
WDTVALLSB:Watch Dog Timer Time-out Value (LSB) Register (Index=73h, Default=38h) 低位数据寄存器
WDTVALMSB:Watch Dog Timer Time-out Value (MSB) Register (Index=74h, Default=00h) 高位数据寄存器

主要流程
进入IO配置空间
选择逻辑设备
设置看门狗配置寄存器
设置看门狗数据寄存器
喂狗(循环第4步)

核心代码

/* IO Ports */
#define REG             0x2e
#define VAL             0x2f
/* Logical device Numbers LDN */
#define LDNREG          0x07
#define GPIOLND         0x07//superio enter
outb(0x87, REG);
outb(0x01, REG);
outb(0x55, REG);
outb(0x55, REG);//select logic device
outb(LDNREG, REG);
outb(GPIOLND, VAL);//WDT Output through KRST (pulse) Enable
outb(0x72, REG);
outb(0x90, VAL);//1001 0000//WDT Timer-out Value (feed dog)
outb(0x73, REG);
outb(0x1e, VAL);//1e:30s
outb(0x74, REG);
outb(0x00, VAL);//Close WDT
//outb(0x72, REG);
//outb(0x80, VAL);//exit superio
outb(0x02, REG);
outb(0x02, VAL);

如果在超时时间内没有进行喂狗,WDT将会自动产生一个复位信号,重启电脑。
执行上面的代码,正常的话30s后系统将会自动重启

2.操作系统OS层用Shell脚本开启看门狗代码

#!/bin/sh#
# This script is only for reading IT8786 superIO GPIO Watchdog;
## enter MB Pnp Mode
devmem2 0x2000004E b 0x87 > /dev/null 2>&1
sleep 0.01
devmem2 0x2000004E b 0x01 > /dev/null 2>&1
sleep 0.01
devmem2 0x2000004E b 0x55 > /dev/null 2>&1
sleep 0.01
devmem2 0x2000004E b 0xAA > /dev/null 2>&1
sleep 0.01# enable superIO gpio wachdog# DNX=0x07
devmem2 0x2000004E b 0x07 > /dev/null 2>&1
sleep 0.01
devmem2 0x2000004F b 0x07 > /dev/null 2>&1
sleep 0.01# Minute
devmem2 0x2000004E b 0x72 > /dev/null 2>&1
sleep 0.01
devmem2 0x2000004F b 0x40 > /dev/null 2>&1
sleep 0.01# Timeout High
devmem2 0x2000004E b 0x74 > /dev/null 2>&1
sleep 0.01
devmem2 0x2000004F b 0x00 > /dev/null 2>&1
sleep 0.01# Minute Low
devmem2 0x2000004E b 0x73 > /dev/null 2>&1
sleep 0.01
devmem2 0x2000004F b 0x01 > /dev/null 2>&1
sleep 0.01# WatchDog Enabled
devmem2 0x2000004E b 0xF1 > /dev/null 2>&1
sleep 0.01
devmem2 0x2000004F b 0x04 > /dev/null 2>&1
sleep 0.01# exit MB Pnp Mode
devmem2 0x2000004E b 0x02 > /dev/null 2>&1
sleep 0.01
devmem2 0x2000004F b 0x02 > /dev/null 2>&1
sleep 0.01

四、由SuperIO芯片 IT8728F实现看门狗的方法和源码

1. 常量定义

UINT8  IT8728F_CONFIG_INDEX  = 0x2e;
UINT8  IT8728F_CONFIG_DATA   = 0x2f,

2.基本操作函数定义

示例代码:
//打开SuperIO编辑模式
void openSioDecode() {IoWrite8(IT8728F_CONFIG_INDEX, 0x87);IoWrite8(IT8728F_CONFIG_INDEX, 0x01);IoWrite8(IT8728F_CONFIG_INDEX, 0x55);IoWrite8(IT8728F_CONFIG_INDEX, 0x55);
}
//关闭SuperIO编辑模式
void closeSioDecode() {IoWrite8(IT8728F_CONFIG_INDEX, 0x02);IoWrite8(IT8728F_CONFIG_DATA, 0x02);
}
//写SuperIO寄存器
void WriteIoRegister(UINT8 Register, UINT8 Value) {IoWrite8(IT8728F_CONFIG_INDEX, Register);IoWrite8(IT8728F_CONFIG_DATA, Value);
}
//读SuperIO寄存器
UINT8 ReadIoRegister(UINT8 Register) {UINT8 Value;IoWrite8(IT8728F_CONFIG_INDEX, Register);Value = IoRead8(IT8728F_CONFIG_DATA);return Value;
}//重写SuperIO寄存器
void ReWriteIoRegister(UINT8 Register, UINT8 andMask, UINT8 orMask) {UINT8 Value;Value = ReadIoRegister(Register);Value = Value & andMask;Value = Value | orMask;WriteIoRegister(Register, Value);
}

3.WatchDog相关操作函数定义

//初始化Watchdog相关功能寄存器
void InitWatchdogFunc() {
ReWriteIoRegister(0x07,0x00,0x07);
ReWriteIoRegister(0x27,0xff,0x40);
ReWriteIoRegister(0xf4,0xc0,0x1e);
ReWriteIoRegister(0xf1,0x00,0x40);
ReWriteIoRegister(0x71,0xfe,0x00);
ReWriteIoRegister(0xf3,0x00,0x80);
}//配置Watchdog计数单位为秒
void setWdtUnitSeconds() {
ReWriteIoRegister(0x07,0x00,0x07);
ReWriteIoRegister(0x72,0x00,0x80);
}//配置Watchdog计数单位为分
void setWdtUnitMinutes() {
ReWriteIoRegister(0x07,0x00,0x07);
ReWriteIoRegister(0x72,0x5f,0x00);
}//配置Watchdog时间
void setWdtTime(UINT16 timeValue) {
UINT8 lowValue = (UINT8) timeValue &0xff;
UINT8 highValue = (UINT8)(timeValue>>8) &0xff;
ReWriteIoRegister(0x07,0x00,0x07);
ReWriteIoRegister(0x74,0x00, highValue);
ReWriteIoRegister(0x73,0x00, lowValue)
}//使能WatchDog功能
void WdtStart() {
ReWriteIoRegister(0x07,0x00,0x07);
ReWriteIoRegister(0Xf1,0xff,0x04);
}

4. 完整设置WatchDog功能

void setWdtTime() {
//打开SIO编辑模式
openSioDecode();
//初始化Watchdog功能
InitWatchdogFunc();
//配置Watchdog计数单位为秒(或者分)
setWdtUnitSeconds ();
//配置Watchdog计数单位为分
//setWdtUnitMinutes ();
//配置WDT时间
setWdtTime(timeValue);
//使能Wdt
WdtStart ();
//关闭SIO编辑模式
closeSioDecode()
}

五、由SuperIO芯片 IT8728F操作EC

1.使能 EC(LDN=04h, Index 30h=01)

通过看SPEC,可以发现逻辑设备选择寄存器是07h,它的逻辑设备号是04h,这时候,进入IO Space,输入2E,在控制寄存器2E地址即0x00位置输入07h,然后在数据寄存器2F地址即0x01位置输入04h,在控制寄存器2E地址即0x00位置输入30h,在数据寄存器2F地址即0x01位置输入01h,使EC生效

IoWrite8(IT8728F_CONFIG_INDEX, 0x07); //逻辑设备选择寄存器
IoWrite8(IT8728F_CONFIG_DATA, 0x04); //逻辑设备号(EC)

IoWrite8(IT8728F_CONFIG_INDEX, 0x30); //EC Active 寄存器(Index=30h)
IoWrite8(IT8728F_CONFIG_DATA, 0x01); //01使EC生效

简化:
WriteIoRegister(0x07,0x04); //选择EC设备
WriteIoRegister(0x30,0x01); //使EC生效

2、 得到EC Base Address,

可以从SPEC中看出,基地址是需要从60h,61h寄存器读出来的,60h是高八位,61h是低八位,合起来就是基地址base。然后我们的EC控制器的地址端口地址就是base+05h,数据端口就是base+06h。
基地址由逻辑设备寄存器确定(index=60h, 61h)
地址端口(Base+05h);数据端口(Base+06h)

uBaseAddr_H=ReadIoRegister(0x60);
uBaseAddr_L=ReadIoRegister(0x61);
uiECBaseAddr=uBaseAddr_H<<8+uBaseAddr_L;

六、相关操作工具下载

1. Linux内存地址操作工具devmem2源码下载

Linux内存地址操作工具devmem2源码下载

devmem2-superIO_20230907.zip下载下来,在linux下解压:
直接使用devmem2
或重新生成devmem2
make

生成执行文件 devmem2即可

操作devmem2如下:
devmem2 0x2000004E b 0x87

2. SuperIO芯片IT8786E数据手册及上电指导下载

SuperIO芯片IT8786E数据手册及上电指导下载

在这里插入图片描述
在这里插入图片描述

这篇关于电脑主板SuperIO IT8786E/IT8728F实现看门狗(Watch Dog)功能及操作EC的源码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/422511

相关文章

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法