[请教]关于USB驱动的开发

中文QNX 讨论: 欢迎大家灌水,讨论有关QNX 问题。
iNFINITE
Senior Member
帖子: 82
注册时间: 周四 3月 26, 2009 8:24 am

[请教]关于USB驱动的开发

帖子 iNFINITE » 周二 4月 14, 2009 5:31 pm

小弟刚接触QNX和USB的驱动,请求各位达人指导。

工程的大体情况如下:
外部传感器扫描到的数据通过USB传送到装有QNX系统的桌面电脑上。

是不是需要自己在QNX系统中开发对应的USB驱动?有没有可以使用的资源?
我自己看过一些资料,但是没有抓住要点,完全没有头绪。该参考哪些资料呢?

还有,外部的传感器那边,是不是只要一个USB controller芯片就可以了呢?还是说需要内藏USB controller的单片机之类才行呢?是不是也许要自己开发固件呢?

谢谢。

iNFINITE
Senior Member
帖子: 82
注册时间: 周四 3月 26, 2009 8:24 am

补充问题

帖子 iNFINITE » 周三 4月 15, 2009 7:18 am

通过USB传到PC的数据可不可以通过DMA直接传输到内存呢?
还有,主板上的USB controller能不能在接受一定量的数据后向CPU提出中断呢?

期待各位的回复。十分感谢。

comquter
Moderator
帖子: 269
注册时间: 周四 9月 18, 2003 3:08 am

帖子 comquter » 周三 4月 15, 2009 8:38 pm

你要写一个针对USB设备的CLASS驱动,也可以将此功能直接放到你的数据采集程序上.
假设你用BULK_IN来采集数据,你要
1) 调用usbd_alloc来拿到BUFFER
2) 调用usbd_alloc_urb来拿到URB
3) 调用usbd_setup_bulk将BUFFER与URB挂在一起
4) 调用usbd_io来注册URB和CALLBACK
5) HOST驱动得到数据后会调用CALLBACK,在CALLBACK里你可以处理数据,再挂下一个URB.

iNFINITE
Senior Member
帖子: 82
注册时间: 周四 3月 26, 2009 8:24 am

感谢楼上的回复

帖子 iNFINITE » 周四 4月 16, 2009 7:16 am

小弟刚接触这些,很多都不懂,还望见谅。
楼上的回复让我对流程有了大概的了解。
但是还有问题。

处理这些的是CPU还是USB controller?如果是CPU的话,原本想降低CPU工作量的想法就没有实现。
还有就是当HOST接受到数据后的动作,是自主传到内存呢,还是提出中断,还是需要等待CPU的查询?

如果有简单的例子的话,能不能贴上来看看呢。不方便的话就算了。

comquter
Moderator
帖子: 269
注册时间: 周四 9月 18, 2003 3:08 am

帖子 comquter » 周四 4月 16, 2009 11:11 am

这些都是由HOST驱动来完成的,中断也是HOST得到的,你的CALLBACK被调到是数据已经在你用usbd_alloc得到BUFFER里了.你在CALLBACK里需要1)挂另外一个URB以备接收下一个PACKET,2)处理当前从设备受到的数据.
例子发到邮箱里了.

zhangshuyuan
Senior Member
帖子: 10
注册时间: 周一 4月 13, 2009 1:49 pm

帖子 zhangshuyuan » 周五 4月 17, 2009 9:51 am

comquter 写了:这些都是由HOST驱动来完成的,中断也是HOST得到的,你的CALLBACK被调到是数据已经在你用usbd_alloc得到BUFFER里了.你在CALLBACK里需要1)挂另外一个URB以备接收下一个PACKET,2)处理当前从设备受到的数据.
例子发到邮箱里了.
能给我也发一份这个例子吗?谢谢了 :) 邮箱:zhang_shuyuan@tted.net.cn

panbo6510
Senior Member
帖子: 20
注册时间: 周日 3月 01, 2009 10:58 pm

帖子 panbo6510 » 周五 4月 17, 2009 4:28 pm

我也刚学习QNX的USB驱动一个月。

楼主要写USB设备驱动的话,应该首先弄明白QNX USB驱动和 USB设备驱动的关系。
还有就是要看一下 Resource Manager部分的内容,这里讲了和APP之间的接口问题。这会对你程序的整体结构印象有帮助。
然后再找个例子程序看看(如DDk Sample里的mouse print等),这样的话会比较快的入手。
千万别找那些半截的精简程序,那些程序有时会给人误导。

iNFINITE
Senior Member
帖子: 82
注册时间: 周四 3月 26, 2009 8:24 am

帖子 iNFINITE » 周五 4月 17, 2009 4:58 pm

感谢楼上的建议。
我这就去查资料。

QNX USB驱动和USB设备驱动有什么关系?不都是在QNX系统中为其它程序提供接口的程序么?

顺便说一下,zhangshuyuan你还是去直接跟达人comquter要程序的好,我不能随便转发别人的程序,毕竟我自己也是受惠于人。。。

iNFINITE
Senior Member
帖子: 82
注册时间: 周四 3月 26, 2009 8:24 am

帖子 iNFINITE » 周五 4月 17, 2009 5:05 pm

to comquter兄:

程序我大体看过了,我水平有限,看懂得不多。。。
仍然有问题请教,如下
1.资源管理器在程序中起什么作用?
2.安装好设备并等待时是处于阻塞状态么?这时候处于该状态的是USB controller还是系统的CPU?
3.callback是程序中的哪部分?什么时候起什么作用?

不胜感激。
感觉我除了多说几次谢谢也做不了什么。。。

iNFINITE
Senior Member
帖子: 82
注册时间: 周四 3月 26, 2009 8:24 am

帖子 iNFINITE » 周五 4月 17, 2009 5:51 pm

才发现原来电脑里面没有DDK...
同事的6.3系统+IDE也找不到。
还是说是哪个压缩文件需要自己去解压缩?。。。

comquter
Moderator
帖子: 269
注册时间: 周四 9月 18, 2003 3:08 am

帖子 comquter » 周五 4月 17, 2009 6:51 pm

zhangshuyuan 写了:
comquter 写了:这些都是由HOST驱动来完成的,中断也是HOST得到的,你的CALLBACK被调到是数据已经在你用usbd_alloc得到BUFFER里了.你在CALLBACK里需要1)挂另外一个URB以备接收下一个PACKET,2)处理当前从设备受到的数据.
例子发到邮箱里了.
能给我也发一份这个例子吗?谢谢了 :) 邮箱:zhang_shuyuan@tted.net.cn
发了一个,没收到?

comquter
Moderator
帖子: 269
注册时间: 周四 9月 18, 2003 3:08 am

帖子 comquter » 周五 4月 17, 2009 9:26 pm

iNFINITE 写了:to comquter兄:

程序我大体看过了,我水平有限,看懂得不多。。。
仍然有问题请教,如下
1.资源管理器在程序中起什么作用?
2.安装好设备并等待时是处于阻塞状态么?这时候处于该状态的是USB controller还是系统的CPU?
3.callback是程序中的哪部分?什么时候起什么作用?

不胜感激。
感觉我除了多说几次谢谢也做不了什么。。。
1)跟一般的资源管理器没有区别,你可以对其进行open/close/read/write操作,它是用户程序与USBHost之间的中介.
2)等待用户操作,然后根据用户要求来通过HOST对设备进行控制/读/写.
3)scn_bulk_cbf为CALLBACK,驱动调用usb_io后,调用scn_bulk_wait阻塞到urb上,scn_bulk_cbf会将其唤醒.

光看没用,找个设备边作边学比较好.
6.3对USB的支持不是很好,下载个6.4吧.

panbo6510
Senior Member
帖子: 20
注册时间: 周日 3月 01, 2009 10:58 pm

帖子 panbo6510 » 周六 4月 18, 2009 12:38 am

iNFINITE 写了:感谢楼上的建议。
我这就去查资料。

QNX USB驱动和USB设备驱动有什么关系?不都是在QNX系统中为其它程序提供接口的程序么?

顺便说一下,zhangshuyuan你还是去直接跟达人comquter要程序的好,我不能随便转发别人的程序,毕竟我自己也是受惠于人。。。
QNX USB 驱动应该是相当于QNXOS实现的USB协议。
而USB设备驱动是自己写的对应于特定USB设备的驱动程序。USB设备驱动对下层需要和QNX USB 驱动交互。
而ResourceManager作用相当于将设备映射成一个设备文件,并为其注册了一些操作函数,如xx_io_read,xx_io_open,io_write等,当上层App调用read(usb设备文件路径,buffer)函数来对USB设备文件进行读操作时,ResourceManager就会进行查表映射,调用此USB设备驱动的相应xx_io_read函数。
在xx_io_read你可以实现你所需的读操作

简单的介绍一下,我也才刚学,详细的可以上QNX help文档上看

iNFINITE
Senior Member
帖子: 82
注册时间: 周四 3月 26, 2009 8:24 am

帖子 iNFINITE » 周六 4月 18, 2009 8:05 am

感谢comquter和panbo6510的回答。

自己看终归太慢还容易走弯路,还是这样子有人指点的好。 :)

xtang
Moderator
帖子: 1816
注册时间: 周五 9月 12, 2003 4:14 am
来自: China

帖子 xtang » 周日 4月 19, 2009 2:37 am

上次有人问,写了几行,也贴在这里吧。

devu-ehci.so就是USB芯片的硬件驱动,io-usb是USB协议栈。这部份启动以后,就可以通过USB协议查询接在USB口上的设备了。QNX有一个"usb -vvvv"的命令可以查询并返回接在USB口上的设备。

USB的设备是分“类”的,比如存诸类(Mass Storage),人机界面类(鼠标,键盘)
等。启动相应的“class driver“才能使用相应的设备。比如U盘的话,就要启动
devb-umass。这个,理论上讲就是一个同io-usb讲话的智源管理器。

devb-umass启动后,检测到U盘。就会在系统里生成 /dev/hd[A]x[BB]那样的设
备。然后,根据不动分区里的文件系统,"mount -t dos /dev/hd1x11 /fs/dos"加
载相应的文件系统然后使用它了。

回复