在struct usb_driver中,.probe和.disconnect的原型如下:
int (*probe) (struct usb_interface *intf,const struct usb_device_id *id);
void (*disconnect) (struct usb_interface *intf);
我们来看其中的参数,struct usb_device_id这个不用说了,刚才已经介绍过,那么struct usb_interface从何而来?还是让我们先从struct usb_device说起.
我们知道每一个device对应一个struct device结构体变量,但是device不可能是万能的,生命是多样性的,就像我们可以用"人"来统称全人类,但是分的细一点,又有男人和女人的区别,那么device也一样,由于有各种各样的设备,于是又出来了更多的词汇(数据结构),比如针对usb设备,开发者们设计了一个叫做struct usb_device的结构体.她定义于include/linux/usb.h,
294 /*
295 * struct usb_device - kernel's representation of a USB device
296 *
297 * FIXME: Write the kerneldoc!
298 *
299 * Usbcore drivers should not set usbdev->state directly. Instead use
300 * usb_set_device_state().
301 */
302 struct usb_device {
303 int devnum; /* Address on USB bus */
304 char devpath [16]; /* Use in messages: /port/port/... */
305 enum usb_device_state state; /* configured, not attached, etc */
306 enum usb_device_speed speed; /* high/full/low (or error) */
307
308 struct usb_tt *tt; /* low/full speed dev, highspeed hub */
309 int ttport; /* device port on that tt hub */
310
311 struct semaphore serialize;
312
313 unsigned int toggle[2]; /* one bit for each endpoint ([0] = IN, [1] = OUT) */
314 int epmaxpacketin[16]; /* INput endpoint specific maximums */
315 int epmaxpacketout[16]; /* OUTput endpoint specific maximums */
316
317 struct usb_device *parent; /* our hub, unless we're the root */
318 struct usb_bus *bus; /* Bus we're part of */
319
320 struct device dev; /* Generic device interface */
321
322 struct usb_device_descriptor descriptor;/* Descriptor */
323 struct usb_host_config *config; /* All of the configs */
324 struct usb_host_config *actconfig;/* the active configuration */
325
326 char **rawdescriptors; /* Raw descriptors for each config */
327
328 int have_langid; /* whether string_langid is valid yet */
329 int string_langid; /* language ID for strings */
330
331 void *hcpriv; /* Host Controller private data */
332
333 struct list_head filelist;
334 struct dentry *usbfs_dentry; /* usbfs dentry entry for the device */
335
336 /*
337 * Child devices - these can be either new devices
338 * (if this is a hub device), or different instances
339 * of this same device.
340 *
341 * Each instance needs its own set of data structures.
342 */
343
344 int maxchild; /* Number of ports if hub */
345 struct usb_device *children[USB_MAXCHILDREN];
346 };
347 #define to_usb_device(d) container_of(d, struct usb_device, dev)
看起来很复杂的一个数据结构,不过我们目前不需要去理解她的每一个成员,不过我们可以看到,其中有一个成员struct device dev,没错,这就是前面说的那个属于每个设备的struct device结构体变量.
实际上,U盘驱动里边并不会直接去处理这个结构体,因为对于一个U盘来说,她就是对应这么一个struct usb_device的变量,这个变量由usb core负责申请和赋值.但是我们需要记住这个结构体变量,因为日后我们调用usb core提供的函数的时候,会把这个变量作为参数传递上去,因为很简单,要和usb core交流,总得让人家知道我们是谁吧,比如后来要调用的一个函数,usb_buffer_alloc,它就需要这个参数.
而对U盘设备驱动来说,比这个struct usb_device更重要的数据结构是,struct usb_interface.走到这一步,我们不得不去了解一点usb设备的规范了,或者专业一点说,usb协议.因为我们至少要知道什么是usb interface.
分享到:
相关推荐
综上所述,“Linux那些事儿之我是U盘”所涉及的知识点涵盖了USB技术的基本概念、USB在Linux系统中的实现机制以及具体的编程细节。通过对这些知识点的学习和理解,不仅可以深入了解USB技术本身,还可以更好地掌握如何...
本压缩包文件"linux那些事儿之我是USB.zip"包含了深入理解Linux USB驱动及内核相关知识的九个文档,包括Block层、EHCI主机控制器、HUB、PCI、SCSI硬盘、Sysfs、UHCI、USB core以及U盘。这些文档旨在提供一个系统性的...
【Linux那些事儿之我是U盘1】这篇文章是一个关于Linux内核和USB设备驱动程序的系列教程,作者通过个人经历引入,讲述了自己如何接触并学习Linux技术。文章详细讲解了Linux内核中的USB总线、设备驱动和USB存储设备的...
【Linux那些事儿[完整版]】是一份关于Linux操作系统核心知识的综合整理,涵盖了从早期的2.6.10内核版本到2.6.22内核版本的更新与发展。这个资料集旨在深入浅出地讲解Linux系统的核心概念和技术,帮助读者理解Linux...
### Linux那些事儿之我是U盘 - **USB技术简介**:作者以幽默的方式回顾了2005年的一次毕业答辩经历,当时被要求用一句话介绍USB技术。这段经历反映出作者对于技术细节的重视以及对USB技术复杂性的理解。 - **关键词...
3. **我是U盘.pdf** - 这部分可能讲解了Linux系统下如何识别、挂载和管理USB闪存驱动器,包括USB Mass Storage协议的运用及Linux的MTP(Media Transfer Protocol)支持。 4. **我是HUB.pdf** - HUB(Hub)在USB网络...
总的来说,Linux内核编程和Linux那些事儿涵盖了从底层硬件到上层应用的广泛知识,是成为一名熟练的Linux系统管理员或开发者所必须掌握的基础。通过深入学习和实践,你可以更好地理解和利用这个强大的开源操作系统。
"我是U盘"章节专门探讨了USB闪存驱动器在Linux中的工作方式,包括设备识别、文件系统挂载以及相关的故障排查技巧。 "我是USB core"则涵盖了整个USB子系统的中心——USB核心,它负责处理所有USB设备的通用任务,如...
《LINUX那些事儿:我是USB Core》一书深入剖析了Linux操作系统中USB核心(USBCore)的工作原理及其与驱动程序的交互机制。本书通过生动的叙述方式,将复杂的USB技术概念转化为易于理解的故事,引领读者逐步探索USB在...
USB设备驱动详解(Linux) USB(Universal Serial Bus)设备驱动是Linux内核中不可或缺的一部分,它使得...通过阅读《Linux那些事儿之我是U盘.pdf》这样的资料,可以更系统地学习这一领域的知识,提升自己的技能水平。
"Linux那些事儿"可能是指一系列关于Linux系统和USB相关的教程或文档,涵盖了Linux内核的USB支持、驱动开发、设备管理和故障排查等内容。通过这些资料,学习者可以了解到Linux是如何处理USB设备的注册、中断处理、...
描述中提到的“Linux那些事儿之我是U盘.pdf”可能是一份关于在Linux操作系统中使用U盘的指南。Linux作为开源操作系统,与Windows和macOS相比,其对USB设备的支持可能会有所不同。用户可能需要了解如何在Linux中识别...