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

问题描述:

我正在尝试获取Linux内核模块内的电池电量(模块是通过modprobe插入的)。我最好喜欢使用内核API调用来获取电池信息。我在网上搜索了解决方案,并且我还探索了Linux内核源代码和Michael Meskes提供的关于想法的程序“acpi”的来源。如何获得Linux内核模块内的电池电量?

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

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

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

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

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

+0

为什么你想要这样做呢? – 2011-02-11 09:30:19

+0

@Andy有一些与电池电平有关的功能。 – razvanlupusoru 2011-02-16 03:28:59

我发现我工作的解决方案。首先确保#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处)。

如果这不是你正在做一个硬件具体的事情,然后无视我的话:)