Linux-ADC驱动实验

上一章我们讲解了如何给 ICM20608 编写 IIO 驱动,ICM20608 本质就是 ADC,因此纯粹的 ADC 驱动也是 IIO 驱动框架的。本章我们就来学习一下如何使用 I.MX6ULL 内部的 ADC,并且在学习巩固一下 IIO 驱动。


ADC 驱动源码简析

设备树下的 ADC 节点

I.MX6ULL 2 ADC,但是对应一个 ADC 控制器。本章实验我们使用 GPIO1_IO01 这个引脚来完成 ADC 实验,而 GPIO1_IO01 就是 ADC1 的通道 1 引脚,所以这里我们就以 ADC1为例进行讲解,imx6ull.dtsi 文件中的 adc1 节点信息如下:

第 2 行,compatible 属性值为“fsl,imx6ul-adc”和“fsl,vf610-adc”,所以在整个 Linux 源码里面搜索这个两个字符串即可找到 I.MX6ULL ADC 驱动核心文件,这个文件就是 drivers/iio/adc/vf610_adc.c。

关 于 I.MX6ULL ADC 节点更为详细的信息请参考对应的绑定文档: Documentation/devicetree/bindings/iio/adc/vf610-adc.txt。接下来我们简单分析一下绑定文档,后 面我们需要根据绑定文档修改设备树,使能 ADC 对应的通道。

ADC 相关属性有:

- compatible兼容性属性,必须的,可以设置为“fsl,vf610-adc”。

- regADC 控制器寄存器信息。

- interrupts中断属性,ADC1 ADC2 各对应一个中断信息。

- clocks时钟属性。

- clock-names时钟名字,可选“adc”。

- vref-supply此属性对应 vref 参考电压句柄。

可以看出,ADC 节点的属性还是比较少的。

ADC 驱动源码分析

I.MX6ULL ADC 驱动文件就一个 vf610_adc.cvf610_adc.c 主体框架是 platform,配合 IIO 驱动框架实现 ADC 驱动。

1vf610_adc 结构体

NXP 自己将 ADC 外设抽象成了结构体 vf610_adcvf610_adc 就相当于自定义的设备结构体。vf610_adc 结构体贯穿于整个驱动文件,结构体内容如下:

vf610_adc_probe 函数

接下来看一下 vf610_adc_probe 函数,内容如下(有省略)

10 行,调用 devm_iio_device_alloc 函数申请 iio_dev,这里也连 vf610_adc 内存一起申请 了。

16 行,调用 iio_priv 函数从 iio_dev 里面得到 vf610_adc 首地址。

24 行,调用 platform_get_irq 获取中断号。

30 行,调用 devm_request_irq 函数申请中断,中断服务函数为 vf610_adc_isr

64~70 行,初始化 iio_dev,重点是第 67 行的 vf610_adc_iio_info,因为用户空间读取 ADC数据最终就是由 vf610_adc_iio_info 来完成的。

79 行,调用 vf610_adc_cfg_init 函数完成 ADC 的配置初始化。

80 行,调用 vf610_adc_hw_init 函数来初始化 ADC 硬件。

82 行,调用 iio_device_register 函数向内核注册 iio_dev

可以看出 vf610_adc_probe 函数核心就是初始化 ADC 控制器,然后建立 ADC IIO 驱动框架。

3vf610_adc_iio_info 结构体

vf610_adc_iio_info 结构体内容如下所示:

我们重点来看一下第 3 行的 vf610_read_raw 函数,因为此函数才是最终向用户空间发送ADC 原始数据的,函数内容如下:

第 12~49 行,读取 ADC 原始数据值,第 32 type 值为 IIO_VOLTAGE,也就是读取电压值。这里直接读取 vf610_adc value 成员变量得到 ADC 转换结果,并没有看到读取 ADC 数据寄存器的过程。这是因为真正的 ADC 数据读取过程是在中断服务函数 vf610_adc_isr 中完成。

51~54 行,返回 ADC 对应的分辨率。

4vf610_adc_isr 函数

函数内容如下:

可以看出,vf610_adc_isr 函数很简单,重点就是在第 8 行通过调用 vf610_adc_read_data 函数来读取 ADC 原始值,然后将 ADC 的原始值保存在 vf610_adc value 成员变量里面。


ADC 驱动编写

修改设备树

ADC 驱动 NXP 已经编写好了,我们只需要修改设备树即可。首先在 imx6ull-alientek-emmc.dts 文件中添加 ADC 使用的 GPIO1_IO01 引脚配置信息:

接下来在 imx6ull-alientek-emmc.dts 文件中的在 regulators 节点下添加参考电源子节点,内容如下:

最后在 imx6ull-alientek-emmc.dts 文件中向 adc1 节点追加一些内容,内容如下:


