本文档为做者在学习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结构体。框架
如图 21所示:函数
图 21 I2C驱动框架学习
I2C核心提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通讯方法funcs上层的、与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等。spa
编写I2C设备或者I2C驱动须要用到的结构体,都已在核心层定义。核心层还提供了三种类型API接口(API_I2cAdapterCreate,API_I2cDeviceCreate,API_I2cDeviceTransfer等等)用于建立I2C适配器,建立I2C设备,调用I2C相应适配器下的总线传输函数。接口
I2C总线驱动是I2C适配器的软件实现,提供I2C适配器与从设备间完成数据通讯的能力。 I2C总线驱动由i2c_adapter和i2c_funcs来描述。文档
包含初始化I2C总线,操做函数集(总线传输Transfer函数,总线控制MasterCtl函数)。源码
I2C设备驱动是对I2C从设备的软件实现,一个具体的I2C设备驱动包括两个部分:一部分是i2c_device,用于将设备挂接于i2c总线;另外一部分是设备自己的驱动i2c_driver。 I2C设备驱动程序由i2c_device和i2c_driver来描述。ast
包含初始化I2C设备,操做函数集(例如:RTC设置时间SetTime函数,RTC获取时间GetTime函数)。模板
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设备层代码通常之内核模块方式动态加载进内核,能够在driver_module/i2c_drv目录下查看。
Lw_i2c_adapter结构体表明I2C总线控制器,如图 23所示:
图 23 I2C总线适配器
Lw_i2c_funcs对应一套通讯方法,如图 24所示:
图 24 I2C总线传输函数集
I2CFUNC_pfuncMasterXfer函数实现总线上数据传输,与具体的适配器有关。
I2CFUNC_pfuncMasterXfer函数实现模板,如图 25所示:
图 25 I2C传输函数实现模板
上面调用的函数用于完成适配器的底层硬件操做,与I2C适配器和CPU的具体硬件直接相关,须要由工程师根据芯片的数据手册来实现。在内核源码中,针对不一样的I2C适配器都有I2CFUNC_pfuncMasterXfer的实现,风格与模板不尽相同,可是能够用该模板做为参考来看源代码,受益不浅。
Lw_i2c_device表明I2C从设备,如图 26所示:
图 26 I2C设备类型
增长/删除I2C适配器,如图 27所示:
图 27 I2C适配器基本操做
增长/删除I2C设备,如图 28所示:
图 28 I2C设备基本操做
I2C传输,发送和接收,如图 29所示:
图 29 I2C设备传输控制操做
最终会调用到适配器实现的I2CFUNC_pfuncMasterXfer函数来完成数据传输工做。