当前位置: 首页 > news >正文

6.3物联网RK3399项目开发实录-驱动开发之I2C 使用(wulianjishu666)

物联网开发源码案例集:

链接:https://pan.baidu.com/s/1kfPDpYZpm_G0GBLAup3KTQ?pwd=vgvv

=============================================================

I2C 使用

简介

AIO-3399J 开发板上有 9 个片上 I2C 控制器,各个 I2C 的使用情况如下表:

_images/i2c_list.jpg

本文主要描述如何在该开发板上配置 I2C。

配置 I2C 可分为两大步骤:

  • 定义和注册 I2C 设备

  • 定义和注册 I2C 驱动

下面以配置 GSL3680 为例。

定义和注册 I2C 设备

在注册 I2C 设备时,需要结构体 i2c_client 来描述 I2C 设备。然而在标准 Linux 中,用户只需要提供相应的 I2C 设备信息,Linux 就会根据所提供的信息构造 i2c_client 结构体。

用户所提供的 I2C 设备信息以节点的形式写到 DTS 文件中,如下所示:

kernel/arch/arm64/boot/dts/rockchip/rk3399-firefly-edp.dts
&i2c4 {status = "okay";gsl3680: gsl3680@41 {compatible = "gslX680";reg = <0x41>;screen_max_x = <1536>;screen_max_y = <2048>;touch-gpio = <&gpio1 20 IRQ_TYPE_LEVEL_LOW>;reset-gpio = <&gpio0 12 GPIO_ACTIVE_HIGH>;};
};

定义和注册 I2C 驱动

定义 I2C 驱动

在定义 I2C 驱动之前,用户首先要定义变量 of_device_id 和 i2c_device_id

of_device_id 用于在驱动中调用 DTS 文件中定义的设备信息,其定义如下所示:

 static struct of_device_id gsl_ts_ids[] = {{.compatible = "gslX680"},{}};

定义变量 i2c_device_id

 static const struct i2c_device_id gsl_ts_id[] = {{GSLX680_I2C_NAME, 0},{}};MODULE_DEVICE_TABLE(i2c, gsl_ts_id);

