概述
基于stm32的USB HOST MTP协议开发
- 项目介绍
- USB 简介
- 枚举过程
- 描述符(Descriptor)
- 配置描述符
- 端点描述符
- 字符串描述符
- MTP协议
- MTP协议实现文件的上传与下载功能
- 设定内容居中、居左、居右
- SmartyPants
- 创建一个自定义列表
- 如何创建一个注脚
- 注释也是必不可少的
- KaTeX数学公式
- 新的甘特图功能,丰富你的文章
- UML 图表
- FLowchart流程图
- 导出与导入
- 导出
- 导入
项目介绍
刚好手头上完成了一个项目,是基于stm32的USB HOST MTP协议开发的项目。现在已经完成移植,做成产品。出于对产品保密考虑,这里只说协议的实现。MTP协议 有专门的USB_MTP协议规范说明:mtp_specification__v1.0 。本次项目是基于ST官方库来做USB主机协议实现的。
USB 简介
USB分为主机host和从机device,单个USB总线上,只能有一个Host,USB中的Host端,负责所有底层的数据传输的控制,本项目把手机做device,单片机做host。当一个USB设备插入主机后,会有以下活动:
-
当设备插入主机,主机会检测设备的插入,如图:
上图为USB全速设备和高速设备插入检测,当全速设备插入时,D+会被拉高,此时主机检测到有设备插入。 -
供电;
-
主机复位;
-
主机向设备获取Device Descriptor前8个字节信息;
-
分配地址;
-
获取Device Descriptor;
-
获取Configuration Descriptor;
-
获取String Descriptor ( 可选 );
-
配置。
枚举过程
这个很重要,枚举就是主机获得设备的基本信息,知道设备是什么样的设备,如何进行通信,这样主机就可以根据这些信息来加载合适的驱动程序。调试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实体。例如:
TYPE | ASCII | HTML |
---|---|---|
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)!quadforall ninmathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分
Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t . Gamma(z) = int_0^infty t^{z-1}e^{-t}dt,. Γ(z)=∫0∞tz−1e−tdt.
你可以找到更多关于的信息 LaTeX 数学表达式here.
新的甘特图功能,丰富你的文章
- 关于 甘特图 语法,参考 这儿,
UML 图表
可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:
这将产生一个流程图。:
- 关于 Mermaid 语法,参考 这儿,
FLowchart流程图
我们依旧会支持flowchart的流程图:
- 关于 Flowchart流程图 语法,参考 这儿.
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。
注脚的解释 ↩︎
最后
以上就是温柔猎豹为你收集整理的2021-07-22项目介绍的全部内容,希望文章能够帮你解决2021-07-22项目介绍所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复