日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

深度剖析U-Boot ADC Uclass:從架構到實戰(zhàn)的全維度解析

jf_44130326 ? 來源:Linux1024 ? 作者:Linux1024 ? 2026-04-26 07:08 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式開發(fā)中,ADC(模數(shù)轉換)是連接模擬世界與數(shù)字系統(tǒng)的關鍵橋梁,而U-Boot作為嵌入式領域的經(jīng)典引導程序,其ADC子系統(tǒng)的設計堪稱分層架構與通用化設計的典范。本文將從架構、流程、數(shù)據(jù)流到實戰(zhàn)開發(fā),全方位拆解U-Boot ADC Uclass的設計精髓,幫你吃透這一核心子系統(tǒng)。

一、架構概覽:三層架構,職責分明

wKgZO2ntScqAG0DpAAAenv0DoD8720.png

U-Boot的ADC子系統(tǒng)基于DM(Driver Model)驅動模型構建,采用清晰的三層架構,讓不同層級各司其職:

?應用層開發(fā)者只需調(diào)用標準化API(如adc_channel_single_shot),無需關注底層硬件細節(jié);

?Uclass層(核心):封裝統(tǒng)一接口、通道合法性檢查、電源管理、超時處理等通用邏輯,是整個子系統(tǒng)的“中樞”;

?驅動層:針對不同硬件(如瑞芯微saradc)實現(xiàn)寄存器操作、硬件初始化等專屬邏輯;

?硬件層:ADC外設的物理寄存器與模擬采樣電路。

核心數(shù)據(jù)結構:撐起整個子系統(tǒng)的骨架

1.平臺數(shù)據(jù)結構adc_uclass_platdata

存儲ADC的核心配置信息,包括數(shù)據(jù)格式、精度掩碼、超時時間、電源信息等,是Uclass層與驅動層交互的關鍵:

