編輯:關於Android編程
OV8865
1、kernel部分:
A、kernel_driver:
把驅動文件ov8865_qtech_f8865ac.c 放到kernel/drivers/media/platform/msm/camera_v2/sensor/目錄下
B、kernel_dtsi:
把如下板級信息加到kernel/arch/arm/boot/dts/msm8610-qrd-camera-sensor.dtsi文件中
actuator1: qcom,actuator@18 {
cell-index = <4>;
reg = <0x18>;
compatible = "qcom,actuator";
qcom,cci-master = <0>;
};
eeprom0:qom,eeprom@2b{
cell-index = <0>;
reg = <0x2b 0x0>;
...
...
};
qcom,camera@7f {
compatible = "qcom,ov8865_qtech";
reg = <0x7f>;
qcom,slave-id = <0x6c 0x300b 0x8865>;
qcom,csid-sd-index = <0>;
qcom,actuator-src = <&actuator1>;
qcom,eeprom-src = <&eeprom0>;
qcom,led-flash-src = <&led_flash0>;
qcom,mount-angle = <90>;
qcom,sensor-name = "ov8865_qtech";
cam_vdig-supply = <&pm8110_l7>;
cam_vana-supply = <&pm8110_l19>;
cam_vio-supply = <&pm8110_l14>;
qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana";
qcom,cam-vreg-type = <0 0 0>;
qcom,cam-vreg-min-voltage = <1500000 1800000 2850000>;
qcom,cam-vreg-max-voltage = <1500000 1800000 2850000>;
qcom,cam-vreg-op-mode = <200000 200000 100000>;
qcom,gpio-no-mux = <0>;
gpios = <&msmgpio 13 0>,
<&msmgpio 21 0>,
<&msmgpio 20 0>,
<&pm8110_gpios 2 0>;
qcom,gpio-reset = <1>;
qcom,gpio-standby = <2>;
qcom,gpio-vdig = <3>;
qcom,gpio-req-tbl-num = <0 1 2 3>;
qcom,gpio-req-tbl-flags = <1 0 0 0>;
qcom,gpio-req-tbl-label = "CAMIF_MCLK",
"CAM_RESET1",
"CAM_STANDBY",
"CAM_VDIG";
qcom,csi-lane-assign = <0xe4>;
qcom,csi-lane-mask = <0x3>;
qcom,sensor-position = <0>;
qcom,sensor-mode = <1>;
qcom,cci-master = <0>;
};
C、kernel-clock:
這部分主要是針對 B 的,增加一些I2C地址
如下代碼斷:
--- a/arch/arm/mach-msm/clock-8610.c
+++ b/arch/arm/mach-msm/clock-8610.c
@@ -3033,6 +3033,7 @@ static struct clk_lookup msm_clocks_8610[] = {
CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "6-0020"),
CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "6-006a"),
CLK_LOOKUP("cam_src_clk", mclk1_clk_src.c, "6-0048"),
+ CLK_LOOKUP("cam_src_clk", mclk0_clk_src.c, "6-006c"), //front camera ismclk1_clk_src.c back camera ismclk0_clk_src.c
CLK_LOOKUP("cam_clk", mclk0_clk.c, "6-006f"),
CLK_LOOKUP("cam_clk", mclk0_clk.c, "6-0034"),
CLK_LOOKUP("cam_clk", mclk0_clk.c, "6-007d"),
@@ -3042,6 +3043,7 @@ static struct clk_lookup msm_clocks_8610[] = {
CLK_LOOKUP("cam_clk", mclk0_clk.c, "6-0020"),
CLK_LOOKUP("cam_clk", mclk0_clk.c, "6-006a"),
CLK_LOOKUP("cam_clk", mclk1_clk.c, "6-0048"),
+ CLK_LOOKUP("cam_clk", mclk0_clk.c, "6-006c"),
D、把C文件加到Makefile
--- a/drivers/media/platform/msm/camera_v2/sensor/Makefile
+++ b/drivers/media/platform/msm/camera_v2/sensor/Makefile
@@ -22,3 +22,4 @@ obj-y += gc2035.o
#obj-$(CONFIG_SP1628) += sp1628.o
obj-$(CONFIG_GC0339) += gc0339.o
obj-$(CONFIG_HM1090) += HM1090.o
+obj-y +=ov8865_qtech_f8865ac.o
kernel部分就這麼多了,此時可以先編譯一個bootimage看看能不能編譯過。
2、vendor部分
這一部分主要包括:效果(chromatix)、馬達AF驅動(actuators)、庫文件(sensor_libs)
A、效果(chromatix):把chromatix_ov8865_qtech_f8865ac整個文件夾放到vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/chromatix/0301/libchromatix/下
B、馬達AF驅動(actuators) :把af_main_cam_camcorder_6.h、af_main_cam_camera_6.h AF頭文件放到vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/actuators/0301/目錄下。
同時做如下工作:
--- a/mm-camera/mm-camera2/media-controller/modules/sensors/actuators/actuator.c
+++ b/mm-camera/mm-camera2/media-controller/modules/sensors/actuators/actuator.c
@@ -13,7 +14,7 @@
-static actuator_ctrl_t actuators[ACTUATOR_CAM_MODE_MAX][6] = {
+static actuator_ctrl_t actuators[ACTUATOR_CAM_MODE_MAX][7] = {
@@ -21,6 +22,7 @@ static actuator_ctrl_t actuators[ACTUATOR_CAM_MODE_MAX][6] = {
#include "af_main_cam_camera_2.h"
#include "af_main_cam_camera_3.h"
#include "af_main_cam_camera_4.h"
#include "af_main_cam_camera_5.h"
+ #include "af_main_cam_camera_6.h"
@@ -29,6 +31,7 @@ static actuator_ctrl_t actuators[ACTUATOR_CAM_MODE_MAX][6] = {
#include "af_main_cam_camcorder_2.h"
#include "af_main_cam_camcorder_3.h"
#include "af_main_cam_camcorder_4.h"
#include "af_main_cam_camcorder_5.h"
+ #include "af_main_cam_camcorder_6.h"
}
};
在af_main_cam_camcorder_6.h中會有af_header_info_t:
如下:
/* af_header_info_t */
{
/* header_version */
0x301,
/* cam_name */
ACTUATOR_MAIN_CAM_6,
/* module_name */
"ov8865",
/* actuator_name */
"BU64243GWZ",
}, /* af_header_info_t */
其中ACTUATOR_MAIN_CAM_6這個需要在kernel中定義,在kernel/include/media/msm_cam_sensor.h文件中添加ACTUATOR_MAIN_CAM_6
enum af_camera_name {
ACTUATOR_MAIN_CAM_0,
ACTUATOR_MAIN_CAM_1,
ACTUATOR_MAIN_CAM_2,
ACTUATOR_MAIN_CAM_3,
ACTUATOR_MAIN_CAM_4,
ACTUATOR_MAIN_CAM_5,
ACTUATOR_MAIN_CAM_6
ACTUATOR_WEB_CAM_0,
ACTUATOR_WEB_CAM_1,
ACTUATOR_WEB_CAM_2,
};
C、庫文件(sensor_libs) :把ov8865_qtech_f8865ac整個文件夾放到vendor/qcom/proprietary/mm-camera/mm-camera2/media-controller/modules/sensors/sensor_libs/目錄下
D、把相關文件添加到config中,如下:
--- a/common/config/device-vendor.mk
+++ b/common/config/device-vendor.mk
@@ -526,6 +526,7 @@ MM_CAMERA += libmmcamera_s5k3l1yx
+MM_CAMERA += libmmcamera_ov8865_qtech //庫文件
MM_CAMERA += libmmcamera_SKUAA_ST_gc0339
@@ -617,6 +618,10 @@ MM_CAMERA += libchromatix_ov8825_7853f_snapshot
MM_CAMERA += libchromatix_ov8825_7853f_zsl
+MM_CAMERA += libchromatix_ov8865_qtech_f8865ac_snapshot //效果文件
+MM_CAMERA += libchromatix_ov8865_qtech_f8865ac_preview
+MM_CAMERA += libchromatix_ov8865_qtech_f8865ac_common
+MM_CAMERA += libchromatix_ov8865_qtech_f8865ac_default_video
MM_CAMERA += libchromatix_SKUAA_ST_gc0339_common
@@ -640,6 +645,7 @@ MM_CAMERA += libchromatix_skuf_ov5648_p5v23c_preview
MM_CAMERA += libmmcamera_truly_cm7700_eeprom
+MM_CAMERA += libmmcamera_qtech_f8865ac_eeprom //e2prom文件
MM_CAMERA += libmmcamera_sunny_p12v01m_eeprom
編systemimage.img驗證
1camera基本代碼架構
高通平台對於camera的代碼組織,大體上還是遵循Android的框架:即上層應用和HAL層交互,高通平台在HAL層裡面實現自己的一套管理策略;在kernel中實現sensor的底層驅動。但是,對於最核心的sensor端的底層設置、ISP效果相關等代碼則是單獨進行了抽離,放在了一個daemon進程中進行管理:
由於高通把大部分具體的設置及參數放到了daemon進程中,所以在kernel部分只是進行了V4L2的設備注冊、IIC設備注冊等簡單的動作:
如上圖,camera在kernel層的主文件為msm.c,負責設備的具體注冊及相關方法的填充;在msm_sensor.c文件中,主要維護高通自己的一個sensor相關結構體—msm_sensor_ctrl_t,同時把dts文件中的配置信息讀取出來;kernel層對於不同的sensor對應自己的一個驅動文件—xxsensor.c,主要是把powersetting的設定填充到msm_sensor_ctrl_t中。
在vendor目錄下,高通把各個sensor實質性的代碼放置在此。一部分代碼是高通自己實現的daemon進程和kernel層及HAL層進行通訊的框架代碼;另一部分則是和sensor相關的chromatix效果代碼和sensorlib部分代碼(initsetting、lensinfo、outputinfo)。
如上圖,高通平台通過一個函數指針數組sub_module_init來管理sensor相關的組件;其中重要的是sensor_sub_module_init和chromatix_sub_module_init模塊,對於sensor模塊需要對應填充sensor_lib_t下的接口,對於chromatix模塊則是通過高通的chromatix工具生成。
從更高的層次來看,sensor部分的代碼只是camera子系統的一部分。打開高通vendor下面關於camera的源碼也可以看到,/mm-camera2/media-controller/modules目錄下面,sensors只是modules文件下面其中的一個子目錄。
2主要移植步驟
2.1kernel層代碼移植
對於kernel層的代碼移植,實際上對dts文件的移植。因為kernel層驅動代碼基本已經被高通的框架以及vendor下代碼架空,只剩下一個上電的列表。具體步驟為:
1.在目錄kernel/arch/arm/boot/dts/下的對應dtsi文件中新增camera節點,主要關注節點中的IIC地址、sensro的ID信息、電壓設定信息:
2.在目錄kernel/drivers/media/platform/msm/camera_v2/sensor/目錄新增xxsensor.c文件,主要填充msm_sensor_power_setting結構體:sensor上電的包含的引腳設定和電壓設定,具體格式可以參考同目錄下的其他文件。
3.kernel下面的相關mk文件:
其他:如果sensor中帶有eeprom,需要在dts文件中增加eeprom的節點信息;同樣,sensor帶有對焦功能,需要在dts文件中增加actuator節點信息;對於帶eeprom的sensor,還需要配置eeprom的時鐘控制代碼(有待研究)。
2.2vendor下代碼移植
Vendor下面的代碼主要是兩部分,一個是sensor_libs目錄下的sensor具體設定、配置文件,另一個是chromatix下面的ISP效果文件。具體為:
1.sensor_libs目錄下文件:包括一個Android.mk文件和一個.c文件。其中Android.mk文件參考同目錄下其他.mk文件修改和對應sensor有關設定即可;.c文件中需要填充的為一個sensor_lib_t類型的結構體:
2.chromatix目錄下相關文件,在對應sensor目錄下包含4個目錄和一個Android文件,總共13個文件,這些文件都會由chromatix調試工具生成。下面為IMX179文件實例:
3.vendor下還有eeprom文件,模組自帶的eeprom數據處理相關;AF相關文件,調試工具生成的關於AF的效果文件;配置文件,把需要編譯的模塊填進配置文件中。
概述Android的消息機制主要值得就是Handler的運行機制,Handler的運行需要底層的MessageQueue和Looper的支撐。MessageQueue即為
我們在界面上經常會用到button按鈕,但通常button點擊後看不到點擊的效果,如果用戶連續點擊了兩次,就會報NAR錯誤,這樣交互性就比較差了。如果我們自定義了butt
示例效果如下: MainActivity.xml package sn.qdj.popupwindowdemo; import android.su
一、測試性能Demo 首先給大家一個性能測試的Demo,看看性能如何。 Demo.apk 二、相關操作CRUD Entity: import android.an