Armadilloフォーラム

RTC(RICOH R2025)のドライバについて

izawa

2014年10月6日 21時52分

毎度お世話様、再びイットーソフトウェアの伊澤です。
もう一つ質問です。

RICOHのRTC(R2025)を使ったボードとA420を繋ぐ依頼があり、
調べたところα版のカーネルソースに該当チップのドライバーがあることが分かりました。
ソースファイル名自体は現行版にもあるようですが、それでは対応していないようです。

α版(linux-2.6.35-at-alpha4.tar.gz)から取り出したドライバのソース(rtc-rs5c372.c)を
現行版(linux-2.6.26-at20.tar.gz)のソースを使ってビルド、できたモジュール(rtc-rs5c372.c)を
Armadilloにコピー。ロードしてもデバイスエントリが作成されるわけでなく、勿論hwclockも動きません。
一応、カーネルコンフィギュレーションでは該当のドライバーをモジュールとして追加するように
設定はしているのですが、今の処うんともすんとも言わないようです。
尤も、今回はRTCの乗ったボードは社内で作ってないのでハードウェアがちゃんとしているかも不明ですが。

RTCドライバを入れ替える為の手順とか、チェックするポイントですとか、
何か知見があれば宜しくお願いします。

コメント

花田です。

> α版(linux-2.6.35-at-alpha4.tar.gz)から取り出したドライバのソース(rtc-rs5c372.c)を
> 現行版(linux-2.6.26-at20.tar.gz)のソースを使ってビルド、できたモジュール(rtc-rs5c372.c)を
> Armadilloにコピー。

drivers/rtc/rtc-rs5c372.c、26と35のを見比べてみましたが
v0.5→v0.6でR2025S/Dの対応が追加されて
一応ほぼそのまま置き換えて動きそうにも見えますね…

とりあえずこれが問題ないという仮定で、

> ロードしてもデバイスエントリが作成されるわけでなく、勿論hwclockも動きません。

ハードウェア的にはi2cで接続してますか?
i.MX25にはi2cが3つあり、どのポートにrtcが接続されているかを
ボード固有の情報としてインプリメントする必要があります。

Armadillo-420等には別売品としてArmadillo-400シリーズ RTCオプションモジュールが
用意されていますが、これもi2cで接続されるものです。
まずはこちらの実装コードを参考に見てみるのが良いかと。

標準RTCオプションモジュールのドライバはdrivers/rtc/rtc-s35390a.c
i.MX25のi2cホストドライバはdrivers/i2c/busses/mxc_i2c.cですが、
いずれもデバイス/ホスト用の単体ドライバでして、
この中にはボード上でどう接続されているのかの情報を持ちません。

Armadillo-400上で想定された形で結びつけているのは、
arch/arm/mach-mx25/armadillo400.c、これの622行目辺りから
armadillo400_i2c1_dataなど定義されているいるのが見つかるはずです。
カーネルコンフィグには
System Type --->
Freescale MXC Implementations --->
MX25 Options --->
Armadillo-400 Board options --->
[*] Enable I2C2 at CON14
[*] Enable RTC S35390A on I2C2
[*] Enable I2C3 at CON11
[*] Enable RTC S35390A on I2C3
といった設定がありまして、つまりI2C2かI2C3に
RTCが接続されることをされることを想定しているわけですね。
このコンフィグ部分に対応するコードはarmadillo400.cの
#if defined(CONFIG_ARMADILLO400_i2C2_CON14_S35390A)
といった形で囲まれているところ。
ホストとデバイスの結びつけを定義している箇所が確認できるはずです。
(ここでの「.type = "s35390a",」がデバイスドライバ固有のユニークデバイス名称、
「.addr = 0x30,」が、デバイス固有のi2cアドレス)

今回実装するハードウェア構成に合わせてこれと同様にコードを追加
(rs5c372ドライバでR2025S/Dを使う場合は「.type = "r2025sd",」
i2cアドレスは…データシートに(0110010)とあるので「.addr = 0x32,」が適切でしょうか)
すれば、rtc-rs5c372ドライバのrs5c372_probe動作時に、
対応したi2cホストに対し、指定したi2cアドレスを用いてrtcを探しに行くはずです。
(ハードウェア的に2線なので、ロジアナで波形見て正しいアドレス・コマンドが
発行されているかどうか確認することも、それほど難しくはないです)

適切にホストとデバイスの結びつけが正しくなり、ハードウェアが正常に動作するなら
rtc-rs5c372.cの593~594行目のifチェックに引っ掛からずにprobeが成功するはずです。
まずはこれが目標になるかと思います。

花田様、回答ありがとうございます。

なるほど、カーネルの他のソースにも手を入れる必要がありそうですね。
取り敢えずトライしてみます。