chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

一、架構(gòu)概覽:三層架構(gòu),職責(zé)分明

wKgZO2ntScqAG0DpAAAenv0DoD8720.png

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

?應(yīng)用層開(kāi)發(fā)者只需調(diào)用標(biāo)準(zhǔn)化API(如adc_channel_single_shot),無(wú)需關(guān)注底層硬件細(xì)節(jié);

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

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

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

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

1.平臺(tái)數(shù)據(jù)結(jié)構(gòu)adc_uclass_platdata

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

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

2.驅(qū)動(dòng)操作接口adc_ops

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

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

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

1.初始化流程:設(shè)備樹(shù)到硬件就緒

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

wKgZO2ntScqAHSVGAAFk3_F1J38146.png

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

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

wKgZO2ntScqAXeT-AAKuqoq16JY096.png

關(guān)鍵設(shè)計(jì)亮點(diǎn):超時(shí)與輪詢的通用化

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

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; // 輪詢讀?。候?qū)動(dòng)只需返回-EBUSY表示硬件忙 do{    ret = ops->channel_data(dev, channel, data);   if(!ret || ret != -EBUSY)     break;   sdelay(5);// 短延時(shí),非udelay  }while(timeout_us--); returnret;}

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

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

wKgZO2ntScqAFrSyAAA4SgAZKt4193.png

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

拿到ADC原始值后,需結(jié)合參考電壓計(jì)算實(shí)際電壓(以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. 轉(zhuǎn)換為電壓(12位ADC最大值4095)intvoltage_uv = ((u64)adc_value * vdd_uv) /4095;printf("電壓值:%duV(%dmV)n", voltage_uv, voltage_uv /1000);

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

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

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

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:降級(jí)為單通道逐個(gè)采樣 if(ret != -ENOSYS)   returnret; return_adc_channels_single_shot(dev, channel_mask, channels);}

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

1.驅(qū)動(dòng)開(kāi)發(fā):聚焦硬件,別重復(fù)造輪子

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

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

?示例:正確的驅(qū)動(dòng)層channel_data實(shí)現(xiàn)

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

2.應(yīng)用開(kāi)發(fā):細(xì)節(jié)決定成敗

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

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

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

3.設(shè)備樹(shù)配置:電源與通道

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設(shè)計(jì)的核心思想:通用化與解耦

U-Boot ADC Uclass的設(shè)計(jì)堪稱嵌入式驅(qū)動(dòng)設(shè)計(jì)的典范,核心思想可總結(jié)為:

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

總結(jié)

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

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

審核編輯 黃宇

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

    關(guān)注

    100

    文章

    7950

    瀏覽量

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

    關(guān)注

    0

    文章

    140

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

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

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

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

    [T2080] : 將 u-boot 移植 Flash 時(shí)出錯(cuò)的原因?如何解決?

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

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

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

    更新固件后 U-boot 不運(yùn)行怎么解決?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    U-Boot 無(wú)法識(shí)別 NAND怎么解決?

    U-Boot 無(wú)法識(shí)別 NAND
    發(fā)表于 09-03 06:37