1. 程式人生 > >linux驅動由淺入深系列:camera驅動之二(基於高通平臺的V4L2結構及程式碼分析)

linux驅動由淺入深系列:camera驅動之二(基於高通平臺的V4L2結構及程式碼分析)

在上一篇文章中介紹了camera的基礎知識和相關概念,我們一起來了解一下驅動相關的程式碼結構。本文以高通+android平臺為示例,首先看一下整體框圖:

這張圖是從整體上來看的
1,圖中最下面的是kernel層的驅動,其中按照V4L2架構實現了camera sensor等驅動,向用戶空間提供/dev/video0節點

2,在往上是HAL層,高通程式碼實現了對/dev/video0的基本操作,對接了android的camera相關的interface。(ps,HAL層的庫中也封裝了sensor端一些核心邏輯程式碼。將驅動的操作邏輯放在HAL層是為了避免linux的開源屬性對廠商私有技術的洩露)3,在之上就是android的架構對camera的處理,不是本文重點,暫不展開。

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的框架。

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傳下來的

vendor目錄下相關程式碼

在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,[email protected] {
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的效果檔案;配置檔案,把需要編譯的模組填進配置檔案中。

相關推薦

linux驅動由淺入深系列camera驅動基於平臺V4L2結構程式碼分析

在上一篇文章中介紹了camera的基礎知識和相關概念,我們一起來了解一下驅動相關的程式碼結構。本文以高通+android平臺為示例,首先看一下整體框圖:這張圖是從整體上來看的1,圖中最下面的是kernel層的驅動,其中按照V4L2架構實現了camera sensor等驅動,向

linux驅動由淺入深系列輸入子系統(編寫一個gpio_key驅動)

本系列導航: 在上一篇文章中我們大致瞭解了linux input subsystem的功能及應用層的使用,本文我們一起來看一看驅動程式碼的編寫。接下來一篇,計劃寫一下應用層如何模擬按鍵訊息,產生與按下實際按鍵相同的效果。 在“linux驅動由淺入深系列:驅動程式的基

linux驅動由淺入深系列usb子系統android平臺滑鼠驅動程式碼分析

android上的usb口是支援OTG(on the go)的,USB OTG既可以作為Host又可以作為Device,我們本文來看一下android手機作為Host連線滑鼠的情況。OTG是如何做到既可以做Host又可以作為Device的呢 標準usb接頭中有四根線:vbu

linux驅動由淺入深系列顯示子系統(基於android的分析)

上一篇文章中介紹了應用層對顯示系統的使用,我們操作framebuffer在螢幕上畫出了圖形。這次我們一起來看一下android中顯示子系統各個模組的功能。android系統音訊系統在高通平臺上的框圖:HWUIUI硬體加速,從Androd 3.0(Honeycomb)開始,An

linux驅動由淺入深系列usb子系統usb系統中的裝置、配置、介面、端點概念程式碼解釋

一個usb裝置對應一個或多個配置 一個配置包含一個或多個usb介面 一個usb介面可能存在一種或多種設定 一個設定會使用零個或多個usb端點裝置 裝置就是一個usb物理裝置,一個usb裝置可以只包含一個簡單功能的device,也可以包含一個由hub連線的多個裝置,叫作複合裝

linux驅動由淺入深系列輸入子系統三(應用層模擬input_event)

本系列導航: 在上一篇文章中編寫了gpio_key的驅動,可以看到每次gpio_key按下會上報event到/dev/input /event7節點。其實在應用層是可以完全模擬出這個按鍵過程的,原理是向EV_KEY型別的eventX訊息節點write event將

IDEA總結用IDEA新建一個spring結構的web專案

先建一個普通的web專案,如果不會的話可以參考之前的IDEA總結之一(如何新建 普通的maven +web專案以及如何執行mavenweb專案)點選開啟連結然後右鍵專案 Add Framwork Support...這裡也說一下如何快速的新建springboot點選New P

linux驅動由淺入深系列ALSA框架詳解 音訊子系統

本文以高通平臺為例,介紹一下android下的音訊結構。android使用的是tinyALSA作為音訊系統,使用方法和基本框架與linux中常用的ALSA音訊子系統是一致的。ALSA音訊框架ALSA(Advanced Linux Sound Architecture)是一個開

linux驅動由淺入深系列塊裝置驅動塊裝置驅動結構分析,以mmc為例

linux驅動由淺入深系列:塊裝置驅動之一(高通eMMC分割槽例項)前一篇文章介紹了塊裝置驅動在linux框架張的位置關係,本文來分析一下驅動本身。塊裝置驅動的模型還是基本基於字元裝置驅動的,可以簡單理解為塊裝置僅僅增加了操作緩衝區,對使用者操作請求進行佇列重排。因此只在有了

linux驅動由淺入深系列PBL-SBL1-(bootloader)LK-Android啟動過程詳解之一MSM8953啟動例項【轉】

本文轉載自:https://blog.csdn.net/radianceblau/article/details/73229005 對於嵌入式工程師瞭解晶片啟動過程是十分有必要的,在分析、除錯各種問題的時候都有可能涉及到這方面的知識。同時這部分知識也是比較複雜的,因為其中涉及到晶片內部架構,啟動各個階段軟體

linux驅動由淺入深系列tinyalsa(tinymix/tinycap/tinyplay/tinypcminfo)音訊子系統之一

目前linux中主流的音訊體系結構是ALSA(Advanced Linux Sound Architecture),ALSA在核心驅動層提供了alsa-driver,在應用層提供了alsa-lib,應用程式只需要呼叫alsa-lib提供的API就可以完成對底層硬體的操作。說的

linux驅動由淺入深系列usb子系統之一(域、包、事務、傳輸的基本概念)

本文從usb協議的物理層講起,對usb建立一個整體的概念再進行逐步細化。 下圖是usb2.0協議的物理層連線,其中包括一根地線、一根電源線(在usb2.0中電源線僅支援到5V 500mA,目前隨著人們需求的日益膨脹,在後續協議中usb線提供的供電能力正在不斷增加)、兩根差分

linux驅動由淺入深系列sensor架構例項分析之一

本系列導航: 最初的時候晶片廠家對sensor的處理和對待其它外設一樣都是直接掛在processor上,sensor的驅動也和其他linux或android的驅動一樣,生成對應的裝置節點給上層提供資料(關於此類linux基礎驅動的知識,可以參考本部落格其他博文)

linux驅動由淺入深系列驅動程式的基本結構概覽之一第一個驅動程式

本系列導航: 提到linux驅動程式,首先應該知道它是linux的核心模組。那麼想要編寫驅動程式,就要首先認識一下linux的核心模組機制。Linux核心模組是使得複雜而龐大的linux核心條理清晰、可裁剪、高相容性的重要特性。 Linux核心模組的特點: 1, 

linux驅動由淺入深系列顯示子系統之一(通過FrameBuffer在螢幕上畫出圖形)

顯示子系統對應用層提供的介面叫做framebuffer,一般位於/dev/fb0(下文示例運行於adroid的平臺位於/dev/graphics/fb0,不過它們都是一樣的),它為上層提供了統一的對顯示卡的描述。首先要明確的是lcd顯示子系統雖然複雜,但其任然是基本的字元裝

linux驅動由淺入深系列塊裝置驅動之一eMMC分割槽例項

塊裝置驅動的模型還是基本基於字元裝置驅動的,可以簡單理解為塊裝置僅僅增加了操作緩衝區,對使用者請求順序進行佇列重拍等等。字元裝置驅動的相關分析可以檢視本部落格相關的博文。 按照本部落格的行文習慣,在具體分析塊裝置驅動程式碼之前,我們會從整體上了解一下研究物件的特徵,以及使用者

Linux學習四劍客grep、find

linux四劍客 grep 查詢檔案內容 grep hello test.txt 在某個檔案中查詢包含hello的內容,只要一行中有hello會把整行顯示 grep -niv helle test.txt n顯示查詢到的內容行號,i查詢時不區分大小寫,v

思科無線AP配置通過超級終端配置ap的ip地址篇

在超級終端連通裝置後進行如下操作: 打回車後出現: ap> 後輸入enable回車 顯示讓輸入密碼,這個密碼在輸入的過程中是看不到的,輸進去回車就行,預設為Cisco,注意首字母為大寫。 如果密碼正確顯示: ap# 這時就輸入命令即可: ap#conf    t  回

戴文的Linux內核專題03 驅動程序【轉】

規模 閃存 目錄 超級計算機 用戶 memory ipa mes 摩托 轉自:http://www.lai18.com/content/432194.html 驅動程序是使內核能夠溝通和操作硬件或協議(規則和標準)的小程序。沒有驅動程序,內核不知道如何與硬件溝通或者處理協

linux音頻alsa-uda134x驅動分析時鐘)

lin pen play 個數 inter and 文本 ted word Audio Clocking音頻時鐘==============This text describes the audio clocking terms in ASoC and digital au