版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
簡介STM32F105/7USB主模式庫的目的是為USB主模式應(yīng)用程序開發(fā)提供一個(gè)框架。庫代表了在STM32F105/7之上的USBOTG周邊底層驅(qū)動。它實(shí)現(xiàn)必要的軟件塊,目的是便于USB的主模式應(yīng)用程序開發(fā)。STM32F105/7USB主模式協(xié)議棧的庫支持以下兩個(gè)USB標(biāo)準(zhǔn)應(yīng)用類:■大批量存儲類(MSC)用于訪問USB閃存pendrives■人機(jī)接口設(shè)備類(HID)用于鍵盤和鼠標(biāo)設(shè)備目錄.68USB.68USB主模式的庫結(jié)構(gòu) 8 9 8 9 9 10 112.2庫內(nèi)核的描述。 2.2.1內(nèi)核狀態(tài)機(jī)。 2.2.2設(shè)備枚舉。 2.2.3控制傳輸狀態(tài)機(jī)。 .……11122.2.4USB的I/O請求模塊。.……11122.2.5主模式通道控制模塊。?…2.3類驅(qū)動程序。 13USB2.3類驅(qū)動程序。 13USB大批量存儲類(MSC)驅(qū)動程序。 USB人機(jī)接口設(shè)備類(HID)鼠標(biāo)鍵盤設(shè)備驅(qū)動。3庫用戶API和回調(diào)函數(shù)。3.1庫用戶API。 3.2用戶的回調(diào)函數(shù)。……3.2.1類的回調(diào)函數(shù)。…….3.2.2獨(dú)立類的回調(diào)函數(shù)。4演示固件。。。13172020 20 20 22254.1大容量存儲類演示?!?.1大容量存儲類演示?!?。。。254.1.1軟件初始化。。。。。254.1.2大容量存儲設(shè)備枚舉。。。。。254.1.3訪問大容量存儲器內(nèi)容。。。。。264.1.4Flashpendrive測試。。。。。264.2HID鼠標(biāo)和鍵盤演示。。。。。274.1.2大容量存儲設(shè)備枚舉。。。。。254.1.3訪問大容量存儲器內(nèi)容。。。。。264.1.4Flashpendrive測試。。。。。264.2HID鼠標(biāo)和鍵盤演示。。。。。274.2.1初始化準(zhǔn)備。。。。。274.2.2鼠標(biāo)或鍵盤設(shè)備枚舉。。。。。274.2.3.鼠標(biāo)演示。。。。。284.2.4鍵盤演示。。。。。28TOC\o"1-5"\h\z5已知的限制。 296修訂歷史。 30listof表表1內(nèi)核文件 7表2class文件 7表3枚舉請求 11表4USB的I/O請求模塊 12表5主模式通道控制模塊 12表6大容量存儲類模塊 13表7MSC的內(nèi)核模塊 15表8MSCBOT模塊 15表9MSCSCSI命令 16表10MSC文件系統(tǒng)接口功能 16表11efsl主API 17表12HID類模塊 17表13MSC內(nèi)核模塊的功能 18表14鼠標(biāo)和鍵盤初始化和HIDReport解碼功能 19表15測試U盤 27表16演示的足跡 28表17文件修訂歷史 30數(shù)字表圖1。文件夾結(jié)構(gòu)。 6圖2。USB主模式庫框圖結(jié)構(gòu)。 8圖3。內(nèi)核狀態(tài)機(jī)。 9圖4。設(shè)備枚舉。 10圖5。的MSC驅(qū)動器框圖結(jié)構(gòu)。 14圖6。MS設(shè)備枚舉。 25圖7。MS設(shè)備內(nèi)容的訪問。 26圖8。鼠標(biāo)演示。 28圖9。鍵盤演示。 281USB主模式包文件夾結(jié)構(gòu)STM32的USB主模式封裝庫具有以下文件結(jié)構(gòu):圖1。文件夾結(jié)構(gòu)ESTM32_USB_HOST_LIB_PACKAGE―i-LibrairiesJ1CMSIS-BSTM32_US0_HOST_Library—Class-iHID□MSC-rCore_HSTM32_USB_HOST_DriverTSTM3£F1O)r_SttlPeriph_Driver_HProject—iUSB_HOST_Example&—HID_KBrd_MousefflMSC—i-Utilities一STM32_EVAL」STM3210C_EVALThilrd_Party—efsl封裝庫文件夾具有如下組織結(jié)構(gòu)■庫CMSIS:微微控制器軟件接口標(biāo)準(zhǔn)文件一STM32_USB_HOST_Library:USB主模式庫文件一STM32_USB_HOST_Driver:STM32USB2.0OTG夕卜設(shè)低電平驅(qū)動STM32F10x_StdPeriph_Driver:STM32標(biāo)準(zhǔn)外設(shè)驅(qū)動程序■項(xiàng)目-_USB_HOST_EXAMPLES/HID_KBrd_Mouse:鼠標(biāo)和HID鍵盤演示文件-USB_HOST_EXAMPLES/MSC:大容量存儲類的演示文件■公用事業(yè)-STM32_EVAL/STM3210C_EVAL:STM3210C_EVALevalboard功能函數(shù)(GPIO,液晶顯示,時(shí)鐘配置,……)Third_Party/efsl:EFSLFAT文件系統(tǒng),用于大容量存儲例程USB主模式庫文件結(jié)構(gòu)USB主模式庫文件夾”stm32_usb_host」ibrary”是由兩個(gè)主要子文件夾構(gòu)成:■內(nèi)核:該文件夾包含USB主模式庫內(nèi)核文件。這些文件實(shí)現(xiàn)必要的功能,狀態(tài)機(jī)和數(shù)據(jù)結(jié)構(gòu)所需的:-設(shè)備的識別和枚舉,-USB控制傳輸管理,-為解決控制,大批量或中斷USB事務(wù)而設(shè)立的低級功能,-USB主模式通道配置?!鲱悾哼@個(gè)文件夾包含USB類管理所必需的文件。USB主模式庫支持兩種USB類:
-MSC:大批量存儲類-HID:為啟動鼠標(biāo)和鍵盤設(shè)備的人機(jī)接口設(shè)備類下表詳體說明了內(nèi)核文件和類文件:使內(nèi)核,設(shè)備枚舉和控制權(quán)轉(zhuǎn)移的狀態(tài)機(jī)生效USB標(biāo)準(zhǔn)請求需要在設(shè)備枚舉(USB9章)USB的I/O請求:USB事務(wù)包括控制,大批量和中斷通道請求USB使內(nèi)核,設(shè)備枚舉和控制權(quán)轉(zhuǎn)移的狀態(tài)機(jī)生效USB標(biāo)準(zhǔn)請求需要在設(shè)備枚舉(USB9章)USB的I/O請求:USB事務(wù)包括控制,大批量和中斷通道請求USB主模式控制信道(信道配置,分配,釋放……)在USB主模式庫中廣泛使用的宏定義DescriptionHID類管理HID鼠標(biāo)的具體例程HID鍵盤的具體例程大批量存儲類管理B0T”Bulk-0nly傳輸協(xié)議的實(shí)現(xiàn)SCSI標(biāo)準(zhǔn)命令的執(zhí)行一個(gè)帶有文件操作系統(tǒng)用于文件訪問的接口usbh_hid_core.c/.hHIDusbh_hid_mouse.c./husbh_hid_keyboard.c/.husbh_msc_core.c/.hMSCusbh_msc_bot.c./.husbh_msc_scsi.c/.husbh_msc_fs_interface.c./h2USB主模式的庫結(jié)構(gòu)2.1庫框圖結(jié)構(gòu)USB主模式庫具有以下框圖結(jié)構(gòu):圖2.USB主模式庫框圖結(jié)構(gòu)UserapplicationLibraryuserAPIs&callbacklunctions? 4STMIS2USBOTGSTMIS2USBOTGperipheralIdw-leveldriver$貲tem如上圖所示,USB主模式庫由兩個(gè)主要部分組成:內(nèi)核和類驅(qū)動程序。庫的核心主要由五塊構(gòu)成:■內(nèi)核狀態(tài)機(jī)■設(shè)備枚舉■控制傳輸狀態(tài)機(jī)■USB的I/O請求■USB主模式通道控制對于所有與類相關(guān)的操作,內(nèi)核狀態(tài)機(jī)都是操作一個(gè)特定的類驅(qū)動。在USB主模式庫目前的版本中,兩類驅(qū)動程序-HID和MSC已經(jīng)實(shí)現(xiàn)。這類驅(qū)動程序使用內(nèi)核層對底層驅(qū)動通信進(jìn)行服務(wù)。內(nèi)核和類驅(qū)動程序與用戶的應(yīng)用程序交流都主要是通過定義回調(diào)函數(shù)來實(shí)現(xiàn)的。不同的主模式模塊庫描述如下。2.2描述庫內(nèi)核2.2.1內(nèi)核狀態(tài)機(jī)下圖描述了庫的狀態(tài)機(jī):內(nèi)核狀態(tài)機(jī)有8個(gè)狀態(tài):■host_idle:主模式初始化后,內(nèi)核在這個(gè)狀態(tài)開始,在這個(gè)狀態(tài)下為USB設(shè)備連接進(jìn)行檢測。這種狀態(tài)也在當(dāng)一個(gè)設(shè)備斷開事件被檢測到的時(shí)進(jìn)入,同時(shí)也在當(dāng)不可恢復(fù)錯(cuò)誤發(fā)生時(shí)進(jìn)入?!鰄ost_issue_core_reset:當(dāng)設(shè)備為發(fā)出一個(gè)USB總線復(fù)位請求則進(jìn)入此狀態(tài)?!鰄ost_dev_attached:內(nèi)核進(jìn)入這個(gè)狀態(tài),當(dāng)一個(gè)設(shè)備連接。當(dāng)一個(gè)全速或低速設(shè)備被檢測到時(shí),狀態(tài)機(jī)移動到host_enumeration狀態(tài)。■host_enumeration:在這種狀態(tài)中,內(nèi)核根據(jù)一個(gè)基本的USB設(shè)備枚舉進(jìn)行。在枚舉過程結(jié)束時(shí),默認(rèn)的配置(配置0)被選擇。
■host_usr_input:這是一個(gè)緊跟在枚舉后的中間狀態(tài),這個(gè)狀態(tài)包括一個(gè)等待用戶輸入以便進(jìn)行USB類操作?!鰄ost_class_request:從這個(gè)狀態(tài)開始,類驅(qū)動接管,類請求狀態(tài)機(jī)為了處理所有的初始類控制請求被調(diào)用(例如:get_report_descriptorHID)。完成所需要的類請求后,內(nèi)核移動至host_class狀態(tài)?!鰄ost_class:在這種狀態(tài)下,類狀態(tài)機(jī)被調(diào)用類相關(guān)的操作(非控制和控制操作)?!鰄ost_ctrl_xfer:,無論何時(shí)當(dāng)有一個(gè)控制轉(zhuǎn)移請求時(shí)進(jìn)入此狀態(tài)。■host_error_state:無論何時(shí)從任何庫狀態(tài)機(jī)有一個(gè)不可恢復(fù)的錯(cuò)誤時(shí)進(jìn)入此狀態(tài);在這種情況下,一個(gè)用戶調(diào)用回調(diào)函數(shù)(例如顯示一條不可恢復(fù)的錯(cuò)誤消息)。然后主模式庫重新初始化。內(nèi)核狀態(tài)機(jī)的過程是由usbh_process功能函數(shù)實(shí)現(xiàn)。這個(gè)函數(shù)應(yīng)該從應(yīng)用程序的主循環(huán)周期調(diào)用。USB主模式庫初始化功能由函數(shù)usbh」nit實(shí)現(xiàn)。這個(gè)函數(shù)這個(gè)函數(shù)應(yīng)該在初始化過程中由用戶應(yīng)用程序調(diào)用。更多這方面的細(xì)節(jié)在section3提供。2.2.2設(shè)備枚舉在檢測完全速或低速設(shè)備之后,主庫通過一個(gè)基本的設(shè)備枚舉繼續(xù)運(yùn)行。下面的關(guān)系圖顯示了參與設(shè)備枚舉的不同的步驟。圖4。設(shè)備枚舉Gelfirst8bytesofdevicedescriptorUSBresetGetfulldevicedescriptorSetdeviceaddressGatconfigurationdescriplorGelstringdescriptors
(MFCdproductandserialnumber}Setdeviceconfiguration枚舉狀態(tài)機(jī)是在庫的功能函數(shù)USBH_HandleEnum中實(shí)現(xiàn),這是從內(nèi)核狀態(tài)機(jī)過程調(diào)用。USBH_HandleEnum功能函數(shù)調(diào)用下面的庫路徑(在文件usbh_stdreq.c中實(shí)施):表3。設(shè)備枚舉請求FunctionDescriptionFunctionUSBH_Get_CfgDescUSBHGetDevDesc獲取配置描述符請求USBH_Get_CfgDescUSBHGetDevDesc獲取配置描述符請求獲取設(shè)備描述符請求USBH_Get_StringDescUSBH_GetDescriptorUSBH_SetCfg(1)USBH_SetAddress2)USBH_ClrFeature得到字符串描述符的請求一般取描述符請求配置請求設(shè)置地址的請求清除功能請求注:1usbh_setcfg調(diào)用選擇默認(rèn)的配置(配置0)2usbh_setaddress要求設(shè)置設(shè)備地址為0x1。用戶回調(diào)函數(shù)將在用戶枚舉階段結(jié)束時(shí)調(diào)用以使過程的描述信息(如顯示的描述符的數(shù)據(jù),例如)。為更多的細(xì)節(jié),請參閱第3節(jié)。****************************************************************************************************2.2.3控制傳輸狀態(tài)機(jī)當(dāng)有控制傳輸需求時(shí)從內(nèi)核或類驅(qū)動進(jìn)入控制傳輸狀態(tài)機(jī),。該狀態(tài)機(jī)實(shí)現(xiàn)了標(biāo)準(zhǔn)的控制轉(zhuǎn)移階段,即安裝階段,可選的數(shù)據(jù)階段,最后,狀態(tài)階段??刂苽鬏敔顟B(tài)機(jī)實(shí)現(xiàn)的功能是在功能函數(shù)USBH_HandleControl中。它是從內(nèi)核狀態(tài)機(jī)程序中調(diào)用。2.2.4USB的I/O請求模塊USB的I/O請求模塊位于內(nèi)核的低層。它的接口與關(guān)于控制,大批量,中斷等的USB事務(wù)的USB底層驅(qū)動相連。表4顯示在I/O請求模塊的主要功能。這些功能在文件usbh_ioreq.c中實(shí)施。表4USB的I/O請求模塊FunctionUSBH_CtlSendSetupUSBH_CtlSendDataUSBH_CtlReceiveDataUSBH_CtlReqUSBH_BulkSendDataUSBH_BulkReceiveDataUSBH_InterruptSendDataUSBH_InterruptReceiveDataFunctionUSBH_CtlSendSetupUSBH_CtlSendDataUSBH_CtlReceiveDataUSBH_CtlReqUSBH_BulkSendDataUSBH_BulkReceiveDataUSBH_InterruptSendDataUSBH_InterruptReceiveData2.2.5主模式通道控制模塊關(guān)于設(shè)置事務(wù)關(guān)于控制數(shù)據(jù)輸出階段的事務(wù)關(guān)于控制數(shù)據(jù)輸入階段的事務(wù)關(guān)于控制傳輸(設(shè)置,數(shù)據(jù),狀態(tài)階段)的高級功能關(guān)于大批量輸出的事務(wù)關(guān)于大批量輸入的事務(wù)關(guān)于中斷輸出事務(wù)關(guān)于中斷輸入事務(wù)主模式通道控制模塊位于較低的內(nèi)核層,它允許把主模式通道配置為一個(gè)特定的操作(控制,大批量或中斷傳輸型)也允許設(shè)置一個(gè)選定的主模式通道為設(shè)備端點(diǎn)來創(chuàng)建一個(gè)USB通道。對于USB通道控制模塊的主要功能是在表6定義。這些功能在文件usbh_hcs.c中實(shí)施。表5。主模式通道控制模塊FunctionUSBH_Open_ChannelUSBH_Modify_ChannelUSBH_Alloc_ChannelUSBH_Free_ChannelDescription開放和配置一個(gè)新的主模式通道修改現(xiàn)有的主模式通道分配一個(gè)主模式通道到設(shè)備的端點(diǎn)(一個(gè)USB通道創(chuàng)建)釋放一個(gè)主模式通道2.3類驅(qū)動程序在枚舉的結(jié)束時(shí),內(nèi)核通過調(diào)用特定功能的類驅(qū)動程序來管理所有的與類相關(guān)的操作。請注意,某些類驅(qū)動的選擇不是基于設(shè)備枚舉的結(jié)果,而是當(dāng)初始化主模式庫通過調(diào)用函數(shù)usbh」nit"預(yù)先定義的"。
類驅(qū)動通過使用結(jié)構(gòu)類型usbh_class_cb_typedef來實(shí)現(xiàn):typedefstruct_Device_cb{USBH_Status(*Init)(USB_OTG_CORE_HANDLE*pdev,USBH_DeviceProp_TypeDef*hdev);void(*DeInit)(USB_OTG_CORE_HANDLE*pdev,USBH_DeviceProp_TypeDef*hdev);USBH_Status(*Requests)(USB_OTG_CORE_HANDLE*pdev,USBH_DeviceProp_TypeDef\*hdev);USBH_Status(*Machine)(USB_OTG_CORE_HANDLE*pdev,USBH_DeviceProp_TypeDef\*hdev);}USBH_Class_cb_TypeDef;結(jié)構(gòu)成員如下所述:■初始化:此函數(shù)在類操作啟動時(shí)調(diào)用以確保完成所有需要的初始化操作。這包括:-解析接口和端點(diǎn)描述符(請注意當(dāng)前的USB主模式庫只支持一種接口),-為非控制端點(diǎn)開放和分配主模式通道,-調(diào)用用戶回調(diào)函數(shù)(見第3節(jié)),以防止該設(shè)備不被支持的情況?!鋈コ跏蓟哼@個(gè)功能當(dāng)重新初始化主模式為釋放分配的主模式通道被調(diào)用。當(dāng)一個(gè)設(shè)備拔出或在不可恢復(fù)的錯(cuò)誤的情況下被調(diào)用。■請求:執(zhí)行類請求狀態(tài)機(jī)的功能。在host_class_request狀態(tài)下它被調(diào)用;其目的是實(shí)現(xiàn)類的初始化請求。■機(jī)器:執(zhí)行類內(nèi)核狀態(tài)機(jī)。在host_class內(nèi)核狀態(tài)被調(diào)用。2.3.1USB大批量存儲類(MSC)驅(qū)動程序的目的是支持常見的USB接口的u盤,使用BOT”Bulk-Only傳輸協(xié)議。以下模塊,位于class'MSC文件夾,用于實(shí)現(xiàn)MSC驅(qū)動:表6。大批量存儲類模塊Moduleusbh_msc_core.c/.husbh_msc_bot.c./.husbh_msc_scsi.c/.husbh_msc_fs_interface.c./hModuleusbh_msc_core.c/.husbh_msc_bot.c./.husbh_msc_scsi.c/.husbh_msc_fs_interface.c./hMSC內(nèi)核狀態(tài)機(jī)的實(shí)現(xiàn)BOT”Bulk-Only傳輸協(xié)議的實(shí)現(xiàn)SCSI命令的實(shí)現(xiàn)文件操作系統(tǒng)訪問文件的接口功能圖表5顯示了模塊之間的相互作用。圖5。MSC驅(qū)動器結(jié)構(gòu)框圖操作流程描述:USBrequestsUSBrequestsMSC內(nèi)核狀態(tài)機(jī)通過必需的設(shè)備初始化來啟動,這是:■通過get_max_lun檢測目前設(shè)備的邏輯單元的數(shù)目的類請求。請注意,只有一個(gè)邏輯單元的設(shè)備支持?!鯾ot_reset是發(fā)出復(fù)位設(shè)備BOT狀態(tài)機(jī)的類請求?!鲫P(guān)于SCSI命令:mode_sense是為了檢測設(shè)備是否寫保護(hù),read_capacity用于檢測u盤容量。經(jīng)過上述設(shè)備初始化,MSC內(nèi)核狀態(tài)機(jī)調(diào)用應(yīng)用程序的用戶回調(diào)函數(shù)。用戶回調(diào)可以讓文件系統(tǒng)訪問任何類型的文件。此操作解釋成一個(gè)邏輯頁讀取或?qū)懭氩僮?。文件系統(tǒng)接口為文件系統(tǒng)和MSC驅(qū)動器提供連接。在SCSI水平,邏輯頁讀取或?qū)懭氩僮鬓D(zhuǎn)換為SCSI命令:READ(10)orWRITE(10)。這些命令"Bulk-OnlyTranport”協(xié)議傳輸?shù)絬盤。BOT層狀態(tài)機(jī)是關(guān)于使用必要的USB內(nèi)核I/O請求模塊進(jìn)行大批量輸入輸出傳輸。MSC模塊描述如下。MSC內(nèi)核模塊:MSC內(nèi)核模塊在"usb_msc_core.c”實(shí)現(xiàn)MSC驅(qū)動,它通過usbh_class_cb_typedef定義msc_cbof結(jié)構(gòu)類型(見2.3節(jié))。USBH_Class_cb_TypeDefMSC_cb={USBH_MSC_InterfaceInit,USBH_MSC_InterfaceDeInit,USBH_MSC_ClassRequest,USBH_MSC_Handle,};表7.MSC內(nèi)核模塊FunctionUSBH_MSC_InterfaceInitDescription解析接口和端點(diǎn)描述符和配置主模式通道(大批量輸入輸出通道)USBH_MSC_InterfaceDeInitUSBH_MSC_ClassRequest去初始化路徑(釋放主模式通道)在MSC的情況下,此功能只將庫內(nèi)核狀態(tài)機(jī)轉(zhuǎn)移到host_class狀態(tài)USBH_MSC_HandleUSBH_MSC_Issue_BOTUSBH_MSC_Issue_GETMaxLUNUSBH_MSC_ErrorHandle執(zhí)行MSC內(nèi)核狀態(tài)機(jī)關(guān)于BOT復(fù)位類請求關(guān)于get_max_lun類請求MSC錯(cuò)誤處理MSCBOT模塊:MSC”Bulk-Only傳輸”(BOT)模塊執(zhí)行了傳輸協(xié)議通過發(fā)送SCSI命令(READ(10)orWRITE(10))。該模塊在文件“usbh_msc_bot.c實(shí)現(xiàn)。關(guān)于BOT協(xié)議的詳細(xì)信息,請參閱大批量存儲類文件。BOT模塊具有以下功能:
表&MSCBOT模塊描述初始化狀態(tài)機(jī)描述初始化狀態(tài)機(jī)BOT傳輸狀態(tài)機(jī)usbh_msc_initusbh_msc_handlebotxferMSCSCSI模塊:SCSI“小型計(jì)算機(jī)系統(tǒng)接口”模塊在“usb_msc_scsi.C”在BOT頂部。它在需要訪問u盤時(shí)執(zhí)行SCSI命令集。需要執(zhí)行的命令:表9.MSCSCSI命令描述邏輯塊讀命令描述邏輯塊讀命令邏輯塊寫入命令檢查設(shè)備狀態(tài)命令請求讀取設(shè)備容量命令檢查大容量存儲設(shè)備寫保護(hù)狀態(tài)命令接收錯(cuò)誤消息命令usbh_msc_read10usbh_msc_write10usbh_msc_testunitreadyusbh_msc_readcapacity10usbh_msc_modesense6usbh_msc_requestsenseMSC文件系統(tǒng)接口模塊MSC文件系統(tǒng)接口模塊在“usbh_msc_fs_interface.C”允許文件系統(tǒng)與MSC驅(qū)動器連接。本模塊必須移植到選定的文件系統(tǒng)。當(dāng)前的USB主模式庫包來自開源的,支持EFSLFAT文件系統(tǒng)(見下一節(jié)對EFSL概述API)。文件系統(tǒng)接口實(shí)現(xiàn)的功能:表10.MSC文件系統(tǒng)接口功能功能描述if_initinterfaceif_readbufif_writebufif_testunitreadyif_requestsense注:對EFSL文件系統(tǒng),EFSL文件系統(tǒng)概述允許初始化文件系統(tǒng)(例如獲取u盤容量)邏輯頁讀取功能接口邏輯頁寫功能接口測試單元是否準(zhǔn)備好功能使用SCSI接口功能命令來請求錯(cuò)誤信息功能接口頁面大小是固定的512個(gè)字節(jié)。對于更大的頁面的U盤不支持。EFSL”嵌入式文件系統(tǒng)庫”是一個(gè)開放源代碼的文件系統(tǒng)庫。支持嵌入式設(shè)備和微軟FAT12,16和32的文件系統(tǒng)。下表總結(jié)了EFSL主要api功能。Table11.EFSL主要的APIFunction Prototype Descriptionefs_init esint8efs_init(EmbeddedFileSystem*efs,eint8*opts);初始化文件系統(tǒng)file_fopenesint8file_fopen(File*file,FileSystem*fs,eint8*filename,eint8mode);打開一個(gè)文件file_fcloseesint8file_fclose(File*file);
關(guān)閉一個(gè)文件file_readeuint32file_read(File*file,euint32size,euint8*buf);讀文件file_writeeuint32file_write(File*file,euint32size,euint8*buf);寫文件Rmfile esint16rmfile(FileSystem*fs,euint8*filename);移除文件mkdir esint8mkdir(FileSystem*fs,eint8*dirname);創(chuàng)建字典ls_openDir esint8ls_openDir(DirList*dlist,FileSystem*fs,eint8*dirname);打開字典ls_getNextesint8ls_getNext(DirList*dlist);獲取另一個(gè)文件字典2.3.2USB人機(jī)接口設(shè)備(HID)類驅(qū)動鼠標(biāo)鍵盤設(shè)備V1.0USB主機(jī)庫中的HID類目的是實(shí)現(xiàn)支持HID鼠標(biāo)和鍵盤設(shè)備。HID報(bào)告通過中斷輸入傳輸收到。以下模塊,位于class'HID文件夾,用于執(zhí)行HID類:Table12.Table12.HIDclassmodules隊(duì)列(模塊)usbh_hid_core.c/.husbh_hid_mouse.c/Husbh_hid_keyboard.c/.h描述這個(gè)模塊執(zhí)行HID類核心狀態(tài)機(jī)HID鼠標(biāo)具體例程HID鍵盤的具體例程各模塊的主要功能如下。HID類核心:HID核心模塊在"usb_hid_core.C"通過usbh_class_cb_typedef定義hid_cb類結(jié)構(gòu)實(shí)現(xiàn)了HID類驅(qū)動程序(見2.3節(jié))。USBH_Class_cb_TypeDefHID_cb={USBH_HID_InterfaceInit,USBH_HID_InterfaceDeInit,USBH_HID_ClassRequest,USBH_HID_Handle};下表總結(jié)了HID內(nèi)核模塊實(shí)現(xiàn)的功能。函數(shù)原型描述表13MSC核心功能模塊Function DescriptionUSBH_HID_InterfaceInit解析接口和端點(diǎn)描述符,設(shè)置一個(gè)主模式通道來獲取一個(gè)中斷輸入通道(為了獲取HID報(bào)告)
USBH_HID_InterfaceDelnit釋放分配的中斷輸入通道USBH_HID_ClassRequest 實(shí)現(xiàn)需要的hid鼠標(biāo)和鍵盤的設(shè)備的類請求狀態(tài)機(jī)(如:獲取hid報(bào)告描述符,設(shè)置空閑時(shí)間,設(shè)置協(xié)議)。USBH_HID_HandleHID類核心狀態(tài)機(jī)(處理中斷輸入傳輸)USBH_Get_HID_ReportDescriptor 獲取HID報(bào)告描述符類請求USBH_ParseClassDesc功能用于解析HID報(bào)告描述符USBH_Set_Idle用于設(shè)置空閑時(shí)間的類請求USBH_Set_Report用于發(fā)送報(bào)告輸出數(shù)據(jù)(不是用于演示軟件)的類請求USBH_Set_Protocol用于設(shè)置HID協(xié)議:啟動或報(bào)告的類請求1.usb_set_protocol被調(diào)用用來設(shè)置啟動協(xié)議模式。HID鼠標(biāo)和鍵盤的具體管理:檢測鼠標(biāo)或鍵盤裝置通過在功能函數(shù)usbh_hid」nterfaceinit中解析接口描述符來完成。對于每種具體類型的設(shè)備的初始化和收到的數(shù)據(jù)報(bào)告的解碼是由結(jié)構(gòu)類型hid_cb_typedef聲明的兩個(gè)功能它的定義如下:typedefstructHID_cb{void(*Init)(void);void(*Decode)(uint8_t*data);}HID_cb_TypeDef上述結(jié)構(gòu)在發(fā)現(xiàn)鼠標(biāo)或鍵盤的情況下實(shí)施hid_mouse_cb和hid_mouse_cb聲明如下:HID_cb_TypeDefHID_MOUSE_cb={MOUSE_Init,MOUSE_Decode,};HID_cb_TypeDefHID_KEYBRD_cb={KEYBRD_Init,KEYBRD_Decode};表14。鼠標(biāo)和鍵盤初始化和HID報(bào)告的解碼功能功能mouse功能mouse」nitmouse_decodekeybrd_init為USB鼠標(biāo)初始化程序?yàn)槭髽?biāo)解碼HID報(bào)告(解碼鼠標(biāo)X,Y的坐標(biāo),按下按鈕)為USB鍵盤初始化程序1°azerty或QWERTY鍵盤的選擇是通過在文件usbh_hid_keybrd.h中#qwerty_keyboard,#azerty_keyboard來聲明的3庫用戶API和回調(diào)函數(shù)3.1庫用戶API庫用戶API功能局限于以下兩個(gè)功能:■voidusbh_process(void):此功能實(shí)現(xiàn)的核心狀態(tài)機(jī)程序。它要從用戶的主循環(huán)周期調(diào)用?!鰑sbh_init:這個(gè)函數(shù)應(yīng)該被稱為主機(jī)的USB硬件與庫的初始化。下面為usbh」nit的函數(shù)原型:voidUSBH_Init(USB_OTG_CORE_HANDLE*pdev,USBH_Class_cb_TypeDef*class_cb,USBH_Usr_cb_TypeDef*usr_cb)-pdev:指向USB主機(jī)寄存器核心結(jié)構(gòu)的指針(為了將來需要)-class_cb:指針指向類結(jié)構(gòu)USBH_Class_cb_TypeDef,它既可以指向MSC_cb類來操作MSC設(shè)備也可以指向HID_cb類操作HID鼠標(biāo)/鍵盤設(shè)備。-usr_cb:指向USBH_Usr_cb_TypeDef類結(jié)構(gòu)。這個(gè)結(jié)構(gòu)定義獨(dú)立類回調(diào)函數(shù)。(見3.2.2節(jié))3.2用戶的回調(diào)函數(shù)用戶回調(diào)函數(shù)在用戶模板文件usbh_usr.c中聲明定義了兩種類型的用戶回調(diào):■與類的相關(guān)操作的回調(diào)函數(shù)(MSC或HID)■與類操作相獨(dú)立的回調(diào)函數(shù);他們主要是在枚舉階段被調(diào)用。這些回調(diào)是一個(gè)USBH_Usr_cb_TypeDef結(jié)構(gòu)類型中定義3.2.1類的回調(diào)函數(shù)MSC用戶回調(diào)函數(shù)功能對于MSC,下面的回調(diào)函數(shù)被調(diào)用:intusr_msc_application(void)。類的初始化結(jié)束后,這個(gè)函數(shù)被MSC狀態(tài)機(jī)調(diào)用的為了幫助用戶訪問文件操作系統(tǒng)。在這個(gè)回調(diào)函數(shù),用戶可以訪問任何FAT文件系統(tǒng)(文件打開,文件讀,寫文件 )使用EFSL文件系統(tǒng)API。同時(shí),用戶可以訪問一個(gè)與庫MSC類驅(qū)動不同的出口結(jié)構(gòu)變量,usbh_msc_param。這個(gè)變量提供關(guān)于大容量存儲的關(guān)鍵信息。這個(gè)變量是使用一種類型massstorageparameter_typedef定義的結(jié)構(gòu),定義如下:typedefstruct__MassStorageParameter{uint32_tMSCapacity;/*MSdevicecapacityinbytes*/uint32_tMSSenseKey;/*RequestSenseSCSIcommandreturnedvalue*/uint16_tMSPageLength;/*MSdevicePagelength*/uint8_tMSBulkOutEp;/*BulkOUTendpointaddress*/uint8_tMSBulkInEp;/*BulkINendpointaddress*/uint8_tMSWriteProtect;/*Writeprotectionstatus,0:nonprotected,1:protected*/}MassStorageParameter_TypeDef;HID用戶的回調(diào)函數(shù)對HID類,以下定義的回調(diào)函數(shù):■voidUSR_MOUSE_Init(void):用戶的鼠標(biāo)應(yīng)用程序初始化■voidUSR_KEYBRD_Init(void):鍵盤應(yīng)用的用戶初始化■voidUSR_MOUSE_ProcessData(HID_MOUSE_Data_TypeDef*data):這個(gè)回調(diào)函數(shù)被調(diào)用當(dāng)hid_mouse_data_typedef數(shù)據(jù)類型的輸入?yún)?shù)有效時(shí)(見下面附注1)?!鰒oidUSR_KEYBRD_ProcessData(uint8_tdata):這個(gè)回調(diào)被調(diào)用時(shí),一個(gè)新的ASCII字符型。其特征是輸入?yún)?shù)數(shù)據(jù)。注:1HID_MOUSE_Data_TypeDef定義如下:typedefstruct_HID_MOUSE_Data{uint8_tx;uint8_ty;uint8_tz;/*NotSupported*/uint8_tbutton;/*Bitmapshowingpressedbuttons1:pressed,0:nonpressed*/}HID_MOUSE_Data_TypeDef;3.2.2類獨(dú)立的回調(diào)函數(shù)這類獨(dú)立的回調(diào)函數(shù)是在一個(gè)結(jié)構(gòu)類型定義usbh_usr_cb_typedef定義如下:typedefstruct_USBH_USR_PROP{void(*Init)(void);void(*DeviceAttached)(void);void(*ResetDevice)(void);void(*DeviceDisconnected)(void);void(*OverCurrentDetected)(void);void(*DeviceSpeedDetected)(uint8_tDeviceSpeed);void(*DeviceDescAvailable)(void*);void(*DeviceAddressAssigned)(void);void(*ConfigurationDescAvailable)(USBH_CfgDesc_TypeDef*,USBH_InterfaceDesc_TypeDef*,USBH_EpDesc_TypeDef*);void(*ManufacturerString)(void*);void(*ProductString)(void*);void(*SerialNumString)(void*);void(*EnumerationDone)(void);USBH_USR_Status(*UserInput)(void);void(*USBH_USR_DeviceNotSupported)(void);void(*UnrecoveredError)(void);}USBH_Usr_cb_TypeDef;以上回調(diào)函數(shù)功能描述如下。-初始化:初始化時(shí)被usbh」nit內(nèi)核調(diào)用的功能。在這個(gè)功能,用戶可以實(shí)現(xiàn)任何自己的應(yīng)用程序相關(guān)的特定的初始化。-deviceattached:當(dāng)一個(gè)USB設(shè)備連接時(shí)被調(diào)用。它可以通過顯示屏告訴用戶任何有用的設(shè)備連接信息。-devicereset:從主模式發(fā)出的USB復(fù)位命令。-devicedisconnect:"當(dāng)一個(gè)設(shè)備斷開時(shí)調(diào)用。一overcurrentdetected:對USB的VBUS電流進(jìn)行檢測時(shí)調(diào)用。devicespeeddetected:檢測裝置傳輸速率時(shí)調(diào)用devicedescavailable:設(shè)備描述符有效時(shí)調(diào)用-deviceaddressassigned:當(dāng)設(shè)備地址分配時(shí)調(diào)用。configurationdescavailable:當(dāng)設(shè)備,接口和端點(diǎn)描述符可用時(shí)調(diào)用描述符是可用的-manufacturingstring:提取制造商字符串時(shí)調(diào)用。-productstring:提取設(shè)備字符串時(shí)調(diào)用。-serialnumstring:序列號字符串提取時(shí)調(diào)用。-enumerationdone:枚舉完成時(shí)調(diào)用。-userinput:枚舉的過程結(jié)束后,提示用戶進(jìn)一步的行動,如按下一個(gè)按鈕啟動主模式的類操作-usbh_usr_devicenotsupported:被檢測的設(shè)備是在不在當(dāng)前類驅(qū)動程序支持時(shí)調(diào)用。-unrecoverederror:在"host_error_state”狀態(tài)時(shí)調(diào)用內(nèi)核的狀態(tài)機(jī)。它允許用戶處理任何錯(cuò)誤,在液晶屏上顯示一個(gè)錯(cuò)誤的信息,例如。注:1設(shè)備的速率信息是通過devicespeed參數(shù)返回??赡艿闹凳牵?x1對應(yīng)全速設(shè)備,0x2對應(yīng)低速設(shè)備。2設(shè)備描述符的信息通過指針DeviceDesc返回,它指向usbh_devdesc_typedefdefined型結(jié)構(gòu)如下:typedefstruct_DeviceDescriptor{uint8_tbLength;uint8_tbDescriptorType;uint16_tbcdUSB;/*USBSpecificationNumberwhichdevicecompliestoo*/uint8_tbDeviceClass;uint8_tbDeviceSubClass;uint8_tbDeviceProtocol;uint8_tbMaxPacketSize;uint16_tidVendor;/*VendorID(AssignedbyUSBOrg)*/uint16_tidProduct;/*ProductID(AssignedbyManufacturer)*/uint16_tbcdDevice;/*DeviceReleaseNumber*/uint8_tiManufacturer;/*IndexofManufacturerStringDescriptor*/uint8_tiProduct;/*IndexofProductStringDescriptor*/uint8_tiSerialNumber;/*IndexofSerialNumberStringDescriptor*/uint8_tbNumConfigurations;/*NumberofPossibleConfigurations*/}USBH_DevDesc_TypeDef;3設(shè)備配置信息(配置,接口和端點(diǎn)描述符)通過結(jié)構(gòu)指針返回usbh_cfgdesc_typedef,usbh_interfacedesc_typedef和usbh_epdesc_typedefdefined定義如下:typedefstruct_ConfigurationDescriptor{uint8_tbLength;uint8_tbDescriptorType;uint16_twTotalLength;uint8_tbNumInterfaces;uint8_tbConfigurationValue;uint8_tiConfiguration;uint8_tbmAttributes;uint8_tbMaxPower;}USBH_CfgDesc_TypeDef;typedefstruct_InterfaceDescriptor{uint8_tbLength;uint8_tbDescriptorType;uint8_tbInterfaceNumber;uint8_tbAlternateSetting;/*Valueusedtoselectalternativesetting*/uint8_tbNumEndpoints;/*NumberofEndpointsusedforthisinterface*/uint8_tbInterfaceClass;/*ClassCode(AssignedbyUSBOrg)*/uint8_tbInterfaceSubClass;/*SubclassCode(AssignedbyUSBOrg)*/uint8_tbInterfaceProtocol;/*ProtocolCode*/uint8_tiInterface;/*IndexofStringDescriptorDescribingthisinterface*/}USBH_InterfaceDesc_TypeDef;typedefstruct_EndpointDescriptor{uint8_tbLength;uint8_tbDescriptorType;uint8_tbEndpointAddress;/*indicateswhatendpointthisdescriptorisdescribing*/uint8_tbmAttributes;/*specifiesthetransfertype.*/uint16_twMaxPacketSize;/*MaximumPacketSizethisendpointiscapableofsendingorreceiving*/uint8_tbInterval;/*isusedtospecifythepollingintervalofcertaintransfers.*/}USBH_EpDesc_TypeDef;4為了移動內(nèi)核狀態(tài)機(jī)到host_class_request狀態(tài),userinput回調(diào)函數(shù)應(yīng)該返回值usbh_usr_resp_ok類型的usbh_usr_statustypedefenum{USBH_USR_NO_RESP=0,/*noresponsefromuser*/USBH_USR_RESP_OK=1,}USBH_USR_Status;4演示程序4.1大批量存儲類的演示4.1.1軟件初始化以下代碼從main.c文件提取代碼。文件顯示調(diào)用usbh_processfor之前管理內(nèi)核狀態(tài)機(jī)必要的初始化。usb_init被定義類驅(qū)動程序的參數(shù)調(diào)用,這是MSC類驅(qū)動,并使用用戶回調(diào)函數(shù)intmain(void){/*SetupSTM32HardwareCofiguration*/BSP_Init();/*InitHostLibrary*/USBH_Init(&USB_OTG_FS_dev,&MSC_cb,&USR_Callbacks);while(1){/*HostTaskhandler*/USBH_Process();}}4.1.2大批量存儲設(shè)備
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度三人合伙開展物流倉儲服務(wù)合同
- 2024年店鋪分割財(cái)產(chǎn)分配協(xié)議
- 2024年廢窯廠坑塘土地租賃協(xié)議
- 2024年度0架AC3A直升機(jī)購銷協(xié)議
- 2024年度煤炭買賣合同(長協(xié))
- 2024水電安裝勞務(wù)分包合同范本
- 2024年度云計(jì)算服務(wù)與技術(shù)研發(fā)合同
- 2024年度新能源汽車銷售與服務(wù)分包合同
- 2024購買車輛合同范本
- 2024年度智能家居解決方案合同
- 2024至2030年中國巖土工程市場深度分析及發(fā)展趨勢研究報(bào)告
- 新版高血壓病人的護(hù)理培訓(xùn)課件
- 醫(yī)院等級創(chuàng)建工作匯報(bào)
- 2024年江西省公務(wù)員錄用考試《行測》題(網(wǎng)友回憶版)(題目及答案解析)
- VDA6.3基礎(chǔ)培訓(xùn)考核測試卷附答案
- 第01講 正數(shù)和負(fù)數(shù)、有理數(shù)-人教版新七年級《數(shù)學(xué)》暑假自學(xué)提升講義(解析版)
- 信息系統(tǒng)部署與運(yùn)維-題庫帶答案
- 婚姻心理學(xué)解讀包含內(nèi)容
- DZ/T 0462.3-2023 礦產(chǎn)資源“三率”指標(biāo)要求 第3部分:鐵、錳、鉻、釩、鈦(正式版)
- 備戰(zhàn)2024年高考英語考試易錯(cuò)點(diǎn)12 名詞性從句(4大陷阱)(解析版)
- 公務(wù)員歷史常識100題及一套完整答案
評論
0/150
提交評論