打印

USB设备的端点

[复制链接]
944|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yufe|  楼主 | 2015-12-17 21:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
网上有个testUSB程序,可以查找所有连接的usb设备。我现在编的界面,是读插入的IC卡的数据库及改写其中数据,密码等。首先刷新设备,查找到所有连接的USB设备,选择设备后又要选择设备的一个端点。
  我不会的就是如何读出USB设备的端点来,usb100.h中的typedef struct _USB_INTERFACE_DESCRIPTOR有UCHAR bNumEndpoints,但是我直接调用程序有问题,自动关闭了界面。
沙发
llia| | 2015-12-17 21:42 | 只看该作者
打开了usb控制器,HUB?读出了port的数目了吗?

使用特权

评论回复
板凳
yufe|  楼主 | 2015-12-17 21:42 | 只看该作者
是的,不知道下面该怎么编了。

使用特权

评论回复
地板
yufe|  楼主 | 2015-12-17 21:43 | 只看该作者
不知道是不是要读设备描述符,配置描述符,界面描述符和端点描述符之类的。

使用特权

评论回复
5
llia| | 2015-12-17 21:43 | 只看该作者
把代码贴上来吧

使用特权

评论回复
6
yufe|  楼主 | 2015-12-17 21:44 | 只看该作者

#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
wangpe| | 2015-12-17 21:44 | 只看该作者
个人感觉,应该一路读下去,得到设备和端点的句柄,分清端点可读还是可写,通过句柄操作设备。

使用特权

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

使用特权

评论回复
9
wangzsa| | 2015-12-17 21:44 | 只看该作者
读端点好像用的是控制传说模式吧,好久不做了,都有点生疏了。

使用特权

评论回复
10
zhuww| | 2015-12-17 21:45 | 只看该作者
lz最好用cyapi.sys这个驱动,代码相对容易看点,我个人觉得

使用特权

评论回复
11
yufe|  楼主 | 2015-12-17 21:45 | 只看该作者
好,采纳楼上意见

使用特权

评论回复
12
e_007| | 2015-12-20 17:53 | 只看该作者
本帖最后由 e_007 于 2015-12-20 17:56 编辑

WDM/WDK的代码?看样子,没有得到EPS.NUM前,楼主尚需轮回下去吧,for(){:D:Q:'(:lol:shutup:}

使用特权

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

本版积分规则

983

主题

10170

帖子

1

粉丝