SylixOS I2C驱动框架概述
-
适用范围
本文档为作者在学习I2C总线驱动过程中的总结。提供一些对SylixOS I2C驱动框架的理解经验。适用于学习I2C总线驱动或I2C设备驱动的技术工程师。
-
原理概述
-
概述
SylixOS I2C驱动框架主要由3部分组成,即I2C总线驱动、I2C核心层和I2C设备驱动。I2C核心层是I2C驱动和I2C设备驱动的中间枢纽,它以通用的、与平台无关的接口实现了I2C驱动中设备与适配器的沟通(已经存在,包含lw_i2c_adapter,lw_i2c_device,lw_i2c_funcs结构体)。I2C总线驱动填充lw_i2c_adapter和lw_i2c_funcs结构体;I2C设备驱动填充lw_i2c_device结构体。
-
I2C驱动框架图
如图 21所示:
图 21 I2C驱动框架
-
I2C三大组成部分
-
I2C核心层
I2C核心提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法funcs上层的、与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等。
编写I2C设备或者I2C驱动需要用到的结构体,都已在核心层定义。核心层还提供了三种类型API接口(API_I2cAdapterCreate,API_I2cDeviceCreate,API_I2cDeviceTransfer等等)用于创建I2C适配器,创建I2C设备,调用I2C相应适配器下的总线传输函数。
-
I2C总线驱动
I2C总线驱动是I2C适配器的软件实现,提供I2C适配器与从设备间完成数据通信的能力。 I2C总线驱动由i2c_adapter和i2c_funcs来描述。
包含初始化I2C总线,操作函数集(总线传输Transfer函数,总线控制MasterCtl函数)。
-
I2C设备驱动
I2C设备驱动是对I2C从设备的软件实现,一个具体的I2C设备驱动包括两个部分:一部分是i2c_device,用于将设备挂接于i2c总线;另一部分是设备本身的驱动i2c_driver。 I2C设备驱动程序由i2c_device和i2c_driver来描述。
包含初始化I2C设备,操作函数集(例如:RTC设置时间SetTime函数,RTC获取时间GetTime函数)。
-
I2C相关代码目录
-
I2C核心层代码位置
I2C核心层代码位于SylixOS/system/device/i2c目录下,如图 22所示:
图 22 I2C核心层代码目录
i2cBus.h I2C总线模型,包含总线传输控制消息块结构体,I2C总线适配器结构体,I2C总线传输函数集结构体。
i2cDev.h I2C总线挂载的设备结构,包含I2C设备类型结构体,I2C适配器基本操作声明,I2C 设备基本操作声明,I2C 设备传输控制操作声明。
i2cLib.c I2C设备操作库,定义i2cDev.h中声明的函数。
-
I2C总线层与设备层代码位置
I2C总线层与I2C设备层代码一般以内核模块方式动态加载进内核,可以在driver_module/i2c_drv目录下查看。
-
重要的数据结构
-
I2C总线适配器
Lw_i2c_adapter结构体代表I2C总线控制器,如图 23所示:
图 23 I2C总线适配器
Lw_i2c_funcs对应一套通信方法,如图 24所示:
图 24 I2C总线传输函数集
I2CFUNC_pfuncMasterXfer函数实现总线上数据传输,与具体的适配器有关。
-
I2C传输函数实现模板
I2CFUNC_pfuncMasterXfer函数实现模板,如图 25所示:
图 25 I2C传输函数实现模板
上面调用的函数用于完成适配器的底层硬件操作,与I2C适配器和CPU的具体硬件直接相关,需要由工程师根据芯片的数据手册来实现。在内核源码中,针对不同的I2C适配器都有I2CFUNC_pfuncMasterXfer的实现,风格与模板不尽相同,但是可以用该模板作为参考来看源代码,受益匪浅。
-
I2C设备类型
Lw_i2c_device代表I2C从设备,如图 26所示:
图 26 I2C设备类型
-
核心层提供的接口函数
增加/删除I2C适配器,如图 27所示:
图 27 I2C适配器基本操作
增加/删除I2C设备,如图 28所示:
图 28 I2C设备基本操作
I2C传输,发送和接收,如图 29所示:
图 29 I2C设备传输控制操作
最终会调用到适配器实现的I2CFUNC_pfuncMasterXfer函数来完成数据传输工作。
转载于:https://my.oschina.net/u/3248800/blog/831763