树莓派4b设备树理解

树莓派4b设备树理解

(因为没有找到对树莓派设备树详解的,所以下面完全是由自己跟据别人写的有关设备树解释来写的设备树详解,有错的或者漏的话,敬请看到的同学指出并告诉我,可以私信我,感谢!!!)

这里推荐我学习设备树的相关链接,讲解的真的很不错:

1、Linux设备树1-6
2、设备树语法详解
3、树莓派设备树官网

均以bcm2711-rpi-4-b.dts文件为例:

1、第一行不能少代表的是设备树版本
#include".dtsi"可以理解为C语言中的引用的头文件

  1 /dts-v1/;
  2
  3 #include "bcm2711.dtsi"
  4 #include "bcm2711-rpi.dtsi"
  5 #include "bcm283x-rpi-csi1-2lane.dtsi"

2、一个最简单的设备树必须包含根节点,cpus节点,memory节点。根节点的名字及全路径都是“/”,至少需要包含model和compatible两个属性。model属性是用来描述产品型号的,类型为字符串,推荐的格式为“manufacturer,model-number”(非强制的)。根节点的model属性描述的是板子的型号或者芯片平台的型号

“/”表示根节点,根节点表示的是整个板子或者芯片平台。
在每个.dsti和.dts中都会存在一个“/”根节点,编译器DTC在对.dts进行编译生成dtb时,会对node 进行合并操作,最终生成的dtb只有一个root node。

