OTG Host 协议栈简介

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()
_USB_HostKhciProcessTrCallback()
结束一个 transfer
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值