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

电子说

1.4w人已加入

描述

在基于瑞芯微(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 */#ifndef CONFIG_RK8XX_SKIP_LONG_PRESS_CHECK#define CONFIG_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");    goto continue_init;}// 检查是否为loader模式,如果是则跳过3秒长按检查int boot_mode = rockchip_get_boot_mode();if (boot_mode == BOOT_MODE_LOADER) {    dev_info(dev, "Loader mode detected, skip long press checkn");    goto continue_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.可靠性:经充分测试,可稳定运行在各类开发调试场景中。

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

开发调试

审核编辑 黄宇

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分