dtbo设备树插件踩坑记录
dtbo的一些过程问题
最近在搞设备树插件一些东西,对个人来说挺新奇的,所以碰到了很多问题;然后感谢大佬的技术支持,此处@大佬
首先设备树插件就是在不动主设备树的情况下,根据自己的硬件设计将个人独特的设置“插入”到主设备树上,包括修改主设备树节点、增加和删除;当然最好是有源码,只设备树源码也行,不然的话很多节点都靠猜,所以没有原厂的支持很难进行呀!~
设备树插件的类似关键字像/dts-v1/、/plugin/、/fragment@N/、/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/fdt
cat /sys/firmware/fdt > my.dtb or dd if=/sys/firmware/fdt of=my.dtb
