嵌入式 I.MX6ULL Linux中断系统设备树开发

457 阅读2分钟

1 I.MX6ULL设备树中断信息节点

  • 如果使用设备树的话就需要在设备树中设置好中断属性信息,Linux 内核通过读取设备树中的中断属性信息来配置中断。对于中断控制器而言,设备树绑定信息参考文档Documentation/devicetree/bindings/arm/gic.txt。打开 imx6ull.dtsi 文件,其中的 intc 节点就是I.MX6ULL 的中断控制器节点,节点内容如下所示:
  • #interrupt-cells#address-cells#size-cells 一样。表示此中断控制器下设的 cells大小,对于设备而言,会使用 interrupts 属性描述中断信息,#interrupt-cells 描述了 interrupts 属性的 cells 大小,也就是一条信息有几个 cells。每个 cells 都是 32 位整形值,对于 ARM 处理的GIC 来说,一共有 3 个 cells,这三个 cells 的含义如下:
    • 第一个 cells:中断类型,0 表示 SPI 中断,1 表示 PPI 中断。
    • 第二个 cells:中断号,对于 SPI 中断来说中断号的范围为 0-987,对于 PPI 中断来说中断号的范围为 0-15。
    • 第三个 cells:标志,bit[3:0]表示中断触发类型,为 1 的时候表示上升沿触发,为 2 的时候表示下降沿触发,为 4 的时候表示高电平触发,为 8 的时候表示低电平触发。bit[15:8]为 PPI 中断的 CPU 掩码。
  • interrupt-controller 节点为空,表示当前节点是中断控制器 image.png
  • interrupts 描述中断源信息,对于 gpio5 来说一共有两条信息,中断类型都是 SPI,触发电平都是 IRQ_TYPE_LEVEL_HIGH。不同之处在于中断源,一个是 74,一个是 75,打开可以打开《IMX6ULL 参考手册》的“Chapter 3 Interrupts and DMA Events”章节,找到表 3-1,如图所示:
  • 可以看出,GPIO5 一共用了 2 个中断号,一个是 74,一个是 75。其中 74 对应 GPIO5_IO00-GPIO5_IO15 这低 16 个 IO,75 对应 GPIO5_IO16-GPIOI5_IO31 这高 16 位 IO。 image.png
  • interrupt-controller 表明了 gpio5 节点也是个中断控制器,用于控制 gpio5 所有 IO的中断。
  • 将#interrupt-cells 修改为 2 image.png

2 I.MX6ULL Linux中断系统设备树开发

  • interrupt-parent 属性设置中断控制器,这里使用 gpio1 作为中断控制器。
  • interrupts 设置中断信息,18 表示 GPIO1_IO18。 image.png

3 OFAPI函数获取中断号

image.png image.png image.png image.png