hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:11254回复:58

我用evc做一个usb设备的驱动,有几个问题想请教大家,谢谢!!

楼主#
更多 发布于:2005-07-25 16:02
  1.很多人都是用pb做驱动,我没有装那个,我觉得用evc也可以做吧,写成dll,提供msdn上说的那些接口函数就可以把?
     2.我用evc做了一个试验的驱动dll,只提供USBDeviecAttach,USBInstallDriver,USBUninstallDriver三个函数,编译成dll后拷贝到pda上,插入usb设备,提示选择驱动程序,我输入我的dll名称,系统提示加载未知usb设备驱动程序失败!!我看了系统的注册表,相关的信息没有被写入(在HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients下面),不知道怎么回事,大家一般怎么调试阿?RETAILMSG和DEBUGMSG怎么用啊,输出在哪里?
     3.有没有例子阿?还有usb设备是不是也可以写成流式接口驱动(stream interface driver)?好不好写?
     谢谢,期待你的答复!!

最新喜欢:

flyfireflyfir...
心若在,梦就在
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-07-25 16:38
怎么没有人回答啊,斑竹大哥能不能提点建议啊,小弟初学CE下的驱动设计,疑惑很多,希望大侠不吝赐教!!
心若在,梦就在
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-07-25 16:40
1.可以

2.你要写usb host端的client驱动?你的设备不能归入标准的那几类?如果非要写,框架可以参考common\oak\drivers\usb\class里面的那些client驱动,比如storage。实验框架的话USBInstallDriver是最先被下层usbd.dll调用的,你可以加些调试信息在里面看看代码跑到这儿没有。然后再说另外两个。
根据地的兄弟们,团结就是力量
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-07-25 17:20
谢谢斑竹大哥的回复,我就是要写usb host端的client驱动,是一个数码相机的驱动。
    你说的那个common\oak\drivers\usb\class目录是安装上pb以后的sample么?我没有pb,如果你有例子能不能给我发一份,谢谢阿,he-qing@163.com
    另外我想问问关于装载驱动的问题,我写一个试验的那种,就是实现了哪三个借口函数USBDeviecAttach,USBInstallDriver,USBUninstallDriver,第一个基本上不做什么事情,第二个像注册表写驱动程序的信息,第三个取消注册表中的信息。加载时就是插上usb线,然后在提示框中输入我编译的dll名字,但是加载时白,不知道为什么,注册表中也没有被改。
    我怎么调试阿,没有pb,用evc编写,谢谢!!
心若在,梦就在
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-07-26 13:33
喔,没办法弄到pb? 4.2和5.0都行,我这边工作的机器在内网,还不好弄出来,你问问其他方便的兄弟,把那个目录里面的源代码考给你就行了。

   你的硬件板子是什么?不会是产品吧??最好用评估版,这样可以用串口输出调试信息来调,不过如果真在产品里面,你可以试试能不能弹出系统对话框,总之,有个可以输出信息的地方就行,然后你在USBInstallDriver里面输出一个调试信息,这个函数是最先调用到的(注册表匹配不到你这种设备的情况下,否则是USBDeviecAttach)。先做到这步再说。
根据地的兄弟们,团结就是力量
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-07-26 14:03
十分感谢wxl_50685330大哥的指点,小弟初学,很多问题比较基本。我们用的是Acer n50那款pda 。cup是Intel Xscale的类型,主频312MHz,64RAM,64ROM,带usb host功能,插上u盘可以识别出来,我看了他的注册表,里面有关于u盘的驱动登记记录。
   看了你的回复,我是这样做的,我把编译好的dll拷贝到pda的windows目录下面,我插上usb线后,系统弹出了输入驱动程序名的对话框,我把驱动名称输入了xxx.dll,但是系统报未知usb设备加载驱动程序失败,我认为我输入驱动名称后,系统应该调用我驱动的USBInstallDriver函数,是这样么,我在函数入口处添加了messagebox,没有弹出,不知道什么原因,你能帮我分析一下么?谢谢
心若在,梦就在
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-07-26 15:24
你看看你的[HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients]里面是怎么写的,贴出来。

如果你已经弹出对话框输入你自己的client driver名字的话,那可以肯定一定要执行了你的USBInstallDriver,你是否在xxx.def里面输出了这个函数?
另外,在这里面输出信息用messagebox可能不行吧,你试试这个:

#include <netui.h>

CallNetMsgBox(NULL,NMB_FL_OK|NMB_FL_TITLEUSB,NETUI_GETNETSTR_USB_INSTALL_FAILURE,L"abcd");
根据地的兄弟们,团结就是力量
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-07-26 16:16
论坛好象不能发图,我看了它机器上的注册表,上边有u盘的驱动,在\LoadClients下面       \LoadClients\Default\Default\8\Mass_Storage_Class,我的.def文件输出三个函数,就是USBDeviecAttach,USBInstallDriver,USBUninstallDriver这三个函数。def文件也拷贝到windows目录下了。我的代码如下,很简单的,用CallNetMsgBox没有弹出,麻烦wxl_50685330大哥帮我看一下
     // haha.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "haha.h"
