EPSONのRTCで、Linuxカーネルソースツリーにドライバが入っていないチップでも
セイコーエプソン製リアルタイムクロックモジュール用Linux Driverダウンロードページ
があったので、Androidでも簡単に使えるかと思ったら、甘かった。
セイコーエプソン提供のドライバで一応RTCとして動作はするのだが、Androidでは “wake up capable” でないと使えない。セイコーエプソン提供のドライバはそうなっていない。(linux-3.10.101 を見たが、ソースツリーに入っているEPSON RTCのドライバもそうなっていない)
(”wake up capable” でないRTCは、alarmtimer でRTCとして登録されない。
kernel/time/alarmtimer.c : alarmtimer_rtc_add_device() で device_may_wakeup() かどうかチェックしている)
この結果、「起動時にはRTCから読み出した時刻がシステム時計に反映される(ここまではLinuxカーネルがやってる仕事なので)が、Android上で(android.os.SystemClock.setCurrentTimeMillis()を使用して)(※このメソッドは特権が必要なので通常のAndroidシステムでは一般のアプリからは使えない)時計をセットしてもそれがRTCに書き込まれない」という事象が起きる。
RTCドライバをいじって、といっても1行追加しただけだが、 probe() の際に
device_init_wakeup(&client->dev, 1);
(※I2C RTCの場合)
をしてやるとalarmtimerがRTCとして登録してくれるので、AndroidからもRTCに書き込めるようになり、一応この問題は無くなる。
でもよく調べてないのでこれだけで大丈夫かわからない。ちゃんと修正しないといけないだろうけど・・・。
なお、こういうドライバは他にも kernel/driver/rtc 内にいくつもあるので注意が必要。
rtc-ds1307.c (DS1307, DS3231 等のドライバ) など(rtc-ds1307.c は、割り込みピンを使う場合は、大丈夫なのかもしれない?)
コメント