·关于MTK6572平台上的LCD屏幕背光问题已经折腾了好几天了,从上周开始看底层代码开始一直到现在,还是没有正确解决问题,目前的状态是找到问题所在,但是由于从来没有学习过Linux只是,所以无从下手。
之前一直停留在Android应用层或者frameworks上面进行背光的修改,也就是在应用代码上面进行修改,还有在frameworks/base/packages/SettingsProvider/res/values/defaults.xml路径下对默认背光值进行设定,具体在default.xml里面
http://blog.csdn.net/lb5761311/article/details/50820671
接着就去查看源码了,对于只做过STM32和Linux入门都只看了前一两章的我来说还是挺有挑战性的,不过跟着网络上面的资源,学习也不是非常费劲儿的,总能够找到一个前进的方向。
这里就直接跳过了JNI层,直追HAL和driver层了,直到看到了配置led/lcd/button文件后才知道,底层都没有提供,上层怎么能够修改呢?
static struct cust_mt65xx_led cust_led_list[MT65XX_LED_TYPE_TOTAL] = {
{"red", MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK0,{0}},
{"green", MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK2,{0}},
{"blue", MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK1,{0}},
{"button-backlight", MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK3,{0}},
{"jogball-backlight", MT65XX_LED_MODE_NONE, -1, {0}},
{"keyboard-backlight",MT65XX_LED_MODE_NONE, -1, {0}},
{"lcd-backlight", MT65XX_LED_MODE_GPIO, (int)LB_Cust_SetBacklight,{0}},
unsigned int LB_Cust_SetBacklight(int level)
{
if(level == 0)
{
mt_set_gpio_mode(GPIO_BACKLIGHT_GPIO_PIN, GPIO_MODE_00);
mt_set_gpio_dir(GPIO_BACKLIGHT_GPIO_PIN, GPIO_DIR_OUT);
mt_set_gpio_out(GPIO_BACKLIGHT_GPIO_PIN, 0);
}
else
{
mt_set_gpio_mode(GPIO_BACKLIGHT_GPIO_PIN, GPIO_MODE_00);
mt_set_gpio_dir(GPIO_BACKLIGHT_GPIO_PIN, GPIO_DIR_OUT);
mt_set_gpio_out(GPIO_BACKLIGHT_GPIO_PIN, 1);
}
return 0;
}
无赖,到这里我不直到怎么修改这个方法了,这种方式肯定是不能够实现梯度调节的,PWM方式怎么配置呢????
————————————————————————————————————————————————————————
接下来开始了各种方式的尝试~~~
首先通过adb进入/sys/class/leds/lcd-backlight下面对brightness值进行修改,发现完全可以啊! echo 0 > brgihtness 直接就能够关闭屏幕,echo 1 > brgihtness,也可以顺利得点亮lcd屏幕,但是这也证明了一个问题,那就是底层的逻辑没有提供给应用层梯度修改亮度的功能,所以不管是echo 1 ~ 还是 echo 2 或者echo 255 结果都是一样,那就是只能以一个固定的值点亮屏幕,而且这种状态时屏幕最亮的状态。接下来想着,在应用层读取brightness,在闲时关闭背光也是个可行的解决办法,于是写了方法读取/sys/class/leds/lcd-backlight的brightness值,然后进行写“1”和写“0”的操作,一切逻辑准备好了,编译,刷机~~~~~~~~~~~~~ 结果是没有结果!没理由啊,怎么回事?打log跟踪方法的执行,握草,try{}catch{}执行文件读写操作的时候进的是catch里面了,打印出来一看,文件访问失败!明显的权限不够,接着在adb 进入目录下面去看访问权限:rw-rw-r-- system radio 完了,对于others来说只能读不能写,Android应用层在操作的时候就应该是others的身份进行操作的吧?所以导致这样的结果。但是,怎么破呢?
接下来就想着各种修改权限的方式,查找了很多关于linux修改文件权限的方式以及在Android应用上或者怎么通过jni修改文件权限,还有通过获取系统权限的方式得到访问权限等等方式都米有结果。其中前几种想法都没有最终的结果,理由很简单:不懂Linux的相关知识,最后一种方式是也就是加入了系统权限:android:sharedUserId="android.uid.system",但是修改后直接进入不了Android应用,卡死在开机logo那里了。具体原因还不清楚。