led驱动中未实现brightness_get函数所引起的问题。

测试发现:

/sys/devices/platform/keyboard-backlight/leds/keyboard-backlight
/sys/class/leds/keyboard-backlight
每次开机cat  brightness 总是0 ,而无论此时该LED是否点亮。
每次开机 keyboard LED的状态取决与上次关机时的状态。

驱动路径kernel/drivers/leds/leds-sprd-kb.c

该驱动没有实现brightness_get回调函数:
led->cdev.brightness_get = NULL;

这导致在没有进行led->cdev.brightness_set调用之前,cat brightness出来的值总是0 ,只有调用了一次led->cdev.brightness_set 之后,再cat brightness时才能得到刚才设置的值。
为什么会第一次得不到值,而后面都能得到呢?这要看看这些sys文件的实现,以及对应的show和store函数,参见:kernel/drivers/leds/leds-class.c

static ssize_t led_brightness_show(struct device *dev, 
struct device_attribute *attr, char *buf)
{
struct led_classdev *led_cdev = dev_get_drvdata(dev);
/* no lock needed for this */
led_update_brightness(led_cdev);
return sprintf(buf, "%u\n", led_cdev->brightness);
}
led_update_brightness函数会基于驱动实现的get函数更新brightness,而我们的驱动却没有实现这个函数。所以这个update函数就没有作用。所以brightness在第一次读取时总是0

字符驱动设备控制 LED 灯需要使用 GPIO 接口来控制引脚的状态。在 Linux 内核中,可以使用 gpio_leds_probe 函数来初始化引脚的状态: ``` static int __init gpio_leds_probe(struct platform_device *pdev) { int ret = 0; int i; struct gpio_led *led = pdev->dev.platform_data; for (i = 0; i < ARRAY_SIZE(gpio_leds); i++) { gpio_direction_output(gpio_leds[i].gpio, !gpio_leds[i].default_state); ret = gpio_request(gpio_leds[i].gpio, "gpio_leds"); if (ret < 0) { pr_err("gpio_request failed for pin %d\n", gpio_leds[i].gpio); goto err_gpio_request; } gpio_leds[i].cdev.name = "gpio-leds"; gpio_leds[i].cdev.brightness_get = gpio_leds_get_brightness; gpio_leds[i].cdev.brightness_set = gpio_leds_set_brightness; gpio_leds[i].cdev.default_trigger = led->default_trigger; gpio_leds[i].cdev.brightness = !gpio_leds[i].default_state; ret = gpio_led_classdev_register(&pdev->dev, &gpio_leds[i].cdev); if (ret < 0) { pr_err("gpio_led_classdev_register failed for pin %d\n", gpio_leds[i].gpio); goto err_gpio_led_classdev_register; } } return 0; err_gpio_led_classdev_register: err_gpio_request: for (i = 0; i < ARRAY_SIZE(gpio_leds); i++) { gpio_free(gpio_leds[i].gpio); } return ret; } ``` 该函数会遍历一个 gpio_leds 数组,该数组包含了需要控制的 LED 灯的引脚信息。对于每个引脚,函数会使用 gpio_direction_output 函数来设置其方向为输出,并设置其初始状态为默认状态的反向(因为 LED 灯是低电平点亮的,所以默认状态为高电平)。然后使用 gpio_request 函数来申请引脚,如果失败则返回错误码。接下来,函数会创建一个 gpio_led 结构体,并设置该结构体的成员变量。最后,使用 gpio_led_classdev_register 函数注册字符设备驱动。如果注册失败,则会释放申请的引脚并返回错误码。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YasinLeeX

再来一杯西湖龙井。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值