fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
阅读:1735回复:9

主机与USB设备通信

楼主#
更多 发布于:2003-12-29 20:57
主机如何将数据传送到USB设备,主机发送到USB设备的数据被USB总线驱动程序写道何处,固件程序在那里取主机送来的数据?

最新喜欢:

bearsammibearsa...
有了驱动,人才有了力量。
fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-12-29 21:24
usb设备不占用主机地址空间,那么主机向usb设备写数据时,写向何处?
usb设备将通过端口FIFO可以读来自主机的数据或向主机写数据;
而我的主机的应用程序及驱动程序如何将缓冲区的数据写到指定的端口,即驱动程序如何和端口或管道建立联系。如何保证我的数据是发向端口1而不是端口2?

[编辑 -  12/29/03 by  fwzfwz1]

[编辑 -  12/29/03 by  fwzfwz1]
有了驱动,人才有了力量。
fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-12-30 11:09
主机是不是通过写管道来向usb设备写数据?那么如何定义一个管道?
有了驱动,人才有了力量。
flycat0101
驱动小牛
驱动小牛
  • 注册日期2002-06-24
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2003-12-30 11:31
主机发送数据时,数据要存放在一个连续的物理地址中。发送时要建立ED队列,队列中的每一个ED又是一个TD队列的头。ED队列头的物理地址是要写入usb host的寄存器中的,而其头、尾是指向第一个TD和最后一个TD的物理地址;而TD中包含有指向数据区的物理地址(起始地址和结束地址),还有一个指向下一个TD的物理地址。发送是usb host从寄存器中找到ED数据结构,从中找到第一个TD,从其数据区取出数据,送上总线,然后处理第二个TD,直到所有的TD和ED都处理完成。

usb设备在枚举时,host会给它分配一个地址并设置它(2~127,1一般都是root hub的地址,0是缺省),以后通信时就通过这个地址进行。管道是要进行数据通信时建立起来的,由数据方向、类型、usb设备地址等组成。
我思,故我在
fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-12-30 11:38
管道是在驱动程序中建立的巴,如何建立一个管道呢?
如何将一个管道和一个端口关联起来?
是不是一个端口对应一个地址,端口对应的地址是不是主机分配给usb设备的地址,这个地址又是如何获得呢?
有了驱动,人才有了力量。
flycat0101
驱动小牛
驱动小牛
  • 注册日期2002-06-24
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2003-12-30 12:24
管道是在驱动程序中建立的巴,如何建立一个管道呢?
如何将一个管道和一个端口关联起来?
是不是一个端口对应一个地址,端口对应的地址是不是主机分配给usb设备的地址,这个地址又是如何获得呢?

对于通信时的管道,只是一个逻辑上的概念,在实际的实现时是通过设置一些数据结构的成员来完成,比如设置ED数据结构的FA域(设备地址)、EN域(端口号)以及D域(方向)。
host要和usb设备的端口进行通信,必须知道usb设备地址和端口号两个值。这里所说的地址不是端口的地址,而是设备,比如一个U盘。而端口只是这个设备上的多个中的一个而已。
usb设备的地址是host分配的,在没有分配前的通信(包括设置地址这条命令)是通过0地址进行的,分配完地址后就是根据这个新的地址进行通信。这也是0地址不能分配给设备的原因,因为它是枚举初期的公用地址。host根据一个bitmap分配地址,用4个32位的数据表示(linux系统中如此),如果有设备插入就找到第一个0位置,将其置1,次位置就是usb设备的地址,如果设备拨出,相应的bitmap位就被清0。0地址公用,1被root hub使用,外部usb设备可以使用的地址为2~127
我思,故我在
fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-12-30 18:08
那么如何获得usb设备的地址呢?
有了驱动,人才有了力量。
flycat0101
驱动小牛
驱动小牛
  • 注册日期2002-06-24
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2003-12-30 21:16
那么如何获得usb设备的地址呢?

这个是由系统host端确定的,如果是作usb驱动程序和usb设备固件,不用考虑这个
我思,故我在
fwzfwz1
驱动中牛
驱动中牛
  • 注册日期2002-11-01
  • 最后登录2007-06-01
  • 粉丝0
  • 关注0
  • 积分80分
  • 威望8点
  • 贡献值0点
  • 好评度8点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-12-30 22:01
flycat0101 :
我有下面的一些理解,不知对不对:
首先要定义一个管道,管道包含端口地址信息和用户缓冲区对应的系统缓冲区(也可能系统缓冲区不在管道中)
其次,定义一个URB,这个URB中包含管道信息和用户缓冲区的地址和长度信息。
最后,将这个URB通过管道发送到USB总线驱动程序,进而发送到USB设备。
这样就可以将用户的数据发送到USB设备。



有了驱动,人才有了力量。
flycat0101
驱动小牛
驱动小牛
  • 注册日期2002-06-24
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
  • 社区居民
9楼#
发布于:2003-12-31 11:03
因为我只熟悉linux的架构,所以对你所说的在windows下是否是这样,不敢肯定。下面也就针对linux而言
管道(PIPE)包括endpoint、usb设备地址、传输方向(IN or OUT)、传输速率(低速、全速)传输类型(Control、Bulk...)。
一般而言,用户空间的数据不能直接在内核空间使用的,要使用内核下的数据区(windows下可以通过指针而使用同一个数据区)。

你的理解基本正确。
在linux下,urb是由usb总线驱动构建的(再将urb送到usb host控制器驱动中,最后将数据发送到总线上),设备驱动只用提供pipe、数据区起始地址、数据长度等信息,通过总线接口函数进行数据发送就可以了。
我思,故我在
游客

返回顶部