瑞芯微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 适配器驱动程序也可以针对不同的硬件平台进行优化。