介绍

LEDC 用于控制外部智能 LED 灯,例如 WS2812B

LEDC 支持 DMA 模式和中断模式,并配备 32*24 位的 LEDC FIFO。LEDC 还支持 RGB888 显示模式和可配置的刷新时间。

架构

Realtek 的 LEDC 驱动遵循 Linux 框架:led-class.cled-core.cled-trigger.c。该驱动支持模式触发。下面展示了 LEDC 的软件架构。

../../rst_linux/8_ledc/figures/ledc_software_arch.svg

有关 linux LED 的更多细节请参考 LED v5.4LED v6.6

实现

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驱动的描述符: realtek, ameba-ws28xxx-led

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

是否启用设备

  • disabled

  • okay

led@0

LEDC 客户端节点。整个 ws28xxx LED 灯组将被视为一个名为 common 的 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 节点。只要板子硬件支持,引脚复用可以更改为上述任何一个。

编译配置

选择 Device Drivers -> Drivers for Realtek -> LED driver for WS28XXX

../../rst_linux/8_ledc/figures/ledc_driver.png

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_REGLEDC_DATA_FINISH_CNT_REGLED_RESET_TIMING_CTRL_REGLEDC_WAIT_TIME_CTRL_REGLEDC_DMA_CTRL_REGLEDC_INTERRUPT_CTRL_REG

WS2812 系列 LED 数据传输协议使用单一 NRZ(非归零)通信模式。 在 LED 上电复位后,DI 端口开始从控制器接收数据,第一个 LED 收集初始的 24 位数据,然后将 24 位数据发送到内部数据锁存器。 其他数据通过内部信号整形放大电路整形后,通过 DO 端口发送到下一个级联像素。 每个像素传输之后,信号减少 24 位。像素采用自动整形传输技术。 使得像素级联数量不受信号传输的限制,仅取决于信号传输速度。