DeviceTreeOverlay使用

By Toradex 胡珊逢

1). 简介

目前较新的 Linux 内核都支持Device Tree 来管理外设,这对嵌入式设备来说显得尤为重要。通过单独的 Device Tree 文件,可以有效减少因外设更改而重新编译 Linux 内核的工作量。而随着 SoC 的复杂程度与日俱增,Device Tree 本身也开始变得复杂。Device Tree Overlays (DTO)则提供一种简洁的方式来更改 Device Tree 。下面我们将在Apalis iMX8QM 计算机模块上介绍如何针对 Toradex Linux BSP v5.0 配置 Device Tree Overlays。


本文就基于NXP最新的iMX8 SoC(基于Cortex-A72+A53和Coretex-M4架构)ARM平台介绍如何配置 Device Tree Overlays。演示平台来自于Toradex 基于iMX8QM的Apalis iMX8QM ARM嵌入式模块平台。



2). 测试流程

首先我们需要下载所需的编译工具和 Linux 内核源码,具体的方法参考我们开发者中心的网页,如果想要在 Windows 上使用 WSL 进行编译,也可以阅读该博文

使用 git 下载 Linux 内核源码

--------------------------

git clone -b toradex_5.4-2.1.x-imx git://git.toradex.cn/linux-toradex.git

--------------------------


我们还提供了适用于一些外设如 LVDS 显示屏、电容触摸屏控制器等现成 Device Tree Overlays 文件,这可以作为学习 Device Tree Overlays 的开始。

--------------------------

git clone -b toradex_5.4-2.1.x-imx git://git.toradex.cn/device-tree-overlays.git

--------------------------


Device Tree Overlay 的使用分为三个步骤,编写 Device Tree Overlay 文件 dts,将 dts 文件编译生成 dtbo 文件,部署 dtbo 文件。我们将用 Apalis iMX8QM 的一个 SD 接口为例,将 SD_DATA0 和 SD_DATA1 配置 GPIO。


首先根据 Apalis iMX8QM datasheet 确定使用的引脚,MXM3_186 和 MXM3_188,其对应的 GPIO 为 LSIO.GPIO5.IO26 和 LSIO.GPIO5.IO27。



然后开始编译 test_overlay.dts 文件。

--------------------------

/dts-v1/;

/plugin/;

/ {

compatible = "toradex,apalis-imx8";

};

--------------------------


compatible 属性指定该device tree overlay 文件适用的硬件,对应于 imx8qm-apalis-eval.dts 。


在默认配置中 MXM3_186 和 MXM3_188 用于 4-bit SD 通道,因此需要将该功能禁用。在 device tree 中,该 4-bit SD 通道对应的名字为 usdhc3

--------------------------

&usdhc3 {

         status = "disabled";

};

--------------------------


在 iMX8QM 上 iomuxc 单元管理引脚复用的配置。Apalis iMX8QM 默认配置中已经有8 个GPIO,但是部分被用于其他设备如风扇电源控制等。我们这里增加两个新的 GPIO ,pinctrl_gpio9 和 pinctrl_gpio10。在 test_overlay.dts 增加,这里的iomuxc/pinctrl-0 属性将会覆盖原来的配置。

--------------------------

--------------------------


接下来需要把 MXM3_186 和 MXM3_188 配置为 GPIO 模式。在上面我们已经知道 MXM3_186 和 MXM3_188对应的 GPIO 为 LSIO.GPIO5.IO26 和 LSIO.GPIO5.IO27,Ball name 为 USDHC2_DATA0 和 USDHC2_DATA1。根据这个写信息,在 pads-imx8qm.h 中找对引脚对应的表示名称,IMX8QM_USDHC2_DATA0_LSIO_GPIO5_IO26 和 IMX8QM_USDHC2_DATA1_LSIO_GPIO5_IO27。在 test_overlay.dts 的 iomuxc 节点中添加

--------------------------

--------------------------


至此,test_overlay.dts 文件已经完成,完整文件可以从这里下载。将 test_overlay.dts 复制到刚才下载的 device-tree-overlays/ overlays 目录下。

--------------------------

$ tree -L 2

.

├── device-tree-overlays

│ └── overlays

