Linux设备树


本文章基于韦东山关于设备树的课程以及自己的一些想法,目录结构和韦东山老师的视频结构相同。

1、设备树的引进与体验

字符设备驱动程序的三种写法

以LED驱动为例子。
方法1: 直接填充file_operrations,比如在write函数中写死将某个阴极点亮,这样一换设备,就得改代码换阴极。优点是简单,缺点是不易扩展
方法2: 基于总线设备驱动模型,分离设备和驱动。在probe函数里分配注册file_operrations,相当于将方法一的大部分操作挪到probe中,但是里面具体硬件得操作都是操作平台设备指定的资源,不会写死操作某个引脚。
优点:只需要device文件,不需要改变driver文件,易于扩展。
缺点:有一个设备就得创建一个device文件,这些device文件中有很多重复代码,并且这些是以.c文件出现的,每换一个设备,都需要重新编译。其实总线设备驱动模型主要的缺点就是这些硬件文件是C文件,每次都需要重新编译驱动。
感悟: 对于LED这种没有子系统的,总线设备驱动模型就挺好用的,总感觉总线设备驱动模型和子系统有些功能上的重复。
方法3: 使用设备树。设备树方法同样使用总线设备驱动模型的driver部分,只改变device部分。设备树使用.dts文件(device tree source)来指定硬件资源,内核运行时会解析dts文件,自动分配、设置、注册对应的device文件(基于某个总线,比如platform_device)。dts文件最终会被编译为dtb文件,启动单板时,既要启动内核,也要传入dtb文件。需要更改代码时,不需要重新编译驱动,只需要给内核提供一个不一样的dtb文件就行。
优点:更易扩展,无重复代码,不需要重新编译内核或者驱动,只需要提供不一样的设备树文件即可。
为什么叫设备树: 整个单板,从CPU开始,由各级的硬件组成,我们用设备树文件来抽象描述整个单板所有的硬件资源。

使用设备树时对应的驱动编程

driver那边基本不变,原本的device现在变成在dts文件中构建资源节点,dts文件代表了整个单板的硬件资源,每个单独的设备只是其中一个资源节点。
dts文件编译成dtb文件传入内核,内核解析dtb文件,得到代表每一个单独设备的device_node结构体,device_node结构体会具体变为各种总线的结构体,比如platform_device,到这里就和总线设备模型一样了。

dts文件是我们自己编写的,按照一定语法和规则,然后上传到虚拟机内核的某个目录下,编译dts文件(make dtbs,估计这里需要对Makefile做一些改变),得到dtb文件,将该dtb文件烧写到单板nand对应的device_tree分区(这里对nand的分区应该做了调整,内核必须知道从那里去获取dtb文件),重启开发板(重启不等于重新编译,重新编译很费事),这样内核启动过程中会自动解析dtb文件,形成设备树(关于内核具体去哪里解析dtb文件,不太清楚)。

从设备树得到的设备文件和驱动文件的匹配不再是简单的依靠名字,匹配的函数仍然是match函数,只是里面内容有改变(2.6内核不行了,得高版本的内核)。

最先的基于设备树的驱动运行: 编译driver的c文件为ko文件,写dts,编译,传给内核,启动内核(此时已经有设备文件,还没有驱动文件,系统不会创建dev设备节点),insmod驱动文件,此时ls /dev可以看到设备节点,此时可以运行驱动了。
更改设备树文件后驱动的运行: 改dts文件,编译,传给内核,启动内核,insmod,就可以了。

只想使用设备树不想深入研究怎么办

没啥用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
设备树(Device Tree)是一种描述嵌入式系统硬件设备的文件格式,用于在Linux内核动态配置和管理硬件。设备树采用树形结构,描述了开发板上的各种设备信息,比如CPU数量、内存基地址、接口上连接的设备等。设备树文件的扩展名为.dts,编译后得到.dtb文件。在引导Linux内核时,Bootloader会将.dtb文件的地址传递给内核,内核会根据设备树文件描述的信息创建和注册相关设备。通过设备树开发者可以在不修改内核源代码的情况下配置和管理硬件设备。在编译Linux源码时,可以使用"make dtbs"命令来单独编译设备树文件,而不是编译整个源码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Linux 设备树](https://blog.csdn.net/m0_69211839/article/details/130601344)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [linux设备树](https://blog.csdn.net/qq_27094347/article/details/121012569)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值