如何解决如何找到对应的 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 举报,一经查实,本站将立刻删除。