原文參考
近來剛接手項目的camera驅動,除了查看平台文檔和sensor的到規格書,也在網上查看了高手們到經驗。本人對camera還是比較陌生的,奈何公司無人過問,只好按部就班的來吧!
和大部分驅動的調試相差無幾,還是在前人的工作基礎上進行的。項目採用高通7627平台,sensor採用ov7675。
驅動移植
1.核心驅動移植
sensor資訊記錄在android\kernel\arch\arm\mach-msm\board-msm7x27.c檔案中,board file中要更改的資訊如下:
(1)為sensor添加相應的i2c驅動,加到i2c_devices[]數組中,這裡是使用i2c匯流排的裝置數組。機器啟動時會註冊相應裝置。
static struct i2c_board_info i2c_devices[] = {
#ifdef CONFIG_MT9D112
{
I2C_BOARD_INFO("mt9d112", 0x60 >> 1),//這是7bit形式,採用硬體I2C,把真實的讀或寫地址右移一位即可
},
#endif
......}
(2)msm_camera_sensor_info包含了裝置啟動資訊。添加一個新的sensor驅動,就必須填寫這樣的一個結構體,包括sensor所使用的GPIO口。結構體中的sensor name將被用作driver id。
static struct msm_camera_sensor_info msm_camera_sensor_mt9d112_data = {
.sensor_name = "mt9d112", //將被用作driver id
.sensor_reset = 1, //sensor reset GPIO
.sensor_pwd = 20, //電源開關
.vcm_pwd = 0, //用作自動對焦。0表示不使用。
.vcm_enable = 0,
.pdata = &msm_camera_device_data,
.flash_data = &flash_mt9d112
};
另外還要把sensor註冊成platform_device。
(3)修改i2c地址。gpio表修改,使用8線輸入。修改camera_on_gpio_table[]和camera_off_gpio_table[]兩個數組。由於平台採用的是雙核架構,在功能上有所區分,個別GPIO需要在modem那邊配置成app這邊控制。
(4)建立自己的驅動檔案。使用YUV sensor則查看android\kernel\drivers\media\video\msm\mt9d112.c,若使用bayer sensor則查看android\kernel\drivers\media\video\msm\mt9t013.c。這裡不作詳細說明。
(5)完成上述工作後,修改Kconfig和Makefile檔案。
2.使用者空間驅動
(1)使用者空間驅動主要在vendor目錄下,把自己的sensor加到sensors[]中,以便啟動自己的senor。
static sensor_proc_start_t sensors[] = {
SENSORS_PROCCESS_START(mt9d112),
......};
(2)修改sensor相關參數:例如sensor類型,sensor輸出格式,輸出映像大小等等。\android\vendor\qcom-proprietary\mm-camera\targets\tgtcommon\sensor\mt9d112\mt9d112.c,這些參數必須得到正確的修改,否則sensor將啟動不了。
(3)mt9d112_process_start函數中為VFE具體配置一些參數。
(4)mt9d112_video_config函數做了一些IO configuration調研,和核心mt9d112_set_sensor_mode是相關聯的。通過IOCTL調用,相應的寄存器值會通過i2c匯流排寫入sensor。
寫入sensor寄存器的值(mt9d112_set_sensor_mode)必須和vfe_camif配置的值(mt9d112_video_config)相匹配,如果使用YUVsensor,需將每行像素值定義為預覽模式下 的兩倍。
其他重要的部分還包括HAL層的配置vendor/qcom/android-open/libcamera2\QualcommCameraHardware.cpp,
android\packages\apps\Camera\res\layout\camera.xml。