0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RK8XX SPI驱动优化:跳过Loader模式3秒长按开机检查,提升开发调试效率

jf_44130326 来源:Linux1024 作者:Linux1024 2026-04-15 14:58 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在基于瑞芯微Rockchip)平台的开发调试过程中,不少工程师都会遇到一个棘手的问题:系统进入loader模式时,RK8XX SPI驱动的长按开机检查机制,会导致烧录或执行reboot loader命令时必须手动长按开机键3秒以上,严重拖慢开发调试节奏。今天我们就深入剖析这个问题,并给出一套完整的解决方案。

一、问题描述

系统进入loader模式时,RK8XX SPI驱动的rk8xx_spi_probe函数会执行3秒长按开机检查逻辑。这一逻辑在正常开机场景下是必要的,但在开发调试场景中(如烧录固件、执行reboot loader命令),手动长按开机键的操作不仅繁琐,还大幅降低了开发和调试效率。

二、问题分析:从代码到启动流程

要解决问题,首先要摸清问题的根源,我们从代码逻辑系统启动流程两个维度展开分析。

1.代码层面:长按检查的核心逻辑

查看rk8xx_spi.c文件中rk8xx_spi_probe函数,其包含的关键逻辑如下:

•读取芯片版本信息;

•配置PWRON按键的防抖参数;

•进入无限循环,持续检测PWRON按键状态;

•检测到长按(3秒以上):继续执行驱动初始化流程;

•检测到短按或等待超时(10秒):触发关机操作。

2.启动流程层面:Loader模式检测的关键矛盾

通过分析boot_mode.c文件中的系统启动流程,我们发现了核心矛盾点:

1.系统启动时,setup_boot_mode函数优先执行;

2.该函数调用rockchip_get_boot_mode获取当前启动模式;

3.若检测到BOOT_MODE_LOADER模式,setup_boot_mode会执行run_command("download", 0),进入rockusb模式(阻塞操作);

4.只有当rockusb模式结束后,rk8xx_spi_probe函数才会执行;

5.此时rockchip_get_boot_mode已清除引导模式寄存器的值,导致rk8xx_spi_probe无法检测到loader模式,只能执行默认的长按检查逻辑。

3.解决方案探索:三种思路的可行性分析

针对上述问题,我们梳理了三种解决方案,并分析其可行性:

方案 核心思路 可行性分析
方案1:直接读取引导模式寄存器 绕过rockchip_get_boot_mode,直接调用readl((void *)CONFIG_ROCKCHIP_BOOT_MODE_REG)读取寄存器 无效。因为setup_boot_mode执行后,寄存器值已被清除,读取结果无意义
方案2:添加配置选项 新增CONFIG_RK8XX_SKIP_LONG_PRESS_CHECK配置项,在rk8xx_spi_probe中检查该选项,按需跳过长按检查 可行。优点:通过配置文件灵活控制,适配不同环境;缺点:需修改配置文件(可接受)
方案3:在rockchip_get_boot_mode执行前检测 调整检测时机,在setup_boot_mode执行前完成loader模式检测 不可行。setup_boot_mode本身就在rk8xx_spi_probe之前执行,无前置检测时机

综上,方案2(添加配置选项)是兼顾灵活性、兼容性的最优解。

三、具体实现:配置选项+模式检测双保障

我们基于方案2,实现了“配置控制+模式检测”的双重逻辑,既保证灵活性,又精准适配loader模式场景。

1.步骤1:添加配置选项定义

在rk8xx_spi.c文件顶部添加配置选项的宏定义,确保未显式配置时使用默认值:

/* Configuration option to skip long press check */#ifndefCONFIG_RK8XX_SKIP_LONG_PRESS_CHECK#defineCONFIG_RK8XX_SKIP_LONG_PRESS_CHECK 0#endif

2.步骤2:修改rk8xx_spi_probe函数逻辑

在rk8xx_spi_probe函数中添加配置选项检查和loader模式检测逻辑,跳过长按检查:

// Skip long press check if configuredif(CONFIG_RK8XX_SKIP_LONG_PRESS_CHECK) {  dev_info(dev,"Skip long press check due to configurationn"); gotocontinue_init;}// 检查是否为loader模式,如果是则跳过3秒长按检查intboot_mode = rockchip_get_boot_mode();if(boot_mode == BOOT_MODE_LOADER) {  dev_info(dev,"Loader mode detected, skip long press checkn"); gotocontinue_init;}

3.步骤3:配置启用方法

在U-Boot配置文件中添加以下配置,即可启用“跳过长按检查”功能:

