Amlogic IR模块Linux驱动分析

目录

一、简介

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 = 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/131522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言——选择排序

完整代码&#xff1a; //选择排序 // 选择排序是一种简单直观的排序算法。它的工作原理如下:首先在未排序序列中找到最小&#xff08;大&#xff09;元素&#xff0c;存放到排序序列的起始位置&#xff0c;然后&#xff0c;再从剩余未排序元素中继续寻找最小&#xff08;大&am…

嵌入式中如何将BootLoader与APP合并成一个固件

1、前言 嵌入式固件一般分为BootLoader和App&#xff0c;BootLoader用于启动校验、App升级、App版本回滚等功能&#xff0c;BootLoader在cpu上电第一阶段中运行&#xff0c;之后跳转至App地址执行应用程序。 因此&#xff0c;在发布固件的时候&#xff0c;会存在BootLoader固件…

广汽传祺E9上市,3DCAT实时云渲染助力线上3D高清看车体验

今年5月21日&#xff0c;中国智电新能源旗舰MPV——广汽传祺智电新能源E9在北京人民大会堂举办上市发布会。 发布会现场&#xff08;图源官方&#xff09; 为了让更多的消费者能够在线上感受到广汽传祺E9的魅力&#xff0c;3DCAT实时渲染云与大圣科技合作为广汽传祺打造了一款…

python模块的介绍和导入

python模块的介绍和导入 概念 在Python中&#xff0c;每个Python代码文件都是一个模块。写程序时&#xff0c;我们可以将代码分散在不同的模块(文件)中&#xff0c;然后在一个模块中引用另一个模块的内容。 导入格式 1、在一个模块中引用(导入)另一个模块可以使用import语句…

List 接口常用实现类底层分析

一、集合 1.1 简介 集合主要分为两组&#xff08;单列集合、双列集合&#xff09;&#xff0c;Collection 接口有两个重要的子接口 List 和Set&#xff0c;它们的实现子类都是单列集合。Map 接口的实现子类是双列集合&#xff0c;存放的是 K-V 1.2 关系图 二、Collection 接口…

el-table样式

1、实现效果&#xff0c;外部框是蓝绿色边框&#xff0c;深色背景&#xff0c;里面的表格首先设置透明色&#xff0c;然后应用自定义斑马纹。 2、代码 template代码&#xff0c;其中样式frameBordStyle是深色背景框&#xff0c;不负责表格样式&#xff0c;表格样式由tableStyl…

操作系统——初始文件管理(王道视频p58)

1.总体概述&#xff1a; 这一节&#xff0c;主要是 作为 后续 “文件系统”的引子 我认为可以思考的点&#xff1a; &#xff08;1&#xff09;文件之间的逻辑结构——windows中采用根什么的“树状结构”&#xff0c;而文件在外存中的实际物理结构又是什么样的 &#xff08…

差生文具多之(一)eBPF

前言 在问题排查过程中, 通常包含: 整体观测, 数据采集, 数据分析这几个阶段. 对于简单问题的排查, 可以跳过前两个步骤, 无需额外收集数据, 直接通过分析日志中的关键信息就可以定位根因; 而对于复杂问题的排查, 为了对应用的行为有更完整的了解, 可以通过以下形式收集更多的…

Python---字符串中的查找方法--index()--括号里是要获取的字符串

index()方法其功能与find()方法完全一致&#xff0c;唯一的区别在于当要查找的子串没有出现在字符串中时&#xff0c;find()方法返回-1&#xff0c;而index()方法则直接 报错。 find()方法相关链接&#xff1a;Python---字符串中的查找方法--find&#xff08;&#xff09;--括…

postMessage

A:端口3000 import React, { useEffect } from react;function App() {useEffect(() > {const childWindow document.getElementById(child).contentWindow;const sendMessageToChild () > {childWindow.postMessage("主页面消息", "http://localhost:…

【电路笔记】-谐波

谐波 文章目录 谐波1、概述2、频谱分析3、已知信号4、未知信号5、总结 周期性信号并不总是完美的正弦模式&#xff0c;例如我们之前有关 正弦波的文章之一中介绍的那样。 有时&#xff0c;信号确实可以是简单正弦波的叠加&#xff0c;它们被称为复杂波形。 在本文中&#xff0…

【C语法学习】17 - fwrite()函数

文章目录 1 函数原型2 参数3 返回值4 示例 1 函数原型 fwrite()&#xff1a;将ptr指向的内存空间中储存的数据块写入与指定流stream相关联的二进制文件中&#xff0c;函数原型如下&#xff1a; size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream)2 参…

基于stm32F4的智能宠物喂食器的设计:LVGL界面、定时喂食喂水通风

宠物喂食器 一、功能设计二、元器件选型三、UI设计四、原理图设计五、源代码设计六、成品展示 实物链接&#xff1a;https://m.tb.cn/h.5iCUX6H?tkPL65WXCEipQ CZ3457 一、功能设计 1、设计一个触摸屏作为人机交互 2、通过触摸屏设置时间定时喂食喂水通风 3、获取当前水槽的…

没想到这么齐全!这份 Python 实战干货yyds

今天我分享一些Python学习神器资料&#xff0c;有需要的小伙文末自行免费领取。 1.200Python练手案例&#xff1a; 2.Python全套视频教程等&#xff1a; 3.浙大Python学习套装&#xff1a; * 4.Python实战案例&#xff1a; 5.Pandas学习大礼包 6.学习手册大礼包 Python知识…

2023年【熔化焊接与热切割】免费试题及熔化焊接与热切割考试总结

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 熔化焊接与热切割免费试题参考答案及熔化焊接与热切割考试试题解析是安全生产模拟考试一点通题库老师及熔化焊接与热切割操作证已考过的学员汇总&#xff0c;相对有效帮助熔化焊接与热切割考试总结学员顺利通过考试。…

单链表的应用(2)

环形链表的约瑟夫问题 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数&#xff0c;报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后&#xff0c;只剩下一个人&#xff0c;问最后留下的这个人编号是多少&#xff1f; 利用链表实现 思路&#xff1…

Firefox修改缓存目录的方法

打开Firefox&#xff0c;在地址栏输入“about:config” 查找是否有 browser.cache.disk.parent_directory&#xff0c;如果没有就新建一个同名的字符串&#xff0c;然后修改值为你要存放Firefox浏览器缓存的目录地址&#xff08;E:\FirefoxCacheFiles&#xff09; 然后重新…

Linux第一个小程序进度条

缓冲区 ​ 在写进度条程序之前我们需要介绍一下缓冲区&#xff0c;缓冲区有两种&#xff0c;输入和输出缓冲区&#xff0c;这里主要介绍输出缓冲区。在我们用C语言写代码时&#xff0c;输出一些信息&#xff0c;实际上是先输出到输出缓冲区里&#xff0c;然后才输出到我们的显…

数据包端到端的流程

流程 A给F发送一个数据包的流程&#xff1a; 首先 A&#xff08;192.168.0.1&#xff09;通过子网掩码&#xff08;255.255.255.0&#xff09;计算出自己与 F&#xff08;192.168.2.2&#xff09;并不在同一个子网内&#xff0c;于是决定发送给默认网关&#xff08;192.168.0.…

Redis之哨兵模式

文章目录 前言一、主从复制1.概述2.作用3.模拟实践搭建场景模拟实践 二、哨兵模式1.概述2.配置使用3.优缺点4.sentinel.conf完整配置 总结 前言 从主从复制到哨兵模式。 一、主从复制 1.概述 主从复制&#xff0c;是指将一台 Redis 服务器的数据&#xff0c;复制到其他的 Red…