[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 などみつかると思います。

-- 小沼雅樹