Linux Kernel 2.6 Documentation:
/usr/src/linux/Documentation/ia64/efirtc.txt
ia64/efirtc.txt
EFI Real Time Clock ドライバ
[プレインテキスト版]
- 原著作者: S. Eranian <eranian@hpl.hp.com>
- 翻訳者: 野本浩一 <hng@ps.ksky.ne.jp>
- バージョン: 2.6.5
- 翻訳日時: 2001/07/02
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 カーネル 2.6 付属文書一覧へ戻る