?? hwctxt.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 + -