Contiki 3.x
gpio.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2012, Texas Instruments Incorporated - http://www.ti.com/
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  *
14  * 3. Neither the name of the copyright holder nor the names of its
15  * contributors may be used to endorse or promote products derived
16  * from this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
21  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
22  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
23  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
27  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
29  * OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 /**
32  * \addtogroup cc2538
33  * @{
34  *
35  * \defgroup cc2538-gpio cc2538 General-Purpose I/O
36  *
37  * Driver for the cc2538 GPIO controller
38  * @{
39  *
40  * \file
41  * Header file with register and macro declarations for the cc2538 GPIO module
42  */
43 #ifndef GPIO_H_
44 #define GPIO_H_
45 
46 #include "reg.h"
47 
48 #include <stdint.h>
49 
50 /**
51  * \brief Type definition for callbacks invoked by the GPIO ISRs
52  * \param port The port that triggered the GPIO interrupt. \e port is passed
53  * by its numeric representation (Port A:0, B:1 etc). Defines for
54  * these numeric representations are GPIO_x_NUM
55  * \param pin The pin that triggered the interrupt, specified by number
56  * (0, 1, ..., 7)
57  *
58  * This is the prototype of a function pointer passed to
59  * gpio_register_callback(). These callbacks are registered on a port/pin
60  * basis. When a GPIO port generates an interrupt, if a callback has been
61  * registered for the port/pin combination, the ISR will invoke it. The ISR
62  * will pass the port/pin as arguments in that call, so that a developer can
63  * re-use the same callback for multiple port/pin combinations
64  */
65 typedef void (* gpio_callback_t)(uint8_t port, uint8_t pin);
66 /*---------------------------------------------------------------------------*/
67 /** \name Base addresses for the GPIO register instances
68  * @{
69  */
70 #define GPIO_A_BASE 0x400D9000 /**< GPIO_A */
71 #define GPIO_B_BASE 0x400DA000 /**< GPIO_B */
72 #define GPIO_C_BASE 0x400DB000 /**< GPIO_C */
73 #define GPIO_D_BASE 0x400DC000 /**< GPIO_D */
74 /** @} */
75 /*---------------------------------------------------------------------------*/
76 /** \name Numeric representation of the four GPIO ports
77  * @{
78  */
79 #define GPIO_A_NUM 0 /**< GPIO_A: 0 */
80 #define GPIO_B_NUM 1 /**< GPIO_B: 1 */
81 #define GPIO_C_NUM 2 /**< GPIO_C: 2 */
82 #define GPIO_D_NUM 3 /**< GPIO_D: 3 */
83 /** @} */
84 /*---------------------------------------------------------------------------*/
85 /**
86  * \name GPIO Manipulation macros
87  * @{
88  */
89 /** \brief Set pins with PIN_MASK of port with PORT_BASE to input.
90  * \param PORT_BASE GPIO Port register offset
91  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
92  */
93 #define GPIO_SET_INPUT(PORT_BASE, PIN_MASK) \
94  do { REG((PORT_BASE) + GPIO_DIR) &= ~(PIN_MASK); } while(0)
95 
96 /** \brief Set pins with PIN_MASK of port with PORT_BASE to output.
97 * \param PORT_BASE GPIO Port register offset
98 * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
99 */
100 #define GPIO_SET_OUTPUT(PORT_BASE, PIN_MASK) \
101  do { REG((PORT_BASE) + GPIO_DIR) |= (PIN_MASK); } while(0)
102 
103 /** \brief Set pins with PIN_MASK of port with PORT_BASE high.
104  * \param PORT_BASE GPIO Port register offset
105  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
106  */
107 #define GPIO_SET_PIN(PORT_BASE, PIN_MASK) \
108  do { REG((PORT_BASE) + GPIO_DATA + ((PIN_MASK) << 2)) = 0xFF; } while(0)
109 
110 /** \brief Set pins with PIN_MASK of port with PORT_BASE low.
111 * \param PORT_BASE GPIO Port register offset
112 * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
113 */
114 #define GPIO_CLR_PIN(PORT_BASE, PIN_MASK) \
115  do { REG((PORT_BASE) + GPIO_DATA + ((PIN_MASK) << 2)) = 0x00; } while(0)
116 
117 /** \brief Set pins with PIN_MASK of port with PORT_BASE to value.
118  * \param PORT_BASE GPIO Port register offset
119  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
120  * \param value The new value to write to the register. Only pins specified
121  * by PIN_MASK will be set.
122  *
123  * \note The outcome of this macro invocation will be to write to the register
124  * a new value for multiple pins. For that reason, the value argument cannot be
125  * a simple 0 or 1. Instead, it must be the value corresponding to the pins that
126  * you wish to set.
127  *
128  * Thus, if you only want to set a single pin (e.g. pin 2), do \e not pass 1,
129  * but you must pass 0x04 instead (1 << 2). This may seem counter-intuitive at
130  * first glance, but it allows a single invocation of this macro to set
131  * multiple pins in one go if so desired. For example, you can set pins 3 and 1
132  * and the same time clear pins 2 and 0. To do so, pass 0x0F as the PIN_MASK
133  * and then use 0x0A as the value ((1 << 3) | (1 << 1) for pins 3 and 1)
134  */
135 #define GPIO_WRITE_PIN(PORT_BASE, PIN_MASK, value) \
136  do { REG((PORT_BASE) + GPIO_DATA + ((PIN_MASK) << 2)) = (value); } while(0)
137 
138 /** \brief Read pins with PIN_MASK of port with PORT_BASE.
139  * \param PORT_BASE GPIO Port register offset
140  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
141  * \return The value of the pins specified by PIN_MASK
142  *
143  * This macro will \e not return 0 or 1. Instead, it will return the values of
144  * the pins specified by PIN_MASK ORd together. Thus, if you pass 0xC3
145  * (0x80 | 0x40 | 0x02 | 0x01) as the PIN_MASK and pins 7 and 0 are high,
146  * the macro will return 0x81.
147  */
148 #define GPIO_READ_PIN(PORT_BASE, PIN_MASK) \
149  REG((PORT_BASE) + GPIO_DATA + ((PIN_MASK) << 2))
150 
151 /** \brief Set pins with PIN_MASK of port with PORT_BASE to detect edge.
152  * \param PORT_BASE GPIO Port register offset
153  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
154  */
155 #define GPIO_DETECT_EDGE(PORT_BASE, PIN_MASK) \
156  do { REG((PORT_BASE) + GPIO_IS) &= ~(PIN_MASK); } while(0)
157 
158 /** \brief Set pins with PIN_MASK of port with PORT_BASE to detect level.
159  * \param PORT_BASE GPIO Port register offset
160  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
161  */
162 #define GPIO_DETECT_LEVEL(PORT_BASE, PIN_MASK) \
163  do { REG((PORT_BASE) + GPIO_IS) |= (PIN_MASK); } while(0)
164 
165 /** \brief Set pins with PIN_MASK of port with PORT_BASE to trigger an
166  * interrupt on both edges.
167  * \param PORT_BASE GPIO Port register offset
168  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
169  */
170 #define GPIO_TRIGGER_BOTH_EDGES(PORT_BASE, PIN_MASK) \
171  do { REG((PORT_BASE) + GPIO_IBE) |= (PIN_MASK); } while(0)
172 
173 /** \brief Set pins with PIN_MASK of port with PORT_BASE to trigger an
174  * interrupt on single edge (controlled by GPIO_IEV).
175  * \param PORT_BASE GPIO Port register offset
176  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
177  */
178 #define GPIO_TRIGGER_SINGLE_EDGE(PORT_BASE, PIN_MASK) \
179  do { REG((PORT_BASE) + GPIO_IBE) &= ~(PIN_MASK); } while(0)
180 
181 /** \brief Set pins with PIN_MASK of port with PORT_BASE to trigger an
182  * interrupt on rising edge.
183  * \param PORT_BASE GPIO Port register offset
184  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
185  */
186 #define GPIO_DETECT_RISING(PORT_BASE, PIN_MASK) \
187  do { REG((PORT_BASE) + GPIO_IEV) |= (PIN_MASK); } while(0)
188 
189 /** \brief Set pins with PIN_MASK of port with PORT_BASE to trigger an
190  * interrupt on falling edge.
191  * \param PORT_BASE GPIO Port register offset
192  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
193  */
194 #define GPIO_DETECT_FALLING(PORT_BASE, PIN_MASK) \
195  do { REG((PORT_BASE) + GPIO_IEV) &= ~(PIN_MASK); } while(0)
196 
197 /** \brief Enable interrupt triggering for pins with PIN_MASK of port with
198  * PORT_BASE.
199  * \param PORT_BASE GPIO Port register offset
200  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
201  */
202 #define GPIO_ENABLE_INTERRUPT(PORT_BASE, PIN_MASK) \
203  do { REG((PORT_BASE) + GPIO_IE) |= (PIN_MASK); } while(0)
204 
205 /** \brief Disable interrupt triggering for pins with PIN_MASK of port with
206  * PORT_BASE.
207  * \param PORT_BASE GPIO Port register offset
208  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
209  */
210 #define GPIO_DISABLE_INTERRUPT(PORT_BASE, PIN_MASK) \
211  do { REG((PORT_BASE) + GPIO_IE) &= ~(PIN_MASK); } while(0)
212 
213 /** \brief Get raw interrupt status of port with PORT_BASE.
214  * \param PORT_BASE GPIO Port register offset
215  * \return Bit-mask reflecting the raw interrupt status of all the port pins
216  *
217  * The bits set in the returned bit-mask reflect the status of the interrupts
218  * trigger conditions detected (raw, before interrupt masking), indicating that
219  * all the requirements are met, before they are finally allowed to trigger by
220  * the interrupt mask. The bits cleared indicate that corresponding input pins
221  * have not initiated an interrupt.
222  */
223 #define GPIO_GET_RAW_INT_STATUS(PORT_BASE) \
224  REG((PORT_BASE) + GPIO_RIS)
225 
226 /** \brief Get masked interrupt status of port with PORT_BASE.
227  * \param PORT_BASE GPIO Port register offset
228  * \return Bit-mask reflecting the masked interrupt status of all the port pins
229  *
230  * The bits set in the returned bit-mask reflect the status of input lines
231  * triggering an interrupt. The bits cleared indicate that either no interrupt
232  * has been generated, or the interrupt is masked. This is the state of the
233  * interrupt after interrupt masking.
234  */
235 #define GPIO_GET_MASKED_INT_STATUS(PORT_BASE) \
236  REG((PORT_BASE) + GPIO_MIS)
237 
238 /** \brief Clear interrupt triggering for pins with PIN_MASK of port with
239  * PORT_BASE.
240  * \param PORT_BASE GPIO Port register offset
241  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
242  */
243 #define GPIO_CLEAR_INTERRUPT(PORT_BASE, PIN_MASK) \
244  do { REG((PORT_BASE) + GPIO_IC) = (PIN_MASK); } while(0)
245 
246 /** \brief Configure the pin to be under peripheral control with PIN_MASK of
247  * port with PORT_BASE.
248  * \param PORT_BASE GPIO Port register offset
249  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
250  */
251 #define GPIO_PERIPHERAL_CONTROL(PORT_BASE, PIN_MASK) \
252  do { REG((PORT_BASE) + GPIO_AFSEL) |= (PIN_MASK); } while(0)
253 
254 /** \brief Configure the pin to be software controlled with PIN_MASK of port
255  * with PORT_BASE.
256  * \param PORT_BASE GPIO Port register offset
257  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
258  */
259 #define GPIO_SOFTWARE_CONTROL(PORT_BASE, PIN_MASK) \
260  do { REG((PORT_BASE) + GPIO_AFSEL) &= ~(PIN_MASK); } while(0)
261 
262 /** \brief Set pins with PIN_MASK of port PORT to trigger a power-up interrupt
263  * on rising edge.
264  * \param PORT GPIO Port (not port base address)
265  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
266  */
267 #define GPIO_POWER_UP_ON_RISING(PORT, PIN_MASK) \
268  do { REG(GPIO_PORT_TO_BASE(PORT) + GPIO_P_EDGE_CTRL) &= \
269  ~((PIN_MASK) << ((PORT) << 3)); } while(0)
270 
271 /** \brief Set pins with PIN_MASK of port PORT to trigger a power-up interrupt
272  * on falling edge.
273  * \param PORT GPIO Port (not port base address)
274  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
275  */
276 #define GPIO_POWER_UP_ON_FALLING(PORT, PIN_MASK) \
277  do { REG(GPIO_PORT_TO_BASE(PORT) + GPIO_P_EDGE_CTRL) |= \
278  (PIN_MASK) << ((PORT) << 3); } while(0)
279 
280 /** \brief Enable power-up interrupt triggering for pins with PIN_MASK of port
281  * PORT.
282  * \param PORT GPIO Port (not port base address)
283  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
284  */
285 #define GPIO_ENABLE_POWER_UP_INTERRUPT(PORT, PIN_MASK) \
286  do { REG(GPIO_PORT_TO_BASE(PORT) + GPIO_PI_IEN) |= \
287  (PIN_MASK) << ((PORT) << 3); } while(0)
288 
289 /** \brief Disable power-up interrupt triggering for pins with PIN_MASK of port
290  * PORT.
291  * \param PORT GPIO Port (not port base address)
292  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
293  */
294 #define GPIO_DISABLE_POWER_UP_INTERRUPT(PORT, PIN_MASK) \
295  do { REG(GPIO_PORT_TO_BASE(PORT) + GPIO_PI_IEN) &= \
296  ~((PIN_MASK) << ((PORT) << 3)); } while(0)
297 
298 /** \brief Get power-up interrupt status of port PORT.
299  * \param PORT GPIO Port (not port base address)
300  * \return Bit-mask reflecting the power-up interrupt status of all the port
301  * pins
302  */
303 #define GPIO_GET_POWER_UP_INT_STATUS(PORT) \
304  ((REG(GPIO_PORT_TO_BASE(PORT) + GPIO_IRQ_DETECT_ACK) >> ((PORT) << 3)) & 0xFF)
305 
306 /** \brief Clear power-up interrupt triggering for pins with PIN_MASK of port
307  * PORT.
308  * \param PORT GPIO Port (not port base address)
309  * \param PIN_MASK Pin number mask. Pin 0: 0x01, Pin 1: 0x02 ... Pin 7: 0x80
310  */
311 #define GPIO_CLEAR_POWER_UP_INTERRUPT(PORT, PIN_MASK) \
312  do { REG(GPIO_PORT_TO_BASE(PORT) + GPIO_IRQ_DETECT_ACK) = \
313  (PIN_MASK) << ((PORT) << 3); } while(0)
314 
315 /**
316  * \brief Converts a pin number to a pin mask
317  * \param PIN The pin number in the range [0..7]
318  * \return A pin mask which can be used as the PIN_MASK argument of the macros
319  * in this category
320  */
321 #define GPIO_PIN_MASK(PIN) (1 << (PIN))
322 
323 /**
324  * \brief Converts a port number to the port base address
325  * \param PORT The port number in the range 0 - 3. Likely GPIO_X_NUM.
326  * \return The base address for the registers corresponding to that port
327  * number.
328  */
329 #define GPIO_PORT_TO_BASE(PORT) (GPIO_A_BASE + ((PORT) << 12))
330 /** @} */
331 /*---------------------------------------------------------------------------*/
332 /** \name GPIO Register offset declarations
333  * @{
334  */
335 #define GPIO_DATA 0x00000000 /**< Data register */
336 #define GPIO_DIR 0x00000400 /**< Data direction register */
337 #define GPIO_IS 0x00000404 /**< Interrupt sense */
338 #define GPIO_IBE 0x00000408 /**< Interrupt both edges */
339 #define GPIO_IEV 0x0000040C /**< Interrupt event */
340 #define GPIO_IE 0x00000410 /**< Interrupt mask */
341 #define GPIO_RIS 0x00000414 /**< Interrupt status - raw */
342 #define GPIO_MIS 0x00000418 /**< Interrupt status - masked */
343 #define GPIO_IC 0x0000041C /**< Interrupt clear */
344 #define GPIO_AFSEL 0x00000420 /**< Mode control select */
345 #define GPIO_GPIOLOCK 0x00000520 /**< GPIO commit unlock */
346 #define GPIO_GPIOCR 0x00000524 /**< GPIO commit */
347 #define GPIO_PMUX 0x00000700 /**< PMUX register */
348 #define GPIO_P_EDGE_CTRL 0x00000704 /**< Port edge control */
349 #define GPIO_USB_CTRL 0x00000708 /**< USB input power-up edge ctrl */
350 #define GPIO_PI_IEN 0x00000710 /**< Power-up interrupt enable */
351 #define GPIO_IRQ_DETECT_ACK 0x00000718 /**< IRQ detect ACK - I/O ports */
352 #define GPIO_USB_IRQ_ACK 0x0000071C /**< IRQ detect ACK - USB */
353 #define GPIO_IRQ_DETECT_UNMASK 0x00000720 /**< IRQ detect ACK - masked */
354 /** @} */
355 /*---------------------------------------------------------------------------*/
356 /** \name GPIO_DATA register bit masks
357  * @{
358  */
359 #define GPIO_DATA_DATA 0x000000FF /**< Input and output data */
360 /** @} */
361 /*---------------------------------------------------------------------------*/
362 /** \name GPIO_DIR register bit masks
363  * @{
364  */
365 #define GPIO_DIR_DIR 0x000000FF /**< Pin Input (0) / Output (1) */
366 /** @} */
367 /*---------------------------------------------------------------------------*/
368 /** \name GPIO_IS register bit masks
369  * @{
370  */
371 #define GPIO_IS_IS 0x000000FF /**< Detect Edge (0) / Level (1) */
372 /** @} */
373 /*---------------------------------------------------------------------------*/
374 /** \name GPIO_IBE register bit masks
375  * @{
376  */
377 #define GPIO_IBE_IBE 0x000000FF /**< Both Edges (1) / Single (0) */
378 /** @} */
379 /*---------------------------------------------------------------------------*/
380 /** \name GPIO_IEV register bit masks
381  * @{
382  */
383 #define GPIO_IEV_IEV 0x000000FF /**< Rising (1) / Falling (0) */
384 /** @} */
385 /*---------------------------------------------------------------------------*/
386 /** \name GPIO_IE register bit masks
387  * @{
388  */
389 #define GPIO_IE_IE 0x000000FF /**< Masked (0) / Not Masked (1) */
390 /** @} */
391 /*---------------------------------------------------------------------------*/
392 /** \name GPIO_RIS register bit masks
393  * @{
394  */
395 #define GPIO_RIS_RIS 0x000000FF /**< Raw interrupt status */
396 /** @} */
397 /*---------------------------------------------------------------------------*/
398 /** \name GPIO_MIS register bit masks
399  * @{
400  */
401 #define GPIO_MIS_MIS 0x000000FF /**< Masked interrupt status */
402 /** @} */
403 /*---------------------------------------------------------------------------*/
404 /** \name GPIO_IC register bit masks
405  * @{
406  */
407 #define GPIO_IC_IC 0x000000FF /**< Clear edge detection (1) */
408 /** @} */
409 /*---------------------------------------------------------------------------*/
410 /** \name GPIO_AFSEL register bit masks
411  * @{
412  */
413 #define GPIO_AFSEL_AFSEL 0x000000FF /**< Software (0) / Peripheral (1) */
414 /** @} */
415 /*---------------------------------------------------------------------------*/
416 /** \name GPIO_GPIOLOCK register bit masks
417  * @{
418  */
419 #define GPIO_GPIOLOCK_LOCK 0xFFFFFFFF /**< Locked (1) / Unlocked (0) */
420 /** @} */
421 /*---------------------------------------------------------------------------*/
422 /** \name GPIO_GPIOCR register bit masks
423  * @{
424  */
425 #define GPIO_GPIOCR_CR 0x000000FF /**< Allow alternate function (1) */
426 /** @} */
427 /*---------------------------------------------------------------------------*/
428 /** \name GPIO_PMUX register bit masks
429  * @{
430  */
431 #define GPIO_PMUX_CKOEN 0x00000080 /**< Clock out enable */
432 #define GPIO_PMUX_CKOPIN 0x00000010 /**< Decouple control pin select */
433 #define GPIO_PMUX_DCEN 0x00000008 /**< Decouple control enable */
434 #define GPIO_PMUX_DCPIN 0x00000001 /**< Decouple control pin select */
435 /** @} */
436 /*---------------------------------------------------------------------------*/
437 /** \name GPIO_P_EDGE_CTRL register bit masks.
438  * \brief Rising (0) / Falling (1)
439  * @{
440  */
441 #define GPIO_P_EDGE_CTRL_PDIRC7 0x80000000 /**< Port D bit 7 */
442 #define GPIO_P_EDGE_CTRL_PDIRC6 0x40000000 /**< Port D bit 6 */
443 #define GPIO_P_EDGE_CTRL_PDIRC5 0x20000000 /**< Port D bit 5 */
444 #define GPIO_P_EDGE_CTRL_PDIRC4 0x10000000 /**< Port D bit 4 */
445 #define GPIO_P_EDGE_CTRL_PDIRC3 0x08000000 /**< Port D bit 3 */
446 #define GPIO_P_EDGE_CTRL_PDIRC2 0x04000000 /**< Port D bit 2 */
447 #define GPIO_P_EDGE_CTRL_PDIRC1 0x02000000 /**< Port D bit 1 */
448 #define GPIO_P_EDGE_CTRL_PDIRC0 0x01000000 /**< Port D bit 0 */
449 #define GPIO_P_EDGE_CTRL_PCIRC7 0x00800000 /**< Port C bit 7 */
450 #define GPIO_P_EDGE_CTRL_PCIRC6 0x00400000 /**< Port C bit 6 */
451 #define GPIO_P_EDGE_CTRL_PCIRC5 0x00200000 /**< Port C bit 5 */
452 #define GPIO_P_EDGE_CTRL_PCIRC4 0x00100000 /**< Port C bit 4 */
453 #define GPIO_P_EDGE_CTRL_PCIRC3 0x00080000 /**< Port C bit 3 */
454 #define GPIO_P_EDGE_CTRL_PCIRC2 0x00040000 /**< Port C bit 2 */
455 #define GPIO_P_EDGE_CTRL_PCIRC1 0x00020000 /**< Port C bit 1 */
456 #define GPIO_P_EDGE_CTRL_PCIRC0 0x00010000 /**< Port C bit 0 */
457 #define GPIO_P_EDGE_CTRL_PBIRC7 0x00008000 /**< Port B bit 7 */
458 #define GPIO_P_EDGE_CTRL_PBIRC6 0x00004000 /**< Port B bit 6 */
459 #define GPIO_P_EDGE_CTRL_PBIRC5 0x00002000 /**< Port B bit 5 */
460 #define GPIO_P_EDGE_CTRL_PBIRC4 0x00001000 /**< Port B bit 4 */
461 #define GPIO_P_EDGE_CTRL_PBIRC3 0x00000800 /**< Port B bit 3 */
462 #define GPIO_P_EDGE_CTRL_PBIRC2 0x00000400 /**< Port B bit 2 */
463 #define GPIO_P_EDGE_CTRL_PBIRC1 0x00000200 /**< Port B bit 1 */
464 #define GPIO_P_EDGE_CTRL_PBIRC0 0x00000100 /**< Port B bit 0 */
465 #define GPIO_P_EDGE_CTRL_PAIRC7 0x00000080 /**< Port A bit 7 */
466 #define GPIO_P_EDGE_CTRL_PAIRC6 0x00000040 /**< Port A bit 6 */
467 #define GPIO_P_EDGE_CTRL_PAIRC5 0x00000020 /**< Port A bit 5 */
468 #define GPIO_P_EDGE_CTRL_PAIRC4 0x00000010 /**< Port A bit 4 */
469 #define GPIO_P_EDGE_CTRL_PAIRC3 0x00000008 /**< Port A bit 3 */
470 #define GPIO_P_EDGE_CTRL_PAIRC2 0x00000004 /**< Port A bit 2 */
471 #define GPIO_P_EDGE_CTRL_PAIRC1 0x00000002 /**< Port A bit 1 */
472 #define GPIO_P_EDGE_CTRL_PAIRC0 0x00000001 /**< Port A bit 0 */
473 /** @} */
474 /*---------------------------------------------------------------------------*/
475 /** \name GPIO_USB_CTRL register bit masks
476  * @{
477  */
478 #define GPIO_USB_CTRL_USB_EDGE_CTL 0x00000001 /**< Rising (0) / Falling (1) */
479 /** @} */
480 /*---------------------------------------------------------------------------*/
481 /** \name GPIO_PI_IEN register bit masks.
482  * \brief Enabled (1) / Disabled (0)
483  * @{
484  */
485 #define GPIO_PI_IEN_PDIEN7 0x80000000 /**< Port D bit 7 */
486 #define GPIO_PI_IEN_PDIEN6 0x40000000 /**< Port D bit 6 */
487 #define GPIO_PI_IEN_PDIEN5 0x20000000 /**< Port D bit 5 */
488 #define GPIO_PI_IEN_PDIEN4 0x10000000 /**< Port D bit 4 */
489 #define GPIO_PI_IEN_PDIEN3 0x08000000 /**< Port D bit 3 */
490 #define GPIO_PI_IEN_PDIEN2 0x04000000 /**< Port D bit 2 */
491 #define GPIO_PI_IEN_PDIEN1 0x02000000 /**< Port D bit 1 */
492 #define GPIO_PI_IEN_PDIEN0 0x01000000 /**< Port D bit 0 */
493 #define GPIO_PI_IEN_PCIEN7 0x00800000 /**< Port C bit 7 */
494 #define GPIO_PI_IEN_PCIEN6 0x00400000 /**< Port C bit 6 */
495 #define GPIO_PI_IEN_PCIEN5 0x00200000 /**< Port C bit 5 */
496 #define GPIO_PI_IEN_PCIEN4 0x00100000 /**< Port C bit 4 */
497 #define GPIO_PI_IEN_PCIEN3 0x00080000 /**< Port C bit 3 */
498 #define GPIO_PI_IEN_PCIEN2 0x00040000 /**< Port C bit 2 */
499 #define GPIO_PI_IEN_PCIEN1 0x00020000 /**< Port C bit 1 */
500 #define GPIO_PI_IEN_PCIEN0 0x00010000 /**< Port C bit 0 */
501 #define GPIO_PI_IEN_PBIEN7 0x00008000 /**< Port B bit 7 */
502 #define GPIO_PI_IEN_PBIEN6 0x00004000 /**< Port B bit 6 */
503 #define GPIO_PI_IEN_PBIEN5 0x00002000 /**< Port B bit 5 */
504 #define GPIO_PI_IEN_PBIEN4 0x00001000 /**< Port B bit 4 */
505 #define GPIO_PI_IEN_PBIEN3 0x00000800 /**< Port B bit 3 */
506 #define GPIO_PI_IEN_PBIEN2 0x00000400 /**< Port B bit 2 */
507 #define GPIO_PI_IEN_PBIEN1 0x00000200 /**< Port B bit 1 */
508 #define GPIO_PI_IEN_PBIEN0 0x00000100 /**< Port B bit 0 */
509 #define GPIO_PI_IEN_PAIEN7 0x00000080 /**< Port A bit 7 */
510 #define GPIO_PI_IEN_PAIEN6 0x00000040 /**< Port A bit 6 */
511 #define GPIO_PI_IEN_PAIEN5 0x00000020 /**< Port A bit 5 */
512 #define GPIO_PI_IEN_PAIEN4 0x00000010 /**< Port A bit 4 */
513 #define GPIO_PI_IEN_PAIEN3 0x00000008 /**< Port A bit 3 */
514 #define GPIO_PI_IEN_PAIEN2 0x00000004 /**< Port A bit 2 */
515 #define GPIO_PI_IEN_PAIEN1 0x00000002 /**< Port A bit 1 */
516 #define GPIO_PI_IEN_PAIEN0 0x00000001 /**< Port A bit 0 */
517 /** @} */
518 /*---------------------------------------------------------------------------*/
519 /** \name GPIO_IRQ_DETECT_ACK register bit masks
520  * \brief Detected (1) / Undetected (0)
521  * @{
522  */
523 #define GPIO_IRQ_DETECT_ACK_PDIACK7 0x80000000 /**< Port D bit 7 */
524 #define GPIO_IRQ_DETECT_ACK_PDIACK6 0x40000000 /**< Port D bit 6 */
525 #define GPIO_IRQ_DETECT_ACK_PDIACK5 0x20000000 /**< Port D bit 5 */
526 #define GPIO_IRQ_DETECT_ACK_PDIACK4 0x10000000 /**< Port D bit 4 */
527 #define GPIO_IRQ_DETECT_ACK_PDIACK3 0x08000000 /**< Port D bit 3 */
528 #define GPIO_IRQ_DETECT_ACK_PDIACK2 0x04000000 /**< Port D bit 2 */
529 #define GPIO_IRQ_DETECT_ACK_PDIACK1 0x02000000 /**< Port D bit 1 */
530 #define GPIO_IRQ_DETECT_ACK_PDIACK0 0x01000000 /**< Port D bit 0 */
531 #define GPIO_IRQ_DETECT_ACK_PCIACK7 0x00800000 /**< Port C bit 7 */
532 #define GPIO_IRQ_DETECT_ACK_PCIACK6 0x00400000 /**< Port C bit 6 */
533 #define GPIO_IRQ_DETECT_ACK_PCIACK5 0x00200000 /**< Port C bit 5 */
534 #define GPIO_IRQ_DETECT_ACK_PCIACK4 0x00100000 /**< Port C bit 4 */
535 #define GPIO_IRQ_DETECT_ACK_PCIACK3 0x00080000 /**< Port C bit 3 */
536 #define GPIO_IRQ_DETECT_ACK_PCIACK2 0x00040000 /**< Port C bit 2 */
537 #define GPIO_IRQ_DETECT_ACK_PCIACK1 0x00020000 /**< Port C bit 1 */
538 #define GPIO_IRQ_DETECT_ACK_PCIACK0 0x00010000 /**< Port C bit 0 */
539 #define GPIO_IRQ_DETECT_ACK_PBIACK7 0x00008000 /**< Port B bit 7 */
540 #define GPIO_IRQ_DETECT_ACK_PBIACK6 0x00004000 /**< Port B bit 6 */
541 #define GPIO_IRQ_DETECT_ACK_PBIACK5 0x00002000 /**< Port B bit 5 */
542 #define GPIO_IRQ_DETECT_ACK_PBIACK4 0x00001000 /**< Port B bit 4 */
543 #define GPIO_IRQ_DETECT_ACK_PBIACK3 0x00000800 /**< Port B bit 3 */
544 #define GPIO_IRQ_DETECT_ACK_PBIACK2 0x00000400 /**< Port B bit 2 */
545 #define GPIO_IRQ_DETECT_ACK_PBIACK1 0x00000200 /**< Port B bit 1 */
546 #define GPIO_IRQ_DETECT_ACK_PBIACK0 0x00000100 /**< Port B bit 0 */
547 #define GPIO_IRQ_DETECT_ACK_PAIACK7 0x00000080 /**< Port A bit 7 */
548 #define GPIO_IRQ_DETECT_ACK_PAIACK6 0x00000040 /**< Port A bit 6 */
549 #define GPIO_IRQ_DETECT_ACK_PAIACK5 0x00000020 /**< Port A bit 5 */
550 #define GPIO_IRQ_DETECT_ACK_PAIACK4 0x00000010 /**< Port A bit 4 */
551 #define GPIO_IRQ_DETECT_ACK_PAIACK3 0x00000008 /**< Port A bit 3 */
552 #define GPIO_IRQ_DETECT_ACK_PAIACK2 0x00000004 /**< Port A bit 2 */
553 #define GPIO_IRQ_DETECT_ACK_PAIACK1 0x00000002 /**< Port A bit 1 */
554 #define GPIO_IRQ_DETECT_ACK_PAIACK0 0x00000001 /**< Port A bit 0 */
555 /** @} */
556 /*---------------------------------------------------------------------------*/
557 /** \name GPIO_USB_IRQ_ACK register bit masks
558  * @{
559  */
560 #define GPIO_USB_IRQ_ACK_USBACK 0x00000001 /**< Detected (1) / Not detected (0) */
561 /** @} */
562 /*---------------------------------------------------------------------------*/
563 /** \name GPIO_IRQ_DETECT_UNMASK register bit masks.
564  * \brief Detected (1) / Not detected (0)
565  * @{
566  */
567 #define GPIO_IRQ_DETECT_UNMASK_PDIACK7 0x80000000 /**< Port D bit 7 */
568 #define GPIO_IRQ_DETECT_UNMASK_PDIACK6 0x40000000 /**< Port D bit 6 */
569 #define GPIO_IRQ_DETECT_UNMASK_PDIACK5 0x20000000 /**< Port D bit 5 */
570 #define GPIO_IRQ_DETECT_UNMASK_PDIACK4 0x10000000 /**< Port D bit 4 */
571 #define GPIO_IRQ_DETECT_UNMASK_PDIACK3 0x08000000 /**< Port D bit 3 */
572 #define GPIO_IRQ_DETECT_UNMASK_PDIACK2 0x04000000 /**< Port D bit 2 */
573 #define GPIO_IRQ_DETECT_UNMASK_PDIACK1 0x02000000 /**< Port D bit 1 */
574 #define GPIO_IRQ_DETECT_UNMASK_PDIACK0 0x01000000 /**< Port D bit 0 */
575 #define GPIO_IRQ_DETECT_UNMASK_PCIACK7 0x00800000 /**< Port C bit 7 */
576 #define GPIO_IRQ_DETECT_UNMASK_PCIACK6 0x00400000 /**< Port C bit 6 */
577 #define GPIO_IRQ_DETECT_UNMASK_PCIACK5 0x00200000 /**< Port C bit 5 */
578 #define GPIO_IRQ_DETECT_UNMASK_PCIACK4 0x00100000 /**< Port C bit 4 */
579 #define GPIO_IRQ_DETECT_UNMASK_PCIACK3 0x00080000 /**< Port C bit 3 */
580 #define GPIO_IRQ_DETECT_UNMASK_PCIACK2 0x00040000 /**< Port C bit 2 */
581 #define GPIO_IRQ_DETECT_UNMASK_PCIACK1 0x00020000 /**< Port C bit 1 */
582 #define GPIO_IRQ_DETECT_UNMASK_PCIACK0 0x00010000 /**< Port C bit 0 */
583 #define GPIO_IRQ_DETECT_UNMASK_PBIACK7 0x00008000 /**< Port B bit 7 */
584 #define GPIO_IRQ_DETECT_UNMASK_PBIACK6 0x00004000 /**< Port B bit 6 */
585 #define GPIO_IRQ_DETECT_UNMASK_PBIACK5 0x00002000 /**< Port B bit 5 */
586 #define GPIO_IRQ_DETECT_UNMASK_PBIACK4 0x00001000 /**< Port B bit 4 */
587 #define GPIO_IRQ_DETECT_UNMASK_PBIACK3 0x00000800 /**< Port B bit 3 */
588 #define GPIO_IRQ_DETECT_UNMASK_PBIACK2 0x00000400 /**< Port B bit 2 */
589 #define GPIO_IRQ_DETECT_UNMASK_PBIACK1 0x00000200 /**< Port B bit 1 */
590 #define GPIO_IRQ_DETECT_UNMASK_PBIACK0 0x00000100 /**< Port B bit 0 */
591 #define GPIO_IRQ_DETECT_UNMASK_PAIACK7 0x00000080 /**< Port A bit 7 */
592 #define GPIO_IRQ_DETECT_UNMASK_PAIACK6 0x00000040 /**< Port A bit 6 */
593 #define GPIO_IRQ_DETECT_UNMASK_PAIACK5 0x00000020 /**< Port A bit 5 */
594 #define GPIO_IRQ_DETECT_UNMASK_PAIACK4 0x00000010 /**< Port A bit 4 */
595 #define GPIO_IRQ_DETECT_UNMASK_PAIACK3 0x00000008 /**< Port A bit 3 */
596 #define GPIO_IRQ_DETECT_UNMASK_PAIACK2 0x00000004 /**< Port A bit 2 */
597 #define GPIO_IRQ_DETECT_UNMASK_PAIACK1 0x00000002 /**< Port A bit 1 */
598 #define GPIO_IRQ_DETECT_UNMASK_PAIACK0 0x00000001 /**< Port A bit 0 */
599 /** @} */
600 /*---------------------------------------------------------------------------*/
601 /** \brief Initialise the GPIO module */
602 void gpio_init();
603 
604 /**
605  * \brief Register GPIO callback
606  * \param f Pointer to a function to be called when \a pin of \a port
607  * generates an interrupt
608  * \param port Associate \a f with this port. \e port must be specified with
609  * its numeric representation (Port A:0, B:1 etc). Defines for these
610  * numeric representations are GPIO_x_NUM
611  * \param pin Associate \a f with this pin, which is specified by number
612  * (0, 1, ..., 7)
613  */
614 void gpio_register_callback(gpio_callback_t f, uint8_t port, uint8_t pin);
615 
616 #endif /* GPIO_H_ */
617 
618 /**
619  * @}
620  * @}
621  */
void gpio_init()
initialise the Port interrupt callback function arrays.
Definition: gpio.c:13
Header file with register manipulation macro definitions.
void(* gpio_callback_t)(uint8_t port, uint8_t pin)
Type definition for callbacks invoked by the GPIO ISRs.
Definition: gpio.h:65
void gpio_register_callback(gpio_callback_t f, uint8_t port, uint8_t pin)
Register GPIO callback.
Definition: gpio.c:56