• 适用范围

    本文档为作者在学习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函数来完成数据传输工作。