Openharmony - HDF平台驱动之I2C驱动和测试程序

By: fulinux
E-mail: fulinux@sina.com
Blog: https://blog.csdn.net/fulinus
喜欢的盆友欢迎点赞和订阅!
你的喜欢就是我写作的动力!

在这里插入图片描述

目录

  • 概述
  • I2C平台驱动
  • I2C平台驱动HDF框架
  • I2C平台驱动的使用
    • I2C应用开发
      • 接口说明
      • 代码目录
      • i2ctest.c
      • BUILD.gn
      • bundle.json
      • 修改config.json文件
      • 测试程序导入设备
      • 运行测试

概述

我们鸿蒙3.2设备上连接了sensor,如accel和gyro,是通过i2c总线连接的,在鸿蒙HDF的设备私有信息配置文件如下描述:

vendor/sprd/uis7885/hdf_config/khdf/sensor/accel/qmi8658_config.hcs
sensorBusConfig :: sensorBusInfo {busType = 0; // 0:i2c 1:spibusNum = 2;busAddr = 0x6b;regWidth = 1; // 1byte
}
sensorIdAttr :: sensorIdInfo {chipName = "qmi8658";chipIdRegister = 0x00;chipIdValue = 0x05;
}

即总线是i2c2,从设备的sensor地址是0x6b,chip id的寄存器地址是0x00。chip id值是0x5。
我们先研究下如何通过测试程序来操作I2C,读取这个chip id值。

I2C平台驱动

鸿蒙标准系统中,使用的是Linux内核,这个没有官网上的I2C平台驱动中描述的这样需要编写I2C平台驱动。
使用这个I2C平台驱动文件:drivers/hdf_core/adapter/khdf/linux/platform/i2c/i2c_adapter.c
比如获取对应的I2C adapter:

