Linux USB 驱动开发(二)—— USB 驱动几个重要数据结构

前面我们学习了USB 驱动的一个描述符,下面来学习 USB 驱动的几个重要数据结构


一、struct usb_interface  接口函数

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. struct usb_interface  
  2. {  
  3.            
  4.          struct usb_host_interface *altsetting;  
  5.   
  6.          struct usb_host_interface *cur_altsetting;        
  7.          unsigned num_altsetting;          
  8.   
  9.          int minor;                        
  10.          enum usb_interface_condition condition;           
  11.          unsigned is_active:1;             
  12.          unsigned needs_remote_wakeup:1;   
  13.   
  14.          struct device dev;                
  15.          struct device *usb_dev;           
  16.          int pm_usage_cnt;                 
  17. };  


    struct usb_interface中的struct usb_host_interface *cur_altsetting成员,表示当前正在使用的设置

1、struct usb_host_interface 

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. struct usb_host_interface   
  2. {  
  3.          struct usb_interface_descriptor desc;//usb描述符,主要有四种usb描述符,设备描述符,配置描述符,接口描述符和端点描述符,协议里规定一个usb设备是必须支持这四大描述符的。  
  4.                                  //usb描述符放在usb设备的eeprom里边  
  5.          /* array of desc.bNumEndpoint endpoints associated with this 
  6.           * interface setting. these will be in no particular order. 
  7.           */  
  8.          struct usb_host_endpoint *endpoint;//这个设置所使用的端点  
  9.   
  10.          char *string;           /* iInterface string, if present */  
  11.          unsigned char *extra;   /* Extra descriptors */关于额外描述符  
  12.          int extralen;  
  13. };  

       具体到接口描述符,它当然就是描述接口本身的信息的。一个接口可以有多个设置,使用不同的设置,描述接口的信息会有些不同,所以接口描述符并没有放在struct usb_interface结构里,而是放在表示接口设置的struct usb_host_interface结构里。


二、struct usb_host_endpoint  端点函数

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. struct usb_host_endpoint   
  2. {  
  3.          struct usb_endpoint_descriptor desc;  
  4.          struct list_head                urb_list;//端点要处理的urb队列.urb是usb通信的主角,设备中的每个端点都可以处理一个urb队列.要想和你的usb通信,就得创建一个urb,并且为它赋好值,  
  5.                                    //交给咱们的usb core,它会找到合适的host controller,从而进行具体的数据传输  
  6.          void                            *hcpriv;//这是提供给HCD(host controller driver)用的  
  7.          struct ep_device                *ep_dev;        /* For sysfs info */  
  8.   
  9.          unsigned char *extra;   /* Extra descriptors */  
  10.          int extralen;  
  11. };  

