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

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

3天内不再提示

在U-Boot中为RK3588添加SARADC检测:从零到一的硬件识别方案

jf_44130326 来源:Linux1024 2026-02-05 13:50 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

嵌入式开发中,我们经常需要在系统启动的早期阶段(U-Boot)识别硬件版本或配置。本文将详细介绍如何在U-Boot中为RK3588平台添加SARADCSuccessive Approximation Register Analog-to-Digital Converter)检测功能,通过读取ADC电压值来区分不同的硬件版本,并将结果存入环境变量,为后续的启动流程提供依据。

wKgZO2kajESAKafNAAP3aQqbeVc822.png

核心思路与应用场景

为什么需要在U-Boot中做ADC检测?

U-Boot作为引导加载程序,运行在操作系统内核之前,拥有极高的硬件访问权限。在这个阶段进行ADC检测,可以实现:

硬件版本自动识别:通过读取主板上由电阻分压网络决定的ADC引脚电压,U-Boot可以判断出当前硬件的具体型号或版本。

动态配置加载:根据识别出的硬件版本,U-Boot可以加载不同的设备树(Device Tree)、启动参数或执行特定的初始化脚本,实现一镜像适配多硬件的目标。

故障诊断:检测关键电源电压或传感器状态,在启动早期发现硬件异常。

第一步:配置SARADC设备树(DTS)

要在U-Boot中使用SARADC,首先需要确保其设备树节点已正确配置并启用。

文件路径:u-boot/arch/arm/dts/rk3588-u-boot.dtsi

/* 在 rk3588-u-boot.dtsi 文件中找到并确认 saradc 节点 */&saradc { /*  * u-boot, dm-pre-reloc; 是一个关键属性,  * 它告诉 U-Boot 的驱动模型(Driver Model)  * 在 relocation(重定位)之前就初始化这个设备。  * 因为我们要在 board_init_f 阶段(重定位前)读取ADC,  * 所以必须添加此属性。  */  u-boot, dm-pre-reloc;  status ="okay";};

代码解读:

&saradc:引用主设备树中定义的saradc节点。

u-boot, dm-pre-reloc;:核心配置。确保SARADC驱动在U-Boot早期阶段(内存重定位前)就被初始化,这样我们才能在board_init_fboard_init_r中调用其功能。

status = "okay";:启用这个设备节点。

第二步:编写ADC检测逻辑

接下来,我们在板级初始化文件中添加实际的检测代码。

文件路径:u-boot/arch/arm/mach-rockchip/board.c

/* 在 board.c 文件的合适位置(如 board_init_r 函数之前)添加此函数 */voidsbc_id_detection(void){ /* 1. 定义变量 */ intclosest_level =7;// 默认的最高等级 unsignedintadc_value;// 存储原始ADC读数 (0-4095 for 12-bit) unsignedintvoltage_mv;// 转换后的电压值 (mV) /* 2. 定义电压区间与硬件版本的对应关系 */ /* 这是一个典型的电阻分压网络设计,不同的电阻组合产生不同的电压。   你需要根据自己的硬件原理图来修改这两个数组中的值。 */ constintmin_mv[] = {1640,1430,1220,1000,790, 560, 350, 0}; constintmax_mv[] = {1840,1630,1420,1200,990, 770, 550,250}; /* 3. 读取ADC通道3的值 */ /* "saradc" 是设备树中的节点名,3 是要读取的通道号 */ if(adc_channel_single_shot("saradc",3, &adc_value) ==0) {   /* 4. 将ADC原始值转换为电压值 (mV) */   /*     计算公式:Vout = Vin * (ADC_Value / 2^n)     - Vin (参考电压) = 1800 mV (根据瑞芯微文档)     - n (ADC位数) = 12 bits, 所以 2^12 = 4096    */    voltage_mv = (adc_value *1800) /4095;   /* 5. 根据电压值查找匹配的硬件等级 */   for(inti =0; i < 8; i++) {     if(voltage_mv >= min_mv[i] && voltage_mv <= max_mv[i]) {        closest_level = i;       break;// 找到后立即跳出循环      }    }   /* 6. 将检测结果存入U-Boot环境变量 */   /* 环境变量 SBCID 可以在后续的启动脚本中被读取和使用 */   env_set_ulong("SBCID", closest_level);      /* 调试信息,可以在串口终端看到 */   printf("SARADC: Voltage detected: %d mV, SBCID set to %dn", voltage_mv, closest_level);  }else{   /* 7. 处理ADC读取失败的情况 */   env_set("SBCID","unknown");   printf("SARADC: Failed to read from channel 3. SBCID set to 'unknown'n");  }}/** 将检测函数注册到U-Boot的初始化序列中。* board_init_r 是一个合适的位置,它在设备初始化完成后、* 环境变量初始化后、启动倒计时开始前执行。*/// 注意:具体的注册方式可能因U-Boot版本而异,// 请查阅你所用U-Boot版本的板级文件,找到合适的位置调用 sbc_id_detection();// 例如,在 board_r.c 的某个初始化函数中添加:// sbc_id_detection();

代码解读:

1.adc_channel_single_shot(): U-Boot提供的便捷API,用于单次读取指定ADC设备和通道的值。

2.电压换算:根据瑞芯微手册,SARADC的参考电压Vref1.8V1800mV)。代码将12位的ADC读数(范围0-4095)线性换算为实际电压。

