-
srue


- Joined on 03-30-2008
- Posts 3
|
Re: How to use GPIO on a PXA270
Hello
This is how I set it up. It works without problems when I debug it with breakpoints, otherwise it crashes usually. Do you have an idea why?
thanks for your help.
//Private Methodsprivate uint CTL_CODE( uint DeviceType, uint Function, uint Method, uint Access )
{ return (((DeviceType) << 16) | ((Access) << 14) | ((Function) << 2) | (Method));
} private uint IOCTL_HAL_GPIO2IRQ()
{ return CTL_CODE(FILE_DEVICE_HAL, 2048, METHOD_BUFFERED, FILE_ANY_ACCESS);
} private uint IOCTL_HAL_IRQ2GPIO()
{ return CTL_CODE(FILE_DEVICE_HAL, 2049, METHOD_BUFFERED, FILE_ANY_ACCESS);
} private uint IOCTL_HAL_IRQEDGE()
{ return CTL_CODE(FILE_DEVICE_HAL, 2050, METHOD_BUFFERED, FILE_ANY_ACCESS);
} private uint IOCTL_HAL_REQUEST_SYSINTR()
{ return CTL_CODE(FILE_DEVICE_HAL, 38, METHOD_BUFFERED, FILE_ANY_ACCESS);
} private uint IOCTL_HAL_RELEASE_SYSINTR()
{ return CTL_CODE(FILE_DEVICE_HAL, 54, METHOD_BUFFERED, FILE_ANY_ACCESS);
} private bool SetupInterrupt()
{ bool ret = false ;
hEvent = new EventWaitHandle(false, EventResetMode.ManualReset );
// Get IRQ frm dwGpio
dwGpio = 19; ret = KernelIoControl(IOCTL_HAL_GPIO2IRQ(), ref dwGpio, 1, ref dwIrq, 1, IntPtr.Zero);
// Set Edge to trigger (Rising, Falling or both)
dwEdge = GPIO_EDGE_RISING | GPIO_EDGE_FALLING; // (rising & falling edge)ret = KernelIoControl(IOCTL_HAL_IRQEDGE(), ref dwIrq, 1, ref dwEdge, 1, IntPtr.Zero);
hEvent.Handle = CreateEvent( IntPtr.Zero, false, false, IntPtr.Zero);
// Get the SYSINTR that corresponds to dwIrq (non GPIO Irqs corresond to the bit numbers of the PXA27x Interrupt resisters)ret = KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR(), ref dwIrq, sizeof(uint), ref dwSysIntr, sizeof(uint), IntPtr.Zero);
// Link our Event with the SYSINTRret = InterruptInitialize(dwSysIntr, hEvent.Handle, IntPtr.Zero, 0);
return ret;
}
|
|