展开

关键词

Linux语法详解

概念Linux内核从3.x始引入的概念,用于实现驱动代码与信息相分离。在出现以前,所有关于的具体信息都要写在驱动里,一旦外围变化,驱动代码就要重写。 引入了之后,驱动代码只负责处理驱动的逻辑,而关于的具体信息存放到文件中,这样,如果只是硬件接口信息的变化而没有驱动逻辑的变化,驱动发者只需要修改文件信息,不需要改写驱动代码。 随着linux kernel的发,在内核中将interrupt controller抽象成irqchip这个概念越来越流行,甚至GPIO controller也可以被看出一个interrupt controller 当然,通常我们关心的只是内核中的中断号,具体这个中断号是怎么找到相应的中断源的,我们作为程序员往往不需要关心,除了在写的时候,就是要描述嵌入式软件发中涉及的所有硬件信息,所以,就需要准确的描述硬件上处理中断的这种状结构 ARM专题 (上)Linux ARM专题 (下)

1.2K60

一文搞定 Linux

Linux 2.6中, ARM架构的板极硬件细节过多地被硬编码在archarmplat-xxx和archarmmach-xxx中,采用后,许多硬件的细节可以直接通过它传递给Linux,而不再需要在内核中进行大量的冗余编码 1. linux中DTS、 DTC和DTB的关系 (1) DTS:.dts文件是的源文件。 (3) DTB:.dtb文件是 .dts 被 DTC 编译后的二进制格式的文件,它可以被linux内核解析。2. DTS语法2.1 .dtsi 头文件 和 C 语言一样,也支持头文件,的头文件扩名为 .dtsi;同时也可以像C 语言一样包含 .h头文件;例如:(代码来源 linux-4.15archarmbootdtss3c2416 structure block是用于描述节点的结构,保存着节点的信息、节点的结构,它有5种标记类型:① FDTBEGINNODE (0x00000001):表示节点的始,它的后面紧跟的是节点的名字

18120
  • 广告
    关闭

    腾讯云前端性能优化大赛

    首屏耗时优化比拼,赢千元大奖

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux笔记(22)| 初探

    如果硬件资源发生了改变,我们只需要修改文件就行了,但是这样还不够好,如果有非常多的,就要写非常多的文件,这些文件非常庞大,导致Linux内核非常臃肿。于是,为了解决这个问题,引入了。 在Linux内核里有文件,路径是 源码目录archarmbootdtsimx6ull-seeed-npi.dts来看一下文件的格式: Devicetree node格式: node-name 前面我们已经说了,节点里包含了硬件的信息,所以我们写驱动的时候就需要从这些节点里去获取这些信息,内核提供了一组函数用于从节点获取资源(节点中定义的属性)的函数,这些函数以of_头, 第一步:打内核源码里的文件,这个文件在(以imx6ull为例)源码目录archarmbootdtsimx6ull-seeed-npi.dts然后根据上面讲过的规则往里面添加节点即可 第二步,编译编译内核时会自动编译 第四步,重启发板这时,我们就可以在procdevice-tree目录下看到我们添加的节点。以上就是我们今天的所有内容。

    14210

    Linux笔记(23)| “插件”

    今天和大家分享的依然是,上一节里主要是介绍了文件的基本格式、语法规则等,今天介绍一下如何使用,以及如何动态加载。 这样我们的文件就写好了,参照上一节的做法,我们修改完文件,然后进行编译,将生成的dtb文件替换发板原来的dtb文件,然后重启发板即可。 文件写好了,接下来就是写驱动文件了。 其实驱动文件和我们之前在Linux笔记(21)| platform总线驱动分析介绍的基本是一样的,唯一的不同就是资源获取方式不一样,之前是在文件中获取,现在是在文件上获取。 但是这样还不够好,因为每次修改文件,都要修改内核源码,然后编译、拷贝、重启发板。这样还是挺不方便的。尤其像内核源码,不应该随随便便去修改,这样子是不太安全的。 所以可以使用动态加载的方法。

    15510

    Linux (DTS)的深入理解

    关于的出现其实在 2005 年时候就已经在 PowerPC Linux 里出现了,由于 DTS 的方便性,慢慢地被广泛应用到 ARM、MIPS、X86 等架构上。 为了理解的出现的好处,先来看下在使用之前是采用什么方式的。 的文件结构和剖析之间到底是什么关系,有着哪些依赖和联系,先看下之间的关系图:? 文件的格式是 dts,包含的头文件格式是 dtsi,dts 文件是一种程序员可以看懂的格式,但是 Uboot 和 Linux 只能识别二进制文件,不能直接识别。 这里对做个总结,可以总结为三大作用:一是平台标识,所谓平台标识就是板级识别,让内核知道当前使用的是哪个发板,这里识别的方式是根据 root 节点下的 compatible 字段来匹配。

    16.1K53

    我眼中的Linux(四 中断)

    一般情况中断产生数量要多于中断控制器,多个中断产生的中断都由一个中断控制器处理,这种多对一的关系也很像一个形结构,所以在中,中断也被描述成,叫中断。 以下表述的时候为了明确是在说中断,在父节点和子节点前边我们都加上“中断”二字,是为了防止和的父节点、子节点混淆(虽然大部分情况的父子关系就是中断的父子关系,但是因为存在特例,所以我们还是强调是中断父子关系 因为他的中断父可能和的父不同,那么用interrupt-parent属性指向他的中断父。 根据中断的特性,一个中是有可能有多个中断的。 以上是中断在中如何描述的规则,听起来是挺复杂的,但只要理解了就很简单,为了帮助理解我们举一个实际的例子。为了突出中断部分,我们做了简化。 在pcie@1,0节点下边没有子节点,且也没有节点的interrupt-parent属性指向pcie@1,0节点,所以从上看不到该interrupt domain下的中断产生,可能的原因是这些中断产生软件可以动态识别所以不需要描述

    94870

    Linux解耦架构解读-V1.0

    由来linux内核源码中,之前充斥着大量的平台相关(platform Device)配置,而这些代码大多是杂乱且重复的,这使得ARM体系结构的代码维护者和内核维护者在发布一个新的版本的时候有大量的工作要做 需要说明的是,最初是由发固件(Open Firmware)使用的用来向客户程序(通常是一个操作系统)传递数据的通信方法中的一部分内容。 的作用是一个描述硬件的数据结构,甚至你可以将其看成一个大结构体(这个结构体就是平台,成员就是具体的),需要注意的是并不能解决所有的硬件配置问题(例如:机器识别),它只是提供一种语言 Linux使用的主要原因如下A:平台识别B:实时配置C:植入二、解耦目标目标一 vendor相关修改,完全独立出来,禁止在soc原生的dtsi中修改,只允许以dtbo的方式存在;目标二 同基线项目dtbo要共二进制三、解耦框架计?

    13820

    linux中led驱动()编程笔记

    include #include of_match_ptr ① 实例化platform_driver结构体probe成员② 实例化platform_driver结构体remove成员③ 选择一种方式匹配( #include #include (1)申请号#define DEV_MAJOR 500#define DEV_MINOR 0#define DEV_NUM 1#define DEV_NAME ledx dev_t devno; devno = MKDEV(DEV_MAJOR,DEV_MINOR); (2) 注册号ret = register_chrdev_region(devno,DEV_NUM n); return -1; } (2)创建节点#define NODE_LED led device_create(cls, NULL, devno, NULL, NODE_LED); (3)注销节点 device_destroy(cls, devno); (4)注销classclass_destroy(cls); 5. {…… leds { compatible = dt,led; pinctrl-names

    37010

    的interrupt

    interrupts一个计算机系统中大量都是通过中断请求CPU服务的,所以节点就需要在指定中断号。 因为该节点没有interrupt-parent属性,那么认为的父节点internal-regs就是中断父节点,在internal-regs父节点下还是没有interrupt-parent属性,那么还是继续找父节点 该属性引用的标签为gic,搜索整个,interrupt-controller@d000的标签为gic。gic节点下有interrupt-controller属性,说明他是一个中断控制器。 在pcie@1,0节点下边没有子节点,且也没有节点的interrupt-parent属性指向pcie@1,0节点,所以从上看不到该interrupt domain下的中断产生,可能的原因是这些中断产生软件可以动态识别所以不需要描述 以上例子中断的根是gic,gic下边有两个孩子,一个是中断timer@c600,一个是interrupt nexus节点pcie@1,0。

    73240

    linux驱动发中与相关的6种debug方法

    整理出了6种驱动发时与注册、相关的调试方法,彼此间没有优先级之分,每种方法不一定是最优解,但可以作为一种debug查找问题的手段,快速定位问题原因。 例如修改外时钟源、修改外时钟名、status属性等。为了使U-Boot支持fdt命令需要打CONFIG_OF_LIBFDT。? 通过fdt print查看测试驱动driver-test的信息,当查看某一个结点的信息时,需要使用绝对路径进行结点的索引。? driver-test的定义在源文件中dts如下图,dtb内的信息是完全的,实际上和dts中信息完全一致。clocks = 是dtc编译时对结点引用label重新插入的phandle值。? 修改status状态里status可以决定使能状态,status状态支持以下几种格式,若置了status为disable,那么是不可用的。若不置status,默认可用。?

    7810

    第二课:linux的规范(dts和dtb)

    可以是各种值的组合, 用逗号隔: compatible = “ns16550”, “ns8250”; example = , “a strange property format”; ##节点如何定义 可以把节点理解为目录,也就是同一目录下的子目录名称不能相同有哪些需要注意的事项比如2440文件必须要包含的 model = SMDK2440; compatible = samsung,smdk2440 保留内存的起始地址以及大小memreserve 0x33000000 0x10000这些配置属于runtime configuration 比如led就属于device population.第02节_DTB格式这节视频始讲解的 structure block、strings block;struct ftd_header:用来表明各个分部的偏移地址,整个文件的大小,版本号等;memory reservation block:在中使用 memreserve 定义的保留内存信息;structure block:保存节点的信息,节点的结构;strings block:保存属性的名字,单独作为字符串保存;使用命令make dts编译JZ2440的文件

    2.1K21

    第三课:linux内核对的处理

    前面我们从内核文档了解到,对于,它里面描述的信息可以分为这三部分: Linux uses DT data for three major purposes:platform identification ,我们要从源头分析,uboot将一些参数,文件传给内核,那么内核如何处理这些文件呢? 以前没有使用时,需要bootloader传一个machine id给内核,现在使用的话,这个参数就不需要置了。 r2要么是以前的ATAGS始地址,要么是现在使用后的DTB文件始地址。 (选择machine_desc)这节讲解内核对中平台信息是如何处理的。

    33610

    韦东山老师Linux学习笔记(一)

    最近一段时间可以说是又重操旧业了,回到过去的底层驱动发,当然过段时间还是会回到Linux应用发的。 所以现状基本上天天都在Linux内核以及Linux驱动打交道;当前很多驱动都是现成的,的适配工作成为驱动工程师的必技能之一,所以我们有必要来详细学习一下,以下是我学习韦东山老师的教程自己做的一些笔记 :1、为什么叫? 1.1、如何描述这棵?我们需要编写文件 (dts: device tree source) ,它需要编译为 dtb(device tree blob) 文件,内核使用的是 dtb 文件。 文件文件不需要我们从零写出来,内核支持了某款芯片比如 imx6ull ,在内核的 archarmbootdts 目录下就有了能用的模板,一般命名为 xxxx.dtsi 。

    15770

    如何自定义Jetson NANO 40-pin 扩

    Jetson Nano发套件的载体板包括一个40pin的扩头。 准工作:-Jetson Nano发套件。-运行Linux的计算机(Linux主机),推荐安装GCC工具链,用于构建L4T。有关详细信息,请参阅《L4T发指南》中的“L4T工具链”部分。 第四步:更新CBoot Pinmux通过Excel表格产生的文件,会被CBoot用来配置引脚复用。 而在此中的引脚复用配置,只被CBoot应用一次,而不会被后续(启动的)Linux Kernel再次应用。 因此如果想(让kernel)使用更新后的文件,你必须为Jetson Nano上的(Linux Kernel)重新编译DTB第五步:重刷NANO使用您的Linux主机将更新后的U-Boot引导加载程序和镜像

    2.3K41

    全志A64 里的gpio应用

    gpio控制器是由厂商负责驱动好的,在里关于gpio控制器的描述:pio: pinctrl@01c20800 { compatible = allwinner,sun50i-pinctrl; reg r_pio; gpio-controller; interrupt-controller; #interrupt-cells = ; #size-cells = ; #gpio-cells = ;关于置 GPIO的文档描述:其中“ #gpio-cells = ”表示在里描述使用一个gpio口需要提供6个指定的参数.通过文档,可以得知6个参数的分别作用:gpio = ; | | | | | | | 驱动里如何获取节点的gpio口信息呢? 里添加对这两个LED和蜂鸣器的描述:jkbuzzer { compatible = jk,buzzer; gpios = ; }; jkleds { compatible = jk,leds; gpios

    1.1K30

    一文带你搞懂

    掌握Linux 驱动发人员必的技能! (Device Tree),将这个词分就是“”和“”,描述的文件叫做 DTS(DeviceTree Source),这个 DTS 文件采用形结构描述板级,也就是发板上的信息 将这些描述板级硬件信息的内容都从 Linux 内中分离来,用一个专属的文件格式来描述,这个专属的文件就叫做,文件扩名为.dts。 1、.dtsi 头文件和 C 语言一样,也支持头文件,的头文件扩名为.dtsi。与此同时,.dts 文件也可以引用 C 语言中的.h 文件,甚至也可以引用.dts 文件。 Linux 内核给我们提供了一系列的函数来获取中的节点或者属性信息,这一系列的函数都有一个统一的前缀“of_”,所以在很多资料里面也被叫做 OF 函数。

    6830

    莓派折腾记:打造HiFi解码转盘(基于Volumio和Dac扩板)

    Windows下烧写镜像的文章有很多,如果你想在Linux下烧写镜像,可以参考这篇文章: Linux命令行烧录莓派镜像至SD卡 - 莓派实验室  稍稍告诉你,如果你有两张SD卡,并且其中的一张安装了 扩板下的插槽插入莓派的GPIO引脚后,就可以上电机了。 4.Dac置:  直插Dac扩板之后是不能直接播放声音的。还需要在播放选项中对Dac进行一番置。小苏的置图如下:?   5.SSH配置:  Volumio默认启了SSH服务,所以当你的莓派处在同一WIFI网络下时,可以通过SSH连接到莓派。 当你插入USB存储或者连接到NAS后,Volumio会自动挂载这些并在Browse界面 - 音乐库中显示出来。那么问题来了,本地音乐应该放到什么地方呢?

    4.4K20

    Linux机自动挂载外部

    在命令行中我们首先创建该目录,然后执行挂载:mkdir -p mntdatamount devsdb1 mntdata如果要卸载,执行:unmount devsdb1 mntdata那如何实现机自动挂载呢 我们编辑etcfstab文件vim + etcfstab然后添加如下内容devsdb1 mntimmoc ext3 defaults 0 0第一个是外部,第二个是挂载点,第三个是分区类型,第四个是defaults

    77930

    RISC-V64 opensbi启动过程

    riscv64 qemu上进行Linux环境搭建与发记录 2.环境准2.1 交叉编译工具链如果按照之前的文章下载的Linux版本的交叉编译工具链是不带有gdb工具,所以可以下载一个barertos版本的 2.注册系统内存这部分的内存大小由外部传递3.创建qemu也使用fdt创建了,该用于opensbi和uboot,这里的放在qemu分配的内存的尾部。 另外这个的参数会直接传递到opensbi进行解析和适配。同时uboot也会使用这个。 ,a2是大小,a3是0。 正好将这些信息利用起来了,然后从中解析qemu中定相关的信息。这样的好处是只要入口地址一致,就算地址不一样,也不用重新编译opensbi了。这就是有了的好处。

    2.1K30

    I2C总线架构 之 驱动

    引言I2C驱动是I2C框架中最接近应用层的,其上接应用层,下接I2C核心。也是驱动发人员需要实现的代码,在此驱动中我们只需负责以下步骤(以ap3216c为例):a. 添加硬件信息()b. 构建i2c_driver,并注册到linux i2c中d. 注册字符e. 向应用层提供i2c操作接口f. 注销i2c本篇文章会按照以上六个阶段解析。流程解析a. 添加硬件信息)首先观察硬件i2c挂载到哪个i2c总线上,然后在文件找到该总线的节点,在节点下创建子节点描述i2c硬件信息即可。 本篇以ap3216c光敏传感器代码为例,从入口到出口代码走向分析。通读文章大致了解,会发现本篇i2c驱动与虚拟总线platform架构类似。 参考:《Linux驱动发详解》《【正点原子】I.MX6U嵌入式Linux驱动发指南V1.4》https:blog.csdn.netEgeanarticledetails81085077

    30670

    相关产品

    • 云服务器

      云服务器

      腾讯云服务器(CVM)为您提供安全可靠的弹性云计算服务。只需几分钟,您就可以在云端获取和启用云服务器,并实时扩展或缩减云计算资源。云服务器 支持按实际使用的资源计费,可以为您节约计算成本。

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭

      扫码关注云+社区

      领取腾讯云代金券