- 论坛徽章:
- 0
|
始化为0,虽然这里我们没有把这个函数的代码贴出来,但你也千万不要以为写代码的人跟你我似的,申请变
量还能忘了初始化.同时,struct urb 中还有一个引用计数,以及一个自旋锁,这些也同样被初始化了.
所以,接下来我们就将和us->current_urb 打交道了.如果你对urb 究竟怎么用还有些困惑的话,可以
看看host controller 的代码,如果你不想看,那么我可以用一种你最能接受的方式告诉你,usb 是一种总线,
是总线它就要通信,我们现实生活中真正要使用的是设备,但是光有设备还不足以实现usb通信,于是世界上
有了usb host controller(usb 主机控制器),它来负责统一调度,这就好比北京的交警,北京这个城市里真
正需要的本来是车辆和行人,而光有车辆和行人,没有交警,那么这个城市里的车辆和行人必将乱套,于是诞
生了交警这么一个行业,交警站在路口统一来管理调度那混乱的交通.假如车辆和行人可以完全自觉遵守某
种规矩而来来往往于这个城市的每一个角落,每一个路口,那么交警就没有必要存在了.同样,假如设备能够
完全自觉的传递信息,每一个数据包都能到达它应该去的地方,那么我们根本就不需要有主机控制器这么一
个东西.然而,事实是,在北京,遵守交通规则的人不多,我相信每一个来过北京的人都会发现,在北京,闯红灯
是一种时尚.我常常对自己说,如果哪一天我没有闯红灯,那么由此可以推导出来,这一天我一定没有出门.同
样,在usb 的世界中,设备也总是那么的不守规矩,我们必须要设计一个东西出来管理来控制所有的usb 设
备的通信,这样,主机控制器就横空出世了.
那么设备和主机控制器的分工又是如何呢?硬件实现上我们就不说了,说点具体的,Linux 中,设备驱动
程序只要为每一次请求准备一个urb 结构体变量,把它填充好,(就是说赋上该赋的值)然后它调用usb core
提供的函数,把这个urb 传递给host controller,host controller 就会把各个设备驱动程序所提交的urb
统一规划,去执行每一个操作.而这期间,usb 设备驱动程序通常会进入睡眠,而一旦host controller 把urb
要做的事情给做完了,它会调用一个函数去唤醒usb 设备驱动程序,然后usb 设备驱动程序就可以继续往下
走了.这又好比我们学校里的师生关系.考试的时候,我们只管把试卷填好,然后我们交给老师,然后老师拿去
批改试卷,这期间我们除了等待别无选择,等待老师改完了试卷,告诉了我们分数,我们又继续我们的生活.当
然了,如果成绩不好,也许有些人的生活就不会继续了,在复旦,我们可以选择去曾经的绝情谷上吊,可以选择
去第四教学楼顶层跳下来,在交大,则可以去跳思源湖.同样,usb 设备驱动程序也是如此,如果urb 提交给
usb host 了,但是最终却没有成功执行,那么也许该usb 设备驱动程序的生命也就提前结束.不过这都是后
话,现在只要有个感性认识即可,稍后看到了就能更深刻的体会了,这种岗位分工的方式给我们编写设备驱动
程序带来了巨大的方便.
心锁
如果大家没意见的话,我们继续usb_stor_acquire_resources 函数.
761 至764 行,这没啥好说的吧.就是刚才urb 申请了之后判断是否申请成功了,如果指针为NULL 那么
就是失败了.直接返回-ENOMEM.别往下了.
767 行,哦,又一个家伙闪亮登场了,dev_semaphore, 这是一个信号量,在storage_probe 的最初始阶
段我们曾经见过,当时有这么一句话,这就是调用一个宏init_MUTEX 来初始化一个信号量,
943 init_MUTEX(&(us->dev_semaphore));
我们当时说了,等到用的时候再讲.不过现在的确是到用的时候了,不过,我还不想讲.曾经我天真的以为,
只要学了谭浩强的那本C 程序设计,即便不能写代码,也应该能够看懂代码.然而,后来我发现事实并非如此,
世界没错,我错了. |
|