dtbo的一些过程问题最近在搞设备树插件一些东西对个人来说挺新奇的所以碰到了很多问题然后感谢大佬的技术支持此处大佬首先设备树插件就是在不动主设备树的情况下根据自己的硬件设计将个人独特的设置“插入”到主设备树上包括修改主设备树节点、增加和删除当然最好是有源码只设备树源码也行不然的话很多节点都靠猜所以没有原厂的支持很难进行呀~设备树插件的类似关键字像/dts-v1/、/plugin/、/fragmentN/、/overlay/这些了解这些才开始写设备树插件哈主要是fragment定义片段里面是自己的插件内容overlay里的内容是要覆盖或者修改增加的属性说几个自己碰到的问题1、主设备树使用了某个gpio作为某些节点的组成部分造成无法在sysfs中使用需要在设备树中将其释放出来你比如我自己是想控制PA5用来点灯的结果echo 到export的时候总是busy通过/sys/kernel/debug/gpio查看发现PA5确实被占用当时手上没有源码连dts源码都没有于是问AI从系统中巴拉出来dtb然后反编译出设备树dts来然后看设备树特么找不到PA5是谁系统 中PA5叫pa-pin-0所以将将算找到了吧哈哈其实我自己比较菜哈懂得人可能看pa-pin-0然后看寄存器0x05就知道了然后问题来了怎么将PA5释放出来呢这里再次感谢原厂大佬的支持通过target-path精准找到pinctrl再次将其设置为功能 gpio或者target找到codec节点将其disable掉这样就算释放出来了这两个方式都非常好哈2、有些节点直接dtc编译时宏定义找不到咋办你像啊我找原厂要到了dts源码然后我在修改dtbo插件时有一个E907_PA_IRQ_NUM节点需要使用但是明眼人一看这**是引用了哪个头文件里的定义那么我怎么办这时候你就只能找他的内核源码了但是厂商这块是封闭的内核源码不提供这时候你得找他开源的内核因为设备树的定义大概率是和之前的代码是一样的然后我就在提供的老源码上搜关键字还真找到了然后通过cpp的预编译将其预编译之后再次使用dtc命令编译dtbo注意此时编译命令要通过 -I 将其定义的头文件包含进去比如cpp -I ./include/ demo_overlay.dts demo_overlay_pre.dts此时我的设备树插件中的宏定义可通过-I include去include路径下找3、常用的命令汇总哈编译dtc -I dts -O dtb -o xxx.dtb xxx.dts // -I 输入文件、-O 输出文件dtc - -I dts -O dtb -o xxx.dtbo xxx.dts //- 编译成设备树插件 -I 输入文件、-O 输出文件设备树预编译可以使用cpp命令将dts预编译成dts就是将include中的内容展开cpp -I ./include/ demo_overlay.dts demo_overlay_pre.dts反编译dtc -I dtb -O dts xxx.dtb -o xxx.dts导出dtb可以从启动的PEE文件系统中导出当前运行的设备树/sys/firmware/fdtcat /sys/firmware/fdt my.dtb or dd if/sys/firmware/fdt ofmy.dtb
dtbo设备树插件踩坑记录
发布时间:2026/5/16 2:53:22
dtbo的一些过程问题最近在搞设备树插件一些东西对个人来说挺新奇的所以碰到了很多问题然后感谢大佬的技术支持此处大佬首先设备树插件就是在不动主设备树的情况下根据自己的硬件设计将个人独特的设置“插入”到主设备树上包括修改主设备树节点、增加和删除当然最好是有源码只设备树源码也行不然的话很多节点都靠猜所以没有原厂的支持很难进行呀~设备树插件的类似关键字像/dts-v1/、/plugin/、/fragmentN/、/overlay/这些了解这些才开始写设备树插件哈主要是fragment定义片段里面是自己的插件内容overlay里的内容是要覆盖或者修改增加的属性说几个自己碰到的问题1、主设备树使用了某个gpio作为某些节点的组成部分造成无法在sysfs中使用需要在设备树中将其释放出来你比如我自己是想控制PA5用来点灯的结果echo 到export的时候总是busy通过/sys/kernel/debug/gpio查看发现PA5确实被占用当时手上没有源码连dts源码都没有于是问AI从系统中巴拉出来dtb然后反编译出设备树dts来然后看设备树特么找不到PA5是谁系统 中PA5叫pa-pin-0所以将将算找到了吧哈哈其实我自己比较菜哈懂得人可能看pa-pin-0然后看寄存器0x05就知道了然后问题来了怎么将PA5释放出来呢这里再次感谢原厂大佬的支持通过target-path精准找到pinctrl再次将其设置为功能 gpio或者target找到codec节点将其disable掉这样就算释放出来了这两个方式都非常好哈2、有些节点直接dtc编译时宏定义找不到咋办你像啊我找原厂要到了dts源码然后我在修改dtbo插件时有一个E907_PA_IRQ_NUM节点需要使用但是明眼人一看这**是引用了哪个头文件里的定义那么我怎么办这时候你就只能找他的内核源码了但是厂商这块是封闭的内核源码不提供这时候你得找他开源的内核因为设备树的定义大概率是和之前的代码是一样的然后我就在提供的老源码上搜关键字还真找到了然后通过cpp的预编译将其预编译之后再次使用dtc命令编译dtbo注意此时编译命令要通过 -I 将其定义的头文件包含进去比如cpp -I ./include/ demo_overlay.dts demo_overlay_pre.dts此时我的设备树插件中的宏定义可通过-I include去include路径下找3、常用的命令汇总哈编译dtc -I dts -O dtb -o xxx.dtb xxx.dts // -I 输入文件、-O 输出文件dtc - -I dts -O dtb -o xxx.dtbo xxx.dts //- 编译成设备树插件 -I 输入文件、-O 输出文件设备树预编译可以使用cpp命令将dts预编译成dts就是将include中的内容展开cpp -I ./include/ demo_overlay.dts demo_overlay_pre.dts反编译dtc -I dtb -O dts xxx.dtb -o xxx.dts导出dtb可以从启动的PEE文件系统中导出当前运行的设备树/sys/firmware/fdtcat /sys/firmware/fdt my.dtb or dd if/sys/firmware/fdt ofmy.dtb