![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux驱动之I2C
阿曼
这个作者很懒,什么都没留下…
展开
-
I2C子系统之at24c02读写测试
结合ioctl和at24c02的介绍,写了个at24c02的测试程序测试硬件平台:TQ2440、at24c02内核版本:linux-2.6.37.1读写单独分开成两个小程序。源码如下:写测试程序:#include #include #include #include #include #include int main(int argc, char *argv[]原创 2012-08-14 20:43:47 · 6696 阅读 · 0 评论 -
i2c子系统之at24c02简介
AT24C02存储规格总共32个page,每个page为8byte。总共256KB(2Kb),地址的长度需要使用8bit(刚好可以用来表示256个字节的地址)来表示。AT24CC02的地址设备的地址由8bit组成,前4 bit是固定的(1010);接着的3 bit是和A2 A1 A0的硬件连接相关,通过指定这3 bit原创 2012-08-13 22:24:34 · 7323 阅读 · 0 评论 -
I2C子系统之ioctl()
根据前一篇的文章介绍 at24c02的读写方式有很多种,写有两种1.写一字节数据到word address处2.从指定的word address处开始写一页数据,此word address需要页对齐!读有三种1.从at24c02当前的word address读一字节数据2.从指定的word address 读数据3.从当前的word address地址开始读一串数据根据驱动中wri原创 2012-08-14 11:48:26 · 4703 阅读 · 0 评论 -
i2c子系统之write()
应用层调用write()函数后首先进入的是i2c类设备的write函数,即i2cdev_fops中的write方法。此处的i2cdev_fops对应的是系统中所有i2c类设备的操作。也就是说系统中所有i2c adapter 的read()write() open() close() ioctl()等操作,首先调用的是i2c类i2cdev_fops中的方法,通过i2c类中的方法再去寻找a原创 2012-04-14 19:59:52 · 8026 阅读 · 0 评论 -
i2c子系统之i2c bus初始化——i2c_init()
根据前文的分析,在linux内核启动的时候最先执行的和I2C子系统相关的函数应该是driver/i2c/i2c-core.c文件中的i2c_init()函数。下面具体此函数具体做了那些预备工作。1.i2c总线的注册i2c_init()的函数实现如下:static int __init i2c_init(void) { ... ... re原创 2012-04-07 13:36:52 · 9174 阅读 · 0 评论 -
i2c子系统之adapter device和client device注册——i2c_add_number_adapter()
如前文所述,在probe函数会调用函数i2c_add_number_adapter(),通过此函数来实现adapter device和client device的注册i2c_add_number_adapter()函数如下:int i2c_add_numbered_adapter(struct i2c_adapter *adap){ int id; int status;原创 2012-04-07 19:07:03 · 7629 阅读 · 2 评论 -
i2c子系统之 adapter driver注册——i2c_dev_init()
i2c的操作在内核中是当做字符设备来操作的,相关初始化在由i2c_dev_init函数来初始化。并且i2c adapter的驱动通过i2cdev_driver这个通用驱动的attach方法来实现注册的。下面具体分析整个过程。1.i2c_dev_init函数static int __init i2c_dev_init(void){ 。。。 。。。 res原创 2012-04-14 14:41:20 · 5685 阅读 · 1 评论 -
i2c子系统之platform_driver初始化——i2c_adap_s3c_init()
在完成platform_device的添加之后,i2c子系统将进行platform_driver的注册过程。platform_driver的注册通过调用初始化函数i2c_adapter_s3c_init函数来完成。i2c_adap_s3c_init()函数体如下:static int __init i2c_adap_s3c_init(void){ return plat原创 2012-04-07 17:32:37 · 2875 阅读 · 3 评论 -
i2c子系统之内核中I2C子系统的结构
本文开始,分析内核的i2c子系统。说明:1.分析的内核版本为2.6.37.1 2.开发板为TQ2440,板载ARM9(S3C2440) 3.I2C设备为AT24C02 4.分析顺序就是内核I2C子系统的注册顺序(即本系列文章发表的先后顺序)。在正式进入代码分析前应摸清各初始化函数的执行先后顺序,清楚这个顺序原创 2012-04-07 11:59:36 · 2883 阅读 · 0 评论 -
i2c子系统之platfor_device初始化——smdk2440_machine_init()
调用完函数i2c_init后,系统将成功创建i2c总线。初始化完毕总线后还需要接着初始化i2c设备和i2c驱动(一般是先初始化device),对于2440来说,linux内核中的device初始化一般是通过platform device来初始化的,platform device的初始化在/arch/arm/mach-s3c2440/mach-smdk2440.c文件中的smdk2440原创 2012-04-07 14:56:37 · 4307 阅读 · 5 评论 -
i2c子系统之__i2c_first_dynamic_bus_num变量的相关分析
__i2c_first_dynamic_bus_num定义的位置在/driver/i2c/i2c-boardinfo.c#include #include 。。。 。。。int __i2c_first_dynamic_bus_num;EXPORT_SYMBOL_GPL(__i2c_first_dynamic_bus_num);。。。 。。。int __initi2c_原创 2012-04-07 19:10:15 · 3052 阅读 · 0 评论 -
i2c子系统之i2c总线时钟频率设置
时钟相关基本知识可先参考这篇博文:http://blog.csdn.net/yyplc/article/details/7085034下面直接从总线时钟初始化函数开始分析:void __init s3c244x_init_clocks(int xtal){ /* initialise the clocks here, to allow other things like the原创 2012-04-07 18:48:28 · 22053 阅读 · 0 评论 -
I2C子系统之总结
I2C子系统的结构是符合内核总的驱动模型。I2C 子系统主要包含4大部件1.i2c bus2.adapter device3.client device4.adapter driver其中i2c bus是用于管理的,并非是通信总线。i2c bus上挂着adapter(主机) device、client(从机) device、adapter driver。为了统一原创 2012-08-14 23:15:13 · 1574 阅读 · 2 评论