Linux那些事儿 之 我是UHCI主机控制器
fudan_abc
这个作者很懒,什么都没留下…
展开
-
Linux那些事儿之我是UHCI(8)主机控制器的初始化(二)
485行,hcd_to_uhci,来自drivers/usb/host/uhci-hcd.h, 429 /* Convert between a usb_hcd pointer and the corresponding uhci_hcd */ 430 static inline struct uhci_hcd *hcd_to_uhci(struct usb_hcd *hcd)原创 2007-10-22 21:09:00 · 4097 阅读 · 0 评论 -
Linux那些事儿之我是UHCI(17)Root Hub的控制传输(一)
虽然最伟大的probe函数就这样结束了.但是,我们的道路还很长,困难还很多,最终的结局是未知数,我们的故事和社会主义的航班一样,还不知要驶向何处.在剩下的篇幅中,除了最后的电源管理部分以外,我们将围绕一个函数进行展开,这个函数就是usb_submit_urb().子曾经曰过:不吃饭的女人这世上也许还有好几个,不吃醋的女人却连一个也没有.我也曾经曰过:不遵循usb spec的USB设备这世上也许原创 2007-11-05 15:46:00 · 4285 阅读 · 0 评论 -
Linux那些事儿之我是UHCI(18)Root Hub的控制传输(二)
医生,请把孩子取出来之后,顺便给我吸吸脂.——广州一妇女在剖腹产手术前对医生说.对于控制传输,rh_call_control会被调用.我也特别希望能有人给这个函数吸吸脂,我们的上下文是为了获取设备描述符,即当初那个usb_get_device_descriptor领着我们来到了这个函数,为了完成这件事情,实际上只需要很少的代码,但是rh_call_control这个函数涉及了所有的Root原创 2007-11-05 15:54:00 · 7173 阅读 · 0 评论 -
Linux那些事儿之我是UHCI(19)非Root Hub的控制传输
下面来看非Root Hub的控制传输.还是从usb_submit_urb()开始,转而进入usb_hcd_submit_urb(),然后就进入到了uhci_urb_enqueue.我们来看uhci_urb_enqueue,它来自drivers/usb/host/uhci-q.c,再强调一下,我们现在看的是控制传输: 1377 static int uhci_urb_enqueue(st原创 2007-11-05 22:32:00 · 4010 阅读 · 1 评论 -
Linux那些事儿之我是UHCI(20)非Root Hub的Bulk传输
看完了控制传输,咱们来看Bulk传输,Root hub没有Bulk传输,所以咱们只需要关注非Root Hub.当然还是从usb_submit_urb()开始.和控制传输一样,可以直接跳到usb_hcd_submit_urb().由于我们在start_rh()中设置了hcd->state为HC_STATE_RUNNING,所以这里list_add_tail会被执行,本urb会被加入到ep的urb原创 2007-11-12 16:09:00 · 3461 阅读 · 1 评论 -
Linux那些事儿之我是UHCI(21)传说中的中断服务程序(ISR)
想当年咱们在usb_add_hcd中使用request_irq注册了中断函数,写代码的人做每件事情都是费尽心机的,为了达到目的不择手段,他们绝不是雷锋,他们每做一件事情都是有着极强的功利心态的,每注册一个函数都是为了日后能够利用该函数,当初注册了usb_hcd_irq,这会儿就该调用这个函数了.这个函数来自drivers/usb/core/hcd.c: 1422 /** 1423原创 2007-11-12 16:52:00 · 4563 阅读 · 0 评论 -
Linux那些事儿之我是UHCI(22)Root Hub的中断传输
来看中断传输,中断传输和下面要讲的等时传输无疑要比之前的那两种传输复杂些,至少它们讲究一个周期性.当年歌坛大姐大那英在看到usb子系统中对这两种传输的实现的复杂性之后,颇为感慨的对写代码的哥们儿唱出了那句”就这样被你征服”,而其多年来的老对手田震看了之后心情抑郁,一气之下,嗓子永久性的嘶哑了,但仍然呼吁后人看这些代码的时候要”执著”.所以我们看代码的时候看不懂也不用灰心,歌手林志炫的成名曲单身情歌原创 2007-11-14 21:05:00 · 3631 阅读 · 2 评论 -
Linux那些事儿之我是UHCI(23)非Root Hub的中断传输
再来看非Root hub的中断传输,usb_submit_urb还是那个usb_submit_urb,usb_hcd_submit_urb还是那个usb_hcd_submit_urb,但是很显然rh_urb_enqueue不会再被调用.取而代之的是1014行,driver->urb_enqueue的被调用.即uhci_urb_enqueue.这个函数咱们在讲控制传输的时候已经贴出来也已经讲过了,后原创 2007-11-15 15:06:00 · 3536 阅读 · 0 评论 -
Linux那些事儿之我是UHCI(24)等时传输
然后我们可以来看等时传输了.由于等时传输的特殊性,很多地方它都被特别的对待了.从usb_submit_urb开始就显示出了它的白里透红与众不同了.该函数中268行, 判断temp是不是PIPE_ISOCHRONOUS,即是不是等时传输,如果是,就执行下面那段代码.278行,int number_of_packets是struct urb的一个成员,它用来指定该urb所处理的等时传输缓冲区的数量原创 2007-11-15 17:50:00 · 4689 阅读 · 0 评论 -
Linux那些事儿之我是UHCI(25)实战电源管理(一)
车上的乘客大家请注意,下一站车上将上来几个小偷,大家一定要看管好自己的钱包和随身携带的物品.——东北某报记者在葫芦岛听到公共汽车售票员这样提示.此刻,我也需要预先提示你,关于uhci,我们如果想结束,现在就可以结束,如果不想,那么继续往前走一点也未尝不可.继续走的话我们会关注电源管理的部分,就如同我们在hub驱动中关注的一样.由于这部分代码颇为抽象,我们于是利用kdb,并且以做实验的方原创 2007-11-15 21:55:00 · 3723 阅读 · 0 评论 -
Linux那些事儿之我是UHCI(26)实战电源管理(二)
看了suspend自然就要看resume,在电源管理的世界里,挂起和唤醒是永远被相提并论的一对,它们就像天上的雪花,本来互不相识,一旦落在地上,化成水,结成冰,便再也分不开了!沿着上面的线索我们继续玩.现在我们设置断点wakeup_rh.然后我们插入U盘.不出所料,我们又一次进入了kdb.用bt命令看一下调用堆栈,发现调用wakeup_rh的uhci_rh_resume,调用uhci_rh_r原创 2007-11-22 17:26:00 · 3002 阅读 · 0 评论 -
Linux那些事儿之我是UHCI(27)实战电源管理(三)
接下来剩下两个重要的函数,uhci_suspend和uhci_resume,不过孤立的看这两个函数没有意义,得结合上下文来看,调用它们的分别是usb_hcd_pci_suspend和usb_hcd_pci_resume,所以我们从这两个函数看起.当然单纯的看这些函数也是没有意义的,这个世界上像灰尘一样多的,除了美女,还有Linux内核中的函数;这个世界上像细菌一样多的,除了帅哥,还有Linux内核原创 2007-11-22 17:29:00 · 5608 阅读 · 1 评论 -
Linux那些事儿之我是UHCI(29)FSBR
现在让我们来关注一下fsbr.尽管之前就FSBR本身已经说过了,但是代码中出现了很多关于fsbr的变量以及函数.如果不来梳理一下,恐怕你和我一样,仍然感到无限困惑,无限茫然.那么让我们点亮心灵的阿拉丁神灯,共同穿越这代码的迷朦.struct uhci_hcd中有这么几个成员,unsigned int fsbr_is_on,unsigned int fsbr_is_wanted,unsigned原创 2007-11-24 23:27:00 · 6801 阅读 · 0 评论 -
Linux那些事儿之我是UHCI(16)寂寞在唱歌
接下来就该是usb_hcd_poll_rh_status了.这个函数在咱们整个故事将出现多次,甚至可以说在任何一个HCD的故事中都将出现多次.为了继续走下去,我们必须做一个伟大的假设.假设现在Root Hub上还没有连接任何设备,也就是说此时此刻,usb设备树上只有Root Hub形单影只.没有人来陪伴他,他只能静静的看青春难依难舍,只能听寂寞在唱歌,轻轻的,狠狠的,歌声是这么残忍让人忍不住泪原创 2007-11-04 20:59:00 · 3875 阅读 · 3 评论 -
Linux那些事儿之我是UHCI(15)Root Hub的注册
回到usb_add_hcd之后,1638行,得出rhdev的bus_mA,这个咱们在Hub驱动中已经讲过.有些主机控制器是需要设置power_budget,咱们没有设置过,就是默认值0,所以这里得到的是bus_mA就是0,0表示没有限制,hub驱动中我们看到了对于没有限制的情况我们是给每个端口设置为最多500mA,因为通常来讲计算机的usb端口能提供的最多就是500mA.1639行,regis原创 2007-11-04 16:08:00 · 4706 阅读 · 1 评论 -
Linux那些事儿之我是UHCI(7)主机控制器的初始化(一)
好了,usb_alloc_dev,多么熟悉啊,在讲hub驱动时这就是那个八大函数的第一个.这里做的就是为Root Hub申请了一个struct usb_device结构体,并且初始化,将返回值赋给指针rhdev.回顾这个函数我们可以知道,Root Hub的parent指针指向了Controller本身.1585行,确定rhdev的speed,UHCI和OHCI都是源于曾经的USB1.1,而EH原创 2007-10-16 14:23:00 · 4053 阅读 · 0 评论 -
Linux那些事儿之我是UHCI-引子
写一下UHCI吧,也顺便怀念一下Intel,以及Intel的那几个女同事们,好久没联系了,你们可好? UHCI是Intel提出来的.虽然离开Intel一年多了,但我总觉得也许有一天我还会回到Intel.所以关于Intel的东西,我多少会关注一下.我挺怀念Intel的,虽然钱也不多,但是那时候毕竟刚毕业,对钱的问题也没想太多.UHCI全名Universal Host Controller原创 2007-09-29 23:15:00 · 6683 阅读 · 2 评论 -
Linux那些事儿之我是UHCI(3)-物以类聚
这年头情侣一多,黄瓜就不好卖了. –- 北大门口卖水果的小贩回忆2005开源社区的家伙大概都是光棍,因为他们展现给我们的不是情侣多,而是变态的数据结构多.尤其我们这一节里要经历的变态数据结构更是多,基本上这些变态的数据结构都聚集到了这一节,所谓物以类聚吧.这么一堆变态的数据结构,要是写博客的是谭浩强,估计你看了就崩溃了,也亏了是我在写.平心而论,经历了毕业这两年来的种种挫折之后,尤其是两次求职原创 2007-10-03 02:21:00 · 4254 阅读 · 3 评论 -
Linux那些事儿之我是UHCI(1)开户和销户
之所以说uhci_hcd_init有技术含量,并不是说它包含多么精巧的算法,包含多么复杂的数据结构.而是因为这其中涉及了很多东西.首先924行,usb_disable涉及了Linux中的内核参数的概念.928行的kmalloc和936行的kmem_cache_create涉及了Linux内核中内存申请的问题,931行debugfs_create_dir则涉及到了文件系统,一个虚拟的文件系统debu原创 2007-10-01 22:50:00 · 6895 阅读 · 0 评论 -
Linux那些事儿之我是UHCI(4)IO内存和IO端口
usb_bus_init来自drivers/usb/core/hcd.c,很显然,它就是初始化struct usb_bus结构体指针.而这个结构体变量hcd->self的内存已经在刚才为hcd申请内存的时候一并申请了. 688 /** 689 * usb_bus_init - shared initialization code 690 * @bus: the b原创 2007-10-04 21:53:00 · 5999 阅读 · 0 评论 -
Linux那些事儿之我是UHCI(2)PCI,我们来了!
usb_hcd_pci_probe带领我们开启了新的篇章.它就是神圣的PCI设备驱动程序.从此我们开始了PCI世界之旅,也将开始一段全新的体验.细心的你或许注意到了,关于hcd的代码,被分布于两个目录,它们是drivers/usb/core/以及drivers/usb/host/,其中前者包含三个相关的文件,hcd-pci.c,hcd.c,hcd.h,这是一些公共的代码,因为我们知道,US原创 2007-10-01 23:09:00 · 7015 阅读 · 0 评论 -
Linux那些事儿之我是UHCI(5)传说中的DMA
下一个函数,usb_add_hcd,drivers/usb/core/hcd.c中: 1548 /** 1549 * usb_add_hcd - finish generic HCD structure initialization and register 1550 * @hcd: the usb_hcd structure to initialize 155原创 2007-10-10 14:58:00 · 7682 阅读 · 0 评论 -
Linux那些事儿之我是UHCI(10)一个函数引发的故事(一)
接下来,1632行,下一个函数,driver->start被调用.对于咱们的uhci_driver,其start指针指向的是uhci_start函数,经过了人间大炮一级准备,二级准备之后,这个函数基本上就算介于三级准备和发射之间了.这个函数算是整个故事中最重要的一个函数,理解它是理解整个uhci的关键.来自drivers/usb/host/uhci-hcd.c: 538 /*原创 2007-10-28 21:21:00 · 2954 阅读 · 0 评论 -
Linux那些事儿之我是UHCI(11)一个函数引发的故事(二)
571行之前全是些初始化的代码,先飘过,用到了再回来看.571行到582行,上次我们看到DEBUG_CONFIGURED是在uhci的初始化代码中,即uhci_hcd_init函数中,这是一个编译开关,打开开关就是1,不打开就是0,我们假设打开.因为我们有必要了解一下debugfs的更多,毕竟我们当初已经接触过debugfs了.而且当时已经看到函数debugfs_create_dir在/sys原创 2007-10-28 21:29:00 · 3698 阅读 · 1 评论 -
Linux那些事儿之我是UHCI(13)一个函数引发的故事(四)
uhci_frame_skel_link来自drivers/usb/host/uhci-hcd.c: 94 /* 95 * Calculate the link pointer DMA value for the first Skeleton QH in a frame. 96 */ 97 static __le32 uhci_frame_s原创 2007-10-30 21:53:00 · 3326 阅读 · 0 评论 -
Linux那些事儿之我是UHCI(6)来来,我是一条总线,线线线线线线
下一个函数,1577行,usb_register_bus.我们说过,一个USB主机控制器就意味着一条USB总线,因为主机控制器控制的正是一条总线.古人说,猫走不走直线,完全取决于耗子,而数据走不走总线,完全取决于主机控制器.所以这里作为主机控制器的驱动,我们必须从软件的角度来说,注册一条总线.来自drivers/usb/core/hcd.c: 712 /** 71原创 2007-10-13 16:41:00 · 4981 阅读 · 3 评论 -
Linux那些事儿之我是UHCI(12)一个函数引发的故事(三)
从调度图我们可以看出,等时传输不需要什么QH,只要把几个TD连接起来,让Frame List Pointer指向第一个TD就可以了.换言之,我们需要为等时传输准备一个队列,然后每一个Frame都让Frame List Pointer指向队列的头部.那么对于中断传输应该如何操作呢?实际上我们把为中断传输建立了8个队列.不同的队列代表了不同的周期,这8个队列分别代表的是1ms,2ms,4ms,8m原创 2007-10-30 21:01:00 · 3484 阅读 · 0 评论 -
Linux那些事儿之我是UHCI(14)一个函数引发的故事(五)
接着走,661行,configure_hc,来自drivers/usb/host/uhci-hcd.c, 175 /* 176 * Store the basic register settings needed by the controller. 177 */ 178 static void configure_hc(struct uhci_hcd原创 2007-11-01 21:42:00 · 2918 阅读 · 0 评论 -
Linux那些事儿之我是UHCI(大结局)"脱"就一个字
李小璐脱了,周迅脱了,汤唯脱了.下一个脱的是谁?答案不是林志玲,不是徐静蕾,而是QH.我们知道整个故事里我们一直围绕着QH的队列在说来说去,我们不停的进行着队列操作,我们有时候把QH link起来成一个个的队列,而有时候又把QH从队列里给unlink,我所用的盗版的金山词霸2005告诉我,unlink翻译成中文就是解开,拆开,松开.Okay,简洁一点说,一个字,脱!脱就脱,东风吹,战鼓擂,这个原创 2007-11-24 23:30:00 · 3122 阅读 · 0 评论