求助!读usb设备的端点信息

[复制链接]
4496|13
 楼主| zhuww 发表于 2010-8-13 22:43 | 显示全部楼层 |阅读模式
本人初学vc,所以请大侠们能够详细讲解,最好能给出详细代码。
  网上有个testUSB程序,可以查找所有连接的usb设备。我现在编的界面,是读插入的IC卡的数据库及改写其中数据,密码等。首先刷新设备,查找到所有连接的USB设备,选择设备后又要选择设备的一个端点。
  我不会的就是如何读出USB设备的端点来,usb100.h中的typedef struct _USB_INTERFACE_DESCRIPTOR有UCHAR bNumEndpoints,但是我直接调用程序有问题,自动关闭了界面。
wangpe 发表于 2010-8-13 23:03 | 显示全部楼层
打开了usb控制器,HUB?读出了port的数目了吗?
 楼主| zhuww 发表于 2010-8-13 23:03 | 显示全部楼层
是的,不知道下面该怎么编了。
 楼主| zhuww 发表于 2010-8-13 23:04 | 显示全部楼层
不知道是不是要读设备描述符,配置描述符,界面描述符和端点描述符之类的。
wangpe 发表于 2010-8-13 23:07 | 显示全部楼层
吧代码贴上来吧
 楼主| zhuww 发表于 2010-8-13 23:14 | 显示全部楼层
#include "usb100.h";
#include "usbioctl.h";
#include "usbdi.h";

void CICcard::OnUpdateMachine()
{
PUSB_NODE_CONNECTION_INFORMATION connectionInfo;
HANDLE hHubDevice;
for (HCNum = 0; HCNum < NUM_HCS_TO_CHECK; HCNum++)
{
  wsprintf(HCName, "\\\\.\\HCD%d", HCNum);
  hHCDev = CreateFile(HCName, //打开USB控制器
  GENERIC_WRITE,
  FILE_SHARE_WRITE,
  NULL,
  OPEN_EXISTING,
  0,
  NULL);
  if(hHCDev=INVALID_HANDLE_VALUE) break;
  PCHAR driverKeyName, deviceDesc;
  driverKeyName = GetHCDDriverKeyName(hHCDev);

  rootHubName =(char*) GetRootHubName(hHCDev);
  if(rootHubName==NULL)
  goto end;

  PUSB_NODE_INFORMATION HubInfo;
  HubInfo = (PUSB_NODE_INFORMATION)malloc(sizeof(USB_NODE_INFORMATION));
  PCHAR deviceName;
  deviceName = (PCHAR)malloc(strlen(rootHubName) + sizeof("\\\\.\\"));
  if (rootHubName != NULL)
  {
  strcpy(deviceName, "\\\\.\\");
  strcpy(deviceName + sizeof("\\\\.\\") - 1, rootHubName);
  hHubDevice = CreateFile(deviceName, //打开Hub
  GENERIC_WRITE,
  FILE_SHARE_WRITE,
  NULL,
  OPEN_EXISTING,
  0,
  NULL);
  free(deviceName);
  if(hHubDevice == INVALID_HANDLE_VALUE)
  goto end;   
  success = DeviceIoControl(hHubDevice,
  IOCTL_USB_GET_NODE_INFORMATION,
  HubInfo,
  sizeof(USB_NODE_INFORMATION),
  HubInfo,
  sizeof(USB_NODE_INFORMATION),
  &nBytes,
  NULL);
  if (!success)
  goto end;
  }

  int port;
  port=HubInfo->u.HubInformation.HubDescriptor.bNumberOfPorts; //读端口数
  for(index=1; index <= port; index++)
  {
  ULONG nBytes;
  nBytes = sizeof(USB_NODE_CONNECTION_INFORMATION) +
  sizeof(USB_PIPE_INFO)*30;
  connectionInfo = (PUSB_NODE_CONNECTION_INFORMATION)malloc(nBytes);
  if(connectionInfo == NULL)
  goto end;
  connectionInfo->ConnectionIndex = index;
  success = DeviceIoControl(hHubDevice,
  IOCTL_USB_GET_NODE_CONNECTION_INFORMATION,
  connectionInfo,
  nBytes,
  connectionInfo,
  nBytes,
  &nBytes,
  NULL);
  if (!success)
  {
  free(connectionInfo);
  goto end;
  }
  deviceDesc = NULL;
  if(connectionInfo->ConnectionStatus != NoDeviceConnected)
  {
  driverKeyName = GetDriverKeyName(hHubDevice,
  index);
  if(driverKeyName)
//估计在这里开始加程序吧?
  }
  }
  end:;  
  }
  CloseHandle(hHubDevice);
  CloseHandle(hHCDev);
}
hanwe 发表于 2010-8-13 23:20 | 显示全部楼层
个人感觉,应该一路读下去,得到设备和端点的句柄,分清端点可读还是可写,通过句柄操作设备。
lium 发表于 2010-8-13 23:21 | 显示全部楼层
CYPRESS的USB芯片已经有了更高级的驱动程序,设备、端点已经封装为相应的类,不需要读的这么辛苦。
 楼主| zhuww 发表于 2010-8-13 23:23 | 显示全部楼层
其实我对usb基本是一窍不通,可是老师不给看书的时间,要求边做边学。最好能帮我把程序添上,谢谢
llia 发表于 2010-8-13 23:23 | 显示全部楼层
自己多学学,不要老想着要代码
sunmooning 发表于 2010-8-14 11:06 | 显示全部楼层
你用的是什么芯片啊。
dewlife 发表于 2010-8-14 11:10 | 显示全部楼层
读端点好像用的是控制传说模式吧,好久不做了,都有点生疏了。
sunmooning 发表于 2010-8-20 20:39 | 显示全部楼层
CY7C68013吗
阿毛 发表于 2010-8-25 12:35 | 显示全部楼层
lz最好用cyapi.sys这个驱动,代码相对容易看点,我个人觉得
您需要登录后才可以回帖 登录 | 注册

本版积分规则

893

主题

8252

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部