RK 利用SARADC 来做多个按键

  • #DTS配置

    • #配置DTS节点

    • #驱动文件中匹配 DTS 节点

  • #驱动说明

    • #获取ADC通道

    • #获取ADC值

    • #计算采集到的电压

    • #接口说明

  • #调试方法

    • #节点ADC值

RK3399开发板上的 AD 接口有两种,分别为:温度传感器 (Temperature Sensor)、逐次逼近ADC (Successive Approximation Register)。

  • TS-ADC(Temperature Sensor):支持两通道,时钟频率必须低于800KHZ

  • AR-ADC(Successive Approximation Register):支持六通道单端10位的SAR-ADC,时钟频率必须小于13MHZ。内核采用工业 I/O 子系统来控制 ADC,该子系统主要为 AD 转换或者 DA 转换的传感器设计。下面以SAR-ADC为例子,介绍 ADC 的基本配置方法。

#DTS配置

#配置DTS节点

SAR-ADC 的 DTS 节点在 kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi 文件中定义,如下所示:

saradc: saradc@ff100000 {compatible = "rockchip,rk3399-saradc";reg = <0x0 0xff100000 0x0 0x100>;interrupts = <GIC_SPI 62 IRQ_TYPE_LEVEL_HIGH 0>;#io-channel-cells = <1>;clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>;clock-names = "saradc", "apb_pclk";resets = <&cru SRST_P_SARADC>;reset-names = "saradc-apb";status = "disabled";};

用户首先需在DTS文件中添加ADC的资源描述:

&rk_key {compatible = "rockchip,key";status = "okay";io-channels = <&saradc 1>;vol-up-key {linux,code = <114>;label = "volume up";rockchip,adc_value = <1>;};vol-down-key {linux,code = <115>;label = "volume down";rockchip,adc_value = <170>;};power-key {gpios = <&gpio0 5 GPIO_ACTIVE_LOW>;linux,code = <116>;label = "power";gpio-key,wakeup;};menu-key {linux,code = <59>;label = "menu";rockchip,adc_value = <746>;};home-key {linux,code = <102>;label = "home";rockchip,adc_value = <355>;};back-key {linux,code = <158>;label = "back";rockchip,adc_value = <560>;};camera-key {linux,code = <212>;label = "camera";rockchip,adc_value = <450>;};
};

这里申请的是SARADC通道1

#驱动文件中匹配 DTS 节点

驱动key:drivers/input/keyboard/rk_keys.c 首先在驱动文件中定义 of_device_id 结构体数组:

static const struct of_device_id rk_key_match[] = {{ .compatible = "rockchip,key", .data = NULL},{},
};

然后将该结构体数组填充到 platform_driver 中:

static struct platform_driver keys_device_driver = {.probe      = keys_probe,.remove     = keys_remove,.driver     = {.name   = "rk-keypad",.owner  = THIS_MODULE,.of_match_table = rk_key_match,
#ifdef CONFIG_PM.pm = &keys_pm_ops,
#endif}
};

接着在keys_probe中使用work 进行polling :

    /* adc polling work */if (ddata->chan) {INIT_DELAYED_WORK(&ddata->adc_poll_work, adc_key_poll);schedule_delayed_work(&ddata->adc_poll_work,┊   ┊ ADC_SAMPLE_JIFFIES);}

ADC  key Poll DTS资源解析

static void adc_key_poll(struct work_struct *work)
{struct rk_keys_drvdata *ddata;int i, result = -1;ddata = container_of(work, struct rk_keys_drvdata, adc_poll_work.work);if (!ddata->in_suspend) {result = rk_key_adc_iio_read(ddata);/**读取SARADC值*/if (result > INVALID_ADVALUE &&┊   result < (EMPTY_DEFAULT_ADVALUE - ddata->drift_advalue))ddata->result = result;for (i = 0; i < ddata->nbuttons; i++) {struct rk_keys_button *button = &ddata->button[i];if (!button->adc_value)continue;if (result < button->adc_value + ddata->drift_advalue &&┊   result > button->adc_value - ddata->drift_advalue)button->adc_state = 1;else                 button->adc_state = 0;if (button->state != button->adc_state)mod_timer(&button->timer,┊ jiffies + DEBOUNCE_JIFFIES);}}schedule_delayed_work(&ddata->adc_poll_work, ADC_SAMPLE_JIFFIES);
}

#驱动说明

#获取ADC通道

在解析资源DTS时 获取对应的通道 struct iio_channel *chan;  /定义 IIO 通道结构体chan = iio_channel_get(&pdev->dev, NULL); /获取 IIO 通道结构体/

static int rk_keys_parse_dt(struct rk_keys_drvdata *pdata,struct platform_device *pdev)
{struct device_node *node = pdev->dev.of_node;struct device_node *child_node;struct iio_channel *chan;int ret, gpio, i = 0;u32 code, adc_value, flags, drift;if (of_property_read_u32(node, "adc-drift", &drift))pdata->drift_advalue = DRIFT_DEFAULT_ADVALUE;else    pdata->drift_advalue = (int)drift;chan = iio_channel_get(&pdev->dev, NULL);
...............

#获取ADC值

在adc_key polling中 调用 iio_read_channel_raw 函数读取 AD 采集的原始数据并存入 val 中

  ret = iio_read_channel_raw(channel, &val);

#计算采集到的电压

Vref / (2^n-1) = Vresult / raw

注:

Vref 为标准电压 n 为 AD 转换的位数 Vresult 为用户所需要的采集电压 raw 为 AD 采集的原始数据

#接口说明

struct iio_channel *iio_channel_get(struct device *dev, const char *consumer_channel);
  • 功能:获取 iio 通道描述

  • 参数:

    • dev: 使用该通道的设备描述指针

    • consumer_channel: 该设备所使用的 IIO 通道描述指针

void iio_channel_release(struct iio_channel *chan);
  • 功能:释放 iio_channel_get 函数获取到的通道

  • 参数:

    • chan:要被释放的通道描述指针

int iio_read_channel_raw(struct iio_channel *chan, int *val);
  • 功能:读取 chan 通道 AD 采集的原始数据。

  • 参数:

    • chan:要读取的采集通道指针

    • val:存放读取结果的指针

#调试方法

#节点ADC值

cat /sys/bus/iio/devices/iio\:device1/in_voltage*_raw
876
1021
164
512
513
349

  回复「 篮球的大肚子」进入技术群聊

回复「1024」获取1000G学习资料

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

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

相关文章

概率论之pandas

快速入门 1 import numpy as npspd.series([1,3,5,np.nan,8,4])Series spd.Series([1,3,5,np.nan,8,4])sOut[6]: 0 1.01 3.02 5.03 NaN4 8.05 4.0dtype: float64date_range datespd.date_range(20190301,periods6)datesOut[10]: DatetimeIndex([2019-03-…

学习,一定是脱“贫”致富的捷径

周末加班&#xff0c;加班后觉得有点无聊&#xff0c;到公司阳台坐了坐&#xff0c;想到最近的工作和生活&#xff0c;也理了理最近的状态&#xff0c;然后分享了一段话在知识星球里。如下:我平时很少静下来想东西&#xff0c;其中一个原因是因为我害怕安静&#xff0c;晚上睡觉…

人应该活成什么样子?该以什么方式活着?

“您幸福吗&#xff1f;”“我是外地打工的&#xff0c;不要问我。”“您幸福吗&#xff1f;”“我姓曾。”相信大家还记得这段央视走基层采访的经典问答。“幸福是什么”是一个人类社会中被广泛讨论的话题&#xff0c;人要怎么生活才能获得幸福&#xff0c;一直是众生要追寻的…

MIPI白皮书

#mipi 5G中优势#5G手机中的mipi#mipi#背景2020年 是5G元年&#xff0c;很多行业因5g重新定义。显示行业也不例外&#xff0c;针对5G&#xff0c;mipi联盟发表了对应的白皮书 描述了现有的MIPI规范如何能够支持第一代5G智能手机以及其他新兴的5G移动平台&#xff0c;包括互联/自…

redis rdb aof区别_Redis 持久化之 RDB 与 AOF 详解

走过路过不要错过点击蓝字关注我们文章出处&#xff1a;https://www.cnblogs.com/jojop/p/13941195.htmlRedis 持久化我们知道Redis的数据是全部存储在内存中的&#xff0c;如果机器突然GG&#xff0c;那么数据就会全部丢失&#xff0c;因此需要有持久化机制来保证数据不会因为…

块设备驱动初探

前言研究IO也很久了&#xff0c;一直无法串联bio和块设备驱动&#xff0c;只知道bio经过IO调度算法传递到块设备驱动&#xff0c;怎么过去的&#xff0c;IO调度算法在哪里发挥作用&#xff0c;一直没有完全搞明白&#xff0c;查看了很多资料&#xff0c;终于对块设备驱动有所理…

Linux 块设备,Block Layer层架构演变

前言Block Layer层在整个I/O中负责承上启下&#xff0c;上接文件系统&#xff0c;下接块驱动。我不想直接讨论代码&#xff0c;希望从一个架构的演变来初探一下Block Layer层。一、1.0版本首先我们来了解几个重要的数据结构1.1 biobio代表了一次I/0请求&#xff0c;代表一个块设…

matalotlib(2)

文章目录注释文字Tex公式区域填充极坐标注释 import matplotlib.pyplot as plt import numpy as np xnp.arange(-10,11,1) yx*x plt.plot(x,y)plt.annotate(this is the bottom,xy(0,1),xytext(0,20),arrowpropsdict(facecolorr,frac0.2)) plt.show()文字 import matplotlib…

去华为吗?

昨晚的这条朋友圈很多人给我回复&#xff0c;支持去华为的人很多&#xff0c;但是也有几个反对的&#xff0c;一个说&#xff0c;怕是有命赚钱&#xff0c;没命花钱吧。还有一个说&#xff0c;自己拿到了华为offer&#xff0c;但是拒绝了&#xff0c;去了一个做开关电源的公司做…

实例

文章目录函数积分图散点条形图球员能力值函数积分图 import matplotlib.pyplot as plt import numpy as np from matplotlib.pyplot import Polygon def func(x):return -(x-2)*(x-8)40 xnp.linspace(0,10) yfunc(x) axplt.subplot() plt.plot(x,y,r,linewidth2)a2 b9 ax.set_…

闲来无事,拆个示波器玩玩。

首先要解释一下何为混合域示波器&#xff0c;既然说到这个话题就不得不说一下示波器进化史了&#xff0c;接下来大概讲一下示波器进化简史。第一代示波器——模拟示波器(ART-analog real time oscilloscope )纯模拟机器&#xff0c;使用示波管显示X-Y扫描成像显示波形&#xff…

机器算法1)

SKLEARN Scikit-learn与特征工程 “数据决定了机器学习的上限&#xff0c;而算法只是尽可能逼近这个上限”&#xff0c;这句话很好的阐述了数据在机器学习中的重要性。大部分直接拿过来的数据都是特征不明显的、没有经过处理的或者说是存在很多无用的数据&#xff0c;那么需要…

老罗直播——只要给你一个机会,你就伸双手去接!

昨天&#xff0c;4月1日&#xff0c;罗永浩在抖音上直播卖货。一时间舆论纷纷&#xff0c;有吐槽老罗状况频出的&#xff0c;也有感叹老罗为了挣钱能屈能伸的。总之&#xff0c;有人讨论&#xff0c;有人关注&#xff0c;这个事件已经成功了一大半。老罗与抖音签约费是6000万&a…

我在MTK平台下调试音频ALSA

#前言前言我就随便写了&#xff0c;因为是项目的需要&#xff0c;我需要在我们的MTK8167S平台上面调试音频。包括录音和播放。#硬件原理图因为是我们公司的项目&#xff0c;我就不能把完整的原理图给出来。因为两个MIC不涉及机密&#xff0c;跟MTK的公版是一样的。可以给出来大…

一切不怕从零开始

不知道大家有没有看过吴京题为<<一切不怕从零开始>>的演讲。我曾经刷微博的时候看到过,印象和触动最深的是他的那句"我走过很多的路,换过很多的方向,不敢说有什么成就,到今天我觉得唯一能够让我拿出来炫耀的可能就是,我不害怕从头开始"。这样的话,对年龄…

机器学习算法3

文章目录转换器与估计器分类算法-K近邻算法一个例子弄懂k-近邻计算距离公式sklearn.neighborsMethodk近邻实例k-近邻算法案例分析对Iris数据集进行分割对特征数据进行标准化朴素贝叶斯概率论基础联合概率与条件概率联合概率条件概率如果每个事件相互独立拉普拉斯平滑sklearn朴素…

嵌入式杂谈之文件系统

文件系统可以说是嵌入式中的一大块&#xff0c;也是绕不过的一部分。之前我对文件系统认知一直停留在在U盘格式的理解上&#xff0c;直到接触了嵌入式Linux才发现这里面大有文章&#xff0c;以Linux启动挂载根文件系统为例&#xff0c;这个文件系统可以是真正的存储设备上的文件…

docker发布spring cloud应用

原文地址&#xff1a;http://www.cnblogs.com/skyblog/p/5163691.html 本文涉及到的项目&#xff1a; cloud-simple-docker&#xff1a;一个简单的spring boot应用 Docker是一种虚拟机技术&#xff0c;准确的说是在linux虚拟机技术LXC基础上又封装了一层&#xff0c;可以看成是…

Linux块设备IO子系统

块设备是Linux三大设备之一&#xff0c;其驱动模型主要针对磁盘&#xff0c;Flash等存储类设备&#xff0c;块设备&#xff08;blockdevice&#xff09;是一种具有一定结构的随机存取设备&#xff0c;对这种设备的读写是按块(所以叫块设备)进行的&#xff0c;他使用缓冲区来存放…

机器学习算法4

文章目录精确率和召回率分类器性能评估混淆矩阵分类模型sklearn.metrics.classification_report决策树认识决策树优缺点信息的度量和作用信息熵决策树划分依据之信息增益api实战method决策树优缺点分析实例随机森林集成方法&#xff08;分类&#xff09;之随机森林学习算法skle…