/******************************************************************************
* FileName: wdt.c
* Description: Reverse SDK 1.0.0 (libmain.a)
* Author: PV` + ...
* ver1.0
*******************************************************************************/
#include "user_config.h"
#include "ets.h" // из
#include "ets_sys.h"
#include "os_type.h"
#include "osapi.h"
#include "user_interface.h"
#include "specreg.h"
#define _bss_start (*((uint8 *)0x3FFE9DF8)) // изменить на верную переменную
#define WDT_BASE 0x60000900
#define HWREG(BASE, OFF) (*((volatile uint32_t *)((BASE)+(OFF))))
/* WDT registers */
#define _WDT_CTRL 0
#define _WDT_REG1 4
#define _WDT_REG2 8
#define _WDT_FEED 0x14
#define WDT_CTRL HWREG(WDT_BASE, _WDT_CTRL)
#define WDT_REG1 HWREG(WDT_BASE, _WDT_REG1)
#define WDT_REG2 HWREG(WDT_BASE, _WDT_REG2)
#define WDT_FEED HWREG(WDT_BASE, _WDT_FEED)
#define _INTC_EDGE_EN 0x04
#define INTC_EDGE_EN HWREG(PERIPHS_DPORT_BASEADDR, _INTC_EDGE_EN)
#define WDT_FEED_MAGIC 0x73
#define __stringify_1(x...) #x
#define __stringify(x...) __stringify_1(x)
#define RSR(sr) ({uint32_t r; asm volatile ("rsr %0,"__stringify(sr) : "=a"(r)); r;})
// in ROM-BIOS
void ets_task(ETSTask, uint32_t, struct ETSEventTag *, ETSPriority);
void ets_isr_unmask(uint32_t intr);
void ets_post(uint32_t, ETSSignal, ETSParam);
//ets_post(
// in SDK
// bool system_rtc_mem_read(uint8 src_addr, void *des_addr, uint16 load_size); // user_interface.h
// bool system_rtc_mem_write(uint8 des_addr, const void *src_addr, uint16 save_size); // user_interface.h
static ETSEventQueue wdt_eventq;
void wdt_feed(void)
{
struct rst_info rst_info;
rst_info.exccause = RSR(EXCCAUSE);
rst_info.epc1 = RSR(EPC1);
rst_info.epc2 = RSR(EPC2);
rst_info.epc3 = RSR(EPC3);
rst_info.excvaddr = RSR(EXCVADDR);
rst_info.depc = RSR(DEPC);
system_rtc_mem_read(0, &rst_info.flag, 4);
if (rst_info.flag != EXP_RST_FLAG) {
rst_info.flag = WDT_RST_FLAG;
system_rtc_mem_write(0, &rst_info, sizeof(rst_info));
}
_bss_start = 1; // (*((uint8 *)0x3FFE9DF8)) = 1;
ets_post(0x1e, 0, 0);
}
static void wdt_task(ETSEvent *e)
{
struct rst_info rst_info;
if(_bss_start == 1) { // (*((uint8 *)0x3FFE9DF8))
ets_intr_lock();
_bss_start = 0; // (*((uint8 *)0x3FFE9DF8)) = 0
ets_intr_unlock();
}
system_rtc_mem_read(0, &rst_info, sizeof(rst_info));
if (rst_info.flag != EXP_RST_FLAG) {
rst_info.flag = DEFAULT_RST_FLAG;
system_rtc_mem_write(0, &rst_info, sizeof(rst_info));
}
WDT_FEED = WDT_FEED_MAGIC;
}
void wdt_init(void)
{
ets_task(&wdt_task, 0x1e, &wdt_eventq, 1);
WDT_CTRL &= 0x7e; // Disable WDT
ets_isr_attach(8, wdt_feed, NULL);
INTC_EDGE_EN |= 1; // 0x3ff00004 |= 1
WDT_REG1 = 0xb; // WDT timeot
WDT_REG2 = 0xb;
WDT_CTRL |= 0x38; // WDT cfg
WDT_CTRL &= 0x79;
WDT_CTRL |= 1; // Enable WDT
ets_isr_unmask(1 << 8); // Enable WDT isr
}