ARM DIY(十)LRADC 按键

news2024/9/27 7:18:54

前言

ARM SOC 有别于单片机 MCU 的一点就是,ARM SOC 的 GPIO 比较少,基本上引脚都有专用的功能,因为它很少去接矩阵键盘、众多继电器、众多 LED。
但有时 ARM SOC 又需要三五个按键,这时候 LRADC 就是一个不错的选择,它使用一个引脚,就可以扩展几个到几十个按键。

原理

在这里插入图片描述
设计上述电路,

  • 当没有按键按下时,KEYADC0 引脚电压约等于 AVCC(3V)
  • S1 按下时,KEYADC0 引脚电压等于 6.8/(6.8+100)*3V=0.19V
  • S2 按下时,KEYADC0 引脚电压等于 (6.8+8.2)/(6.8+8.2+100)*3V=0.39V
  • S3 按下时,0.6V
  • S4 按下时,0.8V

这样,根据 KEYADC0 引脚电压值,就可知道哪个键被按下了。

继续介绍下 LRADC 内部原理
在这里插入图片描述

  • 当 ADC_IN 从 3.0V 降到 2.0V 以下,比较器 24 会发送第一个中断给 Control Logic;
  • 当 ADC_IN 从 2.0V 降到某一指定电压以下,比较器 25 会发送第二个中断给 Control Logic;
  • 如果 Control Logic 收到了第一个中断,在指定的时间内没有收到第二个中断,它会向 host 发送 HOLD_KEY_IRQ;
  • 如果 Control Logic 收到了第一个中断,并且在指定的时间内又收到第二个中断,它会向 host 发送 KEY_DOWN_IRQ;
  • 如果 Control Logic 只收到了第二个中断,没有收到第一个中断,它会向 host 发送 ALREADY_HOLD_IRQ。

硬件

焊接按键和分压电阻
请添加图片描述

设备树

arch/arm/boot/dts/sun8i-v3s.dtsi

	soc {
		lradc: lradc@1c22800 {
			compatible = "allwinner,sun4i-a10-lradc-keys";
			reg = <0x01c22800 0x400>;
			interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>;
			status = "disabled";
		};
	};

arch/arm/boot/dts/sun8i-v3s-licheepi-zero-dock.dts

&lradc {
	vref-supply = <&reg_vcc3v0>;
	status = "okay";

	button-200 {
		label = "Volume Up";
		linux,code = <KEY_VOLUMEUP>;
		channel = <0>;
		voltage = <200000>;
	};

	button-400 {
		label = "Volume Down";
		linux,code = <KEY_VOLUMEDOWN>;
		channel = <0>;
		voltage = <400000>;
	};

	button-600 {
		label = "Select";
		linux,code = <KEY_SELECT>;
		channel = <0>;
		voltage = <600000>;
	};

	button-800 {
		label = "Start";
		linux,code = <KEY_OK>;
		channel = <0>;
		voltage = <800000>;
	};
};

内核编译选项

在这里插入图片描述

测试

LRADC 中断已注册成功

root@v3s-diy:~# cat /proc/interrupts 
           CPU0       
 17:          0     GIC-0  29 Level     arch_timer
 18:     267730     GIC-0  30 Level     arch_timer
 21:          0     GIC-0  50 Level     timer@1c20c00
 22:      24551     GIC-0  92 Level     sunxi-mmc
 23:     832950     GIC-0  93 Level     sunxi-mmc
 24:          0     GIC-0 103 Level     musb-hdrc.1.auto
 25:          0     GIC-0  72 Level     1c20400.rtc
 31:          0     GIC-0  62 Level     sun4i-a10-lradc-keys // LRADC 中断
 32:       2037     GIC-0  32 Level     ttyS0
 34:        224     GIC-0  38 Level     mv64xxx_i2c
 35:         10     GIC-0  39 Level     mv64xxx_i2c
 36:    3589553     GIC-0  97 Level     sun6i-spi
 37:          0     GIC-0  82 Level     1c02000.dma-controller
 39:          0     GIC-0 116 Level     sun6i-csi
 40:          0     GIC-0 104 Level     ehci_hcd:usb1
 41:          2     GIC-0 105 Level     ohci_hcd:usb2
IPI0:          0  CPU wakeup interrupts
IPI1:          0  Timer broadcast interrupts
IPI2:          0  Rescheduling interrupts
IPI3:          0  Function call interrupts
IPI4:          0  CPU stop interrupts
IPI5:          0  IRQ work interrupts
IPI6:          0  completion interrupts
Err:          0

