我正在尝试在Linux内核模块中获取电池电量(该模块通过modprobe插入)。理想情况下,我希望使用内核API调用来获取电池信息。我在网上搜索了解决方案,我还探讨了Linux内核源代码和Michael Meskes的程序“acpi”的来源。
这些是我认为我可以使用的一些技术:
/proc/acpi/battery/BAT0/state
和/proc/acpi/battery/BAT0/info
/sys/class/power_supply/BAT0/charge_now
和charge_full
读取,不涉及解析。acpi_battery_get_status
和acpi_battery_get_info
acpi_battery_read
,就在它上面有一个评论说“Driver Interface”。如果有人知道如何使用它,这可能是另一种方式。我认为在内核模块中读取文件可能是一个坏主意,但我不确定这些文件是如何映射到内核函数调用的,所以它可能没问题。
那么,你们能给我一些建议/建议吗?
编辑:我在下面的答案中包含了我的解决方案。
答案 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)。
如果这不是您正在做的硬件特定事情,那么请忽略我所说的内容:)