3.等级匹配:通过for循环将计算出的电压值与预设的min_mvmax_mv数组进行比较,找到对应的硬件等级closest_level

4.环境变量:env_set_ulong()将检测到的等级存入名为SBCID的环境变量。这个变量非常关键,后续的启动脚本(如boot.cmd)就可以通过判断SBCID的值来执行不同的操作。

第三步:如何使用检测结果(参考)

检测结果SBCID已存入环境变量,现在你可以在U-Boot的启动脚本中灵活运用它。

文件路径:u-boot/board/rockchip/your_board/your_board.env(或类似的脚本文件)

# 在 U-Boot 启动脚本中,可以这样使用 SBCIDiftest${SBCID}-eq 0;then echo"Detected Board Version A. Loading corresponding Device Tree..."  setenv fdtfile rockchip/rk3588-board-version-a.dtbeliftest${SBCID}-eq 1;then echo"Detected Board Version B. Loading corresponding Device Tree..."  setenv fdtfile rockchip/rk3588-board-version-b.dtbelse echo"Detected unknown board or using default configuration."  setenv fdtfile rockchip/rk3588-board-default.dtbfi# 后续的 bootcmd 会使用 $fdtfile 变量来加载正确的设备树# run bootcmd

第四步:uboot 命令行中查看

bdinfo

关键要点与风险预案

1.时序问题:确保ADC检测函数在所有必要驱动初始化之后调用。board_init_r是一个安全的选择。

2.硬件依赖:此方案完全依赖于硬件设计。分压电阻的精度、焊接质量、以及ADC引脚的电气连接都会影响检测结果。

3.区间设计:在设计min_mvmax_mv数组时,要考虑到电阻容差和ADC采样误差,为每个区间留出足够的余量,避免电压值落在区间边界导致误判。

4.调试:在开发阶段,可以将printf语句打开,通过串口终端观察ADC的原始值、换算后的电压值以及最终的SBCID,这对于调试硬件和校准区间非常有帮助。

下一步

代码集成:将上述代码片段集成到您的U-Boot源码树中,并根据您的具体硬件原理图,精确调整min_mvmax_mv数组的值。

脚本优化:完善您的U-Boot启动脚本,利用SBCID环境变量实现更复杂的启动逻辑,例如加载不同的内核参数或根文件系统。

