linux zynq 中断控制器

本文介绍Zynq中PL端中断配置的方法,包括设备树中配置中断及实际使用的中断号计算方式,并展示了中断驱动的具体实现流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、zynq中断说明
uart@e0001000 {
 compatible = "xlnx,ps7-uart-1.00.a";
 reg = <0xe0001000 0x1000>;
 interrupts = <0x0 0x32 0x0>;
 interrupt-parent = <&gic>;
 clock = <50000000>;
};

第二个参数是中断号。传递的过程中会区分是否为spi中断,如果是spi中断则加16,非spi则加32 ,

所以在devicetree中的生成的中断号是实际中断号减去32 ;

二、实际使用过程

PL端配置中断控制IN9


这样我们在配置设备树需

pl-int{
       compatible = "zynq,pl-int";
       interrupt-parent = <&intc>;
       interrupts = <0 53 1>;
       status = "disabled";

    };

这里中断号为53,因为中断号和实际的中断号之间相差32,那么实际的中断号就是85。



三、驱动实现

static int Int_probe(struct platform_device *pdev)
{
    int ret;
    struct resource *r_irq;
    r_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);

    if (!r_irq) {
      printk(KERN_INFO"no IRQ found\n");
      return 0;
    }
    ret = request_irq(r_irq->start, input_handler, IRQ_TYPE_EDGE_RISING, "input_handle", NULL);
    if (ret) {
      printk(KERN_INFO"testmodule: Could not allocate interrupt %d\n",
         r_irq->start);
    }
    misc_register(&int_miscdev);   
    return ret;
}


### Zynq 系列芯片中断控制器架构 Zynq系列芯片采用ARM Cortex-A9处理器内核,其内部集成了嵌套向量中断控制器(NVIC)[^1]。NVIC负责管理来自不同外设和系统的中断请求,并按照优先级顺序处理这些请求。 对于更复杂的外部设备产生的中断信号,则通过通用中断控制器(GIC)来管理和分发给各个CPU核心[^1]。GIC支持多达224个独立的SPI(共享外围中断),以及每个CPU私有的PPI(物理外围中断)线路。 #### 中断源分类 - **私有周边中断(PPI)**:仅针对单个CPU核心的有效中断线。 - **共享周边中断(SPI)**:可以被多个CPU核心识别并响应的公共中断资源。 #### GIC寄存器结构 为了配置和控制GIC的行为,在内存映射空间中有专门分配的一组寄存器用于访问GIC的功能设置。主要分为四类: - 配置接口(Configuration Interface): 设置全局参数如使能/禁用特定类型的中断等; - Distributor interface (DIST): 控制哪些IRQs应该传递到哪个或哪些CPU上; - CPU interfaces(CPU IF): 每个CPU都有自己的本地接口用来接收最终选定要由该CPU处理的具体IRQ号; - Maintenance register: 提供维护功能和服务于调试目的的信息查询; ```c // Example of enabling an SPI interrupt on the distributor side. void enable_spi_interrupt(unsigned int spi_number){ unsigned int reg_offset = ((spi_number / 32) * 0x08); // Calculate which control word to modify based off IRQ number *(volatile uint32_t*)(GIC_DIST_BASE + GICD_ISER_OFFSET + reg_offset) |= (1 << (spi_number % 32)); } ``` 上述代码展示了如何启用一个指定编号的标准外设中断(SPI)。这里`GIC_DIST_BASE`定义了分布器基地址而`GICD_ISER_OFFSET`指向使能设定寄存器的位置偏移值。 ### 编程指南 当编写应用程序时,开发者通常不需要直接操作底层硬件寄存器,而是利用操作系统提供的API函数来进行初始化、注册回调函数等工作。然而理解基本原理有助于更好地设计驱动程序逻辑以及解决潜在问题。 在Linux环境下开发时,可以通过加载相应的平台专用模块完成大部分必要的初始化工作。而对于裸机编程而言,则需手动调用相应汇编指令序列以确保正确进入异常模式并跳转至对应的ISR入口点执行实际的任务调度流程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值