我尝试使用RAMIPS SoC和PWM IR TX kernel module将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设备,因此我不确定我应该如何与设备进行交互。理想情况下,我想使用Remote Controller 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 chardev。
答案 0 :(得分:0)
pwm_ir_tx模块似乎或多或少是对pwm驱动程序的捎带。并且pwm驱动程序似乎在/ sys / class / pwm /中可用。请参阅https://www.kernel.org/doc/Documentation/pwm.txt。
顺便说一句,在rc0 /中没有lirc链接并不罕见 - 并非所有驱动程序都实现了这一点。答案 1 :(得分:0)
在读取内核中的一些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