mtk 充电闪光指示灯驱动调试

本文详细介绍了基于MTK6572 KaiOS平台的充电指示灯控制机制,包括硬件连接、软件配置及GPIO设置。重点阐述了充电灯的闪烁控制、延迟时间和手电筒LED的开关实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mtk 充电闪光指示灯
平台 mtk 6572 kaios
根据原理图 引脚为 FLASH_LED对应 GPIO140根据原理图,该灯是输出低电平点亮 用的供电是ISINK0

Q:\kaios_72_normal\kernel-3.4\arch\arm\mach-mt6572\fise6572_kais_k\leds\mt65xx\cust_leds.c
    static struct cust_mt65xx_led cust_led_list[MT65XX_LED_TYPE_TOTAL] = {
    #if defined (CONFIG_FISE_PROJECT_U7261) 
    {"red",               MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK0, {0}},
    {"green",             MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK0, {0}},
    {"blue",              MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK0, {0}},
    {"jogball-backlight", MT65XX_LED_MODE_NONE, -1, {0}},
    {"keyboard-backlight",MT65XX_LED_MODE_NONE, -1, {0}},
    {"button-backlight",  MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK3, {0}},
    {"lcd-backlight",     MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_LCD_ISINK, {0}},
    #elif defined (CONFIG_FISE_PROJECT_U7210)//pangjw 2019.7.2
    {"blue",              MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK0, {0}},//定义为ISINK0供电
    {"green",             MT65XX_LED_MODE_NONE, -1, {0}},
    {"red",               MT65XX_LED_MODE_NONE, -1, {0}},
    {"jogball-backlight", MT65XX_LED_MODE_NONE, -1, {0}},
    {"keyboard-backlight",MT65XX_LED_MODE_NONE, -1, {0}},
    {"button-backlight",  MT65XX_LED_MODE_NONE, -1, {0}},
    {"lcd-backlight",     MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_LCD_ISINK, {0}},
    #else
    {"red",               MT65XX_LED_MODE_NONE, -1, {0}},
    {"green",             MT65XX_LED_MODE_NONE, -1, {0}},
    {"blue",              MT65XX_LED_MODE_NONE, -1, {0}},
    {"jogball-backlight", MT65XX_LED_MODE_NONE, -1, {0}},
    {"keyboard-backlight",MT65XX_LED_MODE_NONE, -1, {0}},
    {"button-backlight",  MT65XX_LED_MODE_NONE, -1, {0}},
    {"lcd-backlight",     MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_LCD_ISINK, {0}},
    #endif
};
    }
 
Q:\kaios_72_normal\vendor\mediatek\proprietary\bootable\bootloader\lk\target\fise6572_kais_k\cust_leds.c
    static struct cust_mt65xx_led cust_led_list[MT65XX_LED_TYPE_TOTAL] = {
    #if defined (FISE_PROJECT_U7261) //fise-driver dweizheng 20190110
    {"red",               MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK0, {0}},
    {"green",             MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK0, {0}},
    {"blue",              MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK0, {0}},
    {"jogball-backlight", MT65XX_LED_MODE_NONE, -1, {0}},
    {"keyboard-backlight",MT65XX_LED_MODE_NONE, -1, {0}},
    {"button-backlight",  MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK3, {0}},
    {"lcd-backlight",     MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_LCD_ISINK, {0}},
    #elif defined (FISE_PROJECT_U7210)//pangjw 2019.7.2
    {"blue",              MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK0, {0}},
    {"green",             MT65XX_LED_MODE_NONE, -1, {0}},
    {"red",               MT65XX_LED_MODE_NONE, -1, {0}},
    {"jogball-backlight", MT65XX_LED_MODE_NONE, -1, {0}},
    {"keyboard-backlight",MT65XX_LED_MODE_NONE, -1, {0}},
    {"button-backlight",  MT65XX_LED_MODE_NONE, -1, {0}},
    {"lcd-backlight",     MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_LCD_ISINK, {0}},
    #else
    {"red",               MT65XX_LED_MODE_NONE, -1, {0}},
    {"green",             MT65XX_LED_MODE_NONE, -1, {0}},
    {"blue",              MT65XX_LED_MODE_NONE, -1, {0}},
    {"jogball-backlight", MT65XX_LED_MODE_NONE, -1, {0}},
    {"keyboard-backlight",MT65XX_LED_MODE_NONE, -1, {0}},
    {"button-backlight",  MT65XX_LED_MODE_NONE, -1, {0}},
    {"lcd-backlight",     MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_LCD_ISINK, {0}},
    #endif
};
//MT65XX_LED_MODE_PMIC和MT65XX_LED_PMIC_NLED_ISINK0
定义在Q:\kaios_72_normal\kernel-3.4\drivers\misc\mediatek\leds\mt6572\leds.c