└── linux-toradex

--------------------------


然后执行下面两条命令生成test_overlay.dtbo文件。这里使用 -I 和 -i 参数指定 Linux 内核源码相关目录。

--------------------------

cpp -nostdinc -I ../../linux-toradex/arch/arm64/boot/dts/freescale -I ../../linux-toradex/include -undef -x assembler-with-cpp test_overlay.dts test_overlay.dts.preprocessed


dtc -@ -Hepapr -I dts -O dtb -i ../../linux-toradex/arch/arm64/boot/dts/freescale/ -o test_overlay.dtbo test_overlay.dts.preprocessed

--------------------------


最后需要把 test_overlay.dtbo 部署到 Apalis iMX8QM。将该文件复制到 /media/mmcblk0p1/overlays 目录中,然后修改 /media/mmcblk0p1/overlays.txt 文件。执行 reboot 命令重启系统。

--------------------------

fdt_overlays=overlays/test_overlay.dtbo

--------------------------


启动后可以在串口日志中发现 overlays/test_overlay.dtbo 被读取并应用到系统。

--------------------------

## Executing script at 83100000

102464 bytes read in 19 ms (5.1 MiB/s)

Loading hdp firmware from 0x000000009c000000 offset 0x0000000000002000

Loading hdp firmware Complete

162517 bytes read in 23 ms (6.7 MiB/s)

40 bytes read in 16 ms (2 KiB/s)

Applying Overlay: overlays/test_overlay.dtbo

272 bytes read in 29 ms (8.8 KiB/s)

9805442 bytes read in 316 ms (29.6 MiB/s)

Uncompressed size: 23144960 = 0x1612A00

## Flattened Device Tree blob at 83000000

   Booting using the fdt blob at 0x83000000

   Loading Device Tree to 00000000fd603000, end 00000000fd64dfff ... OK

--------------------------


进入系统后可以对这两个引脚进行操作。在 Linux 系统中会使用对应的 GPIO 编号来访问引脚,对应的关系可以参考这里。LSIO.GPIO05.IO26(MXM3_186)和 LSIO.GPIO05.IO27(MXM3_188)分别对应 346 和 347。然后执行下面将其配置为输出模式。

--------------------------

root@apalis-imx8:~# echo 346 > /sys/class/gpio/export

root@apalis-imx8:~# echo 347 > /sys/class/gpio/export

root@apalis-imx8:~# echo "out" > /sys/class/gpio/gpio346/direction

root@apalis-imx8:~# echo "out" > /sys/class/gpio/gpio347/direction


root@apalis-imx8:~# cat /sys/kernel/debug/gpio

gpio-346 (MXM3_186            |sysfs               ) out lo

gpio-347 (MXM3_188            |sysfs               ) out lo

--------------------------


以下命令可以在对应引脚上设置高/低电平。

--------------------------

root@apalis-imx8:~# echo 1 > /sys/class/gpio/gpio346/value

root@apalis-imx8:~# echo 1 > /sys/class/gpio/gpio347/value

root@apalis-imx8:~# echo 0 > /sys/class/gpio/gpio346/value

root@apalis-imx8:~# echo 0 > /sys/class/gpio/gpio347/value

--------------------------


Device tree 是 Linux 内核的重要文件,如果配置不当有可能导致系统启动失败。一旦出现这种情况,可以将 Apalis iMX8QM 的 USB OTG 连接到电脑,然后在 U-boot 中执行下面命令后会将 Apalis iMX8QM 启动文件挂载到电脑,删除 overlays.txt 文件中配置的参数。保存后可以使用默认的 device tree 启动系统。

--------------------------

ums 0 mmc 0

--------------------------



4). 总结

Device tree 可以使用户以较少配置更改来使用新的外设,避免编译整个 device tree。





参考:

https://developer.toradex.cn/device-tree-overlays-linux#Deploying_a_Device_Tree_Overlay

https://developer.toradex.cn/knowledge-base/device-tree-overlays

https://developer.toradex.cn/knowledge-base/build-u-boot-and-linux-kernel-from-source-code#Device_Tree_Overlays

https://www.raspberrypi.org/documentation/configuration/device-tree.md

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349