如何找到对应的 IRQ 到 GPIO-Pin

问题描述

我目前正在尝试使用 RK3399 处理器在我的 RockPro64 上获得外部中断。到目前为止,我设法相应地激活了引脚,但是现在在实施 ISR 时我被卡住了,因为我不明白如何获得正确的 IRQ 编号,因此不知道将我的 ISR 写入哪个地址。

到目前为止,我将 GPIO1_A 激活为输出,使其产生脉冲并将其连接到我配置为中断的 GPIO1_C6。似乎这个设置正在做我想要它做的事情,因为我在 INT_STATUS 和 INT_RAWSTATUS 寄存器中获得了正确的寄存器条目。如果取消屏蔽中断,我会在我的板上遇到“滞后”,但在“/proc/interrupts”中看不到任何重大变化。

我的计划是在向量表中获得正确的地址,然后根据本指南在那里编写一个简约的函数(应用程序只需要设置一个标志)https://www.embedded.com/modeling-interrupt-vectors/

到目前为止我的代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/gpio.h>


unsigned long strtadr=(0xFF730000); //startaddress for GPIO1

#define RegLength 64*1024UL
#define DDRos 0x0004
#define DRos 0x0000
#define INTenos 0x0030
#define INTPolos 0x003c
#define INTMaskos 0x0034
#define INTStatos 0x0040
#define INTRStatos 0x0044


void ResetGpio1(void *map,int fd,int unmap){

*(volatile unsigned long *)(map+DDRos) &= 0;
*(volatile unsigned long *)(map+DRos) &= 0;
*(volatile unsigned long *)(map+INTPolos)&=0;
*(volatile unsigned long *)(map+INTMaskos)&= 0;
*(volatile unsigned long *)(map+INTenos)&=0;
unmap=munmap(map,RegLength);
close(fd);

}


void SetGpio1(void *map){

*(volatile unsigned long *)(map+DRos)&=0; //set DR for all GPIO1s to 0; reset just to be sure
*(volatile unsigned long *)(map+DDRos) |= 16; //set gpio1a4 to output DDR offset 0x0004,1=output

}


void Gpio1IntEN(void *map){

*(volatile unsigned long *)(map+INTPolos)|=0x400000;
*(volatile unsigned long *)(map+INTMaskos)&= 0;
*(volatile unsigned long *)(map+INTenos)|=0x400000;
}



void ISR(void)__attribute__((interrupt("IRQ")));
void ISR(void){
printf("hello world");

}


int main(void) {
int unmap;
int fd;
void *map;

fd=open("/dev/mem",O_RDWR|O_SYNC);

    if(fd<0){
    printf("/dev/mem konnte nicht geöffnet werden \n");
    return -1;  
    }

map=mmap(NULL,RegLength,PROT_READ|PROT_WRITE,MAP_SHARED,fd,strtadr);


SetGpio1(map);
Gpio1IntEN(map);

printf("INTstatus %X \n",*(volatile unsigned long *)(map+INTStatos));
printf("INTRstatus %X \n",*(volatile unsigned long *)(map+INTRStatos));



for(int i=0; i<5; i++){
*(volatile unsigned long *)(map+DRos) |= 16;
printf("turning on \n");
printf("INTstatus %X \n",*(volatile unsigned long *)(map+INTRStatos));
sleep(1);

*(volatile unsigned long *)(map+DRos) &= ~16;
sleep(1);
printf("turned off \n");
printf("INTstatus %X \n",*(volatile unsigned long *)(map+INTRStatos));
}

/* *(volatile unsigned long *)(map+DDRos) &= 0;
*(volatile unsigned long *)(map+DRos) &= 0; */

ResetGpio1(map,unmap);


}

RK3399 的数据表可以在这里找到:https://pdf1.alldatasheet.com/datasheet-pdf/view/1132005/ROCKCHIP/RK3399.html

我正在使用 GCC 6.3.0 版开发 Debian

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)