Pylone Blog

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

も有効にする必要があります。

導入手順

  1. アーカイブを展開して、Makefile 中の各変数である、
    • 組み込むカーネルのソースへのパス(本Makefileでは'KERNEL_SRC'としています)
    • ARCH
    • CROSS_COMPILE
    の内容を利用する環境に合わせて修正し、
    # make
    
    します。(または、各変数をコマンドラインから直接、定義します)
  2. 生成したモジュールを、対象のカーネルに組み込みます。
    # 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 が発生するので、バッテリの状況を動的に把握することが可能です。

組み込み用途向けのカスタムボードでは、バッテリを搭載していない事も多いと思いますが、 そのような環境においても、本ドライバを利用することによって、ユーザスペースにおける電源管理の評価を行えるのではないでしょうか。