历史上的今天
返回首页

历史上的今天

今天是:2024年12月21日(星期六)

2021年12月21日 | tiny4412学习(四)之移植linux-设备树(1)设备树基础知识及中断

2021-12-21 来源:eefocus

  • 硬件平台: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、i2c_board_info、spi_board_info以及各种硬件的platform_data,这些板级细节代码对内核来讲只不过是垃圾代码。而采用DeviceTree后,许多硬件的细节可以直接透过它传递给Linux,而不再需要在kernel中进行大量的冗余编码。   


2.ARM平台的相关code做出如下相关规范调整

 

•ARM的核心代码仍然保存在arch/arm目录下•ARM SoC corearchitecture code保存在arch/arm目录下•ARMSOC的周边外设模块的驱动保存在drivers目录下•ARMSOC的特定代码在arch/arm/mach-xxx目录下•ARM SOCboard specific的代码被移除,由DeviceTree机制来负责传递硬件拓扑和硬件资源信息。

 

本质上,Device Tree改变了原来用hardcode方式将HW配置信息嵌入到内核代码的方法,改用bootloader传递一个DB的形式。


3.DTS的加载过程

如果要使用DeviceTree,首先用户要了解自己的硬件配置和系统运行参数,并把这些信息组织成DeviceTree source file。通过DTC(DeviceTree Compiler),可以将这些适合人类阅读的DeviceTree source file变成适合机器处理的DeviceTree binary file(DTB,devicetree blob)。在系统启动的时候,bootprogram(例如:firmware、bootloader)可以将保存在flash中的DTB copy到内存(当然也可以通过其他方式,例如可以通过bootloader的交互式命令加载DTB),并把DTB的起始地址传递给OSkernel。对于计算机系统(computersystem),一般是firmware->bootloader->OS,对于嵌入式系统,一般是bootloader->OS。

4.DTS的描述信息

Device Tree由一系列被命名的结点(node)和属性(property)组成,而结点本身可包含子结点。所谓属性,其实就是成对出现的name和value。在DeviceTree中,可描述的信息包括(原先这些信息大多被hardcode到kernel中):

 

•CPU的数量和类别
•内存基地址和大小
•总线和桥
•外设连接
•中断控制器和中断使用情况
•GPIO控制器和GPIO使用情况
•Clock控制器和Clock使用情况

 

它基本上就是画一棵电路板上CPU、总线、设备组成的树,Bootloader会将这棵树传递给内核,然后内核可以识别这棵树,并根据它展开出linux内核中的platform_device、i2c_client、spi_device等设备,而这些设备用到的内存、IRQ等资源,也被传递给了内核,内核会将这些资源绑定给展开的相应的设备。


一个.dts文件对应一个ARM的machine,一般放置在内核的arch/arm/boot/dts/目录。由于一个SoC可能对应多个machine(一个SoC可以对应多个产品和电路板),势必这些.dts文件需包含许多共同的部分,Linux内核为了简化,把SoC公用的部分或者多个machine共同的部分一般提炼为.dtsi。所有的ARMSoC的.dtsi都引用了skeleton.dtsi,即#include"skeleton.dtsi“或者 /include/ "skeleton.dtsi"


5.变化

platform之前:

 

 

现在:

二、设备树文件

1、修改设备树文件支持GPIO按键中断

(/work/linux-4.4.0/linux-4.4/arch/arm/boot/dts/exynos4412-tiny4412.dts)

  1. interrupt_demo: interrupt_demo {  

  2.         compatible         = "tiny4412,interrupt_demo";  

  3.         tiny4412,int_gpio1 = <&gpx3 2 GPIO_ACTIVE_HIGH>;  

  4.         tiny4412,int_gpio2 = <&gpx3 3 GPIO_ACTIVE_HIGH>;  

  5.         tiny4412,int_gpio3 = <&gpx3 4 GPIO_ACTIVE_HIGH>;  

  6.         tiny4412,int_gpio4 = <&gpx3 5 GPIO_ACTIVE_HIGH>;  

  7. };  


2、完整的设备树文件:

Device Tree有自己的独立的语法,它的源文件为.dts,编译后得到.dtb,Bootloader在引导Linux内核的时候会将.dtb地址告知内核。之后内核会展开Device Tree并创建和注册相关的设备,因此arch/arm/mach-xxx和arch/arm/plat-xxx中大量的用于注册platform、I2C、SPI板级信息的代码被删除,而驱动也以新的方式和.dts中定义的设备结点进行匹配。

  1. /* 

  2.  * FriendlyARM's Exynos4412 based TINY4412 board device tree source 

  3.  * 

  4.  * Copyright (c) 2013 Alex Ling  

  5.  * 

  6.  * Device tree source file for FriendlyARM's TINY4412 board which is based on 

  7.  * Samsung's Exynos4412 SoC. 

  8.  * 

  9.  * This program is free software; you can redistribute it and/or modify 

  10.  * it under the terms of the GNU General Public License version 2 as 

  11.  * published by the Free Software Foundation. 

  12. */  

  13.   

  14. /dts-v1/;  

  15. #include "exynos4412.dtsi"  

  16. #include   

  17.   

  18. / {  //root结点"/"  

  19.     model = "FriendlyARM TINY4412 board based on Exynos4412";  

  20.     //root结点"/"的属性compatible,组织形式为:,  

  21.     //Linux内核透过root结点"/"的compatible 属性即可判断它启动的是什么machine  

  22.     //compatible 属性是一个字符串的列表,列表中的第一个字符串表征了结点代表的确切设备,  

  23.     //形式为",",其后的字符串表征可兼容的其他设备。  

  24.     //可以说前面的是特指,后面的则涵盖更广的范围。  

  25.     compatible = "friendlyarm,tiny4412", "samsung,exynos4412", "samsung,exynos4";  

  26.   

  27.   //以下开始为子节点  

  28.     //子结点的命名,它们遵循的组织形式为:[@],  

  29.     //<>中的内容是必选项,[]中的则为可选项。name是一个ASCII字符串,用于描述结点对应的设备类型,如memory;  

  30.     //多个相同类型设备结点的name可以一样,只要unit-address不同即可  

  31.       

  32.     //chosen节点并不代表一个真正的设备,而是用来在Firmware与操作系统间传递数据,如启动参数。  

  33.     chosen {                         //子结点"chosen"  

  34.         stdout-path = &serial_0;  

  35.         bootargs = "root=/dev/ram0 rw rootfstype=ext4 console=ttySAC0,115200 init=/linuxrc earlyprintk";  

  36.     };  

  37.   

  38.     memory {                         //子结点"memory"  

  39.         reg = <0x40000000 0x40000000>;  

  40.     };  

  41.   

  42.     leds {                           //子结点"leds"  

  43.         compatible = "gpio-leds";  

  44.   

  45.         led1 {                         //子子结点"led1"  

  46.             label = "led1";  

  47.             gpios = <&gpm4 0 GPIO_ACTIVE_LOW>;  

  48.             default-state = "off";  

  49.             linux,default-trigger = "heartbeat";  

  50.         };  

  51.   

  52.         led2 {  

  53.             label = "led2";  

  54.             gpios = <&gpm4 1 GPIO_ACTIVE_LOW>;  

  55.             default-state = "off";  

  56.         };  

  57.   

  58.         led3 {  

  59.             label = "led3";  

  60.             gpios = <&gpm4 2 GPIO_ACTIVE_LOW>;  

  61.             default-state = "off";  

  62.         };  

  63.   

  64.         led4 {  

  65.             label = "led4";  

  66.             gpios = <&gpm4 3 GPIO_ACTIVE_LOW>;  

  67.             default-state = "off";  

  68.             linux,default-trigger = "mmc0";  

  69.         };  

  70.     };  

  71.   

  72.     fixed-rate-clocks {  

  73.         xxti {  

  74.             compatible = "samsung,clock-xxti";  

  75.             clock-frequency = <0>;  

  76.         };  

  77.   

  78.         xusbxti {  

  79.             compatible = "samsung,clock-xusbxti";  

  80.             clock-frequency = <24000000>;  

  81.         };  

推荐阅读

史海拾趣

Herotek Inc公司的发展小趣事

随着半导体技术的飞速发展,Henkel公司紧跟行业趋势,不断研发适用于半导体封装的高性能粘合剂。其研发的粘合剂产品不仅满足了半导体封装过程中对于高精度、高可靠性的要求,还显著提升了封装效率。例如,Henkel的某些粘合剂产品能够在极端温度条件下保持稳定的性能,确保半导体器件在各种工作环境中都能正常运行。这一技术突破为Henkel在半导体封装市场赢得了广泛的认可。

Amptek Inc公司的发展小趣事

在消费电子领域,Henkel的粘合剂技术同样发挥着重要作用。随着智能手机、平板电脑等终端设备的不断迭代升级,对结构粘接、散热等方面的要求也越来越高。Henkel针对这些需求,提供了定制化的粘合剂解决方案。例如,其导热凝胶和导热垫片产品能够有效提升设备的散热性能,确保设备在高强度使用下依然保持稳定的性能。此外,Henkel还针对全面屏、折叠屏等新型屏幕技术,推出了专门的聚氨酯热熔胶解决方案,帮助手机厂商提高屏占比和用户体验。

乾坤(Cyntec)公司的发展小趣事

面对工业4.0的浪潮,乾坤公司积极响应国家智能制造的号召,开始进行智能制造的转型。公司引进了先进的自动化设备,对生产线进行了全面升级,实现了生产过程的自动化、信息化和智能化。通过智能制造的转型,乾坤不仅提高了生产效率,还降低了生产成本,同时提升了产品的一致性和可靠性。这一转型为乾坤公司的持续发展注入了新的动力,使其在激烈的市场竞争中保持了领先地位。

Helicomm公司的发展小趣事

面对工业4.0的浪潮,乾坤公司积极响应国家智能制造的号召,开始进行智能制造的转型。公司引进了先进的自动化设备,对生产线进行了全面升级,实现了生产过程的自动化、信息化和智能化。通过智能制造的转型,乾坤不仅提高了生产效率,还降低了生产成本,同时提升了产品的一致性和可靠性。这一转型为乾坤公司的持续发展注入了新的动力,使其在激烈的市场竞争中保持了领先地位。

Efficient Power Conversion公司的发展小趣事

随着EPC公司氮化镓技术的不断完善和成熟,其产品开始受到市场的广泛认可。无线电源传送、全自动汽车、高速移动通信等领域的企业纷纷采用EPC公司的氮化镓功率半导体器件,以提高其产品的性能和效率。EPC公司的市场份额逐渐扩大,成为氮化镓功率管理技术领域的领军企业。

思瑞浦微电子科技(3PEAK INCORPORATED)公司的发展小趣事

作为一家技术驱动的公司,EPC公司一直致力于持续创新和产品研发。近年来,公司不断推出新的氮化镓功率半导体器件和集成电路产品,以满足市场不断变化的需求。其中,EPC公司全新推出的ePower功率级集成电路系列,为高功率密度应用提供了更高性能及更小型化的解决方案。这一系列产品在市场上获得了良好的反响,进一步巩固了EPC公司在氮化镓技术领域的领先地位。

问答坊 | AI 解惑

【申精】精品嵌入式资料导航

因为资料较多,先整理这一部分,后续还会完善并相继推出ARM11 6410专区,以便大家学习交流。     如果这个帖子对您有帮助,烦请各位顶贴,小弟先谢谢了O(∩_∩)O (一)2440专区: 优秀论坛专区: 第一:http://bbs.2@1ic.com/ ...…

查看全部问答>

求助,关于7005和7026

之前一直在用 s3c2410+vivi+kernel2.4+ch7005 ch7005的驱动是在vivi下,通过i2c往某地址写入特定的值来实现vga输出的,这些值和地址在ch7005的datasheet上都有详细说明 在我这板子我是这样做的: #define VGA_ADDR 0xEA __Wr24C080(VGA_ADDR, 0 ...…

查看全部问答>

无线技术群

无线技术群号码:36775412…

查看全部问答>

大型设备上的232通讯问题

实验室的一台大型设备(价值近一千万RMB),有一个RS—232接口,用于和计算机通讯,仪器说明上说仪器是作为一个DTE,请问是否需要将连线(自备的),跳线? 原文说明如下: 9 COMPUTER INTERFACE 9.1 GENERAL The various computer interfaces ...…

查看全部问答>

寻找windows底层驱动专家

有个键盘驱动的活外包,有兴趣的专家请联络我: sandydata@hotmail.com…

查看全部问答>

怎么理解ADC的规则转换和注入转换啊?

                                 怎么理解ADC的规则转换和注入转换啊?…

查看全部问答>

TMS28035的ad管脚 不管有没有模拟量输入,都输出高电平(2V)电压?

TMS28035的AD管脚  不管有没有模拟量输入,都输出高电平(2V)电压?这种情况的后果是当外部有模拟量输入时,TMS28035不能正常工作,唯有掉电,再上电 重新下载程序才能正常工作。请各位大虾指教?具体点谢谢。…

查看全部问答>

16*16点阵程序问题

pic16f877a芯片用两个74hc595和一个74hc154芯片设计16*16点阵。请问怎样显示汉字啊。 我用74hc154行扫描,显示的汉字乱作一团,不该亮的点都亮了,请问我应该怎样做啊?! 程序如下:#include<pic.h>#define uint unsigned int#define uchar ...…

查看全部问答>

大功率LED灯串调节亮度

各位朋友好 : 最近在做LED灯串亮度调节,LED灯串最高电压150V,电流最大有1A左右,现在考虑用PWM调节亮度,在开关管选型上比较纠结是用开关三极管13003还是用场效应管好? 另外电路设计方面需要考虑哪些因素,需不需要加一些保护措施?…

查看全部问答>

从今天开始,像使用U盘一样,升级STM32

本帖最后由 cedar_xuesong 于 2015-12-3 20:39 编辑 有没有想过,像使用U盘一样升级STM32固件,非常简单,非常方便 1:        插入电脑USB接口 2:        把升级固件拖到设备盘符 ...…

查看全部问答>