娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

主機(jī)環(huán)境:Windows 7 SP1


開發(fā)環(huán)境:MDK5.14


目標(biāo)板:STM32F103C8T6


開發(fā)庫:STM32F1Cube庫和STM32_USB_Device_Library


現(xiàn)在開始分析VCP示例代碼,從最簡單的usbd_desc開始。USB設(shè)備使用描述符來報告其功能特性,描述符是一個已知格式的數(shù)據(jù)結(jié)構(gòu),USB規(guī)范中定義了以下幾種描述符:Device(設(shè)備)、Device_Qualifier(設(shè)備限定)、Configuration(配置)、Other_Speed_Configuration(其他速度配置)、Interface(接口)、Endpoint(端點(diǎn))、String(字符串)。usbd_desc文件主要提供USB字符串描述符,字符串描述符對于設(shè)備來說是可選的,是對其他描述符的文字說明,且字符串描述符使用UNICODE編碼,同時字符串描述符支持多國語言,當(dāng)請求字符串描述符時需要使用16禁止的LANGID來指定所期望的語言。使用字符串索引0來獲取設(shè)備所支持的語言。字符串描述的數(shù)據(jù)結(jié)構(gòu)如下所示:



第一個字節(jié)是該數(shù)據(jù)結(jié)構(gòu)的字節(jié)長度,第二個字節(jié)是字符串描述符類型,后面的字節(jié)是字符串內(nèi)容。有關(guān)字符串描述符類型值的定義在USB2.0規(guī)范的9.4章節(jié)的表9-5中,如下:



可以看到字符串描述符類型的值為常量3,與之相符的在usbd_def.h文件中95行有如下定義:


#define  USB_DESC_TYPE_DEVICE                              1

#define  USB_DESC_TYPE_CONFIGURATION                       2

#define  USB_DESC_TYPE_STRING                              3

#define  USB_DESC_TYPE_INTERFACE                           4

#define  USB_DESC_TYPE_ENDPOINT                            5

#define  USB_DESC_TYPE_DEVICE_QUALIFIER                    6

#define  USB_DESC_TYPE_OTHER_SPEED_CONFIGURATION           7

#define  USB_DESC_TYPE_BOS                                 0x0F


查看usbd_desc.h頭文件,內(nèi)容很簡單

/**

  ******************************************************************************

  * @file    USB_Device/CDC_Standalone/Inc/usbd_desc.h

  * @author  MCD Application Team

  * @version V1.2.0

  * @date    31-July-2015

  * @brief   Header for usbd_desc.c module

  ******************************************************************************

  * @attention

  *

  *

? COPYRIGHT(c) 2015 STMicroelectronics

  *

  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");

  * You may not use this file except in compliance with the License.

  * You may obtain a copy of the License at:

  *

  *        http://www.st.com/software_license_agreement_liberty_v2

  *

  * Unless required by applicable law or agreed to in writing, software

  * distributed under the License is distributed on an "AS IS" BASIS,

  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

  * See the License for the specific language governing permissions and

  * limitations under the License.

  *

  ******************************************************************************

  */

 

/* Define to prevent recursive inclusion -------------------------------------*/

#ifndef __USBD_DESC_H

#define __USBD_DESC_H

 

/* Includes ------------------------------------------------------------------*/

#include "usbd_def.h"

 

/* Exported types ------------------------------------------------------------*/

/* Exported constants --------------------------------------------------------*/

#define         DEVICE_ID1          (0x1FFFF7E8)

#define         DEVICE_ID2          (0x1FFFF7EC)

#define         DEVICE_ID3          (0x1FFFF7F0)

 

#define  USB_SIZ_STRING_SERIAL      0x1A

 

/* Exported macro ------------------------------------------------------------*/

/* Exported functions ------------------------------------------------------- */

extern USBD_DescriptorsTypeDef VCP_Desc;

 

#endif /* __USBD_DESC_H */

 

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/


這里有三個宏定義DEVICE_ID1、DEVICE_ID2、DEVICE_ID3,這三個值是STM32芯片產(chǎn)品唯一身份標(biāo)識,可以用作USB字符序列號(96位),該寄存器是只讀的。詳情參考STM32參考手冊的設(shè)備電子簽名章節(jié)。此外,該文件還引用了一個數(shù)據(jù)結(jié)構(gòu)USBD_DescriptorsTypeDef,該結(jié)構(gòu)是一個函數(shù)指針集合。


/* USB Device descriptors structure */

typedef struct

