14

我正在尝试获取 Linux 内核模块中的电池电量(该模块是通过 modprobe 插入的)。理想情况下,我想使用内核 API 调用来获取电池信息。我在网上搜索了解决方案,并且我还探索了 Linux 内核源代码和 Michael Meskes 的程序“acpi”的源代码以获取想法。

这些是我认为可以使用的一些技术:

  1. 读取和解析/proc/acpi/battery/BAT0/state/proc/acpi/battery/BAT0/info
  2. 读取/sys/class/power_supply/BAT0/charge_now并且charge_full不涉及解析。
  3. 如果我能弄清楚如何公开接口,我可以尝试使用来自 Linux 内核源驱动程序/acpi/battery.c 的调用。我可能需要这些方法acpi_battery_get_statusacpi_battery_get_info
  4. 我还注意到在驱动程序/acpi/sbs.c 中有一个方法acpi_battery_read,在它的正上方有一条评论说“驱动程序接口”。如果有人知道如何使用它,这可能是另一种方式。

我认为在内核模块中读取文件可能是一个坏主意,但我不确定这些文件如何映射到内核函数调用,所以它可能没问题。

那么,你们能给我一些建议/建议吗?

编辑:我在下面的答案中包含了我的解决方案。

4

3 回答 3

11

我找到了适合我的解决方案。首先确保#include <linux/power_supply.h>

假设您知道电池的名称,此代码给出了如何获取当前电池容量的示例。

char name[]= "BAT0";
int result = 0;
struct power_supply *psy = power_supply_get_by_name(name);
union power_supply_propval chargenow, chargefull;
result = psy->get_property(psy,POWER_SUPPLY_PROP_CHARGE_NOW,&chargenow);
if(!result) {
    printk(KERN_INFO "The charge level is %d\n",chargenow.intval);
}
result = psy->get_property(psy,POWER_SUPPLY_PROP_CHARGE_FULL,&chargefull);
if(!result) {
    printk(KERN_INFO "The charge level is %d\n",chargefull.intval);
}
于 2011-03-05T08:38:35.187 回答
0

查看battery.c,sbs.c,我想你可以直接在你的LKM中调用接口API(acpi_battery_read,acpi_battery_get_state)。
到目前为止你试过了吗?

于 2011-02-01T06:18:03.977 回答
0

我也有同样的困惑!:-\ 如果这是您正在做的特定于硬件的事情,您可以查看在您的特定笔记本电脑上是否可以检测到 SMBus 链路上的智能电池。如果可以,那么您可以在 LKM 中进行 i2c/SMBus 调用。大多数新系统(除了一些富士通笔记本电脑)都与嵌入式控制器通信,最终配置电池(我想是通过 SMBus)....尝试安装“lm-sensors”并查看它是否检测到您的智能电池。如果是这样,您应该能够直接与电池通话(通常在 i2c 地址 0xb 处)。

如果这不是您正在做的特定于硬件的事情,那么请忽略我所说的:)

于 2011-02-06T04:58:55.427 回答