文档详情

Arm Linux I2C总线驱动代码分析.doc

发布:2018-08-11约6.89千字共8页下载文档
文本预览下载声明
Arm Linux I2C总线驱动代码分析 实际上在较新的代码中(如笔者现在用的linux-2.6.30)里面其实己经有一个通用的I2C驱动了。所以在一些简单的场合,我们其实可以不用再去写驱动,只要会用就可以了,但是会用也不是一件很简单的事情,因为关于这方面的内容很少,有些时候,我们不得不去分析一下代码,才能明白如何去用。 I2C的代码是比较少的,因为协议本身也不是很复杂。我们可以从他的代码目录开始讲起。 Linux中,关于I2C的驱动代码C文件基本上都放在drivers/i2c目录下。 此文件夹包含了linux系统里的i2c实现的主要代码。 内容包括三个子文件夹,和三个.c文件。 algos主要包含的是一个些总线传递数据时的时序算法。 busses包含的是不同平台上的i2c总线低层驱动方法。 chips包含的是一个些己知芯的驱动方法。 .c文件 i2c-core.c,这个文件是i2c驱动代码核心,用于沟通VFS与低层实现。 i2c-dev.c这是一个通用的驱动,基本上大多数i2c驱动都可以通过调用这个操作。它在/dev下生成一个主设备号为89的i2c设备。它主要实现了与VFS中规定的操作。 i2c-boardinfo.c包含一此板级信息。总共的代码不是很多。正上面引用的那段所说,我们要关心的代码实在是不多, 从编译过的代码目录里,我们找到一些踪迹,我的代码树是针对mini2440进行编过的,通过查看.o文件,笔者发现,其实真正参加编译的只有如下几个文件: 根目录下的:i2c-core.c i2c-dev.c i2c-boardinfo.c drivers/i2c/algos目录下的:i2c-algo-bit.c drivers/i2c/busses目录下的:i2c-s3c2410.c 总共五个。文件虽少,所涉及的结构体嵌套却是十分复杂。笔者曾经试首整理,结果却发现头绪乱得很,终也没能整理出一个明白的线路来。 以笔者的经验来说,看一看Linux设备驱动开发详解这本书,是非常有益于理解的,但是笔者也发现,其中所整理的图表也不是完善,但在笔者看来,能整理到那个程度,却己经是相当不容易的了。 下面说一下上面所提到的五个文件,上面的三个在引用部他己有说明。下面的两个i2c-algo-bit.c主要是涉能一些算法相关的内容。而i2c-s3c2410.c则是平台相关的i2c适配器驱动,也即总线驱动。 这里首先要明白一些概念: 一、i2c-adapter,即i2c-适配器,这个东西对应s3c2440这块芯片面言,就是指片上的i2c-controller,就是i2c控制器。i2c adapter的作用的是产生总线时序,以读写i2c从设备。 二、i2c-client,即i2c从设备,从机,这个东西代表的是接到s3c2440芯片上的设备,如一个at24c08的eeprom芯片,或是ov9650摄像头芯中的摄像头控制总线(注:这个摄像头芯片中,官方给的芯片手册上提到的是sccb总线,实际上是一种弱化的i2c总线,我们可以利用i2c驱动来读写它,稍后我们也会演示)。 首先,我们先从i2c-dev.c这个文件开始分析,一一步步去看从上到下是怎样调用的。 这是一个模块化的驱动代码,所以我们先从初始化代码开始看: static int __init i2c_dev_initvoid { int res; printkKERN_INFOi2c/dev entries driver\n; res=register_chrdevI2C_MAJOR,i2c,i2cdev_fops; if res goto out; i2c_dev_class=class_createTHIS_MODULE,i2c-dev; if IS_ERRi2c_dev_class{ res=PTR_ERRi2c_dev_class; goto out_unreg_chrdev; } res=i2c_add_driver i2cdev_driver; if res goto out_unreg_class; return 0; out_unreg_class class_destroyi2c_dev_class; out_unreg_chrdev unregister_chrdevI2C_MAJOR,i2c; out printkKERN_ERR%s:Driver Initialisation failed\n,__FILE__; return res; }为了简便起见,我们把这个代码不太重要的东西先拿掉,只看一个重要的,就变成: static int __init i2c_dev_initvoid { int res; res=register_chrdevI2C_MAJOR,i2c,i2
显示全部
相似文档