基本信息
全志H618
SDK: 香橙派官方提供SDK
虚拟机: Ubuntu22.04
整体的SDK文件夹名称为:orangepi-build-next
SDK中Linux内核路径:orangepi-build-next/kernel/orange-pi-5.4-sun50iw9
编译环境指定
首先需要指定交叉编译器:
在SDK中的toolchains文件夹中含有很多编译器:
对于H618使用的交叉编译器是gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu
所以首先导出环境变量,用来后续编译的时候可以直接执行编译器指令:
export PATH=$PATH:/home/wakkk/H618/orangepi-build-next/toolchains/gcc-arm-11.2-2022.02-x86_64-aarch64-none-linux-gnu/bin
注意里面的部分地址需要修改为你的地址!!!
设备树编译指令
make dtbs ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu-
无论对于Linux内核的编译还是modules还是dts的编译都需要指定ARCH 和CROSS_COMPILE环境变量
之后在修改好设备树之后就可以执行这个指令来编译了
设备树插件示例编写demo
为什么是编写插件而不是直接改写设备树呢?一个是对于原始版本的设备树很多人都去修改过,但是修改的部分无论如何都是无法正常加载,还有就是很多时候都是不建议修改原始设备树的,而且使用插件还是更为方便的。
本次的demo仅仅是加入一个简单的节点,并没有实际的功能,仅仅是验证整个编译的流程,以及可能踩坑的地方。
建立文件
我们在这个设备树插件的专用文件夹中编写新的插件:
/home/wakkk/H618/orangepi-build-next/kernel/orange-pi-5.4-sun50iw9/arch/arm64/boot/dts/sunxi/overlay
sunxi中是原始的设备树文件
而overlay中是设备树插件的文件
在overlay文件夹中我们新建一个文件: wakkk.dts
/dts-v1/;
/plugin/;
/ {
fragment@0 {
target-path = "/";
__overlay__ {
wakkk_node {
compatible = "wakkk,orangepi-zero-3";
status = "okay";
};
};
};
};
新建了一个节点,名称为“wakkk_node”
为了使得这个设备树插件能够正常编译,我们需要修改overlay文件夹中的Makefile
# SPDX-License-Identifier: GPL-2.0
dtbo-$(CONFIG_ARCH_SUNXI) += \
sun50i-h616-ph-i2c1.dtbo \
sun50i-h616-ph-i2c2.dtbo \
sun50i-h616-ph-i2c3.dtbo \
sun50i-h616-ph-i2c4.dtbo \
sun50i-h616-pi-i2c0.dtbo \
sun50i-h616-pi-i2c1.dtbo \
sun50i-h616-pi-i2c2.dtbo \
sun50i-h616-ph-pwm12.dtbo \
sun50i-h616-ph-pwm34.dtbo \
sun50i-h616-pi-pwm1.dtbo \
sun50i-h616-pi-pwm2.dtbo \
sun50i-h616-pi-pwm3.dtbo \
sun50i-h616-pi-pwm4.dtbo \
sun50i-h616-ph-uart2.dtbo \
sun50i-h616-pi-uart2.dtbo \
sun50i-h616-pi-uart3.dtbo \
sun50i-h616-pi-uart4.dtbo \
sun50i-h616-ph-uart5.dtbo \
sun50i-h616-powerkey.dtbo \
sun50i-h616-usb0-host.dtbo \
sun50i-h616-spi0-spidev.dtbo \
sun50i-h616-spi1-cs0-spidev.dtbo \
sun50i-h616-spi1-cs1-spidev.dtbo \
sun50i-h616-spi1-cs0-cs1-spidev.dtbo \
sun50i-h616-disable-leds.dtbo \
sun50i-h616-disable-uart0.dtbo \
sun50i-h616-zero2w-disable-led.dtbo \
wakkk.dtbo
targets += $(dtbo-y) $(scr-y) $(dtbotxt-y)
always := $(dtbo-y) $(scr-y) $(dtbotxt-y)
clean-files := *.dtbo *.scr
就是在dtbo-$(CONFIG_ARCH_SUNXI) +=中加入了刚放的wakkk.dtbo
这样就可以在编译之后生成wakkk.dtbo了
随后,我们在kernel主目录下进行编译:(注意一定要首先导出编译器环境变量,对于每个终端都是)
make dtbs ARCH=arm64 CROSS_COMPILE=aarch64-none-linux-gnu-
编译之后我们便可以看见产生的wakkk.dtbo
我们将编译好的dtbo文件传入开发板中,并放入文件夹:
cp /root/wakkk/wakkk.dtbo /boot/dtb/sunxi/overlay/sun50i-h616-wakkk.dtbo
注意,这里面将dtbo文件名称加入了一个sun50i-h616
前缀,后续会有说明,若无这个前缀则无法正常加载。
放入开发板中的/boot/dtb/sunxi/overlay/
文件夹下即可,这个文件夹还有默认编译好的dtbo文件: 可见都是sun50i-h616
开头
但是仅仅是放进去但是无法正常加载,我们还需要修改文件:/boot/orangepiEnv.txt
我们只需要在overlays
中加入"wakkk"即可
root@orangepizero3:/boot# cat orangepiEnv.txt
verbosity=1
bootlogo=false
console=both
disp_mode=1080p60
fb0_width=1920
fb0_height=1080
debug_uart=ttyAS0
overlay_prefix=sun50i-h616
rootdev=UUID=097c0934-864c-4961-9bf6-4ab53f3c5f5a
rootfstype=ext4
overlays=spi1-cs1-spidev wakkk
usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u
注意两个地方:
第一个:overlay_prefix
这个表示仅仅是识别前缀为sun50i-h616
的设备树插件,所以如果设备树插件不是这个前缀则无法加载,即使后面的overlays
已经设置也没有效果。
第二个: overlays
这个表示仅仅加载名称含有spi1cs1-spidev
和wakkk
的设备树插件,可见对于overlays文件夹中的设备树插件并不是全部加载的,这里有一个进一步筛选的流程。
这样,首先经过前缀的筛选,再经过名称的筛选,我们可以正常加载自己的设备树插件。
PS:对于orangepi config 命令实现对于系统的配置也是通过修改这个文件实现的,也就是对于很多外设例如IIC SPI等等,很多并不是默认加载的,在设置中开启之后于是在这个文件中“使能”对应的设备树插件,从而实现外设的加载控制。
重启开发板 查看加载状态
若一切配置正常,重启后我们可以看见我们编写的节点:“wakkk_node”