MTK 6573フラッシュテスト
6102 ワード
/*******************************************************************************/
以下のコードはkd_に加算されます.flashlightlist.cのprobe関数の中にあります.
LDO関数宣言を開く
//PMUの電源を入れて、cameraモジュールインタフェースを有効にします.これで私たちのGPIO 95が開くことができて、前にこのLDOを開かなかったので、試してみましたがだめです.
PMUモジュールの給電原理の設計はやはり悪くなくて、省電力です!
//BBのGPIO定義によると、GPIO 95というピンが使われています.またGPIOの動作モード、方向、出力値を設定します.これは一時的な構成で、
fixme: when dct is done!
注意:この定義は一時的であり、DCTの構成ツールでIoポートに対してGPIOモードに構成する.cmflashモードではありません!
//******************************************************************************
追加:DCT構成後のパラメータ.このパラメータを使用する場合は、ヘッダファイルcust_を追加してください.gpio_usage.h
#define GPIO_CAMERA_FLASH_EN_PIN GPIO95 #define GPIO_CAMERA_FLASH_EN_PIN_M_GPIO GPIO_MODE_00 #define GPIO_CAMERA_FLASH_EN_PIN_M_EINT GPIO_MODE_03 #define GPIO_CAMERA_FLASH_EN_PIN_M_PWM GPIO_MODE_02 #define GPIO_CAMERA_FLASH_EN_PIN_M_CMFLASH GPIO_MODE_01
これは具体的なモデルの駆動です.総makefileに配置されているのは
CUSTOM_KERNEL_FLASHLIGHT = constant_flashlight
以下のコードはkd_に加算されます.flashlightlist.cのprobe関数の中にあります.
LDO関数宣言を開く
extern void upmu_ldo_enable(upmu_ldo_list_enum ldo, kal_bool enable);
extern void upmu_ldo_vol_sel(upmu_ldo_list_enum ldo, upmu_ldo_vol_enum vol);
//PMUの電源を入れて、cameraモジュールインタフェースを有効にします.これで私たちのGPIO 95が開くことができて、前にこのLDOを開かなかったので、試してみましたがだめです.
PMUモジュールの給電原理の設計はやはり悪くなくて、省電力です!
upmu_ldo_vol_sel(MT65XX_POWER_LDO_VCAMD2, VOL_1800);
upmu_ldo_enable(MT65XX_POWER_LDO_VCAMD2, KAL_TRUE);
upmu_ldo_vol_sel(MT65XX_POWER_LDO_VCAMD, VOL_1500);
upmu_ldo_enable(MT65XX_POWER_LDO_VCAMD, KAL_TRUE);
upmu_ldo_vol_sel(MT65XX_POWER_LDO_VCAMA, VOL_1800);
upmu_ldo_enable(MT65XX_POWER_LDO_VCAMA, KAL_TRUE);
//BBのGPIO定義によると、GPIO 95というピンが使われています.またGPIOの動作モード、方向、出力値を設定します.これは一時的な構成で、
fixme: when dct is done!
注意:この定義は一時的であり、DCTの構成ツールでIoポートに対してGPIOモードに構成する.cmflashモードではありません!
#define GPIO_CAMERA_FLASH_EN_PIN GPIO95 // 46
mt_set_gpio_mode(GPIO_CAMERA_FLASH_EN_PIN, GPIO_CTP_EN_PIN_M_GPIO);
mt_set_gpio_dir(GPIO_CAMERA_FLASH_EN_PIN, GPIO_DIR_OUT);
mt_set_gpio_out(GPIO_CAMERA_FLASH_EN_PIN, GPIO_OUT_ONE);
while (1)
{
, flashlight probe 。 。
mt_set_gpio_out(GPIO_CAMERA_FLASH_EN_PIN,GPIO_OUT_ONE);
mdelay(20);
mt_set_gpio_out(GPIO_CAMERA_FLASH_EN_PIN,GPIO_OUT_ZERO);
mdelay(20);
mt_set_gpio_out(GPIO_CAMERA_FLASH_EN_PIN,GPIO_OUT_ONE);
mdelay(20);
mt_set_gpio_out(GPIO_CAMERA_FLASH_EN_PIN,GPIO_OUT_ZERO);
}
//******************************************************************************
追加:DCT構成後のパラメータ.このパラメータを使用する場合は、ヘッダファイルcust_を追加してください.gpio_usage.h
#define GPIO_CAMERA_FLASH_EN_PIN GPIO95 #define GPIO_CAMERA_FLASH_EN_PIN_M_GPIO GPIO_MODE_00 #define GPIO_CAMERA_FLASH_EN_PIN_M_EINT GPIO_MODE_03 #define GPIO_CAMERA_FLASH_EN_PIN_M_PWM GPIO_MODE_02 #define GPIO_CAMERA_FLASH_EN_PIN_M_CMFLASH GPIO_MODE_01
これは具体的なモデルの駆動です.総makefileに配置されているのは
CUSTOM_KERNEL_FLASHLIGHT = constant_flashlight
mediatech/common/kernel/flashlight/ 。
ssize_t gpio_FL_Enable(void) {
//Enable
if(mt_set_gpio_out(GPIO_CAMERA_FLASH_EN,GPIO_OUT_ONE)){PK_DBG(" set gpio failed!!
");} //
return 0;
}
#define FL_Enable() gpio_FL_Enable() 。
static int constant_flashlight_ioctl(MUINT32 cmd, MUINT32 arg)
{
int i4RetValue = 0;
int iFlashType = (int)FLASHLIGHT_NONE;
//PK_DBG(" start
");
//when ON state , only disable command is permitted.
if ( (TRUE == g_strobe_On) && !((FLASHLIGHTIOC_T_ENABLE == cmd) && (0 == arg)) )
{
PK_DBG(" is already ON OR check parameters!
");
//goto strobe_ioctl_error;
return i4RetValue;
}
switch(cmd)
{
case FLASHLIGHTIOC_T_ENABLE :
if ( arg && strobe_width ) {
if ( (FLASHLIGHTDRV_STATE_PREVIEW == strobe_eState ) || \
(FLASHLIGHTDRV_STATE_STILL == strobe_eState && KD_FLASHLIGHT_FLASH_MODE_STROBE_WIDTH != strobe_width) ) { \
//enable strobe watchDog timer. \
strobe_WDTConfig();
if (FLASH_LIGHT_WDT_DISABLE != g_WDTTimeout_ms) {
strobe_WDTStart();
}
FL_Enable(); // ioctl 。 。
g_strobe_On = TRUE;
PK_DBG(" FLASHLIGHTIOC_T_ENABLE(1)
");
}
else {
PK_DBG(" FLASHLIGHTIOC_T_ENABLE(1) skip due to FLASH mode
");
}
}
else{
//reset to LED low current torch mode
FL_Init();
if(FL_Disable()){
PK_ERR(" FL_Disable fail!
");
goto strobe_ioctl_error;
}
g_strobe_On = FALSE;
PK_DBG(" FLASHLIGHTIOC_T_ENABLE(0)
");
//disable strobe watchDog timer.
strobe_WDTStop();
}
break;
case FLASHLIGHTIOC_T_LEVEL:
PK_DBG(" level:%x
",(int)arg);
if (KD_FLASHLIGHT_FLASH_MODE_STROBE_WIDTH == arg) {
//set high current flash mode
strobe_width = KD_FLASHLIGHT_FLASH_MODE_STROBE_WIDTH;
FL_Flash_Mode();
PK_DBG(" FL_Flash_Mode()
");
}
else {
if(arg>32) {arg=32;}
strobe_width = arg;
if (arg > 0)
{
//reset to LED low current torch mode
FL_Init();
if(FL_dim_duty((kal_int8)arg-1)){
//0(weak)~31(strong)
PK_ERR(" FL_dim_duty fail!
");
//i4RetValue = -EINVAL;
goto strobe_ioctl_error;
}
}
}
break;
case FLASHLIGHTIOC_T_FLASHTIME:
strobe_Timeus = (u32)arg;
PK_DBG(" strobe_Timeus:%d
",(int)strobe_Timeus);
break;
case FLASHLIGHTIOC_T_STATE:
strobe_eState = (eFlashlightState)arg;
break;
case FLASHLIGHTIOC_G_FLASHTYPE:
iFlashType = FLASHLIGHT_LED_CONSTANT;
if(copy_to_user((void __user *) arg , (void*)&iFlashType , _IOC_SIZE(cmd)))
{
PK_DBG(" ioctl copy to user failed
");
return -EFAULT;
}
break;
default :
PK_DBG(" No such command
");
i4RetValue = -EPERM;
break;
}
//PK_DBG(" done
");
return i4RetValue;
strobe_ioctl_error:
PK_DBG(" Error or ON state!
");
return -EPERM;
}