RK3568驱动指南|第十五篇 I2C-第169章I2C子系统框架学习

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。


【公众号】迅为电子

【粉丝群】258811263(加群获取驱动文档+例程)

【视频观看】嵌入式学习之Linux驱动(第十五篇 I2C_全新升级)_基于RK3568

【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板


第169章I2C子系统框架学习

可以将整个I2C子系统用下面的框图来描述:

可以将上面这一I2C子系统划分为三个层次,分别为用户空间、内核空间和硬件层,内核空间就包括I2C设备驱动层、I2C核心层和I2C适配器驱动层,而本章的主要内容就是介绍I2C子系统框架中的内核空间。

169.1 I2C设备驱动层

I2C设备驱动层的主要作用为编写驱动程序,使I2C外设能够正常工作,然后创建了对应的设备节点,提供了标准化的接口,使得上层应用程序能够方便地与I2C设备进行交互。

具体来说,I2C设备驱动层包含以下几个关键部分:

(1)i2c_client

·代表一个连接到I2C总线上的从设备

·包含从设备的地址、所属的I2C适配器等信息

(2)/dev/i2X设备节点

·为上层应用程序提供设备访问的接口

·通过打开/读写/控制设备节点,应用程序可以与I2C设备进行交互

·内核I2C子系统负责将应用程序的操作转发到对应的i2c_driver

(3)i2c_driver

·实现了具体I2C从设备的驱动程序

·负责设备的初始化、读写、配置等操作

·通过i2c_client与设备进行交互

·向上层提供设备访问的标准化接口

(4)I2C总线子系统

·管理整个I2C总线,包括注册/注销I2C适配器和从设备

·协调i2c_client和i2c_driver之间的交互

·为上层提供统一的I2C访问接口

169.2 I2C适配器驱动层

I2C适配器驱动层是I2C子系统的另一个重要组成部分,它负责实现具体的I2C硬件控制器的驱动程序。I2C适配器驱动程序的作用如下所示:

·提供标准化的I2C传输接口,供I2C核心层调用

·实现I2C总线协议的时序控制和数据收发

·管理I2C总线上的从设备

·处理I2C总线错误和异常情况

169.3 I2C核心层

I2C核心层位于I2C设备驱动层和I2C适配器驱动层中间,起到了承上启下的作用,负责I2C设备驱动层和I2C适配器驱动层之间数据的传递,I2C核心层的主要函数为i2c_master_send、i2c_master_recv和i2c_transfer,其中i2c_master_send和i2c_master_recv函数,是I2C核心层提供的基本读写接口。

i2c_master_send用于向I2C从设备发送数据,i2c_master_recv用于从从设备接收数据。

它们分别接受如下参数:

(1)struct i2c_client *client: 指向目标I2C从设备的指针

(2)const char *buf/char *buf: 数据缓冲区

(3)int count: 要发送/接收的字节数

这两个函数负责生成符合I2C协议的时序和数据帧,并通过对应的I2C适配器驱动程序进行实际的总线操作。

而i2c_transfer函数是一个更加综合的I2C传输函数,i2c_master_send和i2c_master_recv函数实际上便是调用的i2c_transfer,在后面的实验中,我们并不会直接调用i2c_master_send和i2c_master_recv函数进行数据的收发,而是通过i2c_transfer函数独立编写I2C数据收发函数,从而真正理解I2C数据收发的细节,i2c_transfer函数它接受如下参数:

(1)struct i2c_adapter *adap: 指向目标I2C适配器的指针

(2)struct i2c_msg *msgs: 指向一个I2C消息数组的指针

(3)int num: 消息数组中的消息数量

最后提出一个问题,既然已经在I2C设备驱动层中创建了对应的设备节点,根据前面在字符设备中讲解的知识,有了驱动程序就可以直接对I2C具体硬件进行操作了,但是在I2C子系统并不是这样实现的,而是添加了I2C核心层和I2C适配器驱动层,那为什么要这样设计呢?

最主要的原因是通过驱动分层可以解决多个应用同时访问一个I2C设备冲突的问题,除此之外通过这种模块化设计,可以提高了代码的复用性和可维护性,使得I2C 核心层和设备驱动程序可以独立开发和升级,I2C 适配器驱动程序也可以针对不同的硬件平台进行优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值