2021-07-22

1 篇文章 0 订阅

项目介绍

刚好手头上完成了一个项目,是基于stm32的USB HOST MTP协议开发的项目。现在已经完成移植,做成产品。出于对产品保密考虑,这里只说协议的实现。MTP协议 有专门的USB_MTP协议规范说明:mtp_specification__v1.0 。本次项目是基于ST官方库来做USB主机协议实现的。

USB 简介

USB分为主机host和从机device,单个USB总线上,只能有一个Host,USB中的Host端,负责所有底层的数据传输的控制,本项目把手机做device,单片机做host。当一个USB设备插入主机后,会有以下活动:

  1. 当设备插入主机,主机会检测设备的插入,如图:
    USB全速设备和高速设备插入检测
    上图为USB全速设备和高速设备插入检测,当全速设备插入时,D+会被拉高,此时主机检测到有设备插入。

  2. 供电;

  3. 主机复位;

  4. 主机向设备获取Device Descriptor前8个字节信息;

  5. 分配地址;

  6. 获取Device Descriptor;

  7. 获取Configuration Descriptor;

  8. 获取String Descriptor ( 可选 );

  9. 配置。

枚举过程

这个很重要,枚举就是主机获得设备的基本信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序。调试USB设备,很重要的一点就是USB的枚举过程,只要枚举成功了,那么就已经成功大半了。

描述符(Descriptor)

一设备描述符有多个配置描述符,一个配置描述符有多个接口描述符,配置描述符和接口描述符放在一起实现的。一个接口描述符有多个端点描述符。
描述符

USB 设备描述符⽰例

下面是 USB 远程 NDIS 以太网设备的示例描述符集。 它包括 CDC 通信类接口和 CDC 数据类接口。 设备描述符 是独立返回的。 配置描述符和所有以下描述符将作为单个块以显示的顺序返回

0 bLength 1 0x12 此描述符的大小 (以字节为单位)
1 bDescriptorType 1 0x01 设备描述符
2 bcdUSB 2 0x0110 1.1-当前版本的 USB 规范
4 bDeviceClass 1 0x02 通信设备类
5 bDeviceSubClass 1 0x00 未使用
6 bDeviceProtocol 1 0x00 未使用
7 bMaxPacketSize0 1 0x08 控制管道上的最 大数据包大小
8 idVendor 2 0xXXXX 供应商 ID
10 idProduct 2 0xXXXX 产品 ID
12 bcdDevice 2 0xXXXX 设备发行代码
14 iManufacturer 1 0x01 制造商字符串的 索引
15 iProduct 1 0x02 产品字符串索引
16 iSerialNumber 1 0x03 设备序列号字符 串的索引
17 bNumConfigurati ons 1 0x01 一个配置

配置描述符

配置描述符:配置描述符定义了设备的配置信息,一个设备可以有多个 配置描述符.

typedef struct _USB_CONFIGURATION_DESCRIPTOR_
{
    BYTE      bLength,
    BYTE      bDescriptorType,
    WORD    wTotalLength,
    BYTE      bNumInterfaces,
    BYTE      bConfigurationValue,
    BYTE      iConfiguration,
    BYTE      bmAttributes,
    BYTE      MaxPower
}USB_CONFIGURATION_DESCRIPTOR;

bLength : 描述符大小.固定为0x09.
bDescriptorType : 配置描述符类型.固定为0x02.
wTotalLength : 返回整个数据的长度.指此配置返回的配置描述符,接口描述符以及端点描述符的全部大小.
bNumInterfaces : 配置所支持的接口数.指该配置配备的接口数量,也表示该配置下接口描述符数量.
bConfigurationValue : 作为Set Configuration的一个参数选择配置值.
iConfiguration : 用于描述该配置字符串描述符的索引.
bmAttributes : 供电模式选择.Bit4-0保留,D7:总线供电,D6:自供电,D5:远程唤醒.
MaxPower : 总线供电的USB设备的最大消耗电流.以2mA为单位.

端点描述符

端点描述符 USB设备中的每个端点都有自己的端点描述符,由接口描述符中的bNumEndpoint决定其数量

typedef struct _USB_ENDPOINT_DESCRIPTOR_
{
    BYTE        bLength,
    BYTE        bDescriptorType,
    BYTE        bEndpointAddress,
    BYTE        bmAttributes,
    WORD      wMaxPacketSize,
    BYTE        bInterval
}USB_ENDPOINT_DESCRIPTOR;

bLength : 描述符大小.固定为0x07.
bDescriptorType : 接口描述符类型.固定为0x05.
bEndpointType : USB设备的端点地址.Bit7,方向,对于控制端点可以忽略,1/0:IN/OUT.Bit6-4,保留.BIt3-0:端点号.
bmAttributes : 端点属性.Bit7-2,保留.BIt1-0:00控制,01同步,02批量,03中断.
wMaxPacketSize : 本端点接收或发送的最大信息包大小.
bInterval : 轮训数据传送端点的时间间隔.对于批量传送和控制传送的端点忽略.对于同步传送的端点,必须为1,对于中断传送的端点,范围为1-255.
字符串描述符:其中字符串描述符是可选的.如果不支持字符串描述符,其设备,配置,接口描述符内的所有字符串描述符索引都必须为0

字符串描述符

字符串描述符 其中字符串描述符是可选的.如果不支持字符串描述符,其设备,配置,接口描述符内的所有字符串描述符索引都必须为0

typedef struct _USB_STRING_DESCRIPTION_
{
    BYTE      bLength,
    BYTE      bDescriptionType,
    BYTE      bString[1];
}USB_STRING_DESCRIPTION;

bLength : 描述符大小.由整个字符串的长度加上bLength和bDescriptorType的长度决定.
bDescriptorType : 接口描述符类型.固定为0x03.
bString1 : Unicode编码字符串.

MTP协议

MTP的全称是Media Transfer Protocol(媒体传输协议),它是微软公司提出的一套媒体文件传输协议。Android从3.0开始支持MTP。TP的使用者包括两个部分,分别是Initiator和Responder。

Initiator:主要是指USB Host,例如PC机,笔记本等。协议规定所有MTP操作只能由Initator发起。
Responder:一般是诸如数码相机、智能手机等存储媒体文件的设备。Responder在MTP中的作用就是处理Initator发起的请求。同时,它还会根据自身状态的变化发送Event以通知Initiator
在这里插入图片描述
这里我们主要实现主机的MTP协议,它是基于PTP协议的。我们直接使用ST提供的USB HOST 库, 首先要注册MTP类,PTP类和MTP类的注册码不同。
PTP和MTP注册码

/*Communication Class codes*/
#define USB_MTP_CLASS                                           0xFFU//0x06U /* Still File Class)*/
#define USB_PTP_CLASS                                           0x06U /* Still Image Class)*/

修改usb_host.c文件注册MTP类

  if (USBH_RegisterClass(&hUsbHostFS, USBH_MTP_CLASS) != USBH_OK)
  {
    Error_Handler();
  }

添加圈内库文件,在ST官网中有提供
在这里插入图片描述

MTP协议实现文件的上传与下载功能

要用到几个函数:

函数名作用
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。1

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.3.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. 注脚的解释 ↩︎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值