设计说明
2 Dec 2024
源码说明
CIR 模块的源码位于linux-5.10/drivers/media/rc/artinchip-cir.c
模块架构
linux 内核中 rc 的基本框架如下图所示:
红外信号的编码和解码工作由内核负责完成。在完成编码后,应用层需要发送的信号被编码为一系列的带有宽度的高低电平(pulse/space),CIR driver 在发送端就是需要将这一系列的 pulse/space 写入发送 FIFO,发送出去。在接收红外信号时,CIR driver 需要将接收到的一系列高低电平送入到rc core进行解码,最终将解码得到的 scancode和 keycode 反馈到输入子系统,最终送给 app 程序完成红外信号的接收。所以,CIR 驱动的主要任务有:
-
将编码得到的高低电平信号以游码的形式写入 TX-FIFO,发送红外信号
-
将 CIR 模块接收的 RX-FIFO 中的游码正确表示为高低电平的形式,相邻的高电平或低电平需要进行合并。
-
根据用户空间传递的红外参数,对 CIR 的底层寄存器进行配置,如配置载波频率,配置占空比等
由于红外信号的数据量都很少,所以在红外信号的发送端,一般是利用循环将所有的数据一次性全部发送出去,而不会采用中断或 DMA 的方式。在红外信号的接收端,一般是采用中断的方式进行数据的接收,在接收完成后,调用相应的解码函数进行解码。CIR 模块可以支持任何的红外协议,对不同红外协议的支持可以通过对载波配置寄存器的设置来实现。CIR 驱动中默认配置的是支持 NEC 协议。