电脑主板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

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL