零、闪光灯配置步骤(以真闪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
20. FlashLight调试日志
最新推荐文章于 2022-09-05 10:42:35 发布
本文档详细介绍了MT6580平台上闪光灯GPIO的配置步骤,包括dts、dws文件的修改以及相关驱动代码的分析。针对真闪ICDIO5151,讲解了如何控制GPIO实现闪光灯的手电筒和闪光模式,并通过代码示例展示了如何处理GPIO控制逻辑。此外,还讨论了在不同场景下,如更换闪光灯IC、处理假闪问题时的硬件和软件调整策略。
摘要由CSDN通过智能技术生成