USB -- STM32F103 USB VIDEO(视频)Camera同步传输讲解(九)

目录

链接快速定位

前沿

[1 描述符修改](#1 描述符修改)

[1.1 设备描述符修改](#1.1 设备描述符修改)

[1.2 配置描述符修改](#1.2 配置描述符修改)

[1.3 字符串描述符修改](#1.3 字符串描述符修改)

[1.4 编译报错修改](#1.4 编译报错修改)

[2 增加功能函数](#2 增加功能函数)

[2.1 Camera功能模块介绍](#2.1 Camera功能模块介绍)

[2.2 USB复位函数修改](#2.2 USB复位函数修改)

[2.3 Speaker_Data_Setup函数修改](#2.3 Speaker_Data_Setup函数修改)

[2.4 非零端点函数修改](#2.4 非零端点函数修改)

[2.5 JEPG数据获取](#2.5 JEPG数据获取)

[3 运行演示](#3 运行演示)


链接快速定位

USB -- 初识USB协议(一)

源码下载请参考链接:USB -- STM32-FS-USB-Device驱动代码简述(二)

USB -- STM32F103虚拟串口bulk传输讲解(三)

USB -- STM32F103自定义HID设备及HID上位机中断传输讲解(四)

USB -- STM32F103 U盘(MassStorage)SDIO接口SCSI协议Bulk传输讲解(五)

USB -- STM32F103 USB DFU设备固件升级(IAP)控制传输讲解(六)

USB -- STM32F103 USB AUDIO(音频)Speak同步传输(Out传输)讲解(七)

USB -- STM32F103 USB AUDIO(音频)Microphone同步传输(In传输)讲解(八)

Video参考手册

前沿

前面两节主要是对USB的基本概念做了简单讲解,学习USB的最本质目的还是要回到USB的应用方向,接下来的几章主要讲解USB的各类应用,包括:

这里只讲怎么修改描述符和关键函数,具体含义请参考Video参考手册,我们这里使用《Audio_Speaker》例程进行修改。

1 描述符修改

usb_desc.h文件的描述符宏定义如下:

cpp 复制代码
/*预定义MJPEG视频帧率*/
#define IMG_MJPG_FRAMERATE      13
#define PACKET_SIZE             64

/*图像Size(Captured)*/
#define IMG_WIDTH                       320
#define IMG_HEIGHT                      240

#define MAKE_WORD(x)                (uint8_t)((x)&0xFF),(uint8_t)(((x)>>8)&0xFF)
#define MAKE_DWORD(x)               (uint8_t)((x)&0xFF),(uint8_t)(((x)>>8)&0xFF),(uint8_t)(((x)>>16)&0xFF),(uint8_t)(((x)>>24)&0xFF)

#define MIN_BIT_RATE            (100*320*IMG_MJPG_FRAMERATE)
#define MAX_BIT_RATE            (IMG_WIDTH*IMG_HEIGHT*IMG_MJPG_FRAMERATE)
#define MAX_FRAME_SIZE          (IMG_WIDTH*IMG_HEIGHT)          //最大每帧JPEG Byte数,对应Host要求的Buffer Size
#define FRAME_INTERVEL          (10000000ul/IMG_MJPG_FRAMERATE)     //帧间间隔时间,单位100ns

#define USB_ASSOCIATION_DESCRIPTOR_TYPE              0x0B
#define CAMERA_SIZ_DEVICE_DESC                       18
#define CAMERA_SIZ_CONFIG_DESC                       144
#define CAMERA_SIZ_STRING_LANGID                     0x04
#define CAMERA_SIZ_STRING_VENDOR                     0x26
#define CAMERA_SIZ_STRING_PRODUCT                    0x1C
#define CAMERA_SIZ_STRING_SERIAL                     0x1C

/* USB Descriptor Types */
#define USB_DEVICE_DESCRIPTOR_TYPE                    0x01
#define USB_CONFIGURATION_DESCRIPTOR_TYPE             0x02
#define USB_STRING_DESCRIPTOR_TYPE                    0x03
#define USB_INTERFACE_DESCRIPTOR_TYPE                 0x04
#define USB_ENDPOINT_DESCRIPTOR_TYPE                  0x05

1.1 设备描述符修改

cpp 复制代码
const uint8_t Speaker_DeviceDescriptor[] =
{
    CAMERA_SIZ_DEVICE_DESC,          /* bLength */
    USB_DEVICE_DESCRIPTOR_TYPE,           /* bDescriptorType */
    0x00,          /* 2.00 */             /* bcdUSB */
    0x02,
    0xEF,                                 /* bDeviceClass */
    0x02,                                 /* bDeviceSubClass */
    0x01,                                 /* bDeviceProtocol */
    0x40,                                 /* bMaxPacketSize 40 */
    0x83,                                 /* idVendor */
    0x04,
    0x30,                                 /* idProduct  = 0x5730*/
    0x57,
    0x00,          /* 2.00 */             /* bcdDevice */
    0x02,
    1,                                    /* iManufacturer */
    2,                                    /* iProduct */
    3,                                    /* iSerialNumber */
    0x01                                  /* bNumConfigurations */
};

1.2 配置描述符修改

这里包括:

  • 接口描述符
  • 功能描述符
  • 端点描述符
cpp 复制代码
/* USB Configuration Descriptor */
/*   All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
const uint8_t Speaker_ConfigDescriptor[] =
{
    /* Configuration 1 */
    0x09,                                 /* bLength */
    USB_CONFIGURATION_DESCRIPTOR_TYPE,    /* bDescriptorType */
    0x90,                                 /* wTotalLength  110 bytes*/
    0x00,
    0x02,                                 /* bNumInterfaces */
    0x01,                                 /* bConfigurationValue */
    0x00,                                 /* iConfiguration */
    0xC0,                                 /* bmAttributes Self Powered*/
    0xFA,                                 /* bMaxPower = 500 mA*/
    /* 09 byte*/

    /* 1. Standard Video Interface Collection IAD */
    0x08,                                 /* bLength */
    USB_ASSOCIATION_DESCRIPTOR_TYPE,      /* bDescriptorType */
    0x00,                                 /* bFirstInterface: Interface number of the VideoControl interface that is associated with this function*/
    0x02,                                 /* Number of contiguous Video interfaces that are associated with this function */
    0x0E,                                 /* bFunction Class: CC_VIDEO*/
    0x03,                                 /* bFunction sub Class: SC_VIDEO_INTERFACE_COLLECTION */
    0x00,                                 /* bFunction protocol : PC_PROTOCOL_UNDEFINED*/
    0x02,                                 /* iFunction */
    /* 08 bytes, total size 17*/

    /* 2. Standard VideoControl Interface Descriptor */
    0x09,                                 /* bLength */
    0x04,                                 /* bDescriptorType */
    0x00,                                 /* bInterfaceNumber */
    0x00,                                 /* bAlternateSetting */
    0x00,                                 /* bNumEndpoints */
    0x0e,                                 /* bInterfaceClass : CC_VIDEO */
    0x01,                                 /* bInterfaceSubClass : SC_VIDEOCONTROL */
    0x00,                                 /* bInterfaceProtocol : PC_PROTOCOL_UNDEFINED */
    0x02,                                 /* iInterface */
    /* 09 bytes, total size 26*/

    /* 2.1. Class-specific VideoControl Interface Descriptor */
    0x0d,                                 /* bLength */
    0x24,                                 /* bDescriptorType : CS_INTERFACE */
    0x01,                                 /* bDescriptorSubType : VC_HEADER subtype */
    0x00,                                 /* bcdUVC : Revision of class specification that this device is based upon. For this example, the device complies with Video Class specification version 1.0 */
    0x01,
    0x1e,                                 /* wTotalLength : Total size of class-specific descriptors*/
    0x00,
    0x00, 0x60, 0xe3, 0x16,               /* dwClockFrequency : 0x16e36000 -> 24,000,000 == 24MHz*/
    0x01,                                 /* bInCollection : Number of streaming interfaces. */
    0x01,                                 /* baInterfaceNr(1) : VideoStreaming interface 1 belongs to this VideoControl interface.*/
    /* 13 Bytes, totoal size 39 */

    /* 2.2. Video Input Terminal Descriptor (Composite) */
    0x08,                                 /* bLength */
    0x24,                                 /* bDescriptorType : CS_INTERFACE */
    0x02,                                 /* bDescriptorSubType : VC_INPUT_TERMINAL subtype */
    0x02,                                 /* bTerminalID: ID of this input terminal */
    0x01, 0x04,                           /* wTerminalType: 0x0401 COMPOSITE_CONNECTOR type. This terminal is the composite connector. */
    0x00,                                 /* bAssocTerminal: No association */
    0x00,                                 /* iTerminal: Unused*/
    /* 8 Bytes, totoal size 47 */

    /* 2.3. Video Output Terminal Descriptor */
    0x09,                                 /* bLength */
    0x24,                                 /* bDescriptorType : CS_INTERFACE */
    0x03,                                 /* bDescriptorSubType : VC_OUTPUT_TERMINAL subtype */
    0x03,                                 /* bTerminalID: ID of this output terminal */
    0x01, 0x01,                           /* wTerminalType: 0x0101 TT_STREAMING type. This terminal is a USB streaming terminal. */
    0x00,                                 /* bAssocTerminal: No association */
    0x02,                                 /* bSourceID: The input pin of this unit is connected to the output pin of unit 2. */
    0x00,                                 /* iTerminal: Unused*/
    /* 9 bytes, total size 56 */

    /* 3. Standard VideoStream Interface Descriptor*/
    0x09,                                 /* bLength */
    0x04,                                 /* bDescriptorType : INTERFACE */
    0x01,                                 /* bInterfaceNumber */
    0x00,                                 /* bAlternateSetting */
    0x00,                                 /* bNumEndpoints : 0 endpoints -- no bandwidth used*/
    0x0e,                                 /* bInterfaceClass : CC_VIDEO */
    0x02,                                 /* bInterfaceSubClass : SC_VIDEOSTREAMING */
    0x00,                                 /* bInterfaceProtocol : PC_PROTOCOL_UNDEFINED */
    0x00,                                 /* iInterface : unused */
    /* 9 bytes, total size 65 */

    /* 3.1 Class-specific VideoStream Header Descriptor (Input) */
    0x0e,                                 /* bLength */
    0x24,                                 /* bDescriptorType : CS_INTERFACE */
    0x01,                                 /* bDescriptorSubType : VC_HEADER subtype */
    0x01,                                 /* bNumFormats : One format descriptor follows. */
    0x3f, 0x00,                           /* wTotalLength : Total size of class-specific descriptors*/
    0x81,                                 /* bEndpointAddress : 0x81 */
    0x00,                                 /* bmInfo : No dynamic format change supported. */
    0x03,                                 /* bTerminalLink : This VideoStreaming interface supplies terminal ID 3 (Output Terminal). */
    0x00,                                 /* bStillCaptureMethod : Device supports still image capture method 0. */
    0x00,                                 /* bTriggerSupport : Hardware trigger supported for still image capture */
    0x00,                                 /* bTriggerUsage : Hardware trigger should initiate a still image capture. */
    0x01,                                 /* bControlSize : Size of the bmaControls field */
    0x00,                                 /* bmaControls : No VideoStreaming specific controls are supported.*/
    /* 14 Bytes, totoal size 79 */

    /* 3.2 Class-specific VideoStream Format(MJPEG) Descriptor */
    0x0b,                                 /* bLength */
    0x24,                                 /* bDescriptorType : CS_INTERFACE */
    0x06,                                 /* bDescriptorSubType : VS_FORMAT_MJPEG subtype */
    0x01,                                 /* bFormatIndex : First (and only) format descriptor */
    0x01,                                 /* bNumFrameDescriptors : One frame descriptor for this format follows. */
    0x01,                                 /* bmFlags : Uses fixed size samples.. */
    0x01,                                 /* bDefaultFrameIndex : Default frame index is 1. */
    0x00,                                 /* bAspectRatioX : Non-interlaced stream -- not required. */
    0x00,                                 /* bAspectRatioY : Non-interlaced stream -- not required. */
    0x00,                                 /* bmInterlaceFlags : Non-interlaced stream */
    0x00,                                 /* bCopyProtect : No restrictions imposed on the duplication of this video stream. */
    /* 11 bytes, total size 90 */

    /* 3.3 Class-specific VideoStream Frame Descriptor */
    0x26,                                 /* bLength */
    0x24,                                 /* bDescriptorType : CS_INTERFACE */
    0x07,                                 /* bDescriptorSubType : VS_FRAME_MJPEG */
    0x01,                                 /* bFrameIndex : First (and only) frame descriptor */
    0x02,                                 /* bmCapabilities : Still images using capture method 0 are supported at this frame setting.D1: Fixed frame-rate. */
    MAKE_WORD(IMG_WIDTH),     /* wWidth : Width of frame, pixels. */
    MAKE_WORD(IMG_HEIGHT),    /* wHeight : Height of frame, pixels. */
    MAKE_DWORD(MIN_BIT_RATE),             /* dwMinBitRate : Min bit rate in bits/s  */
    MAKE_DWORD(MAX_BIT_RATE),             /* dwMaxBitRate : Max bit rate in bits/s  */
    MAKE_DWORD(MAX_FRAME_SIZE),           /* dwMaxVideoFrameBufSize : Maximum video or still frame size, in bytes. */
    MAKE_DWORD(FRAME_INTERVEL),           /* dwDefaultFrame Interval time, unit=100ns */
    0x00,                                 /* bFrameIntervalType : Continuous frame interval */
    MAKE_DWORD(FRAME_INTERVEL),           /* dwDefaultFrame Interval time, unit=100ns */
    MAKE_DWORD(FRAME_INTERVEL),           /* dwDefaultFrame Interval time, unit=100ns */
    0x00, 0x00, 0x00, 0x00,               /* dwFrameIntervalStep : No frame interval step supported. */
    /* 38 bytes, total size 128 */

    /* 4. Operational Alternate Setting 1 */
    /* 4.1 Standard VideoStream Interface Descriptor */
    0x09,                               /* Size of this descriptor, in bytes. */
    0x04,                               /* INTERFACE descriptor type */
    0x01,                               /* Index of this interface */
    0x01,                               /* Index of this alternate setting */
    0x01,                               /* endpoints, 0 -- no bandwidth used */
    0x0e,                               /* CC_VIDEO */
    0x02,                               /* SC_VIDEOSTREAMING */
    0x00,                               /* PC_PROTOCOL_UNDEFINED */
    0x00,                               /* Unused */
    /* 9 bytes, total size 137 */

    /* 4.2 Standard VideoStream Isochronous Video Data Endpoint Descriptor */
    0x07,                               /* Size of this descriptor, in bytes. */
    0x05,                               /* ENDPOINT */
    0x81,                               /* IN endpoint 1 */
    0x01,                               /* Isochronous transfer type. Asynchronous synchronization type. */
    MAKE_WORD(PACKET_SIZE),             /* Max packet size, in bytes */
    0x01,                               /* One frame interval */
    /* 7 bytes, total size 144 */
};

1.3 字符串描述符修改

这里只需要修改StringProduct字符串描述符,修改名称为microphone。

cpp 复制代码
const uint8_t Speaker_StringProduct[SPEAKER_SIZ_STRING_PRODUCT] =
  {
    SPEAKER_SIZ_STRING_PRODUCT,  /* bLength */
    USB_STRING_DESCRIPTOR_TYPE,        /* bDescriptorType */
    'S', 0, 'T', 0, 'M', 0, '3', 0, '2', 0, ' ', 0,
    'C', 0, 'a', 0, 'm', 0, 'e', 0, 'r', 0, 'a', 0
  };

1.4 编译报错修改

发现修改了这些位置,会出现报错,我们继续修改,主要修改以下文件:

  • usb_desc.c
  • usb_desc.h
  • usb_prop.c

按照下图修改。

按照上图修改完成,在设备管理器会出现STM32 Camera的设备,证明修改成功,如果修改之后设备管理器没有反应,大概率是D+的上拉电阻没有配对。

2 增加功能函数

2.1 Camera功能模块介绍

由于STM32F103系列没有DCMI外设,如果使用GPIO模拟DCMI时序去读取摄像头数据会显得很卡顿,所以这里仅展示单张图片的显示。

2.2 USB复位函数修改

cpp 复制代码
/*******************************************************************************
* Function Name  : Speaker_Reset.
* Description    : Speaker reset routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
void Speaker_Reset()
{
    /* Set Camera device as not configured state */
    pInformation->Current_Configuration = 0;
 
    /* Current Feature initialization */
    pInformation->Current_Feature = Speaker_ConfigDescriptor[7];
 
    SetBTABLE(BTABLE_ADDRESS);
 
    /* Initialize Endpoint 0 */
    SetEPType(ENDP0, EP_CONTROL);
    SetEPTxStatus(ENDP0, EP_TX_NAK);
    SetEPRxAddr(ENDP0, ENDP0_RXADDR);
    SetEPRxCount(ENDP0, Device_Property.MaxPacketSize);
    SetEPTxAddr(ENDP0, ENDP0_TXADDR);
    Clear_Status_Out(ENDP0);
    SetEPRxValid(ENDP0);
 
    /* Initialize Endpoint 1 */
    SetEPType(ENDP1, EP_ISOCHRONOUS);
    SetEPDblBuffAddr(ENDP1, ENDP1_BUF0Addr, ENDP1_BUF1Addr);
    SetEPDblBuffCount(ENDP1, EP_DBUF_OUT, PACKET_SIZE);
    ClearDTOG_RX(ENDP1);
    ClearDTOG_TX(ENDP1);
    ToggleDTOG_RX(ENDP1);
    SetEPRxStatus(ENDP1, EP_RX_DIS);
    SetEPTxStatus(ENDP1, EP_TX_VALID);
 
    SetEPRxValid(ENDP0);
    /* Set this device to response on default address */
    SetDeviceAddress(0);
 
    bDeviceState = ATTACHED;
}

2.3 Speaker_Data_Setup函数修改

增加此函数主要是打开摄像头软件的时候,会请求一些图像的参数,比如像谁,时钟频率等。

cpp 复制代码
typedef struct  _VideoControl
{
    uint8_t    bmHint[2];                      // 0x02
    uint8_t    bFormatIndex[1];                // 0x03
    uint8_t    bFrameIndex[1];                 // 0x04
    uint8_t    dwFrameInterval[4];             // 0x08
    uint8_t    wKeyFrameRate[2];               // 0x0A
    uint8_t    wPFrameRate[2];                 // 0x0C
    uint8_t    wCompQuality[2];                // 0x0E
    uint8_t    wCompWindowSize[2];             // 0x10
    uint8_t    wDelay[2];                      // 0x12
    uint8_t    dwMaxVideoFrameSize[4];         // 0x16
    uint8_t    dwMaxPayloadTransferSize[4];    // 0x1A
    uint8_t    dwClockFrequency[4];            // 0x1C
    uint8_t    bmFramingInfo[1];
    uint8_t    bPreferedVersion[1];
    uint8_t    bMinVersion[1];
    uint8_t    bMaxVersion[1];
}   VideoControl;

/*VideoStreaming Requests应答,参考USB_Video_Class_1_1.pdf  4.3.1.1*/
VideoControl    videoCommitControl =
{
    {0x01, 0x00},                     // bmHint
    {0x01},                           // bFormatIndex
    {0x01},                           // bFrameIndex
    {MAKE_DWORD(FRAME_INTERVEL)},     // dwFrameInterval
    {0x00, 0x00,},                    // wKeyFrameRate
    {0x00, 0x00,},                    // wPFrameRate
    {0x00, 0x00,},                    // wCompQuality
    {0x00, 0x00,},                    // wCompWindowSize
    {0x00, 0x00},                     // wDelay
    {MAKE_DWORD(MAX_FRAME_SIZE)},     // dwMaxVideoFrameSize
    {0x00, 0x00, 0x00, 0x00},         // dwMaxPayloadTransferSize
    {0x00, 0x60, 0xe3, 0x16},         // dwClockFrequency
    {0x00},                           // bmFramingInfo
    {0x00},                           // bPreferedVersion
    {0x00},                           // bMinVersion
    {0x00},                           // bMaxVersion
};

VideoControl    videoProbeControl =
{
    {0x01, 0x00},                     // bmHint
    {0x01},                           // bFormatIndex
    {0x01},                           // bFrameIndex
    {MAKE_DWORD(FRAME_INTERVEL)},          // dwFrameInterval
    {0x00, 0x00,},                    // wKeyFrameRate
    {0x00, 0x00,},                    // wPFrameRate
    {0x00, 0x00,},                    // wCompQuality
    {0x00, 0x00,},                    // wCompWindowSize
    {0x00, 0x00},                     // wDelay
    {MAKE_DWORD(MAX_FRAME_SIZE)},    // dwMaxVideoFrameSize
    {0x00, 0x00, 0x00, 0x00},         // dwMaxPayloadTransferSize
    {0x00, 0x60, 0xe3, 0x16},         // dwClockFrequency
    {0x00},                           // bmFramingInfo
    {0x00},                           // bPreferedVersion
    {0x00},                           // bMinVersion
    {0x00},                           // bMaxVersion
};

/*******************************************************************************
* Function Name  : VideoCommitControl_Command
* Description    : Handle the Commit Control.
* Input          : Length : uint16_t.
* Output         : None.
* Return         : The address of the string descriptors.
*******************************************************************************/
uint8_t* VideoCommitControl_Command(uint16_t Length)
{
    if (Length == 0)
    {
        pInformation->Ctrl_Info.Usb_wLength = pInformation->USBwLengths.w;
        return NULL;
    }
    else
    {
        return ((uint8_t*)(&videoCommitControl));
    }
}

/*******************************************************************************
* Function Name  : VideoProbeControl_Command
* Description    : Handle the Probe Control.
* Input          : Length : uint16_t.
* Output         : None.
* Return         : The address of the string descriptors.
*******************************************************************************/
uint8_t* VideoProbeControl_Command(uint16_t Length)
{
    if (Length == 0)
    {
        pInformation->Ctrl_Info.Usb_wLength = pInformation->USBwLengths.w;
        return NULL;
    }
    else
    {
        return ((uint8_t*)(&videoProbeControl));
    }
}

/*******************************************************************************
* Function Name  : Speaker_Data_Setup
* Description    : Handle the data class specific requests.
* Input          : None.
* Output         : None.
* Return         : USB_UNSUPPORT or USB_SUCCESS.
*******************************************************************************/
RESULT Speaker_Data_Setup(uint8_t RequestNo)
{
    uint8_t *(*CopyRoutine)(uint16_t);
    CopyRoutine = NULL;

    if ((RequestNo == GET_CUR) || (RequestNo == SET_CUR))
    {
        if (pInformation->USBwIndex == 0x0100)
        {
            if (pInformation->USBwValue == 0x0001)
            {
                // Probe Control
                CopyRoutine = VideoProbeControl_Command;
            }
            else if (pInformation->USBwValue == 0x0002)
            {
                // Commit control
                CopyRoutine = VideoCommitControl_Command;
            }
        }
    }

    else
    {
        return USB_UNSUPPORT;
    }

    pInformation->Ctrl_Info.CopyData = CopyRoutine;
    pInformation->Ctrl_Info.Usb_wOffset = 0;
    (*CopyRoutine)(0);
    return USB_SUCCESS;
}

2.4 非零端点函数修改

因为这个是Microphone,是同步In传输,所以需要屏蔽OUT函数(usb_endp.c文件中),并增加In函数。

jpeg_data数组是单帧JPEG图片数据。

cpp 复制代码
#include "usb_desc.h"
#include <string.h>

#define JPEG_SIZE  10000

const unsigned char jpeg_data[JPEG_SIZE] = {
	//JPEG图片数据
};

/*******************************************************************************
* Function Name  : EP1_IN_Callback
* Description    : Endpoint 1 in callback routine.
* Input          : None.
* Output         : None.
* Return         : None.
*******************************************************************************/
uint8_t packet[PACKET_SIZE]={0x00};

void EP1_IN_Callback(void)
{
  static uint8_t payload_header[2] = {0x02,0x00};
  static uint16_t packet_count = JPEG_SIZE/(PACKET_SIZE-2);
  static uint8_t packet_remainder = JPEG_SIZE%(PACKET_SIZE-2);
  static uint8_t packet_index = 0;
  
  uint16_t packet_size = 0;
	
	if(packet_index == 0)
	{
		payload_header[1]^=0x01;
		memcpy(packet+2, jpeg_data+packet_index*(PACKET_SIZE-2), PACKET_SIZE-2);
		packet_size = PACKET_SIZE;
	}
	else if(packet_index < packet_count)
	{
		memcpy(packet+2, jpeg_data+packet_index*(PACKET_SIZE-2), PACKET_SIZE-2);
		packet_size = PACKET_SIZE;
	}
	else if(packet_index == packet_count)
	{
	  memcpy(packet+2, jpeg_data+packet_index*(PACKET_SIZE-2), packet_remainder);
	  packet_size = packet_remainder+2;
	}
	else
	{
	  packet_size = 2;
	}
	packet[0] = payload_header[0];
	packet[1] = payload_header[1];
	
  if (GetENDPOINT(ENDP1) & EP_DTOG_RX)
  {
		SetEPTxCount(ENDP1, PACKET_SIZE);
		UserToPMABufferCopy((uint8_t*)packet, ENDP1_BUF0Addr, packet_size);		
  }
  else 
  {
		SetEPTxCount(ENDP1, PACKET_SIZE);
		UserToPMABufferCopy((uint8_t*)packet, ENDP1_BUF1Addr, packet_size);		
  }
	SetEPTxValid(ENDP1);
  FreeUserBuffer(ENDP1, EP_DBUF_OUT);		

	packet_index += 1;
	
	if(packet_index >= (packet_count+1))
	{
		packet_index = 0;
	}
}

2.5 JEPG数据获取

获取JPEG图片数据的方法比较简单,方法如下:

1. 网上下载一张JPG格式的图片,如果下载不到,可以使用在线图片转换器进行图片格式的转换;

2. 使用《画图》工具调整图片的尺寸为320*240像素;

3. 使用《winhex》工具,把图片转换成8位的数组。

4. 创建txt文档,把刚才复制的数据粘贴出来。

cpp 复制代码
const unsigned char jpeg_data[JPEG_SIZE] = {
	0xFF, 0xD8, 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46, 0x00, 0x01, 0x01, 0x01, 0x00, 0x60, 
	0x00, 0x60, 0x00, 0x00, 0xFF, 0xE1, 0x00, 0x22, 0x45, 0x78, 0x69, 0x66, 0x00, 0x00, 0x4D, 0x4D, 
	0x00, 0x2A, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x01, 0x12, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 
	0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x3F, 0x43, 0x52, 0x45, 0x41, 
	0x54, 0x4F, 0x52, 0x3A, 0x20, 0x67, 0x64, 0x2D, 0x6A, 0x70, 0x65, 0x67, 0x20, 0x76, 0x31, 0x2E, 
	0x30, 0x20, 0x28, 0x75, 0x73, 0x69, 0x6E, 0x67, 0x20, 0x49, 0x4A, 0x47, 0x20, 0x4A, 0x50, 0x45, 
	0x47, 0x20, 0x76, 0x36, 0x32, 0x29, 0x2C, 0x20, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6C, 0x74, 0x20, 
	0x71, 0x75, 0x61, 0x6C, 0x69, 0x74, 0x79, 0x0A, 0x00, 0xFF, 0xDB, 0x00, 0x43, 0x00, 0x02, 0x01, 
	0x01, 0x02, 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x05, 0x03, 0x03, 
	0x03, 0x03, 0x03, 0x06, 0x04, 0x04, 0x03, 0x05, 0x07, 0x06, 0x07, 0x07, 0x07, 0x06, 0x07, 0x07, 
	0x08, 0x09, 0x0B, 0x09, 0x08, 0x08, 0x0A, 0x08, 0x07, 0x07, 0x0A, 0x0D, 0x0A, 0x0A, 0x0B, 0x0C, 
	0x0C, 0x0C, 0x0C, 0x07, 0x09, 0x0E, 0x0F, 0x0D, 0x0C, 0x0E, 0x0B, 0x0C, 0x0C, 0x0C, 0xFF, 0xDB, 
	0x00, 0x43, 0x01, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03, 0x06, 0x03, 0x03, 0x06, 0x0C, 0x08, 0x07, 
	0x08, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 
	0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 
	0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 
	0x0C, 0x0C, 0x0C, 0xFF, 0xC0, 0x00, 0x11, 0x08, 0x00, 0xF0, 0x01, 0x40, 0x03, 0x01, 0x22, 0x00, 
	0x02, 0x11, 0x01, 0x03, 0x11, 0x01, 0xFF, 0xC4, 0x00, 0x1F, 0x00, 0x00, 0x01, 0x05, 0x01, 0x01, 
	0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 
	0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 0xC4, 0x00, 0xB5, 0x10, 0x00, 0x02, 0x01, 0x03, 
	0x03, 0x02, 0x04, 0x03, 0x05, 0x05, 0x04, 0x04, 0x00, 0x00, 0x01, 0x7D, 0x01, 0x02, 0x03, 0x00, 
	0x04, 0x11, 0x05, 0x12, 0x21, 0x31, 0x41, 0x06, 0x13, 0x51, 0x61, 0x07, 0x22, 0x71, 0x14, 0x32, 
	0x81, 0x91, 0xA1, 0x08, 0x23, 0x42, 0xB1, 0xC1, 0x15, 0x52, 0xD1, 0xF0, 0x24, 0x33, 0x62, 0x72, 
	0x82, 0x09, 0x0A, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x34, 0x35, 
	0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 
	0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 
	0x76, 0x77, 0x78, 0x79, 0x7A, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 
	0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 
	0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 
	0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0xD9, 0xDA, 0xE1, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 
	0xE7, 0xE8, 0xE9, 0xEA, 0xF1, 0xF2, 0xF3, 0xF4, 0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xC4, 
	0x00, 0x1F, 0x01, 0x00, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 
	0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0xFF, 
	0xC4, 0x00, 0xB5, 0x11, 0x00, 0x02, 0x01, 0x02, 0x04, 0x04, 0x03, 0x04, 0x07, 0x05, 0x04, 0x04, 
	0x00, 0x01, 0x02, 0x77, 0x00, 0x01, 0x02, 0x03, 0x11, 0x04, 0x05, 0x21, 0x31, 0x06, 0x12, 0x41, 
	0x51, 0x07, 0x61, 0x71, 0x13, 0x22, 0x32, 0x81, 0x08, 0x14, 0x42, 0x91, 0xA1, 0xB1, 0xC1, 0x09, 
	0x23, 0x33, 0x52, 0xF0, 0x15, 0x62, 0x72, 0xD1, 0x0A, 0x16, 0x24, 0x34, 0xE1, 0x25, 0xF1, 0x17, 
	0x18, 0x19, 0x1A, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x43, 0x44, 
	0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x63, 0x64, 
	0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x82, 0x83, 
	0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9A, 
	0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 
	0xB9, 0xBA, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 
	0xD7, 0xD8, 0xD9, 0xDA, 0xE2, 0xE3, 0xE4, 0xE5, 0xE6, 0xE7, 0xE8, 0xE9, 0xEA, 0xF2, 0xF3, 0xF4, 
	0xF5, 0xF6, 0xF7, 0xF8, 0xF9, 0xFA, 0xFF, 0xDA, 0x00, 0x0C, 0x03, 0x01, 0x00, 0x02, 0x11, 0x03, 
	0x11, 0x00, 0x3F, 0x00, 0xFD, 0xFC, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 
	0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0xB0, 0x3E, 0x20, 0xFC, 0x55, 0xF0, 0xC7, 0xC2, 0x4D, 
	0x1B, 0xFB, 0x4B, 0xC5, 0x5E, 0x23, 0xD0, 0x7C, 0x33, 0xA7, 0x67, 0x1F, 0x6A, 0xD5, 0xB5, 0x08, 
	0xAC, 0xA1, 0xCF, 0xFB, 0xF2, 0x32, 0xAF, 0xEB, 0x5F, 0x3A, 0x7C, 0x43, 0xFF, 0x00, 0x82, 0xE0, 
	0x7E, 0xC9, 0x3F, 0x0C, 0x27, 0x68, 0xF5, 0x3F, 0x8F, 0xDF, 0x0E, 0x66, 0x78, 0xC9, 0x0C, 0x34, 
	0xCD, 0x47, 0xFB, 0x57, 0x18, 0xCF, 0xFC, 0xFA, 0x89, 0x3D, 0x0F, 0xE5, 0x40, 0x1F, 0x55, 0x51, 
	0x5F, 0x12, 0xDA, 0x7F, 0xC1, 0xC6, 0x5F, 0xB1, 0x7D, 0xF3, 0xAA, 0xC7, 0xF1, 0xC3, 0x49, 0x1B, 
	0xB0, 0x41, 0x7D, 0x0B, 0x56, 0x45, 0x00, 0xF4, 0xC9, 0x6B, 0x50, 0x07, 0xE3, 0x5E, 0x9B, 0xF0, 
	0xCF, 0xFE, 0x0A, 0xF5, 0xFB, 0x2F, 0xFC, 0x5E, 0xB9, 0x86, 0x0D, 0x07, 0xE3, 0xD7, 0xC2, 0xEB, 
	0x8B, 0x9B, 0x8E, 0x23, 0x82, 0xE7, 0x5F, 0x82, 0xCA, 0x67, 0x3D, 0x70, 0x12, 0x72, 0x8C, 0x4F, 
	0xB6, 0x33, 0x40, 0x1F, 0x46, 0xD1, 0x55, 0x74, 0x6D, 0x6E, 0xCF, 0xC4, 0x7A, 0x64, 0x37, 0xDA, 
	0x7D, 0xDD, 0xAD, 0xFD, 0x95, 0xC2, 0xEF, 0x8A, 0xE2, 0xDA, 0x55, 0x96, 0x29, 0x47, 0xAA, 0xB2, 
	0x92, 0x08, 0xF7, 0x06, 0xAD, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 
	0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 
	0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 
	0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 0x14, 0x50, 0x01, 0x45, 
	0x14, 0x50, 0x01, 0x41, 0x38, 0x14, 0x13, 0x8A, 0xFC, 0xDD, 0xFF, 0x00, 0x82, 0xEA, 0x7F, 0xC1, 
	0x75, 0x34, 0xFF, 0x00, 0xF8, 0x27, 0x26, 0x88, 0x3E, 0x1F, 0xFC, 0x3F, 0x93, 0x4E, 0xD6, 0xBE, 
	0x33, 0x6B, 0x56, 0xC2, 0x60, 0xB2, 0xE2, 0x5B, 0x7F, 0x0B, 0x5B, 0xB8, 0xCA, 0xDC, 0x4E, 0x9C, 
	0x86, 0x9D, 0x94, 0xE6, 0x28, 0x5B, 0x00, 0x8C, 0x3B, 0x65, 0x76, 0xA4, 0x80, 0x1F, 0x46, 0x7F, 
	0xC1, 0x40, 0xBF, 0xE0, 0xAC, 0xDF, 0x05, 0xFF, 0x00, 0xE0, 0x9B, 0xBA, 0x02, 0x37, 0x8F, 0xFC, 
	0x45, 0xE7, 0xF8, 0x92, 0xF6, 0x16, 0x97, 0x4E, 0xF0, 0xC6, 0x94, 0x82, 0xEB, 0x57, 0xD4, 0x31, 
	0x8C, 0x11, 0x10, 0x21, 0x62, 0x42, 0x4F, 0x12, 0x4C, 0xC8, 0x87, 0x04, 0x02, 0x48, 0xC5, 0x7E, 
	0x43, 0xF8, 0xA7, 0xFE, 0x0B, 0x3D, 0xFB, 0x71, 0x7F, 0xC1, 0x60, 0x3C, 0x6D, 0xA8, 0x78, 0x5F, 
	0xF6, 0x67, 0xF0, 0x46, 0xA5, 0xE0, 0x7F, 0x0B, 0xC7, 0x98, 0xA6, 0xB9, 0xD0, 0xA3, 0x8E, 0x4B, 
	0x88, 0x03, 0x67, 0x69, 0xB9, 0xD5, 0xAE, 0x36, 0xC3, 0x03, 0x0C, 0x6E, 0x02, 0x3F, 0x25, 0x89, 
	0x52, 0x3E, 0x61, 0x5B, 0xDF, 0xF0, 0x49, 0xCF, 0xF8, 0x20, 0x07, 0x88, 0xBF, 0x6E, 0xCF, 0x11, 
	0x2F, 0xED, 0x01, 0xFB, 0x53, 0x5D, 0x78, 0x82, 0xF3, 0x49, 0xF1, 0x54, 0x8B, 0xAA, 0x59, 0xE8, 
	0x57, 0xD7, 0x93, 0x2E, 0xA9, 0xE2, 0x60, 0xF8, 0x61, 0x75, 0x79, 0x26, 0xED, 0xF1, 0x5B, 0xB8, 
	0x23, 0x62, 0x29, 0x0E, 0xEA, 0x01, 0x1E, 0x5A, 0xED, 0x2F, 0xFB, 0xA1, 0xF0, 0xC7, 0xE1, 0x57, 
	0x86, 0x7E, 0x0A, 0xF8, 0x26, 0xC7, 0xC3, 0x7E, 0x11, 0xD0, 0x74, 0x8F, 0x0C, 0xF8, 0x7F, 0x4C, 
	0x4F, 0x2E, 0xD7, 0x4E, 0xD3, 0x2D, 0x12, 0xD6, 0xDA, 0x05, 0xFF, 0x00, 0x65, 0x10, 0x01, 0x93, 
	0xD4, 0x9E, 0xA4, 0xF2, 0x72, 0x68, 0x03, 0xF0, 0xDF, 0xE1, 0xAF, 0xFC, 0x1A, 0x45, 0xF1, 0x57, 
	0xF6, 0x8A, 0xD6, 0x5F, 0xC4, 0xDF, 0xB4, 0x67, 0xC7, 0xB6, 0x93, 0x58, 0xBE, 0x65, 0x9A, 0x78, 
	0x74, 0xDF, 0x3F, 0x5F, 0xBE, 0x6C, 0x8E, 0x55, 0xEF, 0x2E, 0xD9, 0x02, 0xB2, 0xE4, 0x8C, 0x84, 
	0x91, 0x7D, 0xC8, 0xE6, 0xBE, 0x9C, 0xF0, 0x1F, 0xFC, 0x1A, 0x19, 0xFB, 0x2B, 0xF8, 0x62, 0xD5, 
	0x57, 0x58, 0xD4, 0xBE, 0x2A, 0x78, 0xAA, 0x4C, 0x92, 0xFF, 0x00, 0x6E, 0xD7, 0xE2, 0x81, 0x18, 
	0x9D, 0xBD, 0x05, 0xBC, 0x11, 0x9C, 0x7C, 0xBD, 0xD8, 0xF5, 0x3C, 0xF4, 0xC7, 0xEA, 0x45, 0xDC, 
	0xCD, 0x6D, 0x69, 0x24, 0x89, 0x0C, 0x97, 0x0D, 0x1A, 0x16, 0x58, 0xA3, 0x2A, 0x1A, 0x42, 0x07, 
	0x0A, 0x37, 0x10, 0xB9, 0x3D, 0x39, 0x20, 0x7A, 0x91, 0x52, 0x50, 0x07, 0xE7, 0x5E, 0xA7, 0xFF, 
	0x00, 0x06, 0xB0, 0x7E, 0xC6, 0x7A, 0x8D, 0x84, 0x90, 0xAF, 0x80, 0xBC, 0x45, 0x6C, 0xD2, 0x12, 
	0x7C, 0xE8, 0xBC, 0x53, 0x7F, 0xE6, 0x29, 0xC6, 0x07, 0xDE, 0x90, 0x8E, 0x3D, 0xC1, 0xF7, 0xCD, 
	0x79, 0x3F, 0xC5, 0x6F, 0xF8, 0x33, 0xA7, 0xF6, 0x73, 0xF1, 0x6D, 0x95, 0xC3, 0x78, 0x63, 0xC6, 
	0x9F, 0x15, 0xBC, 0x27, 0x7B, 0x31, 0x3B, 0x4B, 0xDF, 0xDA, 0xEA, 0x16, 0xA9, 0xCE, 0x47, 0xEE, 
	0xDE, 0x05, 0x73, 0x8F, 0xFA, 0xE9, 0xCF, 0x7C, 0x9E, 0x6B, 0xF5, 0xB2, 0x8A, 0x00, 0xFE, 0x7F, 
	0xFC, 0x53, 0xFF, 0x00, 0x06, 0xE7, 0x7E, 0xD9, 0x1F, 0xF0, 0x4F, 0x7D, 0x5E, 0xF3, 0xC4, 0x5F, 
	0xB3, 0x3F, 0xC6, 0xA3, 0xE2, 0x08, 0x91, 0xFC, 0xE1, 0x61, 0xA7, 0x6A, 0x32, 0xF8, 0x7A, 0xFE, 
	0xE7, 0x86, 0xC0, 0x7B, 0x69, 0x5D, 0xAD, 0x26, 0x03, 0xD2, 0x49, 0xB9, 0xCE, 0x36, 0xD6, 0xE7, 
	0xEC, 0xDB, 0xFF, 0x00, 0x07, 0x34, 0xFC, 0x72, 0xFD, 0x8D, 0xBE, 0x28, 0x7F, 0xC2, 0xBB, 0xFD, 
	0xB0, 0x3E, 0x19, 0xEA, 0xB7, 0x17, 0x30, 0x3A, 0xF9, 0xDA, 0x94, 0x5A, 0x5A, 0xE8, 0xFA, 0xE5, 
	0xAC, 0x47, 0xA4, 0xAD, 0x6D, 0x85, 0xB7, 0xB9, 0x43, 0xFC, 0x26, 0x21, 0x10, 0x23, 0x27, 0x7B, 
	0x74, 0xAF, 0xDE, 0x4A, 0xF2, 0xDF, 0xDA, 0xC3, 0xF6, 0x2B, 0xF8, 0x63, 0xFB, 0x6F, 0x7C, 0x36, 
	0x9B, 0xC2, 0xBF, 0x13, 0xBC, 0x23, 0xA5, 0xF8, 0xA3, 0x4B, 0x64, 0x61, 0x6E, 0xF3, 0xC7, 0xB6, 
	0xEB, 0x4E, 0x76, 0x03, 0x32, 0x5B, 0xCE, 0xB8, 0x92, 0x17, 0xE0, 0x72, 0x8C, 0x33, 0x80, 0x0E, 
	0x47, 0x14, 0x01, 0x27, 0xEC, 0xA5, 0xFB, 0x64, 0x7C, 0x35, 0xFD, 0xB6, 0xFE, 0x18, 0xC5, 0xE2, 
	0xEF, 0x86, 0x3E, 0x2D, 0xD2, 0xFC, 0x55, 0xA2, 0xB3, 0x08, 0xE6, 0x6B, 0x76, 0x29, 0x3D, 0x94, 
	0xA4, 0x67, 0xCA, 0x9E, 0x17, 0x02, 0x48, 0x64, 0xC6, 0x0E, 0xD7, 0x50, 0x48, 0x20, 0x8C, 0x82, 
	0x09, 0xF4, 0xEA, 0xFE, 0x70, 0xFF, 0x00, 0x6C, 0x1F, 0xD8, 0x5B, 0xE3, 0x77, 0xFC, 0x1B, 0x93, 
	0xFB, 0x49, 0xD8, 0xFC, 0x5E, 0xF8, 0x3B, 0xE2, 0x0D, 0x5B, 0x58, 0xF8, 0x5D, 0x71, 0x76, 0x21, 
	0x17, 0xF2, 0x66, 0x54, 0x78, 0x48, 0xCF, 0xF6, 0x6E, 0xAD, 0x02, 0xE1, 0x1F, 0x76, 0x30, 0x92, 
	0x00, 0xAA, 0xC4, 0x07, 0x53, 0x14, 0x83, 0x03, 0xF6, 0x7B, 0xFE, 0x09, 0x57, 0xFF, 0x00, 0x05, 
	0x44, 0xF0, 0x57, 0xFC, 0x15, 0x23, 0xF6, 0x7B, 0x5F, 0x15, 0x78, 0x77, 0xCB, 0xD2, 0xFC, 0x49, 
	0xA3, 0x98, 0xED, 0x7C, 0x49, 0xE1, 0xF7, 0x9B, 0xCC, 0x9B, 0x48, 0xB9, 0x60, 0x48, 0x20, 0xE0, 
	0x17, 0x82, 0x4D, 0xAC, 0x63, 0x93, 0x03, 0x70, 0x56, 0x07, 0x0C, 0xAC, 0x00, 0x07, 0xD3, 0xD4, 
	0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 
	0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 
	0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x14, 
	0x51, 0x45, 0x00, 0x14, 0x51, 0x45, 0x00, 0x78, 0x5F, 0xFC, 0x14, 0x93, 0xF6, 0xD8, 0xD2, 0x7F, 
	0xE0, 0x9E, 0xFF, 0x00, 0xB1, 0x97, 0x8D, 0xBE, 0x29, 0x6A, 0x8B, 0x0D, 0xCC, 0xFA, 0x0D, 0x9E, 
	0xCD, 0x2A, 0xCA, 0x47, 0xDA, 0x35, 0x1D, 0x42, 0x53, 0xB2, 0xDA, 0x0F, 0x5D, 0xA6, 0x42, 0x0B, 
	0x91, 0x92, 0xB1, 0xAB, 0xB6, 0x3E, 0x5A, 0xFC, 0x25, 0xFF, 0x00, 0x83, 0x7F, 0xBF, 0x60, 0xFD, 
	0x5B, 0xFE, 0x0A, 0xD5, 0xFB, 0x75, 0x78, 0xCB, 0xE3, 0xC7, 0xC6, 0x4B, 0x89, 0xBC, 0x4F, 0xE1, 
	0xBF, 0x0A, 0x6A, 0xA9, 0xAB, 0xEA, 0x02, 0xF9, 0x4B, 0xC5, 0xE2, 0x3D, 0x5E, 0x66, 0x69, 0x61, 
	0x80, 0xA9, 0x1B, 0x7E, 0xCF, 0x10, 0x5F, 0x31, 0xE3, 0x5F, 0x97, 0x0B, 0x0C, 0x7B, 0x4A, 0x39, 
	0x0B, 0xF4, 0x57, 0xFC, 0x1E, 0x7F, 0xF1, 0xFA, 0x5D, 0x27, 0xE1, 0xDF, 0xC1, 0x5F, 0x86, 0x96, 
	0xB7, 0x2E, 0x83, 0x57, 0xD4, 0x6F, 0xBC, 0x47, 0x79, 0x0A, 0x9C, 0x79, 0x9E, 0x42, 0x47, 0x6F, 
	0x07, 0x1D, 0x0F, 0x33, 0xCF, 0xD7, 0xD0, 0x57, 0xDD, 0x9F, 0xF0, 0x6F, 0x17, 0xC0, 0x1B, 0x7F, 
	0xD9, 0xFB, 0xFE, 0x09, 0x19, 0xF0, 0x8E, 0xDD, 0x6D, 0x63, 0xB7, 0xD4, 0x3C, 0x51, 0x61, 0x27, 
	0x89, 0xEF, 0xDD, 0x53, 0x6B, 0x5C, 0x4B, 0x79, 0x23, 0x49, 0x1B, 0xB7, 0xA9, 0x16, 0xFE, 0x42, 
	0x67, 0xD1, 0x05, 0x00, 0x7D, 0xAE, 0x89, 0xB1, 0x70, 0x29, 0x68, 0xA2, 0x80, 0x0A, 0x2B, 0xCA, 
	0x3F, 0x6E, 0x9F, 0xDA, 0x1A, 0xE3, 0xF6, 0x4C, 0xFD, 0x8E, 0x3E, 0x26, 0x7C, 0x4B, 0xB3, 0xB6, 
	0xB5, 0xBC, 0xBC, 0xF0, 0x47, 0x87, 0x2F, 0x35, 0x7B, 0x68, 0x2E, 0x9C, 0xAC, 0x33, 0x4B, 0x14, 
	0x45, 0x91, 0x58, 0x8E, 0x70, 0x5B, 0x03, 0x00, 0x82, 0x7A, 0x64, 0x67, 0x35, 0xF0, 0x97, 0xFC, 
	0x1B, 0x95, 0xFF, 0x00, 0x05, 0x87, 0xF8, 0x97, 0xFF, 0x00, 0x05, 0x3A, 0x97, 0xE2, 0x7E, 0x8B, 
	0xF1, 0x22, 0x1D, 0x2E, 0xEA, 0xF3, 0xC1, 0xA6, 0xCE, 0xFE, 0xCF, 0x51, 0xB3, 0xB2, 0x16, 0x84, 
	0xC5, 0x72, 0xD3, 0x2F, 0x90, 0xE8, 0xA7, 0x61, 0xDA, 0x62, 0xCA, 0xB0, 0x00, 0x91, 0xB8, 0x1C, 
	0xE3, 0x34, 0x01, 0xFA, 0x89, 0x45, 0x15, 0xE6, 0xDF, 0xB6, 0x07, 0xED, 0x2D, 0xA5, 0xFE, 0xC7, 
	0x7F, 0xB3, 0x2F, 0x8D, 0x3E, 0x27, 0x6B, 0x36, 0x77, 0x5A, 0x86, 0x9D, 0xE0, 0xDD, 0x35, 0xF5, 
	0x09, 0x2D, 0x6D, 0xCE, 0xD9, 0x2E, 0x48, 0x21, 0x51, 0x01, 0xC1, 0xDA, 0x19, 0xD9, 0x41, 0x6C, 
	0x1D, 0xA0, 0x93, 0x83, 0x8C, 0x50, 0x07, 0xA4, 0xD1, 0x5F, 0x15, 0xFF, 0x00, 0xC1, 0x18, 0xFF, 
	0x00, 0xE0, 0xB1, 0x7A, 0x4F, 0xFC, 0x15, 0xB7, 0xE1, 0xBF, 0x89, 0xEF, 0x17, 0xC2, 0xC7, 0xC1, 
	0xFE, 0x26, 0xF0, 0x6C, 0xD6, 0xEB, 0xA9, 0xE9, 0xF1, 0xDF, 0x7D, 0xBA, 0xDD, 0xA2, 0xB8, 0xF3, 
	0xBC, 0x99, 0x23, 0x94, 0xA2, 0x1E, 0x7C, 0x89, 0x03, 0x29, 0x5E, 0x08, 0x04, 0x12, 0x0F, 0x1F, 
	0x6A, 0x50, 0x07, 0x35, 0xF1, 0x8B, 0xE1, 0x17, 0x87, 0x7E, 0x3E, 0x7C, 0x2E, 0xD7, 0xBC, 0x19, 
	0xE2, 0xED, 0x26, 0xD7, 0x5C, 0xF0, 0xCF, 0x89, 0xAC, 0xA4, 0xD3, 0xF5, 0x1B, 0x1B, 0x81, 0x98, 
	0xEE, 0x21, 0x90, 0x60, 0x8F, 0x55, 0x61, 0xD5, 0x58, 0x61, 0x95, 0x80, 0x60, 0x41, 0x00, 0xD7, 
	0xF3, 0x2F, 0x3E, 0xA1, 0xE3, 0x0F, 0xF8, 0x36, 0xE7, 0xFE, 0x0B, 0x4E, 0xD6, 0x91, 0xDF, 0x6A, 
	0x57, 0x7E, 0x02, 0x37, 0x2A, 0xF3, 0x21, 0x72, 0x47, 0x89, 0x3C, 0x37, 0x74, 0xE4, 0xFC, 0xFC, 
	0x2A, 0xB4, 0xF1, 0x85, 0x38, 0x3C, 0x05, 0x9E, 0xDC, 0xE3, 0xE5, 0xE6, 0xBF, 0xA8, 0xDA, 0xFC, 
	0x51, 0xFF, 0x00, 0x83, 0xCC, 0x7F, 0x67, 0x7B, 0x3D, 0x4B, 0xE0, 0x27, 0xC2, 0x7F, 0x8A, 0xF0, 
	0x5B, 0xC7, 0x1E, 0xA3, 0xA1, 0xEB, 0x53, 0x78, 0x66, 0xF2, 0x71, 0x18, 0x2D, 0x2D, 0xBD, 0xD4, 
	0x2F, 0x71, 0x10, 0x63, 0xE8, 0x8F, 0x6D, 0x2E, 0x07, 0x4F, 0xDF, 0xBF, 0xD4, 0x00, 0x7E, 0xCF, 
	0x78, 0x57, 0xC5, 0x1A, 0x7F, 0x8D, 0xBC, 0x33, 0xA7, 0x6B, 0x3A, 0x4D, 0xD4, 0x77, 0xDA, 0x5E, 
	0xAD, 0x6B, 0x15, 0xED, 0x9D, 0xCC, 0x67, 0x29, 0x71, 0x0C, 0x88, 0x1E, 0x37, 0x5F, 0x66, 0x56, 
	0x04, 0x7D, 0x6B, 0x42, 0xBE, 0x12, 0xFF, 0x00, 0x83, 0x6E, 0xFF, 0x00, 0x68, 0x69, 0xBF, 0x68, 
	0x5F, 0xF8, 0x24, 0xA7, 0xC3, 0xB9, 0x2F, 0x2E, 0x4D, 0xDE, 0xA1, 0xE1, 0x19, 0x2E, 0xFC, 0x33, 
	0x3C, 0x85, 0xF7, 0x36, 0xDB, 0x69, 0x49, 0x81, 0x4F, 0xFB, 0xB6, 0xF2, 0x40, 0xBF, 0x40, 0x0F, 
	0x7A, 0xFB, 0xB6, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 
	0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 
	0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 
	0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x3F, 0x9F, 0xEF, 0xF8, 0x3D, 0x43, 0xE1, 0x55, 
	0xD1, 0xF8, 0x93, 0xF0, 0x27, 0xC6, 0x59, 0x93, 0xEC, 0x77, 0x1A, 0x76, 0xA7, 0xA2, 0xFC, 0xAB, 
	0xB8, 0x24, 0x91, 0xCD, 0x0C, 0xDC, 0xE7, 0x8E, 0x56, 0x53, 0xDB, 0x9D, 0xBD, 0xFB, 0x7E, 0xB0, 
	0xFF, 0x00, 0xC1, 0x16, 0x3C, 0x7F, 0x63, 0xF1, 0x2B, 0xFE, 0x09, 0x43, 0xF0, 0x07, 0x51, 0xD3, 
	0xDB, 0x74, 0x16, 0xFE, 0x0D, 0xB1, 0xD2, 0xDF, 0x2C, 0x58, 0x89, 0x6C, 0xD3, 0xEC, 0x92, 0x8C, 
	0x92, 0x4F, 0xFA, 0xC8, 0x5B, 0xBD, 0x79, 0x1F, 0xFC, 0x1C, 0x87, 0xFB, 0x08, 0x5D, 0x7E, 0xDB, 
	0xFF, 0x00, 0xF0, 0x4D, 0xED, 0x72, 0x4D, 0x12, 0xD5, 0xEE, 0xBC, 0x57, 0xF0, 0xD6, 0x7F, 0xF8, 
	0x4A, 0xB4, 0xC8, 0x63, 0x4D, 0xD2, 0x5D, 0xC7, 0x14, 0x6E, 0x97, 0x50, 0x01, 0xD4, 0x96, 0x81, 
	0x9D, 0xC0, 0x1C, 0x97, 0x89, 0x00, 0xEB, 0x5F, 0x22, 0xFF, 0x00, 0xC1, 0xA1, 0x7F, 0xF0, 0x50, 
	0x9B, 0x5D, 0x6F, 0xE1, 0xA7, 0x89, 0x3F, 0x67, 0x1F, 0x12, 0x5F, 0xC7, 0x0E, 0xAD, 0xE1, 0xD9, 
	0xE4, 0xD7, 0xBC, 0x26, 0xB3, 0x36, 0xD3, 0x79, 0x69, 0x2E, 0x5A, 0xEA, 0xDE, 0x3E, 0x70, 0x4C, 
	0x72, 0x0F, 0x38, 0x2A, 0xF2, 0x56, 0x69, 0x4F, 0xDD, 0x43, 0x80, 0x0F, 0xDB, 0x6A, 0x28, 0xA2, 
	0x80, 0x3C, 0x17, 0xFE, 0x0A, 0x7B, 0xFB, 0x31, 0xEB, 0xBF, 0xB6, 0x57, 0xEC, 0x19, 0xF1, 0x2B, 
	0xE1, 0x9F, 0x86, 0x6F, 0xAD, 0xB4, 0xFD, 0x73, 0xC5, 0x9A, 0x60, 0xB7, 0xB4, 0x96, 0xE1, 0x8A, 
	0x46, 0xCC, 0x93, 0x47, 0x29, 0x8D, 0x9B, 0x07, 0x68, 0x90, 0x46, 0x53, 0x24, 0x10, 0x37, 0xE4, 
	0xF1, 0x5F, 0x2F, 0x7F, 0xC1, 0xBA, 0xFF, 0x00, 0xF0, 0x49, 0x5F, 0x18, 0x7F, 0xC1, 0x2F, 0x7E, 
	0x10, 0x78, 0xEE, 0x4F, 0x1E, 0x3D, 0x84, 0x3E, 0x24, 0xF1, 0xF5, 0xDD, 0x93, 0x3D, 0x85, 0xB4, 
	0xE9, 0x70, 0x2C, 0x60, 0xB4, 0x17, 0x02, 0x30, 0xD2, 0x21, 0x2A, 0x59, 0x8D, 0xC3, 0x1C, 0x2B, 
	0x10, 0x30, 0x3B, 0xE6, 0xBF, 0x46, 0xEB, 0xE6, 0x7F, 0xF8, 0x29, 0xF7, 0xFC, 0x15, 0x07, 0xC1, 
	0xFF, 0x00, 0xF0, 0x4B, 0x7F, 0x83, 0xFA, 0x67, 0x8A, 0xBC, 0x55, 0xA0, 0xF8, 0x93, 0xC4, 0x73, 
	0x6B, 0xB7, 0x4F, 0x65, 0xA7, 0x59, 0x69, 0x36, 0xE0, 0x89, 0x65, 0x44, 0xF3, 0x1B, 0xCC, 0x99, 
	0xBE, 0x48, 0x86, 0xDE, 0x99, 0xCB, 0x31, 0xE8, 0xA4, 0x06, 0x2A, 0x01, 0xF4, 0xC5, 0x7C, 0x73, 
	0xFF, 0x00, 0x07, 0x00, 0xF8, 0xAD, 0x7C, 0x1F, 0xFF, 0x00, 0x04, 0x7C, 0xF8, 0xE5, 0x3B, 0x48, 
	0xA8, 0xD7, 0x9A, 0x24, 0x7A, 0x7C, 0x6A, 0x7A, 0xC8, 0xD3, 0xDD, 0xC1, 0x16, 0xD0, 0x3A, 0x92, 
	0x43, 0x9E, 0x9E, 0xE7, 0x8C, 0x64, 0x7C, 0x97, 0xF0, 0x67, 0xFE, 0x0F, 0x0B, 0xF8, 0x35, 0xF1, 
	0x2F, 0xC7, 0x76, 0x7A, 0x3E, 0xA9, 0xF0, 0xCF, 0xE2, 0x0E, 0x81, 0x6F, 0x72, 0xE5, 0x64, 0xBC, 
	0x59, 0xED, 0x6F, 0x16, 0xDC, 0x0C, 0x64, 0x94, 0x56, 0x56, 0x38, 0xCF, 0x45, 0xC9, 0xE9, 0x5F, 
	0xA8, 0xDF, 0x11, 0x3E, 0x1A, 0x78, 0x2F, 0xF6, 0xAE, 0xF8, 0x33, 0x36, 0x87, 0xE2, 0x7D, 0x22, 
	0xC7, 0xC5, 0x1E, 0x0D, 0xF1, 0x55, 0xA4, 0x53, 0x49, 0x67, 0x77, 0x1B, 0x79, 0x77, 0x31, 0x36, 
	0xD9, 0x63, 0x6C, 0x70, 0xCA, 0xC0, 0xED, 0x60, 0x46, 0x19, 0x48, 0x04, 0x10, 0x45, 0x00, 0x7E, 
	0x34, 0xFF, 0x00, 0xC1, 0x95, 0xDE, 0x16, 0x96, 0xCB, 0xC1, 0x1F, 0xB4, 0x06, 0xA9, 0x2D, 0xBC, 
	0x91, 0x2C, 0xD7, 0xBA, 0x25, 0x94, 0x2E, 0xC3, 0x68, 0x60, 0x91, 0xDE, 0xC8, 0xCB, 0x8C, 0x73, 
	0x8F, 0x31, 0x4E, 0x7F, 0xDA, 0xC7, 0x18, 0xAF, 0xDC, 0xAA, 0xF3, 0xDF, 0xD9, 0xAF, 0xF6, 0x54, 
	0xF8, 0x7B, 0xFB, 0x1F, 0xFC, 0x3B, 0x5F, 0x09, 0xFC, 0x35, 0xF0, 0xAE, 0x9B, 0xE1, 0x3D, 0x04, 
	0x4C, 0xD7, 0x0D, 0x6D, 0x6B, 0xBD, 0x9A, 0x69, 0x48, 0x00, 0xBC, 0x92, 0x3B, 0x33, 0xBB, 0x60, 
	0x01, 0x96, 0x62, 0x40, 0x00, 0x0E, 0x00, 0x15, 0xE8, 0x54, 0x00, 0x57, 0xE4, 0x5F, 0xFC, 0x1E, 
	0x43, 0xE3, 0x6B, 0x1D, 0x3F, 0xFE, 0x09, 0xD7, 0xE0, 0x6F, 0x0E, 0xCD, 0x22, 0xAD, 0xFE, 0xB7, 
	0xE3, 0xA8, 0x6E, 0xE0, 0x8F, 0x77, 0xCC, 0xD1, 0xDB, 0xD9, 0x5D, 0x87, 0x6C, 0x77, 0x01, 0xA7, 
	0x88, 0x1F, 0x4D, 0xC0, 0xE3, 0xB8, 0xFD, 0x74, 0x66, 0xDA, 0x2B, 0xF9, 0x9F, 0xFF, 0x00, 0x83, 
	0x87, 0xFF, 0x00, 0x6B, 0x2D, 0x53, 0xFE, 0x0A, 0x81, 0xFF, 0x00, 0x05, 0x41, 0xF0, 0xBF, 0xC1, 
	0x7F, 0x86, 0x4B, 0x2F, 0x88, 0xF4, 0xBF, 0x02, 0xDD, 0xB7, 0x85, 0xF4, 0xA8, 0xAD, 0x9B, 0x7C, 
	0x5A, 0xA6, 0xB3, 0x3C, 0x8A, 0x2E, 0xDD, 0x08, 0x38, 0xC2, 0xB2, 0x24, 0x5B, 0x8F, 0x18, 0x81, 
	0x9C, 0x1D, 0xA7, 0x24, 0x03, 0xF4, 0xC7, 0xFE, 0x0D, 0x3C, 0xF8, 0x63, 0x79, 0xF0, 0xF3, 0xFE, 
	0x09, 0x25, 0xA6, 0x5E, 0x5D, 0x2C, 0x82, 0x3F, 0x15, 0x78, 0xAB, 0x56, 0xD5, 0xAD, 0x8B, 0x92, 
	0x73, 0x18, 0x68, 0xAD, 0x32, 0x01, 0xE8, 0x37, 0xDA, 0xBF, 0x1E, 0xB9, 0x3C, 0xE7, 0x27, 0xF4, 
	0xBE, 0xBC, 0xCF, 0xF6, 0x35, 0xFD, 0x9B, 0x34, 0xDF, 0xD8, 0xF7, 0xF6, 0x57, 0xF0, 0x1F, 0xC3, 
	0x1D, 0x29, 0x96, 0x6B, 0x4F, 0x05, 0xE8, 0xF0, 0x69, 0xCD, 0x3A, 0xAE, 0xD1, 0x75, 0x32, 0xAE, 
	0x66, 0x9B, 0x1D, 0xBC, 0xC9, 0x5A, 0x47, 0xC7, 0x6D, 0xF5, 0xE9, 0x94, 0x00, 0x51, 0x45, 0x14, 
	0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 
	0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 
	0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 0x00, 0x51, 0x45, 0x14, 
	0x00, 0x32, 0xEE, 0x15, 0xFC, 0xF3, 0xFF, 0x00, 0xC1, 0x6C, 0xFF, 0x00, 0xE0, 0x93, 0x5E, 0x35, 
	0xFF, 0x00, 0x82, 0x66, 0xFE, 0xD4, 0x76, 0xBF, 0xB5, 0x07, 0xC0, 0x18, 0x6E, 0x74, 0xDF, 0x07, 
	0xC7, 0xAA, 0x8D, 0x62, 0xE1, 0x74, 0xB8, 0x70, 0xDE, 0x0B, 0xD4, 0x19, 0xC7, 0x54, 0x03, 0x6F, 
	0xD8, 0xA5, 0x76, 0x6D, 0xA4, 0x8F, 0x2D, 0x44, 0x8D, 0x0B, 0x80, 0x85, 0x37, 0x7F, 0x43, 0x15, 
	0x57, 0x5A, 0xD1, 0x6C, 0xFC, 0x47, 0xA3, 0xDD, 0x69, 0xFA, 0x85, 0xAD, 0xB5, 0xF5, 0x85, 0xF4, 
	0x2F, 0x6F, 0x73, 0x6D, 0x71, 0x12, 0xCB, 0x0D, 0xC4, 0x4E, 0x0A, 0xBA, 0x3A, 0x30, 0x21, 0x95, 
	0x94, 0x90, 0x41, 0x04, 0x10, 0x48, 0xA0, 0x0F, 0x8C, 0x3F, 0xE0, 0x90, 0x1F, 0xF0, 0x5A, 0x1F, 
	0x02, 0xFF, 0x00, 0xC1, 0x4E, 0x3E, 0x1C, 0x5B, 0x69, 0xB7, 0x13, 0x58, 0xF8, 0x67, 0xE2, 0xD6, 
	0x93, 0x6A, 0xA7, 0x5A, 0xF0, 0xE3, 0x4B, 0x81, 0x72, 0x42, 0x8D, 0xD7, 0x76, 0x64, 0x9F, 0xDE, 
	0x40, 0xC4, 0x12, 0x53, 0x25, 0xE2, 0xE8, 0xD9, 0x52, 0x92, 0x3F, 0xDB, 0x20, 0xE4, 0x57, 0xE2, 
	0x9F, 0xFC, 0x14, 0x5F, 0xFE, 0x0D, 0x87, 0xD6, 0xFC, 0x27, 0xF1, 0x15, 0xBE, 0x2B, 0x7E, 0xC9, 
	0x3A, 0xE4, 0x9E, 0x18, 0xD7, 0x6C, 0x26, 0xFE, 0xD0, 0x8B, 0xC2, 0xBF, 0xDA, 0x0D, 0x61, 0x2D, 
	0x95, 0xC0, 0xFE, 0x2D, 0x32, 0xF7, 0x20, 0xC4, 0x4F, 0x18, 0x8A, 0x56, 0x55, 0x18, 0x38, 0x90, 
	0x02, 0x15, 0x78, 0x0F, 0xD9, 0x7F, 0xFE, 0x0E, 0x6F, 0xF8, 0xC7, 0xFB, 0x12, 0xF8, 0xB4, 0x7C, 
	0x36, 0xFD, 0xAD, 0xBE, 0x1B, 0xF8, 0x83, 0x55, 0xB9, 0xD2, 0x42, 0xC2, 0xFA, 0xAC, 0x56, 0x3F, 
	0xD9, 0x9E, 0x20, 0x85, 0x54, 0x1C, 0xBC, 0xB6, 0xF2, 0xEC, 0x86, 0xE8, 0x10, 0x17, 0x6B, 0xA9, 
	0x88, 0x91, 0xF3, 0x33, 0x3E, 0xE0, 0xC4, 0x03, 0xF7, 0xAE, 0xB3, 0x3C, 0x5D, 0xE0, 0xBD, 0x1F, 
	0xC7, 0xFA, 0x14, 0xDA, 0x5E, 0xBD, 0xA5, 0x69, 0xBA, 0xD6, 0x97, 0x72, 0x00, 0x9A, 0xCE, 0xFE, 
	0xD5, 0x2E, 0x6D, 0xE5, 0xC7, 0x23, 0x72, 0x38, 0x2A, 0x7F, 0x11, 0x5F, 0x30, 0x7E, 0xCD, 0x1F, 
	0xF0, 0x5C, 0x8F, 0xD9, 0x5F, 0xF6, 0xAA, 0xB5, 0x8B, 0xFE, 0x11, 0xDF, 0x8C, 0x7E, 0x14, 0xD2, 
	0xB5, 0x19, 0x02, 0x86, 0xD3, 0x3C, 0x49, 0x3F, 0xF6, 0x1D, 0xEA, 0xBB, 0x73, 0xE5, 0x84, 0xBA, 
	0x11, 0x89, 0x18, 0x77, 0xF2, 0x99, 0xC7, 0xBD, 0x7D, 0x51, 0xA3, 0xEB, 0xB6, 0x3E, 0x21, 0xB1, 
	0x5B, 0xAD, 0x3E, 0xF2, 0xD6, 0xFA, 0xD9, 0xFE, 0xEC, 0xB6, 0xF2, 0xAC, 0xB1, 0xB7, 0x7E, 0x19, 
	0x49, 0x14, 0x01, 0xE7, 0x2B, 0xFB, 0x11, 0xFC, 0x18, 0x5D, 0x4E, 0x1B, 0xD1, 0xF0, 0x8F, 0xE1, 
	0x78, 0xBC, 0xB7, 0x7F, 0x32, 0x29, 0xC7, 0x85, 0x6C, 0x7C, 0xD8, 0x9B, 0xFB, 0xCA, 0xDE, 0x56, 
	0x41, 0xF7, 0x15, 0xEA, 0x00, 0x6D, 0x14, 0x66, 0xB1, 0x7C, 0x6D, 0xF1, 0x27, 0xC3, 0xBF, 0x0D, 
	0x34, 0x89, 0x35, 0x0F, 0x12, 0x6B, 0xDA, 0x2F, 0x87, 0xEC, 0x21, 0x5D, 0xF2, 0x5C, 0xEA, 0x57, 
	0xD1, 0x5A, 0x43, 0x1A, 0xF4, 0xC9, 0x79, 0x18, 0x00, 0x3D, 0xC9, 0xA0, 0x0D, 0xAA, 0x09, 0xC5, 
	0x7C, 0x23, 0xFB, 0x56, 0xFF, 0x00, 0xC1, 0xC7, 0xFF, 0x00, 0xB2, 0x97, 0xEC, 0xB7, 0x15, 0xDD, 
	0xBC, 0x7E, 0x3F, 0x8F, 0xE2, 0x26, 0xBB, 0x6A, 0x4A, 0x8D, 0x33, 0xC1, 0xB1, 0x8D, 0x4C, 0xBB, 
	0x01, 0x9E, 0x6E, 0x72, 0xB6, 0xA0, 0x0E, 0xFF, 0x00, 0xBD, 0x24, 0x00, 0x78, 0x27, 0x00, 0xFE, 
	0x67, 0xFC, 0x5C, 0xFF, 0x00, 0x82, 0xBC, 0x7E, 0xD8, 0xFF, 0x00, 0xF0, 0x5B, 0xBF, 0x10, 0x5F, 
	0x7C, 0x3F, 0xFD, 0x9E, 0xBC, 0x0B, 0xAB, 0x78, 0x2F, 0xC1, 0x17, 0x85, 0xA0, 0xBE, 0x7D, 0x12, 
	0x46, 0xFB, 0x41, 0x85, 0x94, 0x8D, 0x97, 0xDA, 0xB3, 0xEC, 0x8E, 0x05, 0x38, 0x6C, 0xAC, 0x66, 
	0x2C, 0x83, 0xB0, 0xF9, 0x99, 0xC1, 0x00, 0xFA, 0x8B, 0xFE, 0x0B, 0xE5, 0xFF, 0x00, 0x05, 0xFE, 
	0xD3, 0xFE, 0x08, 0x78, 0x5F, 0x56, 0xF8, 0x2F, 0xF0, 0x2F, 0x5A, 0x87, 0x56, 0xF1, 0xFE, 0xB3, 
	0x0C, 0xB6, 0x3A, 0xD7, 0x89, 0x34, 0xB9, 0xC4, 0x91, 0xF8, 0x6D, 0x4F, 0xCA, 0xF6, 0xF6, 0xEE, 
	0x99, 0xDD, 0x7A, 0x79, 0x0C, 0xEB, 0xFE, 0xA3, 0x3F, 0xF3, 0xD7, 0x1E, 0x5C, 0xDF, 0xF0, 0x6E, 
	0x27, 0xFC, 0x10, 0xF2, 0xF7, 0xF6, 0x51, 0xB5, 0x83, 0xE3, 0xB7, 0xC5, 0x9D, 0x2D, 0xAD, 0xFE, 
	0x22, 0x6B, 0x16, 0x84, 0x78, 0x6F, 0x48, 0x9F, 0x22, 0x6F, 0x0E, 0x5A, 0xCD, 0x19, 0x57, 0x9A, 
	0x65, 0x20, 0x14, 0xBA, 0x96, 0x36, 0xD9, 0xB0, 0xF3, 0x1A, 0x16, 0x0D, 0xF3, 0xB9, 0x58, 0xFB, 
	0xEF, 0xF8, 0x24, 0x27, 0xFC, 0x1B, 0x83, 0xE0, 0x9F, 0xD8, 0x3F, 0x55, 0xD3, 0x7E, 0x20, 0x7C, 
	0x48, 0xB8, 0xB0, 0xF8, 0x81, 0xF1, 0x4A, 0x08, 0xD1, 0xED, 0xE3, 0xF2, 0xBC, 0xCD, 0x1B, 0xC3, 
	0xD2, 0x03, 0x90, 0xD6, 0xEA, 0xEA, 0x1A, 0x79, 0x94, 0x8C, 0x89, 0xE4, 0x55, 0xDA, 0x70, 0x55, 
	0x15, 0x94, 0x3D, 0x7E, 0x9C, 0x0E, 0x05, 0x00, 0x03, 0x8A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 
	0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 
	0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 
	0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0x28, 0xA2, 
	0x80, 0x0A, 0x28, 0xA2, 0x80, 0x0A, 0xE0, 0x7F, 0x68, 0x0F, 0xD9, 0x6B, 0xE1, 0xCF, 0xED, 0x57, 
	0xE1, 0x06, 0xD0, 0x7E, 0x24, 0x78, 0x27, 0xC3, 0x7E, 0x34, 0xD2, 0xF0, 0xC1, 0x21, 0xD5, 0xAC, 
	0x52, 0xE1, 0xAD, 0xCB, 0x0C, 0x16, 0x89, 0xD8, 0x6F, 0x89, 0xB1, 0xFC, 0x48, 0x55, 0xBD, 0xEB, 
	0xBE, 0xA2, 0x80, 0x3F, 0x2A, 0x7F, 0x68, 0xCF, 0xF8, 0x34, 0x4B, 0xF6, 0x6D, 0xF8, 0xAF, 0x79, 
	0x75, 0x79, 0xE0, 0xBD, 0x63, 0xC7, 0x9F, 0x0C, 0xEE, 0x67, 0x3B, 0x92, 0xDA, 0xCE, 0xFD, 0x75, 
	0x3D, 0x3E, 0x23, 0xCF, 0x48, 0xEE, 0x83, 0x4B, 0xDF, 0xA7, 0x9D, 0x8C, 0x01, 0x8C, 0x57, 0xCD, 
	0x1A, 0xCF, 0xFC, 0x19, 0xCD, 0xF1, 0x1B, 0xE1, 0xCE, 0xA2, 0xB3, 0xFC, 0x37, 0xFD, 0xA4, 0xED, 
	0x6D, 0xFC, 0xA6, 0xDF, 0x17, 0xDA, 0x34, 0x6B, 0xAD, 0x26, 0x44, 0x23, 0xA7, 0xCF, 0x6F, 0x73, 
	0x27, 0x3F, 0xED, 0x00, 0x0D, 0x7E, 0xF6, 0xD1, 0x40, 0x1F, 0x80, 0x71, 0x7F, 0xC1, 0xAF, 0x9F, 
	0xB6, 0x7D, 0xE4, 0xB3, 0x43, 0x79, 0xFB, 0x54, 0x69, 0xA6, 0xC6, 0xE3, 0x89, 0x02, 0xF8, 0x9B, 
	0x5E, 0x93, 0xCC, 0xC0, 0xC0, 0xCA, 0x32, 0x05, 0xE7, 0x27, 0x8C, 0xE0, 0x60, 0x63, 0xA9, 0xAD, 
	0xDF, 0x07, 0x7F, 0xC1, 0x98, 0x9A, 0xB7, 0x89, 0x35, 0x34, 0xBE, 0xF8, 0x83, 0xFB, 0x45, 0xBE, 
	0xA1, 0x36, 0xE0, 0xD2, 0xA5, 0x9F, 0x86, 0xE4, 0xB9, 0x92, 0x42, 0x38, 0xFF, 0x00, 0x5F, 0x35, 
	0xD0, 0x23, 0xFE, 0xF8, 0x3F, 0x4A, 0xFD, 0xDF, 0xA2, 0x80, 0x3F, 0x38, 0xFF, 0x00, 0x65, 0xFF, 
	0x00, 0xF8, 0x35, 0xB3, 0xF6, 0x55, 0xFD, 0x9E, 0x2F, 0x2D, 0xEF, 0xF5, 0x8D, 0x0F, 0xC4, 0x1F, 
	0x13, 0xF5, 0x38, 0x40, 0x62, 0xDE, 0x2A, 0xD4, 0x7C, 0xCB, 0x33, 0x20, 0xC8, 0x2D, 0xF6, 0x58, 
	0x16, 0x38, 0x98, 0x1C, 0x9F, 0x92, 0x51, 0x22, 0xFB, 0x74, 0xAF, 0xD0, 0x3F, 0x01, 0x7C, 0x3B, 
	0xF0, 0xFF, 0x00, 0xC2, 0xBF, 0x0A, 0xDA, 0x68, 0x5E, 0x18, 0xD0, 0xF4, 0x7F, 0x0D, 0xE8, 0x96, 
	0x0B, 0xB2, 0xDB, 0x4F, 0xD2, 0xEC, 0xE3, 0xB3, 0xB5, 0xB7, 0x1E, 0x89, 0x14, 0x60, 0x2A, 0x8F, 
	0xA0, 0xAD, 0x9A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 
	0x00, 0xA2, 0x8A, 0x28, 0x00, 0xA2, 0x8A, 0x28, 0x03, 0xFF, 0xD9
};

3 运行演示

  1. 正确下载程序,能够在设备管理器查看到Camera设备。
  1. 打开系统自带的照相机软件,显示如下图。
  1. 逻辑分析仪抓取波形如下,同步传输没有ACK包。

接下来讲解STM32 USB 复合设备传输通信实验,敬请期待。。。

相关推荐
牵牛老人31 分钟前
Qt处理USB摄像头开发说明与QtMultimedia与V4L2融合应用
stm32·单片机·qt
菜包eo1 小时前
基于二维码的视频合集高效管理与分发技术
音视频
文浩(楠搏万)1 小时前
用OBS Studio录制WAV音频,玩转语音克隆和文本转语音!
大模型·音视频·tts·wav·obs·声音克隆·语音录制
宇钶宇夕2 小时前
针对工业触摸屏维修的系统指南和资源获取途径
单片机·嵌入式硬件·自动化
和风化雨2 小时前
stm32的三种开发方式
stm32·单片机·嵌入式硬件
kanhao1003 小时前
三态逻辑详解:单片机GPIO、计算机总线系统举例
单片机·嵌入式硬件
小眼睛FPGA4 小时前
【RK3568+PG2L50H开发板实验例程】FPGA部分/紫光同创 IP core 的使用及添加
科技·嵌入式硬件·ai·fpga开发·gpu算力
竹照煜_ysn5 小时前
STM32
stm32·单片机·嵌入式硬件
蓬荜生灰6 小时前
永磁无刷电机旋转原理
单片机·嵌入式硬件
aqi008 小时前
FFmpeg开发笔记(七十二)Linux给FFmpeg集成MPEG-5视频编解码器EVC
android·ffmpeg·音视频·流媒体