14

Linuxカーネルモジュール内のバッテリーレベルを取得しようとしています(モジュールはmodprobeを介して挿入されます)。理想的には、カーネルAPI呼び出しを使用してバッテリー情報を取得したいと思います。私はWebで解決策を検索しました。また、LinuxカーネルソースとMichaelMeskesによるプログラム「acpi」のソースを調べてアイデアを探しました。

これらは私が使用できると思うテクニックのいくつかです:

  1. 読み取り、解析/proc/acpi/battery/BAT0/state、および/proc/acpi/battery/BAT0/info
  2. /sys/class/power_supply/BAT0/charge_now解析をcharge_full伴わずに読み取ります。
  3. インターフェイスを公開する方法がわかれば、Linuxカーネルソースdrivers / acpi/battery.cからの呼び出しを使用してみることができます。私はおそらくメソッドacpi_battery_get_statusacpi_battery_get_info
  4. また、drivers / acpi / sbs.c内にメソッドがacpi_battery_readあり、そのすぐ上に「ドライバーインターフェイス」というコメントがあることに気付きました。誰かがこれを使用する方法を知っているなら、これは別の方法かもしれません。

カーネルモジュール内でファイルを読み取ることはおそらく悪い考えだと思いますが、それらのファイルがカーネル関数呼び出しにどのようにマッピングされるかは正確にはわからないため、問題ない可能性があります。

それで、皆さんは私にいくつかの提案/推奨事項を教えてもらえますか?

編集:私は私の解決策を以下の答えに含めました。

4

3 に答える 3

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);
}
于 2011-03-05T08:38:35.187 に答える
0

battery.c、sbs.cを見ると、LKMでインターフェイスAPI(acpi_battery_read、acpi_battery_get_state)を直接呼び出すことができると思います。
これまでに試しましたか?

于 2011-02-01T06:18:03.977 に答える
0

私にも同じジレンマがあります!:-\これがハードウェア固有の処理である場合、特定のラップトップでSMBusリンクのスマートバッテリーを検出できるかどうかを確認できます。可能であれば、LKM内からi2c/SMBus呼び出しを実行できます。ほとんどの新しいシステム(一部のFujitsuラップトップを除く)は、代わりに組み込みコントローラーと通信し、バッテリーを構成することになります(SMBusを介して)...「lm-sensors」をインストールして、スマートバッテリーが検出されるかどうかを確認してください。その場合、バッテリーと直接通信できるはずです(通常はi2cアドレス0xb)。

これがハードウェア固有のことではない場合は、私が言ったことを無視してください:)

于 2011-02-06T04:58:55.427 に答える