tiny4412学习(四)之移植linux-设备树(1)设备树基础知识及中断

发布者:浅唱梦幻最新更新时间:2022-01-21 来源: eefocus关键字:tiny4412  移植linux  设备树  中断 手机看文章 扫描二维码
随时随地手机看文章
  • 硬件平台: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.         };  

[1] [2] [3]
关键字:tiny4412  移植linux  设备树  中断 引用地址:tiny4412学习(四)之移植linux-设备树(1)设备树基础知识及中断

上一篇:tiny4412学习(三)之移植linux-4.x驱动(1)支持网卡驱动
下一篇:tiny4412 时钟测试

推荐阅读最新更新时间:2024-11-11 10:59

ATmega88的Timer0溢出中断
// 熔丝位 F7 DC F9 FF // 功能: pb1 输出高低电平 时隔为一秒 #include iom88v.h #include macros.h int blink_sign = 0; void timer0_init(void) { TCCR0A = 0x00; //timer0 普通模式 TCCR0B = 0x03; //预分频/64 启动TIME0 普通模式 TCNT0 = 0x83; //晶振8MHz, 频率为1KHz 0x83 = 256 - 8000000 * 1 / 64 / 1000 TIMSK0|=0x01; SREG|=0x80; //使
[单片机]
STM32 关于USART接收中断的BUG和注意事项
今天在使用USART模块,遇到了一些问题并解决了,于是发贴共享。 问题描述: 在使用USART做串口通讯时,我只把接收中断打开,并设置抢占优先级为最低一个级别,而接收中断上一个优先级处理事情比较多,可能占用了2ms时间。当我使用9600波特率往下位机发送数据,速度非常快,就是一直按回车发!问题就出来,不到1分钟时间,通讯没有反应了。USART配置代码如下: void uart_config(void) { USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = UART_GetBaud(BaudRate); USART_In
[单片机]
STM32F407的外部中断设置
比如要是使用GPC3作为中断源,上升沿触发 外部中断必须配置好EXTI和NVIC 使用以下函数打开SYSCFG的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE) GPIO设置如下 void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; /* GPIOF Periph clock enable */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_S
[单片机]
LPC中的中断处理小结
近来在LPC的中断过程上看了点文献,作为一个初学者感觉这个内容与其它的处理器还是有很大的区别,比如说三星的S3C4510B,两者在中断的处理上理念是完全不同的,个人感觉LPC的要难一些,很多地方感觉上是在和ARM的规范打擦边球,下面具体说一下相关内容。 基础知识:LPC2294的EXT中断分为了三类,包括FIQ,Vectored IRQ,non-- Vectored IRQ,其中,以FIQ的优先级最高,而以non-- Vectored IRQ的优先级最低,系统一共提供了27个中断源,并且给这27个中断源进行了固定的编号,但是注意,这个编号和优先级没有任何的关系,并非是编号在前面的优先级就越高,见下面说明。 关键内容:两套控制渠道,
[单片机]
STM32CUBEMX 中断管理
使用cube开发工具进行开发,使用HAL库,有一个问题就是当我们在cube界面配置完成后“以为完全配置好了”,结果在实际代码编写的时候回发现常见以下问题: 1:中断没配置 2:优先级没配置 这里简单分析以下手动开启中断的配置 取两个例子 example1:如何在无法改动cube工程的情况下 使能外部中断 step1 gpio.c 中 GPIO_InitStruct.Pin = MotoFG_Pin; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_Ini
[单片机]
uart 中断 缓冲区
在CVAVR系统提供的标准库函数stdio.h中,提供了getchar()函数,该函数是采用轮询方式从USART接收数据的,轮询方式不仅效率低,而且会丢失数据,不能实现多任务的并行处理。 CVAVR程序向导中给出的采用中断+缓冲的方式接受数据,同PC的串口接受数据的方法一样,充分利用了AVR的高速和RAM多的优点,体现出了如何才能充分发挥AVR的特点的程序设计思想,这种思路在32位系统中也是这样的。 使用AVR的话,对软件的设计能力要求更高了,否则根本不能发挥和体现AVR的特点。许多人有了一点C的基础,就认为采用C编写单片机程序没问题,很快就会掌握AVR了,对此我只能一笑了之。看看本站上众多的代码,再看看本贴的遭遇,能说什么
[单片机]
MSP430单片机中断嵌套机制简介
1、MSP430单片机默认是关闭中断嵌套的,除非你在一个中断程序中再次开启总中断EINT。 2、对于单源中断,只要响应中断,系统硬件自动清中断标志位,对于TA/TB定时器的比较/捕获中断,只要访问TAIV/TBIV,标志位将被自动清除;对于多源中断要手动清标志位,比如P1/P2口中断,要手工清除相应的标志,如果在这种中断用“EINT();”开中断,而在打开中断前没有清标志,就会有相同的中断不断嵌入,而导致堆栈溢出引起复位,所以这类中断必须先清中断标志再打开总中断开关。 3、当进入中断服务程序时,只要不在中断服务程序中再次开启中断,MSP430单片机总中断是关闭的,此时再来中断不管是比当前中断的优先级高还是低都不执行,至到当
[单片机]
MSP430按键中断
#include msp430f149.h typedef unsigned char uchar; typedef unsigned int uint; #define keyin (P1IN & 0X0F) #define wei_h P5OUT |= BIT5 #define wei_l P5OUT &= BIT5 #define duan_l P6OUT &= ~BIT6 #define duan_h P6OUT |= BIT6 uchar table = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}
[单片机]

