在探索Linux的庞大和复杂世界时🌌,我们经常会遇到许多关键概念和工具🛠️,它们使得Linux成为了一个强大和灵活的操作系统💪。其中,"设备树"(Device Tree)是一个不可或缺的部分🌲,尤其是在嵌入式系统🖥️和多平台硬件支持方面🔌。让我们深入了解Linux设备树是什么,它的起源,以及为什么Linux需要它🌳。
在根文件系统中查看设备树,是一种不错的调试手段。因为很多时候会出现你修改了 dts 文件,并且也编译了新的 dtb,但是下载到板子上的还是以前的 dtb,因此查看板子中真实生效的设备树配置信息是很重要的。
设备树是一种数据结构,它通过特有的语法格式描述片上片外的设备信息。由BootLoader传递给kernel,kernel进行解析后形成和驱动程序关联的dev结构供驱动代码使用。
设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(DeviceTree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、IIC 接口上接了哪些设备、SPI 接口上接了哪些设备等等。
上文我们讲述了uboot编译及配置,本文讲述了如何编译kernel,对编译过程中遇到的问题进行解决
参考地址 http://blog.csdn.net/green1900/article/details/45646095 http://www.cnblogs.com/xiaojiang1025/p/6131381.html http://blog.csdn.net/21cnbao/article/details/8457546
设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备设备树的文件叫做DTS(Device Tree Source),这个DTS文件采用了树形结构来描述板机设备,也就是开发板信息,比如CPU数量、内存基地址、IIC接口上接了那些设备、SPI接口上接了那些设备等。如最开始的图片所示! 在图片中,树的主干就是系统总线,IIC控制器、SPI控制器等都是接到系统主线的分支上的。通过DTS这个文件描述设备信息是有相关的语法规则的,并且在Linux内核中只有3.x版本以后的才支持设备树。
本篇文章主要讲解嵌入式板卡中Linux系统是如何正确测试、使用的,其中内容包含有U-Boot编译、U-Boot命令和环境变量说明、Linux内核编译、xtra驱动编译、系统信息查询、程序开机自启动说明、NFS使用说明、TFTP使用说明、TFTP + NFS的系统启动测试说明、inux设备驱动说明等,其中案例源码部分公开。
部分硬件设计中需要CPU完成对电路寄存器的配置,为了完成Zedboard对FPGA上部分寄存器的配置功能,可以在PS单元(处理器系统)上运行裸机程序(无操作系统支持)完成和PL单元(FPGA部分)的数据交互功能,此时PS单元更像单片机开发;另一种方法是PS单元运行Linux操作系统,通过驱动程序和应用程序完成对硬件寄存器的读写操作,并且Linux有着完整的网络协议栈支持,后续可拓展性更强,可以更好的发挥ZYNQ这种异构架构芯片的性能。主要分为两部分,分别阐述Zedboard中FPGA和处理器互联总线与硬件设计和Zedboard处理器系统上嵌入式Linux的移植与通过驱动和应用程序简单配置FPGA寄存器的实现。上次介绍了没有操作系统下的驱动和应用程序开发,本文介绍带操作系统的驱动和应用程序开发。
设备树源 (DTS,device tree source) 格式是设备树的文本表示形式。设备树编译器 (DTC) 可将这种格式处理为二进制设备树,这是 Linux 内核要求的形式。
在之前使用 S3C2440 开发板移植 Linux 3.4.2 内核时,修改了很多关于 c 文件去适配开发板,和开发板相关的文件放在arch/arm/mxch-xxx目录下,因此 linux 内核 arm 架构下添加了很多开发板的适配文件:
NXP官方linux仓库地址为:https://github.com/Freescale/linux-fslc/tree/5.4-2.1.x-imx。
编译器下载地址:Downloads | GNU-A Downloads – Arm Developer[1]
这篇文章简单我们来一起梳理嵌入式Linux的一些知识,方便于一些想跟我一样想要由单片机进阶到嵌入式Linux的朋友做一些参考学习。
在Linux 2.6中, ARM架构的板极硬件细节过多地被硬编码在arch/arm/plat-xxx和arch/arm/mach-xxx中,采用设备树后,许多硬件的细节可以直接通过它传递给Linux,而不再需要在内核中进行大量的冗余编码。
上面介绍的编译模块是和内核一起编译的,这种编译方式比较耗时。在Linux3.x 以后的版本才引入了设备树,有了设备树之后,只需要一次编译内核,编译内核的时候会生成的dtc 工具,利用dtc工具就可以完成驱动的编译。我们这里只是简单介绍如何编译设备树、加载设备树,关于设备树,后面会有更加详细的解释。
Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离。在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写。引入了设备树之后,驱动代码只负责处理驱动的逻辑,而关于设备的具体信息存放到设备树文件中,这样,如果只是硬件接口信息的变化而没有驱动逻辑的变化,驱动开发者只需要修改设备树文件信息,不需要改写驱动代码。比如在ARM Linux内,一个.dts(device tree source)文件对应一个ARM的machine,一般放置在内核的"arch/arm/boot/dts/"目录内,比如exynos4412参考板的板级设备树文件就是"arch/arm/boot/dts/exynos4412-origen.dts"。这个文件可以通过$make dtbs命令编译成二进制的.dtb文件供内核驱动使用。
上一节说过设备树的出现是为了解决内核中大量的板级文件代码,通过 DTS 可以像应用程序里的 XML 语言一样很方便的对硬件信息进行配置。关于设备树的出现其实在 2005 年时候就已经在 PowerPC Linux 里出现了,由于 DTS 的方便性,慢慢地被广泛应用到 ARM、MIPS、X86 等架构上。为了理解设备树的出现的好处,先来看下在使用设备树之前是采用什么方式的。
Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离。在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写。
嵌入式软件通常是指嵌入式系统中运行的软件,嵌入式系统是一种特殊的计算机系统,通常用于控制、监测和数据处理等任务。嵌入式系统通常由硬件和软件两个部分组成,其中嵌入式软件是指在嵌入式系统中运行的程序,用于控制硬件并提供特定的功能和服务。嵌入式软件应用广泛,包括汽车、医疗设备、智能家居、智能穿戴、工业自动化等众多领域。
上篇文章(【i.MX6ULL】驱动开发4--点亮LED(寄存器版))介绍了在驱动程序中,直接操作寄存器了点亮LED。本篇,介绍另外一种点亮LED的方式——设备树,该方式的本质也是操作寄存器,只是寄存器的相关信息放在了设备树中,配置寄存器时需要使用OF函数从设备树中读取处寄存器数据后再进行配置。
Dts:DTS即Device Tree Source,是一个文本形式的文件,用于描述硬件信息。一般都是固定信息,无法变更,无法overlay。
转载请注明原文地址:http://wiki.100ask.org/Linux_devicetree
总线、设备和驱动模型,如果把它们之间的关系比喻成生活中的例子是比较容易理解的。举个例子,充电墙壁插座安静的嵌入在墙面上,无论设备是电脑还是手机,插座都能依然不动的完成它的使命——充电,没有说为了满足各种设备充电而去更换插座的。其实这就是软件工程强调的高内聚、低耦合概念。
修改内核文件:drivers/video/fbdev/Makefile,把内核自带驱动程序mxsfb.c对应的那行注释掉,如下:
最近有一些riscv的项目做,虽然以前也用过例如k210之类的riscv架构的芯片,但是都止于能够做一些应用,并未特别关注其芯片的体系架构方面的东西,但是随着接触的芯片架构的种类的逐渐的增加,发现要想使用一款好芯片的,仅仅做上层应用并不能完全发挥出特定架构芯片的全部优势。比如aarch64的el层级和虚拟化的模型,mips的mmu特性,以及sparc的窗口寄存器等等,芯片架构的特点要是能够完全的发挥出来,写起应用起来,那真是觉得很爽的事情。
很多学员有过STM32的学习经验,他们手上的开发板很多,LCD也很多。 一个LCD还挺贵的,不能浪费。 各家的LCD引脚顺序都不一样,所以别家的LCD不能直接接到100ASK_IMX6ULL开发板,需要转接板。 大部分单片机学员都是使用正点原子、野火的板子,有他们的屏。 针对这两家的屏,我们做了转接板,如下:
今天跟大家分享的是设备树,设备树是Linux3.x以后的版本才引入的,设备树用于描述一个硬件平台的板级细节。
您可以使用设备树编译器 (DTC) 编译设备树源文件。不过,在将叠加层 DT 应用于目标主 DT 之前,您还应该通过模拟 DTO 的行为来验证结果。
传统的配置 pin 的方式就是直接操作相应的寄存器,但是这种配置方式比较繁琐、而且容易出问题(比如 pin 功能冲突)。pinctrl 子系统就是为了解决这个问题而引入的,pinctrl 子系统主要工作内容如下:
NAND FLASH版本和eMMC版本核心板使用方法基本一致。本文主要描述U-Boot编译、基础设备树文件编译、固化Linux系统NAND FLASH分区说明和NAND FLASH启动系统、固化Linux系统、AND FLASH读写测试等,NAND FLASH版本与eMMC版本核心板在使用方面的不同之处,相同之处将不重复描述。
NanoPi-NEO(http://www.friendlyelec.com.cn/nanopi-neo.asp)是一款基于全志H3的小体积核心板,我手里使用的是v1.4版本,如下。
在内核源码中,存在大量对板级细节信息描述的代码。这些代码充斥在/arch/arm/plat-xxx和/arch/arm/mach-xxx目录,对内核而言这些platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的platform_data绝大多数纯属垃圾冗余代码。为了解决这一问题,ARM内核版本3.x之后引入了原先在Power PC等其他体系架构已经使用的Flattened Device Tree。
今天和大家分享的依然是设备树,上一节里主要是介绍了设备树文件的基本格式、语法规则等,今天介绍一下如何使用设备树,以及如何动态加载设备树。
在platform_device部分有简单说明描述设备有两种方法:一种是使用platform_device结构体来指定;另一种是使用设备树来描述。
在GPIO驱动程序中,解析跟Pinctrl之间的联系:处理gpio-ranges:
本次测评板卡是创龙科技旗下的TL570x-EVM,它是一款基于TI Sitara系列AM5708ARM Cortex-A15+浮点DSPC66x处理器设计的异构多核SOC评估板,由核心板和评估底板组成。核心板经过专业的PCB Layout和高低温测试验证,稳定可靠,可满足各种工业应用环境。
在未进行任何优化的情况下,Baby LLaMA 2 在运行15M参数的模型时,仅占用了部分CPU和内存资源(资源占用率均低于30%),但生成 token 的速度极慢,无法达到流畅生成故事的需求,本题需要采取各种手段优化其运行速度
前面通过学习总线、设备、驱动模型知识后,知道了设备和驱动之间都是通过总线进行绑定而匹配的;然后通过设备树的深入探究,知道了设备树的出现大大增加了驱动的通用性;接着我们一起看了 Linux 的启动流程和设备在内核里一层一层的展开。
百问网技术交流群,百万嵌入式工程师聚集地: https://www.100ask.net/page/2248041
进入 uboot 的命令行模式以后输入“help”或者“?”,然后按下回车即可查看当前 uboot 所支持的命令,如下图所示:
apex_payload.img是由dm-verity支持的ext4文件系统映像。各种原生常规文件包含在apex_payload.img文件中
上篇文章介绍了LCD屏幕的使用,这个屏幕还有触摸功能,本篇就来介绍LCD的触摸功能的使用。
理想状况是:按下、松开按键,各产生一次中断,也只产生一次中断。 但是对于机械开关,它的金属弹片会反复震动。GPIO电平会反复变化,最后才稳定。一般是几十毫秒才会稳定。 如果不处理抖动的话,用户只操作一次按键,会发生多次中断,驱动程序可能会上报多个数据。
参考文档: a. 内核 Documentation\devicetree\bindings\Pinctrl\ 目录下: Pinctrl-bindings.txt
资料下载 coding无法使用浏览器打开,必须用git工具下载: git clone https://e.coding.net/weidongshan/linux/doc_and_source_for_drivers.git 视频观看 百问网驱动大全 编写input_dev驱动框架 参考资料: 1. 回顾框架 2. 怎么编写input_dev驱动 2.1 分配/设置/注册input_dev 2.2 硬件相关的操作 3. 现场编程 在设备树里创建一个节点 指定硬件资源等信息 编译一个pla
默认情况下,所有接口信号引脚都配置为GPIO输入,除了引脚3和5、引脚27和28 (I2C SDA和SCL)、引脚8和10 (UART TX和RX)。
看上图,选择122号中断,它是SPI里的122号中断,GIC里的编号是(32+122)=154。
领取专属 10元无门槛券
手把手带您无忧上云