[ROC-RK3568-PC] [Firefly-Android] 10min带你了解I2C的使用

news2024/11/25 10:01:48
  • 🍇 博主主页: 【Systemcall小酒屋】
  • 🍇 博主追寻:热衷于用简单的案例讲述复杂的技术,“假传万卷书,真传一案例”,这是林群院士说过的一句话,另外“成就是最好的老师”,技术既要沉淀,也得分享,成就感的正反馈是支持我持续耕耘的动力!
  • 🍇 专栏目录: 【Firefly-RK356x板卡】
  • 🍇 专栏说明:基于Firefly旗下的RK356x板卡进行入门篇讲述,欢迎订阅,博主会持续更新!

文章目录

    • 一、I2C 使用情况
    • 二、定义和注册 I2C 设备
    • 三、定义和注册 I2C 驱动
      • 3.1 I2C 驱动定义
      • 3.2 I2C 驱动注册
      • 3.3 通过 I2C 收发数据

配置 I2C 可分为两大步骤:

  • 定义和注册 I2C 设备
  • 定义和注册 I2C 驱动

下面以配置 GSL3680 为例。GSL3680是一款电容屏多点触摸控制单芯片。

一、I2C 使用情况

ROC-RK3568-PC开发板上有 6 个片上 I2C 控制器,各个 I2C 的使用情况如下表:

PortPin nameDevice
I2C0GPIO0_B1/I2C0_SCL
GPIO0_B2/I2C0_SDA
RK809
I2C1GPIO0_B3/I2C1_SCL
GPIO0_B4/I2C1_SDA
TP
I2C2_M0GPIO0_B5/I2C2_SCL_M0
GPIO0_B6/I2C2_SDA_M0
复用为其他功能
I2C2_M1GPIO4_B5/I2C2_SCL_M1
GPIO4_B4/I2C2_SDA_M1
复用为其他功能
I2C3_M0GPIO1_A1/I2C3_SCL_M0
GPIO1_A0/I2C3_SDA_M0
BAT
I2C3_M1GPIO3_B5/I2C3_SCL_M1
GPIO3_B6/I2C3_SDA_M1
复用为其他功能
I2C4_M0GPIO4_B3/I2C4_SCL_M0
GPIO4_B2/I2C4_SDA_M0
TP
I2C4_M1GPIO2_B2/I2C4_SCL_M1
GPIO2_B1/I2C4_SDA_M1
复用为其他功能
I2C5_M0GPIO3_B3/I2C5_SCL_M0
GPIO3_B4/I2C5_SDA_M0
MC3230/HYM8563
I2C5_M1GPIO4_C7/I2C5_SCL_M1
GPIO4_D0/I2C5_SDA_M1
复用为其他功能

二、定义和注册 I2C 设备

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

I2C 设备信息以节点的形式写到 DTS 文件中,例如 I2C2 总线:

// kernel/arch/arm64/boot/dts/rockchip/rk3566-firefly-aioj-lvds-HSX101H40C.dts
&i2c2 {
    status = "okay";
    clock-frequency = <100000>; // i2c频率:10kHz
    //i2c-scl-rising-time-ns = <800>; // 上降沿800ns
    //i2c-scl-falling-time-ns = <100>; // 下降沿100ns
    gslx680: gslx680@41 {
        compatible = "gslX680";
        reg = <0x41>; // i2c地址
        screen_max_x = <800>;
        screen_max_y = <1280>;
        touch-gpio = <&gpio0 RK_PC5 IRQ_TYPE_LEVEL_LOW>;
        reset-gpio = <&gpio0 RK_PC1 GPIO_ACTIVE_HIGH>;
        flip-x = <1>;
        flip-y = <0>;
        swap-xy = <0>;
        gsl,fw = <1>;
    };
};

三、定义和注册 I2C 驱动

3.1 I2C 驱动定义

在定义 I2C 驱动之前,用户首先要定义变量 of_device_idi2c_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 驱动定义 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 指示该驱动所支持的设备。

3.2 I2C 驱动注册

使用 i2c_add_driver 函数注册 I2C 驱动。

i2c_add_driver(&gsl_ts_driver);

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