三、struct usb_device 设备函数

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. struct usb_device {  
  2.     int devnum;         //devnum只是usb设备在一条usb总线上的编号.一条usb_bus_type类型的总线上最多可以连上128个设备  
  3.     char devpath [16];   /* Use in messages: /port/port/...*/  //对于root hub.会将dev->devpath[0]=’0’  
  4.     enum usb_device_state   state;  //设备的状态Attached,Powered,Default,Address,Configured,Suspended;  
  5.                                //Attached表示设备已经连接到usb接口上了,是hub检测到设备时的初始状态。那么这里所谓的USB_STATE_NOTATTACHED就是表示设备并没有Attached。  
  6.                                //Address状态表示主机分配了一个唯一的地址给设备,此时设备可以使用缺省管道响应主机的请求  
  7.                                //Configured状态表示设备已经被主机配置过了,也就是协议里说的处理了一个带有非0值的SetConfiguration()请求,此时主机可以使用设备提供的所有功能  
  8.                                //Suspended挂起状态,为了省电,设备在指定的时间内,3ms吧,如果没有发生总线传输,就要进入挂起状态。此时,usb设备要自己维护包括地址、配置在内的信息               
  9.   
  10.     enum usb_device_speed   speed;  /* high/full/low (or error) */  
  11.       
  12.     struct usb_tt   *tt;            //如果一个高速设备里有这么一个TT,那么就可以连接低速/全速设备,如不然,那低速/全速设备没法用,只能连接到OHCI/UHCI那边出来的hub口里。  
  13.     int             ttport;         //如果一个高速设备里有这么一个TT,那么就可以连接低速/全速设备,如不然,那低速/全速设备没法用,只能连接到OHCI/UHCI那边出来的hub口里。  
  14.       
  15.     unsigned int toggle[2];         /* one bit for each endpoint     //他实际上就是一个位图.IN方向的是toggle[0].OUT方向的是toggle[1].其实,这个数组中的每一位表示ep的toggle值 
  16.                                              * ([0] = IN, [1] = OUT) */它里面的每一位表示的就是每个端点当前发送或接收的数据包是DATA0还是DATA1  
  17.       
  18.     struct usb_device *parent;      /* our hub, unless we're the root */  
  19.                               //USB设备是从Root Hub开始,一个一个往外面连的,比如Root Hub有4个口,每个口连一个USB设备,比如其中有一个是Hub,那么这个Hub有可以继续有多个口,于是一级一级的往下连,  
  20.                                //最终连成了一棵树。  
  21.     struct usb_bus *bus;            /* Bus we're part of */设备所在的总线  
  22.     struct usb_host_endpoint ep0;   //端点0的特殊地位决定了她必将受到特殊的待遇,在struct usb_device对象产生的时候它就要初始化  
  23.       
  24.     struct device dev;              /* Generic device interface */嵌入到struct usb_device结构里的struct device结构  
  25.       
  26.     struct usb_device_descriptor descriptor;/* Descriptor */设备描述符,此结构体的bMaxPacketSize0 filed保存了端点0的maximum packet size  
  27.     struct usb_host_config *config; //设备拥有的所有配置  
  28.       
  29.     struct usb_host_config *actconfig;//设备正在使用的配置  
  30.     struct usb_host_endpoint *ep_in[16];//ep_in[16],359行,ep_out[16],除了端点0,一个设备即使在高速模式下也最多只能再有15个IN端点和15个OUT端点,端点0太特殊了,  
  31.     struct usb_host_endpoint *ep_out[16];//对应的管道是Message管道,又能进又能出特能屈能伸的那种,所以这里的ep_in和ep_out数组都有16个值  
  32.       
  33.     char **rawdescriptors;          /* Raw descriptors for each config */  
  34.       
  35.     unsigned short bus_mA;          /* Current available from the bus */这个值是在host controller的驱动程序中设置的,通常来讲,计算机的usb端口可以提供500mA的电流  
  36.     u8 portnum;                     //不管是root hub还是一般的hub,你的USB设备总归要插在一个hub的端口上才能用,portnum就是那个端口号。  
  37.     u8 level;                       //层次,也可以说是级别,表征usb设备树的级连关系。Root Hub的level当然就是0,其下面一层就是level 1,再下面一层就是level 2,依此类推  
  38.       
  39.     unsigned discon_suspended:1;    /* Disconnected while suspended */  
  40.     unsigned have_langid:1;         /* whether string_langid is valid */  
  41.     int string_langid;              /* language ID for strings */  
  42.       
  43.     /* static strings from the device */  
  44.     char *product;                  /* iProduct string, if present */  
  45.     char *manufacturer;             /* iManufacturer string, if present */  
  46.     char *serial;                   /* iSerialNumber string, if present */  
  47.                                     //分别用来保存产品、厂商和序列号对应的字符串描述符信息  
  48.     struct list_head filelist;  
  49. #ifdef CONFIG_USB_DEVICE_CLASS  
  50.     struct device *usb_classdev;  
  51. #endif  
  52. #ifdef CONFIG_USB_DEVICEFS  
  53.     struct dentry *usbfs_dentry;    /* usbfs dentry entry for the device */  
  54. #endif  
  55.     /* 
  56.     * Child devices - these can be either new devices 
  57.     * (if this is a hub device), or different instances 
  58.     * of this same device. 
  59.     * 
  60.     * Each instance needs its own set of data structures. 
  61.     */  
  62.       
  63.     int maxchild;                   /* Number of ports if hub */  
  64.     struct usb_device *children[USB_MAXCHILDREN];  
  65.       
  66.     int pm_usage_cnt;               /* usage counter for autosuspend */  
  67.     u32 quirks;                     //quirk就是用来判断这些有毛病的产品啥毛病的  
  68.       
  69. #ifdef CONFIG_PM  
  70.     struct delayed_work autosuspend; /* for delayed autosuspends */  
  71.     struct mutex pm_mutex;          /* protects PM operations */  
  72.       
  73.     unsigned long last_busy;        /* time of last use */  
  74.     int autosuspend_delay;          /* in jiffies */  
  75.       
  76.     unsigned auto_pm:1;             /* autosuspend/resume in progress */  
  77.     unsigned do_remote_wakeup:1;    /* remote wakeup should be enabled */  
  78.     unsigned autosuspend_disabled:1; /* autosuspend and autoresume */  
  79.     unsigned autoresume_disabled:1;  /*  disabled by the user */  
  80. #endif  
  81. };  

四、struct usb_host_config 配置函数

[cpp] view plaincopy
在CODE上查看代码片派生到我的代码片
  1. struct usb_host_config {  
  2.     struct usb_config_descriptor    desc;  
  3.       
  4.     char *string;             
  5.               
  6.     struct usb_interface *interface[USB_MAXINTERFACES];            //配置所包含的接口,这个数组的顺序未必是按照配置里接口号的顺序  
  7.       
  8.              
  9.     struct usb_interface_cache *intf_cache[USB_MAXINTERFACES];        //usb接口的缓存  
  10.       
  11.     unsigned char *extra;     
  12.     int extralen;  
  13. };  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux USB 驱动开发(三)—— 编写USB 驱动程序

前面学习了USB驱动的一些基础概念与重要的数据结构,那么究竟如何编写一个USB 驱动程序呢?编写与一个USB设备驱动程序的方法和其他总线驱动方式类似,驱动程序把驱动程序对象注册到USB子系统中,稍后再使用制造商和设备标识来判断是否…

Linux USB 驱动开发(一)—— USB设备基础概念

在终端用户看来,USB设备为主机提供了多种多样的附加功能,如文件传输,声音播放等,但对USB主机来说,它与所有USB设备的接口都是一致的。一个USB设备由3个功能模块组成:USB总线接口、USB逻辑设备和功能单元&am…

Linux USB 驱动开发(四)—— 热插拔那点事

学习USB热插拔之前,先学习一些USB的硬件知识: 一、USB基础概念 1、硬件知识(USB插座和插头) 在最初的标准里,USB接头有4条线:电源,D-,D,地线。我们暂且把这样的叫做标准的USB接头吧。后来OTG出现…

Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结

设备驱动程序是操作系统内核和机器硬件之间的接口,由一组函数和一些私有数据组成,是应用程序和硬件设备之间的桥梁。在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。 设备驱动程序是…

android软键盘上推ui解决

为什么80%的码农都做不了架构师?>>> http://bbs.csdn.net/topics/340198955 android软键盘上推ui解决 good job 转载于:https://my.oschina.net/macleo/blog/204882

Linux USB 驱动开发实例(一) —— USB摄像头驱动实现源码分析

Spac5xx的实现是按照标准的USB VIDEO设备的驱动框架编写(其具体的驱动框架可参照/usr/src/linux/drivers/usb/usbvideo.c文件),整个源程序由四个主体部分组成: 设备模块的初始化模块和卸载模块,上层软件接口模块&#…

System Center 2012R2之SCVMM云部署SCOM(2-2)

SCVMM云部署SCOM安装过程1、在SCVMM中,使用WINDOWS SERVER 2012母盘创建云主机SCOM在SCVMM中先创建到一个私有云指定一个私有云名称选择资源主机指定逻辑网络默认选负载衡器跳过VIP模板跳过选择端口,下一步选择存储分类指定存储的VM路径各只读共享默认设…

Linux USB 驱动开发实例(二)—— USB 鼠标驱动注解及测试