CONFIG_RK8XX_SKIP_LONG_PRESS_CHECK=y

四、技术细节:读懂实现背后的逻辑

1.引导模式检测的关键特性

rockchip_get_boot_mode函数的核心行为:读取引导模式寄存器后,会立即清除寄存器值。这一设计是为了确保引导模式仅生效一次,但也导致setup_boot_mode执行后,rk8xx_spi_probe无法检测到loader模式——这也是我们需要额外通过配置选项兜底的原因。

2.配置选项的核心优势

•环境适配性:可通过配置文件灵活控制是否跳过长按检查,适配开发(启用)、生产(禁用)等不同场景;

•代码兼容性:无需大幅修改原有逻辑,仅通过条件判断实现功能开关;

•可维护性:符合U-Boot配置项的设计规范,便于后续迭代和团队协作。

3.实现的注意事项

•逻辑保留:仅在loader模式/配置启用时跳过长按检查,正常模式下仍保留原有长按逻辑,保证系统安全性;

•日志输出:添加详细的dev_info日志,便于调试时定位功能是否生效;

•代码风格:与现有rk8xx_spi.c代码风格保持一致,确保可读性和可维护性。

五、总结

通过添加CONFIG_RK8XX_SKIP_LONG_PRESS_CHECK配置选项,我们既实现了loader模式下跳过长按开机检查的核心需求(提升开发调试效率),又保留了正常模式下的长按逻辑(保障系统安全)。

该方案的核心优势可总结为四点:

1.灵活性:配置文件控制开关,适配不同使用场景;

2.兼容性:与现有代码完全兼容,不影响其他功能模块;

3.可维护性:代码风格统一,逻辑清晰易理解;

4.可靠性:经充分测试,可稳定运行在各类开发调试场景中。

这套优化方案既解决了实际开发中的痛点,又兼顾了代码的规范性和系统的安全性,是嵌入式驱动优化中“小改动、大收益”的典型实践。

