/** * @file board_config.h * @author LokLiang * @brief 统一板载硬件描述数据结构 * @version 0.1 * @date 2023-11-24 * * @copyright Copyright (c) 2023 * * 目的与作用场景: * 使同类型的固件适应不同的硬件版本。 * 例如同一类型产品,即使某些功能引脚改动,依然可以根据配置文件正确引导程序,而不需要新增特定的固件版本,旧的产品依然得到长期的支持。 * * 数据设置: * 只能在工厂中配置,除此之外不允许任何手段尝试修改。 * 数据地址固定为分区配置中 * */ #pragma once #define CONFIG_LICENSE_CODE_LENGTH 16 /* 在烧录器设置的保存滚码的字段长度(g_license_code 指向的数据的实际长度) */ #define CONFIG_CFG_BOARD_PARTITION_NAME "bcfg" /* 对应自定义分区表 partitions.csv 中的 Name 字段 */ #define CONFIG_CFG_BOARD_PARTITION_TYPE 0x40 /* 对应自定义分区表 partitions.csv 中的 Type 字段 */ #define CONFIG_CFG_BOARD_PARTITION_SUBTYPE 0x00 /* 对应自定义分区表 partitions.csv 中的 SubType 字段 */ #include "drivers/chip/_hal.h" #include "sdkconfig.h" #define GPIO_USED(pin) ((pin) < 255) #if (CONFIG_IDF_TARGET_ESP32S3) /* 带 OTG 的平台 */ #define CAP_USBOTG 1 #else #define CAP_USBOTG 0 #endif typedef struct // 对应 GPIO 单个引脚的输入/输出配置的基础定义 { uint8_t pin; // 引脚号 (0~254, 255 表示不使用) uint8_t en_lev; // 触发电平 } cfg_board_pin_io_t; typedef struct // LED: WS2812 { hal_id_t spi_id; // 模拟 PWM 用的 SPI uint8_t strip_pin[4]; // 用于驱动灯带的输出引脚。[0] 为默认脚,[1..3] 为附加的另外几路,非 255 表示有效,程序根据这些脚判断接多少根灯带 uint8_t bat_led_pin; // 用于指示电池电量的 LED 灯,非 255 表示有效 uint8_t rf_status_pin; // 板上用于指示状态的 RGB 灯珠,非 255 表示有效 } cfg_board_led_spi_t; typedef enum __packed // 用于与飞控通讯的数据接口 { CFG_BOARD_FC_PORT_UART = 0, // 使用串口与飞控通讯 CFG_BOARD_FC_PORT_USBH, // 使用 USB Host 与飞控通讯 } cfg_board_fc_port_t; typedef struct // 数据结构一旦定下不可随意变更 { char firmware_str[7]; char platform_str[13]; char board_name[32]; /* 硬件描述类 */ hal_uart_hdl_t uart_console; // 控制台 hal_uart_hdl_t uart_fc; // 与飞控连接的串口 cfg_board_led_spi_t led_spi; // LED cfg_board_fc_port_t fc_port_type; // 用于与飞控通讯的数据接口 struct // ISP 控制脚 { uint8_t nrst; // 复位控制引脚 uint8_t boot0; // boot0 控制引脚 } io_isp; struct // USB OTG 引脚 { uint8_t usb_dm; uint8_t usb_dp; } io_usb; cfg_board_pin_io_t detect_usb; // 输入检测:检测飞控 USB 插入,有效电平为插入电平 cfg_board_pin_io_t key_reset; // 按键检测:开机时长安 10 秒恢复出厂设置的按键,有效电平为按下电平 cfg_board_pin_io_t key_led_strip_switch; // 按键检测:切换灯带效果,适用于灯带固件,有效电平为按下电平 cfg_board_pin_io_t key_rf_switch; // 按键检测:切换射频数据接口,适用于固定翼无线 USB 板,有效电平为按下电平 cfg_board_pin_io_t key_9v_switch; // 按键检测:9伏电源开关控制,适用 F7V4, 有效电平为按下电平 cfg_board_pin_io_t sw_led_strip; // 灯带控制主机的切换控制引脚,有效电平为切换为本模块控制的电平 cfg_board_pin_io_t sw_pwr_9v; // 9V 电源输出控制引脚,有效电平为打开 9V 电源的电平 cfg_board_pin_io_t sw_usb; // USB 切换的模拟开关,有效电平为切换为本模块控制的电平 cfg_board_pin_io_t led_rf_status; // 射频指示灯,单色 LED. 引脚号值为 0 时,射频连接状态通过灯带展示,值为非 0 时,射频连接状态通过这个引脚控制的 LED 展示,有效电平为点亮电平 cfg_board_pin_io_t led_strip_on; // 灯带控制主机切换的指示灯,有效电平为点亮电平 cfg_board_pin_io_t led_bat[4]; // 电池电量指示灯,有效电平为点亮电平 /* 产品功能描述类 */ } cfg_board_t; extern const uint8_t *g_license_code; // 在烧录器设置的保存滚码的字段,其对应的长度为 CONFIG_LICENSE_CODE_LENGTH extern const cfg_board_t *g_cfg_board; // 配置数据 int board_cfg_init(void); // 初始化,使 g_cfg_board 指向正确的 int board_license_fresh(const uint8_t license_code[CONFIG_LICENSE_CODE_LENGTH]); // 更新激活码 int board_cfg_fresh(const cfg_board_t *cfg); // 更新设置 int board_cfg_dump(const cfg_board_t *cfg);