随着USB技术的不断发展,USB 3.0以其高速传输能力,成为众多设备首选的连接方式
而在Linux内核中,DWC3(DesignWare USB 3.0 Controller)作为一种高性能的USB 3.0设备控制器,扮演着至关重要的角色
本文将深入探讨Linux下DWC3 USB设备控制器的工作原理、初始化过程及其关键数据结构,以期为开发者提供有价值的参考
一、DWC3 USB设备控制器概述 DWC3是由Synopsys设计的一种高性能、低功耗的USB 3.0设备控制器,广泛应用于各种嵌入式系统和PC主板中
它支持USB 2.0和USB 3.0规范,具备OTG(On-The-Go)功能,可以在主机模式和设备模式之间动态切换
这使得DWC3在多种应用场景下都能表现出色,如智能手机、平板电脑、移动存储设备等
在Linux内核中,DWC3设备控制器的驱动由多个模块组成,包括UDC(USB Device Controller)核心层、gadget驱动层和硬件层
这些模块协同工作,实现了对DWC3硬件的高效管理和控制
二、DWC3 USB设备控制器的工作原理 DWC3 USB设备控制器的工作原理主要涉及设备枚举、请求处理和数据交互三个环节
这些环节都依赖于设备控制器中断的及时处理
当有事件发生时,如USB设备连接、数据传输请求等,DWC3设备控制器首先将事件信息通过DMA(Direct Memory Access)写入到事件缓冲区中
然后,它向CPU发出中断信号,通知CPU有事件需要处理
CPU在接收到中断信号后,调用中断处理函数开始处理中断事件
DWC3设备控制器的事件使用`dwc3_event`数据结构来描述
这个数据结构由4个字节组成,按位域区分,可分为设备端点事件、设备事件及其他核心事件三类
其中,`dwc3_event_type`字段用来描述事件的类型,`is_devspec`字段为1时表示事件为设备事件,否则表示设备端点事件
`dwc3_event_depevt`结构体描述了设备端点事件,包含了产生事件的端点编号、具体的事件类型、事件状态等信息
而`dwc3_event_devt`结构体则描述了设备控制器事件,包含了具体的设备事件、事件类型、事件信息等
DWC3事件保存在`dwc3_event_buffer`数据结构中
这个结构体包含了事件缓冲区地址、缓冲区长度、已处理事件的偏移、缓冲区中的事件数量等信息
事件数据由DMA传输到缓冲区中,CPU在中断处理函数中遍历缓冲区,循环处理所有事件
DWC3 USB设备控制器的事件处理分为两步进行
第一步在中断上半部分处理,只记录事件数量并设置事件pending标志,然后屏蔽控制器的中断,返回IRQ_WAKE_THREAD以唤醒中断处理线程
第二步在中断下半部分(线程)处理,持有自旋锁并关闭中断,遍历事件缓冲区,循环处理所有事件
每个事件根据其类型,调用相应的处理函数进行处理
三、DWC3 USB设备控制器的初始化过程 DWC3 USB设备控制器的初始化过程是其正常工作的前提
在Linux内核中,DWC3的初始化过程涉及多个步骤,包括设置控制器模式、分配资源、初始化硬件端点等
首先,在设备树中设置`dr_mode`属性为`otg`,这样DWC3控制器在初始化时会被设置为OTG模式
同时,调用`dwc3_host_init`和`dwc3_gadget_init`函数分别初始化主机模式和设备模式所需的资源
这使得DWC3控制器后续可以动态切换为主机模式和设备模式
在初始化设备模式时,DWC3控制器需要完成以下工作: 1.获取中断号和分配端点0传输所需的内存:端点0在设备枚举时使用,需要响应主机端的请求,因此需要提前分配好内存
2.设置DWC3设备控制器的操作函数集合:将操作函数集合设置为`dwc3_gadget_ops`,这些函数只涉及硬件