mtk 6572平臺led指示燈 調試

led充電指示燈調試


相關文件目錄
custom//kernel/leds/mt65xx/cust_leds.c
kernel/drivers/leds/leds_drv.c
platform/mt6572/kernel/drivers/leds/leds.c


static struct cust_mt65xx_led cust_led_list[MT65XX_LED_TYPE_TOTAL] = {
 {"red", MT65XX_LED_MODE_PWM, PWM1,{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_GPIO, -1, {0}},
 {"lcd-backlight", MT65XX_LED_MODE_PMIC,               MT65XX_LED_PMIC_LCD_ISINK, {0}},
}; };
對於led閃爍燈來說我們用pwm波控制方式去調用具體要到kernel/drivers/leds/leds_drv.c目錄下添加以下代碼來提供節點給上層調用
static unsigned int notify_led_enable;




static unsigned long delayon = 512;
static unsigned long delayoff = 512;




static ssize_t store_notify_led(struct device *dev, struct device_attribute *attr ,const char *buf,size_t size) //控制led閃爍
{
char *pvalue = NULL;
unsigned int notify_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)
{
notify_led = simple_strtoul(buf,&pvalue,10);
if(notify_led == 1)
{
mt_set_gpio_out(GPIO128,GPIO_OUT_ONE);
notify_led_enable = 1;
mt_led_blink_pmic(MT65XX_LED_PMIC_NLED_ISINK3, &led_tmp_seting);
//led_set_pwm(PWM1, &led_tmp_seting);




}
if(notify_led == 0)
{
mt_set_gpio_out(GPIO128,GPIO_OUT_ZERO);
notify_led_enable = 0;
mt65xx_led_set(led_cdev,0);
}
}
return size;




}




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




}




static DEVICE_ATTR (notify_led, 0664, show_notify_led, store_notify_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)
{
//LEDS_DEBUG("store_pwm_register: size:%d,sddress :0x&s\n", size, buf);
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);
return 0;




}




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)
{
//LEDS_DEBUG("store_pwm_register: size:%d,sddress :0x&s\n", size, buf);
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);
return 0;




}
static DEVICE_ATTR(delay_off,0664, show_delay_off,store_delay_off);
通過iadb shell進入cd /sys/class/leds/red
brightness
delay_off
delay_on
device
max_brightness
notify_led 
power
subsystem
trigger
uevent
對以下節點進行操作控制led燈閃爍
echo 1 > notify_led 這時就會閃爍led
echo 0 > notify_led 停止閃爍
控制閃爍延遲亮滅時間
delay_off
delay_on
控制led初始化
static int __init mt65xx_leds_probe(struct platform_device *pdev)
{
int i;
int ret, rc;
struct cust_mt65xx_led *cust_led_list = mt_get_cust_led_list();
LEDS_DRV_DEBUG("[LED]%s\n", __func__);
get_div_array();
for (i = 0; i < MT65XX_LED_TYPE_TOTAL; i++) {
if (cust_led_list[i].mode == MT65XX_LED_MODE_NONE) {
g_leds_data[i] = NULL;
continue;
}


g_leds_data[i] = kzalloc(sizeof(struct mt65xx_led_data), GFP_KERNEL);
if (!g_leds_data[i]) {
ret = -ENOMEM;
goto err;
}


g_leds_data[i]->cust.mode = cust_led_list[i].mode;
g_leds_data[i]->cust.data = cust_led_list[i].data;
g_leds_data[i]->cust.name = cust_led_list[i].name;


g_leds_data[i]->cdev.name = cust_led_list[i].name;
g_leds_data[i]->cust.config_data = cust_led_list[i].config_data;//bei add


g_leds_data[i]->cdev.brightness_set = mt65xx_led_set;
g_leds_data[i]->cdev.blink_set = mt65xx_blink_set;


INIT_WORK(&g_leds_data[i]->work, mt_mt65xx_led_work);


ret = led_classdev_register(&pdev->dev, &g_leds_data[i]->cdev);


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;
}
if(strcmp(g_leds_data[i]->cdev.name,"red")==0)//創建各個節點如notify_led delay_off delay_on
    {
rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_notify_led);
if(rc)
{
LEDS_DRV_DEBUG("[notify_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(GPIO75, GPIO_MODE_01);
mt_set_gpio_mode(GPIO128, GPIO_MODE_00);
mt_set_gpio_dir(GPIO128, GPIO_DIR_OUT);
mt_set_gpio_out(GPIO128, GPIO_OUT_ONE);
//mt65xx_led_set_cust(&cust_led_list[0],0);
}
if (ret)
goto err;


}
#ifdef CONTROL_BL_TEMPERATURE


last_level = 0;
limit = 255;
limit_flag = 0;
current_level = 0;
LEDS_DRV_DEBUG("[LED]led probe last_level = %d, limit = %d, limit_flag = %d, current_level = %d\n",last_level,limit,limit_flag,current_level);
#endif




return 0;


err:
if (i) {
for (i = i-1; i >=0; i--) {
if (!g_leds_data[i])
continue;
led_classdev_unregister(&g_leds_data[i]->cdev);
cancel_work_sync(&g_leds_data[i]->work);
kfree(g_leds_data[i]);
g_leds_data[i] = NULL;
}
}


return ret;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章