{

  uint8_t  *(*GetDeviceDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);  

  uint8_t  *(*GetLangIDStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); 

  uint8_t  *(*GetManufacturerStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);  

  uint8_t  *(*GetProductStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);  

  uint8_t  *(*GetSerialStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);  

  uint8_t  *(*GetConfigurationStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length);  

  uint8_t  *(*GetInterfaceStrDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); 

#if (USBD_LPM_ENABLED == 1)

  uint8_t  *(*GetBOSDescriptor)( USBD_SpeedTypeDef speed , uint16_t *length); 

#endif  

} USBD_DescriptorsTypeDef;

用于獲取各種描述符,主要是獲取字符串描述符,與之對應(yīng)的下標(biāo)在usbd_def.h的66行


#define  USBD_IDX_LANGID_STR                            0x00 

#define  USBD_IDX_MFC_STR                               0x01 

#define  USBD_IDX_PRODUCT_STR                           0x02

#define  USBD_IDX_SERIAL_STR                            0x03 

#define  USBD_IDX_CONFIG_STR                            0x04 

#define  USBD_IDX_INTERFACE_STR                         0x05 

注意USBD_DescripotrsTypeDef結(jié)構(gòu)中的GetDeviceDescriptor不是獲取字符串描述符,同時前面提到使用索引號0來獲取設(shè)備所支持的語言,因此這里定義USBD_IDX_LANGID_STR為0,至于其他索引號值是否有標(biāo)準(zhǔn)定義,暫時為找到出處。該結(jié)構(gòu)實體定義在usbd_desc.c文件中如下


USBD_DescriptorsTypeDef VCP_Desc = {

  USBD_VCP_DeviceDescriptor,

  USBD_VCP_LangIDStrDescriptor, 

  USBD_VCP_ManufacturerStrDescriptor,

  USBD_VCP_ProductStrDescriptor,

  USBD_VCP_SerialStrDescriptor,

  USBD_VCP_ConfigStrDescriptor,

  USBD_VCP_InterfaceStrDescriptor,  

};


稍后來看各個函數(shù),在usbd_desc.c文件的前面有如下定義


#define USBD_VID                      0x0483

#define USBD_PID                      0x5740

#define USBD_LANGID_STRING            0x409

#define USBD_MANUFACTURER_STRING      "STMicroelectronics"

#define USBD_PRODUCT_FS_STRING        "STM32 Virtual ComPort in FS Mode"

#define USBD_CONFIGURATION_FS_STRING  "VCP Config"

#define USBD_INTERFACE_FS_STRING      "VCP Interface"

USBD_VID和USBD_PID分別是廠商ID、產(chǎn)品ID,這兩個ID需要向USB組織申請,不是免費(fèi)的,當(dāng)前該ID列表可以在以下網(wǎng)址查看http://www.linux-usb.org/usb.ids,通過查看可知0x0483是STMicroelectronics申請的,0x5740對應(yīng)的產(chǎn)品是STM32F407,ST完整列表如下:

語言ID0x409指的是English(United States),該值可以在USB_LANGIDs.pdf文檔中找到,如下:

現(xiàn)在來分析獲取描述符函數(shù),首先從獲取語言ID開始,將代碼整合一下,方便查看,如下:



#define  USB_LEN_LANGID_STR_DESC                        0x04

 

/* USB Standard Device Descriptor */

const uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC]= 

{

  USB_LEN_LANGID_STR_DESC,         

  USB_DESC_TYPE_STRING,       

  LOBYTE(USBD_LANGID_STRING),

  HIBYTE(USBD_LANGID_STRING), 

};

 

/**

  * @brief  Returns the LangID string descriptor.        

  * @param  speed: Current device speed

  * @param  length: Pointer to data length variable

  * @retval Pointer to descriptor buffer

  */

uint8_t *USBD_VCP_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)

{

  *length = sizeof(USBD_LangIDDesc);  

  return (uint8_t*)USBD_LangIDDesc;

}

USBD_VCP_LangIDStrDescriptor函數(shù)最終是要返回一個語言ID數(shù)組結(jié)構(gòu),且以UNICODE編碼,如下:


由于這里只支持英文,因此這里bLength為4,bDescriptorType為3,LANGID為0x409。產(chǎn)品、廠商、配置、接口字符串描述符所對應(yīng)的函數(shù)是同一種結(jié)構(gòu),說明一個即可



/**

  * @brief  Returns the manufacturer string descriptor. 

  * @param  speed: Current device speed

  * @param  length: Pointer to data length variable

  * @retval Pointer to descriptor buffer

  */

uint8_t *USBD_VCP_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)

{

  USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length);

  return USBD_StrDesc;

}

這里是將ASCII編碼的字符串轉(zhuǎn)成UNICODE編碼的字符串,同時UNICODE編碼的字符串不是以NULL作為結(jié)束。USBD_GetString()方法定義在usbd_ctlreq.c文件中,如下:


/**

  * @brief  USBD_GetString

  *         Convert Ascii string into unicode one

  * @param  desc : descriptor buffer

  * @param  unicode : Formatted string buffer (unicode)

  * @param  len : descriptor length

  * @retval None

  */

void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len)

{

  uint8_t idx = 0;

  

  if (desc != NULL) 

  {

    *len =  USBD_GetLen(desc) * 2 + 2;    

    unicode[idx++] = *len;

    unicode[idx++] =  USB_DESC_TYPE_STRING;

    

    while (*desc != '\0') 

    {

      unicode[idx++] = *desc++;

      unicode[idx++] =  0x00;

    }

  } 

}

 

/**

  * @brief  USBD_GetLen

  *         return the string length

   * @param  buf : pointer to the ascii string buffer

  * @retval string length

  */

static uint8_t USBD_GetLen(uint8_t *buf)

{

    uint8_t  len = 0;

 

    while (*buf != '\0') 

    {

        len++;

        buf++;

    }

 

    return len;

}


接著分析獲取序列號字符串描述符方法,整理如下:


/**

  * @brief  Returns the serial number string descriptor.        

  * @param  speed: Current device speed

  * @param  length: Pointer to data length variable

  * @retval Pointer to descriptor buffer

  */

uint8_t *USBD_VCP_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)

{

  *length = USB_SIZ_STRING_SERIAL;

  

  /* Update the serial number string descriptor with the data from the unique ID*/

  Get_SerialNum();

  

  return USBD_StringSerial;

}

 

/**

  * @brief  Create the serial number string descriptor 

  * @param  None 

  * @retval None

  */

static void Get_SerialNum(void)

{

  uint32_t deviceserial0, deviceserial1, deviceserial2;

  

  deviceserial0 = *(uint32_t*)DEVICE_ID1;

  deviceserial1 = *(uint32_t*)DEVICE_ID2;

  deviceserial2 = *(uint32_t*)DEVICE_ID3;

  

  deviceserial0 += deviceserial2;

  

  if (deviceserial0 != 0)

  {

    IntToUnicode (deviceserial0, &USBD_StringSerial[2] ,8);

    IntToUnicode (deviceserial1, &USBD_StringSerial[18] ,4);

  }

}

 

/**

  * @brief  Convert Hex 32Bits value into char 

  * @param  value: value to convert

  * @param  pbuf: pointer to the buffer 

  * @param  len: buffer length

  * @retval None

  */

static void IntToUnicode (uint32_t value , uint8_t *pbuf , uint8_t len)

{

  uint8_t idx = 0;

  

  for( idx = 0 ; idx < len ; idx ++)

  {

    if( ((value >> 28)) < 0xA )

    {

      pbuf[2* idx] = (value >> 28) + '0';

    }

    else

    {

      pbuf[2* idx] = (value >> 28) + 'A' - 10; 

    }

    

    value = value << 4;

    

    pbuf[2* idx + 1] = 0;

  }

}

這里取序列號只取了48位,取了deviceserial0的32位和deviceserial1的高16位,注意IntToUnicode()方法即可,以16進(jìn)制進(jìn)行轉(zhuǎn)換,從高位開始,序列號字符串描述符字節(jié)長度為0x1A=12*2(序列號內(nèi)容)+2(前面兩個字節(jié))。至此,字符串描述符的獲取分析完畢,還剩下一個設(shè)備描述符的獲取,如下:


/* USB Standard Device Descriptor */

const uint8_t hUSBDDeviceDesc[USB_LEN_DEV_DESC]= {

  0x12,                       /* bLength */

  USB_DESC_TYPE_DEVICE,       /* bDescriptorType */

  0x00,                       /* bcdUSB */

  0x02,   /* USB2.0 spec*/

  0x00,                       /* bDeviceClass */

  0x00,                       /* bDeviceSubClass */

  0x00,                       /* bDeviceProtocol */

  USB_MAX_EP0_SIZE,           /* bMaxPacketSize */

  LOBYTE(USBD_VID),           /* idVendor */

  HIBYTE(USBD_VID),           /* idVendor */

  LOBYTE(USBD_PID),           /* idVendor */

  HIBYTE(USBD_PID),           /* idVendor */

  0x00,                       /* bcdDevice rel. 2.00 */

  0x02,

  USBD_IDX_MFC_STR,           /* Index of manufacturer string */

  USBD_IDX_PRODUCT_STR,       /* Index of product string */

  USBD_IDX_SERIAL_STR,        /* Index of serial number string */

  USBD_MAX_NUM_CONFIGURATION  /* bNumConfigurations */

}; /* USB_DeviceDescriptor */

 

