ehl2000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2009-03-21
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2911回复:7

关于周立功D12中WINDOWS XP驱动程序的修改

楼主#
更多 发布于:2005-06-30 14:32
  周立功D12开发板中带的WINDOWS XP驱动程序,在编译后会出现USB设备不能正常工作.
以下是修改的代码,修改后可以正常工作.
在d12.c和Ioctl.c中,

        // BUGBUG 82930 chokes if on the next command if you don't get
        // the entire descriptor on the first try

        siz = sizeof(USB_CONFIGURATION_DESCRIPTOR)+256;
将+256去掉,这个会引去枚举设备时,设备描述符的长度不对,修改后:
        siz = sizeof(USB_CONFIGURATION_DESCRIPTOR);

在d12.c中的D12_SelectInterface函数中,
设备查询完接口后有一段代码,也会引起驱动返回不对,需要屏蔽下面的代码

    // Retrieve the selected Configuration and Interface setting from the
    // device.  (The only purpose of doing this here is to exercise the
    // URB_FUNCTION_GET_CONFIGURATION and URB_FUNCTION_GET_INTERFACE
    // requests).
    //
    if (NT_SUCCESS(ntStatus)) {

        urb = ExAllocatePool(
                  NonPagedPool,
                  sizeof(struct _URB_CONTROL_GET_CONFIGURATION_REQUEST) + 1);

        if (urb)
        {
            PUCHAR configuration;

            configuration = (PUCHAR)urb + sizeof(struct _URB_CONTROL_GET_CONFIGURATION_REQUEST);
            *configuration = 0xFF;

            urb->UrbHeader.Function = URB_FUNCTION_GET_CONFIGURATION;
            urb->UrbHeader.Length = sizeof(struct _URB_CONTROL_GET_CONFIGURATION_REQUEST);
            urb->UrbControlGetConfigurationRequest.TransferBufferLength = 1;
            urb->UrbControlGetConfigurationRequest.TransferBuffer = configuration;
            urb->UrbControlGetConfigurationRequest.TransferBufferMDL = NULL;
            urb->UrbControlGetConfigurationRequest.UrbLink = NULL;

            ntStatus = D12_CallUSBD(DeviceObject, urb);

            D12_KdPrint (("D12TEST.SYS: Configuration %d (%x)\n",
                             *configuration, ntStatus));

            ExFreePool(urb);
            urb = NULL;
        }

        urb = ExAllocatePool(
                  NonPagedPool,
                  sizeof(struct _URB_CONTROL_GET_INTERFACE_REQUEST) + 1);

        if (urb)
        {
            PUCHAR interface;

            interface = (PUCHAR)urb + sizeof(struct _URB_CONTROL_GET_INTERFACE_REQUEST);
            *interface = 0xFF;

            urb->UrbHeader.Function = URB_FUNCTION_GET_INTERFACE;
            urb->UrbHeader.Length = sizeof(struct _URB_CONTROL_GET_INTERFACE_REQUEST);
            urb->UrbControlGetInterfaceRequest.TransferBufferLength = 1;
            urb->UrbControlGetInterfaceRequest.TransferBuffer = interface;
            urb->UrbControlGetInterfaceRequest.TransferBufferMDL = NULL;
            urb->UrbControlGetInterfaceRequest.UrbLink = NULL;
            urb->UrbControlGetInterfaceRequest.Interface =
                deviceExtension->Interface->InterfaceNumber;

            ntStatus = D12_CallUSBD(DeviceObject, urb);

            D12_KdPrint (("D12TEST.SYS: Interface %d (%x)\n",
                             *interface, ntStatus));

            ExFreePool(urb);
            urb = NULL;
        }
    }

修改上面两处后,USB可以正常使用了. 现在不清楚是否周立功故意在代码中留下这些地方.
习惯潜水,发现论坛上竟然有人要以此收费,实在不屑. 所以自己辛苦了几个晚上,将问题搞定,希望对大家有用

最新喜欢:

r2109twr2109t...
CII_GZH
驱动中牛
驱动中牛
  • 注册日期2005-06-16
  • 最后登录2007-08-27
  • 粉丝0
  • 关注0
  • 积分257分
  • 威望127点
  • 贡献值0点
  • 好评度33点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-06-30 14:57
楼主是好人啊。顶一下。希望可以得到您的帮助,感觉您是个高手啊。MSN有吗?有问题想象你请教。驱动刚刚接触,希望希望。。。。。。。。。。。。。
学习
tianrongcai
驱动牛犊
驱动牛犊
  • 注册日期2005-06-24
  • 最后登录2011-03-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望39点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-07-14 17:58
楼主:
      周立功并非故意.siz = sizeof(USB_CONFIGURATION_DESCRIPTOR)+256;可以说没有错.但要看的目标板的驱动程序.因目标板的连接程序判断配置描述长度大于描述总长时,发送除设备描述符以外的其它所有描述符.这时候,电脑发现有新硬件.当安装驱动程序时.目标板如上重发描述符一遍后,驱动才算安装完成(这是本人用超级终端监视出来的).仙林电子的也一样.可能你的目标板连接程序没有按周立功的写.但我用的驱动程序源代码是以前周立功C51板子的.在WINDOWS XP 的DDK环境下根本没法编译通过.楼主可否发你的一分驱动程序源代码给我tianrongcai@sohu.com.可否共同研究研究?
ehl2000
驱动牛犊
驱动牛犊
  • 注册日期2002-11-18
  • 最后登录2009-03-21
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-07-15 10:35
你可以去www.pudn.com上面有代码,其实按照我的方法改就可以了。改和不改,编译都是通过的,只是运行的时候有问题而已。
tianrongcai
驱动牛犊
驱动牛犊
  • 注册日期2005-06-24
  • 最后登录2011-03-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望39点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-07-15 19:30
Thank you!我用WIN XP DDK的BULKUSB例子修改,并且对比了周立功的<<PDIUSBD12固件编程与驱动开发>>,代码完全一样(除了DEBUG打印),忙了两周.安装时,总是死机.接着用WINDOWS2000相同的例子,仅修改了INF和SOURCE文件.在WIN2K DDK下编译通过.安装成功,把插也正常,但设备管理内除D12外,还多了一行打问号的.安装时也提示找不到硬件.但桌面的USB图标把插正常.楼主能否告诉我是什么原因?
thx1180
驱动牛犊
驱动牛犊
  • 注册日期2005-06-21
  • 最后登录2006-04-20
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望3点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-07-19 09:30
周立功D12的驱动程序确实头痛,我在Win2000下面编译后跑到GET_DESCRIPTOR就下不去了,经检查发现返回的错误信息是“无效的参数”,查了无数遍了实在看不出那个参数有问题了,有哪位大侠帮忙提示一下吧:(
tianrongcai
驱动牛犊
驱动牛犊
  • 注册日期2005-06-24
  • 最后登录2011-03-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望39点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-07-19 18:56
周立功D12的驱动程序确实头痛,我在Win2000下面编译后跑到GET_DESCRIPTOR就下不去了,经检查发现返回的错误信息是“无效的参数”,查了无数遍了实在看不出那个参数有问题了,有哪位大侠帮忙提示一下吧:(

我试过了,而且已经修改成功.可以用EP1和EP2与PC通信.努力吧,小伙子!你做完后.你也会觉得周立功也属于骗人!
xjty
驱动牛犊
驱动牛犊
  • 注册日期2001-05-07
  • 最后登录2018-05-30
  • 粉丝0
  • 关注0
  • 积分116分
  • 威望149点
  • 贡献值0点
  • 好评度19点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-10-26 13:09
thanks
游客

返回顶部