static int LinuxI2cProbe(struct device *dev, void *data)
{int32_t ret;struct I2cCntlr *cntlr = NULL;struct i2c_adapter *adapter = NULL;(void)data;if (dev == NULL) {HDF_LOGE("%s: dev is null", __func__);return HDF_ERR_INVALID_OBJECT;}   if (dev->type != &i2c_adapter_type) {return HDF_SUCCESS; // continue probe}   HDF_LOGI("%s: Enter", __func__);adapter = to_i2c_adapter(dev); //获取i2c adaptercntlr = (struct I2cCntlr *)OsalMemCalloc(sizeof(*cntlr));if (cntlr == NULL) {HDF_LOGE("%s: malloc cntlr fail!", __func__);i2c_put_adapter(adapter);return HDF_ERR_MALLOC_FAIL;}   cntlr->busId = adapter->nr;cntlr->priv = adapter;cntlr->ops = &g_method;ret = I2cCntlrAdd(cntlr); //这个I2C控制器添加到HDF框架中,后面会在I2cOpen函数中调用I2cCntlrGet函数查找到对应的控制器if (ret != HDF_SUCCESS) {i2c_put_adapter(adapter);OsalMemFree(cntlr);cntlr = NULL;HDF_LOGE("%s: add controller fail:%d", __func__, ret);return ret;}   HDF_LOGI("%s: i2c adapter %d add success", __func__, cntlr->busId);return HDF_SUCCESS;
}

参考:http://docs.openharmony.cn/pages/v3.2/zh-cn/device-dev/guide/device-driver-demo.md/
上面我们提及to_i2c_adapter添加i2c 适配器,然后又将总线ID、适配器和操作方法等通过I2cCntlrAdd添加到HDF驱动框架中,后面在UHDF或KHDF中通过调用I2cOpen函数,间接调用了I2cCntlrGet函数,在HDF框架中找到对应的总线ID、适配器和操作方法等,然后就可以操作I2C总线了。
I2cCntlrAdd函数:

//drivers/hdf_core/framework/support/platform/src/i2c/i2c_core.c
int32_t I2cCntlrAdd(struct I2cCntlr *cntlr)
{int32_t ret;if (cntlr == NULL) {return HDF_ERR_INVALID_OBJECT;}   if (cntlr->ops == NULL) {HDF_LOGE("I2cCntlrAdd: no ops supplied!");return HDF_ERR_INVALID_OBJECT;}   if (cntlr->lockOps == NULL) {HDF_LOGI("I2cCntlrAdd: use default lock methods!");cntlr->lockOps = &g_i2cLockOpsDefault;}   if (OsalMutexInit(&cntlr->lock) != HDF_SUCCESS) {HDF_LOGE("I2cCntlrAdd: init lock fail!");return HDF_FAILURE;}   ret = I2cManagerAddCntlr(cntlr);if (ret != HDF_SUCCESS) {(void)OsalMutexDestroy(&cntlr->lock);return ret;}   return HDF_SUCCESS;
}

I2cOpen函数:

DevHandle I2cOpen(int16_t number)
{return (DevHandle)I2cCntlrGet(number);
}

I2cCntlrGet函数:

/** Find an i2c controller by bus number, without ref count*/
static struct I2cCntlr *I2cManagerFindCntlr(int16_t number)
{struct I2cCntlr *cntlr = NULL;struct I2cManager *manager = g_i2cManager;if (number < 0 || number >= I2C_BUS_MAX) {HDF_LOGE("I2cManagerFindCntlr: invalid busId:%hd!", number);return NULL;}if (manager == NULL) {HDF_LOGE("I2cManagerFindCntlr: get i2c manager fail!");return NULL;}if (OsalMutexLock(&manager->lock) != HDF_SUCCESS) {HDF_LOGE("I2cManagerFindCntlr: lock i2c manager fail!");return NULL;}cntlr = manager->cntlrs[number];(void)OsalMutexUnlock(&manager->lock);return cntlr;
}/** Find and return an i2c controller by number, with ref count*/
struct I2cCntlr *I2cCntlrGet(int16_t number)
{return I2cManagerFindCntlr(number);
}

在drivers/hdf_core/framework/support/platform/src/i2c/i2c_core.c文件中,主要就是实现这个上述这些功能

I2C平台驱动HDF框架

I2C平台驱动既可以为其他HDF驱动提供接口,比如挂接在I2C总线上的sensor驱动,也可以为用户空间提供通用的操作接口。这些接口都是这些:I2cOpen(),I2cClose(),I2cTransfer()。所以可以在drivers/hdf_core/framework/support/platform/src/i2c/中看到有这两个文件:

drivers/hdf_core/framework/support/platform/src/i2c/i2c_if.c
drivers/hdf_core/framework/support/platform/src/i2c/i2c_if_u.c

其中i2c_if.c就是对其他HDF驱动提供接口的:

#include "i2c_if.h"
#include "devsvc_manager_clnt.h"
#include "hdf_base.h"
#include "hdf_log.h"
#include "i2c_core.h"
#include "osal_mem.h"
#include "securec.h"#define HDF_LOG_TAG i2c_if#define I2C_SERVICE_NAME "HDF_PLATFORM_I2C_MANAGER"DevHandle I2cOpen(int16_t number)
{return (DevHandle)I2cCntlrGet(number);
}void I2cClose(DevHandle handle)
{if (handle != NULL) {I2cCntlrPut((struct I2cCntlr *)handle);}
}int32_t I2cTransfer(DevHandle handle, struct I2cMsg *msgs, int16_t count)
{if (handle == NULL) {return HDF_ERR_INVALID_OBJECT;}if (msgs == NULL || count <= 0) {HDF_LOGE("I2cTransfer: err params! msgs:%s, count:%hd",(msgs == NULL) ? "0" : "x", count);return HDF_ERR_INVALID_PARAM;}return I2cCntlrTransfer((struct I2cCntlr *)handle, msgs, count);
}

其中i2c_if_u.c就是对用户空间提供通用的操作接口:

#include "hdf_base.h"
#include "hdf_io_service_if.h"
#include "hdf_log.h"
#include "i2c_if.h"
#include "i2c_service.h"

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

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

相关文章

Pytorch添加自定义算子之(5)-配置GPU形式的简单add自定义算子

参考:https://zhuanlan.zhihu.com/p/358778742 一、头文件 命名为:add2.h void launch_add2(float *c,const float *a,const float *b,int n);

ARMv8-AArch64 的异常处理模型详解之异常处理详解(同步异常和异步异常的分析和处理)

这里写目录标题 一&#xff0c;同步异常的分析1.1 同步异常分析-异常链接寄存器ELR1.2 同步异常分析-异常综合寄存器ESR&#xff0c;Exception Syndrome Register1.3 同步异常分析-错误地址寄存器FAR,Fault Address Register 二&#xff0c; 同步异常的处理示例 Synchronous ex…

langChain学习笔记(待续)

目录 IntroductionLLM的限制扩展理解&#xff1a;什么是机器学习扩展阅读&#xff1a;机器学习的流程 LangChain Introduction LLM的限制 大型语言模型&#xff0c;比如ChatGpt4&#xff0c;尽管已经非常强大&#xff0c;但是仍然存在一些限制&#xff1a; 知识更新&#xff…

Scrapy与分布式开发(2.2):正则表达式

使用Python的re模块进行正则表达式操作详细讲解 一、引言 正则表达式是一种强大的文本处理工具,它使用特定的模式来搜索、匹配和替换文本。Python的re模块(正则表达式模块)提供了正则表达式匹配操作的所有功能。下面我们将详细讲解如何使用re模块进行正则表达式的操作。 二…

尚硅谷webpack5笔记2

Loader 原理 loader 概念 帮助 webpack 将不同类型的文件转换为 webpack 可识别的模块。 loader 执行顺序 分类pre: 前置 loadernormal: 普通 loaderinline: 内联 loaderpost: 后置 loader执行顺序4 类 loader 的执行优级为:pre > normal > inline > post 。相…

MongoDB聚合运算符:$ceil

文章目录 语法用法举例 $ceil聚合运算符返回大于或等于给定数值的最小整数。 语法 { $ceil: <number> }<number>可以是任何能够被解析为数值的表达式。 用法 如果参数被解析为null或引用的字段不存在&#xff0c;$ceil返回null&#xff0c;如果参数被解析为NaN…

【MongoDB】docker安装mongodb 7.0

下载镜像 docker pull mongo创建本地数据存储文件夹 rootxrx:~/etc# tree mongodb/ mongodb/ └── data使用docker创建容器,并挂载配置文件,并设置密码 docker run -p 5233:27017 -v /root/etc/mongodb/data:/data/db --name mongo -e MONGO_INITDB_ROOT_USERNAMEroot -…

逆向案例二:关键字密文解密,自定义的加密解密。基于企名片科技的爬取。

import requests import execjsfor i in range(4):i i1url https://vipapi.qimingpian.cn/Activity/channelInformationByChannelNamedata {channel_name: 24新声,page: f{i},num: 20,unionid: W9wLD4rHIZrB3GLTUncmHgbZcEepR78xJa5Zit6XTMtata86DehdxDt/fDbcHeeJWqqIs6k…

jax可微分编程的笔记(5)

jax可微分编程的笔记(5) 第五章 JAX编程范式及即时编译 对于任意一门哲学的理论&#xff0c;都是先有世界观&#xff0c;然后才能有方法论 λ演算正是函数式编程的“世界观” 我曾经高傲地以为&#xff0c;尽管大数据&#xff0c;人工智能和量子计算正推动着 人类社会第四次…

软件测试笔记(二):软件测试流程

1 测试流程概述 软件测试流程包括&#xff1a; 测试计划&#xff1a;测试计划是指根据用户需求报告中关于功能要求和性能指标的规格说明书&#xff0c;定义相应的测试需求报告&#xff0c;使得随后所有的测试工作都围绕着测试需求来进行&#xff0c;同时适当选择测试内容&…

IDEA如何开启Dashboard

普通的面板 Run Dashboard面板 修改配置文件 找到项目的.idea文件夹 点击编辑workspace.xml文件 添加下方代码 <component name"RunDashboard"><option name"ruleStates"><list><RuleState><option name"name" valu…

【Linux】进程信号 --- 信号的产生 保存 捕捉递达

文章目录 信号的感知信号的结构描述 一、信号的产生1.通过键盘发送信号2.通过系统调用发送信号 二、信号的保存&#xff08;PCB内部的两张位图和一个函数指针数组&#xff09;理解三张数据结构表block pending haldler 三、通过代码编写 理解 信号的保存和递达1.信号集操作的库…

[极客大挑战 2019]LoveSQL1 题目分析与详解

一、题目简介&#xff1a; 二、通关思路&#xff1a; 1、首先查看页面源代码&#xff1a; 我们发现可以使用工具sqlmap来拿到flag&#xff0c;我们先尝试手动注入。 2、 打开靶机&#xff0c;映入眼帘的是登录界面&#xff0c;首先尝试万能密码能否破解。 username: 1 or 11…

深入理解ngx_http_proxy_connect_module模块(上)

目录 1. 缘起2. 分析验证环境的配置3. 配置指令3.1 proxy_connect3.2 proxy_connect_allow3.3 proxy_connect_connect_timeout3.4 proxy_connect_read_timeout3.5 proxy_connect_send_timeout3.6 proxy_connect_address3.7 proxy_connect_bind3.8 proxy_connect_response3.9 pr…

弱结构化日志 Flink SQL 怎么写?SLS SPL 来帮忙

作者&#xff1a;潘伟龙&#xff08;豁朗&#xff09; 背景 日志服务 SLS 是云原生观测与分析平台&#xff0c;为 Log、Metric、Trace 等数据提供大规模、低成本、实时的平台化服务&#xff0c;基于日志服务的便捷的数据接入能力&#xff0c;可以将系统日志、业务日志等接入 …

《PCI Express体系结构导读》随记 —— 第II篇 第10章 MSI和MSI-X中断机制(1)

前言中曾提到&#xff1a;本章重点介绍MSI和MSI-X。 在PCI总线中&#xff0c;所有需要提交中断请求的设备&#xff0c;必须能够通过INTx引脚提交中断请求&#xff0c;而MSI机制是一个可选机制&#xff1b;而在PCIe总线中&#xff0c;PCIe设备必须支持MSI或者MSI-X中断请求机制&…

10.selenium的基本使用

selenium是一个关于爬虫功能python的库&#xff0c;它的整体逻辑与之前的请求爬虫思路不同。selenium是模拟出一个浏览器&#xff0c;你通过代码操作这个浏览器从而获取一些信息&#xff0c;比如执行click()就相当于点击了浏览器中的某个元素&#xff0c;相当于是针对浏览器的鼠…

PyTorch张量运算

诸神缄默不语-个人CSDN博文目录 在深度学习领域&#xff0c;张量是一种非常核心的数据结构&#xff0c;它是标量、向量和矩阵等数学概念的高维扩展。PyTorch作为一款流行的深度学习框架&#xff0c;提供了丰富的张量操作API&#xff0c;帮助研究人员和开发者有效地实现复杂的数…

一款开源.NET WPF界面库介绍

一款开源.NET WPF界面库介绍 这是一个WPF版的Layui前端UI样式库&#xff0c;该控件库参考了Web版本的LayUI风格&#xff0c;利用该控件库可以完成现代化UI客户端程序&#xff0c;让你的客户端看起来更加简洁丰富又不失美感 如何使用 步骤一 : 添加LayUI.Wpf Nuget包; Inst…

物联网APP开发:技术、挑战与前景

随着科技的快速发展&#xff0c;物联网&#xff08;IoT&#xff09;已经成为当今世界的重要趋势。物联网是将物理世界的各种“事物”与互联网连接起来&#xff0c;通过智能设备、传感器和执行器实现数据的收集、交换和处理&#xff0c;以改善生活和工作的方式。物联网APP是实现…