lovealan
驱动牛犊
驱动牛犊
  • 注册日期2007-01-19
  • 最后登录2013-12-19
  • 粉丝0
  • 关注0
  • 积分133分
  • 威望26点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
阅读:1343回复:1

紧急求助:USB设备移除后再插上,无法激活!

楼主#
更多 发布于:2007-03-22 18:38
  我插上设备,在弹出的提示框中输入驱动程序名称后,能正确安装、调用USBDeviceAttach函数初始化设备了,我在应用程序中用CreateFile和DeviceIOControl函数可以访问了,但是当我拔出设备第二次插进去的时候,那个提示框又弹出来要我输入驱动程序名,我跟踪进去发现在调用USBDeviceAttach函数里的ActivateDevice时失败,无法激活设备!我查了一些资料,说ActivateDevice要调用到流驱动的XXX_Init函数,必须要在DLL中输出XXX_Init函数并正确执行。这个函数我也写有了,在.def文件中输出了。而且也注册了设备移出时的回调函数,为什么第一次安装的时候调用ActivateDevice能成功,然后拔出设备再插进去的时候就无法激活了呢?
    这个问题卡了我一个星期了还没解决,各位大哥有谁熟悉WinCE下流接口驱动的,请指点一下小弟,非常感激!
chenjiaotou@tom.com

BOOL USBDeviceAttach(USB_HANDLE hDevice,
            LPCUSB_FUNCS lpUsbFuncs,
            LPCUSB_INTERFACE lpInterface,
            LPCWSTR UniqueDriverId,
            LPBOOL fAccessContrl,
            LPCUSB_DRIVER_SETTINGS lpDriverSettings,
            DWORD dwUnused)
{
    ......
    ......
    __try {
        //hStreamDevice就是在Active键下的Hnd键值
        pLmeusb->hStreamDevice = ActivateDevice(wsSubClassRegKey, (DWORD)pLmeusb);
    }
    __except (EXCEPTION_EXECUTE_HANDLER) {
        pLmeusb->hStreamDevice = 0;
        printf("Can't Activate Device! rc=%d\r\n", GetLastError());
    }
    printf("pLmeusb->hStreamDevice = %d\n", pLmeusb->hStreamDevice); //ok

    if (pLmeusb->hStreamDevice) {
        //为设备注册一个回调函数, 在设备拔出时由系统回调
        if (lpUsbFuncs->lpRegisterNotificationRoutine(hDevice,DeviceNotify,pLmeusb)) {
            *fAccessContrl = TRUE;    // Accept this device as our own
        } else {
            MessageBox(NULL, _T("Failed to RegisterNotificationRoutine!"), _T("OK"), MB_OK);
        }
    } else {
        MessageBox(NULL, _T("Can't Activate Device!"), _T("OK"), MB_OK);
    }
    return TRUE;
}    


BOOL WINAPI DeviceNotify(LPVOID lpvNotifyParameter, DWORD dwCode, LPDWORD * dwInfo1, LPDWORD * dwInfo2, LPDWORD * dwInfo3,

LPDWORD * dwInfo4)
{

    if (dwCode == USB_CLOSE_DEVICE) {
        //清理占用的资源
        //取得驱动程序指针
        PLMEUSB_CONTEXT pLmeusb = (PLMEUSB_CONTEXT)lpvNotifyParameter;
        if(!DeactivateDevice(pLmeusb->hStreamDevice)) {
            MessageBox(NULL, _T("DeactivateDevice error"), _T("OK"), MB_OK);
        }
        Sleep(1000);

        PDEVICECONTEXT pPDD = (PDEVICECONTEXT)pLmeusb->dwDeviceContext;
        //先释放设备上下文
        LocalFree(pPDD->usbVideoIF);
        LocalFree(pPDD);

        //再释放驱动程序
        LocalFree(pLmeusb);
        return TRUE;
    }
    
    return FALSE;
}
lovealan
驱动牛犊
驱动牛犊
  • 注册日期2007-01-19
  • 最后登录2013-12-19
  • 粉丝0
  • 关注0
  • 积分133分
  • 威望26点
  • 贡献值0点
  • 好评度14点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-03-23 18:52
这个问题现在已经解决了,现在又有个新的问题,就是对USB设备读写数据后,返回来的应答值不对,好像写什么值进去,它返回来的应答就是什么值,不符合预定的应答值。 请问各位大哥,可能是什么原因造成读写不正确??  斑竹大哥,给点意见吧
游客

返回顶部