Q:\kaios_72_normal\kernel-3.4\drivers\leds\mediatek\leds_drv.c

#define charging_lamp_gpio GPIO140
#define electric_torch_gpio GPIO77

static unsigned int charging_led_enable;
static unsigned long delayon = 512;
static unsigned long delayoff = 512;
static unsigned int torch_led_enable;

static ssize_t store_charging_led(struct device *dev, struct device_attribute *attr ,const char *buf,size_t size) //控制led闪烁
{
    char *pvalue = NULL;
    unsigned int charging_led;
    struct cust_mt65xx_led *cust_led_list =get_cust_led_list();
    struct nled_setting led_tmp_seting;
    led_tmp_seting.nled_mode = NLED_BLINK;
    led_tmp_seting.blink_off_time = delayoff;
    led_tmp_seting.blink_on_time = delayon;
    struct led_classdev *led_cdev = dev_get_drvdata(dev);
    if(buf != NULL && size != 0)
    {
    charging_led = simple_strtoul(buf,&pvalue,10);
    if(charging_led == 1)
    {
    mt_set_gpio_out(charging_lamp_gpio,1);
    charging_led_enable = 1;
    mt_led_blink_pmic(MT65XX_LED_PMIC_NLED_ISINK0, &led_tmp_seting);
    //led_set_pwm(PWM1, &led_tmp_seting);

    }
    if(charging_led == 0)
    {
    mt_set_gpio_out(charging_lamp_gpio,0);
    charging_led_enable = 0;
    mt65xx_led_set(led_cdev,0);
    }
    }
    return size;
}

static ssize_t show_charging_led(struct device *dev,struct device_attribute *attr, char *buf)
{
    return sprintf( buf,"%u\n",charging_led_enable);

}

static DEVICE_ATTR (charging_led, 0664, show_charging_led, store_charging_led);

static ssize_t store_delay_on(struct device *dev,struct device_attribute *attr,const char *buf,size_t size)
{
    char *pvalue = NULL;
    unsigned int delay_on = 0;
    if(buf != NULL && size != 0)
    {
    delay_on = simple_strtoul(buf,&pvalue,10);
    delayon = delay_on;
    }
    return size;
}

static ssize_t show_delay_on(struct device *dev,struct device_attribute *attr,char *buf)
{
    unsigned int delay_on = delayon;
    return sprintf(buf,"%u\n" ,delay_on);

}

static DEVICE_ATTR(delay_on,0664, show_delay_on,store_delay_on);

static ssize_t store_delay_off(struct device *dev,struct device_attribute *attr,const char *buf,size_t size)
{
    char *pvalue = NULL;
    unsigned int delay_off = 0;
    if(buf != NULL && size != 0)
    {   
    delay_off = simple_strtoul(buf,&pvalue,10);
    delayoff = delay_off;
    }
    return size;
}

static ssize_t show_delay_off(struct device *dev,struct device_attribute *attr,char *buf)
{
    unsigned int delay_off = delayoff;
    return sprintf(buf,"%u\n" ,delay_off);


}
static DEVICE_ATTR(delay_off,0664, show_delay_off,store_delay_off);


static ssize_t store_torch_led(struct device *dev, struct device_attribute *attr ,const char *buf,size_t size)
{
    char *pvalue = NULL;
    unsigned int torch_led;
    if(buf != NULL && size != 0)
    {
        torch_led = simple_strtoul(buf,&pvalue,10);
        if(torch_led == 1)
        {
            mt_set_gpio_out(electric_torch_gpio,1);
            torch_led_enable = 1;
        }
        if(torch_led == 0)
        {
            mt_set_gpio_out(electric_torch_gpio,0);
            torch_led_enable = 0;
        }
    }
    return size;
}

