Amlogic IR模块Linux驱动分析

news2025/1/4 2:49:13

目录

一、简介

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

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

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

相关文章

【C++--string模拟实现】

一、基本思路 新建一个项目&#xff0c;在项目中创建头文件string.h 源文件string.cpp 在头文件中&#xff0c;先定义一个新的命名空间&#xff08;为了防止与库中的string发生冲突&#xff09;&#xff0c;命名空间的名字可以按照自己意愿来命名。 接下来就可以在命名空间中…

高斯过程回归 | 高斯过程回归(GPR)区间预测

对于高斯过程,高斯指的是多元高斯分布,过程指的是随机过程。 我们都知道随机过程就是指函数的分布,那么多元高斯分布实际上应该是指无限元的高斯分布。 协方差函数也称为核函数,是高斯过程回归的重点。核函数的选取方式有很多,包括径向基函数(高斯核函数)、线性核函数、…

C++相关练习及详细讲解

目录 题1&#xff1a;输出数组中第k小的数在数组内找出查找数字在该数组第一次出现的索引 题1&#xff1a;输出数组中第k小的数 题目描述&#xff1a; 给定一个数组arr 输出数组中第k小的数 如果不存在 输出-1 输入格式&#xff1a; 第一行输入一个数字n 代表数组arr大小 第二…

S32K324 UDS Bootloader开发-下位机篇-Bootload软件(1)

文章目录 前言启动过程Bootloader开发链接文件编译文件跳转函数CAN收发相关发送接收初始化及使能CAN周期函数总结前言 上一篇文章介绍了S32K324 -UDS Bootlodaer开发中的需求,本文根据需求开发Bootloader软件。 本文参考NXP官网的S32K324 UBL,其中有一些Bug,也有一些和上位机…

C++ 实现红黑树

红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路 径会比其他路径长出俩倍&#xff0c;因…

SMART PLC开放式以太网通信(UDP通信)

西门子S7-200 SMART PLC不仅支持开放式以太网通信,还支持MODBU-RTU,以及ModbusTcp通信,详细内容请参考下面文章: MODBUS-RTU主站通信 【精选】PLC MODBUS通信优化、提高通信效率避免权限冲突(程序+算法描述)-CSDN博客文章浏览阅读2.5k次,点赞5次,收藏10次。MODBUS通讯…

Ubuntu 20.04源码安装git 2.35.1

《如何在 Ubuntu 20.04 上从源代码安装 Git [快速入门]》和《如何在 Ubuntu 20.04 上安装 Git》是我参考的博客。 https://git-scm.com/是git官网。 lsb_release -r看到操作系统版本是20.04。 uname -r看到内核版本是5.4.0-156-generic。 sudo apt update更新一下源。 完…

操作系统复习(3)处理机调度与死锁

一、概述 1.1了解调度的层次 调度是指&#xff0c;在一个队列中&#xff0c;按照某种方法&#xff08;算法&#xff09;&#xff0c;选择一个合适的个体的过程。进程调度的功能就是按一定策略、动态地把CPU分配给处于就绪队列中的某一进程&#xff0c;并使之执行。 作业调度&…

设置DevC++支持c++11标准

1.点击编译选项 2. 设置语言标准 3.点击确认 4.测试代码 使用auto成功 测试&#xff01;

【LeetCode】第 370 场周赛

100115. 找到冠军 I 一场比赛中共有 n 支队伍&#xff0c;按从 0 到 n - 1 编号。 给你一个下标从 0 开始、大小为 n * n 的二维布尔矩阵 grid 。对于满足 0 < i, j < n - 1 且 i ! j 的所有 i, j &#xff1a;如果 grid[i][j] 1&#xff0c;那么 i 队比 j 队 强 &…

该酷的酷该飒的飒~质感满满的羊羔绒皮外套

皮毛一体材质柔软舒适 保暖性能极佳 冬天穿也不惧严寒的哦 宽松版型&#xff0c;对身材的包容性很强 外套的细节处理也非常出色&#xff0c;车缝线整齐 纽扣和拉链质量也是很不错的哟

鼠标加速不一定都是好事,有时是适得其反,如在游戏当中

如果你玩游戏&#xff0c;你会想在Mac上禁用鼠标加速。这是因为虽然鼠标加速可能很好&#xff0c;但它可能会导致鼠标光标速度不一致&#xff0c;这在游戏中并不理想。 简单地说&#xff0c;如果macOS检测到你正在以特定的速度或强度移动鼠标&#xff0c;鼠标指针加速会提高光…

PivotNet:Vectorized Pivot Learning for End-to-end HD Map Construction

参考代码&#xff1a;BeMapNet。PS&#xff1a;代码暂未放出&#xff0c;关注该仓库动态 动机和主要贡献 在MapTR系列的算法中将单个车道线建模为固定数量的有序点集&#xff08;对应下图Evenly-based&#xff09;&#xff0c;这样的方式对于普通道路场景具备一定适应性。但是…

深度好文|听懂这些逻辑,你会越变越好。

哈喽&#xff0c;大家好&#xff0c;我是雷工。 最近看了一篇文章&#xff0c;噱头很大&#xff0c;说是手把手的教你&#xff0c;如何从一个普通人&#xff0c;成长为身价千万的中产。 这种话我肯定是不信的&#xff0c;要么标题党&#xff0c;要么割韭菜&#xff0c;千万的中…

048基于web+springboot的校园资料分享平台

欢迎大家关注&#xff0c;一起好好学习&#xff0c;天天向上 文章目录 一项目简介技术介绍 二、功能组成三、效果图四、 文章目录 一项目简介 本校园资料分享平台有管理员和用户两个角色。管理员功能有个人中心&#xff0c;学生管理&#xff0c;资料分享管理&#xff0c;资源分…

【JVM】JDBC案例打破双亲委派机制

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 JVM 打破双亲委派机制&#xff08;JDBC案例…

使用springBoot+Redis实现分布式缓存

使用springBootRedis实现分布式缓存 1. 添加redis框架 依赖 2. 配置redis连接信息 #redis 连接的配置信息 spring.redis.database15 spring.redis.port6379 spring.redis.host82.157.236.116 # 可省略 spring.redis.lettuce.pool.min-idle5 spring.redis.lettuce.pool.max-id…

QT进度条 QProgressDialog基础、高级和样式表使用详解

一、基础使用 QProgressDialog是Qt中的一个类&#xff0c;用于显示一个进度条和一个取消按钮&#xff0c;让用户可以在长时间的操作中看到进度&#xff0c;并且可以随时取消。QProgressDialog的基本用法是创建一个对象&#xff0c;设置最小值和最大值&#xff0c;然后在循环中…

多态 多继承的虚表深度剖析 (3)

&#x1f4af; 博客内容&#xff1a;多态 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准C后端工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &#x1f496; 欢迎大家&#xff1a;这里是CSD…

加法运算、 || 、 赋值运算

一、加法运算 在这里插入图片描述 二、&& || 三、赋值运算 四、js类型就八种&#xff1a; 五、css权重、 六&#xff1a;布局&#xff0c;尽量使用块盒。 七、小数精度存储的问题&#xff1a;存的不精确&#xff0c;算的肯定也是有问题的。 八、找单身狗算法题…