2012年10月3日水曜日

[.tested] 勤次郎 JustTimes KTJ-100/KJT-10 [AX3][A6]



勤次郎 JustTimesは、JJY放送を受信して、USBシリアルにより時刻データを出力する機器であり、
USB接続可能な機器と接続することにより、取得した時刻データにより内部クロックの調整が可能となります。

今回、上記機器本体と、OpenBlocks AX3およびA6との接続検証を行いました。


OBDN技術ブログによる動作検証は、該当するデバイスの動作を保証およびサポートを行うものではありません。
内容に関するご指摘などありましたら、ブログ記事の担当までご連絡下さい。

<検証環境>
OpenBlocks AX3/4 Debian 6.0 kernel: 3.0.6
OpenBlocks A6 Debian 6.0 kernel: 2.6.31.8
勤次郎 JustTimes  KTJ-100/KJT-10

1. 対応ドライバと事前準備

当該デバイスは、CP210xシリーズのUSBシリアルデバイスを使用しており、
dmesgでは以下のメッセージが表示されます。

USB Serial support registered for generic
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial Driver core
USB Serial support registered for cp210x
cp210x 1-1:1.0: cp210x converter detected
usb 1-1: reset full speed USB device using ehci_marvell and address 2
usb 1-1: cp210x converter now attached to ttyUSB0
usbcore: registered new interface driver cp210x
cp210x: v0.09:Silicon Labs CP210x RS232 serial adaptor driver

デバイスは、/dev/ttyUSB0

となり、9600bps/8bit/non Parityでの通信となります。

2. 勤次郎 KTJ-100について

勤次郎 KTJ-100のシステムは、送信ユニット(KTJ-100)および受信ユニット(KTJ-10)により構成されます。
受信ユニットは、USB接続によりコンピュータに接続され、受電もUSBより行います。
送信ユニットは、単4電池x2本による駆動となり、窓際など、jjyの電波の入る場所に設置します。
本送信ユニットは、決められた間隔で36bitのデータを受信ユニットに送信します。
(受信のみで、送信による強制的なデータハンドリングの手段はありません)

#電池駆動のため、データの送信は1時間に1回程度となり、
#テスト用の強制モードで3分に1回の送信とすることが出来ますが、
#強制モードの場合、evolta電池であっても1ヶ月程度しか稼動しません。

3. ntpdでの使用方法

今回、検証用にデータプロトコルを入手し、2種類のプログラムを作成しました。
プロトコルの公開に関しては、現在は本製品購入者に対してのサポート窓口での受付のみとなるため、本ブログでは現時点では公開を行いません。
評価プログラムを利用した場合も公開は行われないとのことです。
#現在、サポートなしという条件の元、公開出来るかどうかの問い合わせ中です。

(1)時刻合わせ用のプログラムによりPC内部のクロックをを設定し、ntpdは、内部クロックにより調停する。

取得したデータによりdate設定するRubyスクリプトを作成しました。
必要に応じて、cronに登録し、自動実行します。

(2)ntpdプログラムのrefclock_jjyにkjt-100のデータハンドリングを追加する。

今回は、debian squeezeのソースパッケージを展開し、ntp-4.2.6.p2+dfsgに、kjt-100のデータハンドリングを追加しました。
今回手を入れたソースコードは、以下の2つになります。

ntpd/ntp_refclock.c
ntpd/refclock_jjy.c

今回実装したプログラムに関して、いくつかのメモを書いておきます。

1. 受信データは、本来のrefclock_jjyの仕組みでは、ntp_refclock内で一旦0x7fでマスクされてバッファ格納されますが、kjt-100は、STXが0xaa、予約領域もバイナリで不定、CRC16もバイナリ情報となるため、マスクを強制的に外す処理をしています。
そのため、もしこのntpdを1-4のモードの別の対応機器に繋いだ場合、結果が保証できません。
ntp-refclockに修正を行わない場合は、refclock_jjyでのCRC16チェックをあきらめる必要があります。

2. refclock_jjyプログラム内でのデータ整合性チェックは、
受信データ長
時刻および日付が正しい値かどうか ( ex: 0-59秒範囲内にあるかどうか )
チェックサム CRC-16による
受信ステータスのデータチェック
にて行いました。CRC-16は、0x0000スタートです。

3. ntp.confの設定と動作確認について

refclock_jjyプログラムは、デバイスを/dev/jjy* がデフォルトであるため、
1台目は/dev/jjy0となります。
kjt-100自体は/dev/ttyUSB0として認識されていますので、
ln -s /dev/ttyUSB0 /dev/jjy0
として、シンボリックリンクする必要があります。
また、Openblocksのディスク併用モードおよびinitrdの場合は、ファームウェア作成時に、このデバイスのリンクを
埋め込んでおく必要があります。(もしくは、rc.localで書いてもいい)
また、refclock_jjyのデバイスを/dev/ttyUSB*にすることでも回避出来ます。

今回追加した機器は、5番になるため、設定は以下の様になります。

server 127.127.40.0 mode 5
fudge 127.127.40.0 time1 0

以上、本プログラムにより、時刻調停が行われているかどうかは、以下のコマンドにて確認をしています。

root@obsa6:~/kjt-100# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
=============================================================
*JJY(0)          .JJY.            0 l   41   64  111    0.000  211.632 146.798

0 件のコメント:

コメントを投稿