MTK 平臺相機bringup點亮

和你一起終身學習,這裏是程序員 Android

經典好文推薦,通過閱讀本文,您將收穫以下知識點:

1、Camera 框架介紹:

Camera 的框架分爲 Kernel 部分和 hal 部分,其中kernel部分主要有兩塊:

  • image sensor driver,負責具體型號的sensor的id檢測,上電,以及在preview、capture、初始化、3A等等功能設定時的寄存器配置;

  • isp driver,通過DMA將sensor數據流上傳;
    HAL層部分主要有三部分組成:

  • imageio,主要負責數據buffer上傳的pipe;

  • drv,包含imgsensor和isp的hal層控制;

  • feature io,包含各種3A等性能配置;

2、Camera Bringup 需要配置的文件

(本文以hi1634q型號的前攝爲例,平臺是mt6789,kernel版本爲5.10)

2.1、Device Config Files

修改時刪除多餘的 sensor driver name,只保留自己的即可;

/device/mediateksample/k6789v1_64
ProjectConfig.mk
/device/mediatek/mt6789

CameraConfig.mk
device-camera.mk

注意:CUSTOM_HAL_IMGSENSOR 、CUSTOM_HAL_SUB_IMGSENSOR 、CUSTOM_KERNEL_IMGSENSOR 、CUSTOM_KERNEL_SUB_IMGSENSOR 這四個必須都要指定 sensor name;不能遺漏!


/device/mediatek/common/kernel-headers
 
kd_imgsensor.h

指定 sensor name 和 sensor model id !這裏一定要check不能出錯!

2.2、Kernel Config Files
/kernel-5.10/arch/arm64/configs
 
mgk_64_k510_defconfig

修改時刪除多餘的 sensor driver name,只保留自己的即可;

/kernel-5.10/drivers/misc/mediatek/imgsensor/inc
 
kd_imgsensor.h

指定 sensor name 和 sensor model id 和 device config files 那邊修改一樣!這裏一定要check不能出錯!


/kernel-5.10/arch/arm64/boot/dts/mediatek
 
cust_mt6789_camera.dtsi

(1)修改 cust_mt6789_camera.dtsi 中 pio 節點的各個Pin number,其中 1 對應 sensor index, 最好是將其他不相關的 sensor 定義都刪除,排除干擾,提供一個乾淨整潔的代碼!並將文件中 kd_camera_hw1 節點中的 pin 增加對應節點,rst 引腳和 mclk 引腳需要根據原理圖上的信息去 map 查找,具體對應的是哪個 gpio引腳,pinctrl也只需要保留對應節點即可(必須從0開始遞增,否則遍歷會出錯!),如下圖紅圈部分:


(2) 在 cust_mt6789_camera.dtsi 文件中 kd_camera_hw1 節點中將採用 PMIC 供電方式的 pin 增加如下子節點,再加一個 cust-sensor = “sensor_mipi_raw”,或者是 cam1_enable_sensor = “sensor_mipi_raw ”(方便匹配指定sensor):

(3)在對應的 i2c 總線中定義 camera 設備,i2c0 到 i2c8,具體是哪一條 i2c 路線需要到原理圖查找,同時設備在 i2c 線上的地址是 sensor 的物理地址的高七位的值(實際過程中此地址只需要不和 i2c 路線的其它設備地址衝突即可,但是爲了便於查找,儘量使用高七位的地址),同時刪除無關的設備配置,包括其它的camera sensor、eeprom 相關、點亮 sensor 的原理圖上不存在的引腳配置。

/kernel-5.10/drivers/misc/mediatek/imgsensor/src/common/v1_1
 
hi1634q_mipi_raw

此目錄下添加驅動文件,仿照類似型號 sensor 修改成自己的,然後改成自己的名字,刪除 mipi_raw 下的eeprom 以及 makefile 中的 eeprom 相關,排除干擾項。

到 sensor.c 和 sensor.h 文件修改具體內容,主要包括 imgsensor_info、init_setting、preview_setting 等 mode setting 中的數據、winsize_info 數據修改,最後修改 driver 的入口函數 XXX_MIPI_RAW_SensorInit(),一般在 sensor.c 文件最下面。


imgsensor_sensor_list.c
imgsensor_sensor_list.h

imgsensor_sensor_list.h 中添加相應的 sensor 的 init(入口函數) 的函數;


imgsensor_sensor_list.c 中添加相應的 sensor 的id、name、init(入口函數) ,注意順序和 vendor 層相對應,此處需要注意的是最好把位置放在你對應sensor idx 的位置上,這樣就不會有匹配出錯的情況出現。

imgsensor_pwr_seq.c
此文件中修改引腳電壓值以及上電延時等信息,注意 sensor driver name 的大小寫,同時嚴格按照 sensor data 上電模塊的說明,添加延時。需要注意的是 AVDD, DVDD, DOVDD 的電壓需要確認是否正確,並且在上完前兩路電之後第三路電最好加個 1ms 的延遲,不然可能會出現意料之外的問題;

/kernel-5.10/drivers/misc/mediatek/imgsensor/src/common/v1_1/camera_hw/
 
imgsensor_cfg_table.c

此處修改硬件配置信息,主要是三路電的配置,是 regulator 還是 gpio類型的,如果 sensor 原理圖有其它引腳,也可以繼續添加,同時刪除原理圖不存在的引腳,例如 pdn 引腳。

2.3、Vender Config Files
/vendor/mediatek/proprietary/custom/common/hal/imgsensor_src
 
sensorlist.cpp

