20. FlashLight调试日志

本文档详细介绍了MT6580平台上闪光灯GPIO的配置步骤,包括dts、dws文件的修改以及相关驱动代码的分析。针对真闪ICDIO5151,讲解了如何控制GPIO实现闪光灯的手电筒和闪光模式,并通过代码示例展示了如何处理GPIO控制逻辑。此外,还讨论了在不同场景下,如更换闪光灯IC、处理假闪问题时的硬件和软件调整策略。
摘要由CSDN通过智能技术生成
零、闪光灯配置步骤(以真闪IC:DIO5151为例):
1. 查看硬件原理图,得知闪关灯IC接在cpu的哪两个GPIO上:
	main_flashlight:(后闪)
		enable	: GPIO43
		mode	: GPIO80(H-flashlight模式  L-torch手电筒模式)
	sub_flashlight:(前摄)
		enable	: GPIO42

2. dws配置pin脚:
			EintMode|Def.Mode	M0|M1|M2|M3|M4|M5|M6|M7|InPull En|InPull SelHigh|Def.Dir|In|Out|OutHigh|VarName1
	GPIO42	NC		// 有点奇怪NC也能控制?
	GPIO43			0:GPIO43	1  0  0  1  1  0  1  0  1		  0				 OUT	 0	1	0		GPIO_CAMERA_FLASH_EN_PIN
	GPIO80			0:GPIO80	1  0  0  0  0  0  0  0  1		  0				 OUT	 0	1	0		GPIO_CAMERA_FLASH_MOOD_PIN

