1. usb设备驱动注册流程图

......

2. usb设备驱动注册

usb_register_device_driver(&usb_generic_driver, THIS_MODULE);

usb通用驱动usb_generic_driver结构体

struct usb_device_driver usb_generic_driver = {.name = "usb",.probe = generic_probe,.disconnect = generic_disconnect,
#ifdef  CONFIG_PM.suspend = generic_suspend,.resume = generic_resume,
#endif.supports_autosuspend = 1,
};

在usb主机控制器ehci、ohci检测到设备接入时都会调用这个通用的usb设备驱动,它的目的纯粹是作为设备接入时的一个接口,真正操作时usb_choose_configuration()、usb_set_configuration(),关于generic_probe()通用设备探测函数等会在分析,先来看下usb通用设备驱动时如何注册的。

int usb_register_device_driver(struct usb_device_driver *new_udriver,struct module *owner)
{int retval = 0;if (usb_disabled())return -ENODEV;//初始化一个usb驱动包new_udriver->drvwrap.for_devices = 1; //表示是设备,非驱动new_udriver->drvwrap.driver.name = (char *) new_udriver->name; //初始化驱动名为“usb”new_udriver->drvwrap.driver.bus = &usb_bus_type; //绑定驱动的总线为“usb”new_udriver->drvwrap.driver.probe = usb_probe_device; //驱动的探测函数new_udriver->drvwrap.driver.remove = usb_unbind_device;new_udriver->drvwrap.driver.owner = owner;retval = driver_register(&new_udriver->drvwrap.driver); //注册一个新的驱动if (!retval)pr_info("%s: registered new device driver %s\n",usbcore_name, new_udriver->name);elseprintk(KERN_ERR "%s: error %d registering device ""  driver %s\n",usbcore_name, retval, new_udriver->name);return retval;
}

driver_register(&new_udriver->drvwrap.driver)注册一个设备驱动在hub驱动注册时分析过,这里不再赘述,主要目地是完成usb设备驱动到usb总线上的注册,同时创建相应的设备模型kobject,详见:点击打开链接 3.hub驱动注册小节。

由于这里时内核刚起来时创建的设备驱动,这个时候在usb总线上还没有设备,所以在分析generic_probe()前,必须要了解usb主机控制器ehci、ohci是如何完成注册的、如何创建根root-hub,所以这里我们假设usb主机控制器驱动完成注册(关于usb主机控制器注册,详见:点击打开链接),并且这个时候有设备接入到usb主机控制器()上

3. generic_probe()

备注,在分析该generic_probe()探测函数前,先要看下usb主机控制器驱动的注册流程,否则无法分析generic_probe()内部的工作原理,原因是只有usb主机控制器注册了,然后有usb设备接入到主机控制器上时,主机控制器检测到设备接入,通知hub_thread完成枚举、创建挂接在usb总线上的设备,然后该设备通过usb总线寻找到名称相同的驱动,调用usb_probe_device()-->generic_probe()完成接入usb设备接口的初始化....

