以下に考えられる原因と、解決方法の案を示します。
1.Destination情報(アクセス先のRMAP層のアドレス情報)の設定が正しくない
・RMAP通信を行うためには、相手のノードへの到達方法(ロジカルアドレス、パスアドレス)、相手ノードからみた自ノードへの到達方法(ロジカルアドレ
ス、パスアドレス)、Destination Key(アクセス権限確認のためのパスワードのようなもの)、アクセス可能な単位バイト長、CRC(Cyclic Redunduncy Check code)の計算方法のバージョン番号などの情報(総称して、RMAP Destination情報という)を事前に把握して、RMAP通信の前にただしく設定しておく必要があります。これらの情報のすべてがただしくないと、RMAP通信は成功しません。
・たとえば、RMAPコマンドパケットに書かれたロジカルアドレスと、そのコマンドパケットを受け取ったノードのロジカルアドレスが異なると、RMAPアクセス
は拒否され、RMAP ReplyのStatus情報には、「Invalid Destination Logical Address」というエラーを表す「12(decimal)」が書き込まれたものがソースノードに送り返されます。
・したがって、rmaphongoを使用する前に、自分が使用しているボードがどのようなRMAP Destination設定になっているかをすべて把握しておくことが必要
です(各種ボードの設定は、マニュアルに記載されているか、購入もとに問い合わせて調べる必要があります)。
・rmaphongo上でRMAP Destination情報を再度設定するためには、Menuから「8」を選択し、プロンプトの表示に従って、情報を入力してください。いくつか
のSpaceWireボードで利用されるRMAP Destination情報は、プリセットとして登録されています。
・また、「Q」のような状態でソフトが永久待ちに入ってしまった場合は、「Ctrl+C」でrmaphongoを強制終了してから、再起動してください。
2.RMAPアクセスしたアドレスが正しくなく、Destinationノードのローカルバスがロックしてしまい、Replyパケットが生成されず、結果としてSourceノード
(SpaceCube側)でRMAPトランザクションが完了せず永久待ちに入ってしまっている
・RMAPアクセスでは、RMAPコマンドパケットに記述されたRead/Writeといったアクセスが、Destinationノードの側のローカルバス(たとえばSDRAMや、
FPGA内レジスタが並んだアドレス空間)で実行されます。このとき、たとえばアドレス0x00001234には何のデバイスも定義されておらず、RMAP IPコアがローカルバスに対してアクセスを行っても、どのデバイスからも返答がないとします。ローカルバスの仕様に、タイムアウトが定義されていれば、規定された時間でタイムアウトが発生し、RMAP IP側が、「ローカルバスアクセスに失敗した」ということを感知でき、そのことを表すRMAP Replyパケットを生成してSourceノードに失敗を通知できます。一方で、ローカルバスにタイムアウトがない場合、誰からも返答が帰らない状態でバスがロックし続け、RMAP IPコアはReplyパケットを返せず、Sourceノード側ではReplyパケットを待ち続ける、という状態が発生します。
・解決方法は、アクセスしようとしているアドレスが本当にそのDestinationノードで定義されているか確認する、また、そのDestinationノードで定義されてい
ることがわかっている他のアドレスにアクセスしてみて、アクセスが成功するか確認する、などがあげられます。場合によっては、ボードの(FPGA内のロジックの)改変などによって、アドレスマッピングが変更されている可能性もあるので、製造元に最新版のアドレスマップを問い合わせる必要があるかもしれません。
・この種類のロックが発生している場合、Destinationノード側では、次のRMAP Commandパケットを受け取っても、前の処理がロックしたまま終了していないので、次の処理に移行できません。一度ボードの電源を切るなどして、バスのロック解除とRMAP IPの初期化を行う必要があると考えられます。
<参考文献>
・ RMAP仕様書Draft F Table6-1