国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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檢測功能開發。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5198

    文章

    20449

    瀏覽量

    334012
  • adc
    adc
    +關注

    關注

    100

    文章

    7511

    瀏覽量

    555948
  • u-boot
    +關注

    關注

    0

    文章

    135

    瀏覽量

    39773
  • RK3588
    +關注

    關注

    8

    文章

    556

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Rockchip rk3588 U-Boot詳解()

    Linux內核flash(NAND,NOR FLASH,SD,MMC 等)拷貝 DDR ,最后啟動 Linux 內核。當然了,bootloader 的實際工作要復雜的多,但是它最主要的工作就是啟動
    的頭像 發表于 06-13 09:08 ?6758次閱讀
    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 ?4749次閱讀

    U-boot的基本介紹

    本文開始,將陸續推送“手把手教你移植U-boot”系列文章,目標是由淺入深地講解U-boot的工作流程、原理、配置方法和移植方法,手把手教你完成U-boot的移植工作,默認
    發表于 07-14 16:52 ?4188次閱讀
    <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 ?3949次閱讀

    RK35883588s的區別

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

    rk3588是armv8嗎?rk3588硬件資料

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

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

    電子RK3588S與RK3588硬件性能區別及板卡選型
    的頭像 發表于 06-25 15:30 ?6300次閱讀
    迅<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硬件參考設計
    發表于 02-25 17:44 ?43次下載

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

    嵌入式系統U-Boot?作為引導加載程序,其啟動流程的核心環節之就是 重定位(Relocation) 。對于?RK3506?這類基于
    的頭像 發表于 11-28 07:05 ?590次閱讀
    深入理解?<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 ?1193次閱讀
    迅<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 ?768次閱讀
    深入解析<b class='flag-5'>RK3588</b> <b class='flag-5'>U-Boot</b>板級文件:evb_<b class='flag-5'>rk3588</b>.c核心邏輯拆解