为什么i2c子系统中的i2c_do_add_adapter(data, to_i2c_adapter(dev));可以找到i2c_adapter
时间: 2023-08-11 14:05:26 浏览: 42
i2c_do_add_adapter() 是 i2c-core 中的一个函数,用于向 i2c 子系统中添加新的 i2c_adapter。它的第二个参数是一个指向 struct device 结构体的指针 dev,而 to_i2c_adapter() 则是一个宏定义,用于将该结构体转换为对应的 i2c_adapter 结构体。
在 i2c-core 中,i2c_adapter 结构体和 struct device 结构体共享同一个内存空间,因此通过 to_i2c_adapter() 宏定义可以将一个 struct device 结构体转换为对应的 i2c_adapter 结构体,并将转换后的结构体地址作为参数传递给 i2c_do_add_adapter() 函数。
这样,i2c_do_add_adapter() 就可以通过转换后的 i2c_adapter 结构体找到对应的 i2c 总线和设备了。
相关问题
i2c_add_driver
i2c_add_driver() 是 Linux 内核中注册 I2C 设备驱动的函数。它的作用是向 I2C 子系统注册一个 I2C 设备驱动,使得 I2C 子系统能够识别并调用该驱动中的相应函数,完成对 I2C 设备的操作。函数的原型如下:
```c
int i2c_add_driver(struct i2c_driver *driver);
```
其中,参数 driver 是一个指向 i2c_driver 结构体的指针,该结构体中定义了 I2C 设备驱动的相关信息,例如驱动名称、设备 ID、设备探测函数、设备匹配函数等等。在调用 i2c_add_driver() 函数之前,需要先填充好该结构体。
调用成功时,函数返回 0;否则返回负值,表示注册失败。
i2c_add_driver函数无效
可能多种原因导致i2c_add_driver函数无效,以下是一些可能的解决方法:
1. 确保你的i2c驱动程序已经正确地编写并且已经被编译成内核模块或者静态链接到内核中。
2. 确保你的i2c驱动程序与i2c子系统的版本兼容。
3. 检查是否有其他i2c设备或驱动程序已经占用了你的i2c总线,如果有,需要先卸载或禁用这些设备或驱动程序。
4. 检查i2c总线是否已经正确地初始化并且已经被注册到内核中。
5. 检查i2c驱动程序的probe()函数是否被正确地实现,是否能够正确地识别和初始化你的i2c设备。
6. 如果你使用的是设备树,需要确认你的i2c设备在设备树中已经正确地描述并且已经被正确地绑定到i2c总线上。
希望以上解决方法能够帮助你解决问题。