本文主要是介绍电脑主板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的源码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!