0

Je suis en train d'attacher un gestionnaire IRQ à une banque GPIO 0 i.e. 0B irq no 97.InterruptAttach échoue sur am3352x numéro 97 pour la banque irq 0B

À l'heure actuelle, mon implémentation revient avec -1. Qu'est-ce que je fais mal? Ce serait une question très simple à mettre en œuvre.

#include <stdio.h>                
#include <unistd.h>                
#include "gpio.h" 
#include <sys/neutrino.h>              
#include "interrupt.h"               
volatile unsigned int gpio0_irq_count;           

static const struct sigevent * gpio0_irq_handler (void *gpio, int id){  
    gpio0_irq_count++; 
    return NULL; 
} 

int main(){ 
    int ret; 
    unsigned long count=0; 
    ret = InterruptAttach(97, gpio0_irq_handler, NULL,0,_NTO_INTR_FLAGS_TRK_MSK); 
    printf("%s: Registering handler for irq %d result = %d\n",__func__ , 97, ret); 
    if (ret) 
     return -1; 
    while(1){ 
     printf("%s:[%lu] : gpio0_irq_count = %d\n", __func__, count++, gpio0_irq_count); 
     sleep(2); 
    } 
} 

La sortie erroné est:

main: Registering handler for irq 97 result = -1 

Répondre

0

Après beaucoup d'avant en arrière avec QNX, il se trouve que un processus demandeur InterruptAttach() ou InterruptAttach_r() a besoin d'autorisations élevées acquises par

ThreadCtl(_NTO_TCTL_IO, 0); 

Une fois que cela est exécuté le travail de l'API. Cependant, il faut encore configurer les registres gpio pour déclencher l'interruption.

GPIO_OE 
GPIO_STATUS 
GPIO_STATUS_SET 
GPIO_CTRL 
GPIO_RISINGDETECT