EZ-USB FX2LP CY7C68013A 控制传输/自定义命令(上位机编程)
每一个USB device至少有一个控制端点——endpoint zero。当一个CCyUSBDevice实例成功执行了它的open()函数,一个名为ControlEndPt的CCyControlEndPoint实例也被创建。通常情况下,我们会用这个ControlEndPt来完成我们的控制端点数据传输。
CCyControlEndPoint是CCyUSBEndPoint抽象类的一个子类。
不同于bulk,isoc,和interrupt传输,控制传输需要如下留个参数:
- Target:其有效参数成员为:TGT_DEVICE, TGT_INTFC, TGT_ENDPT 和TGT_OTHER。一般不必关注,固定为:TGT-DEVICE。
- ReqType:其有效参数成员为:REQ_STD,REQ_CLASS和REQ_VENDOR。当传输自定义请求时,应该用REQ_VENDOR。
- Direction:其有效参数成员有:DIR_TO_DEVICE(表明传输方向为:主机到usb设备(out))和DIR_FROM_DEVICE(表示传输方向为:usb设备到主机(in))
- ReqCode: 八位二进制码值,不同的码值表示USB芯片应该执行的特定功能和命令。详见EZ_USB_TRM-Chapter 2 Endpoint Zero,Page2-6,Table 2-2. How the Firmware Handles USB Device Requests (RENUM=1)
表中,bRequest即为ReqCode。自定义请求码值是除0x00-0x0c和0Xa0-0xaf以外的其他值。
- Value:其值由ReqCode决定(详见:EZ_USB_TRM-Chapter 2 Endpoint Zero),这里的设定值将传给setupdat的【2:3】位。
- Index:其值有ReqCode决定(详见:EZ_USB_TRM-Chapter 2 Endpoint Zero),这里的设定值将传给setupdat的【4:5】位。
基本上,要对USB芯片(固件)进行自定义命令(vendor)传输,通常都是用控制传输进行的。使用控制传输in或者out方式都可以实现对固件的自定义命令传输。我们一般采用out方式实现自定义命令的传输。
控制传输的函数有:异步传输函数begindataxfer()和同步传输函数xferdata()以及Write()函数(out传输)和Read()函数(in传输)。控制传输请尽量用同步传输函数xferdata()而不是异步传输函数begindataxfer()。
综上所述,EZ-USB FX2(68013a)的控制传输/自定义命令传输的上位机编程函数模式如下:
UsbReq(UCHAR Req, LONG len, PUCHAR buf)
{
ept->Target=TGT_DEVICE;
ept->ReqType=REQ_VENDOR;
ept->Direction=DIR_TO_DEVICE;
ept->ReqCode=Req;
ept->Value=0;
ept->Index=0;
ept->XferData(buf,len);
}
注:此函数是用来往USB设备发送设备请求的,Req是设备请求类型(命令代码),len表示长度,buf为实际的数据,实际使用的时候需要申请buf空间,并且设置好各数据内容。如下:
PUCHAR buf=new UCHAR[buflen];
ZeroMemory(buf,buflen); //用0填充buf区,填充大小(buflen字节)
long len=buflen;
ept->XferData(buf, len);
另外,当调用read()和write()函数发送控制命令时,read()和write()函数首先将Direction参数设置为DIR_FROM_DEVICE或DIR_TO_DEVICE,然后调用XferData()函数。这样,我们就不用自己设置Direction属性了。这样代码看起来会更简洁,运行更高效。