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

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

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

3天內不再提示

Rockchip CIF驅動深度解析:從架構設計到電源計數補丁修復

jf_44130326 ? 來源:Linux1024 ? 2026-02-06 16:49 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

嵌入式Linux系統中,Rockchip CIFCamera Interface)驅動是攝像頭硬件與上層應用的橋梁”——它不僅要實現設備初始化、格式協商、數據捕獲等核心功能,還需保障運行穩定性。本文將從「驅動整體架構」入手,拆解核心文件功能與調用關系,再聚焦「Sensor電源引用計數補丁」,詳解如何通過補丁解決實際運行中的穩定性問題,為驅動開發與調試提供完整參考。

一、CIF驅動整體架構:核心文件與功能拆解

Rockchip CIF驅動位于drivers/media/platform/rockchip/cif/目錄下,包含5個核心文件(dev.c/subdev-itf.c/subdev-itf.h/procfs.c/capture.c),各文件分工明確、協同工作,共同支撐攝像頭的完整功能。

1.核心文件功能總覽

先通過一張腦圖快速梳理各文件的核心定位:

wKgZPGkaixeAMbf7AAIzmx7vtbg578.png

2.關鍵文件深度解析

1dev.c:設備管理總控

作為驅動的大腦dev.c負責初始化設備基礎環境、管理全局狀態,并提供用戶可配置的屬性接口

?核心工作

a.設備初始化:在rkcif_plat_init中初始化原子變量(如power_cntstreamoff_cnt)、互斥鎖(stream_lock)、媒體管道(pipe),為設備運行打下基礎。

b.sysfs屬性配置:實現compact_test(緊湊數據流模式)、is_use_dummybuf(虛擬緩沖區開關)等屬性的讀寫函數,用戶可通過/sys/class/video4linux/videoX/路徑動態調整設備行為。

c.全局狀態維護:通過rkcif_device_list鏈表管理所有CIF設備,rkcif_dev_mutex保證多設備操作的互斥性,避免并發沖突。

?關鍵代碼示例(設備初始化):

// drivers/media/platform/rockchip/cif/dev.cintrkcif_plat_init(structrkcif_device *cif_dev,structdevice_node *node,intirq){ // 初始化原子變量(電源、流關閉、傳感器狀態)  atomic_set(&cif_dev->power_cnt,0);  atomic_set(&cif_dev->streamoff_cnt,0);  atomic_set(&cif_dev->sensor_off,1); // 后續補丁新增:Sensor電源引用計數初始化  atomic_set(&cif_dev->sd_power_cnt,0);  // 初始化媒體管道(open/close回調)  cif_dev->pipe.open = rkcif_pipeline_open;  cif_dev->pipe.close = rkcif_pipeline_close; return0;}

2subdev-itf.c:傳感器交互橋梁

subdev-itf.cCIF驅動與攝像頭Sensor的直接交互接口,實現V4L2子設備協議,負責格式協商、電源控制、事件觸發。

?核心工作

a.格式協商:通過sditf_get_set_fmtSensor協商輸入格式(分辨率、像素格式如SBGGR8),并配置CIF內部數據流參數。

b.電源控制sditf_s_power函數觸發Sensor電源開關,是后續補丁重點修復的調用路徑之一。

c.事件管理:訂閱/觸發V4L2_EVENT_FRAME_SYNC(幀同步)、V4L2_EVENT_EXPOSURE(曝光)事件,確保數據捕獲時序正確。

?關鍵代碼示例(電源控制接口):

// drivers/media/platform/rockchip/cif/subdev-itf.cstaticintsditf_s_power(structv4l2_subdev *sd,inton){ structsditf_priv *priv = v4l2_subdev_to_sditf(sd); structrkcif_device *cif_dev = priv->cif_dev; intret =0;  mutex_lock(&cif_dev->stream_lock); if(on) {    pm_runtime_get_sync(cif_dev->dev);   // 后續補丁新增:調用統一電源管理函數    ret |= rkcif_sensor_set_power(&cif_dev->stream[0],on);  }else{    pm_runtime_put_sync(cif_dev->dev);    ret |= rkcif_sensor_set_power(&cif_dev->stream[0],on);  }  mutex_unlock(&cif_dev->stream_lock); returnret;}

3capture.c:數據捕獲執行核心

capture.c負責攝像頭數據的實際捕獲,包括流啟動/停止、緩沖區處理、電源控制函數實現,是本次補丁修改的核心文件。

?核心工作

a.流管理rkcif_do_start_stream啟動數據捕獲,rkcif_stream_init初始化流狀態(如幀丟失計數frame_loss)。

