文章目录

  • 一、drivers/usb目录结构
  • 二、USB Core

一、drivers/usb目录结构

  • usb目录下包含如下目录和文件:
atm     cdns3     class   core  dwc3   gadget  image    Kconfig   misc  mtu3  phy            roles   storage  usbip
c67x00  chipidea  common  dwc2  early  host    isp1760  Makefile  mon   musb  renesas_usbhs  serial  typec    usb-skeleton.c
  • usb-skeleton.c是一个简单地USB驱动框架。
  • core实现一些核心功能,为别的驱动程序提供服务,例如,申请内存,实现所有设备都要用到的公共函数、初始化整个USB系统,初始化Root hub,主机控制器公共代码等。
  • host不同类型的主机控制器的代码。
  • gadget包括UDC驱动和gadget驱动:
    • UDC这个是针对具体的CPU平台的,
    • gadget驱动主要包括,file_storage等。

二、USB Core

  • 内核里面的USB子系统

    • USB主机控制器(HCD),提供主机控制器硬件的抽象。
    • 在写USB驱动的时候,只能调用core的接口,core会将请求发送给HCD执行。
  • wc命令可以统计文件字数或者行数。
  • USB子系统的入口是usb_init函数,主要完成初始化动作,之后它所使用的资源就会被释放掉。
  • linux设备模型:
    • bus_type:device *dev_root表示总线有哪些设备
    • device:我们可以知道 struct device 中的 bus 表示这个设备连到哪个总线上,driver 表示这个设备的驱动是什么。
    • device_driver;struct device_driver 中的 bus 表示这个驱动属于哪个总线
  • kobject是总线、设备和驱动等对象的基类,实现了一些公共的接口。
    • kset是同种类型kobject对象的集合,也可以说是对象的容器。
    • c通过在结构体中嵌入kobject来实现继承,kobject中包含了parent成员,指向上一层节点。
  • kset通过链表来实现。
  • klist包含一个链表和一个自旋锁
  • bus_type中有两条链表,分别是设备列表和驱动列表。
  • 内核要求每出现一个设备或者驱动就要想总线汇报(注册)。
    • 在系统初始化的时候,会扫描连接了哪些设备,并为每一个设备建立一个device的变量。每次有一个驱动程序,就要准备一个device_driver变量。并将这些变量分别插入devicesdrivers链表。这样总线就能找到每个设备和每个驱动
  • 而设备和驱动是怎么关联起来的呢?
    • 现在我们的两个链表有了,但这两个链表是相互独立的,没有关联起来。
    • 每当有一个新的设备接进来的时候,设备就会去drivers链表中查找,有没有适合自己的驱动,如果找到了就通过函数device_bind_driverdevice中的driver指向找到的那个驱动。而这个驱动也会把这个设备加入到它的klist_devices链表中。
  • usb_bus_type用来注册总线,落实设备模型。
    • match函数指针负责匹配设备和驱动。
    • match指向usb_device_match方法,这个方法里面,会区别deviceinterface,分别进行处理。
  • interface 设备接口
    • 设备可以有多个接口,每个接口对应着一个功能,每个接口对应着一个驱动。
    • device落实到USB子系统里面就成了两个结构:一个是usb_device,一个是usb_interface
    • 设备可以有多个配置,配置里面可以包含一个或者多个接口,接口通常具有一个或者多个设置。
    • minor是分配给设备的次设备号。
    • linux所有的硬件设备都是用文件来表示的,俗称设备文件,在/dev目录下,ls -l可以查看设备的主设备号次设备号。主设备号,决定了你应该加载哪个驱动,次设备号决定驱动应该操作那个设备。
    • usbfs提供了用户空间直接访问USB硬件设备的接口。usbfs_driver用来完成这件事情。
    • usb_devio_initUSB_DEVICE_DEV使用了USB_DEVICE_MAJOR,用来让用户空间可以通过usbfs访问内核设备。
    • linux系统为USB设备预留的主设备号是USB_MAJOR,在usb_major_init里面注册了字符设备。
    • /proc/devices文件显示了当前系统已经分配出去的主设备号。
    • 通常来说,USB设备并不会用到预留的这个主设备号,而是使用与其关联的子系统的设备号。
    • 如果usb设备没有与其他任何子系统相关联,就需要通过usb_register_dev函数注册,或得主设备号USB_MAJOR
    • 如果关联了其他子系统,就需要在对应驱动程序的probe函数中使用相应的注册函数。
    • USB 接口关联有其他子系统,也就是说不使用 USB_MAJOR 作为主设备号时,struct usb_interface 的字段 minor 可以忽略。minor 只在 USB_MAJOR 起作用时才起作用.
    • needs_remote_wakeup表示挂起的设备是否可以给主机发信号,用来唤醒自己或者主机。
    • usb_dev基本可以忽略。

