USB DFU特定类请求简介

下面的Table 1和Table 2简单列举了DFU特定类请求和他们的参数

Table 1. DFU类请求

Request Request code Request description
DFU_DETACH 0X00 请求设备离开DFU模式,进入应用程序
DFU_DNLOAD 0x01 请求Host主机端数据发送到设备端,将数据加载到设备内部Flash.这个过程包含擦除Flash命令的过程
DFU_UPLOAD 0x02 请求设备端的数据传输到主机端,将设备内部Flash相应的数据加载到Host主机端的文件中
DFU_GETSTATUS 0x03 请求设备发送状态报告到主机端(包括上一个请求执行的状态和这个状态之后设备即将进入的状态)
DFU_CLRSTATUS 0x04 请求设备清除错误状态并移动到下一步
DFU_GETSTATE 0x05 在这个请求之后,请求设备仅仅发送当前即将进入的状态
DFU_ABORT 0x06 请求设备离开当前状态/操作,并立即进入空闲状态

==注==:Detach请求在bootloader启动时是无意义的,bootloader从系统复位开始,依赖启动模式的配置,即其他应用程序不能在此期间运行

Table 2. DFU特定类请求的参数总结

bmRequest bRequest wValue wIndex wLength Data
00100001b DFU_DETACH wTimeout Interface Zero None
00100001b DFU_DNLOAD wBloackNum Interface Length Firmware
10100001b DFU_UPLOAD Zero Interface Length Firmware
00100001b DFU_GETSTATUS Zero Interface 6 Status
00100001b DFU_CLRSTATUS Zero Interface Zero None
00100001b DFU_GETSTATE Zero Interface 1 State
00100001b DFU_ABORT Zero Interface Zero None

==注==:State和Status在程序代码中的区别

State 表达的是形态,而 Status 表达的是从一种形态转换成另一种形态的过程中,那些有显著特征的离散中间值。
举一个旅馆房间的例子,一个房间可以是婚房、普通房、豪华总统房,这些都是用 State 来表达。把一个普通房改造成豪华总统房,这个过程就有设计、材料准备、工人就位、施工、验收等步骤,这个时候就用 Status 来表达。那么,区分点在哪?区分点就在于一个房间当用 State 描述时,它是个彼此独立的枚举值,可以没有前后顺序的在婚房、普通房、豪华总统房之间来回转换。而当使用 Status 时,是存在前后状态依赖关系的一个变化量,不能没有做设计就施工,也不能没施工就验收。
所以,State 和 Status 的核心区别,就是它们的枚举值之间是否有依赖关系,没有依赖关系的用 State,有依赖关系的用 Status

  1. DFU_DNLOAD请求命令简介:

下载请求通常会执行不同的命令,所执行的命令是通过USB请求结构体中的wValue参数来选择具体命令去执行的,其中支持下面的操作:

  • 写内存 (wValue > 1)
  • 设置地址指针(wValue = 0, 第一个字节 = 0x21)
  • 擦除(wValue = 0, 第一个字节 = 0x41)
  • 读(wValue = 0, 第一个字节 = 0x92)
  • 离开DFU(离开DFU模式并跳转执行相应应用程序)
  1. 离开DFU状态简介

通过DFU download请求之后,应用程序会被加载到内部Flash或直接加载到RAM中,最后就会离开DFU模式跳转到相应的加载地址(bootloader决定,即运行地址可以在用户的image中,download第一步先下载IVT头解析出将来要加载运行的地址)。
当Host发送最后一个0字节(无数据阶段)的DFU_DNLOAD请求后,意味着通知device即将要离开DFU模式,当前设备处于DFU DNLOAD IDLE/DFU IDLE空闲状态时,设备即确认这个请求。

==注==:在完成所有的下载操作后,device会进入manifestation状态,告诉host已经完成了一个完整的传输.
1)在完全能跳入应用程序后并执行,首先要确保在加载地址处正确设置中断向量表的位置。
2)通过USB IP将应用程序加载到相应地方后,在从bootloader跳转时,必须要禁掉相应的USB中断,否则会干扰到用户代码。

下图时完整的DFU运行过程的流程图:

以下是定义的DFU结构体参数和DFU状态函数表:

// H → D send request to device
/* Define DFU event struct */
typedef struct _usb_device_dfu_event_struct
{
    usb_device_dfu_state_event_t name;
    uint16_t wValue;
    uint16_t wLength;
} usb_device_dfu_event_struct_t;

// D → H return status to host
/*! @brief DFU status definition. */
typedef struct _usb_dfu_status_struct
{
    uint8_t bStatus;           /* status result */
    uint8_t bwPollTimeout[3U]; /* The minimum time host should wait before sending
                                  a subsequent DFU GETSTATUS request */
    uint8_t bState;            /* dfu state */
    uint8_t iString;           /* Index of status description in string table */
    uint8_t reserved[2];
} usb_dfu_status_struct_t;

