记录gp7101背光驱动和设备树绑定不成功问题解决(基于hzhy_rk3506)

一、背景

泰山派的背光电路因为电流超过mipi3.1承受范围,所以mipi3.1使用i2c转pwm芯片gp7101来驱动屏幕背光,我们将该屏幕用于rk3506上,i2cdetect -y 0结果如下

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- 58 -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

检测到gp7101,但是驱动没有绑定上,仍然显示58

二、尝试过程

1.改设备树

root@rk3506-buildroot:/# ls /proc/device-tree/i2c@ff040000
#address-cells   clock-names      myts@38          reg
#size-cells      clocks           name             status
GP7101@58        compatible       pinctrl-0
clock-frequency  interrupts       pinctrl-names
root@rk3506-buildroot:/#

以为是设备树大小写问题,将GP7101改成gp7101,不管用

	gp7101@58 {
		compatible = "gp7101-backlight";
		reg = <0x58>;
		max-brightness-levels = <255>;
		default-brightness-level = <100>;
	};

2.查看gp7101驱动是否存在

root@rk3506-buildroot:/# ls /sys/bus/i2c/drivers
ES8323             gp7101-backlight   proximity_stk3332  rtc-hym8563
Goodix-TS-GT1X     gslX680-pad        rk730              sii902x
dummy              light_stk3332      rk808
es7202             my-touch           rtc-ds1307
root@rk3506-buildroot:/#

可以看到gp7101-backlight驱动存在

3.尝试手动绑定

root@rk3506-buildroot:/# ls /sys/bus/i2c/drivers/gp7101-backlight
bind    uevent  unbind
root@rk3506-buildroot:/#

驱动正常绑定的话会显示下面的,下面是正常情况下输出

ight@rk3506-buildroot:/sys/class/backlight# ls /sys/bus/i2c/drivers/gp7101-backli
0-0058  bind    uevent  unbind
root@rk3506-buildroot:/sys/class/backlight#

手动绑定

doot@rk3506-buildroot:/# echo 0-0058 > /sys/bus/i2c/drivers/gp7101-backlight/bind
[  178.815290] gp7101_bl:gp7101_bl_probe 131 locat
[  178.815396] sysfs: cannot create duplicate filename '/class/backlight/backlight'
[  178.831127] CPU: 2 PID: 928 Comm: sh Tainted: G           O       6.1.118 #22
[  178.841143] Hardware name: Generic DT based system
[  178.846180]  unwind_backtrace from show_stack+0xb/0xc
[  178.851227]  show_stack from dump_stack_lvl+0x2b/0x34
[  178.856249]  dump_stack_lvl from sysfs_warn_dup+0x37/0x48
[  178.861255]  sysfs_warn_dup from sysfs_do_create_link_sd+0x55/0x70
[  178.870996]  sysfs_do_create_link_sd from device_add+0x12b/0x460
[  178.880785]  device_add from backlight_device_register+0x93/0x120
[  178.890650]  backlight_device_register from devm_backlight_device_register+0x35/0x64
[  178.900540]  devm_backlight_device_register from gp7101_bl_probe+0xa7/0x114
[  178.910430]  gp7101_bl_probe from i2c_device_probe+0x1a1/0x1bc
[  178.920326]  i2c_device_probe from really_probe+0xb1/0x18c
[  178.930185]  really_probe from __driver_probe_device+0x103/0x128
[  178.940023]  __driver_probe_device from device_driver_attach+0x17/0x36
[  178.949861]  device_driver_attach from bind_store+0x41/0x58
[  178.959667]  bind_store from kernfs_fop_write_iter+0xad/0xe8
[  178.969494]  kernfs_fop_write_iter from vfs_write+0x9d/0xe0
[  178.979367]  vfs_write from ksys_write+0x39/0x60
[  178.984377]  ksys_write from ret_fast_syscall+0x1/0x54
[  178.989358] Exception stack(0xc1471fa8 to 0xc1471ff0)
[  178.994299] 1fa0:                   00000007 00529248 00000001 00529248 00000007 00000001
[  179.003999] 1fc0: 00000007 00529248 a6f09ba8 00000004 a6f088ec 00000000 00529210 00000000
[  179.013705] 1fe0: 004f58c8 aec949f0 a6e1d98c a6e93ef0
[  179.019473] gp7101-backlight 0-0058: failed to register backlight device
[  179.023259] gp7101-backlight: probe of 0-0058 failed with error -17
sh: echo: write error: File exists

-17表示-EEXIST (File exists) 系统里已经存在一个名字叫 backlight 的背光设备

果然

root@rk3506-buildroot:/dev# ls /sys/class/backlight
backlight

三、改驱动

将gp7101_bl.c里面gp7101_bl_probe函数的

    /* 初始化背光设备 */
    bl = devm_backlight_device_register(&client->dev, "backlight", &client->dev, data, &gp7101_backlight_ops,&props);
    if (IS_ERR(bl)) {
        dev_err(&client->dev, "failed to register backlight device\n");
        return PTR_ERR(bl);
    }

改成

    /* 初始化背光设备 */
    bl = devm_backlight_device_register(&client->dev, "gp7101-bl", &client->dev, data, &gp7101_backlight_ops,&props);
    if (IS_ERR(bl)) {
        dev_err(&client->dev, "failed to register backlight device\n");
        return PTR_ERR(bl);
    }

四、编译测试

root@rk3506-buildroot:/sys/class/backlight# i2cdetect -y 0
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- UU -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
root@rk3506-buildroot:/sys/class/backlight# ls /sys/class/backlight/
backlight  gp7101-bl
root@rk3506-buildroot:/sys/class/backlight# ls /sys/bus/i2c/drivers/gp7101-backlight
0-0058  bind    uevent  unbind
root@rk3506-buildroot:/sys/class/backlight#

驱动绑定成功

五、测试功能

root@rk3506-buildroot:/sys/class/backlight/gp7101-bl# ls
actual_brightness  device             scale              uevent
bl_power           max_brightness     subsystem
brightness         power              type
//最大亮度
root@rk3506-buildroot:/sys/class/backlight/gp7101-bl# cat max_brightness
255
//当前亮度
root@rk3506-buildroot:/sys/class/backlight/gp7101-bl# cat actual_brightness
100
root@rk3506-buildroot:/sys/class/backlight/gp7101-bl#
posted @ 2026-03-13 22:00  上善若淼  阅读(2)  评论(0)    收藏  举报