MTK LED驱动异常检测步骤

1.命名检查


        因为HAL层( KPOC和正常开机)里面有用字符串来描述文件结点的位置,而且名字都是
red/green/blue。所以,在一开始就要将Led ISINK的名字规范好,红灯的ISINK改名为red,绿灯改
名为green以此类推。(具体可以查看hal层里面对路径定义的字符串,使用本平台上面的PMIC是定义名字对的,只是要看清楚ISINK是否与颜色匹配)举例字符串:         "/sys/class/leds/red/brightness";
这里以使用mt6370.dtsi结点为例(请以您使用的版本为准)

rgbled {
compatible = "mediatek,mt6370_pmu_rgbled";//版本不同,名字不同,以实际为准。
interrupt-names = "isink4_short", "isink3_short",
"isink2_short", "isink1_short",
"isink4_open", "isink3_open",
"isink2_open", "isink1_open";
/* name cnt must be 4 */
mt,led_name = "mt6370_pmu_led1", "mt6370_pmu_led2",
"mt6370_pmu_led3", "mt6370_pmu_led4";
/* trigger cnt must be 4, mode can be selected as */
/* cc_mode -> const current mode */
/* pwm_mode -> pwm dimming mode */
/* breath_mode -> as the name */
mt,led_default_trigger = "cc_mode", "cc_mode",
"cc_mode", "none";
};


        其中标"led_name"的就是您的led名字。请确认红字连接的LED灯(一般led1-4分别对应着ISINK1-4),并将红字改为对应的LED名字,若没有使用的,可以不用更改。
注意:必须是red blue green 。

        如下:
Led1-3 分别对应red green blue灯,而led4没有使用。
        mt,led_name = "red", "green",
        "blue", "mt6370_pmu_led4";
补充:若是MT6370/71 的ISINK4(可以配置为硬件点亮)引脚想配置为硬件点亮,则不需要修改其名字。否则会被配置
为软件点亮。


2.检测HAL层。(开机异常检查lights.c,关机检查lights.cpp)


1)文件有效性判断


不同版本,的hal中的lights.c中,有些会分别去检测led的文件是否存在,并且是检测3色灯结点同
时存在,若是只定义了2个结点,少了其中某一个,都会导致上层与下层的通信中断,也就会出现
adb可控led,而上层不可控led的情况:

else if (0 == strcmp(LIGHT_ID_NOTIFICATIONS, name)) {
set_light = set_light_notifications;
if (access(RED_LED_FILE, F_OK) < 0) //判断RED文件是否存在
return -errno;
if (access(GREEN_LED_FILE, F_OK) < 0) //判断GREEN文件是否存在
return -errno;
if (access(BLUE_LED_FILE, F_OK) < 0) //判断BLUE文件是否存在
return -errno;
}


处理方法:
将没定义的文件检测去掉,或者全部去掉。


2)将PMIC框架修改为MT6370框架:


此步仅针对使用MT6370上LED的, PMIC上面的不需要修改此步骤。
因为默认的lights.c是针对PMIC上面的LED的,所以在使用MT6370上面的LED的时候,请在lights.c
中做如下更改,以绿灯为例(其他灯同理):


(1) 添加对应闪烁灯结点路径:


/*MT6370 LED*/
char const*const GREEN_PWM_DUTY = "/sys/class/leds/green/pwm_duty";
char const*const GREEN_PWM_DIM_FREQ = "/sys/class/leds/green/pwm_dim_freq";


(2) 修改对应的blink_xx().

static int blink_green(int level, int onMS, int offMS)
{
static int preStatus = 0; // 0: off, 1: blink, 2: no blink
int nowStatus;
int i = 0;
if (level == 0)
nowStatus = 0;
else if (onMS && offMS)
nowStatus = 1;
else
nowStatus = 2;
if (preStatus == nowStatus)
return -1;
#ifdef LIGHTS_DBG_ON
ALOGD("blink_green, level=%d, onMS=%d, offMS=%d\n", level, onMS, offMS);
#endif
if (nowStatus == 0) {
write_int(GREEN_LED_FILE, 0);
}
else if (nowStatus == 1) {
ALOGD("MTK:blink green\n");
write_str(GREEN_TRIGGER_FILE, "pwm_mode");
while (((access(GREEN_PWM_DUTY, F_OK) == -1) || (access(GREEN_PWM_DIM_FREQ, R_OK|W_OK)
== -1)) && i<10) {
ALOGD("GREEN_PWM_DUTY/FREQ doesn't exist or cannot write!!\n");
led_wait_delay(5);//sleep 5ms for wait kernel LED class create led node of fs
i++;
}
write_int(GREEN_PWM_DUTY, 5);
write_int(GREEN_PWM_DIM_FREQ, 3);
write_int(GREEN_LED_FILE, 0); // default full brightness
write_int(GREEN_LED_FILE, 255); // default full brightness
}
else {//常亮
ALOGD("MTK:set green brightness!!\n");
write_str(GREEN_TRIGGER_FILE, "cc_mode");
write_int(GREEN_LED_FILE, 255); // default full brightness
}
preStatus = nowStatus;
return 0;
}


同理红灯定义:
char const*const RED_PWM_DUTY = "/sys/class/leds/red/pwm_duty";
char const*const RED_PWM_DIM_FREQ = "/sys/class/leds/red/pwm_dim_freq";
修改函数为: blink_red()
写结点的结构与green一致,只是将里面所写的文件替换为red。
如:
GREEN_LED_FILE => RED_LED_FILE
GREEN_TRIGGER_FILE => RED_TRIGGER_FILE
同理绿灯。


(3)修改ueventd.mtxxx.rc 文件权限


        该步需要修改1.2之后重新编译才能进行修改。若是1.2修改之后,上层可以访问下层了,则可以不进行该修改。在之前1.2检测都没问题,而上层仍旧无法访问下层的时候。基本可以判定为上层通过hal层访问结点时,权限不够。这时候需要增加对对应结点的控制权限。(若是没有该问题,可以先忽略)修改(是Android上层调用权限相关的文件)如ueventd.mt6765.ufs.rc (mt6765平台)在对应文件里面添加文件权限修改。
        如果是使用PMIC上面的LED,则添加/检测对应led灯路径的生成文件:
真实路径 delay_on 0664 system system
真实路径 delay_off 0664 system system
        如果是使用MT6370上面的LED,则添加/检测对应led灯路径的生成文件:
真实路径 pwm_duty 0664 system system
真实路径 pwm_dim_freq 0664 system system
        真实路径填写,以PMIC的框架为例:
使用ADB进行如下测试:
cd sys/class/leds/red
echo timer > trigger //如果是平台PMIC写 echo pwm_mode > trigger
ls -l ( l为L的小写)
(需要1.2修改后重新编译后,根据实际路径进行更改)
您可以看到如下情况:
( PMIC查看delay_on/delay_on结点; MT6370的查看pwm_duty/pwm_dim_freq结点)
后面的 ->箭头后面才是真的物理地址也就是真实地址。如果没有->箭头的,当前路径为真实地址。
->后面的前面省略的..一般是sys/,具体还请您用ADB到对应目录下面去寻找看。
需要对RED BLUE 灯所使用的三色灯添加: (注意修改该文件时,要切换成c/c++的阅读状态,不要添加在被注释的地方,有个地方是书写错误/* 改为/即可)每个灯2条,所以使用3个灯就添加6条。每条对应其真实路径。若还是不行,还请判断是不是上层无法写brightnesss结点或trigger结点。然后在.rc文件里面,再添加brightness和trigger结点的权限:
真实路径 brightnes 0664 system system
真实路径 trigger 0664 system system
补充:无法写结点在kernel log里面会出现提示( brightness的情况需要另寻判断log):
XX doesn't exist or cannot write!!

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值