#include "Usbdi.h"
#include "Usb100.h"
#include "Usbtypes.h"

#include "netui.h"

#define ZONE_INIT              0
#define ZONE_ERROR              1
#define ZONE_TRANSFER              2
#define ZONE_EVENTS              3

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                    )
{
    switch (ul_reason_for_call)
       {
              case DLL_PROCESS_ATTACH:
              case DLL_THREAD_ATTACH:
              case DLL_THREAD_DETACH:
              case DLL_PROCESS_DETACH:
                     break;
    }
    return TRUE;
}

// This is the constructor of a class that has been exported.
// see haha.h for the class definition
CHaha::CHaha()
{
       return;
}

extern "C" BOOL  
USBDeviceAttach(
                            USB_HANDLE hDevice, // USB设备句柄
                            LPCUSB_FUNCS lpUsbFuncs, // USBDI的函数集合
                            LPCUSB_INTERFACE lpInterface, // 设备接口描述信息
                            LPCWSTR szUniqueDriverId, // 设备ID描述字符串。
                            LPBOOL fAcceptControl, // 返回TRUE,标识我们可以控制此设备, 反之表示不能控制
                            LPCUSB_DRIVER_SETTINGS lpDriverSettings,
                            DWORD dwUnused)                      
{
       MessageBox(NULL,L"hi",L"hello",MB_OK);
       *fAcceptControl = FALSE;
       // 我们的鼠标设备有特定的描述信息,要检测是否是我们的设备。
       if (lpInterface == NULL)    
              return FALSE;
      
       // 打印相关的USB设备接口描述信息。
       DEBUGMSG(ZONE_INIT,(TEXT("USBMouse: DeviceAttach, IF %u, #EP:%u, Class:%u, Sub:%u,Prot:%u\r\n"), lpInterface->Descriptor.bInterfaceNumber,lpInterface->Descriptor.bNumEndpoints, lpInterface->Descriptor.bInterfaceClass,lpInterface->Descriptor.bInterfaceSubClass,lpInterface->Descriptor.bInterfaceProtocol));
      
       *fAcceptControl = TRUE;
       return TRUE;
}


const WCHAR gcszRegisterClientDriverId[] = L"RegisterClientDriverID";
const WCHAR gcszRegisterClientSettings[] = L"RegisterClientSettings";
const WCHAR gcszUnRegisterClientDriverId[] = L"UnRegisterClientDriverID";
const WCHAR gcszUnRegisterClientSettings[] = L"UnRegisterClientSettings";
const WCHAR gcszMouseDriverId[] = L"Camera_Cannon_300D";

extern "C" BOOL  
USBInstallDriver(
                             LPCWSTR szDriverLibFile) // @parm [IN] - Contains client driver DLL name
{
       BOOL fRet = FALSE;
       HINSTANCE hInst = LoadLibrary(L"usbd.dll");
      
       // 注册USB设备信息
       if(hInst)
       {
              CallNetMsgBox(NULL,NMB_FL_OK|NMB_FL_TITLEUSB,NETUI_GETNETSTR_USB_INSTALL_FAILURE,L"abcd");
              LPREGISTER_CLIENT_DRIVER_ID pRegisterId = (LPREGISTER_CLIENT_DRIVER_ID)
                     GetProcAddress(hInst, gcszRegisterClientDriverId);
              
              LPREGISTER_CLIENT_SETTINGS pRegisterSettings =
                     (LPREGISTER_CLIENT_SETTINGS) GetProcAddress(hInst,
                     gcszRegisterClientSettings);
              
              if(pRegisterId && pRegisterSettings)
              {
                     USB_DRIVER_SETTINGS DriverSettings;
                    
                     DriverSettings.dwCount = sizeof(DriverSettings);
                    
                     // 设置我们的特定的信息。
                     DriverSettings.dwVendorId = USB_NO_INFO;
                     DriverSettings.dwProductId = USB_NO_INFO;
                     DriverSettings.dwReleaseNumber = USB_NO_INFO;
                    
                     DriverSettings.dwDeviceClass = USB_NO_INFO;
                     DriverSettings.dwDeviceSubClass = USB_NO_INFO;
                     DriverSettings.dwDeviceProtocol = USB_NO_INFO;
                    
                     DriverSettings.dwInterfaceClass = 0x03; // HID
                     DriverSettings.dwInterfaceSubClass = 0x01; // boot device
                     DriverSettings.dwInterfaceProtocol = 0x02; // mouse
                    
                     fRet = (*pRegisterId)(gcszMouseDriverId);
                                                
                     if(fRet)
                     {
                            fRet = (*pRegisterSettings)(szDriverLibFile,
                                   gcszMouseDriverId, NULL, &DriverSettings);
                            
                            if(!fRet)
                            {
                                   //BUGBUG unregister the Client Driver's ID
                            }
                     }
              }
              else  
              {
                     RETAILMSG(1,(TEXT("!USBMouse: Error getting USBD function pointers\r\n")));
              }
              FreeLibrary(hInst);
       }
       CallNetMsgBox(NULL,NMB_FL_OK|NMB_FL_TITLEUSB,NETUI_GETNETSTR_USB_INSTALL_FAILURE,L"abcdedf");
       return fRet;
}


