做过wince下USB驱动请进

时间:2021-03-11 17:57:58
做过wince下USB驱动请进,我现在做的是关于USB协议层驱动的编写,现在可以读出:设备描述符、配置描述符、接口描述符、字符串描述符。
但是却都不到端点描述符。
如何设置断点属性呢?比如说:那个端点配置输入,那个端点配置输出,还有配置成中断方式、批量传输方式?

如果有人做过,能否发一份给我?感激不尽!
我的邮箱:lh806732@163.com

77 个解决方案

#1


你是做HOST驱动还是DEVICE驱动?
如果是DEVICE驱动,没有获取端点描述符可能是因为你所走的协议问题,或者是之前的描述符不对,比如说在接口描述符里要告诉HOST有几个端点。

#2


我做的是HOST驱动,主要是要接收示波器发送过来的数据。
现在端点都读不到。
我在接口描述符里面看到bNumEndpoint一直是0。
读取接口描述符我用了lpGetDescriptor却不行。不知道是不是跟第六个参数有关。
(*pUSBD->usbFuncs->lpGetDescriptor)(pUSBD->hUSBDevice,
NULL,
NULL,
USB_SHORT_TRANSFER_OK,
*pBufIn,//USB_ENDPOINT_DESCRIPTOR_TYPE,
0,
0,// 0或语言ID
sizeof(USB_ENDPOINT_DESCRIPTOR),
&EndpointDescriptor
);

读取端点描述符的时候读出来的却是配置描述符:
(*pUSBD->usbFuncs->lpGetDescriptor)(pUSBD->hUSBDevice,
NULL,
NULL,
USB_SHORT_TRANSFER_OK,
*pBufIn,//USB_STRING_DESCRIPTOR_TYPE,
0,
0,// 0或语言ID
sizeof(USB_CONFIGURATION_DESCRIPTOR),
&CfgDescriptor
);

#3


该回复于2009-10-29 11:08:42被版主删除

#4


HOST的没做过,不了解,你找下BSP中的其它USB HOST参考一下吧。

#5


DEVICE驱动比做HOST驱动流行? 

#6


引用 4 楼 veabol 的回复:
HOST的没做过,不了解,你找下BSP中的其它USB HOST参考一下吧。


你做过DEVICE的驱动,能否给我参考一下?

现在很迷茫了对这个HOST驱动。

#7


不知道为什么lpInterfaces(接口描述符指针)都是有效的,如下:
    pInterface = pUSBD->lpDeviceInfo->lpActiveConfig->lpInterfaces;
     if (NULL == pInterface)
    {
        RETAILMSG(USBOSC_ERR_MSG, (TEXT("OSC: pInterface is NULL !\r\n")));
    }
这里没有打印出错误信息。


而到下一级lpEndpoints(端点描述符指针)却是空的,如下:

    pEndpoint = pUSBD->lpDeviceInfo->lpActiveConfig->lpInterfaces->lpEndpoints;
     if (NULL == pEndpoint)
    {
        RETAILMSG(USBOSC_ERR_MSG, (TEXT("OSC: pEndpoint  is NULL !\r\n")));
    }
这里就打印出了错误信息。

#8


该回复于2009-10-29 11:08:31被版主删除

#9


该回复于2009-10-29 11:09:02被版主删除

#10


你的枚举成功了么,你现在估计还卡在枚举的问题上啊,在枚举的时候,反复发Get_Device_Descriptor是协议规定的,而且会发送好几次,最后才得到包长等数据,然后获得端口数据,然后设置地址。

#11


现在所有的借口、端点描述符都可以读到了,接下来还需要做些什么动作吗?
比如说要怎么样来传输数据呢?

高手指点,小弟第一次做。

#12


来学习了啊  。。。

#13


up

#14


现在碰到一个问题:驱动里面传给应用的pBufOut在驱动里面可以正常把接口描述符打印出来,而应用里面通过pBufOut打印出来的接口描述符完全是错误的?几个同事都看了没发现什么问题!


公司不允许贴代码出来,没有权限....................要不然我会把代码贴出来。

高手不如赐教!

#15


up 

#16


