中断系统中的设备树(四)__设备树描述按键中断

前言:使用设备树描述中断时,我们需要在设备树节点里面描述设备使用哪个硬件中断,如下所示是对按键中断的硬件中断的描述(只是起来开门见山的作用),对于理解按键按键中断的硬件中断的描述信息,我会在下面详细介绍,

buttons {
        compatible = "jz2440_button";
        eint-pins  = <&gpf 0 0>, <&gpf 2 0>, <&gpg 3 0>, <&gpg 11 0>;
        interrupts-extended = <&intc 0 0 0 3>,
                              <&intc 0 0 2 3>,
                              <&gpg 3 3>,
                              <&gpg 11 3>;
    };

  设备树节点里面描述中断可以参考下面的文档

 参考文档:linux-4.19-rc3\Documentation\devicetree\bindings\interrupt-controller\samsung,s3c24xx-irq.txt

                   linux-4.19-rc3\Documentation\devicetree\bindings\pinctrl\samsung-pinctrl.txt

    在中断系统中的设备树(三)__S3C2440上使用设备树描述中断我们知道对于s3c2440芯片,硬件上有三个中断控制器,一个主中断控制器和两个子中断控制器(gpf、gpg),如下图所示:

中断系统中的设备树(四)__设备树描述按键中断_第1张图片

 在JZ2440板子原理图上EINT11按键连接gpg3引脚,EINT19按键连接gpg11引脚,当我们在设备树中描述中断时,需要指定中断发给哪个中断控制器,属于 这个中断控制器里面的哪个中断,从上图我们可以看到有四个中断,属于两个中断控制器,当分别按下按键时,分别就会向两个中断控制器发送中断信号,下面是描述中断的格式:


interrupts-extended = <&pic 0xA 8>, <&gic 0xda>
 <&pic 0xA 8>:发给pic中断控制器的,0xA 8这两个数据用来描述pic控制器中的中断;
   <&gic 0xda>:发给gic中断控制器的,0xda这个数据用来描述gic控制器中的中断;


    从这里我们可以知道每个中断控制器用多少个32位的数据描述里面的中断是不一定的(用多少个32位的数据描述中断控制器里面的中断是由中断控制器决定的)

中断系统中的设备树(四)__设备树描述按键中断_第2张图片

      &intc:表示是哪个中断控制器;
        0 0 0 3:表示描述是哪个中断;

  • intc中断控制器的描述如下所示:

        interrupt-controller@4a000000 {
            compatible = "samsung,s3c2410-irq";
            reg = <0x4a000000 0x100>;
            interrupt-controller;
            #interrupt-cells = <0x4>;  //表示用4个32bit的数据描述这个中断控制器里面的每一个中断
            phandle = <0x1>;
        };

在硬件上有两个中断控制器,在软件上只用intc一个中断控制器来描述,怎么知道中断是发给主中断控制器还是发给子中断控制器呢? 可以用下面的格式来区分中断是发给主中断控制器还是子中断控制器的;


    
    <&intc 0 0 0 3>
    第一个表示是发给主控制器还是子控制器;
    第二个表示子中断控制器发给主控制器的哪一个;
    第三个表示是这个中断控制器里的哪一个中断;
    第四个表示中断的触发方式;

 

  •     在设备树里面有个gpg的节点用来描述子中断控制器,如下所示:

    gpg {
            gpio-controller;
            #gpio-cells = <0x2>;     
            interrupt-controller;    //表示该节点是个中断控制器
            #interrupt-cells = <0x2>; //该中断控制器里面的中断用0x02个32bit的数据表示;
            phandle = <0xe>;
        };
        <&gpg 3 3>,
        <&gpg 11 3>;

参考下面的描述信息:

    参考下面的描述信息:
        - First Cell: represents the external gpio interrupt number local to the
       external gpio interrupt space of the controller.
     - Second Cell: flags to identify the type of the interrupt
       - 1 = rising edge triggered
       - 2 = falling edge triggered
       - 3 = rising and falling edge triggered
       - 4 = high level triggered

  • 在设备树中我们为什么要定义引脚:
  1.   以前我们通过gpio_get_value(pindesc->pin)函数来读取引脚的电平,pindesc->pin是对应的引脚; 用S3C2410_GPF(n)表示对应的引脚;
  2.     现在不行了,现在我们用了设备树之后,用S3C2410_GPF(n)表示对应的引脚已经

   不能用了,那么我们怎么设置引脚呢?
        答:我们需要在设备树里面指定:
        eint-pins  = <&gpf 0 0>, <&gpf 2 0>, <&gpg 3 0>, <&gpg 11 0>;
        <&gpf 0 0>:gpf里面第0个引脚;
        <&gpf 2 0>:gpf里面第2个引脚;
        <&gpg 3 0>:gpg里面第3个引脚;
        <&gpg 11 0>:gpg里面第11个引脚;
        
        <&gpf 0 0>, <&gpf 2 0>, <&gpg 3 0>, <&gpg 11 0>这些值要转化为一个整数,

 到此:设备树里面的描述中断的属性已经解释清楚了刚开始提的问题也回答了,我们的linux驱动程序需要使用中断号,
   中断号是个软件的概念,问题来了:设备树中的中断信息怎样转化为中断号呢?

       现在我们知道,我们只需要在设备树里面描述中断的硬件信息就可以了, 我们的驱动程序只需要从platform_device中获取IRQ资源(中断号) 就可以用来申请中断了。最后的处理如下图所示:

中断系统中的设备树(四)__设备树描述按键中断_第3张图片

 

实验测试:

程序烧写到板子启动之后,执行测试程序,

cat /proc/interrupts
           CPU0
  1:          0       s3c   0 Edge      S2
  2:          0       s3c   2 Edge      S3
  3:          0  s3c-eint   3 Edge      S4
  7:        964  s3c-eint   7 Edge      eth0
  8:          0       s3c   8 Edge      s3c2410-rtc tick
 13:      73676       s3c  13 Edge      samsung_time_irq
 15:          0  s3c-eint  11 Edge      S5
 30:          0       s3c  30 Edge      s3c2410-rtc alarm
 32:        114  s3c-level  32 Level     50000000.serial
 33:        487  s3c-level  33 Level     50000000.serial
 59:          0  s3c-level  59 Edge      53000000.watchdog
 

你可能感兴趣的:(LinuxDTS(设备树))