3.3 通过 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)
 {
     int ret;
     struct i2c_adapter *adap = client->adapter;
     struct i2c_msg msg;
 
     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);

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

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

相关文章

做了个springboot接口参数解密的工具,我给它命名为万能钥匙(已上传maven中央仓库,附详细使用说明)

前言&#xff1a;之前工作中做过两个功能&#xff0c;就是之前写的这两篇博客&#xff0c;最近几天有个想法&#xff0c;给它做成一个springboot的start启动器&#xff0c;直接引入依赖&#xff0c;写好配置就能用了 springboot使用自定义注解实现接口参数解密&#xff0c;普通…

什么是UEFI签名认证?UEFI签名有什么好处?

为了防御恶意软件攻击&#xff0c;目前市面上所有电脑设备启动时默认开启安全启动(Secure Boot)模式。安全启动(Secure Boot)是UEFI扩展协议定义的安全标准&#xff0c;可以确保设备只使用OEM厂商信任的软件启动。UEFI签名认证就是对运行在 UEFI 系统下的 efi 驱动和通过 UEFI …

IT行业就业趋势显示:二季度平均月薪超8千

我国的IT互联网行业在近些年来规模迅速扩大&#xff0c;技能和技术水平也明显提升&#xff0c;目前IT互联网行业已经成为社会发展中新型产业的重要组成部分&#xff0c;行业的人才队伍也在不断的发展壮大&#xff0c;选择进入入互联网行业工作的人也越来越多。 根据58同城前段…

arcgispro3.1(账号登陆)

ArcGIS Pro 3.1 更新中文概览专注于 制图、GIS、Python前言&#xff1a;本次更新给了我两个惊喜&#xff0c;一个是本来 ArcMap 就有的功能&#xff0c;另一个明显是学习的 QGIS&#xff0c;嘿嘿&#xff0c;大家往下看吧。整理翻译了一下官方的 ArcGIS Pro 3.1 新特性更新概览…

远程桌面瘦客户机的优点和缺点

微软为 Windows 配备了本地远程桌面客户端&#xff0c;以通过远程桌面协议会话访问虚拟桌面环境或集中式服务器。但是&#xff0c;Windows 远程桌面客户端并不是唯一选项。另一个流行的选择是远程桌面瘦客户机。 一、什么是瘦客户机 瘦客户机是一种无硬盘的台式计算机&#x…

基数排序算法

目录&#xff1a;什么是基数排序&#xff1f;基本原理核心思想实现逻辑代码实现复杂度分析总结什么是基数排序&#xff1f; 基数排序&#xff1a;基数排序&#xff08;Radix sort&#xff09;是一种非比较型整数排序算法&#xff0c; 基本思想主要是通过关键字间的比较和移动记…

苹果笔不用原装可以吗?Apple Pencil平替笔推荐

近些年来&#xff0c;不管是学习还是画画&#xff0c;都有不少人喜欢用ipad。而ipad的用户&#xff0c;也是比较重视它的实用价值&#xff0c;尤其是不少人都想要好好利用来进行学习记笔记。事实上&#xff0c;有很多替代品都能替代Apple Pencil&#xff0c;仅仅用于记笔记就没…

Linux信号详解

文章目录Linux信号什么是信号**从生活角度理解: **技术应用角度的信号进程的注意事项信号概念用kill -l命令可以察看系统定义的信号列表信号处理常见方式概览信号产生通过终端按键产生信号使用signal函数自定义SIGINT信号的处理方式使用sigprocmask函数阻塞2号信号和40号信号vo…

Kafka 消息不丢失

Kafka 消息不丢失生产者丢失消费者丢失不丢失配置Kafka 保证消息不丢失&#xff1a;只对已提交的消息 (committed message) 做有限度的持久化保证 已提交的消息&#xff1a;当 n 个 Broker 成功接收到该消息并写入到日志文件后&#xff0c;就告诉生产者该消息已成功提交有限度…

Android 动态调用SD卡内jar包

