Qualcomm CAMSS架構(gòu)攝像頭適配:V4L2驅(qū)動封裝與媒體控制器pipeline建鏈實戰(zhàn)
在Qualcomm CAMSS(Camera Subsystem)架構(gòu)中,攝像頭適配的核心在于V4L2驅(qū)動框架的封裝與媒體控制器(Media Controller)的pipeline建鏈。這一過程涉及硬件抽象、設(shè)備管理、數(shù)據(jù)流控制等多個層面,是構(gòu)建穩(wěn)定高效攝像頭系統(tǒng)的關(guān)鍵。
V4L2驅(qū)動框架封裝:從硬件到用戶空間的橋梁
V4L2(Video for Linux 2)作為Linux內(nèi)核中的標準視頻設(shè)備驅(qū)動框架,為攝像頭適配提供了統(tǒng)一的接口。在Qualcomm平臺中,V4L2驅(qū)動框架的封裝主要涉及以下幾個關(guān)鍵步驟:
設(shè)備注冊與初始化:通過v4l2_device_register()函數(shù)注冊V4L2設(shè)備實例,該實例作為頂層管理者,維護著所有子設(shè)備的鏈表。例如,在MSM(Qualcomm System on Chip Mobile)驅(qū)動中,msm_probe()函數(shù)負責(zé)初始化v4l2_device,并創(chuàng)建video_device節(jié)點,如/dev/video0,供用戶空間訪問。
子設(shè)備管理:每個攝像頭子設(shè)備(如Sensor、ISP等)通過v4l2_subdev結(jié)構(gòu)體描述,并嵌入到video_device中。子設(shè)備通過I2C或SPI等協(xié)議與硬件通信,實現(xiàn)初始化、流控制等功能。例如,Sensor驅(qū)動通過msm_sensor_probe()函數(shù)完成上電、ID檢查等初始化工作。
文件操作接口:V4L2驅(qū)動通過v4l2_file_operations和v4l2_ioctl_ops結(jié)構(gòu)體提供標準的文件操作接口,如open、read、ioctl等。用戶空間通過這些接口與內(nèi)核驅(qū)動交互,實現(xiàn)攝像頭控制、數(shù)據(jù)采集等功能。
媒體控制器pipeline建鏈:數(shù)據(jù)流的高效流轉(zhuǎn)
媒體控制器是V4L2框架的核心組件之一,負責(zé)管理設(shè)備間的拓撲關(guān)系和數(shù)據(jù)流。在Qualcomm CAMSS架構(gòu)中,媒體控制器通過以下步驟建立pipeline:
設(shè)備枚舉與拓撲建立:媒體控制器通過media_device_register()函數(shù)注冊媒體設(shè)備,并創(chuàng)建/dev/media0節(jié)點。用戶空間通過MEDIA_IOC_ENUM_ENTITIES等IOCTL命令枚舉所有子設(shè)備,并根據(jù)設(shè)備名稱(如msm-config)找到對應(yīng)的video_device節(jié)點。
pipeline構(gòu)建:根據(jù)攝像頭應(yīng)用場景(如預(yù)覽、拍照、錄像等),媒體控制器構(gòu)建不同的pipeline。每個pipeline由多個節(jié)點(Node)組成,節(jié)點間通過鏈接(Link)連接,形成數(shù)據(jù)流路徑。例如,預(yù)覽pipeline可能包含Sensor、ISP、Display等節(jié)點。
數(shù)據(jù)流控制:用戶空間通過VIDIOC_STREAMON和VIDIOC_STREAMOFF等IOCTL命令控制數(shù)據(jù)流的開啟和關(guān)閉。媒體控制器根據(jù)pipeline拓撲,通知各節(jié)點開始工作,將數(shù)據(jù)填充到V4L2框架的緩沖區(qū)隊列中。
實戰(zhàn)案例:添加自定義pipeline
以高通平臺為例,若需添加一條自定義pipeline(如SWMFMergeRawTwo2One),實現(xiàn)兩路Raw數(shù)據(jù)合并為一路輸出,可按以下步驟操作:
創(chuàng)建pipeline XML文件:在vendor/qcom/proprietary/chi-cdk/oem/qcom/topology/usecase/components/usecases/目錄下創(chuàng)建camxSWMFMergeRawTwo2One.xml文件,定義pipeline名稱、節(jié)點列表和端口鏈接。
修改NodesList和PortLinkages:在XML文件中鏈接所有需要的節(jié)點,并定義輸入輸出端口。例如,使用NodeId 255表示自定義節(jié)點,通過NodePropertyId和NodePropertyValue指定節(jié)點屬性。
更新引用和target定義:在Usecase XML文件中使用CamxInclude添加對自定義pipeline的引用,并為pipeline添加新的target定義(如TARGET_BUFFER_RAW_OUT2)。
HAL層適配:在HAL層代碼中添加對自定義pipeline的支持,確保用戶空間能夠正確調(diào)用和控制該pipeline。





