Pylone Blog - タグ:power-supply-class
Virtual Battery Driver
Linux kernel の機能の一部である Power supply class を利用した、仮想バッテリドライバを公開します。
概要
Power supply class は、sysfs 、及び uevent によってユーザースペースから電源状態に関するイベントの監視を可能にする仕組みですが、 本ドライバはその仕組みを利用して、コマンドラインからAC電源、バッテリに関するイベントを生成し、 電源状態の変化を仮想的に再現するためのものです。
パイロンでは、バッテリを持たないカスタムボードへ Android を移植する際に使用しています。
前提
本ドライバを使用するには、Linux kernel 2.6.25 以降を、
- CONFIG_POWER_SUPPLY
を有効にしてコンパイルした環境が必要です。
また、Android で Power supply class から uevent を受けとるには、
- CONFIG_SYSFS_DEPRECATED_V2
も有効にする必要があります。
導入手順
- アーカイブを展開して、Makefile 中の各変数である、
- 組み込むカーネルのソースへのパス(本Makefileでは'KERNEL_SRC'としています)
- ARCH
- CROSS_COMPILE
# makeします。(または、各変数をコマンドラインから直接、定義します) - 生成したモジュールを、対象のカーネルに組み込みます。
# insmod virtual_battery.ko予め他のPower supply classドライバがロードされている状態で本ドライバを登録すると、Kernel Panic が起きてしまう点にご注意ください。
以上の手順を実行すると、sysfs のプラットフォームデバイスディレクトリ(/sys/devices/platform/) に、 「virtual_battery.0」というディレクトリが生成されいるはずです。
$ ls /sys/devices/platform/virtual_battery.0/
bus power_supply:ac uevent
modalias power_supply:battery
power subsystem
また、sysfs のモジュールパラメータのディレクトリにも以下のようなディレクトリパスと仮想ファイル群が生成されているはずです。
$ ls /sys/module/virtual_battery/parameters/
ac_status battery_health battery_status
battery_capacity battery_present battery_technology
使用方法
電源状態を変更するには、sysfs に生成されたモジュールパラメータを使用します。
各仮想ファイルの使用方法は以下の通りです。
| パラメータ | 初期状態 | 説明 | |
|---|---|---|---|
| ac_status | on off |
on | AC 接続の状態を変更します。 |
| battery_status | charging discharging not-charging full |
charging | バッテリの状態を変更します。 |
| battery_health | good overheat dead overvoltage failure |
good | バッテリの劣化状態を変更します。 |
| battery_present | true false |
true | バッテリの装着状態を変更します。 |
| battery_technology | NiMH LION LIPO LiFe NiCd LiMn |
LION | バッテリの種類を変更します。 |
| battery_capacity | 0から100 | 50 | バッテリの残容量を変更します。 |
使用例
まずは現在の各値を確認してみます。sysfs の class ディレクトリ以下に、power_supply ディレクトリがあるので、 そこの uevent を利用すると一覧を取得することができます。
# cat /sys/class/power_supply/uevent
PHYSDEVPATH=/devices/platform/virtual_battery.0
PHYSDEVBUS=platform
POWER_SUPPLY_NAME=battery
POWER_SUPPLY_TYPE=Battery
POWER_SUPPLY_STATUS=Charging
POWER_SUPPLY_HEALTH=Good
POWER_SUPPLY_PRESENT=1
POWER_SUPPLY_TECHNOLOGY=Li-ion
POWER_SUPPLY_CAPACITY=50
バッテリ容量とバッテリ状態を変更してみます。
# echo 30 > /sys/module/virtual_battery/parameters/battery_capacity # echo discharging > /sys/module/virtual_battery/parameters/battery_status
変更されているか確認してみます。
# cat /sys/module/virtual_battery/parameters/battery_capacity 30 # cat /sys/module/virtual_battery/parameters/battery_status discharging
変更したタイミングで uevent が発生するので、バッテリの状況を動的に把握することが可能です。
組み込み用途向けのカスタムボードでは、バッテリを搭載していない事も多いと思いますが、 そのような環境においても、本ドライバを利用することによって、ユーザスペースにおける電源管理の評価を行えるのではないでしょうか。