Code: Select all
void IRAM_ATTR gpio_intr_service_2(void* arg)
{
//read status to get interrupt status for GPIO0-31
uint32_t gpio_intr_status;
gpio_intr_status = GPIO.status;
//read status1 to get interrupt status for GPIO32-39
uint32_t gpio_intr_status_h;
gpio_intr_status_h = GPIO.status1.intr_st;
if (gpio_isr_func == NULL) {
return;
}
//clear intr status for all bit in one call
GPIO.status_w1tc = gpio_intr_status;
GPIO.status1_w1tc.intr_st = gpio_intr_status_h;
uint8_t x = 0;
while (gpio_intr_status) { //check if we have any interrupts for gpio0-gpio31
if (gpio_intr_status & BIT(0)) {
if (gpio_isr_func[x].fn != NULL) {
gpio_isr_func[x].fn(gpio_isr_func[x].args);
}
}
gpio_intr_status = gpio_intr_status>>1;
x++;
} ;
x=32;
while (gpio_intr_status_h) {//check if we have any interrupts for gpio32-gpio39
if (gpio_intr_status_h & BIT(0)) {
if (gpio_isr_func[x].fn != NULL) {
gpio_isr_func[x].fn(gpio_isr_func[x].args);
}
}
gpio_intr_status_h = gpio_intr_status_h>>1;
x++;
} ;
}
Code: Select all
void IRAM_ATTR gpio_intr_service(void* arg)
{
//GPIO intr process
uint32_t gpio_num = 0;
//read status to get interrupt status for GPIO0-31
uint32_t gpio_intr_status;
gpio_intr_status = GPIO.status;
//read status1 to get interrupt status for GPIO32-39
uint32_t gpio_intr_status_h;
gpio_intr_status_h = GPIO.status1.intr_st;
if (gpio_isr_func == NULL) {
return;
}
do {
if (gpio_num < 32) {
if (gpio_intr_status & BIT(gpio_num)) { //gpio0-gpio31
if (gpio_isr_func[gpio_num].fn != NULL) {
gpio_isr_func[gpio_num].fn(gpio_isr_func[gpio_num].args);
}
GPIO.status_w1tc = BIT(gpio_num);
}
} else {
if (gpio_intr_status_h & BIT(gpio_num - 32)) {
if (gpio_isr_func[gpio_num].fn != NULL) {
gpio_isr_func[gpio_num].fn(gpio_isr_func[gpio_num].args);
}
GPIO.status1_w1tc.intr_st = BIT(gpio_num - 32);
}
}
} while (++gpio_num < GPIO_PIN_COUNT);
}