当前位置: 首页 > news >正文

全志V853开发板开发进阶——GPADC

以下内容转自全志在线V853在线文档:https://v853.docs.aw-ol.com/soft/dev_gpadc/

GPADC

GPADC(General Purpose Analog to Digital Converter)是指高精度数模转换模块,拥有12bit分辨率,8位采集精度。模拟输入范围0~1.8V,最高采样率1MHz。

V853 GPADC驱动路径:

tina/lichee/linux-4.9/drivers/input/sensor/sunxi_gpadc.c
tina/lichee/linux-4.9/drivers/input/sensor/sunxi_gpadc.h

GPADC硬件介绍

GPADC在线文档:GPADV 853–DOC
在这里插入图片描述

AVCC 为 1.8V 电源供电,通过一个电阻串联到GPADC的按键组。按键通过不同阻值的电阻相连接,按下不同的按键,GPADC0 口的电压不同,CPU 通过对这个电压的采样来决定具体是哪一个按键被按下。上图按键与电压的对应关系如下表所示:

0.21V0.41V0.59V0.75V0.88V
VOL+VOL-MENUENTERHOME

当按键按下时,会触发 GPADC 模块的中断,CPU 会采集 GPADC 的数据,采集到的数据转换成相应的键值之后通过 input 子系统上传到 /dev/input/event节点,程序便可以从相应的节点获取数据。

GPADC软件介绍

设备树配置

GPADC 的设备树配置分为两个部分:

第一部分包括基础的寄存器配置、设备驱动绑定配置和时钟中断配置。这一部分的配置位于 kernel/linux-4.9/arch/arm/boot/dts/sun8iw21p1.dtsi 文件内。这一部分通常不需要修改。

gpadc:gpadc@2009000 {
	compatible = "allwinner,sunxi-gpadc";         // 用于驱动和设备的绑定
	reg = <0x0 0x02009000 0x0 0x400>;             // 设备使用的寄存器地址
	interrupts = <GIC_SPI 57 IRQ_TYPE_NONE>;      // 设备使用的中断
	clocks = <&clk_gpadc>;                        // 设备使用的时钟
	status = "disabled";                          // 配置默认不启用GPADC
};

第二部分包括采样相关的配置,键值,电压数据等等,在 device/config/chips/v853/configs/vision/board.dts 文件内

&gpadc {
	channel_num = <1>;                        // 使用1通道
	channel_select = <0x01>;                  // 选择 0x01 通道
	channel_data_select = <0>;                // 启用数据通道
	channel_compare_select = <0x01>;          // 启用通道比较功能
	channel_cld_select = <0x01>;              // 启用数据小于比较功能
	channel_chd_select = <0>;                 // 启用数据大于比较功能
	channel0_compare_lowdata = <1700000>;     // 小于这个值触发中断
	channel0_compare_higdata = <1200000>;     // 大于这个值触发中断
	channel1_compare_lowdata = <460000>;      // 小于这个值触发中断
	channel1_compare_higdata = <1200000>;     // 大于这个值触发中断
	key_cnt = <5>;                            // 按键数量
	key0_vol = <210>;                         // 按键电压,单位mv
	key0_val = <115>;                         // 按下按键的键值
	key1_vol = <410>;                         // 按键电压,单位mv
	key1_val = <114>;                         // 按下按键的键值
	key2_vol = <590>;                         // 按键电压,单位mv
	key2_val = <139>;                         // 按下按键的键值
	key3_vol = <750>;                         // 按键电压,单位mv
	key3_val = <28>;                          // 按下按键的键值
	key4_vol = <880>;                         // 按键电压,单位mv
	key4_val = <102>;                         // 按下按键的键值
	status = "okay";                          // 启用GPADC
};

内核驱动配置

内核驱动配置参考:kernel by allwienner V853

make kernel_menuconfig 进入内核配置界面,找到Device Drivers,进入。

