一. IIC子系统初始化顺序(linux2.6.32)
1. /driver/i2c/i2c-core.c 注册i2c总线
2. /arch/arm/mach-smdk2440.c 注册i2c控制器设备
3. /drivers/i2c/busses/i2c-s3c2410.c 注册i2c控制器驱动
4. 注册外设驱动
struct bus_type i2c_bus_type = {
.name = "i2c",
.match = i2c_device_match,
.probe = i2c_device_probe,
.remove = i2c_device_remove,
.shutdown = i2c_device_shutdown,
.suspend = i2c_device_suspend,
.resume = i2c_device_resume,
};
match方法的用来进行client device和client driver的配对(client外设),
在向总线i2c_bus_type注册设备(s3c_device_i2c0)或者驱动(s3c24xx_i2c_driver)时会调用此方法。
配对成功,调用i2c_device_probe。
struct platform_device s3c_device_i2c0 = {
.name = "s3c2410-i2c",
#ifdef CONFIG_S3C_DEV_I2C1
.id = 0,
#else
.id = -1,
#endif
.num_resources = ARRAY_SIZE(s3c_i2c_resource),
.resource = s3c_i2c_resource,
};
platform_device_register()向i2c bus注册s3c_device_i2c0过程中。
1.调用i2c_device_match()
2.调用i2c_register_board_info()
i2c_register_board_info()函数用于往__i2c_board_list这条链表添加一条i2c client外设信息。
在i2c adapter注册的时候,会扫描__i2c_board_list链表,然后调用i2c_new_device()函数来注册i2c client外设。
static struct platform_driver s3c24xx_i2c_driver = {
.probe = s3c24xx_i2c_probe,
.remove = s3c24xx_i2c_remove,
.id_table = s3c24xx_driver_ids,
.driver = {
.owner = THIS_MODULE,
.name = "s3c-i2c",
.pm = S3C24XX_DEV_PM_OPS,
},
};
platform_dirver_register()向i2c_bus注册s3c24xx_i2c_driver过程中。
1.调用i2c_device_match()
2.s3c24xx_i2c_driver 中的name变量的值和已注册的所有
platform_device中的name变量的值进行匹配。匹配成功,会调用 platform_driver结构元素probe函数指针。
参考:https://blog.csdn.net/li_wen01/article/details/51657040
阅读(2128) | 评论(0) | 转发(0) |