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

本文详细介绍了Linux内核中drivers/usb目录的结构,包括核心功能、主机控制器和设备驱动等内容。USBCore是USB子系统的核心,负责设备和驱动的初始化,以及主机控制器的抽象。设备和驱动通过kobject和kset进行管理,并通过注册到总线的链表中。设备与驱动的关联是通过匹配函数完成的,接口设备和功能驱动的关联也是关键部分。此外,还涉及到了USB设备在Linux系统中的表示,如设备文件、主设备号和次设备号的分配。最后,usbfs提供了用户空间访问USB设备的接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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基本可以忽略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr成文

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值