《点亮ISINK三色灯》

来源:互联网 发布:哪个网络手游装备靠打 编辑:程序博客网 时间:2024/04/27 14:44

《点亮ISINK三色灯》

环境:mt6580平台,android7.0

前言:由于有项目需要带三色灯的功能,调试了一天也没有搞出来。用以前的办法也搞不定,于是就愤怒了!
决定去 read the fucking code !!!。

一、原理图
这里写图片描述
1,原理图上很简单,就是靠三路ISINK来控制LED灯的亮灭。

二、代码部分

1,底层驱动部分    1.1alps\vendor\mediatek\proprietary\bootable\bootloader\lk\target\ww826_80_weg_n\cust_leds.c

     这里是lk阶段的驱动代码,这里一共也就几十行代码。我们看关键的!
     这里写图片描述
 这里我们先看 cust_led_list 这个结构体数组,它的类型是 struct cust_mt65xx_led
 这里写图片描述
 我们再看看 enum mt65xx_led_mode 和 struct PWM_config
 这里写图片描述
 这里写图片描述
 那么我现再去看前边的 cust_led_list[] 数组,这里边的成员就明白是什么了。例如:
 这里写图片描述
 
“red” :对应的是led的name
MT65XX_LED_MODE_PMIC :对应的是led的模式,这个枚举里一共有7种模式。当前red用的是PMIC模式
MT65XX_LED_PMIC_NLED_ISINK2:对应的是led的data,还不清楚作什么用。我们接着往下看
{0,0,0,0,0}:这个是config_data,和PWM数据相关的一个结构体变量。
那么回过头来看,这个cust_led_list[]是给谁去调用的呢?明显我们看到了这个函数:
这里写图片描述
这是一个结构体函数指针,那么这个 get_cust_led_list 指针又是在什么时候被调用的呢?
这里写图片描述
找到了两个关键的文件调用了它!其中ddp_pwm.c里主要是和lcd背光相关的,我们暂不去管它。去看 mt_leds.c,我们找到了它里边的这个函数:
这里写图片描述
这里写图片描述
我们看到了,get_cust_led_list 结构体指针在这里被调用了。那么我们又看看在那里调用了mt65xx_leds_brightness_set函数。
这里写图片描述
于是我们在 vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt6580/platform.c 这个文件里找到了调用,
这里写图片描述
………………………………..
………………………………..
这里写图片描述
我们看到它传进来的参数是 6和110。6对应的是led 的type,110对应的是led亮度大小。我们在cust_leds.h里看到这个枚举:
这里写图片描述
因此我们就知道这里是控制 lcd背光的,即是点亮背光灯,亮度为110。一整个lk层里,只点了LCD背光,
没有控制和ISINK三色灯相关的东西。那就只能是在kernel层里控制了,即是我们要去Kernel里跟代码。
这里写图片描述
可得知 platform_init()是在 lk层里的入口函数main初始化里被调用的。
这里写图片描述
这个是lk的入口函数,但不管怎么样。在跑完lk层以后,就会跳转到kernel层去。
这里写图片描述
结论1:在 lk层里还没有控制到 ISINK充电指示灯相关的东西,那么它应该是在kernel层里边去控制它的。

1.2,Kernel层power相关代码的路径:
alps/kernel-3.18/drivers/power/mediatek/xxx :这里是 common层充电函数的位置
alps/kernel-3.18/drivers/misc/mediatek/power/mt6580/ :这里是客制化电池相关的地方
alps/kernel-3.18/drivers/misc/mediatek/include/mt-plat/xxx
alps/kernel-3.18/drivers/misc/mediatek/leds/mt6580/xxx :这里就是led相关的,我们重点要关注这里!
我们要根据自己项目的配置去找到对应的代码。

ps: 由于这是第一次写这些东西,感觉上传图片类的和一些格式还是挺麻烦的。这篇就先写这里吧,下一篇写到kernel层的。

原创粉丝点击