structadc_uclass_platdata{ intdata_format;          // 數(shù)據(jù)格式(BIN/2S補碼) unsignedintdata_mask;      // 數(shù)據(jù)掩碼(決定ADC精度) unsignedintdata_timeout_us;   // 單通道超時時間 unsignedintmultidata_timeout_us; // 多通道超時時間 unsignedintchannel_mask;     // 可用通道掩碼 structudevice*vdd_supply;    // VDD電源調(diào)節(jié)器 // 省略部分字段...};

2.驅動操作接口adc_ops

定義驅動層需實現(xiàn)的核心回調(diào)函數(shù),是Uclass層與驅動層的“契約”:

structadc_ops { int(*start_channel)(structudevice *dev,intchannel); int(*start_channels)(structudevice *dev,unsignedintchannel_mask); int(*channel_data)(structudevice *dev,intchannel,unsignedint*data); // 省略部分接口...};

二、核心流程:從初始化到單次采樣的完整鏈路

1.初始化流程:設備樹到硬件就緒

ADC設備的初始化圍繞設備樹解析展開,核心是平臺數(shù)據(jù)的填充與硬件初始化:

wKgZO2ntScqAHSVGAAFk3_F1J38146.png

2.單次采樣:最常用的核心流程

adc_channel_single_shot是最常用的ADC采樣API,其完整流程堪稱“通用化設計”的典范:

wKgZO2ntScqAXeT-AAKuqoq16JY096.png

關鍵設計亮點:超時與輪詢的通用化

adc_channel_data函數(shù)實現(xiàn)了“驅動層返回狀態(tài)+ Uclass層處理輪詢/超時”的解耦設計,讓所有驅動復用同一套邏輯:

intadc_channel_data(structudevice *dev,intchannel,unsignedint*data){ structadc_uclass_platdata*uc_pdata =dev_get_uclass_platdata(dev); conststructadc_ops*ops =dev_get_driver_ops(dev); unsignedinttimeout_us = uc_pdata->data_timeout_us; intret; // 通道合法性檢查  ret =check_channel(dev, channel, CHECK_NUMBER, __func__); if(ret)   returnret; // 輪詢讀?。候寗又恍璺祷?EBUSY表示硬件忙 do{    ret = ops->channel_data(dev, channel, data);   if(!ret || ret != -EBUSY)     break;   sdelay(5);// 短延時,非udelay  }while(timeout_us--); returnret;}

三、數(shù)據(jù)流:從模擬信號到電壓值的完整轉換

ADC的核心是“模擬信號→數(shù)字值→電壓值”的轉換,其數(shù)據(jù)流路徑清晰且通用:

wKgZO2ntScqAFrSyAAA4SgAZKt4193.png

實戰(zhàn):從原始值到電壓的計算

拿到ADC原始值后,需結合參考電壓計算實際電壓(以12位ADC為例):

unsignedintadc_value;intvdd_uv, ret;//1. 讀取ADC原始值ret = adc_channel_single_shot("saradc@2ae00000",0, &adc_value);if(ret) { printf("ADC讀取失敗:%dn", ret); return;}//2. 獲取參考電壓(如1.8V)ret = adc_vdd_value(dev, &vdd_uv);//3. 轉換為電壓(12位ADC最大值4095)intvoltage_uv = ((u64)adc_value * vdd_uv) /4095;printf("電壓值:%duV(%dmV)n", voltage_uv, voltage_uv /1000);

注意:需用64位運算防止乘法溢出,避免精度損失!

四、多通道采樣:優(yōu)雅的降級策略

U-Boot ADC子系統(tǒng)對多通道采樣做了人性化設計:優(yōu)先使用硬件多通道(高效),若硬件不支持則自動降級為單通道逐個采樣(兼容),且對上層應用完全透明:

intadc_channels_single_shot(constchar*name,unsignedintchannel_mask,              structadc_channel *channels){ structudevice*dev; intret;  ret =uclass_get_device_by_name(UCLASS_ADC, name, &dev); if(ret)   returnret; // 策略1:嘗試硬件多通道  ret =adc_start_channels(dev, channel_mask); if(ret)   gototry_manual;  ret =adc_channels_data(dev, channel_mask, channels); if(ret)   returnret; return0;try_manual: // 策略2:降級為單通道逐個采樣 if(ret != -ENOSYS)   returnret; return_adc_channels_single_shot(dev, channel_mask, channels);}

五、開發(fā)者實戰(zhàn)指南:避坑+最佳實踐

1.驅動開發(fā):聚焦硬件,別重復造輪子

?channel_data只需返回狀態(tài):硬件忙返回-EBUSY,就緒則返回原始值,超時/輪詢交給Uclass層;

?必須填充uclass_platdata:尤其是data_mask(精度)、channel_mask(有效通道)、data_timeout_us(超時時間);

?示例:正確的驅動層channel_data實現(xiàn)

staticintgood_channel_data(structudevice *dev,intchannel,unsignedint*data){ structrockchip_saradc_regs*regs = priv->regs; // 僅檢查硬件狀態(tài),不做循環(huán)/延時 if(!(readl(®s->status) & DATA_READY))   return-EBUSY;  *data =readl(®s->data); return0;}

2.應用開發(fā):細節(jié)決定成敗

?設備名稱要匹配:需與設備樹中ADC節(jié)點的名稱一致(如saradc@2ae00000);

?電壓計算防溢出:優(yōu)先用u64類型做乘法,再做除法;

?區(qū)分sdelay和udelay:sdelay是循環(huán)延時,非微秒級延時,精準延時需用udelay。

3.設備樹配置:電源與通道

adc@2ae00000 {  compatible ="rockchip,saradc-v2";  reg = <0x2ae00000?0x100>; // 電源配置  vdd-supply = <&adc_vdd_reg>;  vdd-microvolts = <1800000>;// 1.8V參考電壓 // 有效通道(0-3)  channel_mask = <0x0F>;};

六、Uclass設計的核心思想:通用化與解耦

U-Boot ADC Uclass的設計堪稱嵌入式驅動設計的典范,核心思想可總結為:

設計模式 實現(xiàn)方式 核心優(yōu)勢
統(tǒng)一接口 adc_ops抽象層 多平臺/多硬件兼容,上層API統(tǒng)一
策略分離 Uclass處理超時/輪詢/電源 驅動層聚焦硬件,減少重復代碼
優(yōu)雅降級 多通道→單通道自動切換 最大化兼容性,對上層透明
可選功能 CONFIG_ADC_REQ_REGULATOR 按需開啟電源管理,靈活配置
前置檢查 check_channel通道校驗 提前發(fā)現(xiàn)錯誤,避免硬件異常

總結

U-Boot ADC Uclass通過分層架構、通用化接口、優(yōu)雅的降級策略,實現(xiàn)了“一次開發(fā),多硬件兼容”的目標。對于開發(fā)者而言,無需關注底層硬件差異,只需調(diào)用標準化API即可完成ADC采樣;對于驅動開發(fā)者,只需實現(xiàn)硬件專屬邏輯,復用Uclass層的通用能力。

這種“通用邏輯上提,硬件邏輯下沉”的設計思路,不僅是U-Boot驅動模型的核心,更是嵌入式系統(tǒng)設計的通用準則。掌握這一設計思想,無論是開發(fā)新的ADC驅動,還是理解其他Uclass子系統(tǒng)(如I2C、SPI),都能觸類旁通。

審核編輯 黃宇

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

    關注

    100

    文章

    7950

    瀏覽量

    557010
  • u-boot
    +關注

    關注

    0

    文章

    140

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    吃透RK3576 U-Boot.map文件!嵌入式開發(fā)調(diào)試、性能優(yōu)化、代碼裁剪全攻略

    作為嵌入式開發(fā)工程師,你是否曾被?U-Boot?啟動崩潰、固件體積過大、啟動速度慢等問題困擾?其實答案就藏在?U-Boot?構建過程中自動生成的U-Boot.map文件里!這篇文章帶你
    的頭像 發(fā)表于 04-27 07:11 ?491次閱讀
    吃透RK3576 <b class='flag-5'>U-Boot</b>.map文件!嵌入式開發(fā)調(diào)試、性能優(yōu)化、代碼裁剪全攻略

    深度解析?RK?平臺?U-Boot?環(huán)境變量(env):原理、配置與實戰(zhàn)

    環(huán)境變量(env)是?U-Boot?的核心配置機制,無需重新編譯即可靈活調(diào)整啟動參數(shù)。在?Rockchip(RK)平臺上,環(huán)境變量不僅繼承了?U-Boot?的通用特性,還針對?RK?芯片架構做了大量
    的頭像 發(fā)表于 04-27 07:11 ?529次閱讀
    <b class='flag-5'>深度</b><b class='flag-5'>解析</b>?RK?平臺?<b class='flag-5'>U-Boot</b>?環(huán)境變量(env):原理、配置與<b class='flag-5'>實戰(zhàn)</b>

    [T2080] : 將 u-boot 移植 Flash 時出錯的原因?如何解決?

    Code warrior tool target tasks flash programmer window programmed and verified my RCW and u-boot
    發(fā)表于 04-21 07:27

    更新 U-boot 時出現(xiàn)的問題求解

    我在嘗試更新 U-boot 時遇到問題。最初我無法啟動 Fedora,但后來我讀到了這并嘗試更新 U-boot。但是,當我按照官方文檔我卡在迷你機屏幕上,什么也做不了。我擔心董事會來了 DOA......
    發(fā)表于 04-01 07:20

    更新固件后 U-boot 不運行怎么解決?

    我刷新了從這里下載的新fw_payload固件(u-boot 和 opensbi):用于 TF 卡兼容性的新 u-boot 二進制文件 -.現(xiàn)在它啟動到 OpenSBI,但無法達到 U-boot。我
    發(fā)表于 03-25 08:17

    更新 SPL 和 U-Boot的提示和技巧

    U-Boot 和 SPL 文件并將它們加載到 U 盤上 7 連接將 USB 記憶棒連接到 VF2 板并將其安裝在文件夾中 8 更新來自終端的固件 9 驗證使用命令 cat /proc/mtd 并檢查如下
    發(fā)表于 03-20 08:15

    深入解析U-Boot image.c:RK平臺鏡像處理核心邏輯

    在瑞芯微(RK)平臺的嵌入式開發(fā)中,U-Boot作為核心的啟動加載程序,負責完成鏡像解析、校驗、加載等關鍵流程。而image.c正是U-Boot中處理鏡像(uImage)的核心文件,尤其針對RK平臺
    的頭像 發(fā)表于 02-24 16:46 ?1849次閱讀
    深入<b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b> image.c:RK平臺鏡像處理核心邏輯

    玩轉U-Boot bdinfo:嵌入式bsp開發(fā)者的定制、擴展與裁剪實戰(zhàn)指南

    作為嵌入式開發(fā)者,U-Boot 是我們調(diào)試、適配板卡的核心工具,而 bdinfo 命令更是板級信息調(diào)試的“利器”——它能直觀打印內(nèi)存布局、Flash 信息、網(wǎng)絡配置、時鐘頻率等核心參數(shù)。但原廠
    的頭像 發(fā)表于 02-24 15:26 ?863次閱讀
    玩轉<b class='flag-5'>U-Boot</b> bdinfo:嵌入式bsp開發(fā)者的定制、擴展與裁剪<b class='flag-5'>實戰(zhàn)</b>指南

    U-Boot SPL核心文件spl.c深度解析啟動流程調(diào)試優(yōu)化

    解析 U-Boot 中 spl.c 文件的功能與作用,探討其在系統(tǒng)調(diào)試和優(yōu)化中的價值,并通過流程圖和腦圖幫助開發(fā)者快速掌握核心要點。
    的頭像 發(fā)表于 02-05 14:08 ?533次閱讀
    <b class='flag-5'>U-Boot</b> SPL核心文件spl.c<b class='flag-5'>深度</b><b class='flag-5'>解析</b>:<b class='flag-5'>從</b>啟動流程<b class='flag-5'>到</b>調(diào)試優(yōu)化

    深入解析U-Boot TPL代碼:嵌入式啟動的“第一棒”背后的秘密

    在嵌入式系統(tǒng)啟動過程中,按下電源鍵操作系統(tǒng)開始運行,中間藏著一系列精密的初始化步驟。今天我們就來拆解 Rockchip 平臺 U-Boot 中的 TPL(Tiny Program Loader)階段核心代碼tpl.c,看看這
    的頭像 發(fā)表于 02-05 14:07 ?1317次閱讀
    深入<b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b> TPL代碼:嵌入式啟動的“第一棒”背后的秘密

    深入解析U-Boot命令處理核心文件:功能、調(diào)試與開發(fā)價值

    在嵌入式系統(tǒng)開發(fā)中,U-Boot 作為主流的引導加載程序,其命令處理、交互邏輯和自動啟動流程是核心功能模塊。本文將圍繞command.c、cli.c和autoboot.c三個關鍵文件,核心
    的頭像 發(fā)表于 02-03 15:44 ?1014次閱讀
    深入<b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b>命令處理核心文件:功能、調(diào)試與開發(fā)價值

    深入解析U-Boot核心文件board_f.c:知識點、調(diào)試要點與開發(fā)價值

    在嵌入式系統(tǒng)開發(fā)中,U-Boot 作為應用最廣泛的引導程序,其底層初始化邏輯直接決定了硬件啟動的穩(wěn)定性與可靠性。
    的頭像 發(fā)表于 02-03 15:38 ?876次閱讀
    深入<b class='flag-5'>解析</b><b class='flag-5'>U-Boot</b>核心文件board_f.c:知識點、調(diào)試要點與開發(fā)價值

    解析Rockchip平臺U-Boot核心文件:boot_rkimg.c到底做了什么?

    在嵌入式開發(fā)中,U-Boot 作為引導程序的 “中流砥柱”,負責初始化硬件、加載內(nèi)核并啟動系統(tǒng)。對于 Rockchip 平臺的設備(如常見的開發(fā)板、智能終端),boot_rkimg.c 是 U-Boot 中專門處理啟動流程的核心
    的頭像 發(fā)表于 02-03 15:29 ?990次閱讀
    <b class='flag-5'>解析</b>Rockchip平臺<b class='flag-5'>U-Boot</b>核心文件:<b class='flag-5'>boot</b>_rkimg.c到底做了什么?

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

    ?U-Boot?代碼初始加載地址(通常是片內(nèi)?ROM?或?Flash)復制運行效率更高的片外?RAM,再切換執(zhí)行環(huán)境?RAM?中運行。 本文將結合?
    的頭像 發(fā)表于 11-28 07:05 ?1025次閱讀
    深入理解?RK3506 <b class='flag-5'>U-Boot</b>?重定位:<b class='flag-5'>從</b>代碼<b class='flag-5'>到</b>原理

    U-Boot 無法識別 NAND怎么解決?

    U-Boot 無法識別 NAND
    發(fā)表于 09-03 06:37
    全南县| 诏安县| 高陵县| 北碚区| 临朐县| 黑山县| 连云港市| 峨眉山市| 浑源县| 阿城市| 巴里| 郧西县| 孟津县| 青海省| 奉新县| 视频| 辽源市| 连南| 伊吾县| 南丹县| 若羌县| 勃利县| 泰宁县| 澳门| 海宁市| 清水河县| 格尔木市| 闽侯县| 莱芜市| 双峰县| 蒲城县| 南投市| 芒康县| 天全县| 甘德县| 建水县| 鄂托克前旗| 沙田区| 莲花县| 当雄县| 南岸区|