/dev/input 目录下已产生对应设备

# ls /dev/input/
event0

检测按键

# hexdump /dev/input/event0
0000000 005c 0000 a87a 000c 0001 0160 0001 0000
0000010 005c 0000 a87a 000c 0000 0000 0000 0000
0000020 005d 0000 8dfc 0006 0001 0160 0000 0000
0000030 005d 0000 8dfc 0006 0000 0000 0000 0000
0000040 005e 0000 fa30 000e 0001 0160 0001 0000
0000050 005e 0000 fa30 000e 0000 0000 0000 0000
0000060 005f 0000 a730 0007 0001 0160 0000 0000
0000070 005f 0000 a730 0007 0000 0000 0000 0000
0000080 0060 0000 664f 000a 0001 0160 0001 0000
0000090 0060 0000 664f 000a 0000 0000 0000 0000
00000a0 0061 0000 dad1 0001 0001 0160 0000 0000
00000b0 0061 0000 dad1 0001 0000 0000 0000 0000
# 
# cat /proc/interrupts | grep lradc
 31:         6     GIC-0  62 Level     sun4i-a10-lradc-keys

可以检测到按键事件,并且中断数量也相应增加。
至此 LRADC KEY 调试 OK

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

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

相关文章

[刷题记录]牛客面试笔刷TOP101

牛客笔试算法必刷TOP101系列,每日更新中~ 1.合并有序链表2023.9.3 合并两个排序的链表_牛客题霸_牛客网 (nowcoder.com) 题意大致为: 将两个链表中的元素按照从小到大的顺序合并成为一个链表. 所给予的条件: 给出的所要合并的链表都是从小到大顺序排列的. 思路: 创建一…

Vue3后台管理系统Element-plus_侧边栏制作_无限递归

在home.view中添加代码 <template><div><div class"common-layout"><el-container><el-header class"common-header flex-float"><div class"flex"><img class"logo" src"../assets/logo…

1. XAML简单的划分区域

1.运行效果 2.XAML程序 <Window x:Class="_1000_分区域.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft…

指针的应用与用法

指针的应用场景 从刚才的需求看&#xff0c;指针似乎并不是刚需啊&#xff0c;为什么一定要用指针呢&#xff0c;那么难理解&#xff0c;这是因为有些应用场景非他不可&#xff1a; 1.访问单片机的寄存器&#xff1b; 2.函数调用时内存共享&#xff1b; 3.常用数据结构链表&…

SpringBoot3快速入门

SpringBoot3快速入门 准备 知识准备 Spring、SpringMVC、MyBatis、Maven、IDEA 工具版本 java17 * SpringBoot:3.1.1 * IDEA:2021.2.1 * Maven:3.6.3 * Tomcat:10.0 * Servlet:5.0 * GraaIVM Community:22.3 Native Build Tools:0.9.23 springBoot简介 SpringBoot帮我们简单…

[Vue3 博物馆管理系统] 使用Vue3、Element-plus的Layout 布局构建组图文章

系列文章目录 第一章 定制上中下&#xff08;顶部菜单、底部区域、中间主区域显示&#xff09;三层结构首页 第二章 使用Vue3、Element-plus菜单组件构建菜单 第三章 使用Vue3、Element-plus走马灯组件构建轮播图 第四章 使用Vue3、Element-plus tabs组件构建选项卡功能 第五章…

android framework之Applicataion启动流程分析(四)

本文主要学习并了解Application的Activity启动流程。 这边先分析一下Launcher是如何启动进程的Acitivity流程。从Launcher启动Acitivity的时候&#xff0c;它是把启动任务丢给instrumentation模块去协助完成&#xff0c;由它进一步调用AMS的startActivity()方法 去启动&#xf…

基于resnet网络架构训练图像分类模型

数据预处理部分&#xff1a; 数据增强&#xff1a;torchvision中transforms模块自带功能&#xff0c;比较实用数据预处理&#xff1a;torchvision中transforms也帮我们实现好了&#xff0c;直接调用即可DataLoader模块直接读取batch数据 网络模块设置&#xff1a; 加载预训练…

ARM DIY(九)陀螺仪调试

前言 今天调试六轴陀螺仪 MPU6050 硬件 硬件很简单&#xff0c;使用 I2C 接口&#xff0c;并且没有使用中断引脚。 焊接上 MPU6050 芯片和上拉电阻、滤波电容。 检测 MPU6050 是挂在 I2C-0 上的&#xff0c;I2C-0 控制器的驱动已 OK&#xff0c;所以直接使用 I2C-0 检测 …

2023 年前端编程 NodeJs 包管理工具 npm 安装和使用详细介绍

npm 基本概述 npm is the world’s largest software registry. Open source developers from every continent use npm to share and borrow packages, and many organizations use npm to manage private development as well. npm 官方网站&#xff1a;https://www.npmjs.…

程序员做哪些副业可以日赚一百?

日赚一百&#xff1f;对程序员来说简直不要太容易&#xff01;下面给程序员们推荐一些日赚100的副业&#xff1a; ①外包接单 程序员简单粗暴赚钱的副业之一。 外包接单的类型包括但不限于&#xff1a;软件开发、硬件开发、小程序功能开发、web开发……大到一个系统的开发、…

外包干了三年,我承认我确实废了……

没错&#xff0c;我也干过外包&#xff0c;一干就是三年&#xff0c;三年后&#xff0c;我废了…… 虽说废的不是很彻底&#xff0c;但那三年我几乎是出差了三年、玩了三年、荒废了三年&#xff0c;那三年&#xff0c;我的技术能力几乎是零成长的。 说起这段三年的外包经历&a…

对象临时中间状态的条件竞争覆盖

Portswigger练兵场之条件竞争 &#x1f984;条件竞争之对象临时中间状态的条件竞争 Lab: Partial construction race conditions&#x1f680;实验前置必要知识点 某些框架尝试通过使用某种形式的请求锁定来防止意外的数据损坏。例如&#xff0c;PHP 的本机会话处理程序模块…

任务管理系统所需功能概述

"任务管理需要有哪些功能&#xff1f;清晰的任务创建与编辑、智能分类和标签系统、提醒与通知功能、进度跟踪与报告、协作与共享功能、集成与兼容性。" 一款优秀的任务管理工具可以帮助我们有效地规划、执行和监控各项任务&#xff0c;提高工作效率。本文将探讨一款理…

深度学习(十一)---zed 调用yolov5 进行识别目标并实时测距

1. 前言 zed 相机测距有2种方式&#xff1a;一种是根据点云数据进行测试&#xff0c;二是根据zed获取深度值进行测距。上篇文章 调用yolov5模型进行实时图像推理及网页端部署 我们讲述了zed调用yolov5进行目标识别&#xff0c;我们在此基础上进一步实现目标测距功能。 2.深度…

Apache httpd漏洞复现

文章目录 未知后缀名解析漏洞多后缀名解析漏洞启动环境漏洞复现 换行解析漏洞启动环境漏洞复现 未知后缀名解析漏洞 该漏洞与Apache、php版本无关&#xff0c;属于用户配置不当造成的解析漏洞。在有多个后缀的情况下&#xff0c;只要一个文件含有.php后缀的文件即将被识别成PHP…

微信多开bat代码

目录标题 创建txt文件右键 点击新建文本文档 复制如下代码进去&#xff0c;将里面的微信地址改成自己的微信地址&#xff08;查看地址方法&#xff1a;右击微信图标->属性->目标&#xff09;复制如下代码 创建txt文件 右键 点击新建文本文档 复制如下代码进去&#xff0…

Linux系统——MySQL安装(CentOS7 超详细演示)

Linux系统安装MySQL MySQL8.0.26-Linux版安装1. 准备一台Linux服务器2. 下载Linux版MySQL安装包3. 上传MySQL安装包4. 创建目录,并解压5. 安装mysql的安装包6. 启动MySQL服务7. 查询自动生成的root用户密码8. 修改root用户密码9. 创建用户10. 并给root用户分配权限11. 通过Data…

2023高教社杯 国赛数学建模E题思路 - 黄河水沙监测数据分析

1 赛题 E 题 黄河水沙监测数据分析 黄河是中华民族的母亲河。研究黄河水沙通量的变化规律对沿黄流域的环境治理、气候变 化和人民生活的影响&#xff0c; 以及对优化黄河流域水资源分配、协调人地关系、调水调沙、防洪减灾 等方面都具有重要的理论指导意义。 附件 1 给出了位…

willchange 优化性能的原理是什么

写在前面 今天说一下性能优化部分的其中一个点&#xff0c;这个点叫做 willchange&#xff0c;说他的原因主要有以下几个&#xff1a;第一很多人知道用这个可以提高性能但是不知道原因是什么&#xff0c;第二&#xff0c;我们用的时候他虽然可以提高性能&#xff0c;但是不代表…