< specifier>-map-pass-thru讲解
提示:仅供学习
一、DTS示列代码
soc { soc_gpio1: gpio-controller1 { #gpio-cells = <2>; }; soc_gpio2: gpio-controller2 { #gpio-cells = <2>; }; }; connector: connector { #gpio-cells = <2>; gpio-map = <0 0 &soc_gpio1 1 0>, <1 0 &soc_gpio2 4 0>, <2 0 &soc_gpio1 3 0>, <3 0 &soc_gpio2 2 0>; gpio-map-mask = <0xf 0x0>; gpio-map-pass-thru = <0x0 0x1>; }; expansion_device { reset-gpios = <&connector 2 GPIO_ACTIVE_LOW>; };
二、gpio-map-pass-thru 讲解
讲述了如何使用掩码在父单元标识符和子单元标识符之间进行映射。
设备树映射掩码的作用
在设备树的 gpio-map 属性中,掩码用于定义如何将子单元标识符映射到父单元标识符。掩码的具体作用如下:
掩码定义:
gpio-map-mask:定义了一个掩码,表示哪些位会影响映射操作。这个掩码用于从父单元标识符中清除特定的位,并将子单元标识符中的相关位复制到父单元标识符。
掩码应用:
清除父单元标识符中的位:掩码中的每一位为 1 的位置会从父单元标识符中清除。这意味着,掩码决定了父单元标识符中需要被忽略的位。
从子单元标识符复制位:掩码中的每一位为 1 的位置会将子单元标识符中相应位置的位复制到父单元标识符中。
示例
假设有以下掩码和单元标识符:
掩码:gpio-map-mask = <0x0 0x3>
子单元标识符:0x0 0xA
父单元标识符:0x0 0x5
掩码 0x3 表示我们关注的是父单元标识符的低两位(即 0b11)。
步骤如下:
清除父单元标识符中的位:
原始父单元标识符:0x5(即 0b0101)
掩码为 0x3,即 0b0011
清除父单元标识符中与掩码相应的位:
plaintext
0b0101 & ~(0b0011) = 0b0101 & 0b1100 = 0b0100
清除后的父单元标识符是 0x4(即 0b0100)
从子单元标识符复制位:
子单元标识符:0xA(即 0b1010)
掩码为 0x3,即 0b0011
复制子单元标识符中掩码相应的位:
plaintext
(0b1010 & 0b0011) = 0b0000
复制的位是 0x0(即 0b0000)
结合结果:
将清除后的父单元标识符与复制的位结合:
plaintext
0b0100 | 0b0000 = 0b0100
最终得到的父单元标识符是 0x4(即 0b0100)
总结
掩码用于在将子单元标识符映射到父单元标识符时进行位操作。掩码中的每一位为 1 的位置会从父单元标识符中清除相应位,并从子单元标识符中复制相应位。这确保了父单元标识符被正确地更新以反映子单元标识符中的值。