70 #define GPIO_A_BASE 0x400D9000
71 #define GPIO_B_BASE 0x400DA000
72 #define GPIO_C_BASE 0x400DB000
73 #define GPIO_D_BASE 0x400DC000
93 #define GPIO_SET_INPUT(PORT_BASE, PIN_MASK) \
94 do { REG((PORT_BASE) + GPIO_DIR) &= ~(PIN_MASK); } while(0)
100 #define GPIO_SET_OUTPUT(PORT_BASE, PIN_MASK) \
101 do { REG((PORT_BASE) + GPIO_DIR) |= (PIN_MASK); } while(0)
107 #define GPIO_SET_PIN(PORT_BASE, PIN_MASK) \
108 do { REG((PORT_BASE) + GPIO_DATA + ((PIN_MASK) << 2)) = 0xFF; } while(0)
114 #define GPIO_CLR_PIN(PORT_BASE, PIN_MASK) \
115 do { REG((PORT_BASE) + GPIO_DATA + ((PIN_MASK) << 2)) = 0x00; } while(0)
135 #define GPIO_WRITE_PIN(PORT_BASE, PIN_MASK, value) \
136 do { REG((PORT_BASE) + GPIO_DATA + ((PIN_MASK) << 2)) = (value); } while(0)
148 #define GPIO_READ_PIN(PORT_BASE, PIN_MASK) \
149 REG((PORT_BASE) + GPIO_DATA + ((PIN_MASK) << 2))
155 #define GPIO_DETECT_EDGE(PORT_BASE, PIN_MASK) \
156 do { REG((PORT_BASE) + GPIO_IS) &= ~(PIN_MASK); } while(0)
162 #define GPIO_DETECT_LEVEL(PORT_BASE, PIN_MASK) \
163 do { REG((PORT_BASE) + GPIO_IS) |= (PIN_MASK); } while(0)
170 #define GPIO_TRIGGER_BOTH_EDGES(PORT_BASE, PIN_MASK) \
171 do { REG((PORT_BASE) + GPIO_IBE) |= (PIN_MASK); } while(0)
178 #define GPIO_TRIGGER_SINGLE_EDGE(PORT_BASE, PIN_MASK) \
179 do { REG((PORT_BASE) + GPIO_IBE) &= ~(PIN_MASK); } while(0)
186 #define GPIO_DETECT_RISING(PORT_BASE, PIN_MASK) \
187 do { REG((PORT_BASE) + GPIO_IEV) |= (PIN_MASK); } while(0)
194 #define GPIO_DETECT_FALLING(PORT_BASE, PIN_MASK) \
195 do { REG((PORT_BASE) + GPIO_IEV) &= ~(PIN_MASK); } while(0)
202 #define GPIO_ENABLE_INTERRUPT(PORT_BASE, PIN_MASK) \
203 do { REG((PORT_BASE) + GPIO_IE) |= (PIN_MASK); } while(0)
210 #define GPIO_DISABLE_INTERRUPT(PORT_BASE, PIN_MASK) \
211 do { REG((PORT_BASE) + GPIO_IE) &= ~(PIN_MASK); } while(0)
223 #define GPIO_GET_RAW_INT_STATUS(PORT_BASE) \
224 REG((PORT_BASE) + GPIO_RIS)
235 #define GPIO_GET_MASKED_INT_STATUS(PORT_BASE) \
236 REG((PORT_BASE) + GPIO_MIS)
243 #define GPIO_CLEAR_INTERRUPT(PORT_BASE, PIN_MASK) \
244 do { REG((PORT_BASE) + GPIO_IC) = (PIN_MASK); } while(0)
251 #define GPIO_PERIPHERAL_CONTROL(PORT_BASE, PIN_MASK) \
252 do { REG((PORT_BASE) + GPIO_AFSEL) |= (PIN_MASK); } while(0)
259 #define GPIO_SOFTWARE_CONTROL(PORT_BASE, PIN_MASK) \
260 do { REG((PORT_BASE) + GPIO_AFSEL) &= ~(PIN_MASK); } while(0)
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)
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)
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)
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)
303 #define GPIO_GET_POWER_UP_INT_STATUS(PORT) \
304 ((REG(GPIO_PORT_TO_BASE(PORT) + GPIO_IRQ_DETECT_ACK) >> ((PORT) << 3)) & 0xFF)
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)
321 #define GPIO_PIN_MASK(PIN) (1 << (PIN))
329 #define GPIO_PORT_TO_BASE(PORT) (GPIO_A_BASE + ((PORT) << 12))
335 #define GPIO_DATA 0x00000000
336 #define GPIO_DIR 0x00000400
337 #define GPIO_IS 0x00000404
338 #define GPIO_IBE 0x00000408
339 #define GPIO_IEV 0x0000040C
340 #define GPIO_IE 0x00000410
341 #define GPIO_RIS 0x00000414
342 #define GPIO_MIS 0x00000418
343 #define GPIO_IC 0x0000041C
344 #define GPIO_AFSEL 0x00000420
345 #define GPIO_GPIOLOCK 0x00000520
346 #define GPIO_GPIOCR 0x00000524
347 #define GPIO_PMUX 0x00000700
348 #define GPIO_P_EDGE_CTRL 0x00000704
349 #define GPIO_USB_CTRL 0x00000708
350 #define GPIO_PI_IEN 0x00000710
351 #define GPIO_IRQ_DETECT_ACK 0x00000718
352 #define GPIO_USB_IRQ_ACK 0x0000071C
353 #define GPIO_IRQ_DETECT_UNMASK 0x00000720
359 #define GPIO_DATA_DATA 0x000000FF
365 #define GPIO_DIR_DIR 0x000000FF
371 #define GPIO_IS_IS 0x000000FF
377 #define GPIO_IBE_IBE 0x000000FF
383 #define GPIO_IEV_IEV 0x000000FF
389 #define GPIO_IE_IE 0x000000FF
395 #define GPIO_RIS_RIS 0x000000FF
401 #define GPIO_MIS_MIS 0x000000FF
407 #define GPIO_IC_IC 0x000000FF
413 #define GPIO_AFSEL_AFSEL 0x000000FF
419 #define GPIO_GPIOLOCK_LOCK 0xFFFFFFFF
425 #define GPIO_GPIOCR_CR 0x000000FF
431 #define GPIO_PMUX_CKOEN 0x00000080
432 #define GPIO_PMUX_CKOPIN 0x00000010
433 #define GPIO_PMUX_DCEN 0x00000008
434 #define GPIO_PMUX_DCPIN 0x00000001
441 #define GPIO_P_EDGE_CTRL_PDIRC7 0x80000000
442 #define GPIO_P_EDGE_CTRL_PDIRC6 0x40000000
443 #define GPIO_P_EDGE_CTRL_PDIRC5 0x20000000
444 #define GPIO_P_EDGE_CTRL_PDIRC4 0x10000000
445 #define GPIO_P_EDGE_CTRL_PDIRC3 0x08000000
446 #define GPIO_P_EDGE_CTRL_PDIRC2 0x04000000
447 #define GPIO_P_EDGE_CTRL_PDIRC1 0x02000000
448 #define GPIO_P_EDGE_CTRL_PDIRC0 0x01000000
449 #define GPIO_P_EDGE_CTRL_PCIRC7 0x00800000
450 #define GPIO_P_EDGE_CTRL_PCIRC6 0x00400000
451 #define GPIO_P_EDGE_CTRL_PCIRC5 0x00200000
452 #define GPIO_P_EDGE_CTRL_PCIRC4 0x00100000
453 #define GPIO_P_EDGE_CTRL_PCIRC3 0x00080000
454 #define GPIO_P_EDGE_CTRL_PCIRC2 0x00040000
455 #define GPIO_P_EDGE_CTRL_PCIRC1 0x00020000
456 #define GPIO_P_EDGE_CTRL_PCIRC0 0x00010000
457 #define GPIO_P_EDGE_CTRL_PBIRC7 0x00008000
458 #define GPIO_P_EDGE_CTRL_PBIRC6 0x00004000
459 #define GPIO_P_EDGE_CTRL_PBIRC5 0x00002000
460 #define GPIO_P_EDGE_CTRL_PBIRC4 0x00001000
461 #define GPIO_P_EDGE_CTRL_PBIRC3 0x00000800
462 #define GPIO_P_EDGE_CTRL_PBIRC2 0x00000400
463 #define GPIO_P_EDGE_CTRL_PBIRC1 0x00000200
464 #define GPIO_P_EDGE_CTRL_PBIRC0 0x00000100
465 #define GPIO_P_EDGE_CTRL_PAIRC7 0x00000080
466 #define GPIO_P_EDGE_CTRL_PAIRC6 0x00000040
467 #define GPIO_P_EDGE_CTRL_PAIRC5 0x00000020
468 #define GPIO_P_EDGE_CTRL_PAIRC4 0x00000010
469 #define GPIO_P_EDGE_CTRL_PAIRC3 0x00000008
470 #define GPIO_P_EDGE_CTRL_PAIRC2 0x00000004
471 #define GPIO_P_EDGE_CTRL_PAIRC1 0x00000002
472 #define GPIO_P_EDGE_CTRL_PAIRC0 0x00000001
478 #define GPIO_USB_CTRL_USB_EDGE_CTL 0x00000001
485 #define GPIO_PI_IEN_PDIEN7 0x80000000
486 #define GPIO_PI_IEN_PDIEN6 0x40000000
487 #define GPIO_PI_IEN_PDIEN5 0x20000000
488 #define GPIO_PI_IEN_PDIEN4 0x10000000
489 #define GPIO_PI_IEN_PDIEN3 0x08000000
490 #define GPIO_PI_IEN_PDIEN2 0x04000000
491 #define GPIO_PI_IEN_PDIEN1 0x02000000
492 #define GPIO_PI_IEN_PDIEN0 0x01000000
493 #define GPIO_PI_IEN_PCIEN7 0x00800000
494 #define GPIO_PI_IEN_PCIEN6 0x00400000
495 #define GPIO_PI_IEN_PCIEN5 0x00200000
496 #define GPIO_PI_IEN_PCIEN4 0x00100000
497 #define GPIO_PI_IEN_PCIEN3 0x00080000
498 #define GPIO_PI_IEN_PCIEN2 0x00040000
499 #define GPIO_PI_IEN_PCIEN1 0x00020000
500 #define GPIO_PI_IEN_PCIEN0 0x00010000
501 #define GPIO_PI_IEN_PBIEN7 0x00008000
502 #define GPIO_PI_IEN_PBIEN6 0x00004000
503 #define GPIO_PI_IEN_PBIEN5 0x00002000
504 #define GPIO_PI_IEN_PBIEN4 0x00001000
505 #define GPIO_PI_IEN_PBIEN3 0x00000800
506 #define GPIO_PI_IEN_PBIEN2 0x00000400
507 #define GPIO_PI_IEN_PBIEN1 0x00000200
508 #define GPIO_PI_IEN_PBIEN0 0x00000100
509 #define GPIO_PI_IEN_PAIEN7 0x00000080
510 #define GPIO_PI_IEN_PAIEN6 0x00000040
511 #define GPIO_PI_IEN_PAIEN5 0x00000020
512 #define GPIO_PI_IEN_PAIEN4 0x00000010
513 #define GPIO_PI_IEN_PAIEN3 0x00000008
514 #define GPIO_PI_IEN_PAIEN2 0x00000004
515 #define GPIO_PI_IEN_PAIEN1 0x00000002
516 #define GPIO_PI_IEN_PAIEN0 0x00000001
523 #define GPIO_IRQ_DETECT_ACK_PDIACK7 0x80000000
524 #define GPIO_IRQ_DETECT_ACK_PDIACK6 0x40000000
525 #define GPIO_IRQ_DETECT_ACK_PDIACK5 0x20000000
526 #define GPIO_IRQ_DETECT_ACK_PDIACK4 0x10000000
527 #define GPIO_IRQ_DETECT_ACK_PDIACK3 0x08000000
528 #define GPIO_IRQ_DETECT_ACK_PDIACK2 0x04000000
529 #define GPIO_IRQ_DETECT_ACK_PDIACK1 0x02000000
530 #define GPIO_IRQ_DETECT_ACK_PDIACK0 0x01000000
531 #define GPIO_IRQ_DETECT_ACK_PCIACK7 0x00800000
532 #define GPIO_IRQ_DETECT_ACK_PCIACK6 0x00400000
533 #define GPIO_IRQ_DETECT_ACK_PCIACK5 0x00200000
534 #define GPIO_IRQ_DETECT_ACK_PCIACK4 0x00100000
535 #define GPIO_IRQ_DETECT_ACK_PCIACK3 0x00080000
536 #define GPIO_IRQ_DETECT_ACK_PCIACK2 0x00040000
537 #define GPIO_IRQ_DETECT_ACK_PCIACK1 0x00020000
538 #define GPIO_IRQ_DETECT_ACK_PCIACK0 0x00010000
539 #define GPIO_IRQ_DETECT_ACK_PBIACK7 0x00008000
540 #define GPIO_IRQ_DETECT_ACK_PBIACK6 0x00004000
541 #define GPIO_IRQ_DETECT_ACK_PBIACK5 0x00002000
542 #define GPIO_IRQ_DETECT_ACK_PBIACK4 0x00001000
543 #define GPIO_IRQ_DETECT_ACK_PBIACK3 0x00000800
544 #define GPIO_IRQ_DETECT_ACK_PBIACK2 0x00000400
545 #define GPIO_IRQ_DETECT_ACK_PBIACK1 0x00000200
546 #define GPIO_IRQ_DETECT_ACK_PBIACK0 0x00000100
547 #define GPIO_IRQ_DETECT_ACK_PAIACK7 0x00000080
548 #define GPIO_IRQ_DETECT_ACK_PAIACK6 0x00000040
549 #define GPIO_IRQ_DETECT_ACK_PAIACK5 0x00000020
550 #define GPIO_IRQ_DETECT_ACK_PAIACK4 0x00000010
551 #define GPIO_IRQ_DETECT_ACK_PAIACK3 0x00000008
552 #define GPIO_IRQ_DETECT_ACK_PAIACK2 0x00000004
553 #define GPIO_IRQ_DETECT_ACK_PAIACK1 0x00000002
554 #define GPIO_IRQ_DETECT_ACK_PAIACK0 0x00000001
560 #define GPIO_USB_IRQ_ACK_USBACK 0x00000001
567 #define GPIO_IRQ_DETECT_UNMASK_PDIACK7 0x80000000
568 #define GPIO_IRQ_DETECT_UNMASK_PDIACK6 0x40000000
569 #define GPIO_IRQ_DETECT_UNMASK_PDIACK5 0x20000000
570 #define GPIO_IRQ_DETECT_UNMASK_PDIACK4 0x10000000
571 #define GPIO_IRQ_DETECT_UNMASK_PDIACK3 0x08000000
572 #define GPIO_IRQ_DETECT_UNMASK_PDIACK2 0x04000000
573 #define GPIO_IRQ_DETECT_UNMASK_PDIACK1 0x02000000
574 #define GPIO_IRQ_DETECT_UNMASK_PDIACK0 0x01000000
575 #define GPIO_IRQ_DETECT_UNMASK_PCIACK7 0x00800000
576 #define GPIO_IRQ_DETECT_UNMASK_PCIACK6 0x00400000
577 #define GPIO_IRQ_DETECT_UNMASK_PCIACK5 0x00200000
578 #define GPIO_IRQ_DETECT_UNMASK_PCIACK4 0x00100000
579 #define GPIO_IRQ_DETECT_UNMASK_PCIACK3 0x00080000
580 #define GPIO_IRQ_DETECT_UNMASK_PCIACK2 0x00040000
581 #define GPIO_IRQ_DETECT_UNMASK_PCIACK1 0x00020000
582 #define GPIO_IRQ_DETECT_UNMASK_PCIACK0 0x00010000
583 #define GPIO_IRQ_DETECT_UNMASK_PBIACK7 0x00008000
584 #define GPIO_IRQ_DETECT_UNMASK_PBIACK6 0x00004000
585 #define GPIO_IRQ_DETECT_UNMASK_PBIACK5 0x00002000
586 #define GPIO_IRQ_DETECT_UNMASK_PBIACK4 0x00001000
587 #define GPIO_IRQ_DETECT_UNMASK_PBIACK3 0x00000800
588 #define GPIO_IRQ_DETECT_UNMASK_PBIACK2 0x00000400
589 #define GPIO_IRQ_DETECT_UNMASK_PBIACK1 0x00000200
590 #define GPIO_IRQ_DETECT_UNMASK_PBIACK0 0x00000100
591 #define GPIO_IRQ_DETECT_UNMASK_PAIACK7 0x00000080
592 #define GPIO_IRQ_DETECT_UNMASK_PAIACK6 0x00000040
593 #define GPIO_IRQ_DETECT_UNMASK_PAIACK5 0x00000020
594 #define GPIO_IRQ_DETECT_UNMASK_PAIACK4 0x00000010
595 #define GPIO_IRQ_DETECT_UNMASK_PAIACK3 0x00000008
596 #define GPIO_IRQ_DETECT_UNMASK_PAIACK2 0x00000004
597 #define GPIO_IRQ_DETECT_UNMASK_PAIACK1 0x00000002
598 #define GPIO_IRQ_DETECT_UNMASK_PAIACK0 0x00000001
void gpio_init()
initialise the Port interrupt callback function arrays.
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.
void gpio_register_callback(gpio_callback_t f, uint8_t port, uint8_t pin)
Register GPIO callback.