高通新的camera驅動架構設計發生了一些變化,借用互聯網上常用的一種結構,大致的原理如此:將camera的所有功能划分為不同的模塊,讓模塊自己來決定自己的事情(高內聚,低耦合),模塊需要有統一的接口和格式。模塊中有端口,通過端口把模塊連接起來,又把模塊掛在總線上。每一個端口的連接就是一個流,把這些流用pipeline來管理。每次啟動一個camera就創建一個會話,由這個會話來管理此camera的一切事物。對於每一個會話,模塊是共享的,它可以是camera的硬件資源也可以是其它資源(如一些軟件算法等資源)。
那么如何來定義這個模塊的結構呢?
1.端口——端口屬於模塊,如果這個模塊只有source端口,那么它就是一個src模塊;如果只有sink端口就是sink模塊,如果都有就是中間模塊。沒有端口的模塊是不能連接到流中的,但他可以完成一些其他的功能,比如接收引擎的設置,報告事件到bus等。連接到流中的端口,也就是說流事件(set/get)主要通過端口來處理。而來自於引擎的(set/get)通過模塊來處理,當然端口也可以把事件交給模塊來處理。模塊內部的端口可以通過模塊來建立關系,也可以建立內部的連接,端口有關get/set process。
2.模塊線程——每個模塊可以有一個線程來處理模塊的事情。一個線程對應一個隊列,線程就是從隊列中取出數據處理,然后應答回去。
3.總線回調——擋一個模塊向總線注冊時,總線向其提供一個回調函數,當模塊有事件發生時,調用這個函數向bus發消息,然后總線把這個消息提交給管道,管道把這個消息順着流發下去。
4.模塊的get、set以及process。
管道、引擎與會話
管道有兩端,一端用於讀,一端用於寫。camera引擎負責對管道的監控,而會話管理camera引擎。
從代碼結構上來看這種新的驅動架構
高通的camera deamon代碼放置在vendor\qcom\proprietary\mm-camera目錄下,而此目錄下的mm-camera2就是新的camera架構位置,進入里面可以看到media-controller、server-imaging、server-tuning及其它幾個目錄,我們這里需要關注的就是media-controller目錄。
media-controller
|- mct——應該就是camera的引擎?里面包含了引擎、pipiline、bus、module、stream及event等定義及封裝。
|- modules——這里面就是划分好的一些模塊代碼,各模塊大致功能如下
|- sensor —— sensor 的驅動模塊? —— src模塊
|- iface —— ISP interface模塊 —— inter模塊
|- isp —— 主要是ISP的處理,其內部又包含了眾多的模塊 —— inter模塊
|- stats —— 一些統計算法模塊,如3A,ASD,AFD,IS,GRRO等數據統計的處理 —— sink模塊
|- pproc —— post process處理 —— inter模塊
|- imglib —— 主要是圖片的一些后端處理,如HDR等 —— sink模塊
以上各模塊內部又包含了眾多的模塊,具體需要看代碼分析。