61 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /**
 | |
|  * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-3-Clause
 | |
|  */
 | |
| 
 | |
| #include <stdio.h>
 | |
| #include "pico/stdlib.h"
 | |
| #include "hardware/gpio.h"
 | |
| 
 | |
| static char event_str[128];
 | |
| 
 | |
| void gpio_event_string(char *buf, uint32_t events);
 | |
| 
 | |
| void gpio_callback(uint gpio, uint32_t events) {
 | |
|     // Put the GPIO event(s) that just happened into event_str
 | |
|     // so we can print it
 | |
|     gpio_event_string(event_str, events);
 | |
|     printf("GPIO %d %s\n", gpio, event_str);
 | |
| }
 | |
| 
 | |
| int main() {
 | |
|     stdio_init_all();
 | |
| 
 | |
|     printf("Hello GPIO IRQ\n");
 | |
|     gpio_set_irq_enabled_with_callback(2, GPIO_IRQ_EDGE_RISE | GPIO_IRQ_EDGE_FALL, true, &gpio_callback);
 | |
| 
 | |
|     // Wait forever
 | |
|     while (1);
 | |
| 
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| 
 | |
| static const char *gpio_irq_str[] = {
 | |
|         "LEVEL_LOW",  // 0x1
 | |
|         "LEVEL_HIGH", // 0x2
 | |
|         "EDGE_FALL",  // 0x4
 | |
|         "EDGE_RISE"   // 0x8
 | |
| };
 | |
| 
 | |
| void gpio_event_string(char *buf, uint32_t events) {
 | |
|     for (uint i = 0; i < 4; i++) {
 | |
|         uint mask = (1 << i);
 | |
|         if (events & mask) {
 | |
|             // Copy this event string into the user string
 | |
|             const char *event_str = gpio_irq_str[i];
 | |
|             while (*event_str != '\0') {
 | |
|                 *buf++ = *event_str++;
 | |
|             }
 | |
|             events &= ~mask;
 | |
| 
 | |
|             // If more events add ", "
 | |
|             if (events) {
 | |
|                 *buf++ = ',';
 | |
|                 *buf++ = ' ';
 | |
|             }
 | |
|         }
 | |
|     }
 | |
|     *buf++ = '\0';
 | |
| } |