前記事ではコントロール転送とインタラプト転送が同時に動かないで悩んでいたのですが、対処方法が見つかってあっさりと動いてしまいました。
SSPではコントロール転送、インタラプト転送に加えて、バルク転送も必要となるので、バルク転送のパイプも追加で開いて読み取りを始めたところ、なんと全ての転送が順調に動くようになってしまいました。もしかすると、インタラプト転送を使うためにはバルク転送も併用しないといけないというようなバグがドライバに潜んでいるのかもしれません。参考までに、各パイプを開くために使ったディスクリプタ定義を残しておきます。
USB_LDDのAPIでは、インタラプト転送やバルク転送の読み取りは、転送が完了するかエラーが発生するとコールバックがかかります。デバイス側からの読み取りデータが無い場合にはNACKが返ってきますが、その場合にはドライバが次のフレームで再度INトークンを送出してくれます。この周期処理はドライバが面倒を見てくれますので、アプリケーションでは、転送が完了した場合には再度読み取りを開始してやればいいことになります。
こうして無事にBTstackが動いてくれました。
BTStackが立ち上がった状態では、ペアリング待ちになっていますので、スマホからペアリングしてやります。
ペアリングが完了したらスマホからSPPで接続してやります。。
SSP counterアプリケーションは、毎秒インクリメントしていく数字を出力するだけの単純なアプリですが、その動作を確認することができました。
SPP counterは比較的あっさりと動いてしまいました。当初、ペアリングの途中でハングしていたのですが、BTstackタスクに割り当てるスタックが不足していたのが原因でした。
SSPではコントロール転送、インタラプト転送に加えて、バルク転送も必要となるので、バルク転送のパイプも追加で開いて読み取りを始めたところ、なんと全ての転送が順調に動くようになってしまいました。もしかすると、インタラプト転送を使うためにはバルク転送も併用しないといけないというようなバグがドライバに潜んでいるのかもしれません。参考までに、各パイプを開くために使ったディスクリプタ定義を残しておきます。
LDD_USB_Host_TPipeDescr Pipe1Descr = { 1, /* Device address */ LDD_USB_FULL_SPEED, /* Device speed */ 1, /* EP number */ LDD_USB_DIR_IN, /* EP direction */ LDD_USB_INTERRUPT, /* EP Transfer type */ 16, /* EP max. packet size */ 0, /* Transaction pre microframe */ 1, /* Interval for polling endpoint for data transfer */ 0, /* NAK count */ 0 /* 1 = ZLT */ }; LDD_USB_Host_TPipeDescr Pipe2InDescr = { 1, /* Device address */ LDD_USB_FULL_SPEED, /* Device speed */ 2, /* EP number */ LDD_USB_DIR_IN, /* EP direction */ LDD_USB_BULK, /* EP Transfer type */ 64, /* EP max. packet size */ 0, /* Transaction pre microframe */ 0, /* Interval for polling endpoint for data transfer */ 0, /* NAK count */ 0 /* 1 = ZLT */ }; LDD_USB_Host_TPipeDescr Pipe2OutDescr = { 1, /* Device address */ LDD_USB_FULL_SPEED, /* Device speed */ 2, /* EP number */ LDD_USB_DIR_OUT, /* EP direction */ LDD_USB_BULK, /* EP Transfer type */ 64, /* EP max. packet size */ 0, /* Transaction pre microframe */ 0, /* Interval for polling endpoint for data transfer */ 0, /* NAK count */ 0 /* 1 = ZLT */ };
USB_LDDのAPIでは、インタラプト転送やバルク転送の読み取りは、転送が完了するかエラーが発生するとコールバックがかかります。デバイス側からの読み取りデータが無い場合にはNACKが返ってきますが、その場合にはドライバが次のフレームで再度INトークンを送出してくれます。この周期処理はドライバが面倒を見てくれますので、アプリケーションでは、転送が完了した場合には再度読み取りを開始してやればいいことになります。
こうして無事にBTstackが動いてくれました。
BTStackが立ち上がった状態では、ペアリング待ちになっていますので、スマホからペアリングしてやります。
ペアリングが完了したらスマホからSPPで接続してやります。。
SSP counterアプリケーションは、毎秒インクリメントしていく数字を出力するだけの単純なアプリですが、その動作を確認することができました。
SPP counterは比較的あっさりと動いてしまいました。当初、ペアリングの途中でハングしていたのですが、BTstackタスクに割り当てるスタックが不足していたのが原因でした。