注:适配器实现其通信方法,主要实现 i2c_algorithm 的 master_xfer()函数和 functionality()数。
master_xfer()函数在适配器上完成传递给它的 i2c_msg 数组中的每个 I2C消息 functionality()函数非常简单,用于返回 FUNC_I2C、I2C_ FUNC_10BIT_ADDR、I2C_FUNC_SMBUS_READ_BYTE、I2C_FUNC_SMBUS_WRITE_BYTE等。
思考问题3:上面调用到了master_xfer(),那么它是在哪初始化的呢?
大家是否记得,文章的上面提到过,在加载i2c总线驱动时,调用i2c_imx.c中
i2c_adap_imx_init函数对i2c_adapter 的数据结构进行了初始化。master_xfer()也是在这初始化的。具体情况情看下边截图,中红色标记的部分:
/sys/bus/i2c及/sys/bus/i2c/device和driver增加
I2c总线是在i2c-core.c中i2c_init-->bus_register时,会在/sys/bus/生成i2c及子目录device和driver目录
postcore_initcall(i2c_init),对于它大家应该不会陌生,它是一个宏定义,前边说过它在内核编译的时候就被加入到了代码段。(/arch/armkernel/vmlinux.lds).initcall2.init里。 start_kernel-->rest_init-->kernel_init-->do_basic_setup()-->do_initcalls()
/sys/bus/i2c/device和driver下的各个具体设备和驱动
/sys/bus/i2c/device下的各个具体设备的增加的函数调用关系如下:
i2c_imx_probe-->i2c_add_numbered_adapter-->i2c_register_adapter-->device_register-->device_add
/sys/bus/i2c/driver下的各个具体设备驱动的增加函数调用关系如下:
egalax_ts_init-->i2c_add_driver-->i2c_register_driver-->driver_register-->bus_add_driver-->kobject_init_and_add-->kobject_add_varg-->kobject_add_internal-->create_dir
总体来说,驱动的注册可以简单概况为: 1、在总线上找找该驱动有没有被注册过
2、若没有注册过,则将驱动加入到总线驱动集合中 3、在总线上找能匹配驱动的设备 1、将总线上每个设备进行匹配
2、首先用总线的match 函数进行低级匹配 3、然后在用总线的probe函数进行高级匹配,若失败,则用驱动上的probe 进行高级匹配
4、如果匹配成功,则将设备绑定到驱动链表中
4、如果匹配成功,则将驱动加入到总线的驱动链表中
思考问题4:Platform总线是在哪初始化?
start_kernel-->rest_init-->kernel_init-->do_basic_setup()-->drive_init()-->platform_bus_init()
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库I2C驱动培训文档(7)在线全文阅读。
相关推荐: