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

raz*_*oru 14 kernel-module acpi linux-kernel

我试图在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. 我也注意到在drivers/acpi/sbs.c里面有一个方法acpi_battery_read,就在它上面有一个评论说"Driver Interface".如果有人知道如何使用它,这可能是另一种方式.

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

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

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

raz*_*oru 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);
}
Run Code Online (Sandbox Code Playgroud)