公司不允许贴代码出来,没有权限....................要不然我会把代码贴出来?HOST做过,可是你说的真的不是很明白啊,你的代码也不好说啊

#17


來學習了····

#18


该回复于2009-10-30 09:09:04被版主删除

#19


做过wince下USB驱动请进

#20


不错,很好,学习下。

#21


这活不错,给钱我帮你写。

#22


现在所有的描述符都已经读到了,接下来是不是要使用SetFeature来设置接口、端点。根据接口里面有一项bAlterateSetting不同的值(我的设备这项的从0~3),在值为0时,我发现时没有端点的。只有从1~3时,才可以看得到都有6个端点。

现在有2个问题:
1、 下一步是否是用SetFeature来设置接口的bInterfaceNumber和bAlterateSetting,并决定使用哪个端点作为输出,哪个端点作为输入。对于输入和输出端点有没有什么特别的要求? 
我用的是快(Bulk)传输,中断暂时不考虑。

2、 USB数据包如何解压?是否有一个标准?


高手继续指点!

#23


为什么没有人顶!!!!!!!!!!!!

#24


该回复于2009-11-16 08:58:24被版主删除

#25


学习来的

#26


学习来的

#27


up

#28


该回复于2009-10-31 08:12:47被版主删除

#29


mark下~~~

#30


MARK 

#31


刚要学,先搬个板凳学习

#32


引用 22 楼 oneonce 的回复:
现在所有的描述符都已经读到了,接下来是不是要使用SetFeature来设置接口、端点。根据接口里面有一项bAlterateSetting不同的值(我的设备这项的从0~3),在值为0时,我发现时没有端点的。只有从1~3时,才可以看得到都有6个端点。

现在有2个问题:
1、下一步是否是用SetFeature来设置接口的bInterfaceNumber和bAlterateSetting,并决定使用哪个端点作为输出,哪个端点作为输入。对于输入和输出端点有没有什么特别的要求?
我用的是快(Bulk)传输,中断暂时不考虑。

2、USB数据包如何解压?是否有一个标准?


高手继续指点!



从你的问题来看我觉得你是在做client(device)驱动。其实在public下的usbfn下是有部分代码的,就看你是那种class,有USB网卡,USBserial,USBstorage。你可以看看

#33


我只是不确定要不要取SetFeature,所以我问一下。

我现利用读出来的描述符,使用1个输入(读)端点和一个输出(写)端点分别来做批量输入和批量输出。
现在发现:
1、端点打开成功了。但是我应用程序调用批量输入或输出时,基本上就卡死了。
2、批量输出如下:
usbTransfer = (*pUSBD->usbfuncs->lpIssueBulkTransfer)
                                           (pUSBD->BulkOut.Pipe//所打开端点的句柄
                                                  NULL,
                                            NULL,
                                             USB_OUT_TRANSFER  |  USB_SHORT_TRANSFER_OK,
                                            dwLenIn,
                                            pBufIn,
                                            NULL);
if (NULL==usbTransfer)
{
    ................
}

高手指点!!!!!!!!!!

#34


引用 33 楼 oneonce 的回复:
我只是不确定要不要取SetFeature,所以我问一下。

我现利用读出来的描述符,使用1个输入(读)端点和一个输出(写)端点分别来做批量输入和批量输出。
现在发现:
1、端点打开成功了。但是我应用程序调用批量输入或输出时,基本上就卡死了。
2、批量输出如下:
usbTransfer = (*pUSBD->usbfuncs->lpIssueBulkTransfer)
                                          (pUSBD->BulkOut.Pipe//所打开端点的句柄
                                                  NULL,
                                            NULL,
                                           USB_OUT_TRANSFER|USB_SHORT_TRANSFER_OK,
                                            dwLenIn,
                                            pBufIn,
                                            NULL);
if (NULL==usbTransfer)
{
    ................
}

高手指点!!!!!!!!!!



你的这个函数你好好看看参数的意思。。。USB_OUT_TRANSFER|USB_SHORT_TRANSFER_OK,
你这个事同步的表达吧。。。没有发出去就不会返回。。。你用USBNOwait估计就立即返回了。。研究下这个函数

#35



