2020年4月5日日曜日

EZ-USB FX2LP を動かしてみる (41) dataflow系のlogを出せるのか?

EZ-USBをDCCとして動かすために努力中.

だが本質的なところはあまり判っていない.

これまでの当シリーズで見てきたのは、
  1)descriptor
  2)request     (descriptorを返信せよとかいう設定系やり取りのこと)
  3)BULKOUT
  4)BULKIN
こんなところまでだった.

3はFIFOにデータが積まれたflagを監視して外部回路で読み出せばだいたい動く.
4は外部回路からFIFOにデータを積めばez-usbとhostが勝手に相談して送信してくれる.
等時性に頓着しないデータ転送はあまり悩まなくても動いてくれてお気楽極楽だ.

USBではdeviceが勝手に喋ってはならない(IN).deviceがdataを抱えているときはどうするのか?
BULK転送モードの場合は、hostの気が向いたときに「deviceさん何か意見ある?」と聞いてくれるので、deviceは発言の機会を得る.
INTERRUPT転送モードになるともう少し賢くて、descriptorのEPの項に「hostには4ms毎にpollingしてもらいたく候」などと書かれている.

これまでの当シリーズでわたしが知ったのはそんなところまでだった.


ところがDCCとして動かすには、FIFOアンダーフローやオーバーフローを完璧に抑止する必要がある.
データレートを調節するためにfeedback EPを併用する.これがちょいと難しくて、packetやpipeについての知識を深めないと判んない感じ.

USB規格書をいくら読んだところで机上の知識は所詮は机上の知識だ.せっかくEZ-USBをいじって遊んでいるのだから、EZ-USBに到来するtransactionをlogとして吐かせたく思う.

既にEZ-USB firmwareに実装してあるのは、設定系の挙動をlogに吐かせるようにはした.
どうやって実装するのかというと、EZ-USBにはSUDAV割り込みというのがある.SUDAV割り込みが発生したら、setup packetがSETUPDAT[]に入ってくる.USB規格書の中から該当する箇所を探せば何をしたいrequestなのかが判る.

さていまは、DCC開発のために、data flow系の挙動を監視したい.とりわけfeedbackの挙動を監視したい.(=IN方向)
IN方向の伝送の場合、EZ-USBのfirmwareがやれるのはFIFOに積んで送信フラグを立てるところまでである.
実際に送信するのはEZ-USB hardwareの役目である.送信開始トリガはINトークンを受信した時だ.INトークンとはすなわち、hostから「何か喋ってもよい」と言われた瞬間だ.※

そこでINトークンをlogに出すために、何かイイ割り込みはないかな?とEZ-USB data sheetを読むとこんなのがある.FIFO dataがご用意できました割り込みである.
だけどこれは使えないかなぁ.FIFOとトークンは違うから.
INトークン割り込みがあったら便利なのだけどそういうのはEZ-USBには存在しない.残念.

※ USBの何かの資料にこんなことが書かれていた.
INトークンを受け取ってからfirmwareがデータの用意をしたのでは遅すぎる.あらかじめFIFOにデータを積んでおく必要がある.それが何時転送されるかはEZ-USBは知る由もない.何時になるかはhost次第である.

というわけで、dataflowの挙動をlogに吐かせるのは難しいようだ.残念.

かしこ

→INDEXページへ

0 件のコメント:

コメントを投稿