EFI Real Time Clock driver ------------------------------- 著者:S. Eranian March 2000 日本語訳:野本浩一 校正:森本淳さん Seiji Kanekoさん 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/