⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hwctxt.h

📁 S3C2440 base Wince USB_gadget driver
💻 H
字号:


//#include <s3c2440a.h>

#include "memmap.h"

#define MDSMSG							1

#define SET								TRUE
#define CLEAR							FALSE

#define ENDPOINT_COUNT					5

//endpoint
#define EP0								0
#define EP1								1
#define EP2								2
#define EP3								3
#define EP4								4
	
#define FIFO_IN							EP1		//teansfer
#define FIFO_OUT						EP2		//receive

//hex
#define EP0_PACKET_SIZE					 0x8	//8byte  
#define EP1_PACKET_SIZE					0x20	//32byte
#define EP2_PACKET_SIZE					0x20	//32byte
#define EP3_PACKET_SIZE					0x20	//32byte
#define EP4_PACKET_SIZE					0x20	//32byte

//register set
#define FIFO_IN_PACKET_MAX_SIZE			EP1_PACKET_SIZE 
#define FIFO_OUT_PACKET_MAX_SIZE		EP2_PACKET_SIZE	


#define IN_TRANSFER						FIFO_IN
#define OUT_TRANSFER					FIFO_OUT


//bit operator
#define clear_bit(data, loc)			((data) &= ~(0x1<<(loc)))
#define clear_bits(data, area, loc)		((data) &= ~((area)<<(loc)))

#define set_bit(data, loc)				((data) |= (0x1<<(loc)))
#define set_bits(data, area, loc)		((data) |= ((area)<<(loc)))

#define invert_bit(data, loc)			((data) ^= (0x1<<(loc)))
#define invert_bits(data, area, loc)	((data) ^= ((area)<<(loc)))

#define check_bit(data, loc)			((data) & (0x1<<(loc)))

#define extract_bits(data, area, loc)	(((data)>>(loc)) & (area))

//macro
#define LOCKINIT_IDXREG					InitializeCriticalSection(&m_csIdx);				
#define LOCK_IDXREG						EnterCriticalSection(&m_csIdx);
#define UNLOCK_IDXREG					LeaveCriticalSection(&m_csIdx);
#define DELETELOCK_IDXREG				DeleteCriticalSection(&m_csIdx)

#define LOCKINIT_ENDPOINT(dwEndpoint)	InitializeCriticalSection(&m_csLock[dwEndpoint])
#define LOCK_ENDPOINT(dwEndpoint)		EnterCriticalSection(&m_csLock[dwEndpoint])
#define UNLOCK_ENDPOINT(dwEndpoint)		LeaveCriticalSection(&m_csLock[dwEndpoint])
#define DELETELOCK_ENDPOINT(dwEndpoint)	DeleteCriticalSection(&m_csLock[dwEndpoint])

//registry
#define UDC_REG_PRIORITY_VAL			_T("Priority256")
#define DEFAULT_PRIORITY				98

#define DEVICE_NAME						_T("UDG1:")

typedef struct CTRL_CONTEXT	
{
	HANDLE					hIST;
	HANDLE					hevInterrupt;
	BOOL					fExitIST;
	BOOL					fRunning;
	BOOL					fRestartIST;
	DWORD					dwSysIntr;
	DWORD					dwISTPriority;
	HANDLE					hevReadPending;
	CEDEVICE_POWER_STATE    cpsCurrentDx;

	//registry
	DWORD					dwIrq;
	DWORD					dwIOBase;
	DWORD					dwIOLen;

	LPWSTR					plwDeviceName;
} *PCTRLR_CONTEXT;

class UDGContext
{
public:
    static BOOL CreateUDGContext(DWORD dwIndex);
    UDGContext(VOID);
    ~UDGContext(VOID);

	inline BYTE ReadReg(DWORD dwOffset);
	inline VOID WriteReg(DWORD dwOffset, BYTE bValue);

	inline BYTE SetClearReg(DWORD dwOffset, BYTE dwMask, BOOL bSet);
	inline BYTE SetClearIndexedReg(DWORD dwEndpoint, DWORD dwOffset, BYTE dwMask, BOOL bSet);

	inline BYTE ReadIndexedReg(DWORD dwEndpoint, DWORD regOffset);
	inline VOID WriteIndexedReg(DWORD dwIndex, DWORD regOffset, BYTE  bValue);

	static volatile ULONG *GetDataRegister(DWORD dwEndpoint);

	BOOL MapRegisterSet(VOID);
	static VOID UnmapRegisterSet(VOID);
	inline VOID FreeCtrlrContext(PVOID pvContext);

	DWORD SetAddress(BYTE bAddress);

	inline BYTE EpToIrqStatBit(DWORD dwEndpoint);
	inline VOID ResetEndpoint(DWORD dwEndpointNumbert);
	
	inline VOID DisableEndpointInterrupt(DWORD dwEndpoint);
	inline VOID EnableEndpointInterrupt(DWORD dwEndpoint);
	inline VOID ClearEndpointInterrupt(DWORD wEndpoint);

	inline VOID ResetDevice(VOID);

	DWORD StartTransfer(PVOID pvContext, LPVOID pBuffer, DWORD dwCount, DWORD dwEndpoint);

	DWORD WriteEndpoint(DWORD dwEndponit, LPVOID pBuffer, DWORD dwCount, BOOL fEnableInterrupts);
	DWORD ReadEndpoint(DWORD dwEndpoint, LPVOID pBuffer, DWORD dwCount);

	DWORD GetInterruptThreadPriority(VOID);
	DWORD StartInterruptThread(PVOID pvContext);
	DWORD StopInterruptThread(PVOID pvContext);

	DWORD ISTMain(PVOID pvContext);

	VOID PowerUp(PVOID pvContext);
	VOID PowerDown(PVOID pvContext);


	DWORD Init(DWORD dwIndex);										
	BOOL Deinit(PVOID pvContext);
	
protected:
	CRITICAL_SECTION	m_csIdx;
	CRITICAL_SECTION	m_csLock[ENDPOINT_COUNT];

	DWORD	m_dwDriverIndex;
 	BOOL	m_fInitialized;
    BOOL	m_fInPowerHandler;

public:
	PCTRLR_CONTEXT m_pHWContext;

};

extern UDGContext *g_pUDGContext;

// interrupt service routine.
DWORD WINAPI CallISTMain(PVOID pvContext);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -