以IIC为例,linux 各种总线是如何初始化的?我的设备是如何挂载在总线上的?和设备树的关系?设备树是如何解析的?你用kernel 4.19的代码给我举例
时间: 2024-02-29 11:57:05 浏览: 121
I2C 是一种串行通信总线,常用于连接微控制器、传感器、存储器等设备。在 Linux 内核中,I2C 子系统由 i2c-core 和 i2c-algo-* 组成,其中 i2c-core 提供了 I2C 总线驱动的核心功能,而 i2c-algo-* 提供了 I2C 总线驱动的具体实现。
下面是 Linux 内核 4.19 版本中 I2C 总线的初始化流程:
1. 启动内核后,i2c-core 驱动被注册到系统中,并创建 i2c_bus_type 总线类型对象。
2. i2c-algo-* 驱动被注册到系统中,这些驱动封装了不同的 I2C 总线控制器,如 i2c-algo-bit、i2c-algo-pca 等。
3. 在设备树中,定义了 I2C 总线控制器所使用的硬件资源,如 GPIO、时钟等。
4. 当系统探测到 I2C 总线控制器时,会调用 i2c_add_numbered_adapter() 函数创建 i2c_adapter 对象,并将其挂载到 i2c_bus_type 总线类型对象上。
5. 然后,内核会扫描设备树,找到已经定义的 I2C 设备节点,如 i2c-device1、i2c-device2 等。
6. 对于每个 I2C 设备节点,内核会解析其中的属性,如设备地址、总线编号等信息,并调用 i2c_new_device() 函数创建 i2c_client 对象,并将其挂载到 i2c_adapter 对象上。
7. I2C 客户端驱动可以通过 i2c_new_device() 函数获取 i2c_client 对象,然后通过 i2c_transfer() 函数进行 I2C 数据传输。
总之,I2C 设备的挂载与设备树息息相关。内核通过解析设备树中的节点信息,创建 i2c_client 对象,并将其挂载到 i2c_adapter 对象上,从而实现 I2C 总线的初始化和设备的挂载。
需要注意的是,不同的 I2C 设备可能需要使用不同的 I2C 总线控制器,因此在设备树中需要明确指定所使用的控制器类型和硬件资源。
阅读全文
相关推荐















