1

我尝试使用 RAMIPS SoC 和PWM IR TX 内核模块将 pwm 输出引脚用作 IR 发射器。我正在运行 linux 4.14.37 并将以下条目添加到 dts 文件中:

   pwm_ir_tx1: pwm-ir-transmitter1 {
    compatible = "pwm-ir-tx";
    pwms = <&pwm 1 100>;
  };

我正在加载 rc-core 和 pwm-ir-tx 内核模块:

lsmod | grep pwm
pwm_ir_tx               2032  0 
pwm_mediatek_ramips     1744  1 
rc_core                19348  2 pwm_ir_tx

当 pwm-ir-tx 模块加载时,内核会记录:

[ 3754.108259] rc rc0: PWM IR Transmitter as /devices/platform/pwm-ir-transmitter1/rc/rc0

sysfs 节点似乎已正确加载:

ls -la /sys/class/rc/
drwxr-xr-x    2 root     root             0 May 29 00:18 .
drwxr-xr-x   23 root     root             0 Jan  1  1970 ..
lrwxrwxrwx    1 root     root             0 May 29 01:16 rc0 -> ../../devices/platform/pwm-ir-transmitter1/rc/rc0

但是 /dev 中没有列出用户空间 (chardev) lirc 设备,所以我不确定我应该如何与设备交互。理想情况下,我想使用远程控制器 API,但这需要 /dev 中存在 chardev。

ls /dev
autofs              mtd2ro              network_throughput
console             mtd3                null
cpu_dma_latency     mtd3ro              port
full                mtd4                ptmx
gpiochip0           mtd4ro              pts
gpiochip1           mtd5                random
gpiochip2           mtd5ro              shm
gpiochip3           mtd6                tty
i2c-0               mtd6ro              ttyS0
kmsg                mtdblock0           ttyS1
log                 mtdblock1           ttyS2
memory_bandwidth    mtdblock2           urandom
mtd0                mtdblock3           watchdog
mtd0ro              mtdblock4           watchdog0
mtd1                mtdblock5           zero
mtd1ro              mtdblock6
mtd2                network_latency

我尝试在 pwm-ir-tx 模块之前和之后加载 lirc_dev 模块,但 /dev 中仍然没有出现任何内容,当我加载 lirc_dev 模块时出现以下输出:

[ 4775.367966] lirc_dev: IR Remote Control driver registered, major 251

但是 /dev 中仍然没有 lirc 用户空间设备...我认为 lirc_dev 模块是必需的,因为它提供了 lirc 用户空间 api,但它与 pwm-ir-tx 模块之间似乎没有任何联系,并且它没有在 /dev 中创建任何 lirc chardevs。

4

2 回答 2

1

pwm_ir_tx 模块似乎或多或少是 pwm 驱动程序的捎带。pwm 驱动程序似乎在 /sys/class/pwm/ 中可用。请参阅https://www.kernel.org/doc/Documentation/pwm.txt

顺便说一句,在 rc0/ 中没有 lirc 链接并不少见 - 并非所有驱动程序都实现了这一点。

于 2018-06-15T13:08:06.493 回答
1

在阅读了内核中的一些 rc 源文件后,很明显还需要 ir-lirc-codec 模块。基本上,pwm-ir-tx 驱动程序被定义为一种 RC_DRIVER_IR_RAW_TX。当 rc-core 模块注册一个类型为 RC_DRIVER_IR_RAW 或 RC_DRIVER_IR_RAW_TX 的驱动程序时,它会调用 ir_raw_event_prepare 函数,该函数又会尝试加载 ir-lirc-codec 模块。一旦这个模块可用,就会出现以下内核日志:

[   10.004460] lirc_dev: IR Remote Control driver registered, major 251
[   10.131011] IR LIRC bridge handler initialized
[   10.471561] rc rc0: PWM IR Transmitter as /devices/platform/pwm-ir-transmitter1/rc/rc0
[   10.487456] rc rc0: lirc_dev: driver ir-lirc-codec (pwm-ir-tx) registered at minor = 0

在 /dev 中有一个 lirc chardev 设备可用:

 ls /dev/li*
/dev/lirc0
于 2018-06-15T19:14:10.793 回答