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

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

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

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

深入解析RK3576平臺(tái)U-Boot下ADC驅(qū)動(dòng)實(shí)現(xiàn)|從架構(gòu)到實(shí)戰(zhàn)

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

掃碼添加小助手

加入工程師交流群

嵌入式開發(fā)中,ADC模擬數(shù)字轉(zhuǎn)換器)堪稱“模擬世界與數(shù)字世界的橋梁”——電池電壓檢測(cè)、溫度采集、按鍵識(shí)別,幾乎所有需要感知物理量的場(chǎng)景都離不開它。

今天我們就聚焦RK3576平臺(tái),從驅(qū)動(dòng)架構(gòu)、核心代碼、實(shí)戰(zhàn)使用三個(gè)維度,徹底講透U-Boot下ADC驅(qū)動(dòng)的實(shí)現(xiàn)邏輯,無論是調(diào)試ADC功能,還是定制化開發(fā),看完這篇都能落地!

一、先搞懂:RK3576 ADC驅(qū)動(dòng)的整體架構(gòu)

RK3576的ADC驅(qū)動(dòng)基于U-Boot的Driver Model(DM)框架設(shè)計(jì),核心是“通用框架+芯片專屬驅(qū)動(dòng)”的分層思路,既保證了接口統(tǒng)一,又適配了硬件特性。

1.1核心文件結(jié)構(gòu)

整個(gè)驅(qū)動(dòng)的代碼都集中在u-boot/drivers/adc/目錄下,關(guān)鍵文件就這幾個(gè):

u-boot/drivers/adc/├── adc-uclass.c     # ADC通用框架(提供統(tǒng)一API,上層調(diào)用不用管底層差異)├── rockchip-saradc-v2.c # RK3576專屬驅(qū)動(dòng)(新版SARADC v2,重點(diǎn)分析這個(gè))├── rockchip-saradc.c  # 舊版驅(qū)動(dòng)(適配老芯片,RK3576不用)├── Kconfig       # 驅(qū)動(dòng)編譯配置└── Makefile       # 編譯規(guī)則

1.2核心分層邏輯

?上層:ADC通用框架(adc-uclass.c)提供標(biāo)準(zhǔn)化API(比如啟動(dòng)轉(zhuǎn)換、讀取數(shù)據(jù)),開發(fā)者只用調(diào)用這些接口,不用關(guān)心底層硬件;

?下層:rockchip-saradc-v2.c處理RK3576 ADC的硬件細(xì)節(jié)(寄存器操作、時(shí)鐘/復(fù)位配置、時(shí)序控制)。

二、核心代碼拆解:讀懂驅(qū)動(dòng)的“底層邏輯”

想要定制ADC驅(qū)動(dòng),核心是搞懂3個(gè)關(guān)鍵部分:寄存器定義、驅(qū)動(dòng)初始化、轉(zhuǎn)換與數(shù)據(jù)讀取。

2.1先認(rèn)識(shí):新版SARADC v2的寄存器

RK3576的SARADC v2寄存器結(jié)構(gòu)更完善,覆蓋了轉(zhuǎn)換控制、時(shí)序配置、中斷、數(shù)據(jù)存儲(chǔ)等全流程,核心寄存器如下(挑關(guān)鍵的講):

