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

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

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

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

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

谢谢。

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

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

你要写一个针对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.

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

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

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

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

能给我也发一份这个例子吗?谢谢了 :slight_smile: 邮箱:zhang_shuyuan@tted.net.cn

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

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

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

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

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

to comquter兄:

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

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

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

发了一个,没收到?

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吧.

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文档上看

感谢comquter和panbo6510的回答。

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

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

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"加
载相应的文件系统然后使用它了。

comquter能不能也发一份例程给我,邮箱 dos_fan@126.com .谢谢