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

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

3天内不再提示

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

firefly 来源:firefly 作者:firefly 2019-11-26 17:00 次阅读
I2C 使用
前言

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

  • 配置 I2C 可分为两大步骤:
    • 定义和注册 I2C 设备
    • 定义和注册 I2C 驱动

下面以配置 lt8641ex 为例。

定义和注册 I2C 设备

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

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

&i2c1 { status = "okay"; lt8641ex@3f { compatible = "firefly,lt8641ex"; gpio-sw = <&gpio7 GPIO_B2 GPIO_ACTIVE_LOW>; reg = <0x3f>; }; rtc@51 { compatible = "nxp,pcf8563"; reg = <0x51>; }; };
定义和注册 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

    文章

    10990

    浏览量

    206738
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6064

    浏览量

    34614
  • 可制造性设计

    关注

    10

    文章

    2063

    浏览量

    15306
  • Firefly
    +关注

    关注

    2

    文章

    534

    浏览量

    6757
  • 华秋DFM
    +关注

    关注

    20

    文章

    3483

    浏览量

    3909
收藏 人收藏

    评论

    相关推荐

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

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

    RK3288开发板的相关资料下载

    概述昨天收到开发板,安耐不住自己躁动的心暂时放弃这两天的C语言复习先提前熟悉一下开发板,我买的是Firefly出的开源主板RK3288。折腾了一天虽然收获很大但是基本没有实际成果,一整
    发表于 12-27 06:55

    为什么Firefly-RK3288主板烧写Android固件会失败呢

    为什么Firefly-RK3288主板烧写Android固件会失败呢?怎样去解决这个问题呢?
    发表于 03-04 07:53

    rk3288平台PCA9685的i2c-tools使用步骤

    [root@firefly-rk3288:~]# i2cdetect -y -a 40123456789abcdef00: 00
    发表于 05-11 14:31

    Firefly-RK3288用户指南

    电脑。Firefly-RK3288 除了可以当作电视盒子,微型电脑使用,还适用于多种的领域。Firefly-RK3288 板级支持红外、蓝牙 4.0、双频 WIFI、4K*2K 高清输出,及丰富的外围扩展接口,可以满足
    发表于 10-10 07:35

    Firefly-RK3288--教程

    Firefly-RK3288 的标准套装包含以下配件:   Firefly-RK3288 主板一块   WiFi 天线   亚克力
    的头像 发表于 11-11 16:04 4060次阅读
    <b class='flag-5'>Firefly-RK3288</b>--教程

    Firefly-RK3288--外壳

    外壳 Firefly-RK3288 CAD图
    的头像 发表于 11-25 10:14 950次阅读
    <b class='flag-5'>Firefly-RK3288</b>--外壳

    Firefly-RK3288开发板介绍

    Firefly-RK3288 开发板内置 5 路 UART,分别为 uart0,uart1,uart2,uart3,uart4。 uart0 为 uart_bt,用于蓝牙传输。
    的头像 发表于 11-25 10:27 2598次阅读
    <b class='flag-5'>Firefly-RK3288</b>开发板<b class='flag-5'>介绍</b>

    Firefly-RK3288PWM输出介绍

    Firefly-RK3288 开发板上有 4 路 PWM 输出,分别为 PWM0 ~ PWM3, 本章主要描述如何配置 PWM。
    的头像 发表于 11-25 10:31 1956次阅读

    Firefly-RK3288 LED介绍

    Firefly-RK3288 开发板上有 2 个 LED 灯
    的头像 发表于 11-25 10:39 2236次阅读
    <b class='flag-5'>Firefly-RK3288</b> LED<b class='flag-5'>介绍</b>

    Firefly-RK3288--IR主板介绍

    Firefly-RK3288/Firefly-RK3288-Reload开发板上使用红外收发传感器 IR (在 USB OTG 接口和音频接口之间)实现遥控功能。
    的头像 发表于 11-26 17:10 2490次阅读
    <b class='flag-5'>Firefly-RK3288</b>--IR<b class='flag-5'>主板</b><b class='flag-5'>介绍</b>

    Firefly-RK3288--DVP开发板介绍

    Firefly-RK3288-Reload 开发板带有一个 DVP 摄像头接口。 本文以 OV5640 摄像头为例,讲解在该开发板上的配置过程。
    的头像 发表于 11-26 17:19 4586次阅读
    <b class='flag-5'>Firefly-RK3288</b>--DVP开发板<b class='flag-5'>介绍</b>

    Firefly-RK3288ADB主板介绍

    Firefly-RK3288/Firefly-RK3288-Reload 默认是打开USB调试选项。如果需要在关闭或打开USB调试选项,可以 在设置-关于设备-版本号(点击7次后),然后返回到上一层,可以看到
    的头像 发表于 10-28 19:22 1828次阅读
    <b class='flag-5'>Firefly-RK3288</b>ADB<b class='flag-5'>主板</b><b class='flag-5'>介绍</b>

    Firefly-RK3288主板启动教程

    RK3288 有灵活的启动方式。一般情况下,除非硬件损坏,Firefly-RK3288 开发板是不会变砖的。
    的头像 发表于 11-27 09:14 5540次阅读
    <b class='flag-5'>Firefly-RK3288</b><b class='flag-5'>主板</b>启动教程

    Firefly-RK3288产品规格书

    电子发烧友网站提供《Firefly-RK3288产品规格书.pdf》资料免费下载
    发表于 09-15 16:12 1次下载
    <b class='flag-5'>Firefly-RK3288</b>产品规格书