structrockchip_saradc_regs {  u32 conv_con;   // 轉(zhuǎn)換控制(啟動(dòng)轉(zhuǎn)換、選擇通道、模式)  u32 t_pd_soc;   // 上電延時(shí)(配置ADC上電后的穩(wěn)定時(shí)間)  u32 t_das_soc;   // 數(shù)據(jù)采集時(shí)間(決定采樣精度)  u32 end_int_en;  // 轉(zhuǎn)換結(jié)束中斷使能(判斷轉(zhuǎn)換是否完成)  u32 status;    // ADC狀態(tài)寄存器  u32 data0-15;   // 16通道數(shù)據(jù)寄存器(轉(zhuǎn)換結(jié)果存在這里)};

2.2驅(qū)動(dòng)初始化:probe函數(shù)

驅(qū)動(dòng)加載時(shí)首先執(zhí)行probe函數(shù),核心是完成“時(shí)鐘+復(fù)位”的初始化,為ADC工作做準(zhǔn)備:

staticintrockchip_saradc_probe(structudevice *dev){ structrockchip_saradc_priv *priv = dev_get_priv(dev); structclk clk; intret; // 1. 獲取復(fù)位控制(后續(xù)復(fù)位ADC用)  ret = reset_get_by_name(dev,"saradc-apb", &priv->rst); // 2. 獲取并配置時(shí)鐘(設(shè)置ADC工作時(shí)鐘頻率)  ret = clk_get_by_index(dev,0, &clk);  ret = clk_set_rate(&clk, priv->data->clk_rate); // 3. 等待PLL穩(wěn)定(硬件要求,避免時(shí)鐘不穩(wěn)導(dǎo)致采樣錯(cuò)誤)  mdelay(5);  priv->active_channel =-1;// 初始化當(dāng)前激活通道為-1(無激活) return0;}

核心邏輯:ADC工作前必須先配置時(shí)鐘(保證時(shí)序穩(wěn)定),獲取復(fù)位控制(后續(xù)啟動(dòng)轉(zhuǎn)換前復(fù)位ADC)。

2.3啟動(dòng)通道轉(zhuǎn)換:開始采樣

想要讀取某個(gè)通道的ADC值,第一步是啟動(dòng)該通道的轉(zhuǎn)換,核心函數(shù)rockchip_saradc_start_channel:

static int rockchip_saradc_start_channel(struct udevice *dev, int channel){  struct rockchip_saradc_priv *priv = dev_get_priv(dev);  intval; // 1. 檢查通道是否有效(RK3576最多支持8個(gè)通道) if(channel = priv->data->num_channels) {    pr_err("Requested channel is invalid!");   return-EINVAL;  } // 2. 復(fù)位ADC(保證每次轉(zhuǎn)換的初始狀態(tài)一致)  reset_assert(&priv->rst);  udelay(10);  reset_deassert(&priv->rst); // 3. 配置時(shí)序參數(shù)(上電延時(shí)、數(shù)據(jù)采集時(shí)間)  writel(0x20, &priv->regs->t_pd_soc);  writel(0xc, &priv->regs->t_das_soc); // 4. 使能轉(zhuǎn)換結(jié)束中斷(方便判斷轉(zhuǎn)換完成) val= SARADC2_EN_END_INT <regs->end_int_en); // 5. 啟動(dòng)單次轉(zhuǎn)換(選擇通道+單次模式+啟動(dòng)) val= SARADC2_START | SARADC2_SINGLE_MODE | channel;  writel(val<regs->conv_con);  udelay(100);  priv->active_channel = channel;// 標(biāo)記當(dāng)前激活通道 return0;}

核心邏輯:先復(fù)位清狀態(tài)→配置時(shí)序(保證采樣精度)→使能中斷→啟動(dòng)單次轉(zhuǎn)換,每一步都是為了讓ADC穩(wěn)定輸出數(shù)據(jù)。

2.4讀取轉(zhuǎn)換數(shù)據(jù):拿到最終值

啟動(dòng)轉(zhuǎn)換后,通過rockchip_saradc_channel_data讀取數(shù)據(jù),核心是“等中斷+讀寄存器+清標(biāo)志”:

staticintrockchip_saradc_channel_data(structudevice *dev,intchannel,                   unsignedint*data){ structrockchip_saradc_priv*priv =dev_get_priv(dev);  u32 status; // 1. 檢查通道是否匹配(只能讀當(dāng)前激活的通道) if(channel != priv->active_channel) {   pr_err("Requested channel is not active!");   return-EINVAL;  } // 2. 等待轉(zhuǎn)換完成(超時(shí)則返回錯(cuò)誤) if(readl_poll_timeout(&priv->regs->end_int_st, status,             status & SARADC2_EN_END_INT, SARADC_TIMEOUT)) {   pr_err("Wait for end conversion interrupt status timeout!n");   return-ETIMEDOUT;  } // 3. 清除中斷標(biāo)志(避免影響下一次轉(zhuǎn)換) writel(0x1, &priv->regs->end_int_st); // 4. 讀取數(shù)據(jù)并應(yīng)用掩碼(RK3576是12位精度,掩碼過濾無效位)  *data =readl(&priv->regs->data0 + priv->active_channel);  *data &= uc_pdata->data_mask; return0;}

三、一張圖看懂:ADC完整工作流程

把上面的代碼邏輯串起來,RK3576 ADC的工作流程可以總結(jié)為這張圖,一目了然:

wKgZO2ntScmAbDYPAACu_SSLfUo205.png

四、設(shè)備樹配置:硬件參數(shù)的“入口”

RK3576的ADC硬件參數(shù)都定義在設(shè)備樹arch/arm/dts/rk3576.dtsi里,核心配置如下,改參數(shù)不用動(dòng)驅(qū)動(dòng),改設(shè)備樹即可:

saradc: adc@2ae00000{  compatible ="rockchip,rk3576-saradc","rockchip,rk3588-saradc";  reg = <0x0?0x2ae00000?0x0?0x10000>;//寄存器基地址  interrupts = ;//中斷號(hào) #io-channel-cells = <1>;  clocks = <&cru CLK_SARADC>, <&cru PCLK_SARADC>;//時(shí)鐘源  clock-names ="saradc","apb_pclk";  resets = <&cru SRST_P_SARADC>;//復(fù)位控制 reset-names ="saradc-apb";  status ="disabled";//默認(rèn)禁用,啟用改"okay"};

關(guān)鍵參數(shù)解讀

?compatible:驅(qū)動(dòng)匹配標(biāo)識(shí)(RK3576復(fù)用RK3588的驅(qū)動(dòng));

?reg:ADC寄存器的物理基地址,驅(qū)動(dòng)通過這個(gè)地址操作硬件;

?clocks:ADC的工作時(shí)鐘和APB時(shí)鐘,決定采樣速率;

?resets:復(fù)位控制器,驅(qū)動(dòng)通過它復(fù)位ADC模塊。

五、實(shí)戰(zhàn):U-Boot中如何讀取ADC值

驅(qū)動(dòng)最終是為了用,U-Boot提供了通用API,幾行代碼就能讀取ADC值,還能轉(zhuǎn)換成實(shí)際電壓:

unsignedintadc_value;intret;//讀取通道0的ADC值(設(shè)備名對(duì)應(yīng)設(shè)備樹里的saradc@2ae00000)ret = adc_channel_single_shot("saradc@2ae00000",0, &adc_value);if(ret) { printf("ADC read failed:%dn", ret);}else{ printf("ADC value:%dn", adc_value); //轉(zhuǎn)換為電壓(12位精度,參考電壓1.8V → 1LSB =1.8V/4095≈0.439mV) intvoltage = (adc_value *1800) /4095; printf("Voltage:%dmVn", voltage);}

六、新舊版本對(duì)比:為什么RK3576用v2版驅(qū)動(dòng)?

RK3576棄用舊版rockchip-saradc.c,改用rockchip-saradc-v2.c,核心是v2版功能更強(qiáng)大:

特性 舊版(rockchip-saradc.c) 新版(rockchip-saradc-v2.c)
通道數(shù) 最多6個(gè) 最多8個(gè)
精度 10/12位 12位(固定,精度更高)
中斷支持 基本(僅轉(zhuǎn)換結(jié)束) 完整(高低閾值、中閾值等)
復(fù)位控制 有(每次轉(zhuǎn)換復(fù)位,穩(wěn)定性更高)
支持芯片 RK3066/RK3399等老芯片 RK3562/RK3576/RK3588等新芯片

七、總結(jié)

RK3576的ADC驅(qū)動(dòng)設(shè)計(jì),完美體現(xiàn)了U-Boot DM框架的核心思想:分層解耦。

?通用框架層:屏蔽硬件差異,提供統(tǒng)一API,上層應(yīng)用不用改;

?硬件驅(qū)動(dòng)層:專注處理RK3576的硬件細(xì)節(jié)(寄存器、時(shí)鐘、復(fù)位),適配新芯片只需改這層;

這種設(shè)計(jì)不僅讓代碼易維護(hù)、易擴(kuò)展,也給我們開發(fā)帶來啟示:嵌入式驅(qū)動(dòng)開發(fā),優(yōu)先復(fù)用框架,聚焦硬件差異即可。

如果你的項(xiàng)目中需要調(diào)試RK3576的ADC功能,比如電池檢測(cè)、溫度采集,不妨從這篇文章的思路入手——先看架構(gòu),再拆代碼,最后結(jié)合設(shè)備樹和實(shí)戰(zhàn)示例,問題往往能迎刃而解。

審核編輯 黃宇

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

    關(guān)注

    100

    文章

    7950

    瀏覽量

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

    關(guān)注

    0

    文章

    140

    瀏覽量

    39963
  • rk3576
    +關(guān)注

    關(guān)注

    1

    文章

    304

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

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

    “寶藏文件”,解鎖調(diào)試、分析、優(yōu)化的全套實(shí)戰(zhàn)技巧。 一、U-Boot.map?是什么? U-Boot.map?是?U-Boot?編譯鏈接階段生成的內(nèi)存布局映射文件,記錄了可執(zhí)行文件在內(nèi)
    的頭像 發(fā)表于 04-27 07:11 ?481次閱讀
    吃透<b class='flag-5'>RK3576</b> <b class='flag-5'>U-Boot</b>.map文件!嵌入式開發(fā)調(diào)試、性能優(yōu)化、代碼裁剪全攻略

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

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

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

    、數(shù)據(jù)流到實(shí)戰(zhàn)開發(fā),全方位拆解?U-Boot ADC Uclass?的設(shè)計(jì)精髓,幫你吃透這一核心子系統(tǒng)。 一、架構(gòu)概覽:三層架構(gòu),職責(zé)分明
    的頭像 發(fā)表于 04-26 07:08 ?41次閱讀
    深度剖析<b class='flag-5'>U-Boot</b> <b class='flag-5'>ADC</b> Uclass:<b class='flag-5'>從</b><b class='flag-5'>架構(gòu)</b><b class='flag-5'>到</b><b class='flag-5'>實(shí)戰(zhàn)</b>的全維度<b class='flag-5'>解析</b>

    【硬核拆解】“芯”開始,一臺(tái)工業(yè)級(jí)迅為RK3576開發(fā)板的自我修養(yǎng)

    【硬核拆解】“芯”開始,一臺(tái)工業(yè)級(jí)迅為RK3576開發(fā)板的自我修養(yǎng)
    的頭像 發(fā)表于 03-02 15:43 ?495次閱讀
    【硬核拆解】<b class='flag-5'>從</b>“芯”開始,一<b class='flag-5'>臺(tái)</b>工業(yè)級(jí)迅為<b class='flag-5'>RK3576</b>開發(fā)板的自我修養(yǎng)

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

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

    基于米爾RK3576的環(huán)視實(shí)時(shí)性方案解析

    MYD-LR3576開發(fā)板功能實(shí)現(xiàn): 基于米爾MYD-LR3576開發(fā)板的RK3576平臺(tái)完全具備實(shí)現(xiàn)
    發(fā)表于 11-28 16:57

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

    的啟動(dòng)代碼,拆解?RK3506?平臺(tái)?U-Boot?重定位的實(shí)現(xiàn)邏輯、關(guān)鍵步驟與底層原理。 路徑:u-boot/arch/arm/cpu/a
    的頭像 發(fā)表于 11-28 07:05 ?1015次閱讀
    <b class='flag-5'>深入</b>理解?<b class='flag-5'>RK</b>3506 <b class='flag-5'>U-Boot</b>?重定位:<b class='flag-5'>從</b>代碼<b class='flag-5'>到</b>原理

    迅為如何在RK3576上部署YOLOv5;基于RK3576構(gòu)建智能門禁系統(tǒng)

    迅為如何在RK3576開發(fā)板上部署YOLOv5;基于RK3576構(gòu)建智能門禁系統(tǒng)
    的頭像 發(fā)表于 11-25 14:06 ?1987次閱讀
    迅為如何在<b class='flag-5'>RK3576</b>上部署YOLOv5;基于<b class='flag-5'>RK3576</b>構(gòu)建智能門禁系統(tǒng)

    RK3576驅(qū)動(dòng)高端顯控系統(tǒng)升級(jí):多屏拼控與AI視覺融合解決方案

    系統(tǒng)依賴多工控主機(jī)、外接顯卡和解碼器,存在功耗高、延遲大的問題。而瑞芯微 RK3576 打造的新一代 AI 多媒體平臺(tái),憑借 “三屏異顯 + 八路攝像頭輸入 + AI 邊緣計(jì)算” 的架構(gòu),全面提升高端顯
    發(fā)表于 11-21 17:51

    360環(huán)視硬件平臺(tái)為什么推薦使用米爾RK3576開發(fā)板?

    實(shí)現(xiàn)低延遲顯示與存儲(chǔ)。然而,傳統(tǒng)硬件平臺(tái)在接入路數(shù)、實(shí)時(shí)性與穩(wěn)定性方面常有瓶頸,難以支撐更大規(guī)模、更高質(zhì)量的視頻處理場(chǎng)景。為此,越來越多的企業(yè)在構(gòu)建360環(huán)視硬件平臺(tái)時(shí)選擇 米爾RK3576
    發(fā)表于 09-19 17:38

    【作品合集】米爾RK3576開發(fā)板測(cè)評(píng)

    測(cè)試 作者:魯治驛【米爾RK3576開發(fā)板免費(fèi)體驗(yàn)】測(cè)評(píng)綜合解析 【米爾RK3576開發(fā)板免費(fèi)體驗(yàn)】集成MQ-2煙霧傳感器和ADS1263模塊實(shí)現(xiàn)氣體監(jiān)測(cè) 【米爾
    發(fā)表于 09-11 10:19

    瑞芯微RK3576平臺(tái)FFmpeg硬件編解碼移植及性能測(cè)試實(shí)戰(zhàn)攻略 觸覺智能RK3576開發(fā)板演示

    本文介紹瑞芯微RK3576平臺(tái),F(xiàn)Fmpeg硬件編解碼移植及性能測(cè)試方法。演示設(shè)備:觸覺智能RK3576開發(fā)板FFmpeg簡(jiǎn)介與實(shí)測(cè)數(shù)據(jù)FFmpeg簡(jiǎn)介FFmpeg是一套多媒體框架,能夠解碼、編碼
    的頭像 發(fā)表于 09-08 13:58 ?1521次閱讀
    瑞芯微<b class='flag-5'>RK3576</b><b class='flag-5'>平臺(tái)</b>FFmpeg硬件編解碼移植及性能測(cè)試<b class='flag-5'>實(shí)戰(zhàn)</b>攻略 觸覺智能<b class='flag-5'>RK3576</b>開發(fā)板演示

    瑞芯微RK3576RK3576S有什么區(qū)別,性能參數(shù)配置與型號(hào)差異解析

    瑞芯微第二代8nm高性能AIOT平臺(tái)RK3576家族再添新成員-RK3576S,先說結(jié)論:相較主型號(hào)的RK3576/RK3576J,性能略有
    的頭像 發(fā)表于 08-14 23:57 ?2747次閱讀
    瑞芯微<b class='flag-5'>RK3576</b>與<b class='flag-5'>RK3576</b>S有什么區(qū)別,性能參數(shù)配置與型號(hào)差異<b class='flag-5'>解析</b>

    RK3576 vs RK3588:為何越來越多的開發(fā)者轉(zhuǎn)向RK3576?

    (圖形性能更強(qiáng)) 分析: RK3576 的 A72+A53+M0 組合 在能效比上更優(yōu),適合需要長時(shí)間運(yùn)行的設(shè)備(如 IoT、平板)。 RK3588 的 A76 架構(gòu) 單核性能更強(qiáng),適合高性能計(jì)算場(chǎng)景(如
    發(fā)表于 05-30 08:46

    RK3576 Android 14.0 SDK開發(fā)指南(第一集)

    對(duì)應(yīng)的boot.img及dts: 其中 BOOT_IMG=../rockdev/Image-rk3576_u/boot.img 這里指定的是舊的bo
    發(fā)表于 05-20 08:43