我使用USB_NO_WAIT对设备进行读,是会一下子返回,但是pBufOut里面却是没有值的,
usbTransfer = (*pUSB->usbFuncs->lpIssueBulkTransfer)
                                   (pUSB->BulkIn.Pipe,//所打开端点的句柄
                                    NULL,
                                    null,
                                    USB_OUT_TRANSFER |  USB_NO_WAIT,
                                    dwLenOut,
                                    pBufOut,
                                    NULL);

如果使用事件来同步,不知道有没有值,我这里老提示我参数不对,不知道怎么传参数!

typedef USB_TRANSFER (* LPISSUE_BULK_TRANSFER)(USB_PIPE,
                                                LPTRANSFER_NOTIFY_TOUTINE,
                                                LPVOID,
                                               DWORD,
                                               DWORD,
                                               LPVOID,
                                               ULONG);

好像跟有的地方定义又不一样!!!!主要是第二个和第三个参数,不知道怎么传!

高手指点!

#36



创建事件:第二个参数我传了 TRUE,因为我不知道现在是要手动还是自动?我看了PUBLIC下打印机的也是传了一个TRUE ???pUSBD->BulkIn.hEvent =  CreateEvent(NULL,  TRUE, FALSE, TEXT("USBOSC BulkIn"));

下面就是使用同步传输了?
usbTransfer = (*pUSB->usbFuncs->lpIssueBulkTransfer)(
             pUSB->BulkIn.Pipe,//端点句柄
             (LPTRANSFER_NOTIFY_ROUTINE)(*(pUSB->usbFuncs->lpIssTransferComplete)),
             pUSB->BulkIn.hEvent,
             USB_OUT_TRANSFER | USB_SHORT_TRANSFER_OK,
             dwLenOut,
             pBufOut,
             NULL);

好像结果也不行啊!!!!!!!!!!!

#37


相当不好意思,上面的 USB_OUT_TRANSFER应该改为 USB_IN_TRANSFER,现在可以读到数据,但是不知道怎来解析这写数据?

USB数据包是不是有一个固定的打包标准? 应该如何来解析数据包呢?

高手指点!

#38


终于有结果了啊。。呵呵。。。这些你就得研究下协议了。。。不过网上有很多吧 功夫不负有心人啊

#39


为什么wince下面没有SetConfiguration,GetConfiguration?我现在是直接用读到的端点来通讯的,但是我Bus Hound读PC对USB的操作时有SetConfiguration操作的?wince为什么没有?

还有我现在不知道如何来读取和写示波器那一个通道(示波器有4个通道)?

#40


搞错了,没有读到数据,是我写的应用申请内存后没有初始化?狂晕!

批量输入调用如下:
usbTransfer = (*pUSB->usbFuncs->lpIssueBulkTransfer)
        (pUSB->BulkIn.hPipe ,//批量输入管道句柄
        (LPTRANSFER_NOTIFY_ROUTINE)(*pUSB->usbFuncs->lpIsTransferComplete)), //回调函数
        pUSB->BulkIn.hEvent ,//同步事件
        USB_ IN_TRANSFER | USB_SHORT_TRANSFER_OK,
        dwLenOut,
        pBufOut ,//读出的数据放在pBufOut内存中
        NULL);
if (NULL == usbTransfer)
{
    ...
}

高手指点一下为什么没有读到数据呢!pBufOut一直都是空(也就是初始化为0),一直都是0.

#41


顶贴,学习~~~~~

#42


批量输入管道句柄获取方式:
pUSB-> BulkIn.hPipe = (*pUSB->usbFuncs-> lpOpenPipe)(pUSB->hUSBDevice, //USB设备句柄
                                                 pEndpoint //指向要打开的端点描述符的指针
                                                 );

高手指点啊!急~

#43


mark

#44


