0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenHarmony:全流程讲解如何编写ADC平台驱动以及应用程序

福州市凌睿智捷电子有限公司 2023-09-04 16:41 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1、案例简介

该程序是基于OpenHarmony标准系统编写的基础外设类:ADC驱动。

2、基础知识

2.1、ADC简介

ADC(Analog to Digital Converter),即模拟-数字转换器,可将模拟信号转换成对应的数字信号,便于存储与计算等操作。除电源线和地线之外,ADC只需要1根线与被测量的设备进行连接。

2.2、ADC平台驱动

在HDF框架中,同类型设备对象较多时(可能同时存在十几个同类型配置器),若采用独立服务模式,则需要配置更多的设备节点,且相关服务会占据更多的内存资源。相反,采用统一服务模式可以使用一个设备服务作为管理器,统一处理所有同类型对象的外部访问(这会在配置文件中有所体现),实现便捷管理和节约资源的目的。ADC模块即采用统一服务模式。如下图所示:

b98996d8-4afe-11ee-a20b-92fbcf53809c.png

ADC模块各分层的作用为:

接口层:提供打开设备,写入数据,关闭设备的能力。

核心层:主要负责服务绑定、初始化以及释放管理器,并提供添加、删除以及获取控制器的能力。

适配层:由驱动适配者实现与硬件相关的具体功能,如控制器的初始化等。

在统一模式下,所有的控制器都被核心层统一管理,并由核心层统一发布一个服务供接口层,因此这种模式下驱动无需再为每个控制器发布服务。

详细资料请参考官网地址:ADC平台驱动

2.3、ADC应用程序

ADC模块提供的主要接口如表1所示,具体API详见//drivers/hdf_core/framework/include/platform/adc_if.h。

ADC驱动API接口功能介绍如下所示:

接口名接口描述
DevHandle AdcOpen(uint32_t number)打开ADC设备
void AdcClose(DevHandle handle)关闭ADC设备
int32_t AdcRead(DevHandle handle, uint32_t channel, uint32_t *val)读取AD转换结果值

使用ADC设备的一般流程如下所示:

b9b1ac7c-4afe-11ee-a20b-92fbcf53809c.png

详细资料请参考官网地址:ADC应用程序

3、程序解析

3.1、准备工作

