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

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

3天内不再提示

Firefly-RK3128主板I2C控制器

firefly 来源:firefly 作者:firefly 2019-11-29 08:47 次阅读
I2C 使用
前言

Firefly-RK3128 开发板上有 4 个片上 I2C 控制器。本文主要描述如何在该开发板上配置 I2C。

配置 I2C 可分为两大步骤:

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

下面以配置 lt8641ex 为例。

定义和注册 I2C 设备

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

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

&i2c0 { status = "okay"; lt8641ex@3f { compatible = "firefly,lt8641ex"; gpio-sw = <&gpio7 GPIO_B2 GPIO_ACTIVE_LOW>; reg = <0x3f>; }; };
定义和注册 I2C 驱动
定义 I2C 驱动

在定义 I2C 驱动之前,用户首先要定义变量 of_device_id 和 i2c_device_id 。of_device_id 用于在驱动中调用dts文件中定义的设备信息,其定义如下所示:

static const struct of_device_id of_rk_lt8641ex_match[] = { { .compatible = "firefly,lt8641ex" },{ /* Sentinel */ }};

定义变量 i2c_device_id:

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

i2c_driver 如下所示:

static struct i2c_driver lt8641ex_device_driver = { .driver = { .name = "lt8641ex", .owner = THIS_MODULE, .of_match_table = of_rk_lt8641ex_match, }, .probe = lt8641ex_probe, .remove = lt8641ex_remove, .suspend = lt8641ex_suspend, .resume = lt8641ex_resume, .id_table = lt8641ex_id,};

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

注册 I2C 驱动

使用i2c_add_driver函数注册 I2C 驱动。

i2c_add_driver(&lt8641ex_device_driver);

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

通过 I2C 收发数据

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

  • 向从机发送信息
static int i2c_master_reg8_send(const struct i2c_client *client, const char reg, const char *buf, int count, int scl_rate) { struct i2c_adapter *adap=client->adapter; struct i2c_msg msg;int ret; char *tx_buf = (char *)kzalloc(count + 1, GFP_KERNEL); if(!tx_buf) return -ENOMEM; tx_buf[0] = reg; memcpy(tx_buf+1, buf, count); msg.addr = client->addr; msg.flags = client->flags; msg.len = count + 1; msg.buf = (char *)tx_buf; msg.scl_rate = scl_rate; ret = i2c_transfer(adap, &msg, 1); kfree(tx_buf); return (ret == 1) ? count : ret; }
  • 向从机读取信息
static int i2c_master_reg8_recv(const struct i2c_client *client, const char reg, char *buf, int count, int scl_rate) { struct i2c_adapter *adap=client->adapter; struct i2c_msg msgs[2]; int ret; char reg_buf = reg; msgs[0].addr = client->addr; msgs[0].flags = client->flags; msgs[0].len = 1; msgs[0].buf = ®_buf; msgs[0].scl_rate = scl_rate; msgs[1].addr = client->addr; msgs[1].flags = client->flags | I2C_M_RD;msgs[1].len = count; msgs[1].buf = (char *)buf; msgs[1].scl_rate = scl_rate; ret = i2c_transfer(adap, msgs, 2); return (ret == 2)? count : ret; }

注:msgs[0] 是要向从机发送的信息,告诉从机主机要读取信息。msgs[1] 是主机向从机读取到的信息。

至此,主机可以使用函数 i2c_master_reg8_send 和 i2c_master_reg8_recv 和从机进行通讯。

  • 实际通讯示例

例如主机和 LT8641EX 通讯,主机向 LT8641EX 发送信息,设置 LT8641EX 使用通道 1:

int channel=1;i2c_master_reg8_send(g_lt8641ex->client, 0x00, &channel,1, 100000);

注:通道寄存器的地址为0x00。 主机向从机 LT8641EX 读取当前使用的通道:

u8 ch = 0xfe;i2c_master_reg8_recv(g_lt8641ex->client, 0x00, &ch,1, 100000);

注:ch用于保存读取到的信息。


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

    关注

    87

    文章

    10991

    浏览量

    206736
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6064

    浏览量

    34614
  • Firefly
    +关注

    关注

    2

    文章

    534

    浏览量

    6757
收藏 人收藏

    评论

    相关推荐

    Videostrong商显主板RK3288 I2C 通讯介绍资料

    Videostrong商显主板RK3288 I2C 通讯介绍资料1 Rockchip I²C功能特点I
    发表于 06-15 10:11

    如何解决firefly rk3128 linux内核适配问题?

    如何解决firefly rk3128 linux内核适配问题?
    发表于 03-04 06:17

    Firefly-RK3128开发板上手教程(上)

    1、Firefly-RK3128开发板入手指南配件Firefly-RK3128 的标准套装包含以下配件:Core-3128J 核心板一块Firefly-RK3128 基板一块WiFi
    发表于 08-12 17:32

    Firefly-RK3128开发板上手教程(下)

    1、如何将主机上的固件文件通过双公头USB数据线烧录到开发板的闪存中准备工作Firefly-RK3128 开发板固件主机良好的 Micro USB OTG 线固件文件一般有两种:单个统一固件
    发表于 08-12 17:51

    Firefly-RK3128 MIPI DSI使用步骤说明

    screen-type属性:显示屏类型,Firefly-RK3128只支持单通道MIPI屏,配置成SCREEN_MIPI即可。lvds-format属性:无关选项。out-face属性:配置颜色,可为OUT_P888
    发表于 08-22 17:12

    firefly RK3128开发板介绍

    Firefly-RK3128 采用Cortex-A7架构四核1.3GHz处理器,集成Mali-400MP2 GPU, 拥有优秀的运算与图形处理能力;板载千兆以太网口、2.4GHz Wi-Fi和蓝牙4.0
    的头像 发表于 11-14 11:27 3845次阅读
    <b class='flag-5'>firefly</b> <b class='flag-5'>RK3128</b>开发板介绍

    Firefly-RK3288--I2C主板的使用介绍

    Firefly-RK3288 开发板上有 6 个片上 I2C 控制器。本文主要描述如何在该开发板上配置 I2C
    的头像 发表于 11-26 17:00 2425次阅读
    <b class='flag-5'>Firefly-RK</b>3288--I2C<b class='flag-5'>主板</b>的使用介绍

    Firefly-RK3128主板PWM输出介绍

    Firefly-RK3128 开发板上有 4 路 PWM 输出,分别为 PWM0 ~ PWM3
    的头像 发表于 11-28 16:56 1991次阅读
    <b class='flag-5'>Firefly-RK3128</b><b class='flag-5'>主板</b>PWM输出介绍

    Firefly-RK3128主板LED子系统介绍

    Firefly-RK3128 开发板上有 2 个 LED 灯
    的头像 发表于 11-28 17:01 2485次阅读
    <b class='flag-5'>Firefly-RK3128</b><b class='flag-5'>主板</b>LED子系统介绍

    Firefly-RK3128开发板摄像头的介绍

    Firefly-RK3128 开发板上有 CIF 接口,支持 CIF 摄像头。
    的头像 发表于 11-28 16:48 3336次阅读
    <b class='flag-5'>Firefly-RK3128</b>开发板摄像头的介绍

    Firefly-RK3128主板ADC简介

    Firefly-RK3128 开发板有一个 3 通道(0/1/2)、10 比特精度的 SAR ADC (Successive Approximation Register,逐次逼近寄存器),
    的头像 发表于 11-28 17:17 3103次阅读
    <b class='flag-5'>Firefly-RK3128</b><b class='flag-5'>主板</b>ADC简介

    Firefly-RK3128主板接口定义介绍

    Firefly-RK3128 开发板提供了丰富的接口,主要包括:HDMI、音频数字光纤、以太网、电源接口、复位按键、电源键、音频输入输出、硅麦、串口调试接口、红外接收、OTG接口、TF卡槽、USB Host1~4、
    的头像 发表于 11-29 08:45 3033次阅读
    <b class='flag-5'>Firefly-RK3128</b><b class='flag-5'>主板</b>接口定义介绍

    FireflyRK3128主板外壳介绍

    外壳 Firefly-RK3128 CAD图 核心板 底板 Firefly-RK3128 外壳亚克力CAD图
    的头像 发表于 11-29 09:19 955次阅读
    FireflyRK<b class='flag-5'>3128</b><b class='flag-5'>主板</b>外壳介绍

    Firefly-RK3128主板启动模式简介

    Firefly-RK3128 有灵活的启动方式。
    的头像 发表于 11-29 09:27 4637次阅读

    Firefly-RK3128主板串口调试

    Firefly-RK3128 开发板的调试串口与 TF 卡接口有信号引脚复用,因此无法同时使用
    的头像 发表于 11-29 09:47 2986次阅读
    <b class='flag-5'>Firefly-RK3128</b><b class='flag-5'>主板</b>串口调试