设备树知识小全(七):地址编码

简介: 设备树知识小全(七):地址编码

其实这个部分我在前面第四篇笔记中,介绍了这个,这里再展开这个讲讲。

参考资料:《Linux设备驱动开发详解》

1、地址编码

可寻址的设备使用如下信息在设备树中编码地址信息:

reg
    #address-cells
    #size-cells

其中,reg的组织形式为

reg=<address1length1[address2length2][address3length3]...>

其中的每一组address length表明了设备使用的一个地址范围。

address为1个或多个32位的整型(即cell),而length的意义则意味着从address到address+length–1的地址范围都属于该节点。若#size-cells=0,则length字段为空。

address和length字段是可变长的,父节点的#address-cells和#size-cells分别决定了子节点reg属性的address和length字段的长度。

在代码清单18.2中,根节点的#address-cells=<1>;和#size-cells=<1>;决定了serial、gpio、spi等节点的address和length字段的长度分别为1

cpus节点的#address-cells=<1>;和#size-cells=<0>;决定了两个cpu子节点的address为1,而length为空,于是形成了两个cpu的reg=<0>;和reg=<1>;。

external-bus节点的#address-cells=<2>和#size-cells=<1>;

决定了其下的ethernet、i2c、flash的reg字段形如reg=<0 00 x1000>;、reg=<1 00 x1000>;和reg=<2 00 x4000000>;。

其中,address字段长度为2,开始的第一个cell(即“<”后的0、1、2)是对应的片选,第2个cell(即<000x1000>、<100x1000>和<200x1000000>中间的0,0,0)是相对该片选的基地址,第3个cell(即“>”前的0x1000、0x1000、0x1000000)为length。

特别要留意的是i2c节点中定义的#address-cells=<1>;和#size-cells=<0>;,其作用到了I2C总线上连接的RTC,它的address字段为0x58,是RTC设备的I2C地址。(这个意思就是你就在这里,哪里都不需要去)

根节点的直接子书点描述的是CPU的视图,因此根子节点的address区域就直接位于CPU的内存区域

但是,经过总线桥后的address往往需要经过转换才能对应CPU的内存映射

2、ranges

external-bus的ranges属性定义了经过external-bus桥后的地址范围如何映射到CPU的内存区域**。**

(设备的内存管理)

ranges是地址转换表,其中的每个项目是一个子地址、父地址以及在子地址空间的大小的映射。

映射表中的子地址、父地址分别采用子地址空间的#address-cells父地址空间的#address-cells大小。对于本例而言,子地址空间的#address-cells为2,父地址空间的#address-cells值为1,因此0 0 0x10100000 0x10000的

前2个cell为external-bus桥后external-bus上片选0偏移0,(子地址)

第3个cell表示external-bus上片选0偏移0的地址空间被映射到CPU的本地总线的0x10100000位置, (父地址)

第4个cell表示映射的大小为0x10000。 ranges后面两个项目的含义可以类推。(长度length)

ranges = <0 0  0x10100000   0x10000     // Chipselect 1, Ethernet
                  1 0  0x10160000   0x10000     // Chipselect 2, i2c controller
                  2 0  0x30000000   0x1000000>; // Chipselect 3, NOR Flash

慢慢看多了就理解了,我这么菜,感觉有时候也很晕乎乎。

目录
相关文章
|
编解码 Linux
Linux MIPI DSI驱动调试笔记-设备树DCS格式序列之配置LCD初始化代码(二)
Linux MIPI DSI驱动调试笔记-设备树DCS格式序列之配置LCD初始化代码(二)
1536 0
|
存储
设备树dtb文件的格式分析
设备树dtb文件的格式分析
280 0
|
2月前
|
芯片
如何根据设备文档和开发板标识来确定 GPIO 引脚的编号
要确定GPIO引脚编号,首先查阅设备的官方文档,了解引脚布局和功能。接着,查看开发板上的标识,如数字或字母标记,对照文档确认具体编号。此过程确保正确连接硬件,避免损坏设备。
|
4月前
|
API
MASM32编程使用PE文件头信息计算文件长度
MASM32编程使用PE文件头信息计算文件长度
|
6月前
stm32f407探索者开发板(九)——寄存器地址名称映射
stm32f407探索者开发板(九)——寄存器地址名称映射
|
8月前
|
存储
ARM 堆栈寻址类型区分
该文介绍了堆栈的两种指向分类:向上生成型(递增堆栈)和向下生成型(递减堆栈),以及堆栈的两种数据状态:满堆栈(指针指向最后数据)和空堆栈(指针指向存放数据的位置)。满递增和满递减是在完整数据单元上操作,而空递增和空递减则允许自定义步长。文中通过图示说明了不同情况下的堆栈存储方式。
119 3
|
8月前
|
存储 定位技术 机器学习/深度学习
【汇编】内存中字的存储、用DS和[address]实现字的传送、DS与数据段
【汇编】内存中字的存储、用DS和[address]实现字的传送、DS与数据段
340 1
【汇编】内存中字的存储、用DS和[address]实现字的传送、DS与数据段
|
8月前
|
Linux
DMA寄存器与代码结合文档笔记
DMA寄存器与代码结合文档笔记
80 0
|
Linux Windows
PE格式:实现ELF结构解析工具
ELF文件格式,是一个开放的可执行文件和链接文件格式,其主要工作在Linux系统上,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件,ELF文件格式类似于PE格式,但比起PE结构来ELF结构显得更加的简单,Linux文件结构相比于Windows结构来说简单一些.
|
存储 自然语言处理 编译器
BIT-7文件操作和程序环境(16000字详解)
BIT-7文件操作和程序环境(16000字详解)
93 0