📄 interrupts.c
字号:
#include <windows.h>
// To test this sample code you'll have to connect GPIO37 to a Switch.
// GPIO37 can be found on X15, Pin47
#define GPIO_EDGE_RISING 1
#define GPIO_EDGE_FALLING 2
BOOL KernelIoControl(DWORD dwIoControlCode, LPVOID lpInBuf, DWORD nInBufSize, LPVOID lpOutBuf, DWORD nOutBufSize, LPDWORD lpBytesReturned);
#define CTL_CODE( DeviceType, Function, Method, Access ) (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method))
#define FILE_DEVICE_HAL 0x00000101
#define METHOD_BUFFERED 0
#define FILE_ANY_ACCESS 0
#define IOCTL_HAL_GPIO2IRQ CTL_CODE(FILE_DEVICE_HAL, 2048, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_IRQ2GPIO CTL_CODE(FILE_DEVICE_HAL, 2049, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_IRQEDGE CTL_CODE(FILE_DEVICE_HAL, 2050, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_REQUEST_SYSINTR CTL_CODE(FILE_DEVICE_HAL, 38, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_HAL_RELEASE_SYSINTR CTL_CODE(FILE_DEVICE_HAL, 54, METHOD_BUFFERED, FILE_ANY_ACCESS)
BOOL InterruptInitialize(DWORD idInt, HANDLE hEvent, LPVOID pvData, DWORD cbData);
void InterruptDone(DWORD idInt);
void InterruptDisable(DWORD idInt);
/*----------------------------------------------------------------------
| main
+---------------------------------------------------------------------*/
int WINAPI WinMain(HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPWSTR lpCmdLine, // pointer to command line
int nCmdShow) // show state of window
{
HANDLE hEvent;
DWORD dwEdge, dwGpio;
DWORD dwIrq, dwSysIntr;
//************************************
// GPIO Specific Section
// Get IRQ frm dwGpio
dwGpio=37;
// dwGpio=98;
if(!KernelIoControl(IOCTL_HAL_GPIO2IRQ, &dwGpio, 1, &dwIrq, 1, NULL)) goto leave_error;
// Set Edge to trigger (Rising, Falling or both)
//dwEdge=GPIO_EDGE_RISING | GPIO_EDGE_FALLING; // (rising & falling edge)
dwEdge=GPIO_EDGE_RISING; // (rising)
if(!KernelIoControl(IOCTL_HAL_IRQEDGE, &dwIrq, 1, &dwEdge, 1, NULL)) goto leave_error;
//************************************
// General Interrupt Handling Section
// Create an Event to wait on
hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if ( hEvent == NULL) goto leave_error;
// Get the SYSINTR that corresponds to dwIrq (non GPIO Irqs corresond to the bit numbers of the PXA27x Interrupt resisters)
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &dwIrq, sizeof(DWORD), &dwSysIntr, sizeof(DWORD), NULL)) goto leave_error;
// Link our Event with the SYSINTR
if ( !InterruptInitialize(dwSysIntr, hEvent, NULL, 0) ) goto leave_error;
while(1)
{
// Wait for Event (Interrupt)
if (WaitForSingleObject(hEvent, INFINITE) == WAIT_OBJECT_0)
{
if(MessageBox(NULL, L"Interrupt Event Detected, continue Waiting?", L"Interrupt", MB_YESNO) == IDNO) break;
InterruptDone(dwSysIntr);
}
}
InterruptDisable(dwSysIntr);
if (!KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR, &dwSysIntr, sizeof(DWORD), NULL, 0, NULL)) goto leave_error;
leave_error:
return(TRUE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -