91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在U-Boot中為RK3588添加SARADC檢測(cè):從零到一的硬件識(shí)別方案

jf_44130326 ? 來(lái)源:Linux1024 ? 2026-02-05 13:50 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式開(kāi)發(fā)中,我們經(jīng)常需要在系統(tǒng)啟動(dòng)的早期階段(U-Boot)識(shí)別硬件版本或配置。本文將詳細(xì)介紹如何在U-Boot中為RK3588平臺(tái)添加SARADCSuccessive Approximation Register Analog-to-Digital Converter)檢測(cè)功能,通過(guò)讀取ADC電壓值來(lái)區(qū)分不同的硬件版本,并將結(jié)果存入環(huán)境變量,為后續(xù)的啟動(dòng)流程提供依據(jù)。

wKgZO2kajESAKafNAAP3aQqbeVc822.png

核心思路與應(yīng)用場(chǎng)景

為什么需要在U-Boot中做ADC檢測(cè)?

U-Boot作為引導(dǎo)加載程序,運(yùn)行在操作系統(tǒng)內(nèi)核之前,擁有極高的硬件訪(fǎng)問(wèn)權(quán)限。在這個(gè)階段進(jìn)行ADC檢測(cè),可以實(shí)現(xiàn):

?硬件版本自動(dòng)識(shí)別:通過(guò)讀取主板上由電阻分壓網(wǎng)絡(luò)決定的ADC引腳電壓,U-Boot可以判斷出當(dāng)前硬件的具體型號(hào)或版本。

?動(dòng)態(tài)配置加載:根據(jù)識(shí)別出的硬件版本,U-Boot可以加載不同的設(shè)備樹(shù)(Device Tree)、啟動(dòng)參數(shù)或執(zhí)行特定的初始化腳本,實(shí)現(xiàn)一鏡像適配多硬件的目標(biāo)。

?故障診斷:檢測(cè)關(guān)鍵電源電壓或傳感器狀態(tài),在啟動(dòng)早期發(fā)現(xiàn)硬件異常。

第一步:配置SARADC設(shè)備樹(shù)(DTS)

要在U-Boot中使用SARADC,首先需要確保其設(shè)備樹(shù)節(jié)點(diǎn)已正確配置并啟用。

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

/* 在 rk3588-u-boot.dtsi 文件中找到并確認(rèn) saradc 節(jié)點(diǎn) */&saradc { /*  * u-boot, dm-pre-reloc; 是一個(gè)關(guān)鍵屬性,  * 它告訴 U-Boot 的驅(qū)動(dòng)模型(Driver Model)  * 在 relocation(重定位)之前就初始化這個(gè)設(shè)備。  * 因?yàn)槲覀円?board_init_f 階段(重定位前)讀取ADC,  * 所以必須添加此屬性。  */  u-boot, dm-pre-reloc;  status ="okay";};

代碼解讀:

?&saradc:引用主設(shè)備樹(shù)中定義的saradc節(jié)點(diǎn)。

?u-boot, dm-pre-reloc;:核心配置。確保SARADC驅(qū)動(dòng)在U-Boot早期階段(內(nèi)存重定位前)就被初始化,這樣我們才能在board_init_fboard_init_r中調(diào)用其功能。

?status = "okay";:啟用這個(gè)設(shè)備節(jié)點(diǎn)。

第二步:編寫(xiě)ADC檢測(cè)邏輯

接下來(lái),我們?cè)诎寮?jí)初始化文件中添加實(shí)際的檢測(cè)代碼。

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

/* 在 board.c 文件的合適位置(如 board_init_r 函數(shù)之前)添加此函數(shù) */voidsbc_id_detection(void){ /* 1. 定義變量 */ intclosest_level =7;// 默認(rèn)的最高等級(jí) unsignedintadc_value;// 存儲(chǔ)原始ADC讀數(shù) (0-4095 for 12-bit) unsignedintvoltage_mv;// 轉(zhuǎn)換后的電壓值 (mV) /* 2. 定義電壓區(qū)間與硬件版本的對(duì)應(yīng)關(guān)系 */ /* 這是一個(gè)典型的電阻分壓網(wǎng)絡(luò)設(shè)計(jì),不同的電阻組合產(chǎn)生不同的電壓。   你需要根據(jù)自己的硬件原理圖來(lái)修改這兩個(gè)數(shù)組中的值。 */ constintmin_mv[] = {1640,1430,1220,1000,790, 560, 350, 0}; constintmax_mv[] = {1840,1630,1420,1200,990, 770, 550,250}; /* 3. 讀取ADC通道3的值 */ /* "saradc" 是設(shè)備樹(shù)中的節(jié)點(diǎn)名,3 是要讀取的通道號(hào) */ if(adc_channel_single_shot("saradc",3, &adc_value) ==0) {   /* 4. 將ADC原始值轉(zhuǎn)換為電壓值 (mV) */   /*     計(jì)算公式:Vout = Vin * (ADC_Value / 2^n)     - Vin (參考電壓) = 1800 mV (根據(jù)瑞芯微文檔)     - n (ADC位數(shù)) = 12 bits, 所以 2^12 = 4096    */    voltage_mv = (adc_value *1800) /4095;   /* 5. 根據(jù)電壓值查找匹配的硬件等級(jí) */   for(inti =0; i 8; i++) {     if(voltage_mv >= min_mv[i] && voltage_mv <= max_mv[i]) {        closest_level = i;       break;// 找到后立即跳出循環(huán)      }    }   /* 6. 將檢測(cè)結(jié)果存入U(xiǎn)-Boot環(huán)境變量 */   /* 環(huán)境變量 SBCID 可以在后續(xù)的啟動(dòng)腳本中被讀取和使用 */   env_set_ulong("SBCID", closest_level);      /* 調(diào)試信息,可以在串口終端看到 */   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");  }}/** 將檢測(cè)函數(shù)注冊(cè)到U-Boot的初始化序列中。* board_init_r 是一個(gè)合適的位置,它在設(shè)備初始化完成后、* 環(huán)境變量初始化后、啟動(dòng)倒計(jì)時(shí)開(kāi)始前執(zhí)行。*/// 注意:具體的注冊(cè)方式可能因U-Boot版本而異,// 請(qǐng)查閱你所用U-Boot版本的板級(jí)文件,找到合適的位置調(diào)用 sbc_id_detection();// 例如,在 board_r.c 的某個(gè)初始化函數(shù)中添加:// sbc_id_detection();

代碼解讀:

1.adc_channel_single_shot(): U-Boot提供的便捷API,用于單次讀取指定ADC設(shè)備和通道的值。

2.電壓換算:根據(jù)瑞芯微手冊(cè),SARADC的參考電壓Vref1.8V1800mV)。代碼將12位的ADC讀數(shù)(范圍0-4095)線(xiàn)性換算為實(shí)際電壓。

3.等級(jí)匹配:通過(guò)for循環(huán)將計(jì)算出的電壓值與預(yù)設(shè)的min_mvmax_mv數(shù)組進(jìn)行比較,找到對(duì)應(yīng)的硬件等級(jí)closest_level

4.環(huán)境變量:env_set_ulong()將檢測(cè)到的等級(jí)存入名為SBCID的環(huán)境變量。這個(gè)變量非常關(guān)鍵,后續(xù)的啟動(dòng)腳本(如boot.cmd)就可以通過(guò)判斷SBCID的值來(lái)執(zhí)行不同的操作。

第三步:如何使用檢測(cè)結(jié)果(參考)

檢測(cè)結(jié)果SBCID已存入環(huán)境變量,現(xiàn)在你可以在U-Boot的啟動(dòng)腳本中靈活運(yùn)用它。

文件路徑:u-boot/board/rockchip/your_board/your_board.env(或類(lèi)似的腳本文件)

# 在 U-Boot 啟動(dòng)腳本中,可以這樣使用 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# 后續(xù)的 bootcmd 會(huì)使用 $fdtfile 變量來(lái)加載正確的設(shè)備樹(shù)# run bootcmd

第四步:uboot 命令行中查看

bdinfo

關(guān)鍵要點(diǎn)與風(fēng)險(xiǎn)預(yù)案

1.時(shí)序問(wèn)題:確保ADC檢測(cè)函數(shù)在所有必要驅(qū)動(dòng)初始化之后調(diào)用。board_init_r是一個(gè)安全的選擇。

2.硬件依賴(lài):此方案完全依賴(lài)于硬件設(shè)計(jì)。分壓電阻的精度、焊接質(zhì)量、以及ADC引腳的電氣連接都會(huì)影響檢測(cè)結(jié)果。

3.區(qū)間設(shè)計(jì):在設(shè)計(jì)min_mvmax_mv數(shù)組時(shí),要考慮到電阻容差和ADC采樣誤差,為每個(gè)區(qū)間留出足夠的余量,避免電壓值落在區(qū)間邊界導(dǎo)致誤判。

4.調(diào)試:在開(kāi)發(fā)階段,可以將printf語(yǔ)句打開(kāi),通過(guò)串口終端觀(guān)察ADC的原始值、換算后的電壓值以及最終的SBCID,這對(duì)于調(diào)試硬件和校準(zhǔn)區(qū)間非常有幫助。

下一步

?代碼集成:將上述代碼片段集成到您的U-Boot源碼樹(shù)中,并根據(jù)您的具體硬件原理圖,精確調(diào)整min_mvmax_mv數(shù)組的值。

?腳本優(yōu)化:完善您的U-Boot啟動(dòng)腳本,利用SBCID環(huán)境變量實(shí)現(xiàn)更復(fù)雜的啟動(dòng)邏輯,例如加載不同的內(nèi)核參數(shù)或根文件系統(tǒng)。

希望這篇文章能幫助您順利完成U-Boot中的ADC檢測(cè)功能開(kāi)發(fā)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5198

    文章

    20434

    瀏覽量

    333883
  • adc
    adc
    +關(guān)注

    關(guān)注

    100

    文章

    7511

    瀏覽量

    555868
  • u-boot
    +關(guān)注

    關(guān)注

    0

    文章

    135

    瀏覽量

    39738
  • RK3588
    +關(guān)注

    關(guān)注

    8

    文章

    555

    瀏覽量

    7314
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Rockchip rk3588 U-Boot詳解()

    Linux內(nèi)核flash(NAND,NOR FLASH,SD,MMC 等)拷貝 DDR ,最后啟動(dòng) Linux 內(nèi)核。當(dāng)然了,bootloader 的實(shí)際工作要復(fù)雜的多,但是它最主要的工作就是啟動(dòng)
    的頭像 發(fā)表于 06-13 09:08 ?6745次閱讀
    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詳解 (二) 專(zhuān)欄總目錄 1.1 DM DM (Driver Model) 是 U-Boot 標(biāo)準(zhǔn)的 device-driver 開(kāi)發(fā)模型,跟
    的頭像 發(fā)表于 06-13 10:49 ?4741次閱讀

    U-boot的基本介紹

    本文開(kāi)始,將陸續(xù)推送“手把手教你移植U-boot”系列文章,目標(biāo)是由淺入深地講解U-boot的工作流程、原理、配置方法和移植方法,手把手教你完成U-boot的移植工作,默認(rèn)
    發(fā)表于 07-14 16:52 ?4179次閱讀
    <b class='flag-5'>U-boot</b>的基本介紹

    基于RK3588的NPU案例分享!6T是真的強(qiáng)!

    應(yīng)用 圖1目標(biāo)識(shí)別跟蹤:視頻監(jiān)控和無(wú)人駕駛領(lǐng)域,RK3588可提供6TOPS高性能NPU算力,可實(shí)時(shí)處理高清視頻流、目標(biāo)檢測(cè)、識(shí)別和跟蹤
    發(fā)表于 07-17 10:55

    基于迅RK3568/RK3588開(kāi)發(fā)板的AI圖像識(shí)別方案

    https://www.bilibili.com/video/BV1G54y1A7nf/?spm_id_from=333.999.0.0 迅RK3568/RK3588開(kāi)發(fā)板AI識(shí)別
    發(fā)表于 08-28 09:50

    如何在rk3588j上使用uboot命令行測(cè)試pwm驅(qū)動(dòng)呢?

    我想在rk3588j上使用uboot命令行測(cè)試pwm驅(qū)動(dòng),u-boot/cmd/下添加了pwm.c,然后
    發(fā)表于 01-31 17:28

    RK3568/RK3588開(kāi)發(fā)板人工智能AI攝像頭識(shí)別功能方案

    RK3568以及RK3588開(kāi)發(fā)板內(nèi)置獨(dú)立NPU,RK3588運(yùn)算能力高達(dá)6TOPS,RK3568運(yùn)算能力高達(dá)16TOPS算力支撐,高性
    發(fā)表于 03-27 14:56

    u-boot簡(jiǎn)介

    演化而來(lái)。其源碼目錄、編譯形式與Linux內(nèi)核很相似,事實(shí)上,不少U-Boot源碼就是根據(jù)相應(yīng)的Linux內(nèi)核源程序進(jìn)行簡(jiǎn)化而形成的,尤其是些設(shè)備的驅(qū)動(dòng)程序,這U-Boot源碼的注
    發(fā)表于 10-14 11:17 ?3948次閱讀

    RK35883588s的區(qū)別

    。雖然這兩種芯片都是提供高性能和高級(jí)功能而設(shè)計(jì)的,但它們之間存在些差異。本文中,我們將探討Rockchip RK3588RK3588
    的頭像 發(fā)表于 08-15 17:03 ?2.9w次閱讀

    rk3588是armv8嗎?rk3588硬件資料

    rk3588是armv8嗎?rk3588 硬件資料 RK3588款高性能處理器,是Rockchip公司推出的最新芯片。本文將詳細(xì)介紹
    的頭像 發(fā)表于 08-21 17:32 ?5979次閱讀

    電子RK3588S與RK3588硬件性能區(qū)別及板卡選型

    電子RK3588S與RK3588硬件性能區(qū)別及板卡選型
    的頭像 發(fā)表于 06-25 15:30 ?6281次閱讀
    迅<b class='flag-5'>為</b>電子<b class='flag-5'>RK3588</b>S與<b class='flag-5'>RK3588</b><b class='flag-5'>硬件</b>性能區(qū)別及板卡選型

    rk3588硬件原理圖

    RK3588硬件參考設(shè)計(jì)
    發(fā)表于 02-25 17:44 ?43次下載

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

    嵌入式系統(tǒng),U-Boot?作為引導(dǎo)加載程序,其啟動(dòng)流程的核心環(huán)節(jié)之就是 重定位(Relocation) 。對(duì)于?RK3506?這類(lèi)基于
    的頭像 發(fā)表于 11-28 07:05 ?575次閱讀
    深入理解?<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開(kāi)發(fā)環(huán)境搭建“三步曲”,輕松上手!

    RK3588開(kāi)發(fā)環(huán)境搭建“三步曲”,輕松上手!
    的頭像 發(fā)表于 12-01 11:51 ?1186次閱讀
    迅<b class='flag-5'>為</b><b class='flag-5'>RK3588</b>開(kāi)發(fā)環(huán)境搭建“三步曲”,<b class='flag-5'>從</b><b class='flag-5'>零</b><b class='flag-5'>到</b><b class='flag-5'>一</b>輕松上手!

    深入解析RK3588 U-Boot板級(jí)文件:evb_rk3588.c核心邏輯拆解

    嵌入式開(kāi)發(fā)領(lǐng)域,瑞芯微RK3588憑借超強(qiáng)的算力、豐富的接口和廣泛的場(chǎng)景適配性,成為高端邊緣計(jì)算、消費(fèi)電子項(xiàng)目的熱門(mén)選擇。而U-Boot作為嵌入式系統(tǒng)的“第道門(mén)”,負(fù)責(zé)
    的頭像 發(fā)表于 02-24 15:24 ?727次閱讀
    深入解析<b class='flag-5'>RK3588</b> <b class='flag-5'>U-Boot</b>板級(jí)文件:evb_<b class='flag-5'>rk3588</b>.c核心邏輯拆解