Edit online

关键流程设计

4 Dec 2024
Read time: 1 minute(s)

初始化流程

CIR 模块的初始化流程如下:

  1. 释放 clock 和 reset 信号

  2. 调用 device 为 rc_dev 结构体分配空间

  3. 设置载波的占空比为 33%。读取 dts 中 linux,rc-map-name 的属性值。若为空,则默认使用内核中的空表

  4. 注册红外设备

  5. 读取 dts 中的 rx-level 属性值,设置 RX 空闲时的状态

  6. 设置噪声阈值,激活阈值,空闲阈值等底层配置

  7. 设置载波配置寄存器,驱动中默认配置的是 38K 载波(NEC 协议)

  8. 使能 CIR 中断,发送器,接收器

中断处理流程

CIR 模块使能 RX 的溢出中断、RXFIFO 可用中断、接收完成中断。

中断执行流程如下:

  1. 读取中断状态寄存器和接收状态寄存器

  2. 清空所有中断标志位

  3. 若为 RXFIFO 可用中断或接收完成中断,判断 RXFIFO 是否为空,非空则读取 RXFIFO 中数据个数,并逐个从 RXFIFO 中读取数据。若不是这两个中断,则跳转到 5

  4. 将每次从 RXFIFO 中读出的游码解析为正确的高低电平宽度,并调用 filter 将解析后的数据存储到 kfifo 中

  5. 若为接收溢出中断,则调用 reset,清空 kfifo 中的数据

  6. 若为接收完成中断,此处以完成对所有数据的接收,调用 handle 开始解码