android從應用到驅動之—camera(2)---cameraHAL的實現

 

 

本文是camera系列博客,上一篇是:html

android從應用到驅動之—camera(1)---程序調用流程

 

原本想用這一篇博客把cameraHAL的實現和流程都給寫完的.搞了半天,東西實在是太多了.這篇先寫cameraHAL的基本實現框架,下一篇在具體寫camerahal的流程吧.java

cameraHAL的實現:

對於初學者來講,最大的疑問是系統是如何調用hardware的.
這裏就以camera來舉例說明.
調用hardware的程序是cameraservice,咱們就去它裏面看看它是如何找到hardware的linux

先把源碼貼上來:android

CameraService.cpp

void CameraService::onFirstRef()看這個函數:shell


找了半天也就是它這個函數裏邊有hw_get_module()這個函數,一看名字就知道是獲取hardware的,不找它找誰啊。那麼onFirstRef()函數又是什麼時候調用的?
onFirstRef()屬於其父類RefBase,該函數在強引用sp新增引用計數時調用,什麼意思?就是當 有sp包裝的類初始化的時候調用。這裏在frameworks/base/services/camera/libcameraservice/CameraService.h 中class CameraService :中有定義express

定義

很明顯是這裏來初始化的,固然這裏不是重點,若是所有都寫的話,那基本上就寫不完了.
找到了hw_get_module()這個函數,讓咱們看它的具體實現.
hardware/libhardware/hardware.c
代碼以下:apache

hardware.c

讓咱們看看它的流程:api

hw_get_module流程

能夠知道,真正來尋找hardware的橋樑是這個ID,在if (strcmp(id, hmi->id) != 0)中,id是frameworks/base/services/camera/libcameraservice/CameraService.cpp中直接賦值的
以下:app


而hmi->id中的這個id很明顯是hardware中應該定義的了.
咱們看hmi是怎麼得來的.框架


不用跟蹤這個函數就能看出來.hmi必定是從sym中來獲取的.因此這裏咱們也就知道hardware中必定要有這個結構體.這也是實現一個hardware必需要作的事情,這裏在hardware.h中也有說明:


即hardware中必定要有這個叫HAL_MODULE_INFO_SYM的結構體.這也是實現一個hardware的第一步:Step-1:實現一個名字爲HAL_MODULE_INFO_SYM的結構體,這個結構體必須以hw_module_t開頭
好吧,來看一下camera的hardware中是怎麼定義的.

看一下common是否是結構體hw_module_t
hardware/libhardware/include/hardware/camera.h

好了,既然hardware要有結構體,那麼必需要給他初始化.自定義的函數也得給實現了.
上文註釋已經寫出來了.這裏只是粘貼一下函數的實現.

因此也就天然而然的調用到了實現hardware的第二步,Step-2:
open函數的實現及做用.仍是看cameraHAL中對其的實現.

層層包裝啊,再看HAL_camera_device_open:

這裏咱們知道.open的做用就是打開指定ID號的攝像頭以及填充device結構體,供上層直接調用咱們HAL的具體函數好比takePicture(),startPreview()等等.
可是應該怎麼去填充這個結構體呢?
仍是先看hardware/libhardware/include/hardware/hardware.h怎麼說吧.


它說每個設備都必須以hw_device_t開始,後面跟着methods和attributes.
那咱們就在HAL中定義一個static的結構體,按着上邊賦值完畢後返回這個指針就成了.看HAL


看看是怎麼填充的:

這裏先看看camera_device_ops的具體實現,也牽扯到了HAL實現的 第三步,Step-3:具體設備的函數實現.

先不說HAL中調用函數的具體實現,看看是service怎麼調用的.
以start_preview爲例.


OK,函數調用到這裏也就完成了應用程序調用hardware內具體設備函數的流程.HAL的實現其實也就是實現上面每一個函數.使它們協同合做而已.

相關文章
相關標籤/搜索