Linux设备树

2023-05-16

Linux设备树

  • 1、设备树的引进与体验
    • 字符设备驱动程序的三种写法
    • 使用设备树时对应的驱动编程
    • 只想使用设备树不想深入研究怎么办

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

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,就可以了。

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

没啥用

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux设备树 的相关文章

  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • Fedora dnf 更新不起作用?

    当我尝试使用 update 命令更新 Fedora 22 时 sudo dnf update 我收到以下错误 错误 无法同步存储库 更新 的缓存 无法准备内部镜像列表 Curl 错误 6 无法解析主机名 无法解析主机 mirrors fed
  • 为什么我的 Dockerfile CMD 不起作用?

    所以在我的 Dockerfile 的末尾我有这样的内容 WORKDIR home CMD django admin startproject whattt CMD bin bash 当我创建映像然后运行容器时 一切都按预期运行 没有错误 D
  • 使用 posix_spawn 启动进程

    我正在使用以下代码在 Linux 中启动新进程 pid t processID char argV 192 168 1 40 char 0 int status 1 status posix spawn processID home use
  • C:如果文件描述符被删除,阻塞读取应该返回

    我正在以阻塞的方式从设备 文件描述符中读取 可能会发生这样的情况 在不同的线程中 设备被关闭并且文件描述符被删除 不幸的是 读取没有返回或注意到并且一直阻塞 作为一种解决方法 我可以使用 select 作为超时来执行 while 循环 如果
  • PyPI 上的轮子平台约束有什么限制吗?

    是否有任何地方 PEP 或其他地方 声明关于 Linux 轮子上传范围的限制 PyPI http pypi io 应该有 具体来说 上传是否被认为是可接受的做法linux x86 64轮子到 PyPI 而不是manylinux1 x86 6
  • 码头无故停止

    我需要经验丰富的码头用户的建议 我在负载均衡器 亚马逊云 后面维护着 2 台 Linux 机器 使用 Jetty 9 0 3 有时我的 Jetty 容器会被 Thread 2 无故关闭 同时地 显示以下日志并且容器无故停止 没有错误 没有例
  • 找出 Linux 上的默认语言

    有没有办法从C语言中找出Linux系统的默认语言 有 POSIX API 可以实现这个功能吗 例如 我想要一个人类可读格式的字符串 即德语系统上的 German 或 Deutsch 法语系统上的 French 或 Francais 等 有类
  • 从 Python 访问 802.11 无线管理帧

    我想从 Linux 上的 Python 嗅探 802 11 管理 探测请求 帧 这可以从 Scapy 中实现 如下所示 coding utf 8 from scapy all import def proc p if p haslayer
  • 从 php/linux 获取 pdf 的布局模式(横向或纵向)

    给定一个 PDF 如何使用 PHP lib 或 Linux 命令行工具获取 PDF 的布局模式 或相对宽度 高度 Using http www tecnick com public code cp dpage php aiocp dp tc
  • 使用 gcc 理解共享库

    我试图理解 C 中共享库的以下行为 机器一 cat one c include
  • 无需 root 访问权限即可安装 zsh? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有可能 以及如何 我确实需要在几台具有 ssh 访问权限 但没有 root 访问权限 的远程计算机上使用此功能 下载 zsh wget O zsh t
  • 将node.js +expressjs应用程序的NODE_ENV设置为ubuntu下的守护进程

    我按照这些说明让守护进程正常工作 http kevin vanzonneveld net techblog article run nodejs as a service on ubuntu karmic http kevin vanzon
  • 用于读取文件的 Bash 脚本

    不知道为什么最后一行没有从脚本中删除 bin bash FILENAME 1 while read line do cut d f2 echo line done lt FILENAME cat file 1 test 2 test 3 t
  • SMP 上如何处理中断?

    SMP 对称多处理器 多核 机器上如何处理中断 内存管理单元是只有一个还是多个 假设两个线程 A 和 B 运行在不同的内核上 同时 访问页表中不存在的内存页面 在这种情况下 将会出现页面错误 并从内存中引入新页面 将会发生的事件的顺序是什么
  • 如何列出 nginx 中的所有虚拟主机

    有没有一个命令可以列出 CentOS 上 nginx 下运行的所有虚拟主机或服务器 我想将结果通过管道传输到文本文件以用于报告目的 我正在寻找与我用于 Apache 的命令类似的命令 apachectl S 2 gt 1 grep 端口 8
  • 如何在perl中使用O_ASYNC和fcntl?

    我想使用 O ASYNC 选项 当管道可以读取时 SIGIO 的处理程序将运行 但以下代码不起作用 任何人都可以帮助我吗 bin env perl use Fcntl SIG IO sub print catch SIGIO n my fl
  • Bash - 比较 2 个文件列表及其 md5 校验和

    我有 2 个列表 其中包含带有 md5sum 检查的文件 即使文件相同 列表也具有不同的路径 我想检查每个文件的 md5 和 我们正在讨论数千个文件 这就是为什么我需要脚本来仅显示差异 第一个列表是普通列表 第二个列表是文件的当前状态 我想
  • 如何在linux中使用iptables将http和https流量转发到透明代理[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • 为什么 call_usermodehelper 大多数时候都会失败?

    从内核模块中 我尝试使用 call usermodehelper 函数来执行可执行文件 sha1 该可执行文件将文件作为参数并将文件的 SHA1 哈希和写入另一个文件 名为输出 可执行文件完美运行 int result 1 name hom

随机推荐

  • 80c51流水灯程序汇编语言,单片机闪烁灯流水灯汇编代码大全

    1 单片机AT89C51的P2口接8个发光二极管 xff0c 让这8个发光二极管显示闪烁功能 xff0c 即八灯亮2S xff0c 熄灭3S xff0c 如此循环 参考程序 xff1a ORG 0000H start MOV P1 0H C
  • xp系统登录不上ftp服务器,在XP中顺利登录FTP服务器

    董师傅教你 xff1a 通过系统设置解决在IE7 0中直接输入FTP地址无法登录服务器问题 最近 xff0c 笔者新装了Windows XP系统 xff0c 系统自带的IE版本为7 0 在IE地址栏中输入内网FTP地址 xff0c 如ftp
  • linux内核模块签名,如何签名内核模块Ubuntu 18.04

    问题描述 我是使用Ubuntu的新手 我正在尝试安装Genymotion xff0c 以便可以访问Android模拟器 为了使用Genymotion xff0c 需要我有VirtualBox 我已经安装了VirtualBox xff0c 但
  • 常用的几种API获取ip地理位置的使用方法

    最近公司让做一个用户登录 付费的时候记录操作人的地理位置 搜了很多帖子 xff0c 一开始用的淘宝的api xff0c 但是用了一段时间发现 xff0c 这个api当获取的次数多了之后 xff0c 就报404了 xff0c 导致很多记录没有
  • java部分匹配字符串_关于字符串:在Java中匹配子字符串

    我有一个输入数据存储在arraylist中 在遍历列表时 xff0c 输出是 Input 0 Overcast 1 High 2 Normal 3 Weak Input 0 Rainy 1 Mild 2 High 3 Strong Inpu
  • Ubuntu20.04LTS环境docker+cephadm方式部署Ceph 17.2.5

    Ubuntu20 04LTS环境docker 43 cephadm方式部署Ceph 17 2 5 1 前言2 环境准备2 1 主机信息2 2 NTP时间同步2 3 关闭 iptable 和 firewalld2 4 关闭 SElinux2
  • java如何解析xml?

    技术点 xff1a getResourceAsStream方法 xff0c dom4j的SaxReader解析xml 例 xff1a 1 加载磁盘xml文件到内存中 InputStream package com example utils
  • python识别数字论文_Python3使用tesserocr识别字母数字验证码的实现

    一 背景 最近有个需求是从一个后台的留言网站爬取留言数据 xff0c 后台管理网站必然涉及到了登录 xff0c 登录就有个验证码的问题必须得解决 xff0c 由于验证码是从后端生成的 xff0c 并且不了解其生成规则 xff0c 那就只能通
  • 用jsonserve和axios做交互_vue中axios对json-server提供的多层json数据如何增删改?

    问题描述 使用json server将json变成一个服务 xff0c 可以根据后缀不同获取到不同的数据 xff0c 而axios可以对数据进行操作 xff01 xff01 xff01 xff01 xff01 xff01 xff01 xff
  • Linux下redis基本安装配置(CentOS7)

    1 下载 http redis io download 2 上传安装包 3 开始安装 rpm ivh jemalloc 3 6 0 1 el7 x86 64 rpm rpm ivh redis 4 0 8 1 el7 remi x86 64
  • 更新计算机策略命令,组策略更新命令

    对于Windows 2000域来说 xff0c 如果你想让新修改的计算机策略立即生效的话 xff0c 可以依次单击 开始 运行 命令 xff0c 打开系统运行对话框 xff0c 并在其中输入字符串命令 cmd xff0c 单击 确定 按钮后
  • 嵌入式安卓项目笔记

    前言 xff1a 时间2021年7月电子科大人文交流月课程 嵌入式安卓系统开发 的大作业 项目描述 基于VM虚拟机Ubuntu 18 04 参考老师所给的suspendmonitor例程 xff0c 实现USB插拔监控驱动 43 APP用户
  • (一)DSP28335

    前言 xff1a 用于记录一些在学习实验室48V无人机项目所用的DSP28335时的一些心得体会 xff0c 主要参考资料是普中科技的那个资料手册 1 通信相关 区分开串口通信与串行通信 xff0c 串口通信 xff08 Serial Co
  • arm中的程序计数器PC

    在cpu中 xff0c 一条指令的执行简单的划分为 xff1a 取指 译码 执行 xff0c 三个部分 pc中存放的是下一条将要 执行 的指令的地址 xff0c 这里的执行并不是取指 译码 执行中的第三个步骤 xff0c 而是指的将存放于内
  • 韦东山第一期课程内容概要

    韦东山第一期课程内容概要 1一个嵌入式程序要运行所需的东西1 1第一条指令 b reset1 2 reset要完成的事件1 2 1设置开门狗1 2 2设置时钟1 2 3判断启动方式并设置堆栈1 2 4代码重定位 1 3执行main函数 12
  • 韦东山第一二期衔接课程内容概要

    韦东山第一二期衔接课程内容概要 0 使得一个裸板Jz2440能运行linux应用程序的过程1 uboot启动内核总结1 1 u boot分析之编译体验1 2 u boot分析之Makefile结构分析1 3 u boot分析之源码第一阶段1
  • 嵌入式总线与通信

    嵌入式总线与通信 I2C通信I2C通信的特点I2C通信协议I2C硬件连接I2C在一条数据线SDA上如何实现双向传输 xff1f xff08 如何实现半双工 xff09 SOC上的I2C通用硬件接口I2C接口与接口之间的连接I2C设备在整个A
  • jquery为动态dom元素绑定点击事件(比如动态生成的表格)

    js为动态dom元素绑定点击事件 需要给页面动态加载还未出现的元素添加事件时 xff0c 可以用jQuery的on xff0c live xff0c delegate来绑定事件 叫做委派事件 比如控制的动态生成的表格 xff0c 给一列中的
  • 嵌入式Arm+Linux中断与异常全流程讲解

    嵌入式ARM 43 Linux中断全流程讲解 ARM处理器级别的中断 异常 ARM的异常类型CPU如何检测到异常信息 进入异常处理后怎么返回前置知识 xff1a 流水线 xff0c 指令周期 xff0c 机器周期 xff0c 时钟周期复位
  • Linux设备树

    Linux设备树 1 设备树的引进与体验字符设备驱动程序的三种写法使用设备树时对应的驱动编程只想使用设备树不想深入研究怎么办 本文章基于韦东山关于设备树的课程以及自己的一些想法 xff0c 目录结构和韦东山老师的视频结构相同 1 设备树的引