《设备树 — 引入设备树后对中断的影响(九)》

发布者:智慧启迪最新更新时间:2025-01-14 来源: cnblogs关键字:设备树  中断 手机看文章 扫描二维码
随时随地手机看文章

1.没有引入设备树时中断


  在老的内核中断是在完全由所谓的板级支持包中指定的,同时相关的寄存器地址这些也都是在代码中写死的。


  这种代码没法在多个SOC上通用,这个就导致大量的重复代码出现。


  在2.6.35.7内核中,SMDKV210单板是这样描述的


MACHINE_START(SMDKV210, 'SMDKV210')

    /* Maintainer: Kukjin Kim */

    .phys_io    = S3C_PA_UART & 0xfff00000,

    .io_pg_offst    = (((u32)S3C_VA_UART) >> 18) & 0xfffc,

    .boot_params    = S5P_PA_SDRAM + 0x100,

    .init_irq   = s5pv210_init_irq,

    .map_io     = smdkv210_map_io,

    .init_machine   = smdkv210_machine_init,

#ifdef CONFIG_S5P_HIGH_RES_TIMERS

    .timer      = &s5p_systimer,

#else

    .timer      = &s3c24xx_timer,

#endif

MACHINE_END 

  可以看到这里写了很多的固定的静态映射的地址信息,如S3C_PA_UART,S5P_PA_SDRAM。


  比如进入到中断初始化函数中s5pv210_init_irq


#define S5P_VA_CHIPID       S3C_ADDR(0x00700000)

#define S5P_VA_GPIO     S3C_ADDR(0x00500000)

#define S5P_VA_SYSTIMER     S3C_ADDR(0x01200000)

#define S5P_VA_SROMC        S3C_ADDR(0x01100000)

#define S5P_VA_AUDSS        S3C_ADDR(0X01600000)

  

#define S5P_VA_UART0        (S3C_VA_UART + 0x0)

#define S5P_VA_UART1        (S3C_VA_UART + 0x400)

#define S5P_VA_UART2        (S3C_VA_UART + 0x800)

#define S5P_VA_UART3        (S3C_VA_UART + 0xC00)

  

#define S3C_UART_OFFSET     (0x400)

  

#define VA_VIC(x)       (S3C_VA_IRQ + ((x) * 0x10000))

#define VA_VIC0         VA_VIC(0)

#define VA_VIC1         VA_VIC(1)

#define VA_VIC2         VA_VIC(2)

#define VA_VIC3         VA_VIC(3)

 

void __init s5p_init_irq(u32 *vic, u32 num_vic)

{

    struct irq_chip *chip;

    int irq;

  

    /* initialize the VICs */

    for (irq = 0; irq < num_vic; irq++)

        vic_init(VA_VIC(irq), VIC_BASE(irq), vic[irq], 0);

  

    s3c_init_vic_timer_irq(IRQ_TIMER0_VIC, IRQ_TIMER0);

    s3c_init_vic_timer_irq(IRQ_TIMER1_VIC, IRQ_TIMER1);

    s3c_init_vic_timer_irq(IRQ_TIMER2_VIC, IRQ_TIMER2);

    s3c_init_vic_timer_irq(IRQ_TIMER3_VIC, IRQ_TIMER3);

    s3c_init_vic_timer_irq(IRQ_TIMER4_VIC, IRQ_TIMER4);

  

    s3c_init_uart_irqs(uart_irqs, ARRAY_SIZE(uart_irqs));

  

    /* Register wakeup source. */

    for (irq = 0; irq < ARRAY_SIZE(wakeup_source); irq++) {

        chip = get_irq_chip(wakeup_source[irq]);

        chip->set_wake = s3c_irq_wake;

    }

}

  可以看到好多的东西都完全是由宏定义,而固定死的。这种代码因为完全没有通用性。在4.x内核中被舍弃了。


  在3.16.57的代码中也是这样


MACHINE_START(SMDKV210, 'SMDKV210')

    /* Maintainer: Kukjin Kim */

    .atag_offset    = 0x100,

    .init_irq   = s5pv210_init_irq,

    .map_io     = smdkv210_map_io,

    .init_machine   = smdkv210_machine_init,

    .init_time  = samsung_timer_init,

    .restart    = s5pv210_restart,

    .reserve    = &smdkv210_reserve,

MACHINE_END

  


2.引入设备树后中断


  4.19中是这样的


static char const *const s5pv210_dt_compat[] __initconst = {

    'samsung,s5pc110',

    'samsung,s5pv210',

    NULL

};

  

DT_MACHINE_START(S5PV210_DT, 'Samsung S5PC110/S5PV210-based board')

    .dt_compat = s5pv210_dt_compat,

    .map_io = s5pv210_dt_map_io,

    .restart = s5pv210_dt_restart,

    .init_late = s5pv210_dt_init_late,

MACHINE_END

  在真正的遵循了设备树的引进原因后,因为中断控制器也是一个设备,所以中断控制器也被归为了一个在driver/目录下的子系统


drivers/irqchip/

  比较著名的中断控制器有:


  Nested Vectored Interrupt Controller (NVIC)(内嵌向量中断控制器),之前我用过的cortex-m系列的处理器,大多都是用的这种中断控制器。


  General Interrupt Controlle(GIC)(通用中断控制器),这种中断控制器目前4个版本,目前最新的是v4版本,这种架构主要是用于支持ARM V8指令集的多核处理器上使用。GIC版本越高,支持的cpu个数也就多。


  Vectored Interrupt Controller (VIC)(向量中断控制器),这种中断控制器一般是用在单核的CPU上面的,每个VIC芯片支持32个中断源输入。


  当然还有一些不同用的各个CPU厂商设计的中断控制器,如irq-s3c24xx.c里面是三星当初为24xxcpu设计的中断控制器。irq-atmel-aci系列中由公司设计的中断控制器。


 


  以上这些中断控制器都是需要编写响应的中断控制器的驱动程序,而在设备树引入之前,因为不同的SOC中断控制器的寄存器地址这些不同,这些对于厂商的中断处理这边都是非常杂乱的。


  带入设备树后,使用了几个中断控制器是在设备树文件定义的,每个中断控制器的寄存器地址也是在设备树中指定的,如果有子中断控制器挂在某个主中断控制器上,这个也是可以通过interrupt-parent属性来设置的。即设备树文件要表示一个SOC内外的所有控制器和外设。


  这里要注意的是在dts文件中,一个中断控制器节点,必须要有一个interrupt-controller;的属性


  interrupt-controller@f2200000 {

      compatible = 'arm,pl192-vic';

      interrupt-controller;        //一个设备节点函有interrupt-controller属性,就表示是一个中断控制器

      reg = <0xf2200000 0x1000>;

      #interrupt-cells = <0x1>;   

      phandle = <0xa>;            //phandle表示自己这个中断控制器,0xa表示自己这个节点

  };

 

i2c@fab00000 {

      compatible = 'samsung,s3c2440-i2c';

      reg = <0xfab00000 0x1000>;

      interrupt-parent = <0xa>;   //它的父中断控制器就是phandle为0xa的节点所带表的中断控制器

      interrupts = <0xd>;

      clocks = <0x2 0x95>;

      clock-names = 'i2c';

      pinctrl-names = 'default';

      pinctrl-0 = <0x3b>;

      #address-cells = <0x1>;

      #size-cells = <0x0>;

      status = 'disabled';

  };

  


GIC的分析


http://www.360doc.com/content/14/0813/17/14530056_401586832.shtml#


sunsissy这位网友对GIC的分析


https://blog.csdn.net/sunsissy/article/details/73791470


https://blog.csdn.net/sunsissy/article/details/73842533


https://blog.csdn.net/sunsissy/article/details/73849456


https://blog.csdn.net/sunsissy/article/details/73849456


这位网友对中断子系统和GIC的分析


https://blog.csdn.net/gaojy19881225/article/details/80019103


关键字:设备树  中断 引用地址:《设备树 — 引入设备树后对中断的影响(九)》

上一篇:arm初识
下一篇:关于wince 版本的支持——用_WIN32_WCE来做判断?

推荐阅读最新更新时间:2026-03-25 11:37

