如何获取Linux内核模块中的电池电量?

时间:2011-02-01 03:42:42

标签: linux-kernel kernel-module acpi

我正在尝试在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_nowcharge_full读取,不涉及解析。
  3. 我可以尝试使用来自Linux内核源驱动程序/ acpi / battery.c的调用,如果我能弄清楚如何公开接口。我可能需要方法acpi_battery_get_statusacpi_battery_get_info
  4. 我还注意到在drivers / acpi / sbs.c里面有一个方法acpi_battery_read,就在它上面有一个评论说“Driver Interface”。如果有人知道如何使用它,这可能是另一种方式。
  5. 我认为在内核模块中读取文件可能是一个坏主意,但我不确定这些文件是如何映射到内核函数调用的,所以它可能没问题。

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

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

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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