参考2.6.14版本中的driver/usb/input/usbmouse.c。鼠标驱动可分为几个部分:驱动加载部分、probe部分、open部分、urb回调函数处理部分。 一、驱动加载部分 [cpp] view plaincopy static int __init usb_mouse_init(void) { int retval usb_register(&a…

MySQL5.6 更改字段属性仍旧会锁全表,注意这个坑!

如图:如果开发让修改表字段属性,建议用pt-online-schema-change。MySQL5.6的在线DDL会锁全表。注意这个坑。另外,增加、删除字段或索引不会锁全表,删除主键会锁全表。

Linux USB 驱动开发实例 (三)—— 基于USB总线的无线网卡浅析

回顾一下USB的相关知识 USB(Universal Serial Bus)总线又叫通用串行外部总线,它是20世纪90年代发展起来的。USB接口现在得到了广泛的应用和普及,现在的PC机中都带有大量的USB接口。它最大的特点就是方便通用、支持热插拔并且可以在一个接口上插上多个设备…

Linux 设备驱动开发思想 —— 驱动分层与驱动分离

前面我们学习I2C、USB、SD驱动时,有没有发现一个共性,就是在驱动开发时,每个驱动都分层三部分,由上到下分别是: 1、XXX 设备驱动 2、XXX 核心层 3、XXX 主机控制器驱动 而需要我们编写的主要是设备驱动部分&#xff0c…

CortexM0开发 —— UART时序分析

通用异步收发传输器(UniversalAsynchronousReceiver/Transmitter),通常称作UART,是一种异步收发传输器。将数据由串行通信与并行通信间作传输转换,作为并行输入成为串行输出的芯片UART是一种通用串行数据总线,用于异步通信。该总线…

CortexM0开发 —— LPC11C14的UART使用方法

LPC1100系列微控制器UART LPC1100系列Cortex-M0微控制器具有一个符合16C550工业标准的异步串行口(UART)。此口同时增加了调制解调器(Modem)接口,DSR、DCD和RI Modem信号是只用于LQFP48和PLCC44封装的管脚配置。 特性…

Linux SD卡驱动开发(一) —— SD 相关基础概念

一.SD/MMC卡基础概念 1.1.什么是MMC卡 MMC:MMC就是MultiMediaCard的缩写,即多媒体卡。它是一种非易失性存储器件,体积小巧(24mm*32mm*1.4mm),容量大,耗电量低,传输速度快,广泛应用于消费类电子产品中。 1.2.什么是SD卡…

Linux SD卡驱动开发(二) —— SD 卡驱动分析HOST篇

回顾一下前面的知识,MMC 子系统范围三个部分: HOST 部分是针对不同主机的驱动程序,这一部是驱动程序工程师需要根据自己的特点平台来完成的。 CORE 部分: 这是整个MMC 的核心存,这部分完成了不同协议和规范的实现,并为…

MVC应用程序显示RealPlayer(rm)视频

本篇博文是演示MVC应用程序显示RealPlayer视频。 客户端能观看到RealPlayer视频,前提条件是需要安装RealPlayer客户端,就是想看Falsh或理WMV视频一样,均要安装客户端或相关插件等。 Insus.NET实现方法,还是在控制器中Render RealP…

Linux从入门到精通系列之PPTP

Linux从入门到精通系列之PPTP今天我们来说下怎么在linux环境下如何搭建PPTP-,PPTP(Point to Point Tunneling Protocol),即点对点隧道协议。该协议是在PPP协议的基础上开发的一种新的增强型安全协议,支持多协议虚拟专用…

Linux SD卡驱动开发(三) —— SD 卡驱动分析CORE篇

废话不多说,直接切进主题: Linux在内核源码的drivers/mmc/core文件夹下为我们的提供了一系列SD卡的接口服务函数。可以查看Makefile如下 可见,core文件夹下有针对总线的服务bus.c,针对主控制器的服务host.c,针对SD卡的…

Python数值计算:一 使用Pylab绘图(1)

Pylab的使用 学习使用Python进行科学计算,然而很难找到简单实用,又循序渐进的例子。正好手边有一本《Matlab可视化大学物理学》,里面的例子非常清晰地解释了Matlab在物理学中的应用。重新使用Python实现这些例子,学习了Python&…

Linux SD卡驱动开发(四) —— SD 控制器之真正的硬件操作

前面对SD卡控制器有了一个基本的介绍。其实SD控制器层更过的意义是为core层提供一种操作SD卡硬件的一种方法,当然不同的控制器对硬件控制的方法不尽相同,但是他们最终都能像core层提交一个统一的封装有操作方法的数据结构,那便是即将闪亮登场…