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