Hi,
I am trying to get interruptions to work on my beagleboard-xm and it doesn’t work. I don’t know if the problem is coming from the QNX part of the programmation or the DM3730 part.
[code]
volatile bool isLedOn = 1;
volatile bool ResetStatus = 0;
bool error = 0;
struct sigevent event;
int main(int argc, char *argv[]) {
std::cout << “Interrupt test program” << std::endl;
pthread_create(NULL,NULL,&intr_thread,NULL);
std::cout<<“Thread Creation successful” <<std::endl;
while(!error);
std::cout<<“END OF PROGRAM”<<std::endl;
return EXIT_SUCCESS;
}
const struct sigevent* isr_userbutton(void* arg, int id){
isLedOn = isLedOn ^ 1;
ResetStatus = 1;
return (&event);
}
void intr_thread(void){
uintptr_t mmap_addr;
if (ThreadCtl(_NTO_TCTL_IO,0)== - 1){
std::cout << “Thread control failed”<< std::endl;
error = 1;
}
else{
if(InterruptAttach(29,isr_userbutton,NULL,0,_NTO_INTR_FLAGS_TRK_MSK) == -1){
std::cout<<“InterruptAttach() failed”<<std::endl;
error = 1;
}
else{
ConfigLed();
ConfigInterrupt();
ConfigGPIOInterrupt();
while (1){
if (isLedOn){
mmap_addr = MapUserspace(4,0x49056094);
out32(mmap_addr,GPIO_22);
munmap_device_io(mmap_addr,4);
}
else{
mmap_addr = MapUserspace(4,0x49056090);
out32(mmap_addr,GPIO_22);
munmap_device_io(mmap_addr,4);
}
if (ResetStatus)
ResetIRQStatus();
}
}
}
return EXIT_SUCCESS;
}[/code]
This is the essential part. Am I using AttachInterrupt() right? I am aware that I should release the Interrupt somewhere in code but it’s really just exploratory so I didn’t bother implementing it. So I just want to know if it’s my QNX implementation that’s at fault or the DM3730. Here is the other part of the code for the definitions of the functions.
uintptr_t MapUserspace (unsigned int len,unsigned long address){
uintptr_t mmap_addr;
mmap_addr = mmap_device_io(len,address);
if (mmap_addr == MAP_DEVICE_FAILED){
std::cout << " mmap_device_io failed" << std::endl;
error = 1;
}
return mmap_addr;
}
void ConfigInterrupt(void){
uintptr_t mmap_addr;
uint32_t buffer;
mmap_addr = MapUserspace(4,0x48200010); //Sysconfig
out32(mmap_addr,0);
munmap_device_io(mmap_addr,4);
mmap_addr = MapUserspace(4,0x48200050); //Idle
out32(mmap_addr,0);
munmap_device_io(mmap_addr,4);
mmap_addr = MapUserspace(4,0x48200174); //ILRm
out32(mmap_addr,0);
munmap_device_io(mmap_addr,4);
mmap_addr = MapUserspace(4,0x48200010); //MIRn
buffer = in32(mmap_addr) | GPIO_29;
out32(mmap_addr,buffer);
munmap_device_io(mmap_addr,4);
std::cout<<"ConfigInterrupt Done"<<std::endl;
}
void ConfigGPIOInterrupt (void){
uintptr_t mmap_addr;
uint32_t buffer;
mmap_addr = MapUserspace(4,0x48310064); //Set IRQ Enable 1
out32(mmap_addr,GPIO_4);
munmap_device_io(mmap_addr,4);
mmap_addr = MapUserspace(4,0x48310074); //Set IRQ Enable 2
out32(mmap_addr,GPIO_4);
munmap_device_io(mmap_addr,4);
mmap_addr = MapUserspace(4,0x48310048); //Rising Edge
buffer = in32(mmap_addr) | GPIO_4;
out32(mmap_addr,buffer);
munmap_device_io(mmap_addr,4);
mmap_addr = MapUserspace(4,0x48310018); //IRQ Status 1
out32(mmap_addr,GPIO_4);
munmap_device_io(mmap_addr,4);
mmap_addr = MapUserspace(4,0x48310028); //IRQ Status 2
out32(mmap_addr,GPIO_4);
munmap_device_io(mmap_addr,4);
std::cout<<"ConfigGPIOInterrupt Done"<<std::endl;
}
void ResetIRQStatus (void){
uintptr_t mmap_addr;
mmap_addr = MapUserspace(4,0x48310018); //IRQ Status 1
out32(mmap_addr,GPIO_4);
munmap_device_io(mmap_addr,4);
mmap_addr = MapUserspace(4,0x483100); //IRQ Status 2
out32(mmap_addr,GPIO_4);
munmap_device_io(mmap_addr,4);
ResetStatus = 1;
std::cout<<"ResetIRQStatus Done"<<std::endl;
}
void ConfigLed (void){
uintptr_t mmap_addr;
uint32_t buffer;
mmap_addr = MapUserspace(4,0x48002A0C);//PADCONF user button
buffer = (in32(mmap_addr) & 0x0000FFFF) | 0x050C0000;
out32(mmap_addr,buffer);
munmap_device_io(mmap_addr,4);
mmap_addr = MapUserspace(4,0x48310034);//GPIO OE
buffer = in32(mmap_addr) | GPIO_4;
out32(mmap_addr,buffer);
munmap_device_io(mmap_addr,4);
std::cout<<"ConfigLed Done"<<std::endl;
}
I don’t have any compilation and kernel errors and I am lost…
Thank you ,
Jean-Francois