b.電源控制函數rkcif_sensor_set_powerSensor電源開關的實際實現,補丁通過修改該函數引入引用計數邏輯。

c.文件操作rkcif_fh_open/rkcif_fh_release處理用戶空間的設備打開/關閉請求,控制電源開關的調用時機。

4procfs.c:調試信息出口

procfs.c通過/proc/driver/rkcif節點向用戶空間暴露驅動運行狀態,便于調試定位問題。

?核心工作

a.格式轉換rkcif_pixelcode_to_string將媒體總線格式代碼(如MEDIA_BUS_FMT_SBGGR8_1X8)轉換為可讀字符串("SBGGR8")。

b.信息輸出rkcif_show_clks輸出時鐘頻率、rkcif_show_format輸出當前捕獲格式,幫助開發者確認設備配置是否正確。

5subdev-itf.h:數據結構定義層

僅定義struct capture_info結構體,存儲攝像頭捕獲區域的偏移(offset_x/y)和分辨率(width/height),是格式協商、緩沖區分配的基礎數據載體。

二、驅動模塊協同:調用關系與架構流程圖

各文件并非獨立運行,而是通過初始化配置捕獲調試的流程協同工作,以下是核心調用關系與架構圖:

1.核心調用流程(以設備啟動為例)

1.初始化dev.crkcif_plat_init初始化設備狀態subdev-itf.csditf_init_buf分配緩沖區capture.crkcif_stream_init初始化流。

2.用戶交互:用戶通過open調用觸發capture.crkcif_fh_open加鎖后調用rkcif_sensor_set_power上電subdev-itf.csditf_s_powerSensor交互。

3.數據捕獲rkcif_do_start_stream啟動流subdev-itf.c的事件機制同步幀數據數據寫入緩沖區。

4.調試監控:用戶讀取/proc/driver/rkcifprocfs.c的函數從dev.c獲取設備狀態并輸出。

2.架構流程圖

wKgZPGkaixeASfEvAAC3Nhb1Owg613.jpg

三、補丁修復:Sensor電源引用計數問題拆解

在理解驅動架構后,我們聚焦本次關鍵補丁——修復Sensor電源引用計數問題。該補丁針對Kernel 6.1版本,解決了驅動運行中過早斷電”“重復上電等穩定性隱患。

1.補丁背景:原驅動的3大問題

CIF驅動對Sensor電源的管理缺乏引用計數機制,導致多場景下異常:

?問題1:無計數跟蹤:多個模塊(如預覽+錄像)同時使用Sensor時,無法記錄當前使用者數量,一個模塊調用斷電后,其他模塊會因Sensor斷電崩潰。

?問題2:調用時機混亂rkcif_sensor_set_poweropen/release中調用時機錯誤(如解鎖后調用),并發場景下計數錯亂。

?問題3:路徑覆蓋不全subdev-itf.csditf_s_power未經過統一電源函數,繞過計數邏輯,導致部分場景電源失控。

2.修復思路:引入原子引用計數

補丁核心是通過原子變量sd_power_cnt(定義在dev.c,聲明在dev.h)跟蹤電源使用狀態,規則如下:

