介绍
LEDC 用于控制外部智能 LED 灯,例如 WS2812B。
LEDC 支持 DMA 模式和中断模式,并配备 32*24 位的 LEDC FIFO。LEDC 还支持 RGB888 显示模式和可配置的刷新时间。
架构
Realtek 的 LEDC 驱动遵循 Linux 框架:led-class.c
、led-core.c
、led-trigger.c
。该驱动支持模式触发。下面展示了 LEDC 的软件架构。
实现
LEDC 驱动程序的实现如下表所列:
驱动程序位置 |
介绍 |
---|---|
<linux>/drivers/rtkdrivers/ledc/Kconfig |
LEDC 驱动程序 Kconfig |
<linux>/drivers/rtkdrivers/ledc/Makefile |
LEDC 驱动程序 Makefile |
<linux>/drivers/rtkdrivers/ledc/leds-rtk-ws28xxx.c |
LEDC 函数 |
<linux>/drivers/rtkdrivers/ledc/leds-rtk-ws28xxx.h |
LEDC 相关函数声明、宏定义、结构定义以及其他引用的头文件 |
配置
设备树配置
LEDC 的设备树节点在文件 <dts>/rtl8730e-ocp.dtsi
中定义。
ledc: led-controller@41008000 {
compatible = "realtek,ameba-ws28xxx-led";
reg = <0x41008000 0x1000>;
interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>;
#address-cells = <1>;
#size-cells = <0>;
clocks = <&rcc RTK_CKE_LEDC>;
rtk,led-nums = <1>;
dmas = <&dma 5>;
dma-names = "dma_leds_tx";
rtk,wait-data-timeout = <0x7FFF>;
rtk,output-RGB-mode = <0>; // Refer to spec for details.
rtk,data-tx-time0h = <0xD>;
rtk,data-tx-time0l = <0x27>;
rtk,data-tx-time1h = <0x27>;
rtk,data-tx-time1l = <0xD>;
rtk,refresh-time = <0x3A97>;
status = "disabled";
led@0 {
label = "common";
reg = <0x0>;
};
};
LEDC 的设备树参数列在下表中。
属性 |
描述 |
可配置? |
---|---|---|
compatible |
LEDC驱动的描述符: |
否 |
reg |
LEDC 设备的硬件地址和大小:<0x41008000 0x1000> |
否 |
interrupts |
LEDC 设备的 GIC 编号:<GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH> |
否 |
clocks |
LEDC 设备的时钟:<&rcc RTK_CKE_LEDC> |
否 |
dmas |
DMA 通道,请参考 DMA 说明文档 |
是 |
dma-names |
DMA 通道名称 |
是 |
rtk,led-nums |
您硬件中的 LED 数量:1 个 LED、32 个 LED、64 个或其他。 |
1~1024 |
rtk,wait-data-timeout |
当设定时间超过时,LEDC 将获得一个中断,并对 LEDC 设备进行软件复位 |
1~0x7FFF |
rtk,output-RGB-mode |
输出 RGB 模式 |
是 |
rtk,data-tx-time0h |
0-code,高电平时间,默认值为 0xd, t0h = 25ns * (0xd + 1). |
是 |
rtk,data-tx-time0l |
0-code,低电平时间,默认值为 0x27, t0l = 25ns * (0x27 + 1). |
是 |
rtk,data-tx-time1h |
1-code,高电平时间,默认值为 0x27, t1h = 25ns * (0x27 + 1). |
是 |
rtk,data-tx-time1l |
1-code,低电平时间,默认值为 0xd, t1l = 25ns * (0xd + 1). |
是 |
rtk,refresh-time |
LED 灯的复位时间控制,即单个切片的刷新时间。默认值为 0x3a97,复位时间 = 25ns * (0x3a97 + 1) |
是 |
status |
是否启用设备
|
是 |
led@0 |
LEDC 客户端节点。整个 ws28xxx LED 灯组将被视为一个名为 |
否 |
备注
LEDC Control Application 章节提供了一个 LEDC 时序参数的示例。
LEDC 的引脚分配在下表中列出。
端口名称 |
引脚名称 |
pinctrl 描述 |
---|---|---|
PA3 |
LEDC_TX |
需手动添加 |
PA6 |
LEDC_TX |
<&ledc_pins> |
PA7 |
LEDC_TX |
需手动添加 |
PA8 |
LEDC_TX |
需手动添加 |
PA9 |
LEDC_TX |
需手动添加 |
PA10 |
LEDC_TX |
需手动添加 |
PA13 |
LEDC_TX |
需手动添加 |
PA20 |
LEDC_TX |
需手动添加 |
PA21 |
LEDC_TX |
需手动添加 |
PA22 |
LEDC_TX |
<&ledc_pins_a > |
PA25 |
LEDC_TX |
<&ledc_pins_a > |
LEDC 仅有一个用于 Tx 的引脚复用功能,因此,在 pinmux 设备树中,只有一个引脚被定义。 如果需要根据特定板子修改引脚复用,只需修改 pinmux 设备树中的 ledc_pins 节点。只要板子硬件支持,引脚复用可以更改为上述任何一个。
编译配置
选择
。
APIs
用户空间 API
设置 LEDC 模式:
cd /sys/class/leds/rtk_ws28xxx:common/
echo 0x2255FF 0 0x2255FF 0 0x2255FF 0 0x2255FF 0 > hw_pattern
在 <sdk>/tests/ledc
目录下找到用户空间的 LEDC 演示。
内核空间 API
无。
LEDC 控制应用
以 WS2812C-2020 LED 为例,在使用该 LED 之前,我们必须根据典型 LED 规格书中的 LEDC 数据输入代码来配置逻辑字符 0
和字符 1
,如下表所示。
调制代码 |
描述 |
时间范围 |
单位 |
---|---|---|---|
T0H |
Digital 0 code,高电平时间 |
220 ~ 380 |
纳秒 |
T0L |
Digital 0 code,低电平时间 |
580 ~ 1000 |
纳秒 |
T1H |
Digital 1 code,高电平时间 |
580 ~ 1000 |
纳秒 |
T1L |
Digital 1 code,低电平时间 |
220 ~ 420 |
纳秒 |
RESET |
帧单元,低电平时间 |
> 280 |
微秒 |
逻辑 0
的编码时间是 T0-code:800ns ~ 1980ns,逻辑 1 的编码时间是 T1-code:800ns ~ 2020ns。
支持的 LED 数量
当 LED 的刷新率为每秒 30 帧时,支持的 LED 数量为 681 到 1023。
当 LED 的刷新率为每秒 60 帧时,支持的 LED 数量为 337 到 853。
LED 设置的相关寄存器是 LED_T0&T1_TIMING_CTRL_REG、LEDC_DATA_FINISH_CNT_REG、LED_RESET_TIMING_CTRL_REG、LEDC_WAIT_TIME_CTRL_REG、LEDC_DMA_CTRL_REG 和 LEDC_INTERRUPT_CTRL_REG。
WS2812 系列 LED 数据传输协议使用单一 NRZ(非归零)通信模式。
在 LED 上电复位后,DI
端口开始从控制器接收数据,第一个 LED 收集初始的 24 位数据,然后将 24 位数据发送到内部数据锁存器。
其他数据通过内部信号整形放大电路整形后,通过 DO
端口发送到下一个级联像素。
每个像素传输之后,信号减少 24 位。像素采用自动整形传输技术。
使得像素级联数量不受信号传输的限制,仅取决于信号传输速度。