Chinaunix首页 | 论坛 | 博客
  • 博客访问: 440508
  • 博文数量: 113
  • 博客积分: 446
  • 博客等级: 下士
  • 技术积分: 1229
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-09 16:01
个人简介

Let's go!!!!!

文章分类

全部博文(113)

文章存档

2019年(5)

2018年(4)

2017年(9)

2016年(5)

2015年(39)

2014年(6)

2013年(28)

2012年(17)

分类: LINUX

2019-01-03 20:12:59

一. 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
阅读(2033) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~