在这里插入图片描述

找到 Input device support ,进入。

在这里插入图片描述

找到 Sensors 空格勾选并进入。

在这里插入图片描述

空格选中 <*> SUNXI GPADC ,保存并退出配置页面。

在这里插入图片描述

之后编译内核,打包烧录即可

测试 GPADC

make menuconfig 进入 openWrt 配置页面,找到 getevent 软件包。

Utilities  --->
	<*> getevent.................................... getevent for Android Toolbox

之后编译打包烧录到开发板上,运行 getevent,可以看到sunxi-gpadc

在这里插入图片描述

此时按下按键,可以看到按键键值显示出来了

在这里插入图片描述

编写一个程序

程序源码:source code

测试完成设备正常使用后,可以尝试编写一个程序测试GPADC。

以下demo程序用来读取 GPADC 模块用于 KEY 的按键上报事件,其循环10次读取按键上报事件输入,并且显示出相应按键的值。

#include <stdio.h>
#include <linux/input.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/time.h>
#include <limits.h>
#include <unistd.h>
#include <signal.h>

#define DEV_PATH "/dev/input/event3"   //查看上节sunxi-gpadc的event号,是event3
static int gpadc_fd = 0;

unsigned int test_gpadc(const char * event_file)
{
	int code = 0, i;

	struct input_event data;

	gpadc_fd = open(DEV_PATH, O_RDONLY);

	if(gpadc_fd <= 0)
	{
		printf("open %s error!\n", DEV_PATH);
		return -1;
	}

	for(i = 0; i < 10; i++) //读10次
	{
		read(gpadc_fd, &data, sizeof(data));
		if(data.value == 1)
		{
			printf("key %d pressed\n", data.code);
		}
		else if(data.value == 0)
		{
			printf("key %d releaseed\n", data.code);
		}
	}
	close(gpadc_fd);
	return 0;
}

int main(int argc,const char *argv[])
{
    int rang_low = 0, rang_high = 0;
	return test_gpadc(DEV_PATH);
}

编译后将demo adb push到开发板中,执行demo并按下对应按键,将会有响应的按键反馈输出:

在这里插入图片描述
原文链接:https://bbs.aw-ol.com/topic/1774/

相关文章:

  • 表单(非常非常重要)
  • 【JavaScript】一文了解JS的闭包
  • 2022前端vue面试题
  • docker相关试题
  • python 之名称空间与作用域
  • python之面向过程编程思想与匿名函数及其应用
  • docker 之Dockerfile
  • python之logging 模块(简洁版)
  • Docker 搭建 Redis Cluster 集群环境
  • Docker 容器编排利器 Docker Compose
  • Docker Swarm 集群环境搭建及弹性服务部署
  • Docker Compose 搭建 Redis Cluster 集群环境
  • 计算机初识
  • 计算机硬件五大单元
  • 计算机硬件组成详解
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 11111111
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Python爬虫--- 1.3 BS4库的解析器
  • SpiderData 2019年2月16日 DApp数据排行榜
  • 观察者模式实现非直接耦合
  • 记一次和乔布斯合作最难忘的经历
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 物联网链路协议
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 赢得Docker挑战最佳实践
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (3)选择元素——(17)练习(Exercises)
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (pytorch进阶之路)扩散概率模型
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (转)EXC_BREAKPOINT僵尸错误
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .NET 设计一套高性能的弱事件机制
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET框架设计—常被忽视的C#设计技巧
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • .sh
  • ??javascript里的变量问题
  • @Documented注解的作用
  • [.NET]桃源网络硬盘 v7.4
  • [20180312]进程管理其中的SQL Server进程占用内存远远大于SQL server内部统计出来的内存...
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [Android]竖直滑动选择器WheelView的实现
  • [CC-FNCS]Chef and Churu
  • [CISCN 2019华东南]Web11
  • [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager失败
  • [HAOI2016]食物链