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';
 | 
						|
} |