標準TTLだけ(!)でCPUをつくろう!(組立てキットです!)
(ホントは74HC、CMOSなんだけど…)
[第652回]

●GET DEVICE DESCRIPTOR

前回は setupckサブルーチンの説明をいたしました。
SIEがSETUPパケットを受信すると、BD0STATのbit2からbit5にSETUPパケットのPID、1101が入ります。
setupサブルーチンはそれを確認するとzフラグをonにしてリターンします。

今回は、call setupck の次の処理について説明します。

;
	call setupck
	bnz checkbd2
;"setup" received
	call senddvck;"80"+"06"?
	bnz setadcheck
;(1)"GET DESCRIPTOR('80'+'06')" received
	movf db3,w
	sublw 1; 1 or 2? 1:dev.descriptor 2:config descreptor
	bnz sendconf
;send DEVice DSCRPTR
	movlw 12
	cpfseq db6
	call resetADDR
	call setbd2
	call setbd0
	call setbd1	
	goto looptop
;


SETUPパケットが検出されたら、次はUSBホストコントローラから送られてきたSETUPコマンドの解析をします。
SETUPが開始されて一番最初に送られてくるコマンドはGET DESCRIPTORですが、このHIDプログラムはつねにlooptopに戻って繰り返し実行しますから、SETUPの処理が進んでからも同じところを通過します。
ですから最初のコマンドなのかその次のコマンドなのかということはプログラムでは判別していません。
常にコマンドの中身をチェックして必要な処理に分岐します。

ですが順序としては、最初にGET DESCRIPTORコマンドかどうかの確認をします。
そのチェックをするのがsenddvckサブルーチンです。

senddvck
	movf db0,w
	sublw 80; check "80"+"06"
	bz senddvck2
	return
senddvck2
	movf db1,w
	sublw 06
	return


USBホストコントローラから送られてくるコマンドは8バイト長です。
GET DESCRIPTORコマンドは、第1バイトが80で第2バイトが06です。
senddvckサブルーチンはそれをチェックします。一致すればzフラグをonにします。
各バイトデータはseupckサブルーチンでdb0(第1)、db1(第2)、db2(第3)、db3(第4)、db6(第7)に格納されています。

それでは、さきほどのメインルーチンに戻ってcall senddvck の続きを見てみましょう。
GET DESCRIPTORコマンドを検出しても、まだ次にチェックすることが残っています。
GET DESCRIPTORコマンドはその名の通りデバイスにDESCRIPTORの送信を要求しているのですが、同時にどういうDESCRIPTORかということも指定しています。
その指定は第4バイトにあります。
第4バイトが01のときは、DEVICE DESCRIPTORの要求です。
02のときは、CONFIG DESCRIPTORの要求です。
プログラムだけを見ているとわかりにくいと思います。
[第630回]あたりの説明を参照しながらプログラムを見ていただきますと、ああそうか、と納得されると思います。
ここでは、最初に送られてくるGET DEVICE DESCRIPTORコマンド
80 06 00 01 00 00 40 00
をチェックしているのです。
第7バイトはホストコントローラが送れと要求しているデスクリプタのバイト数です。
DEVICE DESCRIPTORのバイト数は18バイトですが、大抵最初のGET DESCRIPTORではここに書きましたように、それより大きい値になっています。
ここでは40(16進数)ですから64バイトです。

メインプログラムではその第7バイトが12(十進の18)かどうかをチェックしていますが、その理由についてはもう少しさきのところで説明することになると思います。
それほど長いプログラムではないのですけれど、このEnumerationというのはほんとに嫌になってしまうくらい面倒な手続きをしなければなりません。
今はやっとその入り口をほんの少し過ぎたあたりです。
GET DEVICE DESCRIPTORを検出したので、それに応えて、DEVICE DESCRIPTORを送出する用意をします。
それがsetbd2サブルーチンです。

今回は時間がなくなってしまいましたので、setbd2サブルーチンについては次回に説明することに致します。
2010.11.2upload

前へ
次へ
ホームページトップへ戻る