在上一篇文章中介紹了camera的基礎知識和相關概念,咱們一塊兒來了解一下驅動相關的代碼結構。本文以高通+android平臺爲示例,首先看一下總體框圖:linux
這張圖是從總體上來看的
1,圖中最下面的是kernel層的驅動,其中按照V4L2架構實現了camera sensor等驅動,向用戶空間提供/dev/video0節點android
2,在往上是HAL層,高通代碼實現了對/dev/video0的基本操做,對接了android的camera相關的interface。(ps,HAL層的庫中也封裝了sensor端一些核心邏輯代碼。將驅動的操做邏輯放在HAL層是爲了不linux的開源屬性對廠商私有技術的泄露)3,在之上就是android的架構對camera的處理,不是本文重點,暫不展開。ruby
V4L2架構圖
本小節內容摘自(http://blog.csdn.net/rubyboss/article/details/14053523)架構
V4L2支持三類設備:視頻輸入輸出設備、VBI設備和radio設備(其實還支持更多類型的設備,暫不討論),分別會在/dev目錄下產生videoX、radioX和vbiX設備節點。
Linux系統中視頻輸入設備主要包括如下四個部分:
字符設備驅動程序核心:V4L2自己就是一個字符設備,具備字符設備全部的特性,暴露接口給用戶空間;
V4L2驅動核心:主要是構建一個內核中標準視頻設備驅動的框架,爲視頻操做提供統一的接口函數;
平臺V4L2設備驅動:在V4L2框架下,根據平臺自身的特性實現與平臺相關的V4L2驅動部分,包括註冊video_device和v4l2_dev。
具體的sensor驅動:主要上電、提供工做時鐘、視頻圖像裁剪、流IO開啓等,實現各類設備控制方法供上層調用並註冊v4l2_subdev。框架
V4L2的核心源碼位於drivers/media/v4l2-core,源碼以實現的功能能夠劃分爲四類:
核心模塊實現:由v4l2-dev.c實現,主要做用申請字符主設備號、註冊class和提供video device註冊註銷等相關函數;
V4L2框架:由v4l2-device.c、v4l2-subdev.c、v4l2-fh.c、v4l2-ctrls.c等文件實現,構建V4L2框架;
Videobuf管理:由videobuf2-core.c、videobuf2-dma-contig.c、videobuf2-dma-sg.c、videobuf2-memops.c、videobuf2-vmalloc.c、v4l2-mem2mem.c等文件實現,完成videobuffer的分配、管理和註銷。
Ioctl框架:由v4l2-ioctl.c文件實現,構建V4L2ioctl的框架。ide
kernel層高通關於camera的主要代碼簡圖函數
因爲高通將大部分驅動邏輯代碼放到了HAL層,所以在kernel部分只進行了V4L2的設備註冊、IIC設備驅動等基本動做。
camera在kernel層的主文件爲msm.c,負責設備的具體註冊及相關方法的填充;
在msm_sensor.c文件中,主要維護高通本身的一個sensor相關結構體—msm_sensor_ctrl_t,同時把dts文件中的配置信息讀取出來;
kernel層對於不一樣的sensor對應本身的同一個驅動文件 — msm_sensor_driver.c,主要是把vendor下面的sensor_lib_t的設定填充到msm_sensor_ctrl_t中工具
在msm_sensor_init.c中主要是一些IOCTL處理,處理vendor傳下來的IOCTL,vendor下面的power_setting,ret_setting等信息都是經過這裏的ioctl傳下來的.net
vendor目錄下相關代碼3d
在vendor目錄下,高通把各個sensor實質性的代碼放置在此。一部分代碼是高通本身 實現的daemon進程和kernel層及HAL層進行通信的框架代碼;另外一部分,則是和sensor 相關的 chromatix 效果代碼和 sensor lib 部分代碼(init setting、lens info、 output info)。
camera調試
對於kernel層的代碼移植,實際上對dts文件的移植。由於kernel層驅動代碼基本已經被高通的框架以及vendor下代碼架空。 具體步驟爲:
1. 在目錄kernel/arch/arm/boot/dts/下的對應dtsi文件中新增camera節點,主要關注節點中的IIC地址、 sensro的ID信息、電壓設定信息,例如:
設備樹源文件爲kernel/arch/arm/boot/dts/qcom/下的<target>_camera*.dtsi,例如msm8916-camera-sensor-mtp.dtsi。客戶應使用以下所示的攝像頭插槽:
qcom,camera@0 {
cell-index = <0>;
compatible = "qcom,camera";
. . .
}
2.高通關於camera的dts節點屬性值解釋,有關各個屬性的解釋,請參考如下目錄下的文檔:
kernel/Documentation/devicetree/bindings/media/video/
3,修改kernel下面的相關mk文件
Vendor下代碼移植
Vendor下面的代碼關係着camera是否點亮的代碼主要是兩部分,一個是sensor_libs目錄下的sensor具體設定文件,另外一個是chromatix下面的ISP效果文件。具體爲:
1. sensor_libs目錄下文件:包括一個Android.mk文件和一個.c文件。其中Android.mk文件參考同目錄下其餘.mk文件修改和對應sensor有關設定便可; .c文件中須要填充的爲一個sensor_lib_t類型的結構體(ov7251填充示例):
2. chromatix目錄下相關文件,在對應sensor目錄下包含4個目錄和一個Android文件,總共13個文件,這些文件都會由chromatix調試工具生成。下面爲IMX179文件實例:
3. vendor下還有eeprom文件,模組自帶的eeprom數據處理相關; AF相關文件,調試工具生成的關於AF的效果文件;配置文件,把須要編譯的模塊填進配置文件中。