MTK camera 閃光燈Flashlight驅動除錯流程
Camera Flash 驅動分析
一、Flash驅動涉及到的檔案包含:
mediatek /custom/common/kernel/flashlight/src/kd_flashlightlist.c
mediatek /custom/huaqin_bsp/at808p/base/kernel/flashlight/constant_flashlight/leds_strobe.c
mediatek /platform/mt6592/hardware/mtkcam/core/featureio/drv/strobe/flashlight_drv.cpp
mediatek/platform/mt6592/hardware/mtkcam/core/featureio/pipe/aaa/flash_mgr/flash_mgr.cpp
mediatek/platform/mt6592/hardware/mtkcam/core/featureio/pipe/aaa/flash_mgr/flash_cct.cpp
mediatek/platform/mt6592/hardware/mtkcam/acdk/src/cct/if/cct_feature.cpp
二、Flash驅動程式碼流程分析:
i. mediatek /custom/common/kernel/flashlight/src/kd_flashlightlist.c
主要完成裝置的註冊和初始化。
1.註冊一個平臺裝置:名為"kd_camera_flashlight";
2.註冊一個平臺驅動,name和我們的devices name同名,這個名字主要用來和HAL層的name做匹配用;
3.對IOCTL的一個填充,供HAL呼叫;
4.做一個介面主要跟我們實際使用的Flash驅動對接,以kdFlashlightList羅列出來;
ii. mediatek/custom/huaqin_bsp/at808p/base/kernel/flashlight/constant_flashlight/leds_strobe.c
1. 這個檔案就是我們實際性的使用的Flash驅動檔案,從
mediatek/config/huaqin92_wet_b2a_tdd/xxx/ProjectConfig.mk檔案中CUSTOM_KERNEL_FLASHLIGHT配置獲取具體使用的Flash驅動。
如:
CUSTOM_HAL_FLASHLIGHT= constant_flashlight
CUSTOM_KERNEL_FLASHLIGHT = constant_flashlight
2. 該檔案和kd_flashlightlist.c檔案的對接函式為:
323 MUINT32constantFlashlightInit(PFLASHLIGHT_FUNCTION_STRUCT *pfFunc)
3. 這個檔案完成的任務是填充以下幾個函式:
315FLASHLIGHT_FUNCTION_STRUCT constantFlashlightFunc=
316{
317 constant_flashlight_open,
318 constant_flashlight_release,
319 constant_flashlight_ioctl
320 };
4. 我們主要分析的是constant_flashlight_ioctl,以為這是跟HAL實際握手的介面。
iii. mediatek/platform/mt6592/hardware/mtkcam/core/featureio/drv/strobe/flashlight_drv.cpp
這個檔案完成的任務比較多,主要是一些類的實現和定義。
825 intFlashlightDrv::setFlashlightModeConf(unsigned long a_strobeMode)
897 intFlashlightDrv::setCaptureFlashlightConf(unsigned long a_strobeWidth)
952 intFlashlightDrv::setCaptureDelay(unsigned int value)
1021 intFlashlightDrv::getDuty(int* duty)
1090 intFlashlightDrv::lowPowerDetectEnd(int* isLowPower)
主要是為flash_mgr.cpp提供介面。
iv. mediatek/platform/mt6592/hardware/mtkcam/core/featureio/pipe/aaa/flash_mgr/flash_mgr.cpp
實現閃光燈模式的設定和獲取、拍照/攝像預覽的開啟和終止、閃光燈裝置的開啟和關閉等等。
1479 void FlashMgr::setTorchOnOff(int en)
2276 intFlashMgr::setFlashMode(int mode)
v. mediatek/platform/mt6592/hardware/mtkcam/core/featureio/pipe/aaa/flash_mgr/flash_cct.cpp
呼叫lash_mgr.cpp中的函式來給cct_feature.cpp提供介面。
128 int FlashMgr::cctFlashEnable(int en)
129 {
130 LogInfo("cctFlashEnable(en=%d) line=%d",en,__LINE__);
131 if(en==1)
132 {
133 setFlashMode(FLASHLIGHT_FORCE_ON);
134 }
135 else
136 {
137 setFlashMode(FLASHLIGHT_FORCE_OFF);
138 }
139 return 0;
140 }
vi. mediatek/platform/mt6592/hardware/mtkcam/acdk/src/cct/if/cct_feature.cpp
呼叫flash_cct.cpp中的函式,並以IOCTL的形式進行封裝,供更上一層次呼叫。具體的沒有在繼續跟下去,有興趣的話,可以再往上分析分析。
MINT32 CctImp::aaaCCTFeatureControl
361 case ACDK_CCT_OP_FLASH_ENABLE:
362 err = FlashMgr::getInstance()->cctFlashEnable(1); //YosenFlash
363 break;
364 case ACDK_CCT_OP_FLASH_DISABLE:
365 err = FlashMgr::getInstance()->cctFlashEnable(0); //YosenFlash