设备树
奔跑的小刺猬
欲速则不达
展开
-
设备树学习(二、设备树dts/dtsi格式)
说明:后续的博文参考自韦东山老师的设备树视屏,老师用的是2440的开发板,我用的是s5pv210的开发板。原理一样一、前言简单的说,如果要使用Device Tree,首先用户要了解自己的硬件配置和系统运行参数,并把这些信息组织成Device Tree source file。通过DTC(Device Tree Compiler),可以将这些适合人类阅读的Device Tree sou...原创 2019-02-14 22:17:00 · 23799 阅读 · 5 评论 -
设备树学习(十五、番外篇-中断子系统之IRQ Domain介绍)
之前的文章分析过没使用设备树时,中断是如何初始化的https://blog.csdn.net/qq_16777851/article/details/82556519用一句话总结就是,启动过程,通过mach_id找到,machine_desc,之后调用machine_desc->init_irq函数来实现,中断的初始化。这种方式,因为所有的中断都是在代码中写死的,不易修改。 ...原创 2019-02-26 08:02:39 · 4643 阅读 · 1 评论 -
设备树学习(十九、番外篇-中断子系统之中断号的映射与反映射[一])
映射值的是通过某一个中断控制器的domain里的某一个物理号,来获取一个全局中断描述符表中的一个全局的中断号。反映射时通过一个全局的中断号,来获取到domain,进而通过domain来找到在一个中断控制器的domain里的某一个物理号。本文先分析反映射,下一篇再分析映射。接着上一篇,有两个函数还没分析。第一个是通过这个中断控制器的domain,为一个在doma...原创 2019-03-01 20:41:08 · 1603 阅读 · 0 评论 -
设备树学习(二十、番外篇-中断子系统之中断号的映射与反映射[二])
上一篇我们留了一个坑,说是通过下面这个函数获取一个中断描述符以及对应的虚拟中断号。本节就分析一下怎样获取。在这个开始之前我们先要说的是,因为中断目前分为两种分配方式,一种是通过一次性定义一个全局数组,每个virq是数组的一项的下标。另一种是内核配置了CONFIG_SPARSE_IRQ,采用动态方式分配每一个中断描述符,这样可以避免某些中断号不使用,而浪费内存空间。...原创 2019-03-01 22:29:18 · 1057 阅读 · 0 评论 -
设备树学习(七、dtb到设备节点的转换)
首先我们看一下内核中对一个设备节点的表示struct device_node { const char *name; //节点的名字 const char *type; //device_type属性的值 phandle phandle; //对应该节点的phandle...原创 2019-02-21 00:09:20 · 4844 阅读 · 3 评论 -
设备树学习(二十一、番外篇-中断子系统之简单举例使用)
这里以一个按键程序为例进行简单说明首先是驱动程序,基本和之前3.16.57版本的一样的,唯一不同就是增加了of_match_table 的一个和设备树节点的匹配表而已#include <linux/fs.h> #include <linux/init.h> #include <linux/module.h>#include <linux...原创 2019-03-02 21:32:52 · 727 阅读 · 0 评论 -
设备树学习(二十四、番外篇-中断子系统之tasklet)
本文继续参考蜗窝大神的博客,使用4.19的内核进行分析,同时加入一些自己的理解和举例。http://www.wowotech.net/irq_subsystem/tasklet.html一、前言对于中断处理而言,linux将其分成了两个部分,一个叫做中断handler(top half),属于不那么紧急需要处理的事情被推迟执行,我们称之deferable task,或者叫做...原创 2019-03-05 23:39:30 · 890 阅读 · 0 评论 -
设备树学习(十六、番外篇-中断子系统之IRQ number和中断描述符)
本片继续参考蜗窝大神的文章,且用4.19版本的内核进行透彻的分析。http://www.wowotech.net/sort/irq_subsystem一、前言本文主要围绕IRQ number和中断描述符(interrupt descriptor)这两个概念描述通用中断处理过程。第二章主要描述基本概念,包括什么是IRQ number,什么是中断描述符等。第三章描述中断描述符数据结构...原创 2019-02-27 00:08:25 · 1793 阅读 · 0 评论 -
设备树学习(二十二、番外篇-中断子系统之驱动申请API)
本文继续参照蜗窝大神的文档,采用4.19内核的代码学习,同时会有自己的一些举例和部分代码分析http://www.wowotech.net/sort/irq_subsystem一、前言本文主要的议题是作为一个普通的驱动工程师,在撰写自己负责的驱动的时候,如何向Linux Kernel中的中断子系统注册中断处理函数?为了理解注册中断的接口,必须了解一些中断线程化(threaded ...原创 2019-03-03 18:40:54 · 1100 阅读 · 0 评论 -
设备树学习(二十七、番外篇-中断子系统之workqueue创建[3])
一、前言前一节我们知道了可以用下面几个函数来创建workqueue。#define alloc_ordered_workqueue(fmt, flags, args...) \ alloc_workqueue(fmt, WQ_UNBOUND | __WQ_ORDERED | \ __WQ_ORDERED_EXPLICIT | (flags), 1, ##args)#de...原创 2019-03-13 23:58:22 · 1504 阅读 · 0 评论 -
设备树学习(二十八、番外篇-中断子系统之workqueue处理work[4])
本文参考了下面两位博主的文章,采用4.18版本的内核分析。http://www.wowotech.net/sort/irq_subsystemhttps://blog.csdn.net/chenying126/article/details/78786406一、前言本文主要讲述下面两部分的内容:1、将work挂入workqueue的处理过程2、如何处理挂入workqu...原创 2019-03-15 00:32:33 · 2377 阅读 · 1 评论 -
设备树学习(二十五、番外篇-中断子系统之workqueue[1])
本文参考蜗窝大神的中断系列教程http://www.wowotech.net/irq_subsystem/workqueue.html一、前言在许多情况下,需要异步流程执行上下文,而workqueue(wq)API是此类情况最常用的机制。当需要这样的异步执行上下文时,描述要执行哪个函数的工作项放在队列中。 独立线程用作异步执行上下文。 该队列称为workqueue,该线程称为work...原创 2019-03-11 19:57:05 · 724 阅读 · 0 评论 -
设备树学习(二十六、番外篇-中断子系统之CMWQ概述[2])
一、前言一种新的机制出现的原因往往是为了解决实际的问题,虽然linux kernel中已经提供了workqueue的机制,那么为何还要引入CMWQ(Concurrency Managed Workqueue)呢?也就是说:旧的workqueue机制存在什么样的问题?在新的cmwq又是如何解决这些问题的呢?它接口是如何呈现的呢(驱动工程师最关心这个了)?如何兼容旧的驱动呢?本文希望可以解开这些谜...原创 2019-03-12 00:12:40 · 488 阅读 · 1 评论 -
设备树学习(二十九、番外篇-中断子系统之workqueue使用)
workqueue使用举例#include <linux/fs.h> #include <linux/init.h> #include <linux/module.h>#include <linux/gpio.h>#include <asm/irq.h>#include <asm/io.h>#...原创 2019-03-16 21:42:28 · 1197 阅读 · 0 评论 -
设备树学习(二十三、番外篇-中断子系统之softirq)
既然开始学了,那么还是一次把中断的所有知识都系统的学一下。刚好有蜗窝大神的博客做指引。http://www.wowotech.net/irq_subsystem/soft-irq.html一、前言对于中断处理而言,linux将其分成了两个部分,一个叫做中断handler(top half),是全程关闭中断的,另外一部分是deferable task(bottom half),属于...原创 2019-03-05 00:04:35 · 689 阅读 · 0 评论 -
设备树学习(六、设备树对运行时配置信息的处理)
上一节学习了在linux启动期间如何找到的最佳匹配的单板machine_desc;‘asmlinkage __visible void __init start_kernel(void) setup_arch(&command_line); mdesc = setup_machine_fdt(__atags_pointer);在setup_machine_...原创 2019-02-19 22:48:43 · 1868 阅读 · 0 评论 -
设备树学习(三、设备树dtb格式和结构)
上一节我们学习了dts文件的格式,dts文件是方便我们书写和读写的格式。本节我们来学习一下经过Device Tree Compiler编译,Device Tree source file变成了Device Tree Blob(又称作flattened device tree)的格式。 首先先给出dtb文件的格式一个dtb文件分为4个段,分别是ftd_header,memory re...原创 2019-02-15 22:21:45 · 5652 阅读 · 0 评论 -
设备树学习(四、内核head.S对uboot传参的处理)
之前在uboot学习中分析bootm原理的,我们知道了uboot启动内核是通过传入三个参数来启动的。kernel_entry为内核zImage在内存的首地址。之前我们传的三个参数分别是:0,芯片的机器ID,uboot给内核参数tag在内存的首地址r2。 查看上面截图的代码,可以看到r2也可以是另设备树文件(dtb)在在内存的地址。 对于使用tag传参给内核,机器的I...原创 2019-02-17 20:49:13 · 4263 阅读 · 2 评论 -
设备树学习(八、设备节点到平台设备的转换)
一、那些节点可以转换成平台设备?首先,要说明的是设备树最初是为了解决大量重复的platform_device在mach-xx目录下,但在实现的过程重,设备树体现的是一个电路板的信息,添加了bootargs,memory,clock,interrupt等非platform_device的节点,这样就不能对所有的device_node转换成platform_device。(memory,int...原创 2019-02-22 21:38:10 · 5191 阅读 · 2 评论 -
设备树学习(九、platform_device和platform_driver如何让匹配)
关于这个问题,我之前在分析2.6内核的时候是已经分析过的。https://blog.csdn.net/qq_16777851/article/details/81350037 同时在总线驱动模型章节也是从基础知识学习,到最终实现过一个简单的bus的,想要深入学习,最好看下面这个专栏。(基于4.x内核)https://blog.csdn.net/qq_16777851/colu...原创 2019-02-23 00:12:34 · 3897 阅读 · 3 评论 -
设备树学习(十、在根文件系统中查看设备树)
在设备树第七节中,我们知道了在内核启动时,是把dtb文件所在的内存块保留了下来。而这个内存块是可以在内核中查看的。查看的位置在sys文件系统中。因为dtb文件是二进制文件,所以要用hexdump命令来查看。 hexdump -C /sys/firmware/fdt 部分信息如下,和我们传给内核的dtb文件里的完全一样 当然在/sys/firmware/文件...原创 2019-02-23 12:54:34 · 8603 阅读 · 1 评论 -
设备树学习(十一、内核中设备树的操作函数)
内核中开放出来的接口函数的声明大多在include/linux/下面,关于设备树的都是以ofxxx.h形式命名 这里介绍一下各个头文件中是关于那些的函数of_fdt.h // dtb文件的相关操作函数, 我们一般用不到, 因为dtb文件在内核中已经被转换为device_node树(它更易于使用)b. 处理device_nodeof.h ...原创 2019-02-23 13:42:27 · 2558 阅读 · 0 评论 -
设备树学习(十二、uboot如何给内核传dtb文件)
在通过tag给内核传参时,是只需要知道内核的地址就可以了。因为uboot给内核传的参数一般是放到内存的某个地址,因为tag所占的内存比较小,所以一般都时放在内存的起始地址+0x100的位置之后直接使用,bootm + 内核所在内存的地址bootm <uImage_addr>在使用了设备树之后,一般我们是这样启动的bootm <uImage_addr>...原创 2019-02-23 14:52:06 · 7240 阅读 · 1 评论 -
设备树学习(十七、番外篇-中断子系统之内核对中断控制器的解析)
一、介绍关于中断的初始化我们从start_kernel函数开始head_common.S b start_kernel(void); .... local_irq_disable(); /* 关中断 */ .... setup_arch(&command_line); pagi...原创 2019-02-27 23:52:07 · 1221 阅读 · 0 评论 -
设备树学习(十八、番外篇-中断子系统之初始化一个中断控制器)
一、前言上一篇写到,使用设备树的情况下,对所有的中断控制器进行了检索,提取到一个链表中。并对这些中断控制器中所谓的父中断控制器进行检索,并按照等级一次初始化。本文就以一种常见的中断控制器VIC的初始化为例,进行分析。void __init of_irq_init(const struct of_device_id *matches){ ...... ret = des...原创 2019-02-28 08:15:39 · 1172 阅读 · 0 评论 -
设备树学习(五、设备树对平台信息的处理machine_desc)
1. 简介内核提供了一个重要的结构体struct machine_desc ,这个结构体在内核移植中起到相当重要的作用,内核通过machine_desc结构体来控制系统体系架构相关部分的初始化。machine_desc结构体的成员包含了体系架构相关部分的几个最重要的初始化函数。同时一个内核可以支持多块单本,所以一个zImage里可以包含多个machine_desc结构体。他们通常被组织成一个特...原创 2019-02-18 23:43:59 · 2727 阅读 · 0 评论 -
设备树学习(十三、有了设备树后新内核对于设备处理的不同之处)
有了设备树之后,内核对设备的处理蜗窝大神也就在它的设备树引入中说了。http://www.wowotech.net/device_model/why-dt.html 这里我把主要的几句话复制总结出来:针对重复的代码问题,如果不同的SOC使用了相同的IP block(例如I2C controller),那么这个driver的code要从各个arch/arm/mach-xxx中独立出来...原创 2019-02-24 15:53:32 · 1307 阅读 · 0 评论 -
设备树学习(十四、引入设备树对中断的影响)
在老的内核中断是在完全由所谓的板级支持包中指定的,同时相关的寄存器地址这些也都是在代码中写死的。这种代码没法在多个SOC上通用,这个就导致大量的重复代码出现。在2.6.35.7内核中,SMDKV210单板是这样描述的MACHINE_START(SMDKV210, "SMDKV210") /* Maintainer: Kukjin Kim <kgene.kim@samsung....原创 2019-02-24 19:09:10 · 1430 阅读 · 0 评论 -
设备树学习(一、设备树基础)
1、设备树的引入Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称“this whole ARM thing is a fucking pain in the ass”,ARM Linux社区对此作出了回应,引入设备树。ARM Device Tree起源于OpenFirmware (OF),在过去的Linux中,arch/arm/plat-xxx和arch/...原创 2019-02-13 20:48:56 · 24471 阅读 · 0 评论 -
设备树学习(二十三、aliases节点分析)
在设备树中有一个叫做aliases的节点:/ { #address-cells = <1>; #size-cells = <1>; aliases { csis0 = &csis0; fimc0 = &fimc0; fimc1 = &fimc1; fimc2 = &fimc2; i2c0 = &i...原创 2019-04-01 23:00:02 · 7085 阅读 · 0 评论