/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : bsp_module.h * @brief : 板级支持包模块管理头文件 ****************************************************************************** */ /* USER CODE END Header */ #ifndef BSP_MODULE_H #define BSP_MODULE_H #include "hal.h" /** * @brief BSP 模块类型定义 */ typedef enum { BSP_MODULE_TYPE_LED = 0, BSP_MODULE_TYPE_BUTTON, BSP_MODULE_TYPE_UART, BSP_MODULE_TYPE_SPI, BSP_MODULE_TYPE_I2C, BSP_MODULE_TYPE_CAN, BSP_MODULE_TYPE_ADC, BSP_MODULE_TYPE_DAC, BSP_MODULE_TYPE_TIMER, BSP_MODULE_TYPE_RTC, BSP_MODULE_TYPE_W25QXX, BSP_MODULE_TYPE_MAX } bsp_module_type_t; /** * @brief BSP 模块状态定义 */ typedef enum { BSP_MODULE_STATE_UNINIT = 0, BSP_MODULE_STATE_INIT, BSP_MODULE_STATE_CONFIGURED, BSP_MODULE_STATE_RUNNING, BSP_MODULE_STATE_ERROR } bsp_module_state_t; /** * @brief BSP 模块优先级定义 */ typedef enum { BSP_MODULE_PRIORITY_HIGHEST = 0, BSP_MODULE_PRIORITY_HIGH, BSP_MODULE_PRIORITY_MEDIUM, BSP_MODULE_PRIORITY_LOW, BSP_MODULE_PRIORITY_LOWEST } bsp_module_priority_t; /** * @brief BSP 模块配置结构体 */ typedef struct bsp_module_config { bsp_module_type_t type; /*!< 模块类型 */ const char* name; /*!< 模块名称 */ bsp_module_priority_t priority; /*!< 模块优先级 */ uint32_t version; /*!< 模块版本 */ uint8_t instance; /*!< 模块实例 */ uint8_t enable; /*!< 模块使能标志 */ void* config_data; /*!< 模块配置数据 */ size_t config_size; /*!< 模块配置大小 */ uint32_t dependencies; /*!< 模块依赖位掩码 */ } bsp_module_config_t; /** * @brief BSP 模块操作结构体 */ typedef struct { hal_ret_t (*init)(void* config); /*!< 模块初始化函数 */ hal_ret_t (*deinit)(void); /*!< 模块反初始化函数 */ hal_ret_t (*configure)(void* config); /*!< 模块配置函数 */ hal_ret_t (*start)(void); /*!< 模块启动函数 */ hal_ret_t (*stop)(void); /*!< 模块停止函数 */ hal_ret_t (*reset)(void); /*!< 模块复位函数 */ bsp_module_state_t (*get_state)(void); /*!< 模块获取状态函数 */ hal_ret_t (*control)(uint32_t cmd, void* param); /*!< 模块控制函数 */ } bsp_module_ops_t; /** * @brief BSP 模块版本结构体 */ typedef struct { uint8_t major; uint8_t minor; uint8_t patch; } bsp_module_version_t; /** * @brief bsp_module_t 的前向声明 */ typedef struct bsp_module bsp_module_t; /** * @brief BSP 模块事件回调类型 */ typedef hal_ret_t (*bsp_module_event_callback_t)(const bsp_module_t* sender, uint32_t event, void* data); /** * @brief BSP 模块结构体 */ typedef struct bsp_module { bsp_module_config_t config; /*!< 模块配置 */ bsp_module_ops_t ops; /*!< 模块操作 */ bsp_module_state_t state; /*!< 模块状态 */ bsp_module_version_t version; /*!< 模块版本 */ struct bsp_module* next; /*!< 链表中下一个模块的指针 */ struct bsp_module* prev; /*!< 链表中上一个模块的指针 */ void* private_data; /*!< 模块私有数据 */ bsp_module_event_callback_t event_callback; /*!< 事件回调 */ } bsp_module_t; /** * @brief BSP 模块事件定义 */ #define BSP_MODULE_EVENT_INIT (1 << 0) /*!< 模块已初始化 */ #define BSP_MODULE_EVENT_DEINIT (1 << 1) /*!< 模块已反初始化 */ #define BSP_MODULE_EVENT_START (1 << 2) /*!< 模块已启动 */ #define BSP_MODULE_EVENT_STOP (1 << 3) /*!< 模块已停止 */ #define BSP_MODULE_EVENT_ERROR (1 << 4) /*!< 模块错误 */ #define BSP_MODULE_EVENT_CONFIG (1 << 5) /*!< 模块已配置 */ #define BSP_MODULE_EVENT_CUSTOM (1 << 8) /*!< 自定义模块事件基础 */ /** * @brief BSP 模块自动注册宏 */ #define BSP_MODULE_REGISTER(module) \ static const bsp_module_config_t __bsp_module_##module##_config = { \ .type = BSP_MODULE_TYPE_##module, \ .name = #module, \ .priority = BSP_MODULE_PRIORITY_MEDIUM, \ .version = 1, \ .instance = 0, \ .enable = 1, \ .config_data = NULL, \ .config_size = 0, \ .dependencies = 0 \ }; \ static bsp_module_t __bsp_module_##module = { \ .config = __bsp_module_##module##_config, \ .state = BSP_MODULE_STATE_UNINIT, \ .version = {1, 0, 0}, \ .event_callback = NULL \ }; #define BSP_MODULE_REGISTER_FULL(module, type, priority, instance, deps) \ static const bsp_module_config_t __bsp_module_##module##_config = { \ .type = (type), \ .name = #module, \ .priority = (priority), \ .version = 1, \ .instance = (instance), \ .enable = 1, \ .config_data = NULL, \ .config_size = 0, \ .dependencies = (deps) \ }; \ static bsp_module_t __bsp_module_##module = { \ .config = __bsp_module_##module##_config, \ .state = BSP_MODULE_STATE_UNINIT, \ .version = {1, 0, 0}, \ .event_callback = NULL \ }; #define BSP_MODULE_REGISTER_AT_STARTUP(module) \ BSP_MODULE_REGISTER(module) \ __attribute__((constructor)) static void __bsp_register_##module##_at_startup(void) { \ bsp_module_register(&__bsp_module_##module); \ } /** * @brief BSP 模块管理器结构体 */ typedef struct { bsp_module_t* modules[BSP_MODULE_TYPE_MAX]; /*!< 按类型存储的模块 */ bsp_module_t* module_list; /*!< 所有模块的链表 */ uint32_t module_count; /*!< 模块总数 */ } bsp_module_manager_t; /** * @brief 初始化 BSP 模块管理器 * @retval HAL 状态码 */ hal_ret_t bsp_module_manager_init(void); /** * @brief 注册一个 BSP 模块 * @param module: 指向模块结构体的指针 * @retval HAL 状态码 */ hal_ret_t bsp_module_register(bsp_module_t* module); /** * @brief 注销一个 BSP 模块 * @param module: 指向模块结构体的指针 * @retval HAL 状态码 */ hal_ret_t bsp_module_unregister(bsp_module_t* module); /** * @brief 初始化所有注册的 BSP 模块 * @retval HAL 状态码 */ hal_ret_t bsp_module_init_all(void); /** * @brief 反初始化所有注册的 BSP 模块 * @retval HAL 状态码 */ hal_ret_t bsp_module_deinit_all(void); /** * @brief 启动所有注册的 BSP 模块 * @retval HAL 状态码 */ hal_ret_t bsp_module_start_all(void); /** * @brief 停止所有注册的 BSP 模块 * @retval HAL 状态码 */ hal_ret_t bsp_module_stop_all(void); /** * @brief 初始化指定的 BSP 模块 * @param type: 模块类型 * @param instance: 模块实例 * @retval HAL 状态码 */ hal_ret_t bsp_module_init(bsp_module_type_t type, uint8_t instance); /** * @brief 反初始化指定的 BSP 模块 * @param type: 模块类型 * @param instance: 模块实例 * @retval HAL 状态码 */ hal_ret_t bsp_module_deinit(bsp_module_type_t type, uint8_t instance); /** * @brief 配置指定的 BSP 模块 * @param type: 模块类型 * @param instance: 模块实例 * @param config: 模块配置数据 * @param size: 模块配置大小 * @retval HAL 状态码 */ hal_ret_t bsp_module_configure(bsp_module_type_t type, uint8_t instance, void* config, size_t size); /** * @brief 启动指定的 BSP 模块 * @param type: 模块类型 * @param instance: 模块实例 * @retval HAL 状态码 */ hal_ret_t bsp_module_start(bsp_module_type_t type, uint8_t instance); /** * @brief 停止指定的 BSP 模块 * @param type: 模块类型 * @param instance: 模块实例 * @retval HAL 状态码 */ hal_ret_t bsp_module_stop(bsp_module_type_t type, uint8_t instance); /** * @brief 复位指定的 BSP 模块 * @param type: 模块类型 * @param instance: 模块实例 * @retval HAL 状态码 */ hal_ret_t bsp_module_reset(bsp_module_type_t type, uint8_t instance); /** * @brief 获取指定 BSP 模块的状态 * @param type: 模块类型 * @param instance: 模块实例 * @param state: 存储模块状态的指针 * @retval HAL 状态码 */ hal_ret_t bsp_module_get_state(bsp_module_type_t type, uint8_t instance, bsp_module_state_t* state); /** * @brief 控制指定的 BSP 模块 * @param type: 模块类型 * @param instance: 模块实例 * @param cmd: 控制命令 * @param param: 控制参数 * @retval HAL 状态码 */ hal_ret_t bsp_module_control(bsp_module_type_t type, uint8_t instance, uint32_t cmd, void* param); /** * @brief 获取指定的 BSP 模块 * @param type: 模块类型 * @param instance: 模块实例 * @retval 指向模块结构体的指针,未找到返回 NULL */ bsp_module_t* bsp_module_get(bsp_module_type_t type, uint8_t instance); /** * @brief 获取指定类型的所有模块 * @param type: 模块类型 * @retval 指向模块列表的指针,未找到模块返回 NULL */ bsp_module_t* bsp_module_get_by_type(bsp_module_type_t type); /** * @brief 通过名称获取模块 * @param name: 模块名称 * @retval 指向模块结构体的指针,未找到返回 NULL */ bsp_module_t* bsp_module_get_by_name(const char* name); /** * @brief 获取注册模块的总数 * @retval 注册模块的数量 */ uint32_t bsp_module_get_count(void); /** * @brief 检查模块的所有依赖是否满足 * @param module: 指向模块结构体的指针 * @retval HAL 状态码 */ hal_ret_t bsp_module_check_dependencies(const bsp_module_t* module); /** * @brief 获取模块管理器实例 * @retval 指向模块管理器结构体的指针 */ bsp_module_manager_t* bsp_module_get_manager(void); /** * @brief 注册模块事件回调 * @param type: 模块类型 * @param instance: 模块实例 * @param callback: 事件回调函数 * @retval HAL 状态码 */ hal_ret_t bsp_module_register_event_callback(bsp_module_type_t type, uint8_t instance, bsp_module_event_callback_t callback); /** * @brief 触发模块事件 * @param module: 指向模块结构体的指针 * @param event: 要触发的事件 * @param data: 事件数据 * @retval HAL 状态码 */ hal_ret_t bsp_module_trigger_event(const bsp_module_t* module, uint32_t event, void* data); /** * @brief 按优先级范围查找模块 * @param min_priority: 最低优先级 * @param max_priority: 最高优先级 * @param count: 存储找到的模块数量的指针 * @retval 指向模块指针数组的指针,未找到模块返回 NULL */ bsp_module_t** bsp_module_find_by_priority_range(bsp_module_priority_t min_priority, bsp_module_priority_t max_priority, uint32_t* count); /** * @brief 设置模块使能/禁用状态 * @param type: 模块类型 * @param instance: 模块实例 * @param enable: 使能标志 * @retval HAL 状态码 */ hal_ret_t bsp_module_set_enable(bsp_module_type_t type, uint8_t instance, uint8_t enable); /** * @brief 检查模块是否启用 * @param type: 模块类型 * @param instance: 模块实例 * @param enable: 存储使能状态的指针 * @retval HAL 状态码 */ hal_ret_t bsp_module_is_enabled(bsp_module_type_t type, uint8_t instance, uint8_t* enable); /** * @brief 设置模块优先级 * @param type: 模块类型 * @param instance: 模块实例 * @param priority: 新优先级 * @retval HAL 状态码 */ hal_ret_t bsp_module_set_priority(bsp_module_type_t type, uint8_t instance, bsp_module_priority_t priority); /** * @brief 获取模块优先级 * @param type: 模块类型 * @param instance: 模块实例 * @param priority: 存储优先级的指针 * @retval HAL 返回码 */ hal_ret_t bsp_module_get_priority(bsp_module_type_t type, uint8_t instance, bsp_module_priority_t* priority); #endif /* BSP_MODULE_H */