extern "C" BOOL  
USBUnInstallDriver()
{
       BOOL fRet = FALSE;
       HINSTANCE hInst = LoadLibrary(L"usbd.dll");
      
       if(hInst)
       {
              LPUN_REGISTER_CLIENT_DRIVER_ID pUnRegisterId =
                     (LPUN_REGISTER_CLIENT_DRIVER_ID)
                     GetProcAddress(hInst, gcszUnRegisterClientDriverId);
              
              LPUN_REGISTER_CLIENT_SETTINGS pUnRegisterSettings =
                     (LPUN_REGISTER_CLIENT_SETTINGS) GetProcAddress(hInst,
                     gcszUnRegisterClientSettings);
              
              if(pUnRegisterSettings)
              {
                     USB_DRIVER_SETTINGS DriverSettings;
                    
                     DriverSettings.dwCount = sizeof(DriverSettings);
                     // 必须填入与注册时相同的信息。
                     DriverSettings.dwVendorId = USB_NO_INFO;
                     DriverSettings.dwProductId = USB_NO_INFO;
                     DriverSettings.dwReleaseNumber = USB_NO_INFO;
                    
                     DriverSettings.dwDeviceClass = USB_NO_INFO;
                     DriverSettings.dwDeviceSubClass = USB_NO_INFO;
                     DriverSettings.dwDeviceProtocol = USB_NO_INFO;
                    
                     DriverSettings.dwInterfaceClass = 0x03; // HID
                     DriverSettings.dwInterfaceSubClass = 0x01; // boot device
                     DriverSettings.dwInterfaceProtocol = 0x02; // mouse
                    
                     fRet = (*pUnRegisterSettings)(gcszMouseDriverId, NULL,
                            &DriverSettings);
              }
              
              if(pUnRegisterId)
              {
                     BOOL fRetTemp = (*pUnRegisterId)(gcszMouseDriverId);
                     fRet = fRet ? fRetTemp : fRet;
              }
              FreeLibrary(hInst);
       }
       return fRet;
}
心若在,梦就在
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-07-26 16:34
1.你在DLLMAIN里面就用MESSAGEBOX输出东西试试呢

2.你在USBINSTALLDRIVER里面不用LOAD USBD.DLL,你的驱动是被USBD.DLL加载的,你直接用它输出的函数就可以了。
根据地的兄弟们,团结就是力量
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-07-26 16:56
好的,wxl_50685330大哥的回复真是及时,我试试哈,我这个是网上一个usb鼠标的例子,我想试试看能不能加载。有问题再请教你
心若在,梦就在
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-07-26 17:25
不行啊,如果不加载库USBD.DLL,直接调用RegisterClientDriverID等四个函数,编译时报链接错误,我查看了usbdi.h头文件,上面说RegisterClientDriverID等四个函数是USBD.DLL的输出函数,奇怪的是,我们驱动的输出函数是被usbd.dll调用的是么?
   刚才有个同志给我发了u盘驱动的代码,我看了它的USBINSTALLDRIVER函数中是直接调用RegisterClientDriverID的,也没有加载USBD.DLL,但是我编译说链接错误,为什么,而且USBD.dll根本找不到,我通过remote file viewer在设备的windows目录下找到了usbd.dll,但是也不能考出来,期待wxl_50685330大哥回复,谢谢
心若在,梦就在
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-07-26 18:38
1.你在DLLMAIN里面就用MESSAGEBOX输出东西试试呢
   我在DLLMAIN里面用MESSAGEBOX可以打印,它确实调用了我的dll,但是好象没有进入USBINSTALLDRIVER函数,我再看看,还是加载了USBD.DLL,如不加载,编译报连接错误。
心若在,梦就在
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-07-26 20:33
嘿嘿,确实没有进入USBINSTALLDRIVER函数,我把.def文件加进工程又编译了一次,这回可以进入USBINSTALLDRIVER函数了,加载usbd.dll成功,写注册表成功了,\LoadClients下已经有我的设备驱动登记了,但是系统报加载驱动失败,不知道为什么,是不是只提供那三个函数还不够啊,期待wxl_50685330大哥解答:),
心若在,梦就在
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-07-27 09:57
加载驱动失败是因为注册表选项错误,我重新把USBINSTALLDRIVER函数中的注册表设置几行改了一下,现在已经可以成功加载我的空驱动了(什么事也没干),注册表里写入了正确的信息,下次插入设备能自动加载我的空驱动了:),另外我还有两个问题想请教wxl_50685330大哥:
   1.目前的驱动只提供了三个出口函数,而且是给系统调用的,我想写个驱动主要是想给应用程序调用,实现特定的功能,我看了下u盘的代码,它除了提供那三个接口外,还提供了五个接口函数,GETWORD,SETWORD,usbsDataTransfer等,我想这些函数也是提供给系统调用的把,不知道对不对,如果我想在应用程序中调用驱动的某些接口,怎么设计驱动呢,是不是要写成流式接口驱动?
   2.还有有没有好的调试方法,谢谢,希望wxl_50685330大哥解答:)
心若在,梦就在
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-07-28 09:17
我看了一天资料,越来越感觉要写成流式的驱动,是不是除了提供USBINSTALLDRIVER等三个函数之外,再提供xxx_init等接口函数就可以了?
心若在,梦就在
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-07-29 14:03
首先恭喜革命取得长足进步哈!!:)))

下面是引用hepower于2005-07-26 17:25发表的:
不行啊,如果不加载库USBD.DLL,直接调用RegisterClientDriverID等四个函数,编译时报链接错误,我查看了usbdi.h头文件,上面说RegisterClientDriverID等四个函数是USBD.DLL的输出函数,奇怪的是,我们驱动的输出函数是被usbd.dll调用的是么?
   刚才有个同志给我发了u盘驱动的代码,我看了它的USBINSTALLDRIVER函数中是直接调用RegisterClientDriverID的,也没有加载USBD.DLL,但是我编译说链接错误,为什么,而且USBD.dll根本找不到,我通过remote file viewer在设备的windows目录下找到了usbd.dll,但是也不能考出来,期待wxl_50685330大哥回复,谢谢


你编译的时候要加usbd.lib才可以直接用三,你按他的写法写就行了。可以不动的最好不动,等你有时间慢慢试三:)
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-07-29 14:06
下面是引用hepower于2005-07-26 20:33发表的:
嘿嘿,确实没有进入USBINSTALLDRIVER函数,我把.def文件加进工程又编译了一次,这回可以进入USBINSTALLDRIVER函数了,加载usbd.dll成功,写注册表成功了,LoadClients下已经有我的设备驱动登记了,但是系统报加载驱动失败,不知道为什么,是不是只提供那三个函数还不够啊,期待wxl_50685330大哥解答:),



......:)你那个def你不说你加了的嘛,不会你写到驱动目录里面就算完吧....,当然要加到工程里面三:)
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-07-29 14:09
下面是引用hepower于2005-07-26 17:25发表的:
不行啊,如果不加载库USBD.DLL,直接调用RegisterClientDriverID等四个函数,编译时报链接错误,我查看了usbdi.h头文件,上面说RegisterClientDriverID等四个函数是USBD.DLL的输出函数,奇怪的是,我们驱动的输出函数是被usbd.dll调用的是么?
   刚才有个同志给我发了u盘驱动的代码,我看了它的USBINSTALLDRIVER函数中是直接调用RegisterClientDriverID的,也没有加载USBD.DLL,但是我编译说链接错误,为什么,而且USBD.dll根本找不到,我通过remote file viewer在设备的windows目录下找到了usbd.dll,但是也不能考出来,期待wxl_50685330大哥回复,谢谢


client输出的函数有些给上层用,有些给usbd.dll用,这也是合理的三,中间层驱动嘛自然要向上下个开放些接口罗
根据地的兄弟们,团结就是力量
wxl_50685330
论坛版主
论坛版主
  • 注册日期2002-11-19
  • 最后登录2018-09-25
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望521点
  • 贡献值0点
  • 好评度419点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-07-29 14:13
那三个给usbd.dll的接口函数你的照章办事,剩下的向应用暴露的接口就可以随便了,可以做成流接口,但也不是必须,你和写应用的人定义一下接口和语义即可。good luck!
根据地的兄弟们,团结就是力量
hepower
驱动牛犊
驱动牛犊
  • 注册日期2005-01-18
  • 最后登录2009-06-24
  • 粉丝0
  • 关注0
  • 积分198分
  • 威望25点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-07-29 16:49
啊!!!wxl_50685330大哥终于回复了,回复了好多啊,看的我直流口水呢:)学习ing!!
      我在驱动中调用某些传输函数已经成功了,目前就是要和应用程序开放接口了,继续努力,有不明白的地方还要向你请教呢:),谢谢!!
心若在,梦就在
上一页
游客

返回顶部