JF Linux Kernel 3.x/2.6 Documentation: /usr/src/linux/Documentation/ia64/efirtc.txt

ia64/efirtc.txt

EFI Real Time Clock ドライバ [プレインテキスト版]


EFI Real Time Clock driver
-------------------------------
    著者:S. Eranian <eranian@hpl.hp.com> March 2000
日本語訳:野本浩一 <hng@ps.ksky.ne.jp>
    校正:森本淳さん <morimoto@xantia.citroen.org>
          Seiji Kanekoさん <se-kane@str.hitachi.co.jp>

I.   概要

この文書は IA-64 プラットフォーム向けに提供されている efirtc.c ドライ
バを説明します。

このドライバの目的は、EFI バージョン 0.92 で提供されているタイムサービ
スにアクセスするために、カーネルおよびユーザアプリケーション向けの API
を提供することです。

EFI は四つのコールを提供し、OS がブートされると使えるようになります。
このドライバは、GetTime(), SetTime(), GetWakeupTime(), SetWakeupTime()
をサポートします。
以下の項では、これらのコールとドライバの設計について述べます。

II.  設計の決定

当初、元々の案は時刻サービスにアクセスできるとても単純なドライバを提供
することでした。これは CMOS クロックに、移植性良く、アクセスするために
必要です。/sbin/hwclock のようなプログラムはブートの間にシステムの時間
の初期化をするため、こういったクロックを使います。

CMOS クロックを利用する既存のユーザレベルアプリケーションへの影響を最
小限にしたかったので、今日使われている従来の RTC ドライバ
(driver/char/rtc.c) と非常に似た API の仕様を開示することに決めました。
しかし、EFI は単純なサービスを提供するだけなので、すべての ioctl() が
利用可能なわけではありません。さらに、従来のドライバにはなかった新しい
ioctl() が EFI の提供機能のため追加されています。

EFI で用いられる時間の表現方法は若干異なっており、元となる日時の違いが、
その顕著なものです。年の書式は四桁全てを用います。起源 (Epoch) は 1998
年 1 月 1 日です。下位互換性の理由から、この新方式の時間表現は表には出
しません。その代わりに、hwclock により使われる struct tm とよく似たも
の (すなわち struct rtc_time) を用います。それを用いる理由の一つは、こ
の方法がユーザアプリケーションに何らの影響も与えることなく、EFI をさら
に発展させるからです。このように実際の実装と OS 上の表現を分離しておく
ことは、柔軟性が得られますし、中身がいろいろと変わったとしても、(その
変化を吸収する) ラッパーコードを書くことができます。

ドライバは二つのインターフェースを公開し、一つはデバイスファイルと
ioctl() の組みを介すものです。
もう一つは読み出しのみの /proc ファイルシステムを介すものです。

今日現在、/proc/sys インターフェースを提供していません。

従来の RTC と EFI のタイムサービスとで同一のインターフェースを考慮する
ために、二つのドライバの *公開する* API だけを含む include/linux/rtc.h
ヘッダファイルを作成しました。従来の RTC 固有のものはまだ
include/linux/mc146818rtc.h にあります。
 
III. 時刻サービス

ドライバの一部分は、EFI の時刻サービスにアクセスできるようにします。二
つの ioctl() は 従来の RTC コールと互換性があります -

	CMOS クロックを読む: ioctl(d, RTC_RD_TIME, &rtc);

	CMOS クロックに書く: ioctl(d, RTC_SET_TIME, &rtc);

rtc は rtc.h で定義されたデータ構造体へのポインタで、struct tm にかな
り似ています。

struct rtc_time {
        int tm_sec;
        int tm_min;
        int tm_hour;
        int tm_mday;
        int tm_mon;
        int tm_year;
        int tm_wday;
        int tm_yday;
        int tm_isdst;
};

ドライバはEFI の time 形式とこの形式の間の変換を行います。

これら二つの ioctl() は hwclock で検証することができます。

読み出しに関して -

# /sbin/hwclock --show
Mon Mar  6 15:32:32 2000  -0.910248 seconds

設定に関して -

# /sbin/hwclock --systohc

時刻の設定を行うためにはルート権限が必要です。

IV.  wakeup アラームサービス 

EFI はマシンが wakeup すべき時 (すなわち reboot) をプログラムするため
の API を提供します。これは、従来の RTC が提供するインターバルタイマの
アラームとはだいぶ異なります。このため、このサービスにアクセスするため
に今までの ioctl() を使うことはしません。代わりに、RTC のインターフェー
スとして二つの新しい ioctl() を導入しています。

追加した二つの新しい ioctl() の EFI ドライバに対する仕様 -

        現在のアラームの状態を読む
	ioctl(d, RTC_WKLAM_RD, &wkt)

        アラームの設定もしくは状態の変更
	ioctl(d, RTC_WKALM_SET, &wkt)

状態を得るために、wkt 構造体は struct rtc_time と二つの追加されたフィー
ルドを含みます。
	
struct rtc_wkalrm {

        unsigned char enabled; /* =1 if alarm is enabled */
        unsigned char pending; /* =1 if alarm is pending  */

        struct rtc_time time;
} 

今のところ、ユーザレベルアプリケーションでこの機能をサポートしたものは
ありません。そして、単にこれら二つの ioctl() を使って、プログラムといっ
たものを書くことは難しいでしょう。

アラームの設定にはルート権限が必要です。

V.   参考文献

EFI のさらに詳しい情報は、次のウェブサイトをご覧ください。

http://developer.intel.com/technology/efi/

Linux カーネル 3.x/2.6 付属文書一覧へ戻る