日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]usb_prop.c文件可以說是一個(gè)蠻重要的文件,因?yàn)閁SB的許多處理函數(shù)都在這里定義。在無論是在USB的建立階段、數(shù)據(jù)階段還是狀態(tài)階段的一些處理都在這個(gè)文件,USB標(biāo)準(zhǔn)函數(shù)請(qǐng)求的函數(shù)也在這個(gè)文件里。usb_prop.c一開始就是

usb_prop.c文件可以說是一個(gè)蠻重要的文件,因?yàn)閁SB的許多處理函數(shù)都在這里定義。在無論是在USB的建立階段、數(shù)據(jù)階段還是狀態(tài)階段的一些處理都在這個(gè)文件,USB標(biāo)準(zhǔn)函數(shù)請(qǐng)求的函數(shù)也在這個(gè)文件里。

usb_prop.c一開始就是一連串的結(jié)構(gòu)體,如下:

DEVICE Device_Table =

{

EP_NUM, //被使用的端點(diǎn)數(shù)

1 //可以使用的端點(diǎn)數(shù)

};


DEVICE_PROP Device_Property =//注冊(cè)一些CustomHID函數(shù)

{

CustomHID_init,//CustomHID的初始化函數(shù)

CustomHID_Reset,//CustomHID的復(fù)位函數(shù)

CustomHID_Status_In,//CustomHID狀態(tài)輸入函數(shù)

CustomHID_Status_Out,//CustomHID狀態(tài)輸出函數(shù)

CustomHID_Data_Setup,//CustomHID的處理有數(shù)據(jù)階段的特殊類請(qǐng)求函數(shù)

CustomHID_NoData_Setup,//CustomHID的處理沒有數(shù)據(jù)階段特殊類請(qǐng)求函數(shù)

CustomHID_Get_Interface_Setting,//CustomHID獲取接口及備用接口設(shè)置(是否可用)

CustomHID_GetDeviceDescriptor,//CustomHID獲取設(shè)備描述符

CustomHID_GetConfigDescriptor,//CustomHID獲取配置描述符

CustomHID_GetStringDescriptor,//CustomHID獲取字符串描述符

0,//當(dāng)前庫未使用

0x40 /*MAX PACKET SIZE*/ //最大的包長度為64字節(jié)

};


/*注冊(cè)USB標(biāo)準(zhǔn)請(qǐng)求的實(shí)現(xiàn)函數(shù)*/

USER_STANDARD_REQUESTS User_Standard_Requests =

{

CustomHID_GetConfiguration,//獲取配置請(qǐng)求

CustomHID_SetConfiguration,//設(shè)置配置請(qǐng)求

CustomHID_GetInterface,//獲取接口請(qǐng)求

CustomHID_SetInterface,//設(shè)置接口請(qǐng)求

CustomHID_GetStatus,//獲取狀態(tài)請(qǐng)求

CustomHID_ClearFeature,//清除屬性請(qǐng)求

CustomHID_SetEndPointFeature,//設(shè)置端點(diǎn)屬性請(qǐng)求

CustomHID_SetDeviceFeature,//設(shè)置設(shè)備屬性請(qǐng)求

CustomHID_SetDeviceAddress//設(shè)置設(shè)備地址請(qǐng)求

};


/*注冊(cè)設(shè)備描述符信息*/

ONE_DESCRIPTOR Device_Descriptor =

{

(uint8_t*)CustomHID_DeviceDescriptor, //注冊(cè)設(shè)備描述符數(shù)組

CUSTOMHID_SIZ_DEVICE_DESC //設(shè)備描述符的長度

};


/*注冊(cè)設(shè)備描述符信息*/

ONE_DESCRIPTOR Config_Descriptor =

{

(uint8_t*)CustomHID_ConfigDescriptor, //注冊(cè)配置描述符數(shù)組

CUSTOMHID_SIZ_CONFIG_DESC //配置描述符的長度

};


/*注冊(cè)報(bào)告描述符信息*/

ONE_DESCRIPTOR CustomHID_Report_Descriptor =

{

(uint8_t *)CustomHID_ReportDescriptor, //注冊(cè)報(bào)告描述符數(shù)組

CUSTOMHID_SIZ_REPORT_DESC //報(bào)告描述符的長度

};


/*注冊(cè)HID描述符信息*/

ONE_DESCRIPTOR CustomHID_Descriptor =

{

(uint8_t*)CustomHID_ConfigDescriptor + CUSTOMHID_OFF_HID_DESC, //注冊(cè)HID描述符數(shù)組

CUSTOMHID_SIZ_HID_DESC //HID數(shù)組的長度

};


