第四期 第二十二讲 Linux IIC驱动实验

一、I2C驱动框架

1.1 裸机下的I2C驱动框架

首先编写IIC控制器驱动,bsp_i2c.c和bsp_i2c.h为IIC外设驱动。向外提供i2c_master_transfer函数。

不管是什么IIC芯片,

bsp_3216c.c和bsp_3216c.h为IIC设备驱动

1.2、Linux下的I2C驱动框架

1.3、I2C总线驱动

I2C适配器在内核里面使用i2c__adapter结构体,IIC适配器驱动(控制器)核心就是申请i2c_adapter结构体,然后初始化,最后注册!

初始化完成i2c_adapter以后,使用i2c_add_adapter或者i2c_add_numbered_adapter来向内核注册I2C控制器驱动。

在i2c_adapter里面有个非常重要的成员变量:i2c_algorithm,次变量包含了IIC控制器访问IIC设备的API接口函数,需要I2C适配器编写人员实现。

i2c_adapter

-》 i2c_algorithm

-> master_xfer, 次函数就是I2C控制器最终进行数据收发的函数。

经过查找,I.MX6U的I2C适配器驱动是i2c-imx.c,驱动与设备匹配成功以后,i2c_imx_probe

NXP创建了一个imx_i2c_struct结构体,包含I.MX6U的I2C相关属性,这个结构体里面就有i2c_adapter

struct imx_i2c_struct {

struct i2c_adapter adapter;

struct clk *clk;

void __iomem *base;

wait_queue_head_t queue;

unsigned long i2csr;

unsigned int disable_delay;

int stopped;

unsigned int ifdr; /* IMX_I2C_IFDR */

unsigned int cur_clk;

unsigned int bitrate;

const struct imx_i2c_hwdata *hwdata;

struct imx_i2c_dma *dma;

};

设置i2c_adapter下的i2c_algorithm为i2c_imx_algo!

static struct i2c_algorithm i2c_imx_algo = {

.master_xfer = i2c_imx_xfer,

.functionality = i2c_imx_func,

};

通过I.MX6U的I2C控制器读取IIC或者向IIC设备写入数据的时候最终是通过i2c_imx_xfer函数来完成的,

1.4、I2C设备驱动

i2c_client:表示I2C设备,不需要我们自己创建i2c_client,我们一般在设备树里面添加具体的I2C芯片,比如fxls8471,系统在解析设备树的时候就会知道有这个I2C设备,然后会创建对应的i2c_client,

i2c设备驱动框架,i2c­­_driver初始化与注册,需要II2C设备驱动编写人员编写的,IIC驱动程序就是初始化i2c_driver,然后向系统注册。注册使用i2c_register_driver、i2c_add_driver,如果注销i2c_driver使用i2c_del_driver

1.5、添加I2C设备信息

i2c_transfer函数进行I2C数据传输。

二、驱动编写与测试

在I2C1上接了一个AP3216C,UART4_RXD作为I2C1_SDA,UART4_TXD作为I2C1_SCL

1、修改设备树,IO、添加AP3216C设备节点

2、编写驱动框架,I2C设备驱动框架,字符设备驱动框架。

3、初始化AP3216C,实现ap3216c_read函数。

重点就是通过IIC控制器来向AP3216C里面发送或者读取数据。这里使用i2c_transfer这个api函数来完成IIC数据的传输。

int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)

adap:IIC设备对应的适配器,也就是IIC接口,当IIC设备和驱动匹配以后,probe函数执行,probe函数传递进来的第一个参数就是i2c_client,在i2c_client里面保存了此I2C设备所对应的i2c_adapter。

msgs:就是构成的I2C传输数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值