
linux那些事儿之我是USB第二版
mikechen_2009
这个作者很懒,什么都没留下…
展开
-
1.引子
1.引子 天有不测风云,人有旦夕祸福。在2007年的夏天,我那可爱的电脑声卡坏了。 朋友给我推荐了一款飞利浦的外置声卡PSC805,老实说,声卡还能用外置的,的确让我觉得新鲜,它直接用USB连接,价钱也还可以。所以我去了一趟中关村买了一块外置声卡。 然而,在店家那里好好的声卡买回来之后居然连指示灯都不亮,根本没法用。不是完全不亮,一开始会亮,然后就不亮了。凭直觉,我判定这是软件的转载 2013-09-16 09:09:34 · 602 阅读 · 0 评论 -
2.跟我走吧,现在就出发
2.跟我走吧,现在就出发 这里说的是USB中的Hub。在USB的世界里,Hub永远都只是绿叶,它不可能是红花,它的存在只是为了支持更多设备连接到USB总线上来,谁也不会为了使用Hub而购买Hub,买Hub的原因是为了要使用别的设备。 也许设计代码的人和我一样,希望大家能够更多地关注Hub,所以,关于Hub的代码在Core的目录下面。 在Linux内核代码目录中, 所有设备驱动程序转载 2013-09-16 09:10:43 · 1450 阅读 · 0 评论 -
3.特别的爱给特别的Root Hub
3.特别的爱给特别的Root Hub 不懂Hub是怎么工作的就等于不知道USB设备驱动是怎么工作的。这句话一点没错,因为USB设备的初始化都是Hub这边发起的,通常我们写USB设备驱动程序都是在已经得到了一个struct usb_interface指针的情况下开始probe工作。可是我要问你,你的struct usb_interface从哪来的?老实说,要想知道从USB设备插入USB口的那一转载 2013-09-16 09:11:24 · 827 阅读 · 0 评论 -
4.一样的精灵,不一样的API(1)
4.一样的精灵,不一样的API(1) usb_register()这个函数是用来向USB核心层,即USB Core,注册一个USB设备驱动的,而这里我们注册的是Hub的驱动程序所对应的struct usb_driver结构体变量。定义于drivers/usb/ core/hub.c中: 2841 static struct usb_driver hub_driver = { 2842转载 2013-09-16 09:12:32 · 598 阅读 · 0 评论 -
4.一样的精灵,不一样的API(2)
4.一样的精灵,不一样的API(2) 关于内核空间,我只想说,所有的驱动程序都是运行在内核空间的,内核空间虽然很大,但总是有限的。而在这有限的空间中,其最后一个page是专门保留的,也就是说,一般人不可能用到内核空间最后一个page的指针。 换句话说,你在写设备驱动程序的过程中,涉及的任何一个指针,必然有三种情况:一种是有效指针,一种是NULL(空指针),还有一种是错误指针,或者说无效转载 2013-09-16 09:14:04 · 515 阅读 · 0 评论 -
5.那些队列,那些队列操作函数(1)
5.那些队列,那些队列操作函数(1) 这一节我们讲队列。 随着子进程进入了我们的视野,我们来看其入口函数hub_thread(),这是一个令你大跌隐形眼镜的函数。 2817 static int hub_thread(void *__unused) 2818 { 2819 do { 2820 hub_events(); 2821 wait_e转载 2013-09-16 09:14:41 · 1105 阅读 · 0 评论 -
5.那些队列,那些队列操作函数(2)
5.那些队列,那些队列操作函数(2) 从队列里删除一个元素,并且将该元素做初始化,首先看__list_del(): 155 static inline void __list_del(struct list_head * prev, struct list_head * next) 156 { 157 next->prevprev = prev; 158 prev->转载 2013-09-16 09:15:52 · 820 阅读 · 0 评论 -
6.等待,只因曾经承诺
6.等待,只因曾经承诺 hub_thread()中还有一个函数没有讲,它就是try_to_freeze(),这是与电源管理相关的函数。对大多数人来说,关于这个函数,了解就可以了。 随着Linux开始支持suspended之后,有人提倡,每一个内核进程都应该在适当的时候,调用try_to_freeze()。什么意思呢?有这样一个flag,PF_NOFREEZE,如果你这个进程或者内核线程转载 2013-09-16 09:16:18 · 558 阅读 · 0 评论 -
7.最熟悉的陌生人--probe
7.最熟悉的陌生人--probe 话说因为Hub驱动无所事事,所以hub_thread()进入了睡眠,直到某一天,hub_probe被调用。所以我们来看hub_probe(),这个函数来自drivers/usb/hub.c,其作用就如同当初我们在usb-storage中遇到的那个storage_probe()函数一样。 887 static int hub_probe(struct u转载 2013-09-16 09:17:40 · 899 阅读 · 0 评论