2024年4月11日发(作者:)
第
11
章 上位机程序开发
173
║
pXmitBuf, iXmitBufSize,
pXmitBuf, iXmitBufSize,
&dwReturnBytes, ov);
return pXmitBuf;
}
17.设置电源接口IOCTL_ADAPT_SET_DEVICE_POWER_STATE
设置电源接口IOCTL_ADAPT_SET_DEVICE_POWER_STATE用于设置EZ-USB设备的
电源状态,其使用示例代码如下。
DWORD dwBytes = 0;
UCHAR pwrState = 0;
DeviceIoControl(hDevice, IOCTL_ADAPT_SET_DEVICE_POWER_STATE,//DeviceIoControl函数
&pwrState, sizeof (pwrState),
&pwrState, sizeof (pwrState),
&dwBytes, NULL);
其中,参数hDevice表示当前USB设备的句柄,参数pwrState表示电源状态码,参数
IOCTL_ADAPT_SET_DEVICE_POWER_STATE表示使用该接口进行通信。
18.设置传输字节接口IOCTL_ADAPT_SET_TRANSFER_SIZE
设置传输字节接口IOCTL_ADAPT_SET_TRANSFER_SIZE用于设置EZ-USB的传输字
节,其使用示例代码如下。
DWORD BytesXfered;
SET_TRANSFER_SIZE_INFO SetTransferInfo;
ntAddress = Address; //地址
erSize = 0x2000; //8 KB传输字节
DeviceIoControl(hDevice, IOCTL_ADAPT_SET_TRANSFER_SIZE, //DeviceIoControl函数
&SetTransferInfo, sizeof (SET_TRANSFER_SIZE_INFO),
&SetTransferInfo, sizeof (SET_TRANSFER_SIZE_INFO),
&BytesXfered, NULL);
11.1.2 CyAPI控制函数类
Cypress的cyioctl接口控制函数只是提供了基本的USB控制及传输操作,一般用于测试
USB设备的连接。如果需要进行更加详细的控制操作,则需用使用CyAPI控制函数类。
CyAPI控制函数类提供了更为精细的控制接口来读写EZ-USB FX2LP系列USB接口芯
片。在使用Cypress公司提供的驱动程序基础上,只需在Visual C++主机程序的加入头文件
CyAPI.h和库文件即可调用相应的控制函数。
CyAPI控制函数类主要包括8个控制类,包括块传输端点控制类CCyBulkEndPoint、控
制传输端点类CCyControlEndPoint、中断传输端点控制类CCyInterruptEndPoint、同步传输端
点控制类CCyIsocEndPoint、设备控制类CCyUSBDevice、配置信息类CCyUSBConfig、端点
控制类CCyUSBEndPoint和接口控制类CCyUSBInterface。下面分别进行介绍。
║
174
应用开发宝典
1.块传输端点控制类CCyBulkEndPoint
块传输端点控制类CCyBulkEndPoint主要用于块传输端点。在该类中最常用的函数是
BeginDataXfer,其函数原型为:
BeginDataXfer函数是一个非常好用的异步I/O传输方法。这个函数建立一个数据传输通
道,初始化传输,并且不用等待传输完毕,立刻返回。其使用代码示例如下。
CCyUSBDevice *USBDevice = new CCyUSBDevice(Handle);
OVERLAPPED outOvLap, inOvLap;
= CreateEvent(NULL, false, false, "CYUSB_OUT");
= CreateEvent(NULL, false, false, "CYUSB_IN");
char inBuf[128];
ZeroMemory(inBuf, 128);
char buffer[128];
LONG length = 128;
//初始化数据输入输出
UCHAR *inContext = USBDevice->BulkInEndPt->BeginDataXfer(inBuf, length,
&inOvLap);
UCHAR *outContext = USBDevice->BulkOutEndPt->BeginDataXfer(buffer, length,
&outOvLap);
//等待传输介绍
USBDevice->BulkOutEndPt->WaitForXfer(&outOvLap,100);
USBDevice->BulkInEndPt->WaitForXfer(&inOvLap,100);
//结束传输
USBDevice->BulkOutEndPt->FinishDataXfer(buffer, length, &outOvLap,outContext);
USBDevice->BulkInEndPt->FinishDataXfer(inBuf, length, &inOvLap,inContext);
//关闭输入输出
CloseHandle();
CloseHandle();
PUCHAR CCyBulkEndPoint::BeginDataXfer(PCHAR buf, LONG len, OVERLAPPED *ov)
2.控制传输端点类CCyControlEndPoint
在CCyControlEndPoint类中,同样定义了BeginDataXfer函数,用于异步I/O操作。这
里的函数原型如下。
该函数同样建立一个数据传输通道,初始化传输,并且不用等待传输完毕,立刻返回。
在这里主要用于控制端点的数据传输,如下所示。
CCyUSBDevice *USBDevice = new CCyUSBDevice(Handle);
PUCHAR CCyControlEndPoint::BeginDataXfer (PCHAR buf, LONG len, OVERLAPPED *ov)
第
11
章 上位机程序开发
175
║
// Just for typing efficiency
CCyControlEndPoint *ept = USBDevice->ControlEndPt;
OVERLAPPED OvLap;
= CreateEvent(NULL, false, false, "CYUSB_CTL");
char buffer[128];
LONG length = 128;
ept->Target = TGT_DEVICE;
ept->ReqType = REQ_VENDOR;
ept->Direction = DIR_TO_DEVICE;
ept->ReqCode = 0x05;
//长度
//请求码
在程序中,首先声明控制端点ept,并对ept进行了参数设置。共有5个参数,规定端点
0传输的方向,数据字节数等。下面分别介绍。
Target:控制传输中的一个重要的参数,其可取值为TGT_DEVICE、TGT_INTFC、
TGT_ENDPT和TGT_OTHER。
ReqType:请求的类型,其可取值为REQ_STD、REQ_CLASS和REQ_VENDOR。
Direction:控制端点数据传输的方向,其可取值为DIR_TO_DEVICE和DIR_FROM_
DEVICE两个。
ReqCode:请求的代码,在USB芯片的固件程序中,对该代码有专门的处理程序。
控制端点的通信,主要便是通过其来实现的。
Value:控制传输的重要参数,其值依赖于ReqCode参数。
Index:控制传输的重要参数,其值依赖于ReqCode参数。
本例中,对ept初始化表示数据从USB设备发送到主机,数据长度为128个字节。通过
BeginDataXfer函数将该命令发送USB设备。USB芯片得到这个请求后,在相应的请求代码
程序处理中将128个数据发送给主机,主机将接收到的数据保存在buffer中。
除此以外,该类中还定义了Write和Read函数,其函数原型为如下。
Write函数是一个简化版本的传输函数,将函数的传输方向固定为DIR_TO_DEVICE,即
主机向USB设备发送数据。Write函数的使用代码示例如下。
CCyUSBDevice *USBDevice = new CCyUSBDevice(Handle);
bool CCyControlEndPoint::Write(PCHAR buf, LONG &len)
bool CCyControlEndPoint::Read( PCHAR buf, LONG &len)
ept->Value = 1;
ept->Index = 0;
PUCHAR Context = ept->BeginDataXfer(buffer, length, &OvLap);
ept->WaitForXfer(&OvLap,100);
ept->FinishDataXfer(buffer, length, &OvLap,Context);
CloseHandle();
发布评论