linux and the device tree linux内核设备树数据使用模型。
open firmware device tree (dt) 是一个数据结构,也是一种描述硬件的语言。准确地说,它是一种能被操作系统解析的描述硬件的语言,这样操作系统就不需要把硬件平台的细节在代码中写死。
从结构上来说,dt是一个树形结构,或者有名结点组成的非循环图,结点可能包含任意数量的有名属性,有名属性又可以包含任意数量的数据。同样存在一种机制,可以创建从一个结点到正常树形结构之外的链接。
从概念上讲,一套通用的使用方法,即bindings。bindings定义了数据如何呈现在设备树中,怎样描述典型的硬件特性,包括数据总线,中断线,gpio连接以及外设等。
尽可能多的硬件被描述从而使得已经存在的bindings最大化地使用源代码,但是由于属性名和结点名是简单字符串, 可以通过定义新结点和属性的方式很方便地扩展已经存在的bindings或者创建一个新的binding。在没有认真了解过已经存在的bindings的情况下,创建一个新的binding要慎之又慎。
对于i2c总线,通常有两种不同的,互不相容的bindings出现,就是因为新的binding创建时没有研究i2c设备是如何在当前系统中被枚举的。1. 历史 略2. 数据模型 请参考device tree usage章节2.1 high level view 必须要认识到的是,dt是一个描述硬件的数据结构。
它并没有什么神奇的地方,也不能把所有硬件配置的问题都解决掉。它只是提供了一种语言,将硬件配置从linux kernel支持的board and device driver中提取出来。
dt使得board和device变成数据驱动的,它们必须基于传递给内核的数据进行初始化,而不是像以前一样采用hard coded的方式。观念上说,数据驱动平台初始化可以带来较少的代码重复率,使得单个内核映像能够支持很多硬件平台。
linux使用dt的三个主要原因:1) 平台识别 (platform identification)2) 实时配置 (runtime configuration)3) 设备植入 (device population)2.2 平台识别 第一且最重要的是,内核使用dt中的数据去识别特定机器。最完美的情况是,内核应该与特定硬件平台无关,因为所有硬件平台的细节都由设备树来描述。
然而,硬件平台并不是完美的,所以内核必须在早期初始化阶段识别机器,这样内核才有机会运行特定机器相关的初始化序列。大多数情况下,机器识别是与设备树无关的,内核通过机器的核心cpu或者soc来选择初始化代码。
以arm平台为例,setup_arch()会调用setup_machine_fdt(),后者遍历machine_desc链表,选择最匹配设备树数据的machine_desc结构体。它是通过查找设备树根结点的compatible属性并与machine_desc->dt_compat进行比较来决定哪一个machine_desc结构体是最适合的。
compatible属性包含一个有序的字符串列表,它以确切的机器名开始,紧跟着一个可选的board列表,从最匹配到其他匹配类型。以ti beagleboard的compatible属性为例,beagleboard xm board可能描述如下:compatible = "ti,omap3-beagleboard", "ti,omap3450", "ti,omap3"; compatible = "ti,omap3-beagleboard-xm", "ti,omap3450", "ti,omap3"; 在这里,”ti, omap3-beagleboard-xm”是最匹配的模型,"ti,omap3450"次之,"ti,omap3"再次之。
机敏的读者可能指出,beagle xm也可以声明匹配"ti,omap3-beagleboard",但是要注意的是,板级层次上,两个机器之间的变化比较大,很难确定是否兼容。从顶层上来看,宁可小心也不要去声明一个board兼容另外一个。
值得注意的情况是,当一个board承载另外一个,例如一个cpu附加在一个board上。(两种cpu支持同一个board的情况)。
第一阶段:linux基础入门Linux基础入门主要包括: Linux硬件基础、Linux发展历史、Linux系统安装、xshell连接、xshell优化、SSH远程连接故障问题排查、L inux基础优化、Linux目录结构知识、Linux文件属性、Linux通配符、正则表达式、Linux系统权限等第二阶段:linux系统管理进阶linux系统管理进阶包括:Linux定时任务、Linux用户管理、Linux磁盘与文件系统、Linux三剑客之sed命令等。
第三阶段:Linux Shell基础Linux Shell基础包括:Shell编程基础、Linux三剑客之awk命令等。第四阶段:Linux网络基础第五阶段:Linux网络服务Linux网络服务包括:集群实战架构开始及环境准备、rsync数据同步服务、Linux全网备份项目、nfs网络存储服务精讲、inotify/sersync实时数据同步/nfs存储实时备份项目等。
第六阶段:Linux重要网络服务Linux重要网络服务包括:patible controller: Intel Corporation 82852/855GM Integrated Graphics Device (rev 02) 00:02。 1 Display controller: Intel Corporation 82852/855GM Integrated Graphics Device (rev 02) 00:1d。
0 USB Controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 (rev 03) 00:1d。 1 USB Controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 (rev 03) 00:1d。
2 USB Controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 (rev 03) 00:1d。 7 USB Controller: Intel Corporation 82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller (rev 03) 00:1e。
0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 83) 00:1f。 0 ISA bridge: Intel Corporation 82801DBM (ICH4-M) LPC Interface Bridge (rev 03) 00:1f。
1 IDE interface: Intel Corporation 82801DBM (ICH4-M) IDE Controller (rev 03) 00:1f。 3 SMBus: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller (rev 03) 00:1f。
5 Multimedia audio controller: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller (rev 03) 00:1f。 6 Modem: Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Modem Controller (rev 03) 02:00。
0 Ethernet controller: Realtek Semiconductor Co。 , Ltd。
RTL-8139/8139C/8139C+ (rev 10) 02:09。0 CardBus bridge: Texas Instruments Texas Instruments PCIxx21/x515 Cardbus Controller 02:09。
2 FireWire (IEEE 1394): Texas Instruments Texas Instruments OHCI Compliant IEEE 1394 Host Controller 02:09。3 Unknown mass storage controller: Texas Instruments Texas Instruments PCIxx21 Integrated FlashMedia Controller 02:09。
4 Class 0805: Texas Instruments Texas Instruments PCI6411, PCI6421, PCI6611, PCI6621, PCI7411, PCI7421, PCI7611, PCI7621 Secure Digital (SD)。
在linux内核启动过程中,这两个名字匹配了,就调用驱动的probe函数。
设备树中的每一个代表了一个设备的节点都要有一个compatible属性。compatible是系统用来决定绑定到设备的设备驱动的关键。
compatible属性是用来查找节点的方法之一,另外还可以通过节点名或节点路径查找指定节点。 系统初始化时会初始化platform总线上的设备(按键驱动表现为Platform驱动),根据设备节点"compatible"属性和驱动中of_match_table对应的值,匹配了就加载对应的驱动。
linux设备树驱动exynos4412怎么写
系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,它完成以下的功能:
1、对设备初始化和释放。
2、把数据从内核传送到硬件和从硬件读取数据。
3、读取应用程序传送给设备文件的数据和回送应用程序请求的数据。
4、检测和处理设备出现的错误。
在Linux操作系统下有三类主要的设备文件类型,一是字符设备,二是块设备,三是网络设备。字符设备和块设备的主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作。块设备是主要针对磁盘等慢速设备设计的,以免耗费过多的CPU时间来等待。
已经提到,用户进程是通过设备文件来与实际的硬件打交道。每个设备文件都都有其文件属性(c/b),表示是字符设备还是块设备?另外每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他们。设备文件的的主设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序。
最后必须提到的是,在用户进程调用驱动程序时,系统进入核心态,这时不再是抢先式调度。也就是说,系统必须在你的驱动程序的子函数返回后才能进行其他的工作。如果你的驱动程序陷入死循环,不幸的是你只有重新启动机器了,然后就是漫长的fsck。
读/写时,它首先察看缓冲区的内容,如果缓冲区的数据未被处理,则先处理其中的内容。
你好,首先我要说明我是ARM嵌入式开发工程师,偏驱动向
驱动难,没有3年以上的工作经验 都没什么料子的
要写驱动
你要很熟悉linux C 而且注重字符串和指针处理
然后你就学数字电路 要多懂
其次要学会看datasheet
这些学得差不多了就进入了内核,为什么要知道内核(只需要知道内核的工作原理机制还有版本变动),因为内核跟驱动是不分家的,你写了驱动就知道
然后就是进入主菜,写驱动,看书时必须的,我看驱动的书不下10本,而且尽量消化,随后你就尝试写某些驱动,只要你会一个类型的就会这一类型的驱动,同类驱动是万变不离其宗 不要想着全部驱动都学会,要学精!像NV realtek这些厉害的工程师 一辈子就写两个驱动(当然,所有驱动中为网卡驱动和显卡驱动最难最容易出错!同时也是最厉害的人去写的)
驱动!路漫漫其修远兮!
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
蜀ICP备2020033479号-4 Copyright © 2016 学习鸟. 页面生成时间:4.207秒