# lb_hwmon **Repository Path**: litebmc/lb_hwmon ## Basic Information - **Project Name**: lb_hwmon - **Description**: litebmc hardware monitor - **Primary Language**: C - **License**: LGPL-2.1 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2024-12-04 - **Last Updated**: 2026-01-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 说明 [Linux and the Devicetree](https://docs.kernel.org/devicetree/usage-model.html) DeviceTree用于描述linux硬件和驱动,是设备驱动机制和驱动配置策略的解耦方案。 DeviceTree使用dts记录设备树源文件,源文件使用dtc可编译为dtb二进制文件,Linux系统启动时实际读取的是dtb文件,获取系统的硬件topo结构。 DeviceTree使用节点表示设备,每个设备都有一个compatible表示兼容的驱动,内核会据此加载兼容驱动,设备驱动又会从设备节点上读取驱动初始化所需的关键信息,最终实现完整功能。 如下是某个触摸屏I2C驱动芯片配置示例 ``` &i2c2 { status = "okay"; ts@5a { // 兼容性驱动名 compatible = "cst2xxse"; // 设备地址为0x5a reg = <0x5a>; // 中断GPIO irq-gpio = <&gpio0 RK_PB4 IRQ_TYPE_LEVEL_LOW>; // 设备状态,okay表示启用,disabled为禁用 status = "okay"; }; }; ``` 因此,我们可以基于dtb描述的信息实现设备自发现。 ## 功能实现 dt_discovery启动时会通过插件机制加载用户态业务驱动,每个驱动都需要申明一个compatible列表,表示驱动可以处理的兼容性设备。 dt_discovery随后会从dtb加载内核的dtb文件,查找所有**启用**状态的设备并记录设备详细信息,随后从兼容性列表中查找业务驱动,由业务驱动负责生成管理业务所需的具体对象,如传感器的控制、读值、告警等dbus对象。 dt_discovery会记录每个dtb设备的ID,该ID实际为节点的path。 ### 总线ID 对于I2C、SPI等总线,业务驱动需要知道当前使用的spi总线ID,DeviceTree一般由aliases属性记录总线的别名,别名字符串从最后一个非数字字符之后的数字表示ID。 如下为某芯片的另外配置: ``` aliases { ethernet0 = &gmac; i2c0 = &i2c0; i2c1 = &i2c1; i2c2 = &i2c2; i2c3 = &i2c3; i2c4 = &i2c4; i2c5 = &i2c5; mmc0 = &sdmmc; mmc1 = &sdio0; mmc2 = &emmc; serial0 = &uart0; serial1 = &uart1; serial2 = &uart2; serial3 = &uart3; serial4 = &uart4; spi0 = &spi0; spi1 = &spi1; spi2 = &spi2; }; ``` - 示例中i2c0表示ID为0的I2C总线,对应设备为`/dev/i2c-0` - 同样的,示例中serial3表示ID为3的串口。 - aliases处理逻辑见内核源码中的`of_alias_scan`函数。 组件会记录每个设备节点的别名字符串以及解析出总线ID并传递给业务驱动,由业务驱动按需要使用。 ### 用户态驱动 用户态驱动与内核态驱动一样使用`compatible`申明自己的兼容性列表,当服务枚举出所有dts节点后,会使用节点的`compatible`查询首个匹配的用户态驱动。 用户态驱动采用插件机制加载到lb_dt_discovery进程,每个驱动需要抽象出硬件接口的数据读写、控制等接口适配层,支持仿真和业务两种模式: 1. 业务模式: 向下调用硬件适配接口完成读写和控制逻辑,并借用中断、周期查询等提高访问效率,业务模式会实例化诸如硬件控制、数据读取、告警等dbus对象实现对外呈现。 2. 仿真模式: 构造硬件适配接口实现仿真读写和控制接口,使用仿真接口替换硬件接口,实现业务仿真。同时,仿真功能需要提供数据初始化和持久化等能力。 用户态驱动可能需要配合多个`litebmc/interfaces.git`接口实现功能,如lm75温度传感器可能需要设计的接口包括: 1. `com.litebmc.driver.lm75`: 驱动接口,用于描述lm75当前温度值、读取周期等信息的接口,由用户态驱动负责实例化,。 2. `com.litebmc.config.lm75`: 配置接口,描述lm75支持的告警配置,产品可以使用对象描述文件(`odf`)描述每个lm75传感器的高温、低温告警。