📄 dig.cpp
字号:
// DIG.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
#include <windows.h>
#include <ceddk.h>
#include <bulverde.h>
XLLP_OST_T *g_pOSTRegs = NULL;
XLLP_GPIO_T *g_pGPIORegs = NULL;
XLLP_UINT32_T g_aData[2] = {1, 90}; //GPIO90
XLLP_UINT32_T g_aClock[2] = {1, 91}; //GPIO91
void OutputByte(BYTE data);
void XllpGpioSetDirectionOut
(P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPinArray[]);
void XllpGpioSetOutputState1
(P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPinArray[]);
void XllpGpioSetOutput0
(P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPinArray[]);
BOOL APIENTRY DllMain( HANDLE hInstDll,
DWORD dwReason,
LPVOID lpReserved
)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
DWORD DIG_Init(DWORD dwContext)
{
RETAILMSG(1, (TEXT("Led: LED_Init\r\n")));
PHYSICAL_ADDRESS PA;
if (g_pGPIORegs == NULL)
{
PA.QuadPart = 0x40E00000;
g_pGPIORegs = (XLLP_GPIO_T *) MmMapIoSpace(PA, sizeof(XLLP_GPIO_T), FALSE);
}
if (g_pOSTRegs == NULL)
{
PA.QuadPart = 0x40A00000;
g_pOSTRegs = (XLLP_OST_T *) MmMapIoSpace(PA, sizeof(XLLP_OST_T), FALSE);
}
XllpGpioSetDirectionOut(g_pGPIORegs, g_aData);
XllpGpioSetDirectionOut(g_pGPIORegs, g_aClock);
XllpGpioSetOutput0(g_pGPIORegs, g_aData);
XllpGpioSetOutput0(g_pGPIORegs, g_aClock);
OutputByte(0); OutputByte(0);
OutputByte(0); OutputByte(0);
return TRUE;
}
BOOL DIG_Deinit(DWORD hDeviceContext)
{
RETAILMSG(1,(TEXT("LED_Deinit\r\n")));
if(g_pGPIORegs)
{
MmUnmapIoSpace((PVOID)g_pGPIORegs,sizeof(XLLP_GPIO_T));
g_pGPIORegs = NULL;
}
if(g_pOSTRegs)
{
MmUnmapIoSpace((PVOID)g_pOSTRegs,sizeof(XLLP_OST_T));
g_pOSTRegs = NULL;
}
return TRUE;
}
BOOL DIG_Open(DWORD hDeviceContext,DWORD AccessCode,DWORD ShareMode)
{
return TRUE;
}
BOOL DIG_Close(DWORD hOpenContext)
{
return TRUE;
}
BOOL DIG_IOControl(DWORD hOpenContext,
DWORD dwCode,
PBYTE pBufIn,
DWORD dwLenIn,
PBYTE pBufOut,
DWORD dwLenOut,
PDWORD pdwActualOut)
{
return TRUE;
}
void DIG_PowerDown(DWORD hDeviceContext)
{
}
void DIG_PowerUp(DWORD hDeviceContext)
{
}
DWORD DIG_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
return 0;
}
DWORD DIG_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
return 0;
}
DWORD DIG_Write(DWORD hOpenContext, LPCVOID pBuffer, DWORD NumberOfBytes)
{
DWORD i;
BYTE *ptr = (BYTE*)pBuffer;
for(i=0; i<NumberOfBytes; i++)
OutputByte(*ptr++);
return i;
}
void OutputByte(BYTE data)
{
UINT mask;
for(mask=1; mask&0xff; mask<<=1)
{
if(data & mask)
{
XllpGpioSetOutputState1(g_pGPIORegs, g_aData); //OUTHBIT()
XllpGpioSetOutputState1(g_pGPIORegs, g_aClock);
XllpGpioSetOutput0(g_pGPIORegs, g_aClock);
}
else
{
XllpGpioSetOutput0(g_pGPIORegs, g_aData); //OUTLBIT()
XllpGpioSetOutputState1(g_pGPIORegs, g_aClock);
XllpGpioSetOutput0(g_pGPIORegs, g_aClock);
}
}
}
void XllpGpioSetDirectionOut
(P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPinArray[])
{
XLLP_UINT32_T aGpioPinMask;
XLLP_UINT32_T aMask2;
aMask2=0;
aGpioPinMask = 0x1u << (aGpioPinArray[1] & 0x1F);
aMask2 |= aGpioPinMask;
pGPIO->GPDR2=((pGPIO->GPDR2)| aMask2);
}
void XllpGpioSetOutputState1
(P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPinArray[])
{
XLLP_UINT32_T aGpioPinMask;
XLLP_UINT32_T aMask2;
aMask2=0;
aGpioPinMask = 0x1u << (aGpioPinArray[1] & 0x1F);
aMask2 |= aGpioPinMask;
pGPIO->GPSR2=aMask2;
}
void XllpGpioSetOutput0
(P_XLLP_GPIO_T pGPIO, XLLP_UINT32_T aGpioPinArray[])
{
XLLP_UINT32_T aGpioPinMask;
XLLP_UINT32_T aMask2;
aMask2=0;
aGpioPinMask = 0x1u << (aGpioPinArray[1] & 0x1F);
aMask2 |= aGpioPinMask;
pGPIO->GPCR2=aMask2;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -