范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

设备树基础知识分享

  本文部分内容整理自:百文网及正点原子前言
  之前分享的笔记:Linux总线设备驱动模型 中在platform_device部分有简单说明描述设备有两种方法:一种是使用platform_device结构体来指定;另一种是使用 设备树 来描述。本篇笔记我们就来简单地学习一下设备树的一些知识。什么是设备树
  设备树简单理解就是描述设备信息(资源)的一棵树。 设备树(Device Tree) 用代码体现如下:
  这些代码被保存在 .dts/dtsi 后缀文件中,也即设备树源文件 DTS(DeviceTree Source) 。这些源文件同我们的C代码一样,并不能直接使用的,而是得经过一个编译过程生成机器可运行的二进制文件,如:
  dts文件使用dtc工具编译生成dtb文件,这个dtb文件就是内核可以使用的文件。例如我们的板子跑起来之后,我们系统使用的设备树文件就存在目录/boot下:
  Linux为什么会引入设备树?
  在上一个实验:基于总线设备驱动模型的LED驱动实践 中我们使用了platform_device结构体来描述led设备(硬件资源)。既然已经有了描述设备的方法了,为什么还要引入设备树呢?因为Linux内核中有很多BSP(板级支持包),不同的BSP会包含着不同的描述设备的代码(.c或.h文件)。随着芯片的发展,Linux内核中就包含着越来越多这些描述设备的代码,导致Linux内核代码会很臃肿。
  这导致Linux之父Linus 大发雷霆: "this whole ARM thing is a f*cking pain in the ass"。 因此引入了设备树文件,从而可精简一些臃肿的C代码。除此之外,.dts编译生成.dtb文件的过程要比.c编译生成驱动模块、加载驱动模块的过程要简单很多,也更方面我们进行开发。 设备树的语法
  设备树源文件也是需要根据一定规则来编写的,同C语言一样,也要遵循一些语法规则。下面简单看一下设备树的源码结构及语法。
  先看一个设备树示例:
  1、节点格式
  label: node-name@unit-address
  其中: label:标号
  node-name:节点名字
  unit-address:单元地址
  label 是标号,可以省略。 label 的作用是为了方便地引用 node。比如:
  可以使用下面 2 种方法来修改 uart@fe001000 这个 node:
  2、属性格式
  简单地说, properties 就是"name=value", value 有多种取值方式。 示例: 一个32位的数据,用尖括号包围起来,如 interrupts = <17 0xc>;   一个64位数据(使用2个32位数据表示),用尖括号包围起来,如: clock-frequency = <0x00000001 0x00000000>;   有结束符的字符串,用双引号包围起来,如: compatible = "simple-bus";   字节序列,用中括号包围起来,如: local-mac-address = [00 00 12 34 56 78]; // 每个byte使用2个16进制数来表示    local-mac-address = [000012345678];      // 每个byte使用2个16进制数来表示   可以是各种值的组合,用逗号隔开,如: compatible = "ns16550", "ns8250";    example = <0xf00f0000 19>, "a strange property format";   3、一些标准属性(1) compatible 属性
  "compatible"表示"兼容",对于某个LED,内核中可能有A、B、C三个驱动都支持它,那可以这样写: led {        compatible = "A", "B", "C";    };  
  内核启动时,就会为这个LED按这样的优先顺序为它找到驱动程序:A、B、C。 (2)model 属性
  model属性与compatible属性有些类似,但是有差别。compatible属性是一个字符串列表,表示可以你的硬件兼容A、B、C等驱动;model用来准确地定义这个硬件是什么。比如根节点中可以这样写: / {        compatible = "samsung,smdk2440", "samsung,mini2440";        model = "jz2440_v3";    };  
  它表示这个单板,可以兼容内核中的"smdk2440",也兼容"mini2440"。从compatible属性中可以知道它兼容哪些板,但是它到底是什么板?用model属性来明确。 (3)status 属性
  status 属性看名字就知道是和设备状态有关的, status 属性值也是字符串,字符串是设备的状态信息,可选的状态如下所示:
  (4)#address-cells 和#size-cells 属性
  格式: address-cells:address要用多少个32位数来表示;    size-cells:size要用多少个32位数来表示。
  比如一段内存,怎么描述它的起始地址和大小?下例中,address-cells为1,所以reg中用1个数来表示地址,即用0x80000000来表示地址;size-cells为1,所以reg中用1个数来表示大小,即用0x20000000表示大小: / {        # address-cells = <1>;        # size-cells = <1>;        memory {        	reg = <0x80000000 0x20000000>;        };    };   (5)reg 属性
  reg的本意是register,用来表示寄存器地址。但是在设备树里,它可以用来描述一段空间。反正对于ARM系统,寄存器和内存是统一编址的,即访问寄存器时用某块地址,访问内存时用某块地址,在访问方法上没有区别。
  reg属性的值,是一系列的"address size",用多少个32位的数来表示address和size,由其父节点的# address-cells、#size-cells决定。示例: /dts-v1/;    / {        # address-cells = <1>;        # size-cells = <1>;        memory {        	reg = <0x80000000 0x20000000>;        };    };   (7)name 属性
  过时了,建议不用。它的值是字符串,用来表示节点的名字。在跟platform_driver匹配时,优先级最低。compatible属性在匹配过程中,优先级最高。 (8)device_type 属性
  过时了,建议不用。它的值是字符串,用来表示节点的类型。在跟platform_driver匹配时,优先级为中。compatible属性在匹配过程中,优先级最高。 3、常用的节点(1)根节点
  用 / 标识根节点,如: /dts-v1/;    / {        model = "SMDK24440";        compatible = "samsung,smdk2440";         # address-cells = <1>;        # size-cells = <1>;    };   (2)CPU节点
  一般不需要我们设置,在 dtsi 文件中都定义好了,如: cpus {        # address-cells = <1>;        # size-cells = <0>;         cpu0: cpu@0 {        	.......        }    };   (3)memory 节点
  芯片厂家不可能事先确定你的板子使用多大的内存,所以 memory 节点需要板厂设置,比如: memory {    	reg = <0x80000000 0x20000000>;    }; (4)chosen 节点
  我们可以通过设备树文件给内核传入一些参数,这要在chosen节点中设置bootargs属性: chosen {    	bootargs = "noinitrd root=/dev/mtdblock4 rw init=/linuxrc console=ttySAC0,115200";    };   操作设备树的函数
  Linux 内核给我们提供了一系列的函数来获取设备树中的节点或者属性信息,这一系列的函数都有一个统一的前缀"of_"("open firmware"即开放固件。 ),所以在很多资料里面也被叫做 OF 函数。 1、节点相关操作函数
  Linux 内核使用 device_node 结构体来描述一个节点,此结构体定义在文件 include/linux/of.h 中,定义如下:
  与查找节点有关的 OF 函数有 5 个: (1) of_find_node_by_name 函数
  of_find_node_by_name 函数通过节点名字查找指定的节点,函数原型如下: struct device_node *of_find_node_by_name(struct device_node *from, const char *name);(2) of_find_node_by_type 函数
  of_find_node_by_type 函数通过 device_type 属性查找指定的节点,函数原型如下: struct device_node *of_find_node_by_type(struct device_node *from, const char *type);(3) of_find_compatible_node 函数
  of_find_compatible_node 函数根据 device_type 和 compatible 这两个属性查找指定的节点,函数原型如下: struct device_node *of_find_compatible_node(struct device_node *from,const char *type, const char *compatible);(4)of_find_matching_node_and_match 函数
  of_find_matching_node_and_match 函数通过 of_device_id 匹配表来查找指定的节点,函数原型如下: struct device_node *of_find_matching_node_and_match(struct device_node *from,const struct of_device_id *matches,const struct of_device_id **match);(5)of_find_node_by_path 函数
  of_find_node_by_path 函数通过路径来查找指定的节点,函数原型如下: inline struct device_node *of_find_node_by_path(const char *path);2、提取属性值的 OF 函数
  Linux 内核中使用结构体 property 表示属性,此结构体同样定义在文件 include/linux/of.h 中,内容如下:
  Linux 内核也提供了提取属性值的 OF 函数 : (1) of_find_property 函数
  of_find_property 函数用于查找指定的属性,函数原型如下: property *of_find_property(const struct device_node *np,const char *name,int *lenp);(2)of_property_count_elems_of_size 函数
  of_property_count_elems_of_size 函数用于获取属性中元素的数量,比如 reg 属性值是一个数组,那么使用此函数可以获取到这个数组的大小,此函数原型如下: int of_property_count_elems_of_size(const struct device_node *np,const char *propname,int elem_size);(3)读取 u8、 u16、 u32 和 u64 类型的数组数据
  (4)读取 u8、 u16、 u32 和 u64 类型属性值
  (5)of_property_read_string 函数
  of_property_read_string 函数用于读取属性中字符串值,函数原型如下: int of_property_read_string(struct device_node *np,const char *propname,const char **out_string)
  以上就是关于设备树的一些基础知识的整理学习,下一篇笔记我们再来一起学一下设备树的一些具体实验。
  1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。私信回复 1024,即可免费获取!

iPhone13C才是重头戏,苹果秋季发布会有的不仅仅是iPhone13笔歌科技独家报道这消息真够劲爆,苹果秋季发布会还有另外一款型号的iPhone手机发布,iPhone13C才是重头戏,苹果保密工作做得够深的啊,一起来围观。01苹果秋季发布会还有另外现在买骁龙870过时了?Reno6Pro这三点体验,入手依旧稳赚说起来,2021年已经开始走到秋季的时段了,本以为是个相对平静的日子。但让人意外的是,手机圈中却依然有不少厂商选择扎堆在这个时间节点发布新机,这可能归功于近期骁龙888Plus的登就单反镜头配置来说,哪些镜头应该买原厂,哪些镜头应该追求性价比买副厂?副厂的牛头可以考虑,必竟价格上便宜不少。做工也相当很好,值得推荐。比原厂少掏三分之一的银子。(菊花台上,菊花展)感谢邀请,其实这玩意儿完全看自己的预算,预算充足肯定要买好的,预算不日赚6。5亿,营收碾压百度,支撑起字节帝国的算法有多神?究竟是怎样的一家公司,能够创建了今日头条之后,又打造出日活跃用户6个亿,平均用户时长达到2个小时的抖音平台?日前,抖音发布了一个私域经营的白皮书,揭开了背后的秘密,通过研究这份白皮五角大楼正在试验运用人工智能预见未来数日美国北方司令部(NORTHCOM)最近进行了一系列被称为全球信息主导权实验(GIDE)的测试,将全球传感器网络人工智能(AI)系统和云计算资源相结合,试图实现信息主导权和决策优势。地面通信那么方便,为何物联网还要连卫星?智东西(公众号zhidxcom)编译杨畅编辑Panken智东西8月15日消息,据外媒IEEESpectrum报道,近日,德国弗劳恩霍夫协会集成电路研究所(FraunhoferIIS社区团购赛道上,巨头发力源头直采,打造供应链优势社区团购目前进入了长线运营阶段。随着补贴战落幕,社区团购玩家开始在冷链履约等环节上,进行全面升级。正因为巨头的加入,给赛道上的玩家带来了新的难题,有些玩家因此而倒闭,比如作为老三团驾驶行为更像人类?特斯拉发布FSDBeta9。2版本更新8月16日,特斯拉在美国时间周日发布了自动驾驶系统测试版FSDBeta9。2。与此同时,特斯拉CEO埃隆。马斯克(ElonMusk)还在推特上分享了更多关于FSDBeta9。2改进小姐姐心目中的自拍手机!vivoS10Pro轻薄又好看上个月,深受小姐姐们喜爱的vivoS系列迎来了迭代更新,全新的vivoS10系列正式亮相。作为一款轻薄自拍旗舰,vivoS10Pro以其出色的自拍表现轻薄的机身独特的配色方案强劲的vivoS10Pro上手体验好看不止一面,会变色的轻薄手机人们对于自拍手机的期望,无非就是能够把自己拍得比美颜APP更好看更不一样。而对于厂商来讲,除了自拍功能的展示,在基础硬件方面同样需要搭上如今定位升级的顺风车。如果你有心关注过手机行这一周数字人民币再迎重大进展拉卡拉增资PingPong投资方退出这一周为移动支付网打造的轻阅读栏目,关注移动支付行业一周热点,涵盖各大新技术创新及应用领域等。点击标题可直接阅读原文。多家中小银行组团接入数字人民币南京银行上海银行江苏银行杭州银行
小米11高端系列手机全球销量突破300万台IT之家5月21日消息今日小米公司宣布,小米1111Pro11Ultra三款高端手机全球销量突破300万台。此外,该系列手机在国内是40006000元价位段是销量最多的安卓手机。官为什么苹果手机的电池不耐用?苹果手机的电池一直是苹果手机最大的软肋,不少用户表示连新手机不怎么玩游戏都起码要一天一冲。那么苹果手机的电池为什么这么不耐用呢?归根结底是因为苹果手机的电池容量太小。最新的iPho直播又出假货事件?薇娅被质疑卖山寨商品,还甩锅电商平台小二文AI财经社张可心编辑杨洁直播行业又有头部主播又被卷入了假货风波,这次是薇娅。5月14日,微博注册用户Abestyle公开质疑当晚薇娅直播间售卖的SupremexGUZI联名挂脖小三大机构封杀虚拟货币,基本上盖棺定论了昨儿大夜里突然平地惊雷,中国人民银行联合中国互联网金融协会中国银行业协会中国支付清算协会发布重要内容,直接对比特币等虚拟币开启封杀模式。在之前的分享中,我们也多次探讨过比特币,我个炒币惨痛经历一觉醒来资产清零,马斯克真不是个好玩意昨天是个噩梦般的日子,比特币跌了,以太坊跌了,被马斯克力挺的狗狗币也大幅跳水,随着而落的还有我们这些炒币人的心,已经跌得粉碎了。我其实损失得不多,早就把本金提出来了。但是看到各种群iPhone12现在推荐入手吗简单点现在入手不如等6。18入手!用五年其实和iPhone12关系不大为啥这么说呢?咱们把入手时间和使用年限这两个问题展开讲讲吧一iPhone12的日常价位iPhone12(128iQOONeo5活力版预热3。5mm耳机孔,环绕式立体双扬IT之家5月21日消息iQOO手机官方今日为iQOONeo5活力版手机做预热,公布了该手机的新特性,新款手机将配有3。5mm耳机孔,还支持环绕式立体双扬声器。据IT之家了解,iQO新品种的新用法三星W215G使用手册人类科技的进步一直都是一个让人惊叹的话题。1973年4月9日的纽约曼哈顿街头,第一通手机电话被拨通,让路人驻足观望,标志着一个时代的开启。但那时的手机还只是个手持电话机,打电话是唯比特币又上热搜马斯克一句话,比特币便上蹿下跳。近日,善变的特斯拉CEO马斯克又聊虚拟币。这次他称比特币能耗疯狂,他出于对环境的考虑,突然拒绝使用这种加密货币作为支付手段。用一张图表示了比特币过去赵明6月份荣耀50首发骁龙778G芯片5月21日,2021高通技术与合作峰会正式拉开帷幕,荣耀终端CEO赵明受邀致辞。赵明提到,荣耀50系列将于6月发布,会搭载骁龙778G5G平台。赵明表示,荣耀独立以后,高通是首批合3000元的预算,你会选择哪部手机?2021年20003000价位的手机真的是神仙打架,在2020年的时候,搭载高通骁龙865的旗舰手机普遍价格都在3000以上,而今年搭载了骁龙870这样不亚于最新旗舰芯片的手机都直