Edit online

设计说明

2 Dec 2024
Read time: 1 minute(s)

源码说明

CIR 模块的源码位于bsp/artinchip/
  • 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 的基本框架如下图所示:


rc_arch

红外信号的编码和解码工作由CIR 协议负责完成。在完成编码后,应用层需要发送的信号被编码为一系列的带有宽度的高低电平(pulse/space),CIR driver 在发送端就是需要将这一系列的 pulse/space 写入发送 FIFO,发送出去。在接收红外信号时,CIR driver 需要将接收到的一系列高低电平送入到CIR 协议进行解码,最终将解码得到的 scancode到输入子系统,最终送给 app 程序完成红外信号的接收。所以,CIR 驱动的主要任务有:

  1. 将编码得到的高低电平信号以游码的形式写入 TX-FIFO,发送红外信号

  2. 将 CIR 模块接收的 RX-FIFO 中的游码正确表示为高低电平的形式,相邻的高电平或低电平需要进行合并。

  3. 根据用户空间传递的红外参数,对 CIR 的底层寄存器进行配置,如配置载波频率,配置占空比等

由于红外信号的数据量都很少,所以在红外信号的发送端,一般是利用循环将所有的数据一次性全部发送出去,而不会采用中断或 DMA 的方式。在红外信号的接收端,一般是采用中断的方式进行数据的接收,在接收完成后,调用相应的解码函数进行解码。CIR 模块可以支持任何的红外协议,对不同红外协议的支持可以通过对载波配置寄存器的设置来实现。Luban-Lite 中目前提供了 NEC 和 RC5 协议的编解码,CIR 驱动中默认配置的是支持 NEC 协议。