zynq添加GPIO中断程序

//=====内核源码为ADI官方关于AD9361的内核,编译工具为petalinux2015.2,开发板为ZYNQXC7Z100=========

一、修改设备树:
    1.打开petalinux项目下的./project-spec/meta-user/recipes-dt/device-tree/files/system-top.dts
    2.找到gpio@e000a000节点,在interrupts属性后面添加自己的GPIO。
注:GPIO管脚号加32等于中断号。
例:添加61.62.63号的中断,0x14是他原本的中断。interrupts = <0x0 0x14 0x4>,<0x0 0x1d 0x1>, <0x0 0x1e 0x1>, <0x0
0x1f 0x1>;

二、修改驱动,添加中断程序:
    1.打开内核目录下./drivers/gpio/gpio-zynq.c  GPIO驱动文件。
    2.找到驱动探测函数static int zynq_gpio_probe(struct platform_device *pdev)添加代码。
在zynq_gpio_probe函数内添加platform_get_resource与request_irq中断处理。(下面是源码范例)
在zynq_gpio_probe函数外添加中断发生后的处理函数。函数名需与request_irq的第四个参数相同。
例:irqreturn_t test_interrupt_61(int irqno, void *devid)
{
    printk("......test61..........irqno = %d\n", irqno);
    return IRQ_HANDLED; 
}


    3.有时需要添加头文件:    #include <linux/kernel.h>
                #include <linux/module.h>
                #include <linux/platform_device.h>
                #include <linux/of.h>
                #include <linux/interrupt.h>

    4.有时需要添加中断属性(部分):    
    #define IRQF_DISABLED       0x00000020    //调用中断处理程序时禁用IRQ
    #define IRQF_TRIGGER_HIGH   0x00000004    //高电平触发
    #define IRQF_TRIGGER_RISING 0x00000001    //上升沿触发
    #define IRQF_SHARED         0x00000080    //共享中断    

三、编译内核->运行程序:
    1.cat /proc/interrupts能够看到挂载的GPIO中断

    2.通过按键或其他方式触发中断,内核打印中断处理程序的内容。(我是通过vivado触发的)

四、完成。
源码范例:
static int zynq_gpio_probe(struct platform_device *pdev)
{
.........................
struct resource *res;
int ret1;
res=platform_get_resource(pdev,IORESOURCE_IRQ,1);
if(res == NULL ){
       printk("platform_get_resource  key1_res fail\n");    
      return -1;
       } 
ret = request_irq(res->start, test_interrupt_61, IRQF_TRIGGER_RISING, "int_test61", NULL);
   if (ret1 < 0)
     printk("....test61........failed request irq: irqno = irq_res->start\n");
res=platform_get_resource(pdev,IORESOURCE_IRQ,2);
if(res == NULL ){
       printk("platform_get_resource  key1_res fail\n");    
      return -1;
       } 
ret1 = request_irq(res->start, test_interrupt_62, IRQF_TRIGGER_RISING, "int_test62", NULL);
   if (ret1 < 0)
     printk("....test61........failed request irq: irqno = irq_res->start\n");
res =platform_get_resource(pdev,IORESOURCE_IRQ,3);
if(res == NULL ){
       printk("platform_get_resource  key1_res fail\n");    
      return -1;
       } 
ret1 = request_irq(res->start, test_interrupt_63, IRQF_TRIGGER_RISING, "int_test63", NULL);
   if (ret1 < 0)
     printk("....test61........failed request irq: irqno = irq_res->start\n");
...............................
}

心得:

1.request_irq函数中的第一个属性不能直接手动填中断号,必须通过设备树获取,进行映射之后才能使用,否者不能触发中断。

2.platform_get_resource函数的第三个属性,与设备树GPIO中断排列的排列顺序有关,从0开始数字几就表示第几个中断。

例:

3.其他的平台设备都可以添加中断,不仅仅是GPIO,但探测时传参要是platform_device

4.struct resource *res;如果没有需要手动添加。

Zynq芯片中,GPIO引脚的中断是通过AXI_GPIO模块和PS相连的中断信号线的电平变换引发的。可以通过配置中断触发方式来设置GPIO引脚的中断。具体来说,可以使用XScuGic_SetPriorityTriggerType函数来设置中断触发优先级和触发类型。例如,可以通过设置中断触发类型为上升沿触发来使得当GPIO引脚的电平变为上升沿时触发中断。 需要注意的是,GPIO引脚的中断方式已经由硬件决定好了,无法在此处进行配置。参考函数的注释中提到,只有两种方式可以设置中断,即高电平和上升沿,这里的高电平和上升沿指的是AXI_GPIO模块和PS相连的中断信号线的电平变换引发PS中断,而不是GPIO引脚的中断方式。 因此,在配置中断触发方式时,需要确定好AXI_GPIO模块和PS相连的中断信号线的电平变换方式并设置相应的中断触发类型。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [zynq-7000.rar_linux 中断 zynq_zynq DMA_zynq DMA Linux_zynq gpio_i2](https://download.csdn.net/download/weixin_42651887/86201535)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [ZYNQ_GPIO_中断](https://blog.csdn.net/Master_0_/article/details/125125000)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值