/*注冊(cè)字符串描述符,包括語言ID、廠商、產(chǎn)品、序列號(hào)描述符*/

ONE_DESCRIPTOR String_Descriptor[4] =

{

{(uint8_t*)CustomHID_StringLangID, CUSTOMHID_SIZ_STRING_LANGID},//注冊(cè)語言字符串描述符數(shù)組

{(uint8_t*)CustomHID_StringVendor, CUSTOMHID_SIZ_STRING_VENDOR},//注冊(cè)廠商字符串描述符數(shù)組

{(uint8_t*)CustomHID_StringProduct, CUSTOMHID_SIZ_STRING_PRODUCT},//注冊(cè)產(chǎn)品字符串描述符數(shù)組

{(uint8_t*)CustomHID_StringSerial, CUSTOMHID_SIZ_STRING_SERIAL}//注冊(cè)序列號(hào)字符串描述符數(shù)組

};


應(yīng)該看了很明白,這一系列的結(jié)構(gòu)體就是注冊(cè)一些處理函數(shù)。我們一個(gè)個(gè)分析。

先來說下 DEVICE Device_Table這個(gè)結(jié)構(gòu)體,DEVICE這個(gè)結(jié)構(gòu)體類型在usb_core.h中定義:

typedef struct _DEVICE

{

uint8_t Total_Endpoint; /*被使用的端點(diǎn)數(shù)*/

uint8_t Total_Configuration;/*還可以用的端點(diǎn)數(shù)*/

}

DEVICE;


這個(gè)結(jié)構(gòu)體類型很簡單,在結(jié)構(gòu)體中定義了已經(jīng)被使用的端點(diǎn)和沒有被使用的端點(diǎn),把他們兩個(gè)放在一起方便查詢和管理。




接下去的說說DEVICE_PROP

Device_Property 這個(gè)類型的結(jié)構(gòu)體。這個(gè)結(jié)構(gòu)體的前10個(gè)元素都是函數(shù)指針類型的,把一些常用的函數(shù)放在這里,而函數(shù)定義都在該結(jié)構(gòu)體之后定義,有沒有覺得像是語文中的關(guān)鍵句,把整個(gè)文件的概要全部濃縮在這個(gè)結(jié)構(gòu)體中了,只要看這個(gè)結(jié)構(gòu)體就可以把整個(gè)文件做什么了解個(gè)七七八八了。這樣的結(jié)構(gòu)使用起來也非常方便,比如說我想要使用CustomHID_init函數(shù),只要寫Device_Property.CustomHID_init不就可以了。我們必須學(xué)會(huì)這種方法。

DEVICE_PROP這個(gè)結(jié)構(gòu)體類型還是在usb_core.h中定義:

typedef struct _DEVICE_PROP

{

void (*Init)(void); /*初始化設(shè)備*/

void (*Reset)(void); /*復(fù)位該設(shè)備*/


/*在控制傳輸中分三個(gè)過程:1.建立過程,2、可選的數(shù)據(jù)過程,3、狀態(tài)過程*/

/* Device dependent process after the status stage */

void (*Process_Status_IN)(void);/*狀態(tài)過程中,處理IN令牌包*/

void (*Process_Status_OUT)(void);/*狀態(tài)過程中,處理OUT令牌包*/


/*在建立階段的過程中,會(huì)有很多特殊類請(qǐng)求的數(shù)據(jù)階段stage */

/*所有在數(shù)據(jù)階段的特殊類請(qǐng)求都在Class_Data_Setup()函數(shù)中處理

Class_Data_Setup() 會(huì)響應(yīng)去檢查所有的特殊類請(qǐng)求,同時(shí)根據(jù)請(qǐng)求填充ENDPOINT_INFO結(jié)構(gòu)信息

如果IN令牌包是期望的令牌包,則wLength和wOffset兩個(gè)域會(huì)分別被填充成要發(fā)送的總字節(jié)數(shù)和要開始傳輸?shù)奈恢?/p>

如果OUT令牌包是期盼的令牌包,則rLength和rOffser將會(huì)分別被填充成要接收的總字節(jié)數(shù)和要接收數(shù)據(jù)的緩沖區(qū)起始地址

如果請(qǐng)求有效,Class_Data_Setup返回SUCCESS,否則返回UNSUPPORT


注意:

因?yàn)镚ET_CONFIGURATION和GET_INTERFACE兩個(gè)請(qǐng)求跟個(gè)別的類聯(lián)系密切,所以他們會(huì)在該函數(shù)中檢查和處理*/

RESULT (*Class_Data_Setup)(uint8_t RequestNo);


/*在建立過程中,會(huì)有很多特殊類請(qǐng)求的無數(shù)據(jù)階段*/

/*所有的沒有數(shù)據(jù)階段的特殊請(qǐng)求都在Class_NoData_Setup這個(gè)函數(shù)中處理

Class_NoData_Setup()

會(huì)響應(yīng)去檢查所有特殊類請(qǐng)求,并且執(zhí)行請(qǐng)求

注意:

因?yàn)镾ET_CONFIGURATION和SET_INTERFACE這兩個(gè)請(qǐng)求跟個(gè)別的類聯(lián)系密切,他們都會(huì)在該函數(shù)中被檢查和處理*/

RESULT (*Class_NoData_Setup)(uint8_t RequestNo);


/*Class_Get_Interface_Setting()

這個(gè)函數(shù)時(shí)在usb_core.c文件中被調(diào)用來測(cè)試應(yīng)用程序是否支持被選中的接口和備用接口

這個(gè)函數(shù)時(shí)由用戶寫的。如果應(yīng)用程序支持接口和備用接口,則必須返回"SUCCESS",否則,返回"UNSUPPORT"*/


RESULT (*Class_Get_Interface_Setting)(uint8_t Interface, uint8_t AlternateSetting);


uint8_t* (*GetDeviceDescriptor)(uint16_t Length);

uint8_t* (*GetConfigDescriptor)(uint16_t Length);

uint8_t* (*GetStringDescriptor)(uint16_t Length);


/* 這個(gè)字段不是用于當(dāng)前庫版本。它是只保持兼容以前的版本*/

void* RxEP_buffer;

uint8_t MaxPacketSize;


}DEVICE_PROP;





接下去是USER_STANDARD_REQUESTS User_Standard_Requests這個(gè)結(jié)構(gòu)體,在這個(gè)結(jié)構(gòu)體中主要注冊(cè)了USB標(biāo)準(zhǔn)請(qǐng)求的實(shí)現(xiàn)函數(shù),當(dāng)然這些函數(shù)也實(shí)在該結(jié)構(gòu)體后面定義的。跟上面的DEVICE_PROP

Device_Property結(jié)構(gòu)體類似,就不多講了。

USER_STANDARD_REQUESTS 結(jié)構(gòu)體也是在usb_core.h中定義:

typedef struct _USER_STANDARD_REQUESTS

{

void (*User_GetConfiguration)(void); /*獲取配置*/

void (*User_SetConfiguration)(void); /*設(shè)置配置*/

void (*User_GetInterface)(void); /*獲取接口*/

void (*User_SetInterface)(void); /*設(shè)置接口*/

void (*User_GetStatus)(void); /*獲取狀態(tài)*/

void (*User_ClearFeature)(void); /*清除特性*/

void (*User_SetEndPointFeature)(void); /*設(shè)置端點(diǎn)特性*/

void (*User_SetDeviceFeature)(void); /*設(shè)置設(shè)備特性*/

void (*User_SetDeviceAddress)(void); /*設(shè)置設(shè)備地址*/

}

USER_STANDARD_REQUESTS;



像ONE_DESCRIPTOR Device_Descriptor、ONE_DESCRIPTOR Config_Descriptor、ONE_DESCRIPTOR CustomHID_Report_Descriptor、ONE_DESCRIPTOR CustomHID_Descriptor、ONE_DESCRIPTOR String_Descriptor[4]這些結(jié)構(gòu)體都不仔細(xì)講了。貼出各個(gè)結(jié)構(gòu)體的定義,依舊在usb_core.h中:

typedef struct OneDescriptor

{

uint8_t *Descriptor;

uint16_t Descriptor_Size;

}

ONE_DESCRIPTOR, *PONE_DESCRIPTOR;



接下去上面各個(gè)結(jié)構(gòu)體注冊(cè)的函數(shù)貼出來:

/*******************************************************************************

* Function Name : CustomHID_init.

* Description : CustomHID Mouse init routine.初始化

* Input : None.

* Output : None.

* Return : None.

*******************************************************************************/

void CustomHID_init(void)

{


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

ID*/

Get_SerialNum();//獲取序列號(hào)


pInformation->Current_Configuration = 0;

/* Connect the device */

PowerOn();//上電


/* Perform basic device initialization operations */

USB_SIL_Init();//執(zhí)行基本的初始化操作,比如說設(shè)備IP和端點(diǎn)0的初始化


bDeviceState =

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