/* DFU state function table. */
const static dfu_state_func s_dfuStateFunc[11] = {
    USB_DeviceStateAppIdle,         USB_DeviceStateAppDetach,   USB_DeviceStateDfuIdle,
    USB_DeviceStateDfuDnLoadSync,   USB_DeviceStateDfuDnBusy,   USB_DeviceStateDfuDnLoadIdle,
    USB_DeviceStateDfuManifestSync, USB_DeviceStateDfuManifest, USB_DeviceStateDfuManifestWaitReset,
    USB_DeviceStateDfuUpLoadIdle,   USB_DeviceStateDfuError
};

原文地址:https://www.cnblogs.com/muziyu/p/11629937.html

时间: 2024-07-31 07:47:13

USB DFU特定类请求简介的相关文章

LPC18xx LPC43xx LPC4370 Bootrom USB DFU FPB - Flash Patch and Breakpoint Unit

What is the difference between a Bootrom vs bootloader on ARM systems Bootrom Bootrom (or Boot ROM) is a small piece of mask ROM or write-protected flash embedded inside the processor chip. It contains the very first code which is executed by the pro

分析特定类的python脚本

今天接触了下pyUSB,事先没看对象内部成员资料,直接用python的dir函数看了看pyUSB的内部构成.突然间想到自己可不可以写个简单的脚本,利用dir或其他函数遍历某个对象内部的所有成员,并打印出来成树状图的形式?于是写了如下对象分析程序: 使用方法 : import matplotlib.pyplot as plt import AnalysisClass m = AnalysisClass.AnalysisClass() m.analysisObject(plt.Arrow, 'plt

InputStreamReader 和 OutputStreamWriter类用法简介及演示

最近正好在学java,对文件流比较感兴趣,因为C的文件操作算是比较简单的,没想到java弄得很复杂啊! 现在说说下面这两个类! InputStreamReader 和 OutputStreamWriter类用法简介. 一.InputStreamReader类 InputStreamReader 将字节流转换为字符流.是字节流通向字符流的桥梁.如果不指定字符集编码,该解码过程将使用平台默认的字符编码,如:GBK. 构造方法: InputStreamReader isr = new InputStr

java中检测-在运行时指定对象是否是特定类的一个实例---关键字 instanceof

java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. if(request instanceof HttpServletRequest){ System.out.println("-------------"); } 原文地址:https://www.cnblogs.com/czlovezmt/p/9728353.html

UIKit框架各个类的简介

1.UIAcceleration: 被叫做加速事件的一个UIAcceleration类的实例是用来代表即时的三维加速数据.为了接收重力加速度,要注册一个应用应用程序作为一个共享UIAccelerater对象的委托对象(参考UIAcceleromete类). 2. UIAccelerater: UIAccelerater类可以让你的寄存器接收到从板载硬件上得到的加速相关数据.当设备移动时,它的硬件能够报告沿主线在三维空间中的线性加速度变化.你可以利用这些数据来检测器件的电流方向和该方向的瞬时变化.

Uml学习-类图简介

类图(Class Diagram)简介  类图是面向对象分析(OOA,Object-Oriented Analysis)和面向对象设计(OOP,Object-Oriented Deisgn)思想的重要工具,是业务结构建模的重要工具. 需求中提到的各种业务概念,人物等,经过抽象后都可以视之为类.将某类东西归纳在一起,可以称为一个类,类有很多种提炼角度,需要根据系统的目标,业务的场景等,选取合适的角度对事物进行归纳. 类的识别: 1.  类的识别 将需求分析中遇到的人.物.概念识别为类,这是比较容易

[BLE--HID]USB HID设备类定义

简述 HID设备,即人机交互设备,常见的有鼠标,键盘,游戏手柄,等等.一般有线方式都是通过USB连线连接到机器设备,作为用户输入设备.在蓝牙技术中,HID设备的接入就是无线的了.不过HID的相关定义当然还是一样的,不然设备驱动,兼容等问题都会有很多麻烦了.蓝牙中有HID, HOGP profile,但是只是在蓝牙数据通信上做的规范,HID具体含义相关,还是需要看USB相关的HID文档. USB设备类? USB设备可以在启动时,或者是在之后的连接状态下,都能够被主机进行配置.USB设备种类是非常多

php类PclZip简介与使用

PclZip介绍 PclZip library能够压缩与解压缩Zip格式的压缩档(WinZip.PKZIP):且能对此类类档案进行处理,包括产生压缩档.列出压缩档的内容以及解压缩档案等等.由于能够在伺服器端进行压缩与解压缩的动作,所以相当方便使用. PclZip定义一个PclZip类别,其类别物件可视为一个ZIP档案,亦提供method来进行处理. 如何使用PclZip 1.基础 所有的功能都由pclzip.lib.php这个档案提供,PclZip library可于其首页(www.phpcon

log4j:特定类的日志输出到指定的日志文件中

问题描述:我有一个类foo.bar.Baz,我想让Baz这个类的日志输出到指定的日志文件中,其它的就使用默认的配置. log4j.rootLogger=ERROR, logfile log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender log4j.appender.logfile.datePattern='-'dd'.log' log4j.appender.logfile.File=log/radius-prod.log