当前位置: 技术问答>linux和unix
linux USB疑问
来源: 互联网 发布时间:2016-12-17
本文导语: 这段时间再弄usb的驱动,可惜边上没个可以探讨的。我碰到了以下问题,麻烦知道的解答下,不胜感激,把分都扔了 (1)我的芯片有一个批量的in端口,它是每次传输64个字节,而我需要76800个字节,我想在read接口函...
这段时间再弄usb的驱动,可惜边上没个可以探讨的。我碰到了以下问题,麻烦知道的解答下,不胜感激,把分都扔了
(1)我的芯片有一个批量的in端口,它是每次传输64个字节,而我需要76800个字节,我想在read接口函数中利用urb来读取芯片的数据。我将建立一个76800字节的缓冲区,在urb初始化时是用76800大小的buffer呢,还是是64字节的buffer呢,那么我提交了urb之后,urb的数据是只能传64个,然后利用循环读到76800个,还是一次urb就能传输76800个字节呢?
(2)另一个就是中断端口,它探测设备有变化,那么建立一个中断urb之后,如何通知应用程序现在有一个中断,通知我们可以设备有数据可以读,我们可以读设备数据?
麻烦知道的兄弟们说说啊,非常感谢啊,现在我做的这个是个指纹采集的东西驱动,看资料呢我看的迷迷糊糊的
谢谢大家了
(1)我的芯片有一个批量的in端口,它是每次传输64个字节,而我需要76800个字节,我想在read接口函数中利用urb来读取芯片的数据。我将建立一个76800字节的缓冲区,在urb初始化时是用76800大小的buffer呢,还是是64字节的buffer呢,那么我提交了urb之后,urb的数据是只能传64个,然后利用循环读到76800个,还是一次urb就能传输76800个字节呢?
(2)另一个就是中断端口,它探测设备有变化,那么建立一个中断urb之后,如何通知应用程序现在有一个中断,通知我们可以设备有数据可以读,我们可以读设备数据?
麻烦知道的兄弟们说说啊,非常感谢啊,现在我做的这个是个指纹采集的东西驱动,看资料呢我看的迷迷糊糊的
谢谢大家了
|
问题1:你可以直接用一个76800字节的缓冲区的urb,因为内核会帮你循环读完,虽然一次最多只能读64byte
问题2: 你可以这样实现,不知道我理解的对不对,你的意思好像是,通过中断端点来查询再bulk端点上是否有数据,如果有才去submit bulk端点的urb(去读bulk上面的数据)。如果是这样的话,建议你将其封装到你的driver里面,就是通过中断端点读来的数据(再urb->complete里面能够得到),来判断bulk 端点上是否有数据,如果有就安装你的bulk urb,如果没有继续轮询你的中断端点。对于应用程序,就好说了,没数据时候就被阻塞,来数据后将其唤醒就可以了
问题2: 你可以这样实现,不知道我理解的对不对,你的意思好像是,通过中断端点来查询再bulk端点上是否有数据,如果有才去submit bulk端点的urb(去读bulk上面的数据)。如果是这样的话,建议你将其封装到你的driver里面,就是通过中断端点读来的数据(再urb->complete里面能够得到),来判断bulk 端点上是否有数据,如果有就安装你的bulk urb,如果没有继续轮询你的中断端点。对于应用程序,就好说了,没数据时候就被阻塞,来数据后将其唤醒就可以了
|
一般情况下不会开辟那么大的内存,因为在bulk中一般会使用dma来传输数据。一般是maxpacket多大就开这么大的dma缓冲区,然后采用多次读写的办法来实现。在linux中usb视频也是这样实现的。至于中断类型的传输,其实本质并不是采用中断的办法而是采用了轮询的办法来实现的,其会根据轮询时间,以某一个周期的帧中传输。在写中断类型的可以参考usb mouse的驱动。
|
你应用程序直接read 76800这么大小的数据,驱动会自动分成64个bytes,这么传输的,如果你每次读64bytes,速度会很慢的
|
你可以对数据进行分片,在接收端再重新合并。。。这样可以解决
|
赞同。