📄 mx31_habtools.c
字号:
/*================================================================================================== Module Name: MX31_HABTools.c General Description: This file defines functions for the Flash library that using the HABToolkit in i.MX31.==================================================================================================== Freescale Confidential Proprietary MMO - Asia Application Copyright (c) 2004, 2005 Freescale Inc. All Rights ReservedRevision History: Modification VersionAuthor Date Number Description of Changes------------------------- ------------ ---------- -------------------------------------------Stella Lau 8.27.2004 ver 0.0 **TBA** for HAB checking need to be addedReferences : [TORTOLA] "Tortola IC specification" Version 1.1 [ARC USB] "ARC USB-HS OTG High-Speed USB On-The-Go Controller Core" Version 4.0.1==================================================================================================== INCLUDE FILES==================================================================================================*///#define DEBUG_PRINT#include "MX31_HABTools.h"//################################################################################################// FUNCTION PROTOTYPEvoid ClearDQH(void);void dQHSetup(U32 dQHBase, U8 ZLT, U16 MPS, U8 ios, U32 NextLinkPtr, U8 Terminate, U16 TotalBytes, U8 ioc, U8 Status, U32 BuffPtr0, U16 CurrentOffset, U32 BuffPtr1, U32 BuffPtr2, U32 BuffPtr3, U32 BuffPtr4);void dTDSetup(U32 dTDBase, U32 dTDNextLinkPtr, U8 Terminate, U16 TotalBytes, U8 ioc, U8 Status,U32 BufferPtr0, U16 CurrentOffset, U32 BufferPtr1, U32 BufferPtr2, U32 BufferPtr3, U32 BufferPtr4);void EnableEP1OUT(void);void EP1OutCommandSetup(void);void EP1OutRxData(U32 Address, U32 Offset, U32 ByteCount);void EnableEP2IN(void);void CommandAck(U32 ack, U8 channel);void EP2INTxData(U32 BufPtrAddress, U32 TotalBytes);int HandleCommand(int status, int count, U8 channel);unsigned char MX31_GetCharFromFIFO (void);void MX31_PutCharInFIFO (unsigned char c);// Global VariableU8 _gSetupData[8];U8 _gCommand[16];U8 _gDevState;U32 CSFAddress = 0;U32 HWConfigAddress = 0;U32 ExecuteAddress = 0;U8 _gSerialNum00 = 0;U8 _gSerialNum01 = 0;U8 _gSerialNum02 = 0;U8 _gSerialNum03 = 0;U8 _gTxcr_Interface = 0;/*==================================================================================================FUNCTION: ClearDQHDESCRIPTION: This function is used to Clear the DQH before initiateARGUMENTS PASSED: None RETURN VALUE: None IMPORTANT NOTES: None ==================================================================================================*/void ClearDQH(void){ U8 i = 0; VP_U32 EP_QUEUE_HEADPtr; EP_QUEUE_HEADPtr = (VP_U32)((VP_U32)dQHBASE); // Clear the dQH Memory for ( i = 0; i < (64*6)/4 ; i++) { *EP_QUEUE_HEADPtr = 0; EP_QUEUE_HEADPtr++; }}/*==================================================================================================FUNCTION: dQHSetupDESCRIPTION: This function is used to setup the dQH ------------------------ | EP2 IN (64 bytes) | | | ------------------------ dQH5 | EP2 OUT (64 bytes) | | | ------------------------ dQH4 | EP1 IN (64 bytes) | | | ------------------------ dQH3 | EP1 OUT (64 bytes) | | | ------------------------ dQH2 | EP0 IN (64 bytes) | | | ------------------------ dQH1 | EP0 OUT (64 bytes) | | | ------------------------ dQH0ARGUMENTS PASSED: U32 dQHBase - Base Address of the dQH U8 ZLT - zero lengh packet termination (enable - ZLT_ENABLE; disable - ZLT_DISABLE) U16 MPS - Max packet length U8 ios - interrupt on Setup U32 NextLinkPtr - Next Link Pointer, U8 Terminate - Terminate - TERMINATE; not Terminate - NOT_TERMINATE U16 TotalBytes - Total Bytes to be transfered in this dQH U8 ioc - interrupt on complete, set - IOC_SET, not set - IOC_NOTSET U8 Status - Status U32 BuffPtr0 - Buffer Pointer page 0 U16 CurrentOffset - current offset U32 BuffPtr1 - Buffer Pointer page 1 U32 BuffPtr2 - Buffer Pointer page 1 U32 BuffPtr3 - Buffer Pointer page 1 U32 BuffPtr4 - Buffer Pointer page 1 RETURN VALUE: None IMPORTANT NOTES: None ==================================================================================================*/void dQHSetup(U32 dQHBase, U8 ZLT, U16 MPS, U8 ios, U32 NextLinkPtr, U8 Terminate, U16 TotalBytes, U8 ioc, U8 Status, U32 BuffPtr0, U16 CurrentOffset, U32 BuffPtr1, U32 BuffPtr2, U32 BuffPtr3, U32 BuffPtr4){ volatile struct s_dQH_SETUP* dQH_word = (volatile struct s_dQH_SETUP*) dQHBase; //====== // 0x0 //====== //Bit31:30 Mult; Bit29 zlt; Bit26:16 MPS; Bit15 ios dQH_word->dQH_WORD0 = (((U32)ZLT << 29)|((U32)MPS <<16) | ((U32)ios <<15)); //====== // 0x4 //====== // Current dTD Pointer => for hw use, not modified by DCD software dQH_word->dQH_WORD1 = 0x0; //====== // 0x8 //====== // Next dTD Pointer dQH_word->dQH_WORD2 = ((NextLinkPtr & 0xFFFFFFE0) | Terminate); //====== // 0xC //====== // Bit30:16 TotalBytes; Bit15 ioc; Bit11:10 MultO; Bit7:0 Status dQH_word->dQH_WORD3 = ((((U32)TotalBytes & 0x7FFF) << 16) | ((U32)ioc <<15) | (Status)); //====== // 0x10 //====== // Bit31:12 Buffer Pointer (Page 0) dQH_word->dQH_WORD4 = ((BuffPtr0 & 0xFFFFF000) | (CurrentOffset & 0xFFF)); //====== // 0x14 //====== // Bit31:12 Buffer Pointer (Page 1) dQH_word->dQH_WORD5 = (BuffPtr1 & 0xFFFFF000); //====== // 0x18 //====== // Bit31:12 Buffer Pointer (Page 2) dQH_word->dQH_WORD6 = (BuffPtr2 & 0xFFFFF000); //====== // 0x1C //====== // Bit31:12 Buffer Pointer (Page 3) dQH_word->dQH_WORD7 = (BuffPtr3 & 0xFFFFF000); //====== // 0x20 //====== // Bit31:12 Buffer Pointer (Page 4) dQH_word->dQH_WORD8 = (BuffPtr4 & 0xFFFFF000); //====== // 0x24 //====== // Reserved dQH_word->dQH_WORD9 = 0; //====== // 0x28 //====== // Setup Buffer 0 dQH_word->dQH_WORD10 = 0; //====== // 0x2C //====== // Setup Buffer 1 dQH_word->dQH_WORD11 = 0;}/*==================================================================================================FUNCTION: dTDSetupDESCRIPTION: This function is used to setup the dTDARGUMENTS PASSED: U32 dTDBase - Base Address of the dTD U32 NextLinkPtr - Next Link Pointer, U8 Terminate - Terminate - TERMINATE; not Terminate - NOT_TERMINATE U16 TotalBytes - Total Bytes to be transfered in this dQH U8 ioc - interrupt on complete, set - IOC_SET, not set - IOC_NOTSET U8 Status - Status U32 BuffPtr0 - Buffer Pointer page 0 U16 CurrentOffset - current offset U32 BuffPtr1 - Buffer Pointer page 1 U32 BuffPtr2 - Buffer Pointer page 1 U32 BuffPtr3 - Buffer Pointer page 1 U32 BuffPtr4 - Buffer Pointer page 1 RETURN VALUE: None IMPORTANT NOTES: None ==================================================================================================*/void dTDSetup(U32 dTDBase, U32 dTDNextLinkPtr, U8 Terminate, U16 TotalBytes, U8 ioc, U8 Status,U32 BufferPtr0, U16 CurrentOffset, U32 BufferPtr1, U32 BufferPtr2, U32 BufferPtr3, U32 BufferPtr4){ volatile struct s_dTD_SETUP* dTD_word = (volatile struct s_dTD_SETUP*) dTDBase; // Bit31:5 Next Link Pointer ; Bit0 Terminate dTD_word->dTD_WORD0 = ((dTDNextLinkPtr & 0xFFFFFFE0) | Terminate); // Bit30:16 TotalBytes, Bit15 ioc, Bit7:0 status dTD_word->dTD_WORD1 = ((((U32)TotalBytes & 0x7FFF) << 16)| ((U32)ioc <<15) | (Status)); // Bit31:12 Buffer Pointer Page 0 ; Bit11:0 Current Offset dTD_word->dTD_WORD2 = ((BufferPtr0 & 0xFFFFF000) | (CurrentOffset & 0xFFF)); // Bit31:12 Buffer Pointer Page 1 ; Bit10:0 Frame Number dTD_word->dTD_WORD3 = (BufferPtr1 & 0xFFFFF000); // Bit31:12 Buffer Pointer Page 2 ; dTD_word->dTD_WORD4 = (BufferPtr2 & 0xFFFFF000); // Bit31:12 Buffer Pointer Page 3 ; dTD_word->dTD_WORD5 = (BufferPtr3 & 0xFFFFF000); // Bit31:12 Buffer Pointer Page 4 ; dTD_word->dTD_WORD6 = (BufferPtr4 & 0xFFFFF000);}/*==================================================================================================FUNCTION: EnableEP1OUTDESCRIPTION: This function Enable the EP1 as OUT ARGUMENTS PASSED: None RETURN VALUE: None IMPORTANT NOTES: None==================================================================================================*/void EnableEP1OUT(void){ U32 TotalBytes = 0x10; // EP1 OUT command = 16 bytes dQHSetup(dQH2_EP1OUT, ZLT_DISABLE, MPS_64, IOS_SET, dTD0_EP1OUT, TERMINATE, TotalBytes, IOC_SET, NO_STATUS, BUFPTR_P0_EP1OUT,(BUFPTR_P0_EP1OUT & 0xFFF),0,0,0,0); // Endpoint 1 : MPS = 64, OUT (Rx endpoint) *(P_U32)USB_OTG_ENDPTCTRL1 = 0x00080048; // Enable EP1 OUT *(P_U32)USB_OTG_ENDPTCTRL1 |= EP1OUT_ENABLE;}/*==================================================================================================FUNCTION: EP1OutCommandSetup
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -