Flipper Zero Unleashed 固件 GPIO 测试用例全解析:手动控制与 5V OTG 供电验证指南
Flipper Zero Unleashed 固件 GPIO 测试用例全解析手动控制与 5V OTG 供电验证指南【免费下载链接】unleashed-firmwareFlipper Zero Unleashed Firmware项目地址: https://gitcode.com/GitHub_Trending/un/unleashed-firmware本文以 Unleashed 固件仓库中的 GPIO 测试用例文档 为骨架结合 GPIO 应用源码applications/main/gpio与底层硬件抽象实现系统讲解 GPIO Manual Control手动控制场景的完整测试流程如何通过菜单进入测试界面、如何切换并驱动外接引脚电平、如何开启 5V OTG 供电并验证 LED 指示灯以及每一步背后的源码实现原理。读者完成阅读后将能够独立搭建 ST-Link 测试环境按测试用例逐项验证 GPIO 输出功能并能对照源码理解引脚枚举、模式切换与 OTG 供电的底层机制。一、测试用例背景与适用场景该测试用例属于仓库 documentation/testing 目录下的硬件功能验证体系用于验证 Flipper Zero 对外排针GPIO Header的输出控制能力。它覆盖两个核心验证点引脚电平手动控制验证 GPIO 应用能否将排针上的用户可用引脚切换为推挽输出模式并通过按键将其拉高/拉低5V 供电输出OTG验证设备能否通过板载充电管理芯片BQ25896启用 OTG 模式在 GPIO 的 5V 排针上输出 5V 电源并驱动外接 LED 指示灯。该用例的典型执行场景包括固件改动后的硬件回归测试、新硬件目标如 F7/F18 开发板的 GPIO 输出验证以及使用 ST-Link 等外接调试板时的供电链路检查。二、测试前置条件与硬件准备2.1 进入 GPIO 应用在 Flipper Zero 主菜单中导航至GPIO → Manual Control即可进入 GPIO 手动控制场景。从源码看这一路径由 gpio_scene_start.c 中的场景初始化逻辑定义启动场景是一个可变项列表VariableItemList依次提供三个入口USB-UART Bridge对应GpioItemUsbUartGPIO Manual Control对应GpioItemTest即本文的测试对象5V on GPIO对应GpioItemOtgOTG 开关见第四节。当用户选中 GPIO Manual Control 并按下确认键时回调gpio_scene_start_var_list_enter_callback会发送自定义事件GpioStartEventManualControl随后gpio_scene_start_on_event将其转入GpioSceneTest场景最终由 gpio_scene_test.c 完成界面切换。注整个 GPIO 应用在 application.fam 中声明为apptypeFlipperAppType.MENUEXTERNAL、fap_categoryGPIO入口函数为gpio_app可作为独立 FAP 应用扩展应用从应用商店/外部加载也可内置于固件。2.2 连接 ST-Link 开发板与 LED测试用例要求将 ST-Link 开发板插入 Flipper 的 GPIO 排针并在对应引脚上接入不同颜色的 LED硬件连接ST-Link 开发板的引脚与 Flipper GPIO 排针物理对接注意排针间距与引脚编号对齐LED 接入在不同 GPIO 输出引脚上分别串联限流电阻接入不同颜色的 LED如红、绿、蓝用于直观区分多个引脚的电平状态5V 供电链路确认测试用例中开启 5V步骤所需的外部 LED 供电指示灯下文第四节连接正确。预期结果 1进入测试界面后可以通过应用界面切换引脚并驱动其输出电平即pins are managed from the app——外接 LED 会随按键操作点亮/熄灭。三、GPIO Manual Control 测试步骤与源码级操作原理3.1 引脚列表的构建哪些引脚可被测试进入手动控制场景前应用会枚举设备上所有可用的 GPIO 引脚。这一步在 gpio_items_alloc 中完成GPIOItems* gpio_items_alloc(void) { GPIOItems* items malloc(sizeof(GPIOItems)); items-count 0; for(size_t i 0; i gpio_pins_count; i) { if(!gpio_pins[i].debug) { items-count; } } // ... 将非 debug 引脚复制到 items-pins }其核心逻辑是遍历全局引脚表gpio_pins[]定义于 targets/f7/furi_hal/furi_hal_resources.c只保留debug false的引脚即排除 SWD 调试口PA13/PA14、USART 串口PB6/PB7、iButtonPB14以及标注为 Dangerous 的引脚PB8 扬声器、PB9 红外发射管。最终暴露给用户的可用引脚F7 目标为排针编号引脚名备注2PA7支持 ADCCH12与 PWMTIM13PA6支持 ADCCH114PA4支持 ADCCH9与 PWMLPTIM25PB3纯数字引脚6PB2纯数字引脚7PC3支持 ADCCH415PC1支持 ADCCH216PC0支持 ADCCH1引脚编号与排针丝印对应1 号为 5V、8/11/18 号为 GND、9 号为 3V3不参与输出控制。引脚表的末尾还列出了 PB8扬声器与 PB9红外发射两个number 0的危险引脚它们被标记为debug true因此在手动控制界面中不可选防止误操作损坏硬件。3.2 进入测试场景时的引脚初始化在 gpio_scene_test_on_enter 中进入场景的第一件事是把所有用户引脚统一配置为推挽输出void gpio_scene_test_on_enter(void* context) { GpioApp* app context; gpio_items_configure_all_pins(app-gpio_items, GpioModeOutputPushPull); gpio_test_set_ok_callback(app-gpio_test, gpio_scene_test_ok_callback, app); view_dispatcher_switch_to_view(app-view_dispatcher, GpioAppViewGpioTest); }gpio_items_configure_all_pinsgpio_items.c内部逐个调用gpio_items_configure_pin其实现为void gpio_items_configure_pin(GPIOItems* items, uint8_t index, GpioMode mode) { furi_assert(index items-count); furi_hal_gpio_write(items-pins[index].pin, false); // 先拉低避免上电瞬间抖动 furi_hal_gpio_init(items-pins[index].pin, mode, GpioPullNo, GpioSpeedVeryHigh); }关键点每次配置前先把引脚写为低电平false确保进入测试界面时所有 LED 熄灭、无意外高电平输出配置使用GpioModeOutputPushPull推挽输出、GpioPullNo无上下拉、GpioSpeedVeryHigh非常高速保证输出驱动能力与翻转速度满足 LED 直驱测试需求。相应地退出测试场景时 gpio_scene_test_on_exit 会把所有引脚恢复为GpioModeAnalog模拟模式释放对引脚的控制权避免与后续 USB-UART 桥接等其他功能冲突。3.3 界面操作切换引脚与驱动电平测试界面由 gpio_test.c 实现屏幕顶部显示 GPIO Output Mode Test并提示 Press or to change pin。操作逻辑如下按键动作源码位置左键切换到上一个引脚pin_idx--到 0 后不再递减gpio_test_process_left右键切换到下一个引脚当pin_idx等于引脚总数时进入特殊项ALLgpio_test_process_rightOK 按下Press将当前选中引脚拉高gpio_items_set_pin(..., true)若选中 ALL 则全部引脚同时拉高gpio_test_process_okOK 松开Release将当前选中引脚拉低gpio_items_set_pin(..., false)ALL 同理全部拉低同上其中引脚名称由 gpio_items_get_pin_name 返回当索引等于引脚总数时返回字符串ALL实现一键全测能力。测试操作示例进入 Manual Control 界面后按右键在 PA7 → PA6 → PA4 → PB3 → PB2 → PC3 → PC1 → PC0 → ALL 之间循环切换选中某个引脚后按住 OK 键该引脚输出高电平对应 LED 点亮松开 OK 键引脚恢复低电平LED 熄灭切换到 ALL 后按住 OK全部 8 个可用引脚的 LED 应同时点亮可用于快速确认整排引脚输出通道完好观察每个引脚对应的 LED 是否与界面当前显示的引脚名一致逐一比对排针编号完成全量验证。扩展提示按住 OK 期间gpio_scene_test_ok_callback 会同步向通知服务发送sequence_set_green_255使设备背光 LED 变为绿色松开后发送sequence_reset_green恢复——即按压 OK 时 LED 变绿可作为输出已使能的额外视觉反馈。预期结果对应测试用例第 3 步pins are managed from the app——所有 LED 的状态完全由应用内的按键操作驱动且与界面显示的当前引脚一致。四、5V on GPIOOTG 供电开启与验证4.1 操作步骤在 GPIO 应用启动场景中选中5V on GPIO项在OFF / ON两个取值间切换gpio_scene_start.c 中gpio_otg_text[] {OFF, ON}选择 ONGPIO 排针的 5V 引脚排针 1 号开始输出 5V 电源。预期结果对应测试用例第 4 步外接的供电指示灯LED亮起表明 5V 输出链路正常。4.2 源码级原理BQ25896 的 OTG 升压控制5V on GPIO 并非简单的 GPIO 输出而是通过电源管理芯片 BQ25896 的 OTGOn-The-Go升压模式实现。相关调用链如下界面回调 gpio_scene_start_var_list_change_callback 在 ON/OFF 切换时发送GpioStartEventOtgOn/GpioStartEventOtgOff自定义事件场景事件处理 gpio_scene_start_on_event 分别调用power_enable_otg(app-power, true/false)power_enable_otg是电源服务对硬件抽象层furi_hal_power_enable_otg的封装后者实现在 targets/f7/furi_hal/furi_hal_power.cbool furi_hal_power_enable_otg(void) { furi_hal_i2c_acquire(furi_hal_i2c_handle_power); bq25896_set_boost_lim(furi_hal_i2c_handle_power, BoostLim_2150); // 升压电流限流临时提升 bq25896_enable_otg(furi_hal_i2c_handle_power); // 使能 OTG 升压 furi_delay_ms(30); bool ret bq25896_is_otg_enabled(furi_hal_i2c_handle_power); // 回读确认 bq25896_set_boost_lim(furi_hal_i2c_handle_power, BoostLim_1400); // 恢复 1.4A 限流 furi_hal_i2c_release(furi_hal_i2c_handle_power); return ret; }实现要点对应 lib/drivers/bq25896.c 中的寄存器操作OTG 模式下 BQ25896 将电池电压升压到 5V 输出到 VBUS/5V 排针因此无需外接电源即可为 ST-Link 等外部设备供电使能前将 Boost 限流临时提高到BoostLim_21502.15A以应对启动浪涌回读确认 OTG 已启用后再恢复为BoostLim_14001.4A正常运行限流关闭时调用furi_hal_power_disable_otgfuri_hal_power.c内部执行bq25896_disable_otg界面初始显示值由 power_is_otg_enabled 读取 BQ25896 的 OTG 状态位决定保证 UI 与硬件状态一致。安全提示5V 排针在 OTG 开启时持续供电测试完毕后应回到 5V on GPIO 切回 OFF避免在连接敏感外设时长时间误供电同时 1.4A 的 Boost 限流决定了外接负载不能超过安全范围使用时应参考 BQ25896 数据手册与 DangerousSettings.md 中的相关警告。五、测试判定标准与常见问题排查5.1 通过标准汇总测试项操作通过标准引脚枚举进入 Manual Control界面仅显示 8 个用户可用引脚PA7/PA6/PA4/PB3/PB2/PC3/PC1/PC0不含 SWD/USART/iButton 引脚单引脚输出选中引脚后按住 OK对应 LED 点亮松开 OK 后熄灭按压期间设备 LED 变绿ALL 全引脚输出切换到 ALL 后按住 OK全部 8 路 LED 同时点亮/熄灭引脚标识正确性逐一切换并核对排针编号界面引脚名与物理排针位置一一对应5V OTG 供电5V on GPIO 切到 ON外接供电指示灯亮起切回 OFF 后熄灭引脚恢复退出 Manual Control所有引脚恢复模拟模式不影响其他外设功能5.2 常见问题排查进入 Manual Control 后 LED 全部不亮确认推挽输出初始化成功检查 gpio_scene_test_on_enter 中GpioModeOutputPushPull是否被后续流程覆盖并核对 LED 极性——推挽输出在 OK 按下时输出高电平LED 正极应接引脚、负极经限流电阻接地ALL 选项缺失或引脚数量不符检查目标平台的 furi_hal_resources.c 引脚表定义。不同硬件目标如 f18的引脚表不同应用会根据gpio_pins_count自动适配5V 输出指示灯不亮确认电池有足够电量OTG 升压依赖电池并查看 furi_hal_power.c 中bq25896_is_otg_enabled的回读结果若返回 false 说明升压未建立需检查电池电压与 BQ25896 寄存器状态退出后引脚仍保持输出状态正常退出场景会执行GpioModeAnalog恢复若异常复位导致引脚状态残留重启设备即可恢复默认配置系统启动时会重新初始化 GPIO。六、扩展阅读GPIO 应用源码包含场景管理scenes、测试视图views/gpio_test.c、USB-UART 桥接usb_uart_bridge.c等完整实现gpio_items.c引脚枚举、模式配置与电平控制的统一封装furi_hal_resources.cF7 目标全局引脚表含 ADC 通道、PWM 输出、引脚编号与危险标记furi_hal_power.cOTG 使能/查询/关闭的硬件抽象实现bq25896.c充电管理芯片寄存器级驱动同类测试用例可参考 documentation/testing 目录下的 general_test_cases.md、integration_tests.md 等文档形成完整的硬件回归测试矩阵。【免费下载链接】unleashed-firmwareFlipper Zero Unleashed Firmware项目地址: https://gitcode.com/GitHub_Trending/un/unleashed-firmware创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →