接上一篇
本系列的第一篇是:
如我们所料,这个世界上,很多时候,一些道理是相通,我们现在看的倒霉家伙仍然不是最最倒霉的那个的,经过简单的一些辅助性处理,它又把问题推给了:
adap->algo->也就是我们现在的结构中i2c_client中的i2c_adapter成员中的algo成员中的.我们当初在第二步:
中建立的i2c_client结构,当时添充其i2c_adapter成员时是通过(i2c_dev->adap->nr);来得到的。也是就说,我们根据次设备号,找到i2c_dev然后再通过它的成员的成员找到这个adapter结构。但至今为止我们还不知道这个i2c_adapter结构是发生的呢。好,我们来找找,
其实有一段话,我该写在这个系统的前面,但是忘记了没有写,现在写在这里,那就是:
linux系统的i2c驱动只有非常少的代码,都放在//目录下,我们发现这个目录下面只有三个文件夹,和三个.c文件,而我们来看编译后的代码树里,真正生成了.o文件的只有5个文件。/ /
i2c-dev.c 共
5个,通过我们前的讨论看来,i2c-dev.c这个文件是一个驱动中与VFS打交道的模块。i2c-core.c则是一个中间层,提供上层,底层中间的
隔离,另外三个文件我们还没有看,但显然i2c-s3c2410.c更像是与底层硬件相关的。而i2c-algo-bit.c是讨论算法的。i2c-
boardinfo.c大家可以看,只有一个函数。所以我们可以三个文件都看看,找找那个 i2c_adapter添加的代码在哪里。
而实际上,我们可以上网搜一下。
最终发现添加i2c_adapter的函数有两个,而我们显然要用i2c-s3c2410.c中用了的那一个。
这两个为:()和()而根据这个文件里一段话说,前一个函数是总线号固定的时候用的,后一个则是动态的,显然s3c2410上总线号是固定的,所以那里用的是前者。到这里不得不看一下这个文件里都写了些什么,只看了下框架,发现这里是一个平台驱动的注册模块,最终向系统注册的是 ,而上面提到的那个函数则是在s3c2410_i2c_driver中的probe函数:s3c24xx_i2c_probe中被调用的。也就是说,这个i2c_client中的adapter是要在 注册时才能加进去的。这样,我们又不得不先看一下,这个模块初始化时做了些什么,因为初妈化是在probe函数之前工作的。还好这个初始化代码十分简单。就是注册了一下,这样的话,我们就可以直接来看probe函数了:
这个比较长,另开一篇。
阅读(2543) | 评论(0) | 转发(3) |