S3C2440 Linux下的I2C驱动以及I2C体系下对EEPROM进行读写操作。

本文详细介绍了Linux系统下S3C2440芯片的I2C驱动,包括I2C总线驱动、I2C核心和设备驱动的组成部分。讲解了I2C驱动体系结构的三个关键部分:I2C总线驱动、I2C核心和I2C设备驱动。通过具体的设备驱动实例——针对AT24C02 EEPROM的驱动代码,阐述了如何使用i2c-dev.c提供的接口进行读写操作,并分析了I2C传输过程中的时序和页写缓冲器的工作原理。
摘要由CSDN通过智能技术生成
这篇文档算上期末复习这段时间其实拖了有好久了,因为从一开始接触linux的i2c驱动体系我就各种凌乱,因为起初脑海中既没有整体框架也不熟悉相关体系下的结构,所以四处乱看,经常性的在看内核代码时看着看着就把自己看飞了。结果就总是无功而返。现在我决定当前阶段把结构熟悉,知道大致的驱动体系框架。日后真正做到此类项目时再来深入理解、巩固、总结。

因为我所要操作的EEPROM使用的是I2C接口。那么自然要先了解一下I2C总线协议。对于I2C总线协议我的理解:两条线“SCL和SDA”,一个数据信号一个时钟脉冲信号。俩线都是高电平时,SDA从高到低发出一个跳变,便是开始信号;然后就是发送数据。若SDA从低到高再跳变一次就是结束信号。这期间,SCL为高时SDA必须保持稳定无变化,因为SCL为高时会采样数据。若此时SDA变化,可能导致误发结束信号而产生终止。也就是说SCL高,SDA保持稳定,则数据有效,SDA的改变只能发生在SCL的低电平期间。当然接收器每接收一个字节数据都会产生一个ASK回应信号,表示已经收到数据。
下面是I2C总线的传输时序图。

再具体到Linux下驱动子系统I2C驱动体系结构(I2C总线驱动;I2c核心;I2C从设备驱动):
首先我们要知道,I2c驱动体系中一般来说硬件上可含有一个或多个从设备,一个或多个适配器,这俩之间的关系:一个适配器可以控制多个从设备;且我们既可以通过直接编写从设备驱动来操控他,也可以通过操作适配器来操控从设备。

现在这样来理解:linux下的I2C驱动子系统,相对硬件来说肯定必须得先有驱动。有了驱动从设备才能有效工作,才能软性的帮助适配器操控从设备工作。所以对于S3C2440开发板我们要知道:

 (1)2440中的I2C控制器(i2c-s3c2410)有一个驱动(s3c2440中的I2C适配器驱动基于platform实现)。这个用来操作控制器来产生特定的I2C的时序信号,来发送数据和接收数据。也就是让适配器工作。

(2)挂接在I2C总线上的从设备AT24C02(e2prom)为例,它也有一个驱动,这个用来操作读写我们的芯片,读取和存放具体获得的数据。

在Linux系统中,上述的两个驱动,第一个属于I2C总线驱动,第二个属于I2C设备驱动。

======================================================================================================

上面说到了I2C总线驱动I2C设备驱动,对于I2C驱动体系结构还有个最重要的就是I2C核心(出厂时内核已经自带)。既然是核心,那自然是通过一系列的通信方法(algorithm)把总线驱动,设备驱动与用户层串起来,其中还包括有总线驱动和设备驱动的注册,注销方法。

======================================================================================================

现在我们知道:I2C驱动体系结构分为三大部分:I2C总线驱动; I2C 核心; I2C设备驱动。 

=====================================================================================================
注意:一般来说,如果CPU中集成了I2C控制器并且Linux内核支持这个CPU,那么总线驱动方面就不用我们操心了,内核已经做好了。但如果CPU中没有I2C控制器,而是外接的话,那么就要我们自己实现总线驱动了。对于设备驱动来说,一般常用的驱动也都包含在内核中了,如果我们用了一个内核中没有的芯片,那么就要自己来写了。
=====================================================================================================

第一部分:

Linux中的I2C总线驱动(s3c2440的总线驱动i2c-s3c2410.c)

定义描述具体I2C总线适配器的i2c_adapter数据结构、实现在具体I2C适配器上的I2C总线通信方法,并由i2c_algorithm数据结构进行描述。 经过I2C总线驱动的的代码,可以为我们控制I2C产生开始位、停止位、读写周期以及从设备的读写、产生ACK等。
I2C总线驱动具体实现在/drivers/i2c目录下busses文件夹。例如:Linux I2C GPIO总线驱动为i2c_gpio.c. I2C总线算法在/drivers/i2c目录下algos文件夹。例如:Linux I2C GPIO总线驱动算法实现在i2c_algo_bit.c.

T:I2C总线适配器由i2c_adapter结构体描述;I2C适配器上的I2C总线通信方法由i2c_algorithm结构体描述。一个总线驱动用于支持一条特定的I2C总线的读写。一个总线驱动通常需要两个模块,struct i2c_adapter和struct i2c_algorithm来描述

I2C_adapter:构造一个对I2C core层接口的数据结构,并通过接口函数向I2C core注册一个控制器adapter。

i2c_algorithm主要实现对I2C总线访问通信的具体算法。

第二部分:

Linux中的I2C设备驱动(at24.c属于s3c2440的设备AT24C02的驱动代码)

是对具体I2C硬件驱动的实现。I2C 设备驱动通过I2C适配器与CPU通信。其中主要包含i2c_driveri2c_client数据结构,i2c_driver结构对应一套具体的驱动方法,例如:probe、remove、suspend等,需要自己申明。i2c_client数据结构由内核根据具体的设备注册信息自动生成,设备驱动根据硬件具体情况填充。具体使用下面介绍。

I2C 设备驱动具体实现放在在/drivers/i2c目录下chips文件夹。

i2c-dev.c:提供了用户层对I2C设备的访问,包括open,read,write,ioctl,release等常规文件操作,我们可以通过open函数打开 I2C的设备文件,通过ioctl函数设定要访问从设备的地址,然后可以通过 read和write或者ioctl函数完成对I2C设备的读写操作。

I2C_client:对应于真实的物理设备,结构体中包含了芯片地址,设备名称,设备使用的中断号,设备所依附的控制器,设备所依附的驱动等内容。

第三部分:

I2C core核心(s3c2440的代码i2c-core.c)

提供了核心数据结构的定义和相关接口函数,用来实现I2C适配器驱动和设备驱动的注册、注销管理,以及I2C通信方法上层的、与具体适配器无关的代码以及探测设备,检测设备地址的上层代码,为系统中每个I2C总线增加相应的读写方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值