tiny4412学习(四)之移植linux-设备(1)设备基础知识及GPIO中断
硬件平台:tiny4412 系统:linux-4.4 文件系统:busybox-1.25 编译器: arm-none-linux-gnueabi-gcc(gcc version 4.8.3 20140320) uboot:友善自带uboot. 一、DTS引入 1.什么是DTS?为什么要引入DTS? DTS即Device Tree Source设备树源码,DeviceTree是一种描述硬件的数据结构,它起源于OpenFirmware (OF)。 在Linux2.6中,ARM架构的板极硬件细节过多地被硬编码在arch/arm/plat-xxx和arch/arm/mach-xxx,比如板上的platform设备、resource、i
[单片机]
tiny4412学习(四)之移植linux-<font color='red'>设备</font><font color='red'>树</font>(1)<font color='red'>设备</font><font color='red'>树</font>基础知识及GPIO<font color='red'>中断</font>
迅为IMX6开发板Mfgtools工具单独烧写镜像-设备Qt系统
烧写设备树版本 Qt 系统要使用 iMX6Q 设备树光盘里的烧写工具,将文件夹下的 cfg.ini 修改成如下图所示: 打开“android_m6.0.1_2.0.0_ga_tool_20190725mfgtoolsProfilesLinuxOS Firmwareucl2.xml”文件,搜索“Linux-SabreSD-eMMC”,可看到操作表信息。只烧写某一个镜像时,只需把把其他镜像的操作表注释掉即可。 68.3.1 烧写文件系统 注释掉“burn uboot”,“burn zImage”,只留下“burn rootfs”,如下图,注释 u-boot 操作表: 注释 zImage 操作表: 然后打开烧写软件按照手册进行烧写
[单片机]
迅为IMX6开发板Mfgtools工具单独烧写镜像-<font color='red'>设备</font><font color='red'>树</font>Qt系统
iTOP-iMX6开发板-设备驱动-以module的方式编译驱动
内核驱动不仅可以将驱动编译到内核中,还可以动态的编译内核驱动。本文档介绍如何以 模块的方式编译内核驱动。 以 module 的方式编译驱动,需要以下几个部分: 1 内核成功编译过; 2 找到内核的 arm 编译器; 3 编译简单驱动; 4 编译简单的 Makefile 文件,Makefile 文件中需要指向内核源码目录(成功编译过的内核源码目录); 和文档在一起的有“Makefile”、c 文件和 ko 文件,大家可以用来测试。 要动态的编译内核,首先需要将内核源码编译通过,内核的编译请参考使用手册第五章。 1. 内核和编译器路径 本节介绍内核路径、编译器路径。无论是 Qt 和 Ubuntu 的内核源码,都是在 android 源
[单片机]
iTOP-iMX6开发板-<font color='red'>设备</font><font color='red'>树</font>驱动-以module的方式编译驱动
【IMX6ULL学习笔记】十五、设备DTS操作函数
一、设备树常用 OF 操作函数 设备树描述了设备的详细信息,这些信息包括数字类型的、字符串类型的、数组类型的,我们在编写驱动的时候需要获取到这些信息。Linux 内核给我们提供了一系列的函数来获取设备树中的节点或者属性信息,这一系列的函数都有一个统一的前缀“of_”,也被叫做 OF 函数。这些 OF 函数原型都定义在 include/linux/of.h 文件中。 1.1、查找节点的 OF 函数 设备都是以节点的形式“挂”到设备树上的,因此要想获取这个设备的其他属性信息,必须先获取到这个设备的节点。Linux 内核使用 device_node 结构体来描述一个节点,此结构体定义在文件 include/linux/of.h 中,
[单片机]
设备 — dtb到device node的转换(三)》
1.内核中对一个设备节点的表示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 struct device_node { const char *name; //节点的名字 const char *type; //device_type属性的值 phandle phandle; //对应该节点的phandle属性 const char *full_name; //节点的名字, node-name 从“/”开始的,表示该node的full path struct fw
[单片机]
《<font color='red'>设备</font><font color='red'>树</font> — dtb到device node的转换(三)》
基于设备的led驱动程序
1 #include linux/module.h 2 #include linux/kernel.h 3 #include linux/fs.h 4 #include linux/init.h 5 #include linux/delay.h 6 #include asm/io.h 7 #include linux/cdev.h 8 #include linux/device.h 9 #include linux/bitmap.h 10 #include asm/gpio.h 11 #include linux/platform_device.h 12 #include linux/sla
[单片机]
STM32MP1设备
什么是设备树 设备树并不是从开始就存在,而是后来加入到Linux中的 设备树主要用来描述系统的硬件结构:SoC的identification;运行时配置;描述是系统不能动态获取的硬件信息 设备树规范 设备树有语法规范,但需要相应的驱动进行解释:造成设备树的通用性与特殊性 设备树的语法结构:树形结构—根“/”没有parent,每个节点只有一个parent;节点—每个节点一般代表系统中的一个设备,包含子节点,具有property-value对;支持overlay 设备树的物理形式 源码形式:dts(文本格式,一般为板级配置);dtsi(文本格式,一般为SOC配置,可以被DTS包含的设备树文件) 目标形式:dtb(二进制文件
[单片机]
tiny4412学习(二)之移植linux-4.x支持设备
硬件平台:tiny4412 系统:linux-4.4 文件系统:busybox-1.25 编译器: arm-none-linux-gnueabi-gcc (gcc version 4.8.3 20140320) uboot:友善自带uboot,见上节 实验参考摩斯电码的博客: http://www.cnblogs.com/pengdonglin137/p/5137941.html http://www.cnblogs.com/pengdonglin137/p/5143516.html 一、u-boot修改 1、更新交叉工具链 到:http://www.veryarm.com/arm-none-linux-gnueabi-gcc 下
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved