Android Camera 驅動開發入門必備知識有哪些?

我從事Android Camera App快一年了,對App已經非常熟悉了。現在我準備轉向android Camera驅動開發,請問我需要學習哪些知識?

請提供對於我這個新手需要的知識,已經請推薦相關的資料信息。

註:我對驅動開發沒有任何概念,沒有任何基礎,從來沒有接觸過硬體相關的知識,但是對C語言較熟。想深入地研究Android Camera驅動。


我也沒專業做過 Camera 驅動開發,只業餘調試過幾個驅動。樓主且當消遣吧。:)

我理解的相機啟動的大致過程應該是這樣:

應用程序 -&> frameworks AV -&> 相機 HAL -&> 內核驅動

再按原路返回到用戶空間,這當中可能有多個單步過程。應用部分你肯定比我熟悉,frameworks 中 Google 已提供了相機的框架,所以你需要關注的其實是兩部分:一是內核中的驅動,一是 camera.$hardware.so 抽象層驅動庫(HAL)。

內核中驅動我想硬體商會提供一個實現了基礎功能的代碼包(純 C),你可能需要做些移植或 debug 工作。但像 HTC 的連拍功能,很可能是 HTC 開發人員自己實現的,而不是高通(至今未在高通內核源 Codeaurora 中見到過連拍補丁的提交)。相機資源在 Android 內核中是在主板驅動(board-xxx.c)中定義的,比如一些屬性,io 地址,內存映射段(這是內核預分配的一段連續地址,為了提高載入速度,比如高通的 PMEM_ADSP),指定驅動模塊名等。這些定義會在相機驅動載入時用到。因為你比較熟悉 C 語言,如果有 Linux 內核調試經驗的話,相信理解這部分內容並不太困難。

而 HAL 驅動庫通常也都有藍本可參考,需要實現的介面與細節在 Google Android 開發者文檔中都有說明呢,基本上是將 frameworks 中關於相機頭文件中定義的函數一一實現;這部分一般是 C++ 完成的。HAL 與內核相機模塊通訊用得最多的是 ioctl 直接申請資源,所以你可能需要找份內核驅動開發文檔學習下如何添加自己的 ioctl 函數。關於相機啟動時 HAL 中函數的調用關係,網上可找到很多分析博文。

我所知道的大概就這些,細節沒法說也沒能力說清楚了。:P


1:硬體相關:簡單的數字電路要懂,看的懂電路圖(這個很簡單),能根據電路找到相應Camera硬體連接的GPIO,並根據晶元手冊配置GPIO為相應的模式;比如GPIO模式,輸入IO或輸出IO;或配置成PWM模式;不同的模式這個GPIO的工作方式是不同的;

2:Camera驅動:比如ov5640;你要找本Linux驅動相關的書看看,比如《linux設備驅動程序》知道簡單的linux設備驅動寫法;當然工作中Camera驅動不需要你寫的,有參考的可以使用,但是參考驅動一般支持實現錄像、拍照功能,別的白平衡、對焦等都需要你去自己調試;

3:你要學習V4L2協議,因為驅動導出/dev/video0介面是通過V4L2協議的;上層C的應用也是通過V4L2協議訪問/dev/video0的;實際V4L2協議就是通過一些標誌linux ioctl()函數和底層驅動通信的;V4L2協議是為了屏蔽各種Camera驅動的不同(比如usb攝像頭,mipi介面攝像頭)而提供的統一和攝像頭驅動通信的規範;

4:你要知道C++的class的相關知識,最好能看到C++的代碼,既然你有C的知識,哪把C++的面相對象看懂,知道C++的class就可以了;為什麼要懂C++呢?因為Android Camera HAL訪問/dev/video0都是用C++寫的,二十幾個個xxxx.cpp不同的類相互繼承實現的;而且你要懂Android HAL層的寫法,至少查查資料知道用哪裡看;一般都是CameraModule.cpp或CameraHal.cpp;

5:JNI的寫法最好以知道一些,至少可以抄就可以,因為這些寫法都是固定的,因為調試的過程中有時候你一個人要從java層跟蹤代碼到HAL層再到驅動;

5:你要會用Linux,因為所有的Android源碼都是在Linux下編譯的;你要知道ARM架構,交叉編譯器;比如arm-linux-gcc;知道怎麼編譯Android和kernel源碼;怎麼刷機;怎麼調試;最好買塊帶Camera的Android開發板;

總結:

Android的Camera可以說Android所有驅動模塊裡面最難調試的模塊,太複雜;即使你java很厲害;C也還可以;但是學習起來這個整個流程如果你是自學的話,我感覺還是太難;太費勁;還是是放棄吧!自扣太費勁了;如果有朋友懂帶著你的話,給你演示演示,指點指點,2~3月還是有可能的;


感謝大牛分享,學習了!

精彩的嵌入式驅動視頻教程,分享給大家!

http://www.superedu.com.cn/news/181.html?wjl


去OEM廠商學習最快,你自己干看代碼是學不到真功夫的


有Camera2 API的資料嗎,能提供點camera相關的資料嗎?


我也是這一年負責了相機模塊,側重app,有時候也會添加一下framework和hal,,,,也跟你有相同的想法,但是呢,app.就有好多需求要做的,有時候沒有時間,任重而道遠啊


推薦閱讀:

Android 上最好的拍照軟體是什麼?系統自帶?Camera Fun Pro?Camera360?Vignette 還是其他?
Camera+ 可否稱得上最棒的攝影類應用?

TAG:Android | 驅動程序開發 | Camera |