背景&#xff1a;jar包不放在项目路径&#xff0c;而是放在SD卡目录内&#xff0c;需要动态调用jar包内函数实现自己的业务逻辑。全部流程新建一个项目用来打包jar。打包jar定义接口&#xff0c;规范函数定义实现类&#xff0c;实现方法&#xff0c;并实现函数的业务逻辑&#…

大数据 | (一)Hadoop伪分布式安装

大数据原理与应用教材链接&#xff1a;大数据技术原理与应用电子课件-林子雨编著 Hadoop伪分布式安装借鉴文章&#xff1a;Hadoop伪分布式安装-比课本详细 大数据 | &#xff08;二&#xff09;SSH连接报错Permission denied&#xff1a;SSH连接报错Permission denied 哈喽&a…

社科院与杜兰大学金融管理硕士项目——人生没有太晚的开始,不要过早的放弃

经常听到有人问&#xff0c;“我都快40了&#xff0c;现在学车晚不晚呢”“现在考研晚不晚&#xff1f;”“学画画晚不晚&#xff1f;”提出这些疑问的人&#xff0c;往往存在拖延&#xff0c;想法只停留在想的阶段&#xff0c;从来不去行动。当看到周边行动起来的人开始享受成…

JAVA JDBC连接mysql数据库

什么是驱动&#xff1f;驱动是指计算机系统中的一种软件程序&#xff0c;它用于控制硬件设备的操作。每个硬件设备都需要与操作系统进行通信&#xff0c;而操作系统需要知道如何与每个设备进行通信&#xff0c;这就是驱动程序的作用。什么是jdbc&#xff1f;JDBC 是 Java 数据库…

java中的LinkedList和ArrayList的选择和区别

一、LinkedList LinkedList同时实现了List接口和Deque对口&#xff0c;也就是收它既可以看作一个顺序容器&#xff0c;又可以看作一个队列&#xff08;Queue&#xff09;&#xff0c;同时又可以看作一个栈&#xff08;stack&#xff09;&#xff0c;这样看来&#xff0c;linke…

操作系统面试题

操作系统一、简介篇1.解释一下什么是操作系统2.操作系统的主要功能3.软件访问硬件的几种方式4.操作系统的主要目的是什么5.为什么Linux系统下的应用程序不能直接在Windows下运行6.什么是用户态和内核态7.用户态和内核态如何切换8.什么是内核二、进程和线程篇1.多处理系统的优势…

Raft分布式共识算法学习笔记

1. Raft算法 Raft算法属于Multi-Paxos算法&#xff0c;它是在Multi-Paxos思想的基础上&#xff0c;做了一些简化和限制&#xff0c;比如增加了日志必须是连续的&#xff0c;只支持领导者、跟随者和候选人三种状态&#xff0c;在理解和算法实现上都相对容易许多 从本质上说&am…

HTML 扫盲

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录前言HTML 结构快速生成代码框架HTML 常见标签注释标签标题标签: h1-h6段落标签&#xff1a;p换行标签&#xff1a;br格式化标签…

MySQL优化策略

1、 sql优化 1.1 SQL 语句简化&#xff0c;简化是 SQL 优化的一大利器&#xff0c;因为简单&#xff0c;所以优越。 1.2 尽可能避免或者杜绝多表复杂关联&#xff0c;大表关联是大表处理的噩梦&#xff0c;一旦打开了这个口子&#xff0c;越来越多的需求需要关联&#xff0c;…

HTTPS协议之SSL/TLS详解(下)

目录 前言&#xff1a; SSL/TLS详解 HTTP协议传输安全性分析 对称加密 非对称加密 证书 小结&#xff1a; 前言&#xff1a; 在网络世界中&#xff0c;存在着运营商劫持和一些黑客的攻击。如果明文传输数据是很危险的操作&#xff0c;因为我们不清楚中间传输过程中就被哪…

Spring从精通到入门

Spring1.spring了解2. Spring实现2.1 添加依赖2.2 Spring实现2.2.1 xml配置实现2.2.1.1 Bean标签属性1.spring了解 spring重要性 在当前的系统中&#xff0c;spring的重要性and占比性高达50%&#xff0c;无论是在ssm、ssh等框架中&#xff0c;spring始终屹立在前方&#xff0c;…