3. dts配置gpio控制接口:
	3.1 mt6580.dtsi:
		+	strobe: strobe {
		+		compatible = "mediatek,mt6580-strobe";
		+	};
	
	3.2 k80hd_bsp_fwv_512m.dts
	
		+	/* STROBE GPIO standardization */
		+	&pio {
		+		strobe_intpin_default: strobedefaultcfg {
		+		};
		+		main_strobe_oh: mainstrobe@1 {
		+			pins_cmd_dat {
		+				pins = <PINMUX_GPIO43__FUNC_GPIO43>;
		+				slew-rate = <1>;
		+				output-high;
		+			};
		+		};
		+
		+		main_strobe_ol: mainstrobe@2 {
		+			pins_cmd_dat {
		+				pins = <PINMUX_GPIO43__FUNC_GPIO43>;
		+				slew-rate = <1>;
		+				output-low;
		+			};
		+		};
		+		main_strobe_mode_oh: mainstrobemode@1 {
		+			pins_cmd_dat {
		+				pins = <PINMUX_GPIO80__FUNC_GPIO80>;
		+				slew-rate = <1>;
		+				output-high;
		+			};
		+		};
		+		main_strobe_mode_ol: mainstrobemode@2 {
		+			pins_cmd_dat {
		+				pins = <PINMUX_GPIO80__FUNC_GPIO80>;
		+				slew-rate = <1>;
		+				output-low;
		+			};
		+		};
		+		sub_strobe_oh: substrobe@1 {
		+			pins_cmd_dat {
		+				pins = <PINMUX_GPIO42__FUNC_GPIO42>;
		+				slew-rate = <1>;
		+				output-high;
		+			};
		+		};
		+		sub_strobe_ol: substrobe@2 {
		+			pins_cmd_dat {
		+				pins = <PINMUX_GPIO42__FUNC_GPIO42>;
		+				slew-rate = <1>;
		+				output-low;
		+			};
		+		};
		+	};
		+
		+	&strobe {
		+		pinctrl-names = "default", "main_strobe_oh", "main_strobe_ol", "main_strobe_mode_oh", "main_strobe_mode_ol", "sub_strobe_oh", "sub_strobe_ol";
		+		pinctrl-0 = <&strobe_intpin_default>;
		+		pinctrl-1 = <&main_strobe_oh>;
		+		pinctrl-2 = <&main_strobe_ol>;
		+		pinctrl-4 = <&main_strobe_mode_ol>;
		+		pinctrl-5 = <&sub_strobe_oh>;
		+		pinctrl-6 = <&sub_strobe_ol>;
		+		status = "okay";
		+	};
		+	/* STROBE GPIO end */


	3.3 alps/kernel-3.18/drivers/misc/mediatek/flashlight/inc/kd_flashlight.h
		+	int strobe_gpio_init(struct platform_device *pdev);
		+	#ifdef CONFIG_KST_SUB_STROBE_SUPPORT
		+		int sub_strobe_gpio_init(struct platform_device *pdev);
		+	#endif
		
	3.4 alps/kernel-3.18/drivers/misc/mediatek/flashlight/src/mt6580/kd_flashlightlist.c
		+	#ifdef CONFIG_OF
		+	#include <linux/of.h>
		+	#include <linux/of_address.h>
		+	#include <linux/of_irq.h>
		+	#endif
	
		+	#ifdef CONFIG_OF
		+	static const struct of_device_id strobe_of_ids[] = {
		+		{.compatible = "mediatek,mt6580-strobe",},
		+		{}
		+	};
		+	#endif
			static struct platform_driver flashlight_platform_driver = {
				.probe = flashlight_probe,
				.remove = flashlight_remove,
				.shutdown = flashlight_shutdown,
				.driver = {
					   .name = FLASHLIGHT_DEVNAME,
					   .owner = THIS_MODULE,
		+	#ifdef CONFIG_OF
		+			   .of_match_table = strobe_of_ids,
		+	#endif
					   },
			};
		+	#ifndef CONFIG_OF
			static struct platform_device flashlight_platform_device = {
				.name = FLASHLIGHT_DEVNAME,
				.id = 0,
				.dev = {
					}
			};
		+	#endif
			static int __init flashlight_init(void)
			{
				int ret = 0;

				logI("[flashlight_probe] start ~");
		+	#ifndef CONFIG_OF
				ret = platform_device_register(&flashlight_platform_device);
				if (ret) {
					logI("[flashlight_probe] platform_device_register fail ~");
					return ret;
				}
		+	#endif
		
			static int flashlight_probe(struct platform_device *dev)
			{
				int ret = 0, err = 0;

				logI("[flashlight_probe] start ~");
		+	#ifdef CONFIG_OF	
		+		strobe_gpio_init(dev);
		+	#endif
		
		-	#ifdef WIN32
		+	#if 0 //#ifdef WIN32

	3.5 alps/kernel-3.18/drivers/misc/mediatek/flashlight/src/mt6580/constant_flashlight/leds_strobe.c
		+	struct pinctrl *strobectrl = NULL;
		+	struct pinctrl_state *main_strobe_oh = NULL;
		+	struct pinctrl_state *main_strobe_ol = NULL;
		+	#ifdef CONFIG_KST_REAL_FLASH_MODE
		+	struct pinctrl_state *main_strobe_mode_oh = NULL;
		+	struct pinctrl_state *main_strobe_mode_ol = NULL;
		+	#endif
		+	static DEFINE_MUTEX(main_strobe_gpio_mutex);
		+	int strobe_gpio_init(struct platform_device *pdev)
		+	{
		+		int ret = 0;
		+
		+		strobectrl = devm_pinctrl_get(&pdev->dev);
		+		if (IS_ERR(strobectrl)) {
		+			dev_err(&pdev->dev, "Cannot find strobe pinctrl!");
		+			ret = PTR_ERR(strobectrl);
		+		}
		+
		+		main_strobe_oh = pinctrl_lookup_state(strobectrl, "main_strobe_oh");
		+		if (IS_ERR(main_strobe_oh)) {
		+			ret = PTR_ERR(main_strobe_oh);
		+			pr_debug("%s : pinctrl err, main_strobe_oh\n", __func__);
		+		}
		+		
		+		main_strobe_ol = pinctrl_lookup_state(strobectrl, "main_strobe_ol");
		+		if (IS_ERR(main_strobe_ol)) {
		+			ret = PTR_ERR(main_strobe_ol);
		+			pr_debug("%s : pinctrl err, main_strobe_ol\n", __func__);
		+		}
		+	#ifdef CONFIG_KST_REAL_FLASH_MODE
		+		main_strobe_mode_oh = pinctrl_lookup_state(strobectrl, "main_strobe_mode_oh");
		+		if (IS_ERR(main_strobe_mode_oh)) {
		+			ret = PTR_ERR(main_strobe_mode_oh);
		+			pr_debug("%s : pinctrl err, main_strobe_mode_oh\n", __func__);
		+		}
		+		main_strobe_mode_ol = pinctrl_lookup_state(strobectrl, "main_strobe_mode_ol");
		+		if (IS_ERR(main_strobe_mode_ol)) {
		+			ret = PTR_ERR(main_strobe_mode_ol);
		+			pr_debug("%s : pinctrl err, main_strobe_mode_ol\n", __func__);
		+		}
		+	#endif
		+
		+		return ret;
		+	}
		+
		+	void strobe_gpio_set(int level)
		+	{
		+		mutex_lock(&main_strobe_gpio_mutex);
		+		if (level == 0)
		+			pinctrl_select_state(strobectrl, main_strobe_ol);
		+		else
		+			pinctrl_select_state(strobectrl, main_strobe_oh);
		+		mutex_unlock(&main_strobe_gpio_mutex);
		+	}
		+
		+	#ifdef CONFIG_KST_REAL_FLASH_MODE
		+	void strobe_mode_gpio_set(int level)
		+	{
		+		mutex_lock(&main_strobe_gpio_mutex);
		+		if (level == 0)
		+			pinctrl_select_state(strobectrl, main_strobe_mode_ol);
		+		else
		+			pinctrl_select_state(strobectrl, main_strobe_mode_oh);
		+		mutex_unlock(&main_strobe_gpio_mutex);
		+	}
		+	#endif

		+	#ifdef CONFIG_KST_REAL_FLASH_MODE
		+		#define LEDS_TORCH_MODE 		0
		+		#define LEDS_FLASH_MODE 		1
		+		#define LEDS_CUSTOM_MODE_THRES 	0
		+		static int flash_mode_pin = 0;
		+		#ifdef EN_PWM_CTRL
		+			static int g_timePWMOutTimeMs=0;
		+			static struct hrtimer g_timePWMOutTimer;
		+			void timerPWMInit(void);
		+			static b
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值