【usb】USB Core功能解析(一)-------linux那些事儿之我是usb相关推荐

  1. 读书笔记《Linux那些事儿之我是USB》

    第一篇:Linux那些事儿之我是USB Core USB诞生于inel 产生是为了解决前期计算机并口串口的问题,实现一种解决速度,扩展性,易用性的通信方式. 速度:usb2.0高速模式,480MB/s ...

  2. linux 那些事儿之我是 u 盘,《Linux那些事儿之我是USB》.PDF

    <Linux 那些事儿之我是 USB> 作者:华清远见 第 1 章 Linux 那些事儿之我是 USB Core 专业始于专注 卓识源于远见 1 .引子 老夫子们痛心疾首地总结说,现代青年 ...

  3. 《Linux那些事儿之我是USB》我是U盘(1)小城故事

    这个故事中使用的是2.6.22的内核代码.在Linux内核代码目录中,所有与设备驱动程序有关的代码都在drivers/目录下面,在这个目录中用ls命令可以看到很多子目录: lfg1:/usr/src/ ...

  4. Linux设备之我是usb,linux那些事儿之我是usb

    linux那些事儿之我是usb,复旦大学教授肖林甫先生给学生们解说的linux操作系统的一些硬件驱动开发的事儿. 内核说明: 我是U盘 说的是2.6.10的内核 我是Sysfs 说的是2.6.10的内 ...

  5. Linux系统USB驱动目录,Linux那些事儿之我是USB 目录

    目录 第1篇  Linux那些事儿之我是USB Core 1.引子 2 2.它从哪里来 2 3.PK 3 4.漫漫辛酸路 3 5.我型我秀 4 6.我是一棵树 5 7.我是谁 9 8.好戏开始了 11 ...

  6. 《Linux那些事儿之我是USB》我是U盘(4)想到达明天现在就要启程

    既然知道了编写模块的方法,那么编写设备驱动程序自然也就不难了.我相信,每一个会写模块的人都不会觉得写设备驱动有困难. 真的,我没说假话,写驱动不是什么难事,你完全可以很自信地说,你已经可以写 设备驱动 ...

  7. 《Linux那些事儿之我是USB》我是U盘(37)迷雾重重的批量传输(六)

    usb_stor_bulk_transfer_sglist()函数有一定的"蛊惑性",我们前面说过,之所以采用sglist,就是为了提高传输效率.我们更知道,sg的目的就是让一堆不 ...

  8. 《Linux那些事儿之我是USB》我是U盘(8)总线、设备和驱动(上)

    struct bus_type中为设备和驱动准备了两个链表,而代表设备的结构体struct device中又有两个成员,struct bus_type *bus和struct device_drive ...

  9. 《Linux那些事儿之我是USB》我是U盘(34)迷雾重重的批量传输(三)

    在usb_stor_Bulk_transport()中,这个函数中调用的第一个最重要的函数,那就是usb_stor_bulk_transfer_buf().仍然是来自drivers/usb/stroa ...

最新文章

  1. python文件和目录
  2. 目标检测--Training Region-based Object Detectors with Online Hard Example Mining
  3. windows环境下跑hadoop自带的wordcount遇到的问题
  4. IntelliJ IDEA 的安装、配置与使用
  5. Ubuntu中配置Java环境变量时,出现command not found问题解决记录
  6. 解题报告 树形图计数
  7. spss练习数据_读硕博,为你推荐5本最实用的SPSS数据统计书
  8. 使用字节流复制一个文件夹
  9. UIScroll和UIPickView
  10. SpringMVC+Spring Data JPA +Bootstrap 分页实现和模糊查询分页
  11. 淘宝美工设计师细说何为天猫透明背景
  12. 如何屏蔽油管网页上的广告
  13. 三极管和MOS管的区别
  14. python 实现文字识别提取
  15. linux服务器实现AD域认证,Linux下用户启用Windows AD做集中认证
  16. mysql mongo关联查询语句_MySQL与Mongo简单的查询实例代码 筋斗云网络
  17. linux下批量转换32bit wav为16bit
  18. 关于微信小程序CMS后台集成办公管理功能
  19. 奥利给!有了这么豪横的指南,还愁不会逛 GitHub?!
  20. 2783: 魔法药水【二分】

热门文章

  1. 金蝶软件系统管理与维护常见问题
  2. c++ 中的生僻关键字
  3. 计算机专业的创意文案,抖音创意文案大全
  4. 数据标注这份工作,不是你想做就能做
  5. 订单23系统服务器,《死亡搁浅》订单23怎么完成?系统服务器订单任务攻略
  6. Java实现文件批量导入导出实例(兼容xls,xlsx)
  7. 某游戏彩票外企Java面试题
  8. 关于UEdit在编辑时老是弹窗提示UEdit已启用
  9. X64汇编语言寄存器结构及其与X86架构编程区别
  10. 海外 网易云音乐无法正常使用 极简