使能 ADC 驱动

使能内核里面自带的 I.MX6ULL ADC 驱动,打开 Linux 内核配置界面,配置路径如下:

如图 76.4.2.1 所示:


编写测试 APP

编译修改后的设备树,然后使用新的设备树启动系统。进入/sys/bus/iio/devices 目录下,此目录下就有 ADC 对应的 iio 设备:iio:deviceX,本章例程如图 76.4.3.1 所示:

76.4.3.1 中的“iio:device0”就是 ADC 设备,因为此时并没有加载其他的 IIO 设备驱动,只有一个 ADC。如果大家还加载了其他 IIO 设备驱动,那么就要依次进入 iio 设备目录,查看一下都对应的是什么设备。

进入“iio:device0”目录,内容如图 76.4.3.2 所示:

标准的 IIO 设备文件目录,我们只关心三个文件:

in_voltage1_rawADC1 通道 1 原始值文件。

in_voltage_scaleADC1 比例文件(分辨率),单位为 mV。实际电压值(mV)=in_voltage1_raw* in_voltage_scale

我的开发板此时 in_voltage1_raw in_voltage_scale 这两个文件内容如下:

经过计算,图 76.4.3.3 中实际电压:991*0.805664062798.4mV,也就是 0.7984V

接下来就编写测试 APP,新建 adcApp.c 文件,然后在里面输入如下所示内容:

adcApp.c 就是在上一章的应用程序上修改而来的,由于只读取一路 ADC,因此内容反而更简单,这里就不做介绍了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何制作“优美”PPT

目录 1.免费PPT模板网站: 2.免费有较好质量的图片网站: 免费图片资源 免费透明PNG图片资源: 免费icon图片资源: 3.选择好的图片: 图片底色 4.要与不要 千万不要: 一定要: 6.一些建议…

SSRF对Redis进行内网渗透

SSRF对Redis进行内网渗透 一 环境搭建 准备一台服务器&#xff0c;开启lampp和redis&#xff0c;redis只允许内网访问 使用kali进行端口扫描&#xff0c;扫不到6379 使用kali连接redis&#xff0c;也连不上 ssrf漏洞代码 <?php ​$url $_GET[url]; ​// 创建一个cUR…

面经自测——死锁/死锁的必要条件/死锁的预防/进程通信的方式

前言 本文是作者专门用来自测Java后端相关面试题的&#xff0c;所有问题都是在牛客、知识星球或网上找到的最近最新的面试题&#xff0c;全文回答都是作者按自己的真实水平仿照真实环境的回答&#xff0c;所以答案不一定真实&#xff08;但回答一定真诚&#x1f923;&#xff0…

计算机网络研究实训室建设方案

一、概述 本方案旨在规划并实施一个先进的计算机网络研究实训室&#xff0c;旨在为学生提供一个深入学习、实践和研究网络技术的平台。实训室将集教学、实验、研究于一体&#xff0c;覆盖网络基础、网络架构、网络安全、网络管理等多个领域&#xff0c;以培养具备扎实理论基础…

React开发 - 技术细节汇总一

React简介 React 是一个声明式&#xff0c;高效且灵活的用于构建用户界面的 JavaScript 库。使用 React 可以将一些简短、独立的代码片段组合成复杂的 UI 界面&#xff0c;这些代码片段被称作“组件”。 ui render (data) -> 单向数据流 MVC // model var myapp {}; // …

嵌入式蓝桥杯学习4 lcd移植

cubemx配置 复制前面配置过的文件 打开cubemx&#xff0c;将PB8,PB9配置为GPIO-Output。 点击GENERATE CODE. 文件移植 1.打开比赛提供的文件包&#xff0c;点击Inc文件夹 2.点击Inc文件夹。复制fonts.h和lcd.h&#xff0c;粘贴到我们自己的工程文件夹的bsp中&#xff08…

迭代器模式的理解和实践

引言 在软件开发中&#xff0c;我们经常需要遍历容器对象&#xff08;如数组、列表、集合等&#xff09;中的元素。如果每个容器对象都实现自己的遍历算法&#xff0c;那么代码将会变得冗余且难以维护。为了解决这个问题&#xff0c;迭代器模式应运而生。迭代器模式是一种行为型…

STM32一keil5更换芯片后报错问题的解决。

目录 一、STM32型号认识二、报错问题三、常用的启动配置文件四、问题解决 一、STM32型号认识 二、报错问题 当我们在原来工程下修改芯片时&#xff0c;原本可以编译通过的代码突然很多报错。如下所示&#xff0c;这是因为我们的启动文件配置错误。对于不同型号的芯片其flash容量…

人工智能-自动驾驶领域

目录 引言自动驾驶与人工智能的结合为什么自动驾驶领域适合发表文章博雅智信的自动驾驶辅导服务结语 引言 自动驾驶技术的崛起是当代交通行业的一场革命。通过结合先进的人工智能算法、传感器技术与计算机视觉&#xff0c;自动驾驶不仅推动了技术的进步&#xff0c;也使得未来…

c++数据结构算法复习基础--11--高级排序算法-快速排序-归并排序-堆排序

高阶排序 1、快速排序 冒泡排序的升级算法 每次选择一个基准数&#xff0c;把小于基准数的放到基准数的左边&#xff0c;把大于基准数的放到基准数的右边&#xff0c;采用 “ 分治算法 ”处理剩余元素&#xff0c;直到整个序列变为有序序列。 最好和平均的复杂度&#xff1a…

修改MySQL存储路径

1.查看原路径 show variables like ‘%datadir%’; 2.停止MYSQL 以管理员身份运行命令提示符 net stop MySQL84 在服务中直接停止MySQL 3.编辑配置文件 可能会遇到无权限修改&#xff0c;可以先修改my.ini的权限。可以通过&#xff1a;右键my.ini → 属性 → 安全→ 编辑 …

微信小程序报错:http://159.75.169.224:7300不在以下 request 合法域名列表中,请参考文档

要解决此问题&#xff0c;需打开微信小程序开发者工具进行设置&#xff0c;打开详情-本地设置重新运行&#xff0c;该报错就没有啦

深入浅出:使用 Gin 框架生成 API 文档

深入浅出&#xff1a;使用 Gin 框架生成 API 文档 在现代 Web 开发中&#xff0c;API 文档是开发者之间沟通的重要桥梁。它不仅帮助前端开发者理解如何调用后端接口&#xff0c;还为测试人员和运维人员提供了宝贵的参考。对于 Go 语言开发者来说&#xff0c;Gin 是一个非常流行…

【 工具变量】IPCC碳排放因子数据测算表

一、数据简介&#xff1a; 排放因子法是IPCC提出的一种碳排放估算方法&#xff0c;也是目前适用范围最广、应用最为普遍的方法。将各类能源消耗的实物统计量转变为标准统计量&#xff0c;再乘以各自的碳排放因子&#xff0c;加总之后就可以得到碳排放总量。如果按照ISO14064标…

兔子的寿命有多长?

在宠物的世界里&#xff0c;兔子以其灵动的身姿、柔软的皮毛和温顺的性格深受人们喜爱。然而&#xff0c;当我们满心欢喜地将兔子迎进家门时&#xff0c;可曾想过它们能陪伴我们多久&#xff1f;兔子的寿命&#xff0c;是一个值得深入探讨的话题&#xff0c;它不仅关乎生命的时…

echarts地图立体效果,echarts地图点击事件,echarts地图自定义自定义tooltip

一.地图立体效果 方法1:两层地图叠加 实现原理:geo数组中放入两个地图对象,通过修改zlevel属性以及top,left,right,bottom形成视觉差 配置项参考如下代码: geo: [{zlevel: 2,top: 96,map: map,itemStyle: {color: #091A51ee,opacity: 1,borderWidth: 2,borderColor: #16BAFA…

游戏发布AppStore平台

首先&#xff0c;要注册一个开发者账号。这里不多说了&#xff0c;下载官方app“Developer”&#xff0c;然后买个能发布的账号&#xff0c;个人&#x1f4b2;99的就行。&#xff08;其实还有点麻烦&#xff0c;我的好像是人脸识别后出问题了&#xff0c;反正遇到问题找苹果官方…

​​​​​​​移远通信基于高通平台发布可集成边缘计算功能的5G MBB解决方案

在5G技术与人工智能深度融合的背景下&#xff0c;各行各业正迎来前所未有的创新机遇。为了加速5G移动宽带&#xff08;MBB&#xff09;行业向智能化转型&#xff0c;并简化边缘计算应用的开发流程&#xff0c;移远通信近期隆重推出了基于骁龙5G调制解调器及射频系统打造&#x…

flinkSql 将流和表的互相转换

流——>表 方式一 方式二 方式一&#xff1a;写sql DataStreamSource<String> source env.socketTextStream("localhost", 8881); // 表名&#xff0c;流&#xff0c;字段名称 tableEnv.createTemporaryView("t_1",source&#xff0c;$("…

React性能优化

三个可以优化的地方 避免过度多次渲染 组件会在以下情况下重新渲染 注意&#xff1a;例如组件组合的形式&#xff0c;<Test><Counter></Counter></Test>,即使Test发生了重新渲染&#xff0c;Counter也不会重新渲染。另外使用React这样的库或框架时&a…