static ssize_t show_torch_led(struct device *dev,struct device_attribute *attr, char *buf)
{
    return sprintf(buf,"%u\n",torch_led_enable);
}

static DEVICE_ATTR (torch_led, 0664, show_torch_led, store_torch_led);

static int __init mt65xx_leds_probe(struct platform_device *pdev)
{
    #if defined (CONFIG_FISE_PROJECT_U7210)      
    if(strcmp(g_leds_data[i]->cdev.name,"blue")==0)//创建各个节点如charging_led delay_off delay_on
    {
        rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_charging_led);
        if(rc)
        {
               LEDS_DRV_DEBUG("[charging_led] device create file duty fail!\n");
        }
        rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_delay_on);
        if(rc)
        {
                LEDS_DRV_DEBUG("[delay_on] device create file duty fail!\n");
        }
        rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_delay_off);
        if(rc)
        {
            LEDS_DRV_DEBUG("[delay_off] device create file duty fail!\n");
        }

        //brightness_set_pmic(MT65XX_LED_PMIC_NLED_ISINK3,255, 0);
        //mt_set_gpio_mode(charging_lamp_gpio, GPIO_MODE_00);
        mt_set_gpio_dir(charging_lamp_gpio, GPIO_DIR_OUT);
        mt_set_gpio_out(charging_lamp_gpio, GPIO_OUT_ONE);
        //mt65xx_led_set_cust(&cust_led_list[0],0);
        
#if 1
        rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_torch_led);
        if(rc)
        {
            LEDS_DRV_DEBUG("[torch_led] device create file duty fail!\n");
        }
        //mt_set_gpio_mode(electric_torch_gpio, GPIO_MODE_00);
        mt_set_gpio_dir(electric_torch_gpio, GPIO_DIR_OUT);
        mt_set_gpio_out(electric_torch_gpio, GPIO_OUT_ONE);
#endif
    }
    
            if(strcmp(g_leds_data[i]->cdev.name,"lcd-backlight") == 0)
        {
            rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_duty);
            if(rc)
            {
                LEDS_DRV_DEBUG("[LED]device_create_file duty fail!\n");
            }
            
            rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_div);
            if(rc)
            {
                LEDS_DRV_DEBUG("[LED]device_create_file duty fail!\n");
            }
            
            rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_frequency);
            if(rc)
            {
                LEDS_DRV_DEBUG("[LED]device_create_file duty fail!\n");
            }
            
        rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_pwm_register);
            if(rc)
            {
                LEDS_DRV_DEBUG("[LED]device_create_file duty fail!\n");
            }
            bl_setting = &g_leds_data[i]->cust;
        }
        

                    /******pangjw add end**************/
#else    
   

        
        if(strcmp(g_leds_data[i]->cdev.name,"lcd-backlight") == 0)
        {
            rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_duty);
            if(rc)
            {
                LEDS_DRV_DEBUG("[LED]device_create_file duty fail!\n");
            }
            
            rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_div);
            if(rc)
            {
                LEDS_DRV_DEBUG("[LED]device_create_file duty fail!\n");
            }
            
            rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_frequency);
            if(rc)
            {
                LEDS_DRV_DEBUG("[LED]device_create_file duty fail!\n");
            }
            
        rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_pwm_register);
            if(rc)
            {
                LEDS_DRV_DEBUG("[LED]device_create_file duty fail!\n");
            }
            bl_setting = &g_leds_data[i]->cust;
        }
#endif 
}

//注意这个定义#if defined (CONFIG_FISE_PROJECT_U7210)需在以下路径下配置
Q:\kaios_72_normal\kernel-3.4\arch\arm\configs\fise6572_kais_k_debug_defconfig
    CONFIG_FISE_PROJECT_U7210=y
Q:\kaios_72_normal\kernel-3.4\arch\arm\configs\fise6572_kais_k_defconfig
    CONFIG_FISE_PROJECT_U7210=y
Q:\kaios_72_normal\kernel-3.4
    ifeq ($(FISE_PROJECT_U7210),yes)
        KBUILD_CPPFLAGS += -DFISE_PROJECT_U7210
    endif
Q:\kaios_72_normal\kernel-3.4\drivers\misc\mediatek\Kconfig
    config FISE_PROJECT_U7210
    bool "FISE_PROJECT_U7210"
    default n

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zeropoint127

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值