?上電(on=1:僅當sd_power_cnt0→1時,才執行Sensor上電(避免重復上電)。

?斷電(on=0:僅當sd_power_cnt1→0時,才執行Sensor斷電(避免過早斷電)。

?全路徑覆蓋:所有電源操作(open/releasesditf_s_power)均調用rkcif_sensor_set_power,確保計數不遺漏。

3.補丁對各文件的修改(附路徑)

1capture.c:核心邏輯修改(路徑:

drivers/media/platform/rockchip/cif/capture.c

?修改1rkcif_sensor_set_power函數重構

從靜態函數改為全局函數,新增計數邏輯:

// 原函數:直接操作電源,無計數staticintrkcif_sensor_set_power(...){ ... }// 補丁后:新增計數控intrkcif_sensor_set_power(structrkcif_stream *stream,inton){ structrkcif_device *cif_dev = stream->cifdev;  // 斷電:計數>0時減1,未到0則不執行斷電 if(!on&& atomic_dec_if_positive(&cif_dev->sd_power_cnt))   return0; // 上電:計數+1后>1,說明已有模塊使用,不重復上電 if(on&& atomic_inc_return(&cif_dev->sd_power_cnt) >1)   return0;  // 僅滿足“首次上電”或“最后一次斷電”,才操作Sensor電源 if(cif_dev->terminal_sensor.sd)    v4l2_subdev_call(..., core, s_power,on); return0;}

?修改2:調整open/release中函數調用時機

rkcif_sensor_set_power解鎖后移到鎖內,確保并發安全:

// open函數:鎖內調用,避免并發計數錯亂staticintrkcif_fh_open(...){  mutex_lock(&cifdev->stream_lock);  ret = rkcif_sensor_set_power(stream,on);// 補丁后:鎖內調用  mutex_unlock(&cifdev->stream_lock);}// release函數:先斷電計數,再釋放資源staticintrkcif_fh_release(...){  mutex_lock(&cifdev->stream_lock);  ret = rkcif_sensor_set_power(stream,on);// 補丁后:鎖內調用  v4l2_pipeline_pm_put(...);// 后釋放資源  mutex_unlock(&cifdev->stream_lock);}

2dev.c:初始化計數變量(路徑:

drivers/media/platform/rockchip/cif/dev.c

rkcif_plat_init中新增sd_power_cnt初始化,確保計數從0開始:

atomic_set(&cif_dev->power_cnt,0);atomic_set(&cif_dev->streamoff_cnt,0);atomic_set(&cif_dev->sensor_off,1);atomic_set(&cif_dev->sd_power_cnt,0); // 補丁新增:初始化Sensor電源計數

3dev.h:聲明變量與函數(路徑:

drivers/media/platform/rockchip/cif/dev.h

?新增sd_power_cntstruct rkcif_device

structrkcif_device{ atomic_t      power_cnt; atomic_t      streamoff_cnt; atomic_t      sensor_off; atomic_t      sd_power_cnt;// 補丁新增:Sensor電源引用計數 // ... 其他成員};

?聲明rkcif_sensor_set_power函數(因函數從static改為全局):

intrkcif_sensor_set_power(structrkcif_stream *stream,inton);// 補丁新增

4subdev-itf.c:補全調用路徑(路徑:drivers/media/platform/rockchip/cif/subdev-itf.c

sditf_s_power中調用rkcif_sensor_set_power,確保該路徑納入計數管理:

staticintsditf_s_power(...){ // ... 原有邏輯 if(on) {    pm_runtime_get_sync(cif_dev->dev);    ret |= rkcif_sensor_set_power(&cif_dev->stream[0],on);// 補丁新增  }else{    pm_runtime_put_sync(cif_dev->dev);    ret |= rkcif_sensor_set_power(&cif_dev->stream[0],on);// 補丁新增  } // ... 原有邏輯}

4.修復價值:從隱患穩定

?解決功能異常:多模塊共用Sensor時,避免一個模塊退出導致整體崩潰(如預覽退出后錄像仍正常)。

?保護硬件壽命:避免重復上電導致Sensor電源模塊過熱,延長硬件壽命。

?符合V4L2規范:遵循按需開關電源的框架要求,提升驅動兼容性。

四、總結:驅動架構與補丁的啟示

Rockchip CIF驅動通過模塊化設計實現了功能解耦——dev.c管全局、subdev-itf.c管交互、capture.c管執行、procfs.c管調試,這種架構既便于維護,又能靈活擴展(如新增HDR模式)。

而本次補丁則體現了內核驅動開發的核心原則

1.資源管理需計數:多模塊共享的資源(如Sensor電源),必須通過引用計數跟蹤使用狀態。

2.并發操作需鎖保護:關鍵邏輯(如計數修改)必須在互斥鎖內執行,避免并發錯亂。

3.調用路徑需全覆蓋:確保所有觸發點都經過統一邏輯,不遺漏任何場景。

對于嵌入式開發者而言,理解驅動架構是定位問題的基礎,而補丁的修復思路則為資源管理類問題提供了通用參考——小到電源計數,大到內存管理,核心都是清晰跟蹤狀態、規范操作流程

若你的設備基于Rockchip芯片且使用Kernel 6.1,建議及時合入該補丁,為攝像頭穩定運行保駕護航~

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

    關注

    5198

    文章

    20442

    瀏覽量

    333972
  • Linux
    +關注

    關注

    88

    文章

    11758

    瀏覽量

    219006
  • Rockchip
    +關注

    關注

    0

    文章

    92

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    【WEBENCH 大賽作品】WEBENCH FPGA 電源架構設

    使用WEBENCH? FPGA Power Architect 設計工具,進行FPGA的電源架構設計作品地址:http://www.3532n.com/uploads/ComDoc/20150716/55a754d88f528.zip
    發表于 07-16 14:54

    【原創】Dex分包架構設計—實現安卓熱修復

    【原創】Dex分包架構設計—實現安卓熱修復回復即可獲取下載鏈接[hide=d15]鏈接:http://pan.baidu.com/s/1c2fYJZy 密碼:iw16 學習群:150923287 [/hide]
    發表于 07-26 17:50

    tvp5158 D1+3CIF metadata怎么解析

    hello, 請問一下,一路D1+3CIF的幀,由line interlace模式來配置,reg B1-B8應該怎么配,我capture的幀大小怎么算,怎么解析這個metadata數據重新拼成對應的圖像?
    發表于 05-28 01:55

    功能安全---AUTOSAR架構深度解析 精選資料分享

    AUTOSAR架構深度解析本文轉載于:AUTOSAR架構深度解析AUTOSAR的分層式設計,用于
    發表于 07-23 08:34

    AUTOSAR架構深度解析 精選資料推薦

    AUTOSAR架構深度解析本文轉載于:AUTOSAR架構深度解析目錄AUTOSAR
    發表于 07-28 07:40

    AUTOSAR架構深度解析 精選資料分享

    AUTOSAR架構深度解析本文轉載于:AUTOSAR架構深度解析AUTOSAR的分層式設計,用于
    發表于 07-28 07:02

    rockchip-isp1驅動程序和rockchip SoC上圖像信號處理模塊的基本信息介紹

    概述以下文檔提供了rockchip-isp1驅動程序和rockchip SoC上圖像信號處理模塊的基本信息,并附有示例和詳細信息。ISP 詳細ISP 包括:MIPI serial camera
    發表于 04-15 16:34

    介紹WEBENCH 電源架構設計工具使用方法與技巧

    WEBENCH 電源架構設計工具概述(簡短版本)
    的頭像 發表于 08-06 01:33 ?4119次閱讀

    瑞芯微系列芯片的CIF和ISP的新驅動結構及開發指南資料免費下載

    本文檔主要介紹 Rockchip 系列芯片的 CIF, ISP 的新驅動結構, 以及在此基礎上, 如何編寫/移植 Sensor 驅動,上層如何應用 demo 及工具測試。
    發表于 04-24 08:00 ?0次下載
    瑞芯微系列芯片的<b class='flag-5'>CIF</b>和ISP的新<b class='flag-5'>驅動</b>結構及開發指南資料免費下載

    蘋果重新發布補丁用于修復iOS越獄的漏洞

    蘋果周一發布了iOS 12.4.1,重新修復了在iOS 12.3中打補丁,但在iOS 12.4中補丁取消的漏洞。蘋果表示,該補丁解決了黑客可能“以系統權限執行任意代碼”的問題。
    的頭像 發表于 08-27 12:22 ?2646次閱讀

    深度:嵌入式系統的軟件架構設計!資料下載

    電子發燒友網為你提供深度:嵌入式系統的軟件架構設計!資料下載的電子資料下載,更有其他相關的電路圖、源代碼、課件教程、中文資料、英文資料、參考設計、用戶指南、解決方案等資料,希望可以幫助廣大的電子工程師們。
    發表于 04-25 08:43 ?21次下載
    <b class='flag-5'>深度</b>:嵌入式系統的軟件<b class='flag-5'>架構設</b>計!資料下載

    架構與微架構設

    下面將從芯片的架構設計、微架構設計、使用設計文檔、設計分區、時鐘域和時鐘組、架構調整與性能改進、處理器微架構設計策略等角度進行說明,并以視頻H.264編碼器設計為例。
    的頭像 發表于 05-08 10:42 ?2100次閱讀
    <b class='flag-5'>架構</b>與微<b class='flag-5'>架構設</b>計

    GPU架構深度解析

    GPU架構深度解析圖形處理到通用計算的進化之路圖形處理單元(GPU),作為現代計算機中不可或缺的一部分,已經最初的圖形渲染專用處理器,發
    的頭像 發表于 05-30 10:36 ?1852次閱讀
    GPU<b class='flag-5'>架構</b><b class='flag-5'>深度</b><b class='flag-5'>解析</b>

    電機驅動EMC整改:傳導輻射,問題診斷與修復

    電機驅動EMC整改:傳導輻射,問題診斷與修復|深圳南柯電子
    的頭像 發表于 10-30 09:38 ?524次閱讀

    Windows平臺EtherCAT實時控制:抖動抑制虛擬化架構解析

    Windows平臺EtherCAT實時控制:抖動抑制虛擬化架構解析
    的頭像 發表于 01-29 15:26 ?240次閱讀
    Windows平臺EtherCAT實時控制:<b class='flag-5'>從</b>抖動抑制<b class='flag-5'>到</b>虛擬化<b class='flag-5'>架構</b><b class='flag-5'>解析</b>