Files
arcs/arcs-sdk/drivers/lisa_wdt/lisa_wdt.h
2026-08-13 16:50:52 +08:00

238 lines
6.7 KiB
C

/*
* Copyright (c) 2025, LISTENAI
*
* SPDX-License-Identifier: Apache-2.0
*/
/**
* @file lisa_wdt.h
* @brief LISA Watchdog Timer 看门狗设备驱动接口
*/
#pragma once
#include "lisa_device.h"
#include <stdint.h>
#include <stdbool.h>
#ifdef __cplusplus
extern "C" {
#endif
/* ========================================================================
* WDT 类型定义
* ======================================================================== */
/**
* @brief WDT 超时行为
*/
typedef enum {
LISA_WDT_ACTION_RESET = 0, /* 系统复位 */
LISA_WDT_ACTION_INTERRUPT = 1, /* 触发中断 */
} lisa_wdt_action_t;
/**
* @brief WDT 配置结构体
*/
typedef struct {
uint32_t int_timeout_ms; /* 中断超时时间(毫秒)*/
uint32_t rst_timeout_ms; /* 复位超时时间(毫秒)从中断超时时间开始计算*/
} lisa_wdt_config_t;
/**
* @brief WDT 状态
*/
typedef enum {
LISA_WDT_STATE_IDLE = 0, /* 空闲状态 */
LISA_WDT_STATE_RUNNING = 1, /* 运行中 */
LISA_WDT_STATE_EXPIRED = 2, /* 已超时 */
} lisa_wdt_state_t;
/**
* @brief WDT 超时回调函数类型
*
* @param user_data 用户数据指针
*
* @note 此回调在超时中断中执行,应尽快返回
* @note 如果需要访问设备,可以通过 user_data 传入设备指针
*/
typedef void (*lisa_wdt_callback_t)(void *user_data);
/* ========================================================================
* WDT 设备 API 结构体
* ======================================================================== */
typedef struct {
int (*setup)(lisa_device_t *dev, const lisa_wdt_config_t *config);
int (*start)(lisa_device_t *dev);
int (*stop)(lisa_device_t *dev);
int (*feed)(lisa_device_t *dev);
int (*get_remaining_time)(lisa_device_t *dev, uint32_t *remaining_ms);
int (*get_state)(lisa_device_t *dev, lisa_wdt_state_t *state);
int (*set_callback)(lisa_device_t *dev, lisa_wdt_callback_t callback, void *user_data);
} lisa_wdt_api_t;
/* ========================================================================
* WDT 对外接口函数
* ======================================================================== */
/**
* @brief 配置看门狗设备
*
* @param dev WDT设备指针
* @param config 配置参数
*
* @return 0 成功
* @return LISA_DEVICE_ERR_INVALID 参数无效
* @return LISA_DEVICE_ERR_NOT_SUPPORT 不支持该操作
* @return <0 其他错误
*/
static inline int lisa_wdt_setup(lisa_device_t *dev, const lisa_wdt_config_t *config)
{
if (!dev || !dev->api || !config) {
return LISA_DEVICE_ERR_INVALID;
}
lisa_wdt_api_t *api = (lisa_wdt_api_t *)dev->api;
return api->setup ? api->setup(dev, config) : LISA_DEVICE_ERR_NOT_SUPPORT;
}
/**
* @brief 启动看门狗
*
* @param dev WDT设备指针
*
* @return 0 成功
* @return LISA_DEVICE_ERR_INVALID 参数无效
* @return LISA_DEVICE_ERR_NOT_SUPPORT 不支持该操作
* @return <0 其他错误
*
* @note 某些硬件看门狗一旦启动无法停止,直到系统复位
*/
static inline int lisa_wdt_start(lisa_device_t *dev)
{
if (!dev || !dev->api) {
return LISA_DEVICE_ERR_INVALID;
}
lisa_wdt_api_t *api = (lisa_wdt_api_t *)dev->api;
return api->start ? api->start(dev) : LISA_DEVICE_ERR_NOT_SUPPORT;
}
/**
* @brief 停止看门狗
*
* @param dev WDT设备指针
*
* @return 0 成功
* @return LISA_DEVICE_ERR_INVALID 参数无效
* @return LISA_DEVICE_ERR_NOT_SUPPORT 不支持该操作(某些硬件不支持停止)
* @return <0 其他错误
*
* @note 某些硬件看门狗一旦启动无法停止
*/
static inline int lisa_wdt_stop(lisa_device_t *dev)
{
if (!dev || !dev->api) {
return LISA_DEVICE_ERR_INVALID;
}
lisa_wdt_api_t *api = (lisa_wdt_api_t *)dev->api;
return api->stop ? api->stop(dev) : LISA_DEVICE_ERR_NOT_SUPPORT;
}
/**
* @brief 喂狗(重置看门狗计数器)
*
* @param dev WDT设备指针
*
* @return 0 成功
* @return LISA_DEVICE_ERR_INVALID 参数无效
* @return LISA_DEVICE_ERR_NOT_SUPPORT 不支持该操作
* @return <0 其他错误
*
* @note 必须在超时之前调用此函数,否则将触发超时行为
*/
static inline int lisa_wdt_feed(lisa_device_t *dev)
{
if (!dev || !dev->api) {
return LISA_DEVICE_ERR_INVALID;
}
lisa_wdt_api_t *api = (lisa_wdt_api_t *)dev->api;
return api->feed ? api->feed(dev) : LISA_DEVICE_ERR_NOT_SUPPORT;
}
/**
* @brief 获取剩余时间
*
* @param dev WDT设备指针
* @param remaining_ms 输出参数,剩余时间(毫秒)
*
* @return 0 成功
* @return LISA_DEVICE_ERR_INVALID 参数无效
* @return LISA_DEVICE_ERR_NOT_SUPPORT 不支持该操作
* @return <0 其他错误
*/
static inline int lisa_wdt_get_remaining_time(lisa_device_t *dev, uint32_t *remaining_ms)
{
if (!dev || !dev->api || !remaining_ms) {
return LISA_DEVICE_ERR_INVALID;
}
lisa_wdt_api_t *api = (lisa_wdt_api_t *)dev->api;
return api->get_remaining_time ? api->get_remaining_time(dev, remaining_ms) : LISA_DEVICE_ERR_NOT_SUPPORT;
}
/**
* @brief 获取看门狗状态
*
* @param dev WDT设备指针
* @param state 输出参数,当前状态
*
* @return 0 成功
* @return LISA_DEVICE_ERR_INVALID 参数无效
* @return LISA_DEVICE_ERR_NOT_SUPPORT 不支持该操作
* @return <0 其他错误
*/
static inline int lisa_wdt_get_state(lisa_device_t *dev, lisa_wdt_state_t *state)
{
if (!dev || !dev->api || !state) {
return LISA_DEVICE_ERR_INVALID;
}
lisa_wdt_api_t *api = (lisa_wdt_api_t *)dev->api;
return api->get_state ? api->get_state(dev, state) : LISA_DEVICE_ERR_NOT_SUPPORT;
}
/**
* @brief 设置超时回调函数
*
* @param dev WDT设备指针
* @param callback 回调函数指针
* @param user_data 用户数据指针
*
* @return 0 成功
* @return LISA_DEVICE_ERR_INVALID 参数无效
* @return LISA_DEVICE_ERR_NOT_SUPPORT 不支持该操作
* @return <0 其他错误
*
* @note 仅当超时行为设置为 LISA_WDT_ACTION_INTERRUPT 时有效
*/
static inline int lisa_wdt_set_callback(lisa_device_t *dev, lisa_wdt_callback_t callback, void *user_data)
{
if (!dev || !dev->api) {
return LISA_DEVICE_ERR_INVALID;
}
lisa_wdt_api_t *api = (lisa_wdt_api_t *)dev->api;
return api->set_callback ? api->set_callback(dev, callback, user_data) : LISA_DEVICE_ERR_NOT_SUPPORT;
}
/* ========================================================================
* 便捷宏定义
* ======================================================================== */
/**
* @brief 超时行为支持位掩码
*/
#define LISA_WDT_ACTION_MASK_RESET (1 << LISA_WDT_ACTION_RESET)
#define LISA_WDT_ACTION_MASK_INTERRUPT (1 << LISA_WDT_ACTION_INTERRUPT)
#ifdef __cplusplus
}
#endif