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

我试图在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
读取,不涉及解析。 如果我能弄清楚如何公开接口,我可以尝试使用来自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 %dn",chargenow.intval);
}
result = psy->get_property(psy,POWER_SUPPLY_PROP_CHARGE_FULL,&chargefull);
if(!result) {
    printk(KERN_INFO "The charge level is %dn",chargefull.intval);
}
    
看看battery.c,sbs.c,我想你可以直接在你的LKM中调用接口API(acpi_battery_read,acpi_battery_get_state)。 你到目前为止尝试过吗?     
我有同样的困境! : - 如果这是您正在做的硬件特定事情,您可以看到在您的特定笔记本电脑上是否可以检测SMBus链接上的智能电池。如果可以,那么您可以在LKM中进行i2c / SMBus呼叫。大多数新系统(除了一些富士通笔记本电脑)与嵌入式控制器通信,最终配置电池(我认为通过SMBus).... 尝试安装“lm-sensors”并查看它是否检测到您的智能电池。如果是这样,你应该能够直接与电池通话(通常在i2c地址0xb)。 如果这不是你正在做的硬件特定的事情,那么忽略我说的:)     

要回复问题请先登录注册