Amlogic IR模块Linux驱动分析

本文详细介绍了AMLogicIR驱动的原理,包括IR协议理解、硬件连接、驱动代码结构、设备树配置、Linux内核中的pinctrl和sysfs调试方法。特别关注了硬件解码和软件解码的区别,以及如何通过makefile和sysfs进行驱动配置和调试。
摘要由CSDN通过智能技术生成

目录

一、简介

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 //寄存器映射(协议相关)

kernelpinctrl子系统release/aml-comp/kernel/aml-5.4/kernel/aml-5.4/drivers/pinctrl/meson/*
kerneldts

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

bootir 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 = 0x01

MULTI_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

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值