推荐帖子

Boost型功率因数校正器的电磁兼容研究
摘要:介绍了一种采用无源功率因数校正方法降低电源谐波含量的方案。实验结果表明,该方案成本低、性能好,容易达到各项EMC标准,适合于中小功率电源。关键词:功率因数校正;电磁兼容;谐波抑制 0引言为了减少对交流电网的谐波污染,已经推出了一些限制电流谐波的标准,如IEC1000-3-2ClassD标准,要求必须采取措施降低输入电网的电流谐波含量,提高功率因数。传统的二极管和电容对输入信号进行整流滤波时,只在输入交流电压的峰值部分才有输入电流,导致产生了很大的电流谐波含量,严
zbz0529 电源技术
读保护选项字节RDP遇到的问题
我在调程序时遇到了一点问题。我在尝试用读保护功能,向RDP里写了0x00,结果再也没办法仿真,程序不从main()执行,一直在HardFaultException()里,不用仿真设备运转正常。麻烦您帮我看一下怎么能够解决呢。读保护选项字节RDP遇到的问题读保护以后在读FLASH的时候会发生异常恩问题解决了找了个程序应该是从SRAM里面运行然后把选项字都给他擦了改成A5再把以前的程序写回去就好了回复沙发daicheng的帖子
vipsongyan stm32/stm8
ALTERA 的家庭网络产品方案
本帖最后由jameswangsynnex于2015-3-320:02编辑针对消费娱乐的家庭网络连接利用多媒体家庭联网技术,各种多媒体设备(例如电视机、便携式媒体播放器、照相机和蜂窝电话等)以及数据设备(例如PC和PDA)可以在安全的家庭网络环境中共享音频视频和数据。在过去十年中,逐步普及了宽带互联网接入,PC不仅仅用于数据访问,还可以访问并共享多媒体文件。同时,照相机和便携式媒体播放器等数字设备逐渐流行起来,这类设备产生了大量的多媒体内容。但是,由于家庭内部不同设备
jameswangsynnex 移动便携
关于PCB设计,提个建议
在做PCB设计的时候,建议把器件标号重新排列,按照PCB板子上器件出现的顺序(比如从左到右,从上到下,从正面到反面这样的顺序)。这样做的好处就是:方便装配。关于PCB设计,提个建议可以考虑一下,以后要不要这么做youdaoli
tx_xy PCB设计
不可不了解氮化镓(GaN)的那些事之技术篇(下)!
在前面的不可不了解氮化镓(GaN)的那些事之初识篇,大家对用GaN技术如何来实现5G通信,5G为何又能带动GaN崛起,以及GaN技术将会给互联网带来怎样的变革等等有深刻的了解,是不是感受到了氮化镓(GaN)技术真的是很重要的。是不是想很快能够熟练掌握氮化镓(GaN)技术,尽快的将它用在您的产品设计中助力您的研发。好了,这里给大家推荐几篇关于氮化镓(GaN)技术的干货文章,看后助您玩转氮化镓(GaN)技术,赶快阅读下面的文章吧。1、如何偏置GaN晶体管:入门教程http
alan000345 RF/无线
高抗干扰液晶驱动防静电LCD驱动芯片VK2C21抗噪段码驱动IC
VK2C21是一个点阵式存储映射的LCD驱动器,可支持最大80点(20SEGx4COM)或者最大128点(16SEGx8COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,也可通过指令进入省电模式。其高抗干扰,低功耗的特性适用于水电气表以及工控仪表类产品。L63+05https://img.jishulink.com/202408/attachment/4649b7386c854264b647cf9351cc3c25.pnghttps://img.jishulink
vinka杨桃 51单片机
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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