i2c_driver 如下所示:

 static struct i2c_driver gsl_ts_driver = {.driver = { .name = GSLX680_I2C_NAME,.owner = THIS_MODULE,.of_match_table = of_match_ptr(gsl_ts_ids),},#ifndef CONFIG_HAS_EARLYSUSPEND//.suspend  = gsl_ts_suspend,//.resume   = gsl_ts_resume,#endif.probe      = gsl_ts_probe,.remove     = gsl_ts_remove,.id_table   = gsl_ts_id,};

注:变量 id_table 指示该驱动所支持的设备。

注册 I2C 驱动

使用 i2c_add_driver 函数注册 I2C 驱动。

i2c_add_driver(&gsl_ts_driver);

在调用 i2c_add_driver 注册 I2C 驱动时,会遍历 I2C 设备,如果该驱动支持所遍历到的设备,则会调用该驱动的 probe 函数。

通过 I2C 收发数据

在注册好 I2C 驱动后,即可进行 I2C 通讯。

  • 向从机发送信息:

 int i2c_master_send(const struct i2c_client *client, const char *buf, int count){int ret;struct i2c_adapter *adap = client->adapter;struct i2c_msg msg;msg.addr = client->addr;msg.flags = client->flags & I2C_M_TEN;msg.len = count;msg.buf = (char *)buf;ret = i2c_transfer(adap, &msg, 1);/** If everything went ok (i.e. 1 msg transmitted), return #bytes* transmitted, else error code.*/return (ret == 1) ? count : ret;}
  • 向从机读取信息:

 int i2c_master_recv(const struct i2c_client *client, char *buf, int count){struct i2c_adapter *adap = client->adapter;struct i2c_msg msg;int ret;msg.addr = client->addr;msg.flags = client->flags & I2C_M_TEN;msg.flags |= I2C_M_RD;msg.len = count;msg.buf = buf;ret = i2c_transfer(adap, &msg, 1);/** If everything went ok (i.e. 1 msg received), return #bytes received,* else error code.*/return (ret == 1) ? count : ret;}EXPORT_SYMBOL(i2c_master_recv);

FAQs

Q1: 通信失败,出现这种 log: “timeout, ipd: 0x00, state: 1” 该如何调试?

A1: 请检查硬件上拉是否给电。

Q2: 调用 i2c_transfer 返回值为 -6?

A2: 返回值为 -6 表示为 NACK 错误,即对方设备无应答响应,这种情况一般为外设的问题,常见的有以下几种情况:

  • I2C 地址错误,解决方法是测量 I2C 波形,确认是否 I2C 设备地址错误;

  • I2C slave 设备不处于正常工作状态,比如未给电,错误的上电时序等;

  • 时序不符合 I2C slave 设备所要求也会产生 Nack 信号。

Q3: 当外设对于读时序要求中间是 stop 信号不是 repeat start 信号的时候,该如何处理?

A3: 这时需要调用两次 i2c_transfer, I2C read 拆分成两次,修改如下:

static int i2c_read_bytes(struct i2c_client *client, u8 cmd, u8 *data, u8 data_len) {struct i2c_msg msgs[2];int ret;u8 *buffer;buffer = kzalloc(data_len, GFP_KERNEL);if (!buffer)return -ENOMEM;;msgs[0].addr = client->addr;msgs[0].flags = client->flags;msgs[0].len = 1;msgs[0].buf = &cmd;ret = i2c_transfer(client->adapter, msgs, 1);if (ret < 0) {dev_err(&client->adapter->dev, "i2c read failed\n");kfree(buffer);return ret;}msgs[1].addr = client->addr;msgs[1].flags = client->flags | I2C_M_RD;msgs[1].len = data_len;msgs[1].buf = buffer;ret = i2c_transfer(client->adapter, &msgs[1], 1);if (ret < 0)dev_err(&client->adapter->dev, "i2c read failed\n");elsememcpy(data, buffer, data_len);kfree(buffer);return ret;
}

相关文章:

6.3物联网RK3399项目开发实录-驱动开发之I2C 使用(wulianjishu666)

物联网开发源码案例集&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1kfPDpYZpm_G0GBLAup3KTQ?pwdvgvv I2C 使用 简介 AIO-3399J 开发板上有 9 个片上 I2C 控制器&#xff0c;各个 I2C 的使用情况如下表&#xff1a; 本文主要描述如何在该开发板上配置 I2C。 配置…...

HarmonyOS实战开发-如何构建多种样式弹窗

介绍 本篇Codelab将介绍如何使用弹窗功能&#xff0c;实现四种类型弹窗。分别是&#xff1a;警告弹窗、自定义弹窗、日期滑动选择器弹窗、文本滑动选择器弹窗。需要完成以下功能&#xff1a; 点击左上角返回按钮展示警告弹窗。点击出生日期展示日期滑动选择器弹窗。点击性别展…...

《Effective C++》《构造/析构/赋值运算——7、为多态基类声明virtual析构函数》

文章目录 1、term7:Declare destructors virtual in polymorphic base classes2、总结3、相关面试题3.1 析构函数在什么情况下声明为虚函数 4、参考 1、term7:Declare destructors virtual in polymorphic base classes 带有多态性质的基类应该声明一个virtual析构函数&#x…...

Type-C一分二快充线智能分配方案

随着移动设备的普及和快充技术的迅猛发展&#xff0c;Type-C接口已成为众多手机、平板和笔记本电脑的标配。然而&#xff0c;在日常使用中&#xff0c;我们经常会遇到需要同时为多个设备充电的情况。这时&#xff0c;Type-C一分二快充线就显得尤为重要。为了更好地满足用户的充…...

利用python脚本,根据词条爬取百度图片(爬虫)

把广角&#xff0c;换成你的关键词就行 # -*- coding: utf-8 -*- """ Created on Wed Mar 29 10:17:50 2023 author: MatpyMaster """ import requests import os import redef get_images_from_baidu(keyword, page_num, save_dir):header {Us…...

java复原IP 地址(力扣Leetcode93)

复原IP 地址 力扣原题链接 问题描述 有效 IP 地址正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 ‘.’ 分隔。 例如&#xff1a;“0.1.2.201” 和 “192.168.1.1” 是有效 IP 地址&#xff0c…...

k8s的创建资源的流程图

背景 在k8s中创建资源需要经过几个流程的协作&#xff0c;包括认证模块&#xff0c;授权模块和资源管理模块的共同处理的结果 k8s的创建资源的流程图 第一步认证模块&#xff1a; k8s需要确保操作的客户端是合法的用户&#xff0c;并且不是仿冒的&#xff0c;也就是判断这个u…...

Android RecyclerView 滑动后选中的条目居中显示

话不多说先看效果: 实录效果视频如下 滚动居中 RecyclerView 在原有的RecyclerView 基础上操作&#xff0c;其他步骤不变&#xff0c;只是替换一下 manager 步骤 导入依赖 maven { url https://www.jitpack.io }//无限滚动implementation com.github.ZhaoChanghu:GalleryLayou…...

RPA-财务对账邮件应用自动化(客户对账机器人)

《财务对账邮件应用自动化》&#xff0c;将会使用邮箱的SMTP服务&#xff0c;小北把资源包绑定在这篇博客了 Uibot (RPA设计软件)———机器人的小项目友友们可以参考小北的课前材料五博客~ (本博客中会有部分课程ppt截屏,如有侵权请及请及时与小北我取得联系~&#xff09; …...

Delphi模式编程

文章目录 Delphi模式编程涉及以下几个关键方面&#xff1a;**设计模式的应用****Delphi特性的利用****实际开发中的实践** Delphi模式编程的实例 Delphi模式编程是指在使用Delphi这一集成开发环境&#xff08;IDE&#xff09;和Object Pascal语言进行软件开发时&#xff0c;采用…...

flutter 自定义弹窗封装弹窗----在弹窗内实现部分窗体生命周期

小部件组件 可以在里面加装其他事件如HTTP接口访问 import package:flutter/material.dart;///执行弹窗动画封装 class ExecutionDialog extends StatefulWidget {// final String? title;// final String? message;// final Function? onExecute;//// const ExecutionDial…...

go语言 私用仓库包下载

设置私有仓库&#xff0c;这样访问的时候&#xff0c;url前缀就不加proxy和sumdb go env -w GOPRIVATE"code.xxx.cn" go env -w GONOPROXY"code.xxx.cn" go env -w GONOSUMDB"code.xxx.cn" 设置取消安全认证 go env -w GOINSECURE"code…...

Math类

java.lang.Math 提供了一系列静态方法用于科学计算&#xff0c;常用方法如下&#xff1a; abs 绝对值 acos&#xff0c;asin&#xff0c;atan&#xff0c;cos&#xff0c;sin&#xff0c;tan 三角函数 sqrt 平方根 pow(double a,double b) a的b次幂 max(double a,double b) 取大…...

Git 入门教程

Git 入门教程 一、Git 是什么&#xff1f; Git 是一个开源的分布式版本控制系统&#xff0c;用于追踪代码的改动。它可以帮助开发者协同工作&#xff0c;管理项目中的代码版本。 二、安装 Git 在开始使用 Git 之前&#xff0c;你需要在你的计算机上安装 Git。你可以从 Git …...

Linux网络配置(超详细)

Linux网络配置大全 Linux网络配置一.网络地址配置网络地址查看–ifconfig使用网络配置命令设置网络接口参数-ifconfig禁用(临时)或者重新激活网卡设置虚拟网络接口 修改网络配置文件网络接口配置文件 IP命令详解OPTIONS选项OBJECT对象 ip link 二、获取和修改主机名hostname查看…...

[自研开源] 数据集成之分批传输 v0.7

开源地址&#xff1a;gitee | github 详细介绍&#xff1a;MyData 基于 Web API 的数据集成平台 部署文档&#xff1a;用 Docker 部署 MyData 使用手册&#xff1a;MyData 使用手册 试用体验&#xff1a;https://demo.mydata.work 交流Q群&#xff1a;430089673 介绍 本篇基于…...

用 AI 编程-释放ChatGPT的力量

最近读了本书&#xff0c;是 Sean A Williams 写的&#xff0c;感觉上还是相当不错的。一本薄薄的英文书&#xff0c;还真是写的相当好。如果你想看&#xff0c;还找不到&#xff0c;可以考虑私信我吧。 ChatGPT for Coders Unlock the Power of AI with ChatGPT: A Comprehens…...

【快速解决】解决谷歌自动更新的问题,禁止谷歌自动更新,如何防止chrome自动升级 chrome浏览器禁止自动升级设置方法

目录 问题描述 解决方法 1、搜索栏搜索控制面板 2、搜索&#xff1a;服务 ​编辑 3、点击Windows工具 4、点击服务 ​5、禁止谷歌更新 问题描述 由于我现在需要装一个谷歌的驱动系统&#xff0c;但是目前的谷歌驱动系统的版本都太旧了&#xff0c;谷歌自身的版本又太新了…...

【Leetcode每日一题】模拟 - 替换所有的问号(难度⭐)(42)

1. 题目解析 题目链接&#xff1a;1576. 替换所有的问号 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 遍历字符串&#xff1a;从左到右逐个处理字符。 处理问号字符&#xff1a;对于每个问号字符&#xff0c;我们需…...

再见 mysql_upgrade

在数据库管理的世界里&#xff0c;随着技术的不断进步和业务的不断发展&#xff0c;数据库的版本升级成为了一个不可避免的过程。 MySQL 作为业界领先的开源关系型数据库管理系统&#xff0c;其版本迭代与功能优化同样不容忽视。 而在这个过程中&#xff0c;升级工具就显得尤为…...

OpenClaw压力测试:百川2-13B-4bits模型连续处理100个文件的稳定性

OpenClaw压力测试&#xff1a;百川2-13B-4bits模型连续处理100个文件的稳定性 1. 测试背景与动机 上周在整理项目文档时&#xff0c;我遇到了一个典型问题&#xff1a;需要批量重命名103个Markdown文件&#xff0c;并从中提取关键字段生成目录索引。手动操作不仅耗时&#xf…...

OpenClaw+GLM-4.7-Flash:自动化技术文档翻译系统

OpenClawGLM-4.7-Flash&#xff1a;自动化技术文档翻译系统 1. 为什么需要自动化翻译系统 作为一名经常需要阅读英文技术文档的开发者&#xff0c;我长期被两个问题困扰&#xff1a;一是专业术语翻译不统一&#xff0c;同一份文档里"pipeline"可能被翻译成"管…...

从LDF文件看LIN调度:为什么说‘可预测性’是汽车低端总线的灵魂?

从LDF文件看LIN调度&#xff1a;为什么说‘可预测性’是汽车低端总线的灵魂&#xff1f; 当你按下车窗按钮时&#xff0c;那个瞬间发生的升降动作背后&#xff0c;隐藏着一套精密的通信协议在默默运作。不同于高端车载网络CAN总线的复杂仲裁机制&#xff0c;LIN总线以其独特的&…...

OpCore-Simplify:黑苹果配置的终极简化指南,零基础也能轻松上手

OpCore-Simplify&#xff1a;黑苹果配置的终极简化指南&#xff0c;零基础也能轻松上手 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的黑…...

探索多约束多目标粒子群算法在微电网优化运行中的应用

多约束多目标粒子群算法的微电网优化运行代码在如今追求能源高效利用与可持续发展的时代&#xff0c;微电网的优化运行显得尤为关键。而多约束多目标粒子群算法为微电网优化运行提供了一种极具潜力的解决方案。今天咱就来唠唠相关的代码实现。 粒子群算法基础回顾 粒子群算法&a…...

敏捷开发实战指南:提升团队效率的5个秘诀

在快速迭代的敏捷开发中&#xff0c;测试团队既是质量守门人&#xff0c;也是流程加速器。本文从软件测试从业者的专业视角&#xff0c;提炼五个经过实战验证的高效实践&#xff0c;助力团队突破协作瓶颈、缩短反馈周期&#xff0c;实现质量与速度的双重提升。秘诀一&#xff1…...

实测Guohua Diffusion国风生成效果:荷塘锦鲤、竹林薄雾,画面太美了

实测Guohua Diffusion国风生成效果&#xff1a;荷塘锦鲤、竹林薄雾&#xff0c;画面太美了 1. 国风绘画工具初体验 当我第一次打开Guohua Diffusion时&#xff0c;就被它简洁的界面设计所吸引。整个工具没有任何冗余参数&#xff0c;只有几个核心选项&#xff1a;画幅选择、提…...

视频换脸功能上线!AI黑科技助力内容创作降本90%

在电商圈摸爬滚打十几年&#xff0c;从国内淘宝京东到亚马逊TikTok&#xff0c;操盘过美妆、服饰、3C多个类目的百万级店铺。这十年最深的体会就是&#xff1a;流量越来越贵&#xff0c;内容越来越卷&#xff0c;成本越来越高。 尤其是短视频赛道。一条带货视频&#xff0c;模…...

6个维度教你选择Mac Mouse Fix的最佳部署渠道

6个维度教你选择Mac Mouse Fix的最佳部署渠道 【免费下载链接】mac-mouse-fix Mac Mouse Fix - A simple way to make your mouse better. 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix 副标题&#xff1a;开发者、普通用户与企业用户的技术选型指南…...

新手零基础入门:跟着快马生成的互动教程完成jdk17下载安装与第一个程序

作为一名Java初学者&#xff0c;第一次接触JDK安装可能会觉得有些迷茫。最近我在InsCode(快马)平台上尝试了一个JDK17安装教程项目&#xff0c;整个过程比我预想的要简单很多。下面就把我的学习笔记分享给大家&#xff0c;希望能帮助到同样刚入门的朋友。 JDK17下载步骤 首先需…...