Skip navigation.
Home
The QNX Community Portal

View topic - interrupt on BeagleBone

interrupt on BeagleBone

anything that doesn't fit to other groups.

interrupt on BeagleBone

Postby Guest » Wed Sep 25, 2013 6:41 pm

Hi guys,
I'm trying to use the interrupts on my BeagleBone running QNX 6.5.

I would use the GPIO1_12 on P8 header connector as source. My intention should be to detect when a user press a button and the GPIO1_12 falls to GND.
So, in order to do that, I set-up the GPIO1_12 as input, in pullup configuration and setup the GPIO_FALLINGDETECT register.

Unfortunately something goes wrong and when I try to press the button, nothing happens.

Here is my code:

Code: Select all
#include <cstdlib>
#include <iostream>
#include <sys/mman.h>
#include <pthread.h>
#include <sys/neutrino.h>
#include <errno.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdint.h>
#include <hw/inout.h>
#include <am335x.h>
#include <stdio.h>

#define AM335X_CTRL_BASE   0x44E10000
#define conf_gpmc_ad12      0x0830 // (AM335X_CTRL_BASE+0x0830)
#define SLEWCTRL         (0x1 << 6)
#define   RXACTIVE         (0x1 << 5)
#define   PULLUP_EN         (0x1 << 4) /* Pull UP Selection */
#define PULLUDEN         (0x0 << 3) /* Pull up enabled */
#define PULLUDDIS         (0x1 << 3) /* Pull up disabled */
#define MODE(val)         val
#define GPIO_OE          0x134
#define AM335X_GPIO_SIZE   0x00001000
#define AM335X_GPIO1_BASE   0x4804C000
#define GPIO1_IRQ 98

int init_gpio1_12(void);
const struct sigevent * isr_handler (void *arg, int id);
void * int_thread (void *arg);

struct sigevent event;
uintptr_t ptr;
uintptr_t ptr2;
int count;
int error;

int main(int argc, char *argv[]) {

   init_gpio1_12();

   event.sigev_notify = SIGEV_INTR;

   printf("Creating interrupt thread…\n");

   pthread_create (NULL, NULL, int_thread, NULL);
   delay(5);

   while(!error) {
   printf("count=%i\n", count);
   fflush(stdout);
   sleep(1);
   }

    return EXIT_SUCCESS;

}

int init_gpio1_12()
{
   int pad;

      ThreadCtl(_NTO_TCTL_IO, 0);

      ptr = (uintptr_t)mmap_device_memory(0, AM335X_CTRL_BASE+0x0840, PROT_READ|PROT_WRITE|PROT_NOCACHE, 0, AM335X_CTRL_BASE);

   if ( ptr == MAP_DEVICE_FAILED ) {
      perror( "mmap_device_memory for physical address failed");
      return -1;
   }

   pad = in32(ptr + conf_gpmc_ad12) & 0x0000ffff;

   out32(ptr + conf_gpmc_ad12, MODE(7) | PULLUDEN | PULLUP_EN | RXACTIVE | SLEWCTRL);

   pad = in32(ptr + conf_gpmc_ad12);

      ptr2 = (uint32_t) mmap_device_memory(0, AM335X_GPIO_SIZE, PROT_READ|PROT_WRITE|PROT_NOCACHE, 0, AM335X_GPIO1_BASE);

   if ( ptr2 == MAP_DEVICE_FAILED ) {
      perror( "mmap_device_memory for physical address failed");
      return -1;
   }

   out32(ptr2 + GPIO_OE,(1<<12));

   out32(ptr2 + GPIO_FALLINGDETECT, (1 << 12));
}

const struct sigevent * isr_handler (void *arg, int id)
{
   return (&event);
}

void * int_thread (void *arg)
{
   // enable I/O privilege
   ThreadCtl (_NTO_TCTL_IO, 0);

   // attach the ISR to IRQ
   if (InterruptAttach (GPIO1_IRQ, isr_handler, NULL, 0, _NTO_INTR_FLAGS_TRK_MSK) == -1)
   {
      error = 1;
   }

   while (1)
   {
      InterruptWait (NULL, NULL);
      count++;
   }
}



Someone can help me? :|

Thanks

Alessandro
Guest
 

Return to General Programming

Who is online

Users browsing this forum: No registered users and 4 guests