[color=#FF0000] 难道没有人做过USB HOST驱动吗?[/color]

#45


遇到一个USB问题。楼主是否知道usb初始化怎么做?我的2440唤醒后usb就不能用(没有5V电源输出)

#46


初始化读取描述符都是由USBD操作完成的,具体我也不知道。

#47


帮顶一下.

#48


哎,为什么大家都没有做过wince USB HOST驱动呢? 还是不想说!
可能中国人就是这样,所以中国总是没有进步。

#49


呵呵。。哥们。。你很努力啊。。你的QQ是多少啊。。。我们可以讨论下。。虽然我也很菜

#50


我QQ:174646138, 公司邮箱:hua.liang@cnlaunch.com
上班的时候上不了QQ

#1


你是做HOST驱动还是DEVICE驱动?
如果是DEVICE驱动,没有获取端点描述符可能是因为你所走的协议问题,或者是之前的描述符不对,比如说在接口描述符里要告诉HOST有几个端点。

#2


我做的是HOST驱动,主要是要接收示波器发送过来的数据。
现在端点都读不到。
我在接口描述符里面看到bNumEndpoint一直是0。
读取接口描述符我用了lpGetDescriptor却不行。不知道是不是跟第六个参数有关。
(*pUSBD->usbFuncs->lpGetDescriptor)(pUSBD->hUSBDevice,
NULL,
NULL,
USB_SHORT_TRANSFER_OK,
*pBufIn,//USB_ENDPOINT_DESCRIPTOR_TYPE,
0,
0,// 0或语言ID
sizeof(USB_ENDPOINT_DESCRIPTOR),
&EndpointDescriptor
);

读取端点描述符的时候读出来的却是配置描述符:
(*pUSBD->usbFuncs->lpGetDescriptor)(pUSBD->hUSBDevice,
NULL,
NULL,
USB_SHORT_TRANSFER_OK,
*pBufIn,//USB_STRING_DESCRIPTOR_TYPE,
0,
0,// 0或语言ID
sizeof(USB_CONFIGURATION_DESCRIPTOR),
&CfgDescriptor
);

#3


该回复于2009-10-29 11:08:42被版主删除

#4


HOST的没做过,不了解,你找下BSP中的其它USB HOST参考一下吧。

#5


DEVICE驱动比做HOST驱动流行? 

#6


引用 4 楼 veabol 的回复:
HOST的没做过,不了解,你找下BSP中的其它USB HOST参考一下吧。


你做过DEVICE的驱动,能否给我参考一下?

现在很迷茫了对这个HOST驱动。

#7


不知道为什么lpInterfaces(接口描述符指针)都是有效的,如下:
    pInterface = pUSBD->lpDeviceInfo->lpActiveConfig->lpInterfaces;
     if (NULL == pInterface)
    {
        RETAILMSG(USBOSC_ERR_MSG, (TEXT("OSC: pInterface is NULL !\r\n")));
    }
这里没有打印出错误信息。


而到下一级lpEndpoints(端点描述符指针)却是空的,如下:

    pEndpoint = pUSBD->lpDeviceInfo->lpActiveConfig->lpInterfaces->lpEndpoints;
     if (NULL == pEndpoint)
    {
        RETAILMSG(USBOSC_ERR_MSG, (TEXT("OSC: pEndpoint  is NULL !\r\n")));
    }
这里就打印出了错误信息。

#8


该回复于2009-10-29 11:08:31被版主删除

#9


该回复于2009-10-29 11:09:02被版主删除

#10


你的枚举成功了么,你现在估计还卡在枚举的问题上啊,在枚举的时候,反复发Get_Device_Descriptor是协议规定的,而且会发送好几次,最后才得到包长等数据,然后获得端口数据,然后设置地址。

#11


现在所有的借口、端点描述符都可以读到了,接下来还需要做些什么动作吗?
比如说要怎么样来传输数据呢?

高手指点,小弟第一次做。

#12


来学习了啊  。。。

#13


up

#14


现在碰到一个问题:驱动里面传给应用的pBufOut在驱动里面可以正常把接口描述符打印出来,而应用里面通过pBufOut打印出来的接口描述符完全是错误的?几个同事都看了没发现什么问题!


公司不允许贴代码出来,没有权限....................要不然我会把代码贴出来。

高手不如赐教!

#15


up 

#16


公司不允许贴代码出来,没有权限....................要不然我会把代码贴出来?HOST做过,可是你说的真的不是很明白啊,你的代码也不好说啊

#17


來學習了····

#18


该回复于2009-10-30 09:09:04被版主删除

#19


做过wince下USB驱动请进

#20


不错,很好,学习下。

#21


这活不错,给钱我帮你写。

#22


现在所有的描述符都已经读到了,接下来是不是要使用SetFeature来设置接口、端点。根据接口里面有一项bAlterateSetting不同的值(我的设备这项的从0~3),在值为0时,我发现时没有端点的。只有从1~3时,才可以看得到都有6个端点。

现在有2个问题:
1、 下一步是否是用SetFeature来设置接口的bInterfaceNumber和bAlterateSetting,并决定使用哪个端点作为输出,哪个端点作为输入。对于输入和输出端点有没有什么特别的要求? 
我用的是快(Bulk)传输,中断暂时不考虑。

2、 USB数据包如何解压?是否有一个标准?


高手继续指点!

#23


为什么没有人顶!!!!!!!!!!!!

#24


该回复于2009-11-16 08:58:24被版主删除

#25


学习来的

#26


学习来的

#27


up

#28


该回复于2009-10-31 08:12:47被版主删除

#29


mark下~~~

#30


MARK 

#31


刚要学,先搬个板凳学习

#32


引用 22 楼 oneonce 的回复:
现在所有的描述符都已经读到了,接下来是不是要使用SetFeature来设置接口、端点。根据接口里面有一项bAlterateSetting不同的值(我的设备这项的从0~3),在值为0时,我发现时没有端点的。只有从1~3时,才可以看得到都有6个端点。

现在有2个问题:
1、下一步是否是用SetFeature来设置接口的bInterfaceNumber和bAlterateSetting,并决定使用哪个端点作为输出,哪个端点作为输入。对于输入和输出端点有没有什么特别的要求?
我用的是快(Bulk)传输,中断暂时不考虑。

2、USB数据包如何解压?是否有一个标准?


高手继续指点!



从你的问题来看我觉得你是在做client(device)驱动。其实在public下的usbfn下是有部分代码的,就看你是那种class,有USB网卡,USBserial,USBstorage。你可以看看

#33


我只是不确定要不要取SetFeature,所以我问一下。

我现利用读出来的描述符,使用1个输入(读)端点和一个输出(写)端点分别来做批量输入和批量输出。
现在发现:
1、端点打开成功了。但是我应用程序调用批量输入或输出时,基本上就卡死了。
2、批量输出如下:
usbTransfer = (*pUSBD->usbfuncs->lpIssueBulkTransfer)
                                           (pUSBD->BulkOut.Pipe//所打开端点的句柄
                                                  NULL,
                                            NULL,
                                             USB_OUT_TRANSFER  |  USB_SHORT_TRANSFER_OK,
                                            dwLenIn,
                                            pBufIn,
                                            NULL);
if (NULL==usbTransfer)
{
    ................
}

高手指点!!!!!!!!!!

#34


引用 33 楼 oneonce 的回复:
我只是不确定要不要取SetFeature,所以我问一下。

我现利用读出来的描述符,使用1个输入(读)端点和一个输出(写)端点分别来做批量输入和批量输出。
现在发现:
1、端点打开成功了。但是我应用程序调用批量输入或输出时,基本上就卡死了。
2、批量输出如下:
usbTransfer = (*pUSBD->usbfuncs->lpIssueBulkTransfer)
                                          (pUSBD->BulkOut.Pipe//所打开端点的句柄
                                                  NULL,
                                            NULL,
                                           USB_OUT_TRANSFER|USB_SHORT_TRANSFER_OK,
                                            dwLenIn,
                                            pBufIn,
                                            NULL);
if (NULL==usbTransfer)
{
    ................
}

高手指点!!!!!!!!!!



你的这个函数你好好看看参数的意思。。。USB_OUT_TRANSFER|USB_SHORT_TRANSFER_OK,
你这个事同步的表达吧。。。没有发出去就不会返回。。。你用USBNOwait估计就立即返回了。。研究下这个函数

#35



我使用USB_NO_WAIT对设备进行读,是会一下子返回,但是pBufOut里面却是没有值的,
usbTransfer = (*pUSB->usbFuncs->lpIssueBulkTransfer)
                                   (pUSB->BulkIn.Pipe,//所打开端点的句柄
                                    NULL,
                                    null,
                                    USB_OUT_TRANSFER |  USB_NO_WAIT,
                                    dwLenOut,
                                    pBufOut,
                                    NULL);

如果使用事件来同步,不知道有没有值,我这里老提示我参数不对,不知道怎么传参数!

typedef USB_TRANSFER (* LPISSUE_BULK_TRANSFER)(USB_PIPE,
                                                LPTRANSFER_NOTIFY_TOUTINE,
                                                LPVOID,
                                               DWORD,
                                               DWORD,
                                               LPVOID,
                                               ULONG);

好像跟有的地方定义又不一样!!!!主要是第二个和第三个参数,不知道怎么传!

高手指点!

#36



创建事件:第二个参数我传了 TRUE,因为我不知道现在是要手动还是自动?我看了PUBLIC下打印机的也是传了一个TRUE ???pUSBD->BulkIn.hEvent =  CreateEvent(NULL,  TRUE, FALSE, TEXT("USBOSC BulkIn"));

下面就是使用同步传输了?
usbTransfer = (*pUSB->usbFuncs->lpIssueBulkTransfer)(
             pUSB->BulkIn.Pipe,//端点句柄
             (LPTRANSFER_NOTIFY_ROUTINE)(*(pUSB->usbFuncs->lpIssTransferComplete)),
             pUSB->BulkIn.hEvent,
             USB_OUT_TRANSFER | USB_SHORT_TRANSFER_OK,
             dwLenOut,
             pBufOut,
             NULL);

好像结果也不行啊!!!!!!!!!!!

#37


相当不好意思,上面的 USB_OUT_TRANSFER应该改为 USB_IN_TRANSFER,现在可以读到数据,但是不知道怎来解析这写数据?

USB数据包是不是有一个固定的打包标准? 应该如何来解析数据包呢?

高手指点!

#38


终于有结果了啊。。呵呵。。。这些你就得研究下协议了。。。不过网上有很多吧 功夫不负有心人啊

#39


为什么wince下面没有SetConfiguration,GetConfiguration?我现在是直接用读到的端点来通讯的,但是我Bus Hound读PC对USB的操作时有SetConfiguration操作的?wince为什么没有?

还有我现在不知道如何来读取和写示波器那一个通道(示波器有4个通道)?

#40


搞错了,没有读到数据,是我写的应用申请内存后没有初始化?狂晕!

批量输入调用如下:
usbTransfer = (*pUSB->usbFuncs->lpIssueBulkTransfer)
        (pUSB->BulkIn.hPipe ,//批量输入管道句柄
        (LPTRANSFER_NOTIFY_ROUTINE)(*pUSB->usbFuncs->lpIsTransferComplete)), //回调函数
        pUSB->BulkIn.hEvent ,//同步事件
        USB_ IN_TRANSFER | USB_SHORT_TRANSFER_OK,
        dwLenOut,
        pBufOut ,//读出的数据放在pBufOut内存中
        NULL);
if (NULL == usbTransfer)
{
    ...
}

高手指点一下为什么没有读到数据呢!pBufOut一直都是空(也就是初始化为0),一直都是0.

#41


顶贴,学习~~~~~

#42


批量输入管道句柄获取方式:
pUSB-> BulkIn.hPipe = (*pUSB->usbFuncs-> lpOpenPipe)(pUSB->hUSBDevice, //USB设备句柄
                                                 pEndpoint //指向要打开的端点描述符的指针
                                                 );

高手指点啊!急~

#43


mark

#44


[color=#FF0000] 难道没有人做过USB HOST驱动吗?[/color]

#45


遇到一个USB问题。楼主是否知道usb初始化怎么做?我的2440唤醒后usb就不能用(没有5V电源输出)

#46


初始化读取描述符都是由USBD操作完成的,具体我也不知道。

#47


帮顶一下.

#48


哎,为什么大家都没有做过wince USB HOST驱动呢? 还是不想说!
可能中国人就是这样,所以中国总是没有进步。

#49


呵呵。。哥们。。你很努力啊。。你的QQ是多少啊。。。我们可以讨论下。。虽然我也很菜

#50


我QQ:174646138, 公司邮箱:hua.liang@cnlaunch.com
上班的时候上不了QQ