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

📄 interrupts.c

📁 PIO interrupt for pxa27x To test this sample code you ll have to connect GPIO37 to a Switch.
💻 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 + -