2011-02-01 131 views
13

我正在嘗試獲取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

回答

10

我發現我工作的解決方案。首先確保#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); 
} 
0

看看battery.c,sbs.c,我想你可以直接在你的LKM中調用接口API(acpi_battery_read,acpi_battery_get_state)。
你到目前爲止嘗試過嗎?

0

我有同樣的困境! : - \ 如果這是您正在做的特定硬件的事情,您可以看看您的筆記本電腦上是否可以檢測到SMBus鏈路上的智能電池。如果可以的話,那麼你可以在你的LKM內部進行i2c/SMBus調用。大多數新系統(除了一些富士通筆記本電腦)都會與嵌入式控制器通話,最終配置電池(通過SMBus,我想)... 嘗試安裝「lm-sensors」並查看它是否檢測到您的智能電池。如果是這樣,你應該能夠直接與電池通話(通常在i2c地址0xb處)。

如果這不是你正在做一個硬件具體的事情,然後無視我的話:)