SH7706LAN上で稼動するshLinuxを使っていて、ソフトウェアクロックがハードウェアクロックとうまくシンクロが取れずマシン起動時にずれてしまう問題を何とかしようと奮闘してます。
要は、ソフトウェアクロックがハードウェアクロックの時間をうまくシンクロできればと簡単に考えていたら、結局RTCがkernelに実装されていないためにhwclockでシンクロできないことが解り、いろいろと奮闘する中rtcのドライバモジュールを作成してドライバとして組み込むこととなり、勉強もかねて作成してみました。
ドライバ名をa_rtcとして作成しました。
内容的には、以下のシンプル機能のみを実装してみました。
1.ドライバーのopen
2.read
ハードウェアクロックの日時を取得してbufferに 2008/09/07 12:36:00 の文字列の形で返す。
3.write
2008/09/07 12:36:00の形式の文字列を受け取りハードウェアクロックに設定し、クロックを再起動する。
4.init
5.remove
これだけ。
取り合えずソースは公開しましょう。
・A_RTC.LZHのソース
だらだらなソースですが、それほど大きくないので仕組みを勉強するには結構解りやすいかもしれません。
【コンパイル方法】
Makefile,a_rtc.cを任意のところに展開してmakeするだけです。
(※Makefileの中のKDIRは、開発ホスト環境のlinux-kernelの場所に合わせます。)
SH7706LANへの実装は、コンパイルで作成されたa_rtc.koを実機の/proc/a_rtc等のディレクトリを作成して、その中に入れます。
insmod /proc/a_rtc/a_rtc.ko
mknod /dev/a_rtc c 192 0
でドライバの登録をします。
【hwclockの代替コマンド】
また、hwclockの代わりにhwclkを作成してhwclock -w やhwclock -s の代わりになるようなコマンドを作成しました。
要は、シンクロが取れればいいのでこの機能のみです。
【実行結果】
取り合えず、時間のシンクロはうまく取れるようになりましたので、/usr/sbinの中に入れました。
私は、/etc/rc.d/rc.systemの中に
insmod /proc/a_rtc.ko
mknod /dev/a_rtc c 192 0
/usr/sbin/hwclk -s
として、ボード起動時にハードウェアクロックとシンクロさせるようにしました。
【課題】
hwclk -s を実行させてしばらくしてdateコマンドで確認すると、少しずつ時間がずれて行くことが解りました。
hwclkをオプションをつけないで実行すると現在のソフトウェクロック値のハードウェアクロック値を表示するようにして確認すると、ハードウェアクロックは正常にカウントしていることが解りました。