电脑主板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+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要