打印

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

[复制链接]
2879|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 | 只看该作者
不知道是不是要读设备描述符,配置描述符,界面描述符和端点描述符之类的。

使用特权

评论回复
5
wangpe| | 2010-8-13 23:07 | 只看该作者
吧代码贴上来吧

使用特权

评论回复
6
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);
}

使用特权

评论回复
7
hanwe| | 2010-8-13 23:20 | 只看该作者
个人感觉,应该一路读下去,得到设备和端点的句柄,分清端点可读还是可写,通过句柄操作设备。

使用特权

评论回复
8
lium| | 2010-8-13 23:21 | 只看该作者
CYPRESS的USB芯片已经有了更高级的驱动程序,设备、端点已经封装为相应的类,不需要读的这么辛苦。

使用特权

评论回复
9
zhuww|  楼主 | 2010-8-13 23:23 | 只看该作者
其实我对usb基本是一窍不通,可是老师不给看书的时间,要求边做边学。最好能帮我把程序添上,谢谢

使用特权

评论回复
10
llia| | 2010-8-13 23:23 | 只看该作者
自己多学学,不要老想着要代码

使用特权

评论回复
11
sunmooning| | 2010-8-14 11:06 | 只看该作者
你用的是什么芯片啊。

使用特权

评论回复
12
dewlife| | 2010-8-14 11:10 | 只看该作者
读端点好像用的是控制传说模式吧,好久不做了,都有点生疏了。

使用特权

评论回复
13
sunmooning| | 2010-8-20 20:39 | 只看该作者
CY7C68013吗

使用特权

评论回复
14
阿毛| | 2010-8-25 12:35 | 只看该作者
lz最好用cyapi.sys这个驱动,代码相对容易看点,我个人觉得

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

893

主题

8252

帖子

1

粉丝