希望这篇文章能帮助您顺利完成U-Boot中的ADC检测功能开发。

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

    关注

    5209

    文章

    20629

    浏览量

    336790
  • adc
    adc
    +关注

    关注

    100

    文章

    7944

    浏览量

    556861
  • u-boot
    +关注

    关注

    0

    文章

    135

    浏览量

    39921
  • RK3588
    +关注

    关注

    8

    文章

    586

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Rockchip rk3588 U-Boot详解()

    Linux内核flash(NAND,NOR FLASH,SD,MMC 等)拷贝 DDR ,最后启动 Linux 内核。当然了,bootloader 的实际工作要复杂的多,但是它最主要的工作就是启动
    的头像 发表于 06-13 09:08 6966次阅读
    Rockchip <b class='flag-5'>rk3588</b> <b class='flag-5'>U-Boot</b>详解(<b class='flag-5'>一</b>)

    Rockchip rk3588 U-Boot详解 (二)

    Rockchip rk3588 U-Boot详解 (二) 专栏总目录 1.1 DM DM (Driver Model) 是 U-Boot 标准的 device-driver 开发模型,跟
    的头像 发表于 06-13 10:49 4836次阅读

    U-boot的基本介绍

    本文开始,将陆续推送“手把手教你移植U-boot”系列文章,目标是由浅入深地讲解U-boot的工作流程、原理、配置方法和移植方法,手把手教你完成U-boot的移植工作,默认
    发表于 07-14 16:52 4262次阅读
    <b class='flag-5'>U-boot</b>的基本介绍

    基于RK3588的NPU案例分享!6T是真的强!

    应用 图1目标识别跟踪:视频监控和无人驾驶领域,RK3588可提供6TOPS高性能NPU算力,可实时处理高清视频流、目标检测识别和跟踪
    发表于 07-17 10:55

    基于迅RK3568/RK3588开发板的AI图像识别方案

    https://www.bilibili.com/video/BV1G54y1A7nf/?spm_id_from=333.999.0.0 迅RK3568/RK3588开发板AI识别
    发表于 08-28 09:50

    如何在rk3588j上使用uboot命令行测试pwm驱动呢?

    我想在rk3588j上使用uboot命令行测试pwm驱动,u-boot/cmd/下添加了pwm.c,然后
    发表于 01-31 17:28

    RK3568/RK3588开发板人工智能AI摄像头识别功能方案

    RK3568以及RK3588开发板内置独立NPU,RK3588运算能力高达6TOPS,RK3568运算能力高达16TOPS算力支撑,高性
    发表于 03-27 14:56

    u-boot简介

    演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是根据相应的Linux内核源程序进行简化而形成的,尤其是些设备的驱动程序,这U-Boot源码的注
    发表于 10-14 11:17 3997次阅读

    rk3588是armv8吗?rk3588硬件资料

    rk3588是armv8吗?rk3588 硬件资料 RK3588款高性能处理器,是Rockchip公司推出的最新芯片。本文将详细介绍
    的头像 发表于 08-21 17:32 6197次阅读

    电子RK3588S与RK3588硬件性能区别及板卡选型

    电子RK3588S与RK3588硬件性能区别及板卡选型
    的头像 发表于 06-25 15:30 6571次阅读
    迅<b class='flag-5'>为</b>电子<b class='flag-5'>RK3588</b>S与<b class='flag-5'>RK3588</b><b class='flag-5'>硬件</b>性能区别及板卡选型

    RK3588!黑神话悟空,启动?-迅电子RK3588开发板

    RK3588!黑神话悟空,启动?-迅电子RK3588开发板
    的头像 发表于 08-30 14:13 2550次阅读
    <b class='flag-5'>RK3588</b>!黑神话悟空,启动?-迅<b class='flag-5'>为</b>电子<b class='flag-5'>RK3588</b>开发板

    rk3588硬件原理图

    RK3588硬件参考设计
    发表于 02-25 17:44 48次下载

    深入理解 RK3506 U-Boot 重定位:代码原理

    嵌入式系统U-Boot 作为引导加载程序,其启动流程的核心环节之就是 重定位(Relocation) 。对于 RK3506 这类基于
    的头像 发表于 11-28 07:05 958次阅读
    深入理解 <b class='flag-5'>RK</b>3506 <b class='flag-5'>U-Boot</b> 重定位:<b class='flag-5'>从</b>代码<b class='flag-5'>到</b>原理

    RK3588开发环境搭建“三步曲”,轻松上手!

    RK3588开发环境搭建“三步曲”,轻松上手!
    的头像 发表于 12-01 11:51 1317次阅读
    迅<b class='flag-5'>为</b><b class='flag-5'>RK3588</b>开发环境搭建“三步曲”,<b class='flag-5'>从</b><b class='flag-5'>零</b><b class='flag-5'>到</b><b class='flag-5'>一</b>轻松上手!

    深入解析RK3588 U-Boot板级文件:evb_rk3588.c核心逻辑拆解

    嵌入式开发领域,瑞芯微RK3588凭借超强的算力、丰富的接口和广泛的场景适配性,成为高端边缘计算、消费电子项目的热门选择。而U-Boot作为嵌入式系统的“第道门”,负责
    的头像 发表于 02-24 15:24 965次阅读
    深入解析<b class='flag-5'>RK3588</b> <b class='flag-5'>U-Boot</b>板级文件:evb_<b class='flag-5'>rk3588</b>.c核心逻辑拆解