OpenHarmony:全流程讲解如何编写ADC平台驱动以及应用程序 原创 精华
1、案例简介
该程序是基于OpenHarmony标准系统编写的基础外设类:ADC驱动。
目前该案例已在凌蒙派-RK3568开发板跑通。详细资料请参考官网:https://gitee.com/Lockzhiner-Electronics/lockzhiner-rk3568-openharmony/tree/master/samples/b04_platform_device_adc
详细资料请参考OpenHarmony官网:
2、基础知识
2.1、ADC简介
ADC(Analog to Digital Converter),即模拟-数字转换器,可将模拟信号转换成对应的数字信号,便于存储与计算等操作。除电源线和地线之外,ADC只需要1根线与被测量的设备进行连接。
2.2、ADC平台驱动
在HDF框架中,同类型设备对象较多时(可能同时存在十几个同类型配置器),若采用独立服务模式,则需要配置更多的设备节点,且相关服务会占据更多的内存资源。相反,采用统一服务模式可以使用一个设备服务作为管理器,统一处理所有同类型对象的外部访问(这会在配置文件中有所体现),实现便捷管理和节约资源的目的。ADC模块即采用统一服务模式。如下图所示:
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设备的一般流程如下所示:
详细资料请参考官网地址: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,用于驱动设备描述,具体内容如下:
注意:
device0:ADC控制器,为了引入HDF_PLATFORM_ADC_MANAGER驱动,必须要。
device1:ADC实际操作接口。
moduleName:该驱动名称,必须是linux_adc_adapter,//drivers/hdf_core/adapter/khdf/linux/platform/adc/adc_iio_adapter.c已编写好。
deviceMatchAttr:关键字必须与config.hcs的match_attr匹配。
3.2.2、adc_config.hcs
创建config/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添加配置树中。具体内容如下所示:
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,具体内容如下:
3.5、应用程序
3.5.1、adc_test.c
添加平台驱动ADC的头文件,具体内容如下:
程序可通过,具体内容如下:
3.5.2、BUILD.gn
3.5.3、参与应用程序编译
编辑//vendor/lockzhiner/rk3568/samples/BUILD.gn,开启编译选项。具体如下:
4、程序编译
建议使用docker编译方法,运行如下:
5、运行结果
该程序运行结果如下所示:
可以将ADC引脚通过引线接入排针线中的GNU或3V3中,可以查看ADC的变化。
这下必须动手学习下了
开发板可以用docker了吗
你好请教下您,hdc进入开发板系统下,可以ADC驱动成功;但是用napi,就会出现“failed 同dispatch serv call ioctl -2".