RK3566 android13 LED子系统控制
实现过程
kernel的变化
diff --git a/drivers/leds/led-core.c b/drivers/leds/led-core.c
index c4e780bdb385..89af01db4456 100644
--- a/drivers/leds/led-core.c
+++ b/drivers/leds/led-core.c
@@ -151,8 +151,13 @@ static void led_set_software_blink(struct led_classdev *led_cdev,
if (!led_cdev->blink_brightness)
led_cdev->blink_brightness = led_cdev->max_brightness;
- led_cdev->blink_delay_on = delay_on;
- led_cdev->blink_delay_off = delay_off;
+ // led_cdev->blink_delay_on = delay_on;
+ // led_cdev->blink_delay_off = delay_off;
+ //trigger time,wucaicheng,1378913492@qq.com,20230817
+ if(!led_cdev->blink_delay_on && !led_cdev->blink_delay_off){
+ led_cdev->blink_delay_on = delay_on;
+ led_cdev->blink_delay_off = delay_off;
+ }
/* never on - just set to off */
if (!delay_on) {
diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c
index 93f5b1b60fde..ed2903613fe7 100644
--- a/drivers/leds/leds-gpio.c
+++ b/drivers/leds/leds-gpio.c
@@ -16,6 +16,7 @@
#include <linux/platform_device.h>
#include <linux/property.h>
#include <linux/slab.h>
+#include <linux/delay.h>
struct gpio_led_data {
struct led_classdev cdev;
@@ -117,6 +118,12 @@ static int create_gpio_led(const struct gpio_led *template,
&init_data);
}
+ //delay trigger,wucaicheng,1378913492@qq.com,20230817
+ // (template = gpio_led)->delay_reg from kernel/include/linux/leds.h custom
+ // msleep form kernel/include/linux/delay.h
+ if (template->delay_reg > 0) {
+ msleep(template->delay_reg);
+ }
return ret;
}
@@ -144,7 +151,7 @@ static struct gpio_leds_priv *gpio_leds_create(struct platform_device *pdev)
struct gpio_led_data *led_dat = &priv->leds[priv->num_leds];
struct gpio_led led = {};
const char *state = NULL;
-
+ struct device_node *np = to_of_node(child);
/*
* Acquire gpiod from DT with uninitialized label, which
* will be updated after LED class device is registered,
@@ -160,6 +167,14 @@ static struct gpio_leds_priv *gpio_leds_create(struct platform_device *pdev)
led_dat->gpiod = led.gpiod;
+ fwnode_property_read_string(child, "linux,default-trigger",
+ &led.default_trigger);
+
+ //delay trigger,wucaicheng,1378913492@qq.com,20230817
+ of_property_read_u32(np, "linux,delay-reg", &led.delay_reg);
+ of_property_read_u32(np, "linux,blink-delay-on", (u32*)(&led_dat->cdev.blink_delay_on));
+ of_property_read_u32(np, "linux,blink-delay-off", (u32*)(&led_dat->cdev.blink_delay_off));
+
if (!fwnode_property_read_string(child, "default-state",
&state)) {
if (!strcmp(state, "keep"))
diff --git a/include/linux/leds.h b/include/linux/leds.h
index 6a8d6409c993..71534fc466ce 100644
--- a/include/linux/leds.h
+++ b/include/linux/leds.h
@@ -519,6 +519,7 @@ struct gpio_led {
unsigned panic_indicator : 1;
unsigned default_state : 2;
unsigned retain_state_shutdown : 1;
+ unsigned int delay_reg; //delay trigger,wucaicheng,1378913492@qq.com,20230817
/* default_state should be one of LEDS_GPIO_DEFSTATE_(ON|OFF|KEEP) */
struct gpio_desc *gpiod;
};
设备树
/ {
model = "lckfb tspi V10 Board";
compatible = "lckfb,tspi-v10", "rockchip,rk3566";
leds: leds {
compatible = "gpio-leds";
rgb_led_r: rgb-led-r {
gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_LOW>;
linux,default-trigger = "timer";
linux,delay-reg = <0>; // 延时注册
linux,blink-delay-on = <500>; // 打开时间
linux,blink-delay-off = <500>; // 关闭时间
};
rgb_led_g: rgb-led-g {
gpios = <&gpio1 RK_PB1 GPIO_ACTIVE_LOW>;
linux,default-trigger = "timer";
linux,delay-reg = <100>; // 延时注册
linux,blink-delay-on = <1000>;
linux,blink-delay-off = <1000>;
};
rgb_led_b: rgb-led-b {
gpios = <&gpio1 RK_PB0 GPIO_ACTIVE_LOW>;
linux,default-trigger = "timer";
linux,delay-reg = <100>; // 延时注册
linux,blink-delay-on = <1500>;
linux,blink-delay-off = <1500>;
};
};
};
//用户三色灯
&leds {
status = "okay";
};


评论