OTG Host 协议栈简介
本文主要方便用户理解 OTG 协议栈的关键性程序结构及文件结构。加快用户前期开发。
例程介绍
usb_host_hid_mouse
本例程模拟主机枚举鼠标,并将鼠标移动信息通过串口打印。
usb_host_hid_mouse_keyboard
本例程模拟主机枚举鼠标及键盘,并将鼠标及键盘输入通过串口打印。
usb_host_msd_command
本例程模拟主机枚举U盘,并且测试读写信息是否可行,并通过串口打印测试结果。
文件结构介绍
├─boards
│ └─MT037board
│ └─usb_examples
│ ├─usb_host_hid_mouse
│ ├─usb_host_hid_mouse_keyboard
│ └─usb_host_msd_command
├─CMSIS
│ ├─Driver
│ │ ├─DriverTemplates
│ │ └─Include
│ └─Include
├─devices
│ └─MM32F103xCxE_o
│ ├─cmsis_drivers
│ ├─drivers
│ ├─HAL_lib
│ │ ├─inc
│ │ └─src
│ ├─iar
│ ├─project_template
│ ├─template
│ └─utilities
│ ├─io
│ │ └─swo
│ ├─log
│ └─str
└─middleware
├─mmcau
│ ├─asm-cm0p
│ └─asm-cm4-cm7
└─usb
├─device
├─host
│ └─class
├─include
└─osa
变量简介
本章列出几个关键性变量的作用,方便用户理解。
g_UsbHostInstance:OTG Host 实例。
s_UsbBmEventStruct:中断事件存储变量,用于异步。
g_UsbHostInstance->transferList[0]:存储当前 transfer 信息。
bdt:buffer descriptor table.
g_currentInstance:当前 transfer 实例。
g_usbHostPointer:当前Host 指针。
函数简介
本章介绍Host协议栈主要函数,方便用户理解。
main 函数流程图
HOST 初始化成功
start
OTG power on
USB_HostApplicationInit
USB_HostTaskFn
USB_Host(Function)Task
OTG 中断函数流程图
协议栈采用异步处理的方法,在中断中,将相关中断存储至 khciEventPointer->value。
SOFTOK
ATTACH_MASK
TOKDNE_MASK
USBRST_MASK
中断标记位都处理
中断标记位都处理
中断标记位都处理
中断标记位都处理
USB_OTG_FS_IRQHandler
OTG->ISTAT 寄存器
相关中断位
khciEventPointer->value =
EVENT_SOF_TOK
OTG->INTEN ATTACHEN &= ~ATTACHEN_MASK
khciEventPointer->value =
EVENT_ATTACH
khciEventPointer->value =
EVENT_TOK_DONE
khciEventPointer->value =
EVENT_RESET
Break 退出中断
USB_HostTaskFn() 函数流程图
USB_HostTaskFn 在 main 函数 while(1) 中异步处理中断,下图的 EVENT_(function) 和 _USB_HostKhci(function) 中,function 指代 ATTACH, RESET, DETACH, SOF_TOK, TOK_DONE。
EVENT_(function)
true
false
USB_HostKhciTaskFunction
eventBit =
khciEventPointer->value
_USB_HostKhci(function)
deviceAttached ?
_USB_HostKhciTransferStateMachine
_USB_HostKhciTransferClearUp
_USB_HostKhciAttach() 函数流程图
OTG 寄存器初始化
USB 拉低 resert
OTG 中断寄存器置位
USB_HostAttachDevice()
USB_HostAttachDevice() 函数流程图
malloc newInstance 并初始化
pipeInit 初始化
USB_HostProcessState() 初始化第一个transfer 状态
USB_HostProcessState() 函数流程图
USB_HostProcessState() 用于配置整个transfer 的相关信息,包括起始 setup 包等,对于整个枚举非常重要。
switch(deviceInstance->state) 用于散转 transfer setup 包
设置 transfer->setupPacket
_USB_HostKhciTransferStateMachine()函数流程图
_USB_HostKhciTransferStateMachine函数用于发送及配置接收包,通过散转usbHostPointer->trState,决定整个 tranasfer 的状态。
kKhci_TrGetMsg:transfer开始,用于发送setup包。
kKhci_TrStartTransmit:TOK_DONE 中断置位后,处理接下来的包。
kKhci_TrTransmitDone:transfer 结束,准备下一个 transfer。
kKhci_TrGetMsg
kKhci_TrStartTransmit
kKhci_TrTransmitDone
usbHostPointer->trState
_USB_HostKhciGetRightTrRequest: get the right transfer
_USB_HostKhciStartTranfer
_USB_HostKhciStartTranfer
_USB_HostKhciProcessTrCallback
trState = kKhci_TrGetMsg
_USB_HostKhciStartTranfer() 函数流程图
在枚举阶段,transfer->setupStatus决定控制传输的建立过程,数据过程及状态过程。
_USB_HostKhciAtomNonblockingTransaction()用于寄存器使能发包。
transfer->setupStatus
_USB_HostKhciAtomNonblockingTransaction()
_USB_HostKhciAtomNonblockingTransaction() 函数流程图
OTG->ADDR 设置地址
OTG->ENDPOINT 设置发送的ENDPOINT
switch type 决定 TOKEN_PID
设置 bdPointer,BD的地址
设置 BD 内容
OTG->TOKEN 设置 address 及 TOKEN_PID,数据在USB 线上发送
_USB_HostKhciFinishTranfer() 函数流程图
数据包发送及接收完成,token_done 中断置位后在此函数处理数据。准备下一次数据包。
_USB_HostKhciTransactionDone()处理接收的到的数据
更新 usbHostPointer->trState
更新 transfer
USB 一个 transfer 周期所调用的主要函数
开始一个transfer
USB_HostProcessState()
_USB_HostKhciTransferStateMachine()
_USB_HostKhciStartTranfer()
_USB_HostKhciAtomNonblockingTransaction()
_USB_HostKhciFinishTranfer()