(即.dts和引用的.dtsi文件中的’/'根节点是同一个)

"compatible ="“model = "是根节点下面的属性,用来描述此设备树文件。
从软件的层面讲model属性仅仅表示一个名字而已,没有更多的作用。compatible属性则不同,该属性决定软件如何匹配硬件对硬件进行初始化,Linux 内核会通过根节点的 compoatible 属性查看是否支持此设备,如果支持的话设备就会启动 Linux 内核

chosen节点描述的不是一个真实设备,而是用于firmware传递一些数据给OS,比如bootloader传递内核启动参数给内核**(在linux 内核中会将u-boot中的bootargs参数添加到此节点下作为其子节点)**

  7 / {
  8     compatible = "raspberrypi,4-model-b", "brcm,bcm2711";
  9     model = "Raspberry Pi 4 Model B";    
 10
 11     memory@0 {                  
 12         device_type = "memory"; 
 13         reg = <0x0 0x0 0x0>;
 14     };
 15
 16     chosen {   
 17         bootargs = "coherent_pool=1M 8250.nr_uarts=1 cma=64M";
 18     };

3、很明显,aliases指的意思是别名

标签

就像C中的标签为代码中的位置提供名称一样,DT标签也为层次结构中的节点分配名称。编译器获取对标签的引用,并将其在字符串上下文(&node)中使用时转换为路径,而在整数上下文(<&node>)中使用处理。原始标签不会出现在编译输出中。请注意,标签不包含任何结构。它们只是一个统一的全局命名空间中的令牌。

别名

别名与标签类似,不同的是别名确实以索引形式出现在FDT输出中。它们存储为/aliases节点的属性,每个属性将别名映射到路径字符串。尽管别名节点出现在源中,但路径字符串通常以对标签(&node)的引用的形式出现,而不是全部写出来。DT API会解析到节点的路径字符串,通常会查看路径的第一个字符,将不以斜杠开头的路径作为别名,必须先使用/aliases表将其转换为路径。

aliases {
 21         serial0 = &uart1;
 22         serial1 = &uart0;
 23         mmc0 = &emmc2;
 24         mmc1 = &mmcnr;
 25         mmc2 = &sdhost;
 26         i2c3 = &i2c3;
 27         i2c4 = &i2c4;
 28         i2c5 = &i2c5;
 29         i2c6 = &i2c6;
 30         /delete-property/ ethernet;
 31         /delete-property/ intc;
 32         ethernet0 = &genet;
 33     };

(aliases和chosen属于与内核相关的节点,一般我们不需要去管)

  1 /dts-v1/;
  2
  3 #include "bcm2711.dtsi"
  4 #include "bcm2711-rpi.dtsi"
  5 #include "bcm283x-rpi-csi1-2lane.dtsi"
  6
  7 / {        /*在每个.dsti和.dts中都会存在一个“/”根节点,编译器DTC在对.dts进行编译生成dtb时,会对node                   进行合并操作,最终生成的dtb只有一个root node。*/
  8     compatible = "raspberrypi,4-model-b", "brcm,bcm2711";
  9     model = "Raspberry Pi 4 Model B";     //根节点下的描述公司与型号
 10
 11     memory@0 {                  
 12         device_type = "memory"; 
 13         reg = <0x0 0x0 0x0>;
 14     };
 15
 16     chosen {   //chosen节点不描述一个真实设备,而是用于firmware传递一些数据给OS,比如bootloader传递内核启动参数给内核
 17         bootargs = "coherent_pool=1M 8250.nr_uarts=1 cma=64M";
 18     };
 19
 20     aliases {
 21         serial0 = &uart1;
 22         serial1 = &uart0;
 23         mmc0 = &emmc2;
 24         mmc1 = &mmcnr;
 25         mmc2 = &sdhost;
 26         i2c3 = &i2c3;
 27         i2c4 = &i2c4;
 28         i2c5 = &i2c5;
 29         i2c6 = &i2c6;
 30         /delete-property/ ethernet;
 31         /delete-property/ intc;
 32         ethernet0 = &genet;
 33     };
 34 };
 35
 36 &soc {  //&可以理解为追加,&label表示在label对应的节点中追加属性
 37     virtgpio: virtgpio {
 38         compatible = "brcm,bcm2835-virtgpio";
 39         gpio-controller;
 40         #gpio-cells = <2>;
 41         firmware = <&firmware>;
 42         status = "okay";
 43     };
 44 };  //根节点下结束
 45
 46 &mmcnr {  //在标签为mmcnr对应的节点下追加内容
 47     pinctrl-names = "default";
 48     pinctrl-0 = <&sdio_pins>;
 49     bus-width = <4>;
 50     status = "okay";
 51 };
 52
 53 &firmware { //在标签为firmware 对应的节点下追加内容
 54     expgpio: gpio {
 55         compatible = "raspberrypi,firmware-gpio";
 56         gpio-controller;
 57         #gpio-cells = <2>;
 58         gpio-line-names = "BT_ON",
 59                   "WL_ON",
 60                   "PWR_LED_OFF",
 61                   "GLOBAL_RESET",
 62                   "VDD_SD_IO_SEL",
 63                   "CAM_GPIO",
 64                   "",
 65                   "";
 66         status = "okay";
 67     };
 68 };
 69
 70 &uart0 {
 71     pinctrl-names = "default";
 72     pinctrl-0 = <&uart0_pins &bt_pins>;
 73     status = "okay";
 74 };
 75
 76 &uart1 {
 77     pinctrl-names = "default";
 78     pinctrl-0 = <&uart1_pins>;
 79     status = "okay";
 80 };
 81
 82 &spi0 {
 83     pinctrl-names = "default";
 84     pinctrl-0 = <&spi0_pins &spi0_cs_pins>;
 85     cs-gpios = <&gpio 8 1>, <&gpio 7 1>;
 86
 87     spidev0: spidev@0{
 88         compatible = "spidev";
 89         reg = <0>;  /* CE0 */
 90         #address-cells = <1>;
 91         #size-cells = <0>;
 92         spi-max-frequency = <125000000>;
 93     };
 94
 95     spidev1: spidev@1{
 96         compatible = "spidev";
 97         reg = <1>;  /* CE1 */
 98         #address-cells = <1>;
 99         #size-cells = <0>;
100         spi-max-frequency = <125000000>;
101     };
102 };
103
104 // =============================================
105 // Board specific stuff here
106
107 / {
108
109     sd_io_1v8_reg: sd_io_1v8_reg {
110         status = "okay";
111         compatible = "regulator-gpio";
112         vin-supply = <&vdd_5v0_reg>;
113         regulator-name = "vdd-sd-io";
114         regulator-min-microvolt = <1800000>;
115         regulator-max-microvolt = <3300000>;
116         regulator-boot-on;
117         regulator-always-on;
118         regulator-settling-time-us = <5000>;
119
120         gpios = <&expgpio 4 GPIO_ACTIVE_HIGH>;
121         states = <1800000 0x1
122               3300000 0x0>;
123     };
124 };
125
126 &sdhost {
127     status = "disabled";
128 };
129
130 &emmc2 {
131     status = "okay";
132     broken-cd;
133     vqmmc-supply = <&sd_io_1v8_reg>;
134 };
135
136 &leds {
137     act_led: act {
138         label = "led0";
139         linux,default-trigger = "mmc0";
140         gpios = <&gpio 42 GPIO_ACTIVE_HIGH>;
141     };
142
143     pwr_led: pwr {
144         label = "led1";
145         linux,default-trigger = "default-on";
146         gpios = <&expgpio 2 GPIO_ACTIVE_LOW>;
147     };
148 };
149
150 &audio {
151     pinctrl-names = "default";
152     pinctrl-0 = <&audio_pins>;
153 };
154
155 &sdhost_gpio48 {
156     brcm,pins = <22 23 24 25 26 27>;
157     brcm,function = <BCM2835_FSEL_ALT0>;
158 };
159
160 &gpio {
161     spi0_pins: spi0_pins {
162         brcm,pins = <9 10 11>;
163         brcm,function = <BCM2835_FSEL_ALT0>;
164     };
165
166     spi0_cs_pins: spi0_cs_pins {
167         brcm,pins = <8 7>;
168         brcm,function = <BCM2835_FSEL_GPIO_OUT>;
169     };
170
171     spi3_pins: spi3_pins {
172         brcm,pins = <1 2 3>;
173         brcm,function = <BCM2835_FSEL_ALT3>;
174     };
175
176     spi3_cs_pins: spi3_cs_pins {
177         brcm,pins = <0 24>;
178         brcm,function = <BCM2835_FSEL_GPIO_OUT>;
179     };
180
181     spi4_pins: spi4_pins {
182         brcm,pins = <5 6 7>;
183         brcm,function = <BCM2835_FSEL_ALT3>;
184     };
185
186     spi4_cs_pins: spi4_cs_pins {
187         brcm,pins = <4 25>;
188         brcm,function = <BCM2835_FSEL_GPIO_OUT>;
189     };
190
191     spi5_pins: spi5_pins {
192         brcm,pins = <13 14 15>;
193         brcm,function = <BCM2835_FSEL_ALT3>;
194     };
195
196     spi5_cs_pins: spi5_cs_pins {
197         brcm,pins = <12 26>;
198         brcm,function = <BCM2835_FSEL_GPIO_OUT>;
199     };
200
201     spi6_pins: spi6_pins {
202         brcm,pins = <19 20 21>;
203         brcm,function = <BCM2835_FSEL_ALT3>;
204     };
205
206     spi6_cs_pins: spi6_cs_pins {
207         brcm,pins = <18 27>;
208         brcm,function = <BCM2835_FSEL_GPIO_OUT>;
209     };
210
211     i2c0_pins: i2c0 {
212         brcm,pins = <0 1>;
213         brcm,function = <BCM2835_FSEL_ALT0>;
214         brcm,pull = <BCM2835_PUD_UP>;
215     };
216
217     i2c1_pins: i2c1 {
218         brcm,pins = <2 3>;
219         brcm,function = <BCM2835_FSEL_ALT0>;
220         brcm,pull = <BCM2835_PUD_UP>;
221     };
222
223     i2c3_pins: i2c3 {
224         brcm,pins = <4 5>;
225         brcm,function = <BCM2835_FSEL_ALT5>;
226         brcm,pull = <BCM2835_PUD_UP>;
227     };
228
229     i2c4_pins: i2c4 {
230         brcm,pins = <8 9>;
231         brcm,function = <BCM2835_FSEL_ALT5>;
232         brcm,pull = <BCM2835_PUD_UP>;
233     };
234
235     i2c5_pins: i2c5 {
236         brcm,pins = <12 13>;
237         brcm,function = <BCM2835_FSEL_ALT5>;
238         brcm,pull = <BCM2835_PUD_UP>;
239     };
240
241     i2c6_pins: i2c6 {
242         brcm,pins = <22 23>;
243         brcm,function = <BCM2835_FSEL_ALT5>;
244         brcm,pull = <BCM2835_PUD_UP>;
245     };
246
247     i2s_pins: i2s {
248         brcm,pins = <18 19 20 21>;
249         brcm,function = <BCM2835_FSEL_ALT0>;
250     };
251
252     sdio_pins: sdio_pins {
253         brcm,pins =     <34 35 36 37 38 39>;
254         brcm,function = <BCM2835_FSEL_ALT3>; // alt3 = SD1
255         brcm,pull =     <0 2 2 2 2 2>;
256     };
257
258     bt_pins: bt_pins {
259         brcm,pins = "-"; // non-empty to keep btuart happy, //4 = 0
260                  // to fool pinctrl
261         brcm,function = <0>;
262         brcm,pull = <2>;
263     };
264
265     uart0_pins: uart0_pins {
266         brcm,pins = <32 33>;
267         brcm,function = <BCM2835_FSEL_ALT3>;
268         brcm,pull = <0 2>;
269     };
270
271     uart1_pins: uart1_pins {
272         brcm,pins;
273         brcm,function;
274         brcm,pull;
275     };
276
277     uart2_pins: uart2_pins {
278         brcm,pins = <0 1>;
279         brcm,function = <BCM2835_FSEL_ALT4>;
280         brcm,pull = <0 2>;
281     };
282
283     uart3_pins: uart3_pins {
284         brcm,pins = <4 5>;
285         brcm,function = <BCM2835_FSEL_ALT4>;
286         brcm,pull = <0 2>;
287     };
288
289     uart4_pins: uart4_pins {
290         brcm,pins = <8 9>;
291         brcm,function = <BCM2835_FSEL_ALT4>;
292         brcm,pull = <0 2>;
293     };
294
295     uart5_pins: uart5_pins {
296         brcm,pins = <12 13>;
297         brcm,function = <BCM2835_FSEL_ALT4>;
298         brcm,pull = <0 2>;
299     };
300
301     audio_pins: audio_pins {
302         brcm,pins = <40 41>;
303         brcm,function = <4>;
303         brcm,function = <4>;
304     };
305 };
306
307 &i2c0 {
308     pinctrl-names = "default";
309     pinctrl-0 = <&i2c0_pins>;
310     clock-frequency = <100000>;
311 };
312
313 &i2c1 {
314     pinctrl-names = "default";
315     pinctrl-0 = <&i2c1_pins>;
316     clock-frequency = <100000>;
317 };
318
319 &i2c2 {
320     clock-frequency = <100000>;
321 };
322
323 &i2s {
324     pinctrl-names = "default";
325     pinctrl-0 = <&i2s_pins>;
326 };
327
328 / {
329     __overrides__ {
330         act_led_gpio = <&act_led>,"gpios:4";
331         act_led_activelow = <&act_led>,"gpios:8";
332         act_led_trigger = <&act_led>,"linux,default-trigger";
333
334         pwr_led_gpio = <&pwr_led>,"gpios:4";
335         pwr_led_activelow = <&pwr_led>,"gpios:8";
336         pwr_led_trigger = <&pwr_led>,"linux,default-trigger";
337
338         eth_led0 = <&phy1>,"led-modes:0";
339         eth_led1 = <&phy1>,"led-modes:4";
340     };
341 };
  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,针对您的问题,我可以提供以下设备树配置示例: ``` &i2c { status = "okay"; gt9271: gt9271@5d { compatible = "goodix,gt9271"; reg = <0x5d>; interrupt-parent = <&gpio>; interrupts = <14 2>; reset-gpios = <&gpio 15 0>; irq-gpios = <&gpio 16 0>; touchscreen-size-x = <800>; touchscreen-size-y = <480>; touchscreen-inverted-x; touchscreen-swapped-x-y; touchscreen-inverted-y; touchscreen-fuzz-x = <8>; touchscreen-fuzz-y = <8>; touchscreen-min-pressure = <10>; touchscreen-max-pressure = <255>; /* PCA9536 P1 and P2 pins */ pca9536: pca9536@21 { compatible = "nxp,pca9536"; reg = <0x21>; gpio-controller; #gpio-cells = <2>; interrupt-parent = <&gpio>; interrupts = <13 2>; pinctrl-names = "default"; pinctrl-0 = <&pca9536_pins>; /* PCA9536 P1 pin */ pca9536_p1: pca9536_p1 { gpio-hog; gpios = <&pca9536 0 GPIO_ACTIVE_HIGH>; output-low; line-name = "pca9536-p1"; }; /* PCA9536 P2 pin */ pca9536_p2: pca9536_p2 { gpio-hog; gpios = <&pca9536 1 GPIO_ACTIVE_HIGH>; output-low; line-name = "pca9536-p2"; }; }; }; }; &pca9536 { status = "okay"; pca9536_pins: pca9536_pins { pca9536_p1_pin: pca9536_p1_pin { gpio-hog; gpios = <&gpio 17 GPIO_ACTIVE_HIGH>; output-low; line-name = "pca9536-p1"; }; pca9536_p2_pin: pca9536_p2_pin { gpio-hog; gpios = <&gpio 18 GPIO_ACTIVE_HIGH>; output-low; line-name = "pca9536-p2"; }; }; }; ``` 上述示例代码中,我们在设备树中首先定义了 I2C 总线,并在该总线下定义了 GT9271 触摸屏设备(节点 `gt9271@5d`)。同时,在 GT9271 设备下,我们还定义了 PCA9536 IO 扩展器设备(节点 `pca9536@21`),并通过设备树的 `pinctrl` 属性将其与两个 GPIO 引脚(节点 `pca9536_p1` 和 `pca9536_p2`)进行绑定。 需要注意的是,上述代码中的具体引脚编号可能与您的具体硬件连接方式有所不同,因此您需要根据实际情况进行修改。 另外,您提到需要将 PCA9536 的 P1 和 P2 引脚与 GT9271 的 RESET 和 INT 引脚进行绑定,但是在设备树中并不能直接进行引脚之间的绑定。如果您需要在驱动程序中进行引脚绑定,可以使用 GPIO 虚拟子系统提供的 `gpio_request()` 和 `gpio_set_value()` 等函数来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值