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 件のコメント:
コメントを投稿