LEDC - 发光二极管控制器
LEDC(Light Emitting Diode Controller),发光二极管控制器。支持驱动目前市场上已有成熟的智能外控 LED,例如 WS2812 系列,每个 LED 的三基色均可实现 256 级亮度显示,因此整个 LED 可完成 256ˆ3(即 16777216)种颜色的全真色彩显示。模块支持最大1024颗外控 LED级联。
模块介绍
LED 典型电路如图所示,其中 DI 表示控制数据输入脚,DO 表示控制数据输出脚。DI 端接收从控制器传过来的数据,每个 LED 内部的数据锁存器会存储 24bit 数据,剩余的数据经过内部整形处理电路整形放大后通过 DO 端口开始转发输出给下一个级联的 LED。因此,每经过一个LED,数据减少 24bit。
LED典型电路如上图所示,其中 DI 表示控制数据输入脚,DO 表示控制数据输出脚。DI 端接受从控制器传输过来的数据,每个 LED 内部的数据锁存器会存储 24bit (分别对应 R,G,B 三种颜色)数据,剩余的数据经过内部整形处理电路整形放大后通过 DO 端口开始转发输出给下一个级联的 LED 。因此,每经过一个 LED ,数据减少 24bit。
模块配置
驱动配置
驱动位于
LED Drivers ->
<*> LEDC Support for Allwinner SoCs
设备树配置
在设备树中配置如下:
在 SoC 的 dtsi
文件中提炼了内存基地址、中断控制、时钟等共性信息,是该类芯片所有平台的模块配置
ledc: ledc@2008000 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "allwinner,sunxi-leds";
reg = <0x0 0x02008000 0x0 0x400>;
interrupts = <GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&ccu CLK_LEDC>, <&ccu CLK_BUS_LEDC>;
clock-names = "clk_ledc", "clk_cpuapb";
resets = <&ccu RST_BUS_LEDC>;
reset-names = "ledc_reset";
dmas = <&dma 42>, <&dma 42>;
dma-names = "rx", "tx";
status = "disabled";
};
在设备端,配置了 LEDC 的引脚,配置位于 pio
节点下
&pio {
ledc_pins_a: ledc@0 {
pins = "PG0";
function = "ledc";
drive-strength = <10>;
};
ledc_pins_b: ledc@1 {
pins = "PG0";
function = "gpio_in";
};
}
配置灯珠数量,时序等
&ledc {
pinctrl-names = "default", "sleep";
pinctrl-0 = <&ledc_pins_a>;
pinctrl-1 = <&ledc_pins_b>;
led_count = <34>;
output_mode = "GRB";
reset_ns = <84>;
t1h_ns = <800>;
t1l_ns = <320>;
t0h_ns = <300>;
t0l_ns = <800>;
wait_time0_ns = <84>;
wait_time1_ns = <84>;
wait_data_time_ns = <600000>;
status = "disabled";
};
pinctrl-names
: 用于表示 0 和 1 的 pinctrl 哪个是默认和休眠状态。pinctrl-0
: 引脚配置,这里是默认使用的时候配置。pinctrl-1
: 同上,这里是休眠时的配置。led_count
: LED 灯的数目,根据硬件配置。output_mode
: LED 灯输出模式,根据 LED 灯的 datasheet 进行配置。reset_ns
: LED 灯 reset 时间控制。t1h_ns
: 1 码高电平时间,根据 LED 灯的 datasheet 进行配置。t1l_ns
: 1 码低电平时间,根据 LED 灯的 datasheet 进行配置。t0h_ns
: 0 码高电平时间,根据 LED 灯的 datasheet 进行配置。t0l_ns
: 0 码低电平时间,根据 LED 灯的 datasheet 进行配置。wait_time0_ns
: 两个 LED 数据之间的等待时间,根据 LED 灯的 datasheet 进行配置。wait_time1_ns
: 帧数据之间的等待时间,根据 LED 灯的 datasheet 进行配置。wait_data_time_ns
: 内部 FIFO 等待数据时间,超过时间触发异常中断。status
: 设备状态。
通常,如果想要使用一款新的 LEDC 灯,需要确认上述全部配置项都配置正确,比如说引脚配置以及 LED 灯的参数配置(包括 01 码高低电平时间、reset 时间以及 wait 时间),全部配置正确才能成功点亮。
驱动接口
驱动会在 /sys/class/leds
注册每个LED对应的设备目录
/sys/class/leds/sunxi_led0r // 红色
/sys/class/leds/sunxi_led0g // 绿色
/sys/class/leds/sunxi_led0b // 蓝色
其中 0
表示LED的编号,如果是 1 号 LED 则是
/sys/class/leds/sunxi_led1r
/sys/class/leds/sunxi_led1g
/sys/class/leds/sunxi_led1b
需要调节第 0 个LED的颜色为白光且最亮,操作如下:
echo 255 > /sys/class/leds/sunxi_led0r/brightness
echo 255 > /sys/class/leds/sunxi_led0g/brightness
echo 255 > /sys/class/leds/sunxi_led0b/brightness