转载本论坛 (fudan_abc ) :linux那些事儿之我是u盘(16)冰冻三尺非一日之寒
不是一天建成的 . 在让 U 盘工作之前 , 其实我们的驱动作了很多准备工作 .
430 static int associate_dev(struct us_data *us, struct usb_interface *intf)
431 {
432 US_DEBUGP("-- %s/n", __FUNCTION__);
433
434 /* Fill in the device-related fields */
435 us->pusb_dev = interface_to_usbdev(intf);
436 us->pusb_intf = intf;
437 us->ifnum = intf->cur_altsetting->desc.bInterfaceNumber;
438 US_DEBUGP("Vendor: 0x%04x, Product: 0x%04x, Revision: 0x%04x/n",
439 us->pusb_dev->descriptor.idVendor,
440 us->pusb_dev->descriptor.idProduct,
441 us->pusb_dev->descriptor.bcdDevice);
442 US_DEBUGP("Interface Subclass: 0x%02x, Protocol: 0x%02x/n",
443 intf->cur_altsetting->desc.bInterfaceSubClass,
444 intf->cur_altsetting->desc.bInterfaceProtocol);
445
446 /* Store our private data in the interface */
447 usb_set_intfdata(intf, us);
448
449 /* Allocate the device-related DMA-mapped buffers */
450 us->cr = usb_buffer_alloc(us->pusb_dev, sizeof(*us->cr),
451 GFP_KERNEL, &us->cr_dma);
452 if (!us->cr) {
453 US_DEBUGP("usb_ctrlrequest allocation failed/n");
454 return -ENOMEM;
455 }
456
457 us->iobuf = usb_buffer_alloc(us->pusb_dev, US_IOBUF_SIZE,
458 GFP_KERNEL, &us->iobuf_dma);
459 if (!us->iobuf) {
460 US_DEBUGP("I/O buffer allocation failed/n");
461 return -ENOMEM;
462 }
463 return 0;
464 }
我们首先来关注函数associate_dev的参数, struct us_data *us,传递给它的是us,这个不用多说了吧,此前刚刚为它申请了内存,并且初始化各成员为0. 这个us将一直陪伴我们走下去,直到我们的故事结束.所以其重要性不言而喻. struct usb_interface *intf,这个也不用说,storage_probe()函数传进来的两个参数之一.总之,此处郑重申明一次,struct us_data的结构体指针us,struct usb_interface结构体的指针intf,以及struct usb_device结构体和struct usb_device_id结构体在整个U盘驱动的故事中是唯一的,每次提到都是那个. 而以后我们会遇上的几个重要的数据结构,struct urb urb,struct scsi_cmnd srb这也非常重要,但是它们并不唯一,也许每次遇上都不一样,就像演戏一样.前边这几个数据结构的变量就像那些主角,而之后遇见的urb啊,srb啊,虽然频繁露面,但是只是群众演员,只不过这次是路人甲,下次是路人乙. 所以,以后我们将只说us,不再说struct us_data *us,struct usb_interface * intf也将只用intf来代替.
52 struct usb_host_interface {
53 struct usb_interface_descriptor desc;
54
55 /* array of desc.bNumEndpoint endpoints associated with this
56 * interface setting. these will be in no particular order.
57 */
58 struct usb_host_endpoint *endpoint;
59
60 unsigned char *extra; /* Extra descriptors */
61 int extralen;
62 };
它的成员desc是一个struct usb_interface_descriptor结构体变量,这个结构体的定义是和usb协议直接对应的,定义于include/linux/usb_ch9.h.(这里取名为"ch9"是因为这个文件很多东西对应于usb spec 2.0中的第九章,chapter 9.):
243 struct usb_interface_descriptor {
244 __u8 bLength;
245 __u8 bDescriptorType;
246
247 __u8 bInterfaceNumber;
248 __u8 bAlternateSetting;
249 __u8 bNumEndpoints;
250 __u8 bInterfaceClass;
251 __u8 bInterfaceSubClass;
252 __u8 bInterfaceProtocol;
253 __u8 iInterface;
254 } __attribute__ ((packed));
而其中我们这里提到的是bInterfaceNumber,一个设备可以有多个Interface,于是每一个Interface当然就得用个编号了,要不然咋区分啊?所有这些描述符里的冬冬都是出厂的时候就固化在设备里边的,而我们这里之所以可以用bInterfaceNumber来赋值,是因为usbcore在为设备初始化的时候就已经做足了这些功课.否则的话,我们真是寸步难行.
139 {
140 dev_set_drvdata(&intf->dev, data);
141 }
有趣的是,dev_set_drvdata这个函数也是内联函数,也只有一行代码,她定义于include/linux/device.h中:
303 dev_set_drvdata (struct device *dev, void *data)
304 {
305 dev->driver_data = data;
306 }
所以,结合来看,最终做的事情就是让&intf->dev->driver_data=data,即&intf->dev->driver_data=us.
转载本论坛 (fudan_abc ) :linux那些事儿之我是u盘(16)冰冻三尺非一日之寒相关推荐
- linux 那些事儿之我是 u 盘,《Linux那些事儿之我是USB》.PDF
<Linux 那些事儿之我是 USB> 作者:华清远见 第 1 章 Linux 那些事儿之我是 USB Core 专业始于专注 卓识源于远见 1 .引子 老夫子们痛心疾首地总结说,现代青年 ...
- Linux那些事儿之我是U盘(5)外面的世界很精彩
看代码之前,我曾经认真的思考过这么一个问题,我需要关注的仅仅是drivers/usb/storage/目录下面那相关的3000多行代码吗?就是这样几个文件就能让一个个不同的U盘在Linux下面工作起来 ...
- Linux那些事儿之我是U盘(4)想到达明天,现在就要启程
既然知道了怎么编写一个模块,那么编写设备驱动程序自然也就不难了.我相信,每一个会写模块的人都不会觉得写设备驱动有困难.对自己行不行不确定的话,可以去问一下葛优,他准说:"(神州行),我看行. ...
- Linux那些事儿之我是U盘(1)小城故事
这个故事中使用的是2.6.10的内核代码.Linux内核代码目录中, 所有去设备驱动程序有关的代码都在drivers/目录下面,在这个目录中我们用ls命令可以看到很多子目录. localhost:/u ...
- 【转】Linux那些事儿之我是U盘(4)想到达明天,现在就要启程
既然知道了怎么编写一个模块,那么编写设备驱动程序自然也就不难了.我相信,每一个会写模块的人都不会觉得写设备驱动有困难.对自己行不行不确定的话,可以去问一下葛优,他准说:"(神州行),我看行. ...
- Linux那些事儿之我是U盘--引子
也许是在复旦养成了昼伏夜出的坏习惯,工作之后也总是很晚也不愿意睡.来到北京之后,开始听广播听都市之声的北京不眠夜.这个节目是从23点直到第二天凌晨一点,我常常是听完了才会睡觉.无论是北京还是上海,对我 ...
- Linux那些事儿之我是U盘(29)将控制传输进行到底
其实usb_stor_clear_halt这个函数的作用很简单,就是spec里边规定了,usb设备中,有两类端点,必须具有一个叫做Halt的特征,啥是Halt?查金山词霸去,中断,停止,暂停,怎么解释 ...
- Linux那些事儿之我是U盘(49)跟着感觉走(一)
接下来的时间里我们会接触两个变量,fake_sense和need_auto_sense,sense顾名思义,感觉.所以就让我们跟着感觉走.我们前面提到过,如果设备想发送比期望值更多的数据,那么我们前面 ...
- 【转】Linux那些事儿之我是U盘(33)彼岸花的传说(一)
彼岸花,花语是悲伤的回忆. 很久很久以前,城市的边缘开满了大片大片的曼珠沙华,它的花香有一种魔力,可以让人想起自己前世的事情.守护曼珠沙华的是两个妖精,一个是花妖叫曼珠,一个是叶妖叫沙华.他们守侯了几 ...
最新文章
- 中班音乐 机器人教案_幼儿园中班音乐活动教案《机器人》
- TF之LSTM:利用基于顺序的LSTM回归算法对DIY数据集sin曲线(蓝虚)预测cos(红实)(TensorBoard可视化)
- [Leetcode][第130题][JAVA][被围绕的区域][DFS][BFS]
- java 课后习题 找零钱
- 玩转SpringBoot 2 之项目启动篇
- android php 项目代码混淆,Android Studio配置反混淆的实现
- Python的底气,是从哪儿来的?
- beeline安装_Hive 系列 之 简介与安装
- SpringMVC 整合Redis
- 揭秘直播带货的收割套路
- STM32L151C8T6笔记2:RTC唤醒的STOP模式
- 快递是如何被送到你手里的?一文读懂风口上的仓储自动化
- Ueditor编辑器如何改变上传图片大小限制
- 下一清分日期是几年前_我驾驶证有违章我是在清分之前处理的清分日期过后才交的罚款那我那个分还能不能清零那个分还能不能清零?-免费法律咨询-华律网...
- android-微信sdk
- 知物由学 | SO加固如何提升Android应用的安全性?
- react项目中遇到的几个问题
- 拆解USB无线网卡,电路方案非常经典(附高清美图)
- BAT批处理基本命令
- HTML 5 技术——链接群(持续更新)
热门文章
- 让生态更有力量 CDEC2020中国数字智能生态大会成都站圆满收官
- 2018小米春招,擦黑板
- android 4.0 bluetooth bt HFP/HSP分析
- 亲爱的数据工作者,教你绕开13个雷区的方法
- php表单验证_PHP表单验证:简介
- 18650测试 微型计算机,至轻至薄 四款超轻薄移动电源测试
- CodeForces Gym 101047L Putting plates on the tuk-tuks 快速幂
- lol好友列表显示聊天服务器断开,lol聊天服务器断开 英雄联盟聊天服务器连不上解决办法...
- JAVA分布式快速开发基础平台 iBase4J 推荐 国产 J2EE框架
- Android知识回顾-- 消息处理机制