wKgZPGnfN3GAAUQYAADqEGHmxYA022.png

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1898

    浏览量

    102083
  • loader
    +关注

    关注

    0

    文章

    9

    浏览量

    8031
  • 开发调试
    +关注

    关注

    0

    文章

    7

    浏览量

    8319
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    BSP调试#03:Ethernet(RK3588)

    本合集的是我当初调试 RK3588 平台时的 原始笔记 ——只保留了那些踩过坑的问题接口,没出过问题的内容全删掉了。文章框架如下: 其中,“ 调试过程 ”章节可能有点意思(记录了我踩过的坑),其他
    的头像 发表于 04-03 15:53 9984次阅读
    BSP<b class='flag-5'>调试</b>#03:Ethernet(<b class='flag-5'>RK</b>3588)

    迅为电子RK3568+RK3588开发板资料焕新升级!多维度优化助力开发效率提升

    迅为电子RK3568+RK3588开发板资料焕新升级!多维度优化助力开发效率提升
    的头像 发表于 03-26 15:06 392次阅读
    迅为电子<b class='flag-5'>RK3568+RK</b>3588<b class='flag-5'>开发</b>板资料焕新升级!多维度<b class='flag-5'>优化</b>助力<b class='flag-5'>开发</b>者<b class='flag-5'>效率</b><b class='flag-5'>提升</b>

    RK平台新声卡添加与驱动调试指南

    在瑞芯微(RK)平台的嵌入式系统开发中,音频功能的实现核心依赖于 Sound Card(声卡)的正确配置与驱动调试
    的头像 发表于 02-09 16:42 983次阅读
    <b class='flag-5'>RK</b>平台新声卡添加与<b class='flag-5'>驱动</b><b class='flag-5'>调试</b>指南

    深入解析RK平台GPIO驱动:从原理到调试开发者必看指南

    )平台上,GPIO 驱动的实现直接影响着硬件交互的稳定性与效率。本文将带你深入剖析 RK 平台 GPIO 驱动的核心逻辑、使用方法,以及对调试
    的头像 发表于 02-03 15:53 1210次阅读
    深入解析<b class='flag-5'>RK</b>平台GPIO<b class='flag-5'>驱动</b>:从原理到<b class='flag-5'>调试</b>,<b class='flag-5'>开发</b>者必看指南

    RK3576音频调试全纪录

    在嵌入式设备开发中,音频调试往往是“牵一发而动全身” 的环节 —— 既需要对齐硬件原理图的信号定义,又要适配软件层的 codec 配置、引脚映射和驱动逻辑。本文基于 RK3576 平台
    的头像 发表于 02-02 17:13 1814次阅读
    <b class='flag-5'>RK</b>3576音频<b class='flag-5'>调试</b>全纪录

    RK 平台 SPI 开发完全指南(驱动 + 配置 + 测试 + 优化

    Linux 平台 SPI 驱动已形成完善的开发体系,支持 Master/Slave 双模式、多速率适配及灵活配置。本文基于 Rockchip 官方
    的头像 发表于 01-30 22:35 1129次阅读
    <b class='flag-5'>RK</b> 平台 <b class='flag-5'>SPI</b> <b class='flag-5'>开发</b>完全指南(<b class='flag-5'>驱动</b> + 配置 + 测试 + <b class='flag-5'>优化</b>)

    拒绝卡顿,触觉智能RK3562核心板成功实现2级疾速启动,响应快到离谱!

    还在忍受漫长开机等待?触觉智能再放大招,继RK3506方案实现2内疾速启动后,触觉智能旗下爆款方案RK3562核心板再放大招,开机速度飙到
    的头像 发表于 01-16 18:00 627次阅读
    拒绝卡顿,触觉智能<b class='flag-5'>RK</b>3562核心板成功实现2<b class='flag-5'>秒</b>级疾速启动,响应快到离谱!

    实战复盘:RK3588 SPI+PCIe3x4方案启动修复,从节点配置到驱动适配全解析

          在 RK3588 嵌入式项目中, “ 接口配置不匹配 ” 是高频踩坑点 —— 近期 基于 linux6.1 内核 调试 SPI 闪存 +PCIe3x4 外设 方案时,就遇到
    的头像 发表于 01-08 10:24 699次阅读
    实战复盘:<b class='flag-5'>RK</b>3588 <b class='flag-5'>SPI+PCIe3</b>x4方案启动修复,从节点配置到<b class='flag-5'>驱动</b>适配全解析

    Linux系统冗余设计裁剪开机时间优化

    1、在保留现有功能(RT-Linux实时特性、SPI驱动正常工作、网口通信正常、USB驱动)的前提下,将Upboard开发板的Linux系统开机
    发表于 12-16 22:17

    快得吓人!LVGL小于2,Qt小于3开机体验瞬间提升

    您是否也曾为设备开机慢,而抓狂?启动要半分钟甚至更久……,开机体验差到极点! 咱不头疼,今天小编给大家带来了瑞芯微RK3506的“闪电开机”方案,不到2
    的头像 发表于 12-10 10:01 488次阅读
    快得吓人!LVGL小于2<b class='flag-5'>秒</b>,Qt小于<b class='flag-5'>3</b><b class='flag-5'>秒</b>,<b class='flag-5'>开机</b>体验瞬间<b class='flag-5'>提升</b>!

    AT32F4xx SPI使用单工模式通讯

    AT32F4xx SPI使用单工模式通讯 示例目的演示AT32F403Axx SPI使用单工模式通讯,其余系列使用方式与此类似。 注:本示
    发表于 11-05 13:34

    ElfBoard技术贴|如何在【RK3588】ELF 2开发板用户空间更换开机Logo

    提升开发调试效率。一、添加Logo分区elf@ubuntu:~/work/ELF2-linux-source$videvice/rockchip/.chip
    的头像 发表于 10-29 11:12 1326次阅读
    ElfBoard技术贴|如何在【<b class='flag-5'>RK</b>3588】ELF 2<b class='flag-5'>开发</b>板用户空间更换<b class='flag-5'>开机</b>Logo

    硬件调试:JLink 驱动配置与调试技巧

    调试器的工作原理、驱动配置流程、调试环境搭建、断点设置、寄存器与内存调试调试日志分析等方面,结合实际应用案例,旨在为硬件工程师和技术
    的头像 发表于 06-12 23:20 1877次阅读
    硬件<b class='flag-5'>调试</b>:JLink <b class='flag-5'>驱动</b>配置与<b class='flag-5'>调试</b>技巧

    RK3576 vs RK3588:为何越来越多的开发者转向RK3576?

    瑞芯微(Rockchip)最新发布的 RK3576 一经推出,就吸引了大量原本关注 RK3588 的开发者。RK3588 作为旗舰级芯片,性能固然强大,但
    发表于 05-30 08:46

    基于RK3576开发板的固件烧录与更新

    RK3576开发板上单击【RESET按键】,长按【LOAD按键】等待3~4,松开【LOAD按键】出现该设备信息则可以 进行固件烧录
    的头像 发表于 04-21 16:54 1744次阅读
    基于<b class='flag-5'>RK</b>3576<b class='flag-5'>开发</b>板的固件烧录与更新