史上最详细Linux 虚拟文件系统sysfs之属性文件attribute 整理(一)
史上最详细Linux 虚拟文件系统sysfs之属性文件attribute 整理(二)
一、介绍一下lk和kernel的默认亮度修改位置:
/vendor/mediatek/proprietary/bootable/bootloader/lk/platform/mt8168/include/platform/mt_leds.h
1 | enum led_brightness { |
/vendor/mediatek/proprietary/bootable/bootloader/lk/target/tb8168p1_64_bsp/inc/cust_leds.h
1 | #include <platform/mt_typedefs.h> |
/vendor/mediatek/proprietary/bootable/bootloader/lk/target/tb8168p1_64_bsp/cust_leds.c
1 | extern int disp_bls_set_backlight(unsigned int level); |
\kernel-4.14\drivers\misc\mediatek\video\common\pwm10\ddp_pwm.c
1 | static int disp_pwm_config_init(enum DISP_MODULE_ENUM module, struct disp_ddp_path_config *pConfig, void *cmdq) { #ifndef CONFIG_FPGA_EARLY_PORTING ... ... /* We don't enable PWM until we really need */ DISP_REG_MASK(cmdq, reg_base + DISP_PWM_CON_0_OFF, pwm_div << 16, (0x3ff << 16)); /* 1024 levels */ DISP_REG_MASK(cmdq, reg_base + DISP_PWM_CON_1_OFF, 1023, 0x3ff); //KERNEL 默认亮度 /* We don't init the backlight here until AAL/Android give */ #endif return 0; } |
/kernel-4.9-lc/arch/arm/boot/dts/mt6580.dts
1 | / { |
/kernel-4.9-lc/drivers/misc/mediatek/video/mt6580/dispsys/ddp_hal.h
1 | enum DISP_REG_ENUM{ |
/kernel-4.9-lc/drivers/misc/mediatek/video/mt6580/dispsys/ddp_drv.c
1 | volatile unsigned long dispsys_reg[DISP_REG_NUM] = { 0 }; |
/kernel-4.9-lc/drivers/misc/mediatek/video/mt6580/dispsys/ddp_reg.h
1 | #define DDP_REG_BASE_DISP_PWM0 dispsys_reg[DISP_REG_PWM] |
/kernel-4.9-lc/drivers/misc/mediatek/video/include/ddp_pwm.h
1 | enum disp_pwm_id_t { |
/kernel-4.9-lc/drivers/misc/mediatek/video/common/aal20/ddp_pwm.c
1 | #define pwm_get_reg_base(id) (DISPSYS_PWM0_BASE) //不管传入的id是多少,只返回一个固定的地址DISPSYS_PWM0_BASE |
/kernel-4.9-lc/arch/arm/boot/dts/tb8321p2_bsp_2g.dts
1 | &odm { |
/kernel-4.9-lc/drivers/misc/mediatek/leds/mt6580/mtk_leds_sw.h
1 | /****************************************************************************** |
/kernel-4.9-lc/drivers/misc/mediatek/leds/mtk_leds_drv.c
1 | struct mt65xx_led_data *g_leds_data[MT65XX_LED_TYPE_TOTAL]; |
/kernel-4.14/drivers/misc/mediatek/leds/mt8168/mtk_leds_sw.h
1 | /* 10bit backlight level */ |
/kernel-4.14/drivers/misc/mediatek/leds/mt8168/mtk_leds.c
1 | char *leds_name[TYPE_TOTAL] = { //leds_name数组必须和mt65xx_led_type排列一 一对应 |
C 库函数 char *strncat(char *dest, const char *src, size_t n) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾,直到 n 字符长度为止。
以下for循环遍历MT65XX_LED_TYPE_TOTAL/leds_name 共7种类型,下面只以背光"lcd-backlight"为例分析:
struct cust_mt65xx_led *pled_dtsi = NULL; //mtk_leds.c 全局变量
mt65xx_leds_probe //kernel-4.9-lc/drivers/misc/mediatek/leds/mtk_leds_drv.c
->mt_get_cust_led_list //kernel-4.9-lc/drivers/misc/mediatek/leds/mt6580/mtk_leds.c
->struct cust_mt65xx_led *cust_led_list = get_cust_led_dtsi(); //从dts获取各种类型led的数据,并且设置背光函数指针,全部保存在pled_dtsi
->pled_dtsi = kmalloc(TYPE_TOTAL * sizeof(struct cust_mt65xx_led),
->for (i = 0; i < MT65XX_LED_TYPE_TOTAL; i++) {
->char node_name[32] = "mediatek,";
->pled_dtsi[i].name = leds_name[i]; //"lcd-backlight"
->if (strlen(node_name) + strlen(leds_name[i]) + 1 > sizeof(node_name)) //先判断组合后的名字长度是否超过node_name的buf大小
->LEDS_DEBUG("buffer for %s%s not enough\n", node_name, leds_name[i]);
->led_node = of_find_compatible_node(NULL, NULL, strncat(node_name, leds_name[i], sizeof(node_name) - strlen(node_name) - 1)); //strncat追加字符串,组合后节点名为"mediatek,lcd-backlight",刚好和dts匹配
->of_property_read_u32(led_node, "led_mode", &mode); //根据dts,读出来的是5,对应MT65XX_LED_MODE_CUST_BLS_PWM
->pled_dtsi[i].mode = mode;
->of_property_read_u32(led_node, "data", &data);
->pled_dtsi[i].data = data;
->of_property_read_u32_array(led_node, "pwm_config", pwm_config, ARRAY_SIZE(pwm_config));
->pled_dtsi[i].config_data.clock_source = pwm_config[0];
->pled_dtsi[i].config_data.div = pwm_config[1];
->pled_dtsi[i].config_data.low_duration = pwm_config[2];
->pled_dtsi[i].config_data.High_duration = pwm_config[3];
->pled_dtsi[i].config_data.pmic_pad = pwm_config[4];
->switch (pled_dtsi[i].mode) {
->MT65XX_LED_MODE_CUST_LCM
->pled_dtsi[i].data = (long)mtkfb_set_backlight_level
->MT65XX_LED_MODE_CUST_BLS_PWM
->pled_dtsi[i].data = (long)disp_bls_set_backlight
->return pled_dtsi;
->return cust_led_list;
->for (i = 0; i < MT65XX_LED_TYPE_TOTAL; i++) { //struct cust_mt65xx_led cust;
->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; //"lcd-backlight"
->g_leds_data[i]->cdev.name = cust_led_list[i].name; //"lcd-backlight"
->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);
->led_classdev_register(&pdev->dev, &g_leds_data[i]->cdev);
#define led_classdev_register(parent, led_cdev) \ //kernel4.14/include/linux/leds.h
of_led_classdev_register(parent, NULL, led_cdev)
/kernel-4.14/include/uapi/linux/uleds.h
1 | #define LED_MAX_NAME_SIZE 64 |
of_led_classdev_register(struct device *parent, struct device_node *np, struct led_classdev *led_cdev)
->char name[LED_MAX_NAME_SIZE];
->led_classdev_next_name(led_cdev->name, name, sizeof(name)); //"lcd-backlight",如果没有重名,那么这里的name也是"lcd-backlight"
->class_find_device(leds_class, NULL, name, match_name) //while查找是否有重名设备
->led_cdev->dev = device_create_with_groups(leds_class, parent, 0, led_cdev, led_cdev->groups, "%s", name); //device_create_with_groups->device_create_groups_vargs
以下为开机log,可以看到led_cdev->groups是空的,所以注册的attr是使用的class->dev_groups,也就是leds_class->dev_groups = led_groups;:
static int match_name(struct device *dev, const void *data){
return 0;
return !strcmp(dev_name(dev), (char *)data);
}
static int led_classdev_next_name(const char *init_name, char *name,
size_t len)
{
unsigned int i = 0;
int ret = 0;
struct device *dev;
strlcpy(name, init_name, len);
while ((ret < len) &&
(dev = class_find_device(leds_class, NULL, name, match_name))) { //这里应该是判断是否有重名设备,如果有,那就添加下标
put_device(dev);
ret = snprintf(name, len, "%s_%u", init_name, ++i); //比如lcd-backlight就变成lcd-backlight_1、lcd-backlight_2、lcd-backlight_3等等
printk("Isaac [led_classdev_next_name] name=%s, i=%u\n", name, i);
}
printk("Isaac [led_classdev_next_name] init_name=%s, name=%s\n", init_name, name);
if (ret >= len)
return -ENOMEM;
return i;
}
(210624_14:05:22.449)[ 0.320966] <2>.(2)[1:swapper/0]Isaac [leds_init] enter
(210624_14:05:23.070)[ 0.906847] <1>.(1)[1:swapper/0]Isaac [led_classdev_next_name] init_name=vibrator, name=vibrator
(210624_14:05:23.070)[ 0.907944] <1>.(1)[1:swapper/0]Isaac [of_led_classdev_register] led_cdev->groups=0x98f2408
(210624_14:05:23.070)[ 0.908986] <1>.(1)[1:swapper/0]Isaac [of_led_classdev_register] led_cdev->name=vibrator, name=vibrator
(210624_14:05:23.071)[ 0.925813] <1>.(1)[1:swapper/0]Isaac [led_update_brightness] enter
(210624_14:05:24.414)[ 2.237634] <1>.(1)[1:swapper/0]Isaac [mt65xx_leds_probe] enter
(210624_14:05:24.414)[ 2.238375] <1>.(1)[1:swapper/0]Isaac [mt65xx_leds_probe] (&g_leds_data[i]->cdev)->groups=0x0
(210624_14:05:24.414)[ 2.239467] <1>.(1)[1:swapper/0]Isaac [led_classdev_next_name] init_name=lcd-backlight, name=lcd-backlight
(210624_14:05:24.414)[ 2.240671] <1>.(1)[1:swapper/0]Isaac [of_led_classdev_register] led_cdev->groups=0x0
(210624_14:05:24.414)[ 2.241647] <1>.(1)[1:swapper/0]Isaac [of_led_classdev_register] led_cdev->name=lcd-backlight, name=lcd-backlight
(210624_14:05:24.414)[ 2.257893] <1>.(1)[1:swapper/0]Isaac [led_update_brightness] enter
(210624_14:05:38.866)[ 16.649092] <0>.(0)[449:android.hardwar]Isaac [brightness_store] buf=103
vib_probe
->devm_led_classdev_register
->devm_of_led_classdev_register
->of_led_classdev_register
mt65xx_leds_probe
->led_classdev_register
->of_led_classdev_register
device_create_with_groups、device_create这两个函数最终都是调用了device_create_groups_vargs
创建设备节点,并创建of_led_classdev_register:
struct device *device_create_with_groups(struct class *class, struct device *parent, dev_t devt, void *drvdata, const struct attribute_group **groups, const char *fmt, ...)
->device_create_groups_vargs(struct class *class, struct device *parent, dev_t devt, void *drvdata, const struct attribute_group **groups, const char *fmt, va_list args)
->dev = kzalloc(sizeof(*dev), GFP_KERNEL);
->device_initialize(dev);
->dev->class = class;
->dev->parent = parent;
->dev->groups = groups;
->dev_set_drvdata(dev, drvdata); //dev->driver_data = data; //到时可以通过dev_get_drvdata(dev);获得该私有指针
-> kobject_set_name_vargs(&dev->kobj, fmt, args); //设置kobj名字,/sys/class/leds/lcd-backlight
->device_add(dev)
->device_create_file(dev, &dev_attr_uevent);
->device_add_class_symlinks(dev);
->device_add_attrs(dev);
->if (class) {
->device_add_groups(dev, class->dev_groups);
->sysfs_create_groups(&dev->kobj, groups); ///sys/class/leds/lcd-backlight/brightness
->if (type) {
->device_add_groups(dev, type->group); //if (dev->type) 这个应该不存在
->device_add_groups(dev, dev->groups); //这个也不存在
创建设备节点:
struct device *device_create(struct class *class, struct device *parent, dev_t devt, void *drvdata, const char *fmt, ...) ->device_create_vargs(struct class *class, struct device *parent, dev_t devt, void *drvdata, const char *fmt, va_list args)
->device_create_groups_vargs(struct class *class, struct device *parent, dev_t devt, void *drvdata, const struct attribute_group **groups, const char *fmt, va_list args)
/kernel-4.14/include/linux/pm.h
1 | /* |
/kernel-4.14/include/linux/device.h
1 | struct class { |
brightness_show
->led_update_brightness(led_cdev)
->ret = led_cdev->brightness_get(led_cdev) //if (led_cdev->brightness_get)
->led_cdev->brightness = ret
/kernel-4.9-lc/drivers/leds/led-class.c
1 | static struct class *leds_class; |
static unsigned int bl_div_hal = CLK_DIV1;
static ssize_t brightness_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) //kernel-4.9-lc/drivers/leds/led-class.c
->struct led_classdev *led_cdev = dev_get_drvdata(dev)
->->kstrtoul(buf, 10, &state) //从buf提取亮度级数,转换为长整数
->struct led_classdev *led_cdev = dev_get_drvdata(dev); //return dev->driver_data;
->led_set_brightness(led_cdev, state) //最终调用了__led_set_brightness(led_cdev, value) //kernel-4.9-lc/drivers/leds/led-core.c
->led_cdev->brightness_set(led_cdev, value) //kernel-4.14/drivers/leds/led-core.c
->mt65xx_led_set //kernel-4.14/drivers/misc/mediatek/leds/mtk_leds_drv.c
->mt_mt65xx_led_set(led_cdev, level) //kernel-4.14/drivers/misc/mediatek/leds/mt8168/mtk_leds.c
->struct mt65xx_led_data *led_data = container_of(led_cdev, struct mt65xx_led_data, cdev);
//#ifdef CONFIG_MTK_AAL_SUPPORT
->disp_aal_notify_backlight_changed((((1 <<MT_LED_INTERNAL_LEVEL_BIT_CNT) - 1) * level + 127) / 255) //将255等级转换成1023等级
->backlight_brightness_set(bl_1024)
->struct cust_mt65xx_led *cust_led_list = mt_get_cust_led_list()
->get_cust_led_dtsi()
->if (pled_dtsi)
->return pled_dtsi //如果pled_dtsi存在,证明已经在mt65xx_leds_probe初始化成功,直接返回pled_dtsi
->if (MT65XX_LED_MODE_CUST_BLS_PWM == cust_led_list[MT65XX_LED_TYPE_LCD].mode)
->MT65XX_LED_MODE_CUST_BLS_PWM //背光
->mt_mt65xx_led_set_cust(&cust_led_list[MT65XX_LED_TYPE_LCD], level) //mt_mt65xx_led_set_cust(struct cust_mt65xx_led *cust, int level)
->struct nled_setting led_tmp_setting = { 0, 0, 0 };
->case MT65XX_LED_MODE_PWM
->mt_led_set_pwm(cust->data, &led_tmp_setting);
->case MT65XX_LED_MODE_GPIO
->return ((cust_set_brightness) (cust->data)) (level);
->case MT65XX_LED_MODE_PMIC //指示灯
->mt_brightness_set_pmic(cust->data, level, bl_div_hal);
->case MT65XX_LED_MODE_CUST_LCM
->return ((cust_brightness_set) (cust->data)) (level, bl_div_hal);
->case MT65XX_LED_MODE_CUST_BLS_PWM //背光
->return ((cust_set_brightness) (cust->data)) (level)
->disp_bls_set_backlight(level) /kernel-4.19-lc/drivers/misc/mediatek/video/common/aal20/ddp_pwm.c /kernel-4.14/drivers/misc/mediatek/leds/mt8168/mtk_leds.c
->ret = disp_pwm_set_backlight(disp_pwm_get_main(), level_1024); //int disp_pwm_set_backlight(enumdisp_pwm_id_t id, int level_1024)
->disp_pwm_set_backlight_cmdq(id, level_1024, NULL) /* Always write registers by CPU */
->reg_base = pwm_get_reg_base(id); //kernel-4.19-lc/drivers/misc/mediatek/video/mt6580/dispsys/ddp_reg.h
->DISPSYS_PWM0_BASE
->dispsys_reg[DISP_REG_PWM]
-><0x1100F000 0x1000>, /*DISP_PWM*/
->DISP_REG_MASK(cmdq, reg_base + DISP_PWM_CON_1_OFF, level_1024 << 16, 0x1fff << 16) //将level_1024写进寄存器
->mt_reg_sync_writel((unsigned int)(INREG32(reg32)&~(mask))|(val), (volatile unsigned long *)(reg32));
->__raw_writel((v), (void __force __iomem *)((a))); //#define mt_reg_sync_writel(v, a)
->mb();
->__asm__ __volatile__ ("dsb" : : : "memory");
->disp_pwm_set_enabled(cmdq, id, 1);
->DISP_REG_MASK(NULL, reg_base + DISP_PWM_EN_OFF, 0x1, 0x1); //PWM使能
->disp_pwm_set_drverIC_en(id, enabled); //#ifdef GPIO_LCM_LED_EN 没用
->if (ret >= 0) {
disp_pwm_trigger_refresh(id, (level_1024 == 0)); /* For backlight turn-off, we have to trigger right away*/
->else
->mt65xx_led_set_cust(&cust_led_list[MT65XX_LED_TYPE_LCD], (level >>(MT_LED_INTERNAL_LEVEL_BIT_CNT - 8)));
->MT65XX_LED_MODE_CUST_BLS_PWM
->mt_mt65xx_led_set_cust(cust, ((((1 << LED_INTERNAL_LEVEL_BIT_CNT) - 1) * level + 127) / 255));
->mt_mt65xx_led_set_cust(cust, level);
//#else
if (led_data->cust.mode == MT65XX_LED_MODE_CUST_BLS_PWM)
mt_mt65xx_led_set_cust(&led_data->cust, ((((1 << MT_LED_INTERNAL_LEVEL_BIT_CNT)- 1) * level + 127) / 255));
else
mt_mt65xx_led_set_cust(&led_data->cust, level);
无论什么条件,最终都是调用了mt_mt65xx_led_set_cust(), 然后通过DISP_REG_MASK()将背光亮度写进寄存器
PS: led_set_brightness的详细调用过程:
led_set_brightness(struct led_classdev *led_cdev, enum led_brightness brightness)
->if (led_cdev->flags & LED_SUSPENDED) return;
->led_set_brightness_nosleep(led_cdev, brightness)
->led_cdev->brightness = min(value, led_cdev->max_brightness); //取最小值,保存到led_cdev->brightness,以备show
->led_set_brightness_nopm(led_cdev, led_cdev->brightness)
/* Use brightness_set op if available, it is guaranteed not to sleep */
->if (!__led_set_brightness(led_cdev, value))
->led_cdev->brightness_set(led_cdev, value)
->return;
/* If brightness setting can sleep, delegate it to a work queue task */
->led_cdev->delayed_set_value = value;
->schedule_work(&led_cdev->set_brightness_work);
================================================================================
thermal设置最大亮度流程:
/kernel-4.14/drivers/misc/mediatek/thermal/mtk_cooler_backlight.c
/* bind fan callbacks to fan device */
static struct thermal_cooling_device_ops mtk_cl_backlight_ops = {
.get_max_state = mtk_cl_backlight_get_max_state,
.get_cur_state = mtk_cl_backlight_get_cur_state,
.set_cur_state = mtk_cl_backlight_set_cur_state,
};
mtk_cl_backlight_set_cur_state(struct thermal_cooling_device *cdev, unsigned long state)
->mtk_cl_backlight_set_max_brightness_limit(void)
->setMaxbrightness(int max_level, int enable)
->disp_bls_set_max_backlight(((((1 << LED_INTERNAL_LEVEL_BIT_CNT) - 1) * max_level + 127) / 255));
->disp_pwm_set_max_backlight(disp_pwm_get_main(), level_1024);
->disp_pwm_set_backlight(id, atomic_read(&g_pwm_backlight[index]));
->disp_pwm_set_backlight_cmdq(id, level_1024, NULL); /* Always write registers by CPU */
->disp_pwm_trigger_refresh(id, (level_1024 == 0)); /* For backlight turn-off, we have to trigger right away*/
adb cat
<4>[ 541.496468] (0)[6335:cat]Isaac [led_update_brightness] enter
<4>[ 541.496499] (0)[6335:cat]Isaac [brightness_show] led_cdev->brightness=155
adb echo
<4>[ 751.958250] (1)[7320:sh]Isaac [brightness_store] buf=166
<4>[ 751.962956] (0)[927:mnld]Isaac [led_update_brightness] enter
<4>[ 751.962987] (0)[927:mnld]Isaac [brightness_show] led_cdev->brightness=166
///kernel-4.9-lc/drivers/misc/mediatek/leds/mt6580/mtk_led.c
struct cust_mt65xx_led *mt_get_cust_led_list(void)
{
struct cust_mt65xx_led *cust_led_list = get_cust_led_dtsi();
return cust_led_list;
}
void mt_led_pwm_disable(int pwm_num)
{
struct cust_mt65xx_led *cust_led_list = get_cust_led_dtsi();
mt_pwm_disable(pwm_num, cust_led_list->config_data.pmic_pad);
}
struct cust_mt65xx_led *get_cust_led_dtsi(void)
{
case MT65XX_LED_MODE_CUST_BLS_PWM:
pled_dtsi[i].data =
(long)disp_bls_set_backlight;
LEDS_DEBUG
("kernel:the backlight hw mode is BLS.\n");
break;
}
///kernel-4.9-lc/drivers/misc/mediatek/leds/mtk_leds_drv.c
static int mt65xx_leds_probe(struct platform_device *pdev)
{
struct cust_mt65xx_led *cust_led_list = mt_get_cust_led_list();
g_leds_data[i]->cdev.brightness_set = mt65xx_led_set;
}
--------------------------------------------------------------------------------------------------------
(220416_09:51:53.150)[ 25.853800] <3>.(3)[1062:android.hardwar]mtk_leds backlight_debug_log(119) :[BL] Set Backlight directly T:25.853,L:103 map:103
(220416_09:51:53.150)[ 25.853808] <3>.(3)[1062:android.hardwar]Isaac [disp_bls_set_backlight] level_1024=413
(220416_09:51:53.150)[ 25.856428] <3>-(3)[1062:android.hardwar]CPU: 3 PID: 1062 Comm: android.hardwar Tainted: P W O 4.19.191 #14
(220416_09:51:53.150)[ 25.857804] <3>-(3)[1062:android.hardwar]Hardware name: Generic DT based system
(220416_09:51:53.150)[ 25.858724] <3>-(3)[1062:android.hardwar]Backtrace:
(220416_09:51:53.150)[ 25.859364] <3>-(3)[1062:android.hardwar][<c0111688>] (dump_backtrace) from [<c0111684>] (show_stack+0x20/0x24)
(220416_09:51:53.150)[ 25.860636] <3>-(3)[1062:android.hardwar] r10:00000067 r6:ffffffff r5:c1a24ae4 r4:00000000
(220416_09:51:53.150)[ 25.861684] <3>-(3)[1062:android.hardwar][<c0111664>] (show_stack) from [<c1276a44>] (dump_stack+0x8c/0xb8)
(220416_09:51:53.151)[ 25.862910] <3>-(3)[1062:android.hardwar] r10:00000067 r4:600f0013
(220416_09:51:53.151)[ 25.863711] <3>-(3)[1062:android.hardwar][<c12769b8>] (dump_stack) from [<c0a290fc>] (disp_bls_set_backlight+0x28/0x98)
(220416_09:51:53.151)[ 25.865069] <3>-(3)[1062:android.hardwar] r5:e42608e0 r4:0000019d
(220416_09:51:53.151)[ 25.865845] <3>-(3)[1062:android.hardwar][<c0a290fc>] (disp_bls_set_backlight) from [<c0af0fe8>] (mt_mt65xx_led_set_cust+0x158/0x268)
(220416_09:51:53.151)[ 25.867370] <3>-(3)[1062:android.hardwar][<c0af0e90>] (mt_mt65xx_led_set_cust) from [<c0af13c8>] (mt_mt65xx_led_set+0x248/0x2d8)
(220416_09:51:53.151)[ 25.868836] <3>-(3)[1062:android.hardwar] r7:0000019d r6:c19cd01c r5:e4260800 r4:00000067
(220416_09:51:53.151)[ 25.869876] <3>-(3)[1062:android.hardwar][<c0af1180>] (mt_mt65xx_led_set) from [<c0af02f8>] (mt65xx_led_set+0xb4/0xe4)
(220416_09:51:53.151)[ 25.871224] <3>-(3)[1062:android.hardwar] r10:00000004 r9:c190a208 r8:00000004 r7:00000000 r6:e4260800 r5:00000067
(220416_09:51:53.151)[ 25.872524] <3>-(3)[1062:android.hardwar] r4:e4260800
(220416_09:51:53.152)[ 25.873168] <3>-(3)[1062:android.hardwar][<c0af02f8>] (mt65xx_led_set) from [<c0dd43c4>] (led_set_brightness+0x58/0xa0)
(220416_09:51:53.152)[ 25.874528] <3>-(3)[1062:android.hardwar][<c0dd436c>] (led_set_brightness) from [<c0dd4c5c>] (brightness_store+0x8c/0xb4)
(220416_09:51:53.152)[ 25.875906] <3>-(3)[1062:android.hardwar] r5:e42608cc r4:ddb68a80
(220416_09:51:53.152)[ 25.876682] <3>-(3)[1062:android.hardwar][<c0dd4c5c>] (brightness_store) from [<c07f9b3c>] (dev_attr_store+0x40/0x4c)
(220416_09:51:53.152)[ 25.878022] <3>-(3)[1062:android.hardwar][<c07f9b3c>] (dev_attr_store) from [<c03e1530>] (sysfs_kf_write+0x58/0x64)
(220416_09:51:53.152)[ 25.879340] <3>-(3)[1062:android.hardwar][<c03e1530>] (sysfs_kf_write) from [<c03dfb64>] (kernfs_fop_write+0x148/0x1d8)
(220416_09:51:53.152)[ 25.880700] <3>-(3)[1062:android.hardwar][<c03dfb64>] (kernfs_fop_write) from [<c0336268>] (__vfs_write+0x58/0x178)
(220416_09:51:53.152)[ 25.882017] <3>-(3)[1062:android.hardwar][<c0336210>] (__vfs_write) from [<c03365f4>] (vfs_write+0xd0/0x198)
(220416_09:51:53.152)[ 25.883265] <3>-(3)[1062:android.hardwar] r9:deb86000 r8:deb87f60 r7:bedeaf38 r6:00000004 r5:00000004 r4:de982300
(220416_09:51:53.153)[ 25.884574] <3>-(3)[1062:android.hardwar][<c0336524>] (vfs_write) from [<c0336834>] (ksys_write+0x74/0xd4)
(220416_09:51:53.153)[ 25.885801] <3>-(3)[1062:android.hardwar] r9:deb86000 r8:c190a208 r7:bedeaf38 r6:00000004 r5:de982303 r4:de982300
(220416_09:51:53.153)[ 25.886828] <1>.(1)[1163:android.hardwar]binder: 1163:1163 ioctl 40046210 bec600d8 returned -22
(220416_09:51:53.153)[ 25.887108] <3>-(3)[1062:android.hardwar][<c03367c0>] (ksys_write) from [<c03368c0>] (sys_write+0x2c/0x30)
(220416_09:51:53.153)[ 25.889420] <3>-(3)[1062:android.hardwar] r10:00000004 r8:c0101204 r7:00000004 r6:00000005 r5:bedeaf38 r4:00000004
(220416_09:51:53.153)[ 25.890730] <3>-(3)[1062:android.hardwar][<c03368c0>] (sys_write) from [<c0101000>] (ret_fast_syscall+0x0/0x54)
(220416_09:51:53.153)[ 25.891999] <3>-(3)[1062:android.hardwar]Exception stack(0xdeb87f8c to 0xdeb87fd4)
(220416_09:51:53.153)[ 25.892955] <3>-(3)[1062:android.hardwar]7f80: c03368c0 00000067 09cbbd8e 00000005 00000004
(220416_09:51:53.154)[ 25.894300] <3>-(3)[1062:android.hardwar]7fa0: 00000000 c0101000 00000067 09cbbd8e 00000005 bedeaf38 00000004 00000014
(220416_09:51:53.154)[ 25.895645] <3>-(3)[1062:android.hardwar]7fc0: 00000067 09cbbd8e 00000005 00000004 b0f0f2cc
(220416_09:51:53.154)[ 25.897790] <3>.(3)[1062:android.hardwar]Isaac [disp_pwm_set_backlight] level_1024
(220416_09:51:53.154)[ 25.898756] <3>.(3)[1062:android.hardwar]Isaac [disp_pwm_set_backlight_cmdq] level_1024
(220416_09:51:53.154)[ 25.899768] <3>.(3)[1062:android.hardwar][PWM] disp_pwm_set_backlight_cmdq: (id = 0x1, level_1024 = 413), old = -1
(220416_09:51:53.154)[ 25.901162] <3>.(3)[1062:android.hardwar][PWM] disp_pwm_backlight_status: backlight is on (413), power:(1), pwm id: (0)