<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.compulab.com/w/index.php?action=history&amp;feed=atom&amp;title=EM-X270%3A_WinCE%3A_GPIOs_Programming</id>
	<title>EM-X270: WinCE: GPIOs Programming - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.compulab.com/w/index.php?action=history&amp;feed=atom&amp;title=EM-X270%3A_WinCE%3A_GPIOs_Programming"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.compulab.com/w/index.php?title=EM-X270:_WinCE:_GPIOs_Programming&amp;action=history"/>
	<updated>2026-09-02T08:17:23Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://mediawiki.compulab.com/w/index.php?title=EM-X270:_WinCE:_GPIOs_Programming&amp;diff=942&amp;oldid=prev</id>
		<title>Mike at 14:59, 15 March 2010</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.compulab.com/w/index.php?title=EM-X270:_WinCE:_GPIOs_Programming&amp;diff=942&amp;oldid=prev"/>
		<updated>2010-03-15T14:59:09Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== GPIO Sample Application ==&lt;br /&gt;
=== Overview ===&lt;br /&gt;
&lt;br /&gt;
This GPIOSample application demonstrates basic functionality of EM-X270 GPIOs under Windows CE:&lt;br /&gt;
* How to configure a GPIO pin as output and manipulate it.&lt;br /&gt;
* How to configure a GPIO pin as input and respond to changes in signal level.&lt;br /&gt;
* How to setup an edge triggered event. &lt;br /&gt;
&lt;br /&gt;
=== Application Behavior ===&lt;br /&gt;
Prerequisites for the application:&lt;br /&gt;
* A demo keypad provided with the EM-X270 evaluation kit.&lt;br /&gt;
&lt;br /&gt;
The GPIOSample manipulates the following GPIOs:&lt;br /&gt;
* GPIO 22 (pin 10 of P2 connector on the Keypad Demo Board) - Set as output&lt;br /&gt;
* GPIO 36 (pin 9 of P2 connector on the Keypad Demo Board) - Set as input&lt;br /&gt;
* GPIO 96 (pin 8 of P2 connector on the Keypad Demo Board) - Set as input &lt;br /&gt;
* GPIO 107 (pin 5 of P2 connector on the Keypad Demo Board) - Set as input&lt;br /&gt;
&lt;br /&gt;
GPIO22 voltage level may be monitored with a DVM or an oscilloscope. GPIO36, GPIO96 and GPIO107 may be controlled by an external switch or button. &lt;br /&gt;
&lt;br /&gt;
The GPIOSample performs the following actions: &lt;br /&gt;
* Edge detection on GPIO107 . Event handler is registered with [[#DWORD_GPIORegisterInterrupt.28HANDLE_hDevice.2CGPIO_INTERRUPT_interrupt.29|GPIORegisterInterrupt]]. The handler calls [[#BOOL_GPIOInterruptDone.28HANDLE_hDevice.2C_DWORD_num.29|GPIOInterruptDone]] to indicate interrupt completion. &lt;br /&gt;
* Clock simulation on GPIO22 with a period of 3 seconds. &lt;br /&gt;
* Input voltage level monitoring on GPIO36.&lt;br /&gt;
* Polling on GPIO96 until it is asserted.&lt;br /&gt;
&lt;br /&gt;
=== Available GPIOs ===&lt;br /&gt;
The following table specifies GPIOs available on the EM-X270 platform:&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid rgb(85, 85, 85); border-collapse: collapse;&amp;quot;&lt;br /&gt;
|  '''GPIO#'''  ||   '''PXA27X Alternate Function'''   || '''Conflicts with EM-X270 demo keypad driver''' || '''Pin# on keypad extender (P2)''' &lt;br /&gt;
|-&lt;br /&gt;
| 22 || KP_MKOUT&amp;lt;7&amp;gt; || No || 10&lt;br /&gt;
|-&lt;br /&gt;
| 34 || KP_MKIN&amp;lt;3&amp;gt; || No || 1&lt;br /&gt;
|-&lt;br /&gt;
| 36 ||	KP_MKIN&amp;lt;7&amp;gt; || No || 9&lt;br /&gt;
|-&lt;br /&gt;
| 39 || KP_MKIN&amp;lt;4&amp;gt; || No || 3&lt;br /&gt;
|-&lt;br /&gt;
| 91 || KP_MKIN&amp;lt;6&amp;gt; || No || 7&lt;br /&gt;
|-&lt;br /&gt;
| 96 || KP_MKOUT&amp;lt;6&amp;gt; || No || 8&lt;br /&gt;
|-&lt;br /&gt;
| 99 || KP_MKIN&amp;lt;5&amp;gt; || No || 5&lt;br /&gt;
|-&lt;br /&gt;
| 106 || KP_MKOUT&amp;lt;3&amp;gt; || No || 2&lt;br /&gt;
|-&lt;br /&gt;
| 107 || KP_MKOUT&amp;lt;4&amp;gt; || No || 4&lt;br /&gt;
|-&lt;br /&gt;
| 108 || KP_MKOUT&amp;lt;5&amp;gt; || No || 6&lt;br /&gt;
|-&lt;br /&gt;
| 100 || KP_MKIN&amp;lt;0&amp;gt; || Yes || -  &lt;br /&gt;
|-&lt;br /&gt;
| 101 || KP_MKIN&amp;lt;1&amp;gt; || Yes || -&lt;br /&gt;
|-&lt;br /&gt;
| 102 || KP_MKIN&amp;lt;2&amp;gt; || Yes || -&lt;br /&gt;
|-&lt;br /&gt;
| 103 || KP_MKOUT&amp;lt;0&amp;gt; || Yes || -&lt;br /&gt;
|-&lt;br /&gt;
| 104 || KP_MKOUT&amp;lt;1&amp;gt; || Yes || -&lt;br /&gt;
|-&lt;br /&gt;
| 105 || KP_MKOUT&amp;lt;2&amp;gt; || Yes || -&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note| If your application does not require keypad, you can remove EM-X270 Keypad driver from the Catalog and reuse GPIO100-GPIO105.}}&lt;br /&gt;
&lt;br /&gt;
== GPIO Driver API ==&lt;br /&gt;
=== Data Types ===&lt;br /&gt;
{{Enum| HeadLevel = ==== | Enumname = GPIO_VALUE |&lt;br /&gt;
Description = GPIO state enumeration|  &lt;br /&gt;
Field1 = GPIO_LOW |&lt;br /&gt;
Field2 = GPIO_HIGH |&lt;br /&gt;
Field3 = |&lt;br /&gt;
Field4 = |&lt;br /&gt;
Remarks = |&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Enum| HeadLevel = ==== | Enumname = GPIO_EDGE_SETTINGS |&lt;br /&gt;
Description = |  &lt;br /&gt;
Field1 = GPIO_REACT_ON_FALLING |&lt;br /&gt;
Field2 = GPIO_REACT_ON_RISING |&lt;br /&gt;
Field3 = GPIO_REACT_ON_BOTH |&lt;br /&gt;
Field4 = GPIO_DONT_REACT |&lt;br /&gt;
Remarks = |&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Struct| HeadLevel = ==== | Structname = GPIO_INTERRUPT |&lt;br /&gt;
Description = |&lt;br /&gt;
Field1 = DWORD dwGpioNum |&lt;br /&gt;
Fieldexp1 = |&lt;br /&gt;
Field2 = [[#GPIO_EDGE_SETTINGS|GPIO_EDGE_SETTINGS]]  Edge|&lt;br /&gt;
Fieldexp2 = |&lt;br /&gt;
Field3 = HANDLE	Event|&lt;br /&gt;
Fieldexp3 = |&lt;br /&gt;
Field4 = |&lt;br /&gt;
Field5 = |&lt;br /&gt;
Field6 = |&lt;br /&gt;
Field7 = |&lt;br /&gt;
Field8 = |&lt;br /&gt;
Remarks = |&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Functions ===&lt;br /&gt;
{{APIEx| HeadLevel = ==== | Signature = HANDLE GPIOOpen() | &lt;br /&gt;
Description = Opens an instance of the GPIO Driver.  |  &lt;br /&gt;
Return = Returns a handle that should be used to access the driver. Nonzero indicates success. |&lt;br /&gt;
Param1 = |&lt;br /&gt;
Param2 = |&lt;br /&gt;
Param3 = |&lt;br /&gt;
Param4 = |&lt;br /&gt;
Remarks = }}&lt;br /&gt;
&lt;br /&gt;
{{APIEx| HeadLevel = ==== | Signature = void GPIOClose(HANDLE hDevice) | &lt;br /&gt;
Description = Closes the driver handle |  &lt;br /&gt;
Return = |&lt;br /&gt;
Param1 = *hDevice - Handle to an open driver instance|&lt;br /&gt;
Param2 = |&lt;br /&gt;
Param3 = |&lt;br /&gt;
Param4 = |&lt;br /&gt;
Remarks = }}&lt;br /&gt;
&lt;br /&gt;
{{APIEx| HeadLevel = ==== | Signature =  BOOL GPIOSetValue(HANDLE hDevice,DWORD num, [[#GPIO_VALUE|GPIO_VALUE]] val) | &lt;br /&gt;
Description = Sets the state of a GPIO. |  &lt;br /&gt;
Return = TRUE - indicates success&lt;br /&gt;
:FALSE - indicates failure|&lt;br /&gt;
Param1 = *hDevice - Handle to an open driver instance|&lt;br /&gt;
Param2 = *num - GPIO number.|&lt;br /&gt;
Param3 = *val - The desired logical state. |&lt;br /&gt;
Param4 = |&lt;br /&gt;
Remarks = Make sure the GPIO direction is setup as output.}}&lt;br /&gt;
&lt;br /&gt;
{{APIEx| HeadLevel = ==== | Signature = BOOL GPIOGetValue(HANDLE hDevice,DWORD num,[[#GPIO_VALUE|GPIO_VALUE]] *gpioVal) | &lt;br /&gt;
Description =  Return the logical state of a GPIO.|  &lt;br /&gt;
Return = TRUE - indicates success&lt;br /&gt;
:FALSE - indicates failure|&lt;br /&gt;
Param1 = *hDevice - Handle to an open driver instance|&lt;br /&gt;
Param2 = *num - GPIO number.|&lt;br /&gt;
Param3 = *gpioVal - pointer to the GPIO state variable|&lt;br /&gt;
Param4 = |&lt;br /&gt;
Remarks = Make sure the GPIO direction is setup as input. Returned value for an output GPIO is undefined}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{APIEx| HeadLevel = ==== | Signature = void GPIOSetAsInput(HANDLE hDevice, DWORD num) | &lt;br /&gt;
Description =  Configures a GPIO as an input.|  &lt;br /&gt;
Return = TRUE - indicates success&lt;br /&gt;
:FALSE - indicates failure|&lt;br /&gt;
Param1 = *hDevice - Handle to an open driver instance.|&lt;br /&gt;
Param2 = *num - GPIO number.|&lt;br /&gt;
Param3 = |&lt;br /&gt;
Param4 = |&lt;br /&gt;
Remarks = }}&lt;br /&gt;
&lt;br /&gt;
{{APIEx| HeadLevel = ==== | Signature =  BOOL GPIOSetAsOutput(HANDLE hDevice,DWORD num, [[#GPIO_VALUE|GPIO_VALUE]] val) | &lt;br /&gt;
Description = Configures a GPIO as an output and sets its logical state. |  &lt;br /&gt;
Return = TRUE - indicates success&lt;br /&gt;
:FALSE - indicates failure|&lt;br /&gt;
Param1 = *hDevice - Handle to an open driver instance|&lt;br /&gt;
Param2 = *num - GPIO number.|&lt;br /&gt;
Param3 = *val - The initial GPIO value|&lt;br /&gt;
Param4 = |&lt;br /&gt;
Remarks = }}&lt;br /&gt;
&lt;br /&gt;
{{APIEx| HeadLevel = ==== | Signature = DWORD GPIORegisterInterrupt(HANDLE hDevice,[[#GPIO_INTERRUPT|GPIO_INTERRUPT]] interrupt) | &lt;br /&gt;
Description =  Registers a GPIO as an interrupt source. The interrupt is triggered according to the configuration in [[#GPIO_INTERRUPT|GPIO_INTERRUPT]].Edge member settings. |&lt;br /&gt;
Return = TRUE - indicates success. The handle for the interrupt event is stored in [[#GPIO_INTERRUPT|GPIO_INTERRUPT]].Event|&lt;br /&gt;
Param1 = *hDevice - Handle to an open driver instance|&lt;br /&gt;
Param2 = *interrupt-  data structure that defines parameters for the interrupt registration&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct gpio_intr_t{&lt;br /&gt;
	DWORD dwGpioNum;&lt;br /&gt;
	GPIO_EDGE_SETTINGS  Edge;&lt;br /&gt;
	HANDLE	Event;&lt;br /&gt;
} GPIO_INTERRUPT;&lt;br /&gt;
&amp;lt;/pre&amp;gt; |&lt;br /&gt;
Param3 = |&lt;br /&gt;
Param4 = |&lt;br /&gt;
Remarks = * This function must be called before using the [[#GPIO_INTERRUPT|GPIO_INTERRUPT]].Event parameter.&lt;br /&gt;
:* The [[#GPIO_INTERRUPT|GPIO_INTERRUPT]].Event parameter may only be used in a {{Cmd|WaitForSingleObject}} call. A {{Cmd|WaitForMultipleObjects}} call with [[#GPIO_INTERRUPT|GPIO_INTERRUPT]].Event will fail. &lt;br /&gt;
:* If you use GPIO_INTERRUPT.Event in a call to WaitForSingleObject before you call {{Cmd|GPIOInterruptInitialize}}, {{Cmd|GPIOInterruptInitialize}} will fail.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{APIEx| HeadLevel = ==== | Signature = BOOL GPIOInterruptDone(HANDLE hDevice, DWORD num) | &lt;br /&gt;
Description =  Signals to the kernel that GPIO interrupt processing is complete.|  &lt;br /&gt;
Return = TRUE- indicates success. |&lt;br /&gt;
Param1 = *hDevice - Handle to an open driver instance|&lt;br /&gt;
Param2 = *num - GPIO number.|&lt;br /&gt;
Param3 = |&lt;br /&gt;
Param4 = |&lt;br /&gt;
Remarks = A program calls {{Cmd|GPIOInterruptDone}} when it has completed the interrupt processing and is ready for another interrupt.}}&lt;br /&gt;
&lt;br /&gt;
{{APIEx| HeadLevel = ==== | Signature = DWORD GPIOUnRegisterInterrupt(HANDLE hDevice, DWORD num) | &lt;br /&gt;
Description =  Disables the GPIO hardware interrupt.|  &lt;br /&gt;
Return = TRUE - indicates success. |&lt;br /&gt;
Param1 = *hDevice - Handle to an open driver instance|&lt;br /&gt;
Param2 = *num - GPIO number.|&lt;br /&gt;
Param3 = |&lt;br /&gt;
Param4 = |&lt;br /&gt;
Remarks = A program calls {{Cmd|GPIOUnRegisterInterrupt}} to disable the hardware interrupt and to unregister the event that was registered by {{Cmd|GPIOInterruptInitialize}}.}}&lt;br /&gt;
{{Note|The exact definition of GPIO API is located in the gpio.h file in the GPIOSample project.}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Windows CE|GPIOs Programming]]&lt;br /&gt;
[[Category:EM-X270|WinCE: GPIOs Programming]]&lt;/div&gt;</summary>
		<author><name>Mike</name></author>
		
	</entry>
</feed>