电子产品世界 » 论坛首页 » 嵌入式开发 » 操作系统 » 要是一个usb主控制器,没有root hub,那这个主控制器还能接外设吗??


共12条 1/2 1 2 跳转至

要是一个usb主控制器,没有root hub,那这个主控制器还能接外设吗??

高工
2013-03-13 10:23:37    评分

如题,有没有这种情况啊??还是我想歪了?

最近在看usb协议,有点晕啊!!!

还是hub是集成在usb主控制器中啊?没找到相关文档啊!!

谁知道啊,给指条路啊!!




关键词: usb     hub    

工程师
2013-03-13 21:26:13    评分
2楼

一般来说,一个电脑里有一个 usb host controller就可以了,她就可以控制很多个设备了,比如u盘,比如usb键盘,比如usb鼠标.所有的外设都把自己的请求提交给 usb host controller.然后让 usb host controller 统一来调度.而设备怎么连到 host controller上?哎,这就是我们故事的主角,hub,乳名叫做集线器。

关于hub的代码,在drivers/usb/core/目录下面,有一个叫做hub.c的文件.这个文件
可不简单. localhost:/usr/src/linux-2.6.22.1/drivers/usb/core # wc -l hub.c 

傻眼了,就hub这么一个玩艺儿竟然有三千多行代码,真要是按行计费,写代码的那些家
伙还不发财发死?还好不是那样,真要是那样,还不个个都跟赵丽华似的,一个个都成了诗人,
开源社区该改成开源诗社了. 
三千多行就三千多行吧,总不能见困难就退吧.小的时候我们可都是听着雷锋叔叔的故
事长大的,雷锋叔叔的螺丝钉的精神虽然我们学不到,但是雷锋叔叔说的好,对待女同志,要像
春天般的温暖!同样,我们对待代码,也要像春天般的温暖.嗯,跟我走吧,现在就出发.


工程师
2013-03-13 21:27:24    评分
3楼
莎士比亚曾经说过,不懂hub是怎么工作的就等于不知道usb设备驱动是怎么工作的.这句
话一点没错,因为usb设备的初始化都是hub这边发起的,通常我们写usb设备驱动程序都是在
已经得到了一个 struct usb_interface指针的情况下开始 probe工作,可是我要问你,你的str
uct usb_interface从哪来的?你以为你的设备天生丽质?长得比较帅?一插入usb口就有了?如
果有人说是的,那么我只能说,相信这个人的嘴,不如相信世上有鬼!老实说,要想知道从usb设备
插入usb口的那一刻开始,这个世界发生了什么,你必须知道 hub 是怎么工作的,Linux中hub
驱动程序是怎么工作的.
要说usb hub,那得从Root hub说起.什么是Root hub?冤有头债有主,不管你的电脑里
连了多少个usb 设备,她们最终是有根的,她们不会像孙猴那样从石头里蹦出来的,不会像北京电
视台纸包子的新闻凭空就可以造出来.所有的usb设备最终都是连接到了一个叫做Root Hub的
冬冬上,或者说所有的根源都是从这里开始的.Root Hub 上可以连接别的设备,可以连接 U盘,
可以连接 usb 鼠标,同样也可以连接另一个hub.所谓 hub,就是用来级连.但是普通的 hub,她一
头接上级 hub, 另一头可以有多个口,多个口就可以级连多个设备,也可以只有一个口,一个口的
就像我们宿舍里常用的那种延长线.而 Root Hub 呢?她比较特殊,她当然也是一种 usb 设备,但
是她属于一人之下万人之上的角色,她只属于被 Host Controller,换言之,通常做芯片的同志们
会把 Host Controller和 Root Hub 集成在一起.特别是PC主机上,通常你就只能看到接口,看
不到 Root Hub,因为她躺在 Host Controller 的怀里.这一对狗男女躲在机箱里面,你当然看不
到.下面这张图看得很清楚,
其中的那个host hub其实就是 root hub.当然,我们应该更加准备的评价 host 和 root 
hub的关系,她们是双生花,不会残酷地吸纳彼此的幸福,只会一直不离不弃地在风中相依,直到凋
零…(虽然言论自由,但是我必须声明,我绝对没有影射最近牺牲在车里的徐新贤书记以及那个和
他一起裸死在车里的妇联主席潘丽航的意思,请不要误会,我个人还是很欣赏这种死了都要爱的
境界的,这种追求真爱,追求自由的思想正是整个开源社区所推崇的,也正是开源精神的灵魂所在,
我顶!)
Ok,别扯远了,继续回来,既然root hub享有如此特殊的地位,那么很显然,整个usb子系统
得特别的爱给特别的你,一开始就会要初始化hub.所以我们从 usb 子系统的初始化代码开始看
起.也就是usb 的核心代码.来自drivers/usb/core/usb.c: (转)

工程师
2013-03-13 21:29:09    评分
4楼
938 subsys_initcall(usb_init);

939 module_exit(usb_exit);

很显然,这样两行正是 Linux中 usb 子系统的初始化代码,这里我们看到一个 subsys_init
call,它也是一个宏,我们可以把它理解为 module_init,只不过因为这部分代码比较核心,开发者
们把它看作一个子系统,而不仅仅是一个模块,这也很好理解,usbcore这个模块它代表的不是某
一个设备,而是所有usb设备赖以生存的模块,Linux 中,像这样一个类别的设备驱动被归结为一
个子系统.比如pci子系统,比如scsi子系统,基本上,drivers/目录下面第一层的每个目录都算一
个子系统,因为它们代表了一类设备.subsys_initcall(usb_init)的意思就是告诉我们usb_init
是我们真正的初始化函数,而 usb_exit()将是整个usb 子系统的结束时的清理函数.于是我们就
从 usb_init 开始看起,
 860 /*
 861 * Init
 862 */
 863 static int __init usb_init(void)
 864 {
 865 int retval;
 866 if (nousb) {
 867 pr_info("%s: USB support disabled\n", usbcore_na
me);
 868 return 0;
 869 }
 870
 871 retval = ksuspend_usb_init();
 872 if (retval)
 873 goto out;
 874 retval = bus_register(&usb_bus_type);
 875 if (retval)
 876 goto bus_register_failed;
 877 retval = usb_host_init();
 878 if (retval)
 879 goto host_init_failed;
 880 retval = usb_major_init();
 881 if (retval)
 882 goto major_init_failed;
 883 retval = usb_register(&usbfs_driver);
 884 if (retval)
 885 goto driver_register_failed;
 886 retval = usb_devio_init();
 887 if (retval)
 888 goto usb_devio_init_failed;
 889 retval = usbfs_init();
(转)


工程师
2013-03-13 21:34:25    评分
5楼
还是看原帖吧  , http://read.pudn.com/downloads160/doc/722117/Linux%C4%C7%D0%A9%CA%C2%B6%F9%D6%AE%CE%D2%CA%C7HUB.pdf

院士
2013-03-13 22:09:09    评分
6楼
妈呀,以为是论文

高工
2013-03-13 22:09:38    评分
7楼
楼上的你这是怎么啦?

高工
2013-03-13 22:10:52    评分
8楼

四年前扫过几眼USB协议,印象中没有ROOT HUB 也是可以的

真想确定,自己去看吧,几百页哦


工程师
2013-03-13 22:29:46    评分
9楼

根据usb协议, root hub可以连接127个usb设备吧 , 直接连也是可以的 , 但是控制设备没那么多

参考经典文档 


助工
2013-03-14 11:07:31    评分
10楼
看着解答,有点头晕,O(∩_∩)O~ 

共12条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]