/**

  * @brief  Returns the device descriptor. 

  * @param  speed: Current device speed

  * @param  length: Pointer to data length variable

  * @retval Pointer to descriptor buffer

  */

uint8_t *USBD_VCP_DeviceDescriptor(USBD_SpeedTypeDef speed, uint16_t *length)

{

  *length = sizeof(hUSBDDeviceDesc);

  return (uint8_t*)hUSBDDeviceDesc;

}


設(shè)備描述符的獲取主要看hUSBDDeviceDesc數(shù)組結(jié)構(gòu),該數(shù)組長度為18個字節(jié),與之對應(yīng)的數(shù)據(jù)結(jié)構(gòu)在USB2.0規(guī)范的9.6章節(jié)有說明,一個設(shè)備只有一個設(shè)備描述符,設(shè)備描述符數(shù)據(jù)結(jié)構(gòu)如下:

根據(jù)此結(jié)構(gòu)來分析hUSBDDeviceDesc內(nèi)容的含義,符合USB2.0規(guī)范,bDeviceClass置0,表明一個配置里每個接口指定其各自的類信息同時不同的接口獨(dú)立地操作。由于bDeviceClass字段置0,因此bDeviceSubClass字段同樣置0。bDeviceProtocol置0,設(shè)備不使用特定類協(xié)議。端點(diǎn)0最大包大小為64字節(jié),接著填充廠商ID和產(chǎn)品ID,bcdDevice標(biāo)記設(shè)備穩(wěn)定版本,這里為2.0版本,當(dāng)然可以修改該值。iManufacturer、iProduct、iSerialNumber分別是在字符串描述符中各自的索引號,前面有提到。最后標(biāo)記配置數(shù)為1。USB設(shè)備可以有一個或多個配置,每個配置有一個或多個接口,每個接口有一個或多個端點(diǎn)。至此,usbd_desc文件分析完畢。主要為各個描述符的獲取。


關(guān)鍵字:STM32  USB 引用地址:STM32 USB學(xué)習(xí)筆記3

上一篇:STM32 USB學(xué)習(xí)筆記4
下一篇:STM32 USB學(xué)習(xí)筆記2

推薦閱讀

電容式電壓互感器技術(shù)規(guī)范?電容式電壓互感器技術(shù)參數(shù)a.買方應(yīng)認(rèn)真填寫技術(shù)參數(shù)響應(yīng)表中買方要求值,賣方應(yīng)認(rèn)真填寫技術(shù)參數(shù)響應(yīng)表中賣方保證值。技術(shù)參數(shù)響應(yīng)表b.投標(biāo)人提供的設(shè)備技術(shù)規(guī)范應(yīng)與本技術(shù)規(guī)范書中規(guī)定的要求一致,如不填寫技術(shù)偏差表則視為完全滿足本技術(shù)規(guī)范的要求。如有偏差投標(biāo)人應(yīng)如實、認(rèn)真詳細(xì)的填寫技術(shù)偏差表。6 質(zhì)量保證和試驗6.1 ...
美國公布了一份長達(dá)35頁的《2016-2045年新興科技趨勢報告》。該報告是在美國過去五年內(nèi)由政府機(jī)構(gòu)、咨詢機(jī)構(gòu)、智囊團(tuán)、科研機(jī)構(gòu)等發(fā)表的32份科技趨勢相關(guān)研究調(diào)查報告的基礎(chǔ)上提煉形成的。通過對近700項科技趨勢的綜合比對分析,最終明確了20項最值得關(guān)注的科技發(fā)展趨勢。該報告的發(fā)布一是為了幫助美國相關(guān)部門對未來30年可能影響國家力量的核心科技有一個...
據(jù)上海證券報報道,華為舉行了產(chǎn)品與解決方案線上發(fā)布會。華為中國運(yùn)營商業(yè)務(wù)部副總裁楊濤表示,截至目前,全球已發(fā)布40部5G手機(jī),中國廠商貢獻(xiàn)了超過30部。 據(jù)不完全統(tǒng)計,目前中國廠商已經(jīng)發(fā)布的5G手機(jī)包括華為Mate 30 5G系列、華為Mate 20 X、華為Mate X、華為Mate Xs、...
引言隨著TFT彩色液晶技術(shù)不斷發(fā)展成熟以及人們對人機(jī)界面感官性需求的不斷提高,越來越多的產(chǎn)品選用帶觸摸的TFT彩屏作為人機(jī)界面。本文針對RA8875的性能,提出了一種折中的解決方法。1 RA8875特性分析RA8875[1]是瑞佑公司推出的256/64K色TFTLCD控制器,最大支持800×480分辨率。RA8875的內(nèi)部結(jié)構(gòu)圖略——編者注。在本設(shè)計中,主要涉及到RA8875的以下功能...

