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:
#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