usb通用设备驱动注册相关推荐

  1. linux内核关闭触摸屏校准,linux内核usb触摸屏驱动bug调试- selected device is not a touchscreen I understand...

    近期给客户调试一块数控板,今天客户带过来一个屏,并且有一个usb的触摸屏芯片接在屏上.屏很快就弄好正常显示. 触摸屏在内核下找到usb 触摸屏驱动,内核启动后这个usb转的触摸屏也正常找到,注册为ev ...

  2. Linux驱动开发之USB驱动深入学习(三)——USB2.0ECHI驱动注册

    一.前言 本篇博客仅对ECHI主机控制器驱动的注册部分进行简要叙述,后面再对一些重要的接口进行分析讲解. 二.USB 1.概述 USB(Universal Serial Bus)即"通用外部 ...

  3. USB转串口驱动分析(一)

    之前追踪代码用的grep命令效率太低了,所以这次下载C代码阅读跳转利器ctags.cscope用于分析代码 因为用的是Centos6.7所以需要用到yum install安装软件 [wuyujun@w ...

  4. 第八章 USB 设备驱动移植

    8.1 USB协议     USB协议系统主要组成,总线拓扑结构,内部层次关系,数据流模式,USB调度等等         8.1.1 主要组成部分             USB的连接部分,USB的 ...

  5. php调用linux摄像头,Linux_Linux中开发USB摄像头驱动详解,USB摄像头以其良好的性能和低 - phpStudy...

    Linux中开发USB摄像头驱动详解 USB摄像头以其良好的性能和低廉的价格得到广泛应用.同时因其灵活.方便的特性,易于集成到嵌入式系统中.但是如果使用现有的符合Video for Linux标准的驱 ...

  6. usb鼠标驱动(一)

    Linux USB 鼠标驱动程序详解 注册一个usb driver,这个drvier不是usb设备driver,而是接口driver. /* use a define to avoid include ...

  7. linux设备驱动之USB主机控制器驱动分析

    http://www.cnblogs.com/sdphome/archive/2011/09/29/2195791.html 一:前言 Usb是一个很复杂的系统.在usb2.0规范中,将其定义成了一个 ...

  8. Linux下的USB总线驱动 mouse

    Linux下的USB总线驱动(03)--USB鼠标驱动 usbmouse.c USB鼠标驱动 usbmouse.c 原文链接:http://www.linuxidc.com/Linux/2012-12 ...

  9. Linux下的USB总线驱动 1

    版权所有,转载请说明转自 http://my.csdn.NET/weiqing1981127 一.USB理论 1.      USB概念概述 USB1.0版本速度1.5Mbps(低速USB) USB1 ...

最新文章

  1. VC使用ActiveX控件常见问题
  2. C++Runge-Kutta龙格-库塔法求非线性常微分方程的解(附完整源码)
  3. 关于搭建php电商环境时缺少fileinfo、数据库安装出错问题解决办法
  4. 关于linux LVM
  5. 好久没敲代码了(强行补上今天的博客。。。)
  6. flink CompactingHashTable源码解析
  7. java鸟和翅膀组合关系怎么写_关联、聚合、组合和依赖之间区别
  8. java 查找注解_Java利用反射如何查找使用指定注解的类详解
  9. 分数加减法混合计算机,1649.新人教版五年级数学下册第三课 分数加减混合运算(教案)(教学设计)(国家级一等奖、适合公开课).doc...
  10. C语言_结构体数组初始化
  11. 网件r7000梅林系统5g不稳定 5g信号经常掉线解决方法
  12. 求长方形的周长和面积c语言两个函数_怎么用C语言编程设计“输入长方形的长和宽,求长方形的面积”的程序...
  13. mysql 查看校对集_MySQL教程之校对集问题
  14. N32G457VEL7移植FreeRTOS代码
  15. 《炬丰科技-半导体工艺》 使用超临界二氧化碳清洗去除晶片表面的Si3N4颗粒
  16. Spring系列之依赖注入的三种方式
  17. Unity 物理系统 -- 碰撞体简介(碰撞、触发条件)
  18. 保持冷静散热运行 讯景HD7870报价1399
  19. 读论文3:SELFEXPLAIN: A Self-Explaining Architecture for Neural Text Classifiers
  20. 东北大学acm暑期夏令营结构体

热门文章

  1. 基于Hyperledger Fabric实现药品溯源
  2. MP3文件结构及编解码流程
  3. SpringBoot+Vue3实现文件的上传和下载
  4. vue表格实现前端分页
  5. 【数字IC验证快速入门】3、数字IC设计全流程介绍
  6. CPU性能测试基准(Dhrystone)学习
  7. 禁用http请求缓存from disk cache
  8. Verilog 实现 UART RX 接收器
  9. 2016年中考计算机考试模拟试题,2016年中考英语考前模拟试题(1)
  10. Python实现树结构的两种方式