查看《凌蒙派-RK3568开发板排针说明表》(即Git仓库的//docs/board/凌蒙派-RK3568开发板排针说明表v1.0.xlsx),选中ADC5(即ADC5)。

3.2、配置文件

3.2.1、device_info.hcs

创建config/device_info.hcs,用于驱动设备描述,具体内容如下:

#include "adc_config.hcs"

root { device_info { platform :: host { device_adc :: device { device0 :: deviceNode { // ADC控制器信息描述 policy = 2; // 对外发布服务,必须为2,用于定义ADC管理器的服务 priority = 50; permission = 0644; moduleName = "HDF_PLATFORM_ADC_MANAGER"; // 这与drivers/hdf_core/framework/support/platform/src/adc/adc_core.c的g_adcManagerEntry.moduleName对应,它主要负责ADC的管理 serviceName = "HDF_PLATFORM_ADC_MANAGER"; } device1 :: deviceNode { policy = 0; // 等于0,不需要发布服务 priority = 55; // 驱动驱动优先级 permission = 0644; // 驱动创建设备节点权限 moduleName = "linux_adc_adapter"; // 用于指定驱动名称,必须是linux_adc_adapter deviceMatchAttr = "linux_adc_adapter"; // 用于配置控制器私有数据,必须与adc_config.hcs中对应控制器保持一致 } } } }}

ADC实际驱动是//drivers/hdf_core/adapter/khdf/linux/platform/adc/adc_iio_adapter.c,template adc_device定义的各项关键变量是由adc_iio_adapter.c决定,不可修改。

adc_iio_adapter.c实际是对Linux IIO子系统进行操作来控制ADC。

注意:

channelNum:表示通道数量

driver_channelX_name:必须是从0开始

3.2.3、参与配置树编译

编辑//vendor/lockzhiner/rk3568/hdf_config/khdf/hdf.hcs,将device_info.hcs添加配置树中。具体内容如下所示:

#include "../../samples/b04_platform_device_adc/config/device_info.hcs"

3.3、HDF驱动

ADC平台驱动是//drivers/hdf_core/adapter/khdf/linux/platform/adc/adc_iio_adapter.c,用户不必编写HDF驱动。

3.4、参与Linux内核编译

编辑//kernel/linux/config/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig,启用CONFIG_DRIVERS_HDF_PLATFORM_ADC,具体内容如下:

CONFIG_DRIVERS_HDF_PLATFORM_ADC=y

3.5、应用程序

3.5.1、adc_test.c

添加平台驱动ADC的头文件,具体内容如下:

#include "adc_if.h" // ADC标准接口头文件

程序可通过,具体内容如下:

int main(int argc, char* argv[]){ DevHandle handle = NULL; int32_t ret; uint32_t value;

// 解析参数 parse_opt(argc, argv); printf("adc_device: %d\n", m_adc_device); printf("adc_channel: %d\n", m_adc_channel);

// 打开ADC设备 handle = AdcOpen(m_adc_device); if (handle == NULL) { PRINT_ERROR("AdcOpen failed\n"); return -1; }

// 进行AD转换并读取转换结果 ret = AdcRead(handle, m_adc_channel, &value); if (ret != 0) { PRINT_ERROR("AdcRead failed and ret = %d\n", ret); AdcClose(handle); return -1; }

printf("Adc Device(%d), Channel(%d) read successful and value = %d\n", m_adc_device, m_adc_channel, value);

// 关闭ADC设备 AdcClose(handle);

return 0;}

3.5.2、BUILD.gn

import("//build/ohos.gni")import("//drivers/hdf_core/adapter/uhdf2/uhdf.gni")

print("samples: compile rk3568_adc_test")ohos_executable("rk3568_adc_test") { sources = [ "adc_test.c" ] include_dirs = [ "$hdf_framework_path/include", "$hdf_framework_path/include/core", "$hdf_framework_path/include/osal", "$hdf_framework_path/include/platform", "$hdf_framework_path/include/utils", "$hdf_uhdf_path/osal/include", "$hdf_uhdf_path/ipc/include", "//base/hiviewdfx/hilog/interfaces/native/kits/include", "//third_party/bounds_checking_function/include", ]

deps = [ "$hdf_uhdf_path/platform:libhdf_platform", "$hdf_uhdf_path/utils:libhdf_utils", "//base/hiviewdfx/hilog/interfaces/native/innerkits:libhilog", ]

cflags = [ "-Wall", "-Wextra", "-Werror", "-Wno-format", "-Wno-format-extra-args", ]

subsystem_name = "applications" part_name = "product_rk3568" install_enable = true}

3.5.3、参与应用程序编译

编辑//vendor/lockzhiner/rk3568/samples/BUILD.gn,开启编译选项。具体如下:

"b04_platform_device_adc/app:rk3568_adc_test",

4、程序编译

建议使用docker编译方法,运行如下:

hb set -root .hb set# 选择lockzhiner下的rk3568编译分支。hb build -f

5、运行结果

该程序运行结果如下所示:

# rk3568_adc_test -d 0 -c 5../../vendor/lockzhiner/rk3568/samples/b21_platform_device_adc/app/adc_test.c, main, 103, info: adc_device: 0../../vendor/lockzhiner/rk3568/samples/b21_platform_device_adc/app/adc_test.c, main, 104, info: adc_channel: 5Adc Device(0), Channel(5) read successful and value = 955#

可以将ADC引脚通过引线接入排针线中的GNU或3V3中,可以查看ADC的变化。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • adc
    adc
    +关注

    关注

    100

    文章

    7976

    浏览量

    557384
  • 驱动
    +关注

    关注

    12

    文章

    2002

    浏览量

    88794
  • 应用程序
    +关注

    关注

    38

    文章

    3347

    浏览量

    60507
  • OpenHarmony
    +关注

    关注

    33

    文章

    3984

    浏览量

    21458
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深度剖析U-Boot ADC Uclass:从架构到实战的维度解析

    在嵌入式开发中,ADC(模数转换)是连接模拟世界与数字系统的关键桥梁,而 U-Boot 作为嵌入式领域的经典引导程序,其 ADC 子系统的设计堪称分层架构与通用化设计的典范。本文将从架构、流程
    的头像 发表于 04-26 07:08 167次阅读
    深度剖析U-Boot <b class='flag-5'>ADC</b> Uclass:从架构到实战的<b class='flag-5'>全</b>维度解析

    RDMA设计56:如何设计基于RDMA的应用程序

    本博文主要交流设计思路,在本博客已给出相关博文约140篇,希望对初学者有用。 注意这里只是抛砖引玉,切莫认为参考这就可以完成商用IP 设计。 应用程序的工作流程如图 1所示,大致分为 READ 包
    发表于 04-05 09:54

    基于凌羽派的OpenHarmony北向应用开发:Hello World 示例应用

    本示例是基于OpenHarmony开发的第一个简单应用,用于展示如何创建、构建和部署一个基本的应用程序。环境配置如下所示:API:18SDK:OpenHarmony-v5.
    的头像 发表于 02-25 10:23 429次阅读
    基于凌羽派的<b class='flag-5'>OpenHarmony</b>北向应用开发:Hello World 示例应用

    【原创】OpenHarmony系统投屏工具软件 - OpenHarmony_OHScrcpy使用推荐

    Android平台的scrcpy投屏工具。它能够将OpenHarmony设备的屏幕实时镜像到计算机,并提供设备控制功能。 实现原理框图 计算机侧(客户端) :基于Python跨平台实现 Ope
    发表于 01-22 18:34

    #OpenHarmony Hello World应用以及部署

    OpenHarmony
    视美泰
    发布于 :2026年01月16日 09:32:52

    高速、低失调漂移差分ADC驱动器ADA4945 - 1的深度剖析

    高速、低失调漂移差分ADC驱动器ADA4945 - 1的深度剖析 在电子设计领域,高性能的ADC驱动器是实现精确数据采集和信号处理的关键。
    的头像 发表于 01-12 14:40 814次阅读

    深入解析 RK 平台显示驱动:格式支持、处理流程与实现原理

    驱动处理流程、核心实现原理三个维度,带您深入了解  RK  平台显示驱动的工作机制。 一、 RK  显示驱动支持的显示格式   RK 
    的头像 发表于 12-02 07:10 604次阅读
    深入解析 RK <b class='flag-5'>平台</b>显示<b class='flag-5'>驱动</b>:格式支持、处理<b class='flag-5'>流程</b>与实现原理

    PPEC Workbench 平台拓扑覆盖,满足各类电源开发需求

    碎片化: 设计工具零散,缺乏能覆盖“拓扑选型→设计→验证” 流程的一站式平台。 ▌协同效率低: 拓扑与硬件选型、控制策略开发环节割裂,需反复调试匹配,严重阻碍项目迭代。 一、PPEC
    发表于 10-23 11:44

    VVIC 平台商品详情接口高效调用方案:从签名验证到数据解析流程

    本文详解VVIC平台商品详情接口调用流程,涵盖参数配置、签名生成、异常处理与数据解析,提供可复用的Python代码及避坑指南,助力开发者高效实现安全、稳定的数据对接。
    的头像 发表于 09-23 10:28 853次阅读

    学生适合使用的SOLIDWORKS 云应用程序

    随着科技的不断发展,计算机辅助设计(CAD)技术已经成为现代工程教育的重要组成部分。SOLIDWORKS作为一款CAD软件,其教育版云应用程序为学生提供了强大而灵活的设计平台。本文将探讨
    的头像 发表于 09-15 10:39 1022次阅读
    学生适合使用的SOLIDWORKS 云<b class='flag-5'>应用程序</b>

    普迪飞Exensio电池制造流程智能分析平台驱动产业效能升级

    在能源市场快速发展的今天,电池单体制造企业面临着提升生产效率、降低废品率、优化产品质量的重重挑战。普迪飞Exensio电池模块,是专为电池单体制造设计的高级分析平台,包括电极质量监控、缺陷管理以及
    的头像 发表于 08-19 13:51 844次阅读
    普迪飞Exensio电池制造<b class='flag-5'>全</b><b class='flag-5'>流程</b>智能分析<b class='flag-5'>平台</b>,<b class='flag-5'>驱动</b>产业效能升级

    【老法师】多核异构处理器中M核程序的启动、编写和仿真

    有很多研究单片机的小伙伴在面对多核异构处理器时,可能会对多核的启动流程感到困惑——因为不熟悉GCC编程和GDB调试,所以也无法确定多核异构处理器的程序是否能像单片机那样方便地编写和仿真。本篇
    的头像 发表于 08-13 09:05 4302次阅读
    【老法师】多核异构处理器中M核<b class='flag-5'>程序</b>的启动、<b class='flag-5'>编写</b>和仿真

    基于工业物联网平台流程智能工厂应用

    在当今数字化时代,智能工厂已成为制造业转型升级的核心方向,而数据驱动则是智能工厂高效运转的灵魂。数之能工业物联网平台作为连接设备、数据与决策的关键枢纽,在流程智能工厂的建设与应用中发
    的头像 发表于 07-28 10:17 706次阅读
    基于工业物联网<b class='flag-5'>平台</b>的<b class='flag-5'>全</b><b class='flag-5'>流程</b>智能工厂应用

    请问是否可以在通用Windows平台中构建OpenVINO™ GenAI C++ 应用程序

    无法在通用 Windows 平台中构建OpenVINO™ GenAI C++ 应用程序
    发表于 06-24 07:35

    设计双极性输入、差分输出ADC驱动器时需要考虑什么

    轨。为了解决这个问题,我们将介绍需要采取哪些步骤来设计双极性输入、差分输出ADC 驱动器,同时确保达到所需的噪声和失真性能。
    的头像 发表于 06-14 13:55 1659次阅读
    设计双极性输入、<b class='flag-5'>全</b>差分输出<b class='flag-5'>ADC</b><b class='flag-5'>驱动</b>器时需要考虑什么