MTK I2C驱动代码分析

本文详细分析了MTK平台下的I2C驱动代码,讲解了I2C总线的工作原理,包括数据传输、开始和结束信号、应答信号等。并深入探讨了I2C驱动的注册过程,如`i2c_register_board_info`和`i2c_add_numbered_adapter`函数的作用。此外,还介绍了设备驱动如何通过`i2c_transfer`进行数据发送,并以QN8027驱动为例进行说明。

   I2C总线(I2C bus,Inter-IC bus)是一个双向的两线连续总线,提供集成电路(ICs)之间的通信线路。I2C总线是一种串行扩展技术,最早由Philips公司推出。Philips公司推出的I2C总线采用一条数据线(SDA),加一条时钟线(SCL)来完成数据的传输及外围器件的扩展;对各个节点的寻址是软寻址方式,节省了片选线,标准的寻址字节SLAM为7位,可以寻址127个单元。
 I2C总线有三种数据传输速度:标准,快速模式和高速模式。标准的是100Kbps,快速模式为400Kbps,高速模式支持快至3.4Mbps的速度。

 

I2C位传输

   数据传输:SCL为高电平时,SDA线若保持稳定,那么SDA上是在传输数据bit;若SDA发生跳变,则用来表示一个会话的开始或结束(后面讲)
   数据改变:SCL为低电平时,SDA线才能改变传输的bit

I2C开始和结束信号
   开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
   结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。

I2C应答信号
   Master每发送完8bit数据后等待Slave的ACK。
   即在第9个clock,若从IC发ACK,SDA会被拉低。
   若没有ACK,SDA会被置高,这会引起Master发生RESTART或STOP流程,如下所示:

SCL is a clock signal that is driven by the master. SDA is a bi-directional data signal that can be driven by either the master or the slave.

 

I2C架构图:

代码分析:

kernel-3.10\drivers\misc\mediatek\i2c\mt6735\I2c.c 

(注:所有的i2c驱动,在该模块加载前就已经加载,调用i2c_register_board_info函数加载的board_info信息,已经加入__i2c_board_list链表)。

设备驱动以qn8027为例。


第16071623行,在device tree上找到AP_DMA结点,见kernel-3.10/arch/arm64/boot/dts/mt6735m.dtsi

DT的相关知识请参考:http://blog.youkuaiyun.com/21cnbao/article/details/8457546

第1624行执行platform_driver_register(&mt_i2c_driver);


第1508行,初始化i2c->wait等待对列。

第1510行,注册下降沿中断,中断处理函数为mt_i2c_irq。该函数读取I2C中断状态,唤醒等待对列i2c->wait队列。

第1521行,调用i2c_add_numbered_adapter(&i2c->adap);该函数会调用到__i2c_add_numbered_adapter,其代码如下:

1090行,分配ID号,IDR机制具体描述如下:

IDR机制在Linux内核中指的是整数ID管理机制。实质上来讲,这就是一种将一个整数ID号和一个指针关联在一起的机制。这个机制最早在032月加入内核,当时作为POSIX定时器的一个补丁。现在,内核中很多地方都可以找到它的身影。

IDR机制适用在那些需要把某个整数和特定指针关联在一起的地方。例如,在IIC总线中,每个设备都有自己的地址,要想在总线上找到特定的设备,就必须要先发送设备的地址。当适配器要访问总线上的IIC设备时,首先要知道它们的ID号,同时要在内核中建立一个用于描述该设备的结构体,和驱动程序。将ID号和设备结构体结合起来,如果使用数组进行索引,一旦ID号很大,则用数组索引会占据大量内存空间。这显然不可能。或者用链表,但是,如果总线中实际存在的设备很多,则链表的查询效率会很低。此时,IDR机制应运而生。该机制内部采用红黑树实现,可以很方便的将整数和指针关联起来,并且具有很高的搜索效率。

1096行调用i2c_register_adapter注册adapter,主要代码如下:

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值