如何获得Linux内核模块内的电池电量?
问题描述:
我正在尝试获取Linux内核模块内的电池电量(模块是通过modprobe插入的)。我最好喜欢使用内核API调用来获取电池信息。我在网上搜索了解决方案,并且我还探索了Linux内核源代码和Michael Meskes提供的关于想法的程序“acpi”的来源。如何获得Linux内核模块内的电池电量?
这些都是一些我认为我可以使用的技术:
- 读取和
/sys/class/power_supply/BAT0/charge_now
和charge_full
解析/proc/acpi/battery/BAT0/state
和/proc/acpi/battery/BAT0/info
- 读与不涉及解析。
- 我可以尝试使用来自Linux内核源驱动程序/ acpi/battery.c的调用,如果我能弄清楚如何暴露接口。我可能需要的方法
acpi_battery_get_status
和acpi_battery_get_info
- 我还注意到,在drivers/acpi/sbs.c中有一个方法
acpi_battery_read
,在它的正上方有一个注释“Driver Interface”。如果有人知道如何使用它,这可能是另一种方式。
我认为在内核模块中读取文件可能是一个坏主意,但我不确定这些文件如何映射到内核函数调用,所以它可能没问题。
那么,你们能给我一些建议吗?
编辑:我在下面的答案中包含了我的解决方案。
答
我发现我工作的解决方案。首先确保#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);
}
答
看看battery.c,sbs.c,我想你可以直接在你的LKM中调用接口API(acpi_battery_read,acpi_battery_get_state)。
你到目前为止尝试过吗?
答
我有同样的困境! : - \ 如果这是您正在做的特定硬件的事情,您可以看看您的笔记本电脑上是否可以检测到SMBus链路上的智能电池。如果可以的话,那么你可以在你的LKM内部进行i2c/SMBus调用。大多数新系统(除了一些富士通笔记本电脑)都会与嵌入式控制器通话,最终配置电池(通过SMBus,我想)... 尝试安装“lm-sensors”并查看它是否检测到您的智能电池。如果是这样,你应该能够直接与电池通话(通常在i2c地址0xb处)。
如果这不是你正在做一个硬件具体的事情,然后无视我的话:)
为什么你想要这样做呢? – 2011-02-11 09:30:19
@Andy有一些与电池电平有关的功能。 – razvanlupusoru 2011-02-16 03:28:59