[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Telios: resume rtc
こぬまです。
From: TAKEMURA Shin <takemura@netbsd.org>
Subject: Re: Telios: resume rtc
Date: Mon, 20 Jan 2003 11:15:06 +0900 (JST)
> TX39のこともclockまわりも全然わかっていないので、
私もよくわかっていないし、勘違いしているかもしれません。
> 現状どういうメカニズムで時間がずれてしまうのか、
> このパッチは問題をどのように解決するのか。
> 問題の本質はなにか(実装不足、単なるバグ、仕様的な問題など)
>
> などなど、もうすこし詳しく説明していただけると助かります。
私が source をどのように解釈したか説明してみます。
TX3922 の RTC は 43bit のカウンタです。(tx39timerreg.h) (TX3912 は
40bit) このカウンタは suspend 中も動作しています。
入力は 32768Hz なので、秒より小さい部分のカウントに 15bit 使用します。
残りは 28bit なので、3106日までしかカウントできません。
# TX3922: 43bit: 8796093022208 / 32768 / 24 / 60 / 60 -> 3106日
# TX3912: 40bit: 1099511627776 / 32768 / 24 / 60 / 60 -> 388日
3106日 や 388日では hardware clock としては不足なので、
struct tx39clock_softc の struct clock_ymdhms sc_epoch に epoch な時刻
を設定し、その時刻からの経過時間を TX39 の RTC でカウントするようにし
ています。つまり、sc_epoch + RTC を hardware clock として使用しています。
boot と resume のときに、
hpcmips/hpcmips/clock.c:inittodr (initializes the time of day hardware...)
から tx39clock_get() が呼ばれます。
最初 (boot 時) に呼ばれたときは、sc_epoch の値は不定 (0 かも) なので使
用できません。そのため、引数として渡した base (inittodr のコメント参照)
を sc_epoch の代りに使用します。このとき、sc_epoch 初期化していないの
に、次回 (resume 時) 以降は sc_epoch が正常なものとして使用しています。
(*1)
clock_settime や settimeofday で時刻を設定したときに、
hpcmips/hpcmips/clock.c:resettodr (restores the time of day hardware
after a time change.)
から、tx39clock_set() が呼ばれます。
このとき時刻を sc_epoch に代入しているだけで、TX39 の RTC を 0 にして
いないので、RTC のカウンタの値分だけ、resume 時に tx39clock_get() で時
刻がずれます。(*2)
あのパッチは、
*1 の sc_epoch への代入抜け、
*2 の RTC のゼロクリア
を補うものです。
# 何だか重要なことを説明し忘れているような気がしますが、書いている内に
# 文章が変になってきたので、とりあえず、ここまで。
> #TX39のマニュアルってどこかでダウンロードできないでしょうか。
# toshiba.com などからは消えたようですが、TMPR3922.pdf がまだどこかに
# あるでしょう。google などみつかると思います。
-- 小沼雅樹