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

相关文章

Oracle查询优化之高效实现仅查询前10条记录的方法与实践

《Oracle查询优化之高效实现仅查询前10条记录的方法与实践》:本文主要介绍Oracle查询优化之高效实现仅查询前10条记录的相关资料,包括使用ROWNUM、ROW_NUMBER()函数、FET... 目录1. 使用 ROWNUM 查询2. 使用 ROW_NUMBER() 函数3. 使用 FETCH FI

Python脚本实现自动删除C盘临时文件夹

《Python脚本实现自动删除C盘临时文件夹》在日常使用电脑的过程中,临时文件夹往往会积累大量的无用数据,占用宝贵的磁盘空间,下面我们就来看看Python如何通过脚本实现自动删除C盘临时文件夹吧... 目录一、准备工作二、python脚本编写三、脚本解析四、运行脚本五、案例演示六、注意事项七、总结在日常使用

Java实现Excel与HTML互转

《Java实现Excel与HTML互转》Excel是一种电子表格格式,而HTM则是一种用于创建网页的标记语言,虽然两者在用途上存在差异,但有时我们需要将数据从一种格式转换为另一种格式,下面我们就来看看... Excel是一种电子表格格式,广泛用于数据处理和分析,而HTM则是一种用于创建网页的标记语言。虽然两

Java中Springboot集成Kafka实现消息发送和接收功能

《Java中Springboot集成Kafka实现消息发送和接收功能》Kafka是一个高吞吐量的分布式发布-订阅消息系统,主要用于处理大规模数据流,它由生产者、消费者、主题、分区和代理等组件构成,Ka... 目录一、Kafka 简介二、Kafka 功能三、POM依赖四、配置文件五、生产者六、消费者一、Kaf

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服