史海拾趣

問答坊 | AI 解惑

CANopen 協(xié)議介紹(中文)

CANopen 協(xié)議介紹(中文)…

查看全部問答∨

不可多得51單片機(jī)入門教材

在網(wǎng)上找了N年才找到不可多得51單片機(jī)入門教材。如果你是高手就沒有必要看了。如果你是入門級的嘿嘿。。。…

查看全部問答∨

高功率微波武器即將進(jìn)入武器庫

若干高功率微波(HPM)技術(shù)已走向成熟,它們正在從工程與制造階段向戰(zhàn)術(shù)武器階段過渡,目前很可能在進(jìn)攻伊拉克的戰(zhàn)斗中看到首次使用微波武器.本文簡要介紹美、英、俄三國發(fā)展HPM武器技術(shù)的計劃,評述了幾種典型HPM武器研究的重大進(jìn)展,最后討論了HPM武器 ...…

查看全部問答∨

NIOS設(shè)計過程實例講解

如果設(shè)計稍顯復(fù)雜,那么對底層細(xì)節(jié)的過多關(guān)注就會成為一種累贅。     試想我們平時在電腦上編寫C程序,比如在顯示器上輸出一行字,我們只用一句printf()即可完成,至于打印命令怎么傳到顯示芯片上,哪個芯片管腳怎么 變化,又怎么傳到顯 ...…

查看全部問答∨

113586004 已開通了《智能家居系統(tǒng)》討論群

希望參加《智能家居系統(tǒng)》的網(wǎng)友添加113586004群,在群內(nèi)討論問題。 [ 本帖最后由 zhaojun_xf 于 2010-7-31 10:28 編輯 ]…

查看全部問答∨

EM200模塊收發(fā)中文短信的問題

我使用串口與模塊進(jìn)行通信,來收發(fā)中文短信,并將串口InputMode屬性設(shè)為文本方式。 當(dāng)通過串口,來接收CDMA模塊發(fā)送的漢字Unicode碼時,發(fā)現(xiàn),串口已將Unicode碼以字節(jié)為單位轉(zhuǎn)換為ASCII字符。 現(xiàn)在,我想要恢復(fù)這一過程,將ASCII字符還原為Unico ...…

查看全部問答∨

各位大神

給位大神求教:      與ALPS product No   HSPPARC002傳感器功能相似的傳感器有什么?國外傳感器廠商 …

查看全部問答∨

2440學(xué)習(xí)(六)ADC與蜂鳴器驅(qū)動

本帖最后由 lonerzf 于 2014-7-23 10:14 編輯 字符驅(qū)動學(xué)習(xí)了幾天也差不多大概知道怎么寫了。 但是,如果和外設(shè)模塊打交道,又會遇到問題,其中就有地址空間的轉(zhuǎn)換。 主要參考文章: www.360doc.com/content/10/1011/07/1317564_60018145.shtml ...…

查看全部問答∨

msp430的有用書籍

lz新人,需要芯幣,第四個麻煩捧捧場吧之后我編的一些程序會與大家分享的 …

查看全部問答∨
小廣播
設(shè)計資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號

 
EEWorld服務(wù)號

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號 京ICP備10001474號-1 電信業(yè)務(wù)審批[2006]字第258號函 京公網(wǎng)安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 名山县| 绩溪县| 筠连县| 泰兴市| 尉犁县| 广州市| 双流县| 白河县| 明星| 嵊州市| 东阿县| 芦山县| 上林县| 尼木县| 中卫市| 平乡县| 商都县| 溧阳市| 安吉县| 广饶县| 扶沟县| 邹平县| 克山县| 浮山县| 黔西| 阿合奇县| 永登县| 汉川市| 和顺县| 澎湖县| 琼结县| 龙山县| 陵川县| 紫阳县| 桂阳县| 东山县| 承德县| 丰原市| 云安县| 霞浦县| 万山特区|