• #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学习资料

RK 利用SARADC 来做多个按键相关推荐

  1. 乐鑫Esp32学习之旅⑦ esp32上利用GPIO中断做一个按键的短按和长按的回调事件,再也无须担心触发源。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  2. F28335矩阵键盘的3种工作方式代码及按键消抖讨论(包括利用GPIO输入量化实现按键消抖)

    文章目录 前言 1. 延时消抖 1.1 硬件电路 1.2 3种工作方式的代码 2. 利用GPIO输入量化实现按键消抖 2.1 理论分析 2.1 代码分析 前言 本文是在学习普中TMS320F28335 ...

  3. 一个ADC做多个按键扫描检测

    常用的按键有以下两种方式: 1.独立按键 独立按键直接用MCU的I/O管脚构成的单个按键电路,其特点式每个按键单独占用一个I/O,每个按键的工作不会影响其他I/O的状态.独立按键很浪费MCU管脚,但编 ...

  4. opencv 检测 键盘_C++ 利用opencv识别飞车舞蹈按键

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 本来我玩飞车舞蹈技术挺好的,有时候不稳定.有一次被人嘲讽了,当时心中不忿,就写了个这个 另外我对opencv不熟..写这个就是看了百度使用opencv基础 ...

  5. 利用Proteus仿真STM32实现按键控制LED灯设计

    1. 前言 Proteus是英国著名的EDA工具(仿真软件),从原理图布图.代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计.是世界上唯一将电路仿真软件.PC ...

  6. 利用new Map()做多选

    public setChooseitem = new Map();public chooseIndex: number[] = []; //当前选择的index css做选中颜色处理get lengt ...

  7. linux下被遗忘的gpio_keys按键驱动

    我们新项目硬件设计上使用gpio口做按键,所以我就需要搞定这个驱动,本来想自己写一个gpio口的按键驱动,然后看了下内核下面的代码,已经有现成的了.Linux内核下游很多很多的现成驱动,只要你想得到的 ...

  8. FPGA学习笔记---利用连续赋值语句延时功能实现按键消抖

    最近一直在学习FPGA,今天在学习延时语句时,发现了连续赋值的一个特点.在连续赋值语句中添加延时时,任何小于延迟值的输入变化都会被滤除而不会体现在输出上.比如  #10 B = A; 当A的变化小于1 ...

  9. led计数电路实验报告_「正点原子FPGA连载」第八章 按键控制LED灯实验

    1)实验平台:正点原子开拓者FPGA开发板 2)本实例源码下载:请移步正点原子官网 第八章 按键控制LED灯实验 按键是常用的一种控制器件.生活中我们可以见到各种形式的按键,由于其结构简单,成本低廉等 ...

最新文章

  1. 超级计算机 任务提交,vasp在超算中心的任务提交 - 第一原理 - 小木虫 - 学术 科研 互动社区...
  2. OpenCV OMZ MTCNN人脸检测的实例(附完整代码)
  3. 如何取消IE窗口的全屏显示
  4. 电脑无法连接到系统服务器,请问怎么客户端的电脑连接不到服务器?这是什么原因?...
  5. 解决 idea 中 jsp 修改后页面不生效
  6. Socket编程实践(5) --TCP粘包问题与解决
  7. scrapy中使用css选择器罗列下一级的所有标签
  8. keyup常用事件_KeyUp 事件
  9. 分区供水条件口诀_分区供水高频考点,收藏哦
  10. VAssistX 常用快捷键
  11. 树莓派有线网络设置_树莓派通过网线实现与电脑共享网络
  12. Python学习:面向对象基础练习——士兵突击(代码演示) 及 身份运算符
  13. 人生歪理,歪得很有道理
  14. 【MIMO】两种空间相关信道生成方式的记录(公式+MATLAB代码)
  15. CS61A Lab 6
  16. 计算机主机装配视频,预算一万如何组装电脑?新媒体视频剪辑等影视专业装机指南2020.8...
  17. Low-Light Image Enhancement with Normalizing Flow
  18. 函数求导及求微分的基本公式
  19. Unity的2.5D效果探究
  20. 特别记事本这款文字编辑器怎么样

热门文章

  1. CSDN博客投票活动开始了
  2. mac 下 使用 java运行 class 文件 总是提示 “错误: 找不到或无法加载主类”的解决方法...
  3. XP系统中没有Internet信息服务windows组件解决办法
  4. 社交网站与网民隐私安全报告(2009)
  5. AS3.0中的显示编程(末篇)-- 滤镜(下)
  6. 先来先服务算法的特点
  7. 事务以及@Transcational注解
  8. 计算机与广播电视论文,浅谈广播电视中计算机技术的作用论文.pdf
  9. matlab var std,Matlab var std cov 函数解析
  10. 天融信安全接入客户端_天融信提示您警惕物联网设备Ripple20漏洞风险