Note: sensorlist.cpp 中的 SensorList[] 與 imgsensor_sensor_list.c 中的 gimgsensor_sensor_list 的 sensor 的順序必須一致,否則 user space 和 kernel space 在通過 ioctl 傳遞命令 id 時會對應錯誤。

/vendor/mediatek/proprietary/custom/mt6789/hal/imgsensor_src
 
cfg_setting_imgsensor.cpp

注意:kernel 底層的MCLK_0/1/2 ----> 分別對應HAL層的 MCLK_1/2/3

Tunning文件
Note:

(1)Tuning Parameter 與 Metadata 可以採用下圖作爲參考,參考複製對應文件夾並將其中所有的Sensor Name、Sensor Id等更改成當前需要porting的sensor的對應名稱,一共三處。此處需要注意:參考的sensor tunning 配置必須對應上,例如 前攝只能參考和 sub 相關的文件配置,否則會出現踩內存現象;

(2) 修改過程中注意 sensor name 和 driver 驅動的大小寫問題即可,具體的 mediatek 信息不會影響點亮階段,但會對後續的出圖細節有影響,需要點亮之後再進行調試

(3)Kernel 版本號可以根據當前 Project 的 ProjectConfig.mk 中的 LINUX_KERNEL_VERSION 得知。

Driver 是 v1_1 或者其他版本可以通過 Platform 下的 Makefile 中的 COMMON_VERSION 得知。

/vendor/mediatek/proprietary/custom/mt6789/hal/imgsensor/ver1/

/vendor/mediatek/proprietary/custom/mt6789/hal/imgsensor_metadata/

/vendor/mediatek/proprietary/custom/common/hal/imgsensor_metadata/sensor/
/vendor/mediatek/proprietary/scripts/soong/mtkcam/
 
mtkcamvars.go
/vendor/mediatek/proprietary/tools/dct/dws/mt6789
 
k6789v1_64.dws

dws(設備樹相關)check gpio,一般不需要改動。

/vendor/mediatek/proprietary/hardware/mtkcam/include/mtkcam/drv/
 
IHalSensor.h

檢查一下信息是否和 kernel 層信息相同或者是否需要添加 sensor ,一般不需要改動。

3、總結

通過上面的代碼流程,可以知道上開機時,camera模塊先會將所有的MCLK打開,然後對依次對對應的sensor進行上電,讀取ID(判斷I2C是否正常通訊)。這部分調試過程中遇到的問題總結如下:

3.1、注意事項

kernel 重要的是 module 的驅動代碼和設備樹添加,驅動代碼的改動需要根據模組廠給的配置文檔,一般裏面包含了驅動的所有信息,包括一些 dts 配置、init setting、i2c_addr、分辨率(注意屏比例)、上電時序等一些重要信息
device 中 config.mk 文件修改後,要將 out 相關所有目錄刪除,再全部編譯,否則會導致踩內存的橙色界面
vender 參考的 sensor tunning 配置必須對應上,例如 前攝只能參考和 sub 相關的文件配置,否則會出現踩內存現象
參考 sensor 進行復制替換時注意大小寫的問題!!!
注意排除干擾項、無關項,單獨點亮一顆 sensor 時,先到 config 文件刪除其餘無關的 sensor 驅動,eeprom 相關的也刪除,camera 設備原理圖沒有的引腳也要到 dtsi 和上電相關的文件 cfg_table.c 中刪除。

3.2、ID讀取不到,I2C不通

檢查上電時序,3項電壓(AVDD/DVDD/IOVDD)是否正確;
檢查 kernerl 層的 imgsensor_sensor_list.c 和 vendor 層的 sensorlist.cpp 中的位置是否一致。
I2C地址及通道設置是否正確;
確認 i2c 可以正常通信,通過萬用表看看有無電流,萬用表也可以用來測量配置的 regulator 是否正確,測量電壓時首先屏蔽 imgsensor_hw.c 中的下電代碼,最後編譯完成,通過 i2c write/read 工具讀寫寄存器,將對應 regulator 的所有電源全部打開,之後測量電壓。
檢查 cfg_setting_imgsensor.cpp 中 MCLK 和 HW 鏈接配置是否正確;
如果還是無法讀到 sensor id,先熟悉以下驅動代碼以及上電代碼,通過打印 log 的方式檢查具體執行到哪個模塊: camera 的入口在 imgsensor.c 最下方的 init 函數,通過它綁定一個 platform 的驅動,我們在到驅動對應的 probe 函數下看它如何執行,主要包括設備的匹配註冊,imgsensor_hw_init,imgsensor_proc_init,sensorlist_init,其中上電部分的代碼通過 imgsensor_hw_init 到達 imgsensor_hw.c 文件,獲取硬件信息配置之後分別到平臺定義的標準化接口 mclk.c、regulator.c、gpio.c 中執行標準化接口,這樣一路打印 log,大概率會發現上電過程哪裏出現問題,根據問題去檢查對應模塊。
讀到 sensor id 之後,如果相機無法預覽,需要到 imgsensor.c 以及驅動代碼中檢查 open 之後的執行情況,check 驅動中的 init_setting 、mode setting 、imgsensor_winsize_info 是否正確。
3.3、Camera 啓動時間過長
檢查 Sensor 上電時序要求的延時,是否有偏長的情況;
去掉多餘的 I2C 地址,因爲大部分驅動會多添加一些地址;
OTP的加載調整到每次開機時第一次打開加載,之後不加載;
sensorInit如果時間過長,可以調節I2C speed(400->1000);

原文鏈接:https://blog.csdn.net/Sugar_wolf/article/details/127512088

至此,本篇已結束。轉載網絡的文章,小編覺得很優秀,歡迎點擊閱讀原文,支持原創作者,如有侵權,懇請聯繫小編刪除,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章