原创 DS3.2开发USB驱动时SubmitUrb一个输入URB蓝屏问题的解决

2008-3-11 14:52 6769 13 19 分类: 软件与OS

在使用DS3.2开发USB PDIUSBD12的驱动程序时,使用DS的
向导自动生成驱动后,添加发送数据相关代码后,测试发
送数据成功。继续增加读数据相关代码,使用最简单的同步
调用,结果出现蓝屏……反复查看代码,不管是使用buffere
d模式还是direct模式,设置成异步调用并设置完成例程,
结果还是蓝屏依旧...在经过无数次的修改代码、蓝屏之后,
人都快崩溃了...看别人的驱动以及DS自带的例子中都是这样
做的呀,看来问题不在这里。找到代码中的设备构造函数
Computer00USBDevice::Computer00USBDevice,发现原来是
DS向导生成的代码SB了...


本来应该是
    // Initialize each Pipe object
    m_Endpoint1In.Initialize(m_Lower, 0x81, 16);   
    m_Endpoint1Out.Initialize(m_Lower, 1, 16);   
    m_Endpoint2In.Initialize(m_Lower, 0x82, 64);   
    m_Endpoint2Out.Initialize(m_Lower, 2, 64);   


而向导自动生成的代码在0x81和0x82前面都漏掉了0x,
变成十进制的了,我倒塌...


结果就是两个输出端点可以正常工作,而一旦对输入端点
操作时,就导致系统蓝屏了...


将代码改正过来,再测试,系统不再蓝屏,而且也可以
正常从设备读取到数据了。


另外,如果应用程序提供的缓冲区比实际返回的数据
长度少时,就会读不到数据,并且以后再使用足够长度
的缓冲区去读时也还是读不到。需要将设备停用后重新启用
才能重新读到数据。所以应用程序应该提供足够大的缓冲区
(例如端点的最大数据包长度)去读数据。


              Computer00 2008.03.11

PARTNER CONTENT

文章评论10条评论)

登录后参与讨论

computer00 2008-9-1 23:11

发送数据时中断是否产生了?我的程序是可以正常运行的。

用户1361684 2008-9-1 21:29

你好,圈圈,从你提供的资料我学到了很多东西,最近用你提供的原理图和固件程序做了一个AT89C52+PDIUSBD12与PC机通信的USB板子,现在通过调试已经枚举成功了,但当我从PC机通过端点1给USB发数据数时,从中断寄存器中读到的不是0X04的数据,这是怎么回事啊,能帮忙解决一下不,谢谢啦,我的邮箱是rain14305@yahoo.com.cn

computer00 2008-5-20 17:11

我都上传了呀,你直接来这里下载: http://blog.ednchina.com/computer00/21772/category.aspx

用户146056 2008-5-20 16:00

给我也发个好吗chenwubin163@163.com,谢谢了

用户80678 2008-3-14 08:16

呵呵, thank you, 发得真够快的!!!

computer00 2008-3-13 13:20

bulk和ISO的细节我也没搞清楚,呵呵,因为我是直接用DS开发的,DS帮我们封装了很多类,我直接调用类的函数即可。例如bulk传输,我只需要调用创建bulk传输的URB,然后再提交这个URB即可,操作系统的底层USB总线驱动会处理这个URB,将数据发到USB总线或者从总线上读数据。

用户80678 2008-3-13 09:09

Thank you very much!!! 这下有得玩了。 其实我也试过直接用ReadFile和WriteFile来控制HID设备,也的确成功了。 但是HID设备驱动是微软写的,我就想知道一下深层次的原理,更想知道Bulk和ISO传输在驱动里面的细节。 认识你很高兴,期待你早日发出这个示例...

computer00 2008-3-13 00:39

呵呵,楼上这位朋友请稍等几天,我现在已经将这个驱动程序做好了,现在正在写应用程序。我的应用程序现在已经可以控制我的EDN USB板上的LED,也可以显示板上开关的状态,这两个操作是通过端点1的中断输入和输出实现的。我现在正在完成端点2的批量输出和输入功能,类似USB转串口,发送的数据从串口发送出去,读数据时取走串口接收到的数据。目前正在写代码,等我将代码写好,并测试通过后,我会一并将USB板的固件部分、驱动程序、驱动程序源代码、应用程序、应用程序源代码等分别发上来,到时就有得玩了~~~

用户80678 2008-3-12 11:37

另外,我也是用端点的最大数据包长度去写数据的。

用户80678 2008-3-12 11:29

圈圈老大,可否将你的这个示例share一下,我的mail是andyzhu129@yahoo.com.cn 因为最近我也在用DS3.2生成了一个驱动去控制你的USB键盘的示例,以便可以控制上面的LED灯,无奈发送数据无效。 我是改注册表来安装这个驱动的,主要是改了service的键值,不知道问题是否出在安装部分还是驱动本身有问题。 帮忙答疑解惑,不胜感激!!!
相关推荐阅读
computer00 2013-06-05 16:27
[招聘]Android系统开发工程师
任职要求: 1. 扎实的C/C++基础,熟悉嵌入式Linux和Android操作系统的软件开发; 2. 良好的沟通能力和逻辑思维能力; 3. 良好的英文文献阅读能力; 4. 具备...
computer00 2013-06-04 09:26
[招聘]Android应用开发工程师
任职要求: 1. 具备扎实的面向对象编程思想和JAVA编程基础; 2. 熟悉Eclipse+ADT开发环境,熟练掌握Android基本类库; 3. 熟悉网络应用和多媒体应用开发; ...
computer00 2012-09-26 13:15
圈圈的新浪官方围脖
http://weibo.com/computer00  ...
computer00 2012-09-26 13:12
欢迎大家去收听圈圈弹的曲子
http://www.tudou.com/home/_105209016  ...
computer00 2009-06-29 15:07
《圈圈教你玩USB》勘误(更新日期2009 年06月29日)
《圈圈教你玩USB》勘误(更新日期2009 年06月29日)下载地址1:下载地址2: 勘误.pdf...
computer00 2009-06-25 11:23
一块磐正845GE主板PS2接口的修复
圈圈有一部台式机,某天开机时,发现键盘用不了了,停留在输入BIOS密码那里。主机自检通过,但是蜂鸣器却发出很微弱的、连续的声音,同时键盘的三个LED也没有出现象往常一样的闪烁一下。圈圈以为多日未用,积...
我要评论
10
13
关闭 站长推荐上一条 /3 下一条