目录
一、简介
1、了解IR协议
2、代码结构介绍
二、硬件原理及连接
2、芯片手册解读
三、驱动代码分析
1、设备树介绍
1)reg
2)protocol
3)pinctrl
4)map
2、linux驱动介绍
1)makefile
2)数据结构
3)驱动代码
3、重要的代码配置
四、调试方法
1、sysfs
2、输入子系统的设备文件
3、查看模块
一、简介
本文做一些IR驱动的简要分析,先来了解基本知识
1、了解IR协议
全面了解红外遥控(中文版) - 道客巴巴
1、概况一下就是:遥控发送约定的红外波形(根据IR协议构造的波形) → IR接收模块该红外波形→ 主控解码并响应。
2、看代码前首先理解IR的一般概念:
1)IR的四种码值(高低电平组合):头码、地址码、命令码、重复码
2)IR的两种状态:按下、持续按下(repeat)
3)IR模式:遥控器(键值对)、鼠标(鼠标移动/点击)
4)IR配对模式 - 有些遥控会有
2、代码结构介绍
所在层次 | 名称 | 代码路径 |
---|---|---|
kernel | ir driver | release/aml-comp/kernel/aml-5.4/kernel/aml-5.4/drivers/amlogic/input/ir/meson_ir_main.c //驱动的入口文件 release/aml-comp/kernel/aml-5.4/kernel/aml-5.4/drivers/amlogic/input/ir/meson_ir_core.c //核心函数实现 release/aml-comp/kernel/aml-5.4/kernel/aml-5.4/drivers/amlogic/input/ir/meson_ir_cdev.c //字符设备实现 release/aml-comp/kernel/aml-5.4/kernel/aml-5.4/drivers/amlogic/input/ir/meson_ir_sysfs.c //sysfs目录实现 release/aml-comp/kernel/aml-5.4/kernel/aml-5.4/drivers/amlogic/input/ir/meson_ir_decoder_xmp.c //xmp软件解码实现 release/aml-comp/kernel/aml-5.4/kernel/aml-5.4/drivers/amlogic/input/ir/meson_ir_raw.c //解码事件处理(软件解码用到) release/aml-comp/kernel/aml-5.4/kernel/aml-5.4/drivers/amlogic/input/ir/meson_ir_regmap.c //寄存器映射(协议相关) |
kernel | pinctrl子系统 | release/aml-comp/kernel/aml-5.4/kernel/aml-5.4/drivers/pinctrl/meson/* |
kernel | dts | release/aml-comp/kernel/aml-5.4/arch/arm/boot/dts/amlogic/t5d_t950d4_am301_linux_1.5g_cvte.dts //1.5g指ddr内存 release/aml-comp/kernel/aml-5.4/arch/arm/boot/dts/amlogic/t5d_t950d4_am301_linux_1g_cvte.dts release/aml-comp/kernel/aml-5.4/arch/arm/boot/dts/amlogic/t5d_t950d4_am301_linux_512m_cvtelinux.dts //以上修改的话最好一起修改,覆盖不同芯片多个方案 release/aml-comp/kernel/aml-5.4/arch/arm/boot/dts/amlogic/mesont5d.dtsi release/aml-comp/kernel/aml-5.4/arch/arm/boot/dts/amlogic/meson-ir-map.dtsi |
boot | ir driver | release/aml-comp/uboot/bl30/src_ao/demos/amlogic/driver/ir/ |
二、硬件原理及连接
1、
IR遥控板经过RC电路,接入到CPU端的IR_IN引脚
2、芯片手册解读
1)硬件解码的IR模块简介
T950D4器件集成有IR控制器,驱动可以配置选择硬件解码,硬件自动完成波形解码,只需读取对应寄存器就可以得到码值。
2)引脚&功能描述
三、驱动代码分析
1、设备树介绍
release/aml-comp/kernel/aml-5.4/arch/arm/boot/dts/amlogic/mesont5d.dtsi
这里的节点定义了重要的ir配置,下面介绍重点配置
1)reg
reg硬件解码的配置寄存器。
2)protocol
/release/aml-comp/kernel/aml-5.4/scripts/dtc/include-prefixes/dt-bindings/input/meson_ir.h
/release/aml-comp/kernel/aml-5.4/include/dt-bindings/input/meson_ir.h
从opengrok的搜索结果可以看到 REMOTE_TYPE_NEC 值为0x01
3)pinctrl
1、引脚的初始化实现详见pinctrl子系统:
release/aml-comp/kernel/aml-5.4/kernel/aml-5.4/drivers/pinctrl/meson/pinctrl-meson-t5d.c
2、模块名详见makefile:
3、查看当前的内联模块
cat /lib/modules/$(uname -r)/modules.builtin | more | grep aml_pinctrl
4、pinctrl子系统介绍
1)Linux内核之pinctrl子系统:Linux内核之pinctrl子系统 - 知乎
2)一文解析pinctrl:一文搞懂 | Linux pinctrl/gpio子系统 - 知乎
4)map
map = <&custom_maps>; 会引用到以下dtsi的数据节点
release/aml-comp/kernel/aml-5.4/arch/arm/boot/dts/amlogic/meson-ir-map.dtsi
1、6套遥控解码(同一协议);
2、头码
3、发送repeat码的时间间隔
4、scancode(硬件解码得到) 和 keycode(用户定义) 的对应,应用层得到的是keycode
2、linux驱动介绍
1)makefile
通过makefile了解用到的代码文件
值得注意,CONFIG_AMLOGIC_MESON_IR=y ,即该驱动是编进内核的。
2)数据结构
IR协议结构体
3)驱动代码
需要注意,代码里兼容了软件解码和硬件解码,我们使用硬件解码,只需要关注硬解部分即可,下面以硬件解码来展开
release/aml-comp/kernel/aml-5.4/kernel/aml-5.4/drivers/amlogic/input/ir/meson_ir_main.c //驱动的入口文件
1、驱动入口init
驱动模型为平台设备驱动,这里实现了driver,没有实现device,设备信息从设备树里获取;
2、meson_ir_probe初始化函数中的关键操作
1)挂接回调函数
meson_ir_report_rel 为上报位置信息,当模式为mouse cursor时才用到,这里没有用到
2)注册输入子设备
3)hardware相关初始化
这里获取设备树节点信息、注册中断、中断下半部tasklet
chip->set_register_config(chip, chip→protocol);
这里进行IR协议初始化
meson_ir_interrupt
如果有IR数据,首先会进入中断处理
rc->protocol = REMOTE_TYPE_NEC = 0x01MULTI_IR_SOFTWARE_DECODE(rc->protocol) = 0 //multi_ir指软件解码故会走else分支ENABLE_LEGACY_IR(rc->protocol) = 0 //legacy ir指旧架构的IR模块 |
进入中断下半部处理 meson_ir_tasklet 进行按键上报
按键的两种一般状态:
IR_STATUS_NORMAL 短按
IR_STATUS_REPEAT 长按
进入meson_ir_keydown处理
值得注意,一次完整的短按,包含keydown和keyup事件
打开log后观察打印可以看到如下:
keyup事件在定时器超时后执行
4)字符设备初始化
创建字符设备,sysfs_init主要是创建各种属性,包括很多调试属性文件。
3、重要的代码配置
1)LEGACY_IR_TYPE_MASK(type) //legacy_ir指的是旧架构的IR模块,这里为了兼容
2)MULTI_IR_TYPE_MASK(type) //multi_ir是指软件解码,软件解码支持多种IR协议,但硬件解码只支持一种IR协议
四、调试方法
1、sysfs
举例:开启log打印
echo 1 > /sys/class/remote/amremote/debug_enable echo 7 > /proc/sys/kernel/printk |
2、输入子系统的设备文件
cat /proc/bus/input/devices //查看输入设备信息
input设备:/sys/class/input/input2
事件设备:/dev/input/event2
3、查看模块
cat /lib/modules/$(uname -r)/modules.builtin | more | grep meson_ir