OpenWRT(6):添加自己的Target/Subtarget/Target Profile
OpenWRT前三个配置Target/Subtarget/Target Profile基本决定了一款产品的软硬件基本配置。
Target可以是一系列处理器型号、或者一个公司、或者一种架构。
Subtarget是对Target细分。
Target Profile是Target和Subtarget的不同需求或者形态的特定配置。
1 Target/Subtarget/Target Profile配置
Target System (QEMU venom) Subtarget (venom qemu ca53) Target Profile (Profile A)
Target在target/linux下创建target目录,目录名称即为target名称。
Subtarget在target/linux/<target_name>下创建目录,目录名称即为Subtarget名称。
Target Profile在profiles目录下添加。
2 添加自己的Target/Subtarget/Target Pfofile
添加一个venom Target,ca53 Subtarget,profile-a/profile-b两个Target Profile如下:
tree target/linux/venom/ target/linux/venom/ ├── base-files │ └── etc │ ├── board.d │ │ └── venom-board │ ├── hotplug.d │ │ └── venom-hotplug │ ├── init.d │ │ └── venom-init │ ├── inittab │ ├── uci-defaults │ │ └── venom-uci │ └── version ├── ca53 │ ├── base-files │ │ └── etc │ │ ├── board.d │ │ │ └── venom-ca53-board │ │ ├── hotplug.d │ │ │ └── venom-ca53-hotplug │ │ ├── init.d │ │ │ └── venom-ca53-init │ │ ├── uci-defaults │ │ │ └── venom-ca53-uci │ │ └── version │ ├── config-5.10 │ └── target.mk ├── config-5.10 ├── image │ └── Makefile ├── Makefile ├── profiles │ ├── profile-a.mk │ └── profile-b.mk └── README
Subtarget的base-files会覆盖Target中的base-files。
2.1 Target配置
在Makefile中添加Target:
# SPDX-License-Identifier: GPL-2.0-only # # Copyright (C) 2017 Yousong Zhou <yszhou4tech@gmail.com> include $(TOPDIR)/rules.mk BOARD:=venom BOARDNAME:=QEMU venom FEATURES:=ramdisk KERNEL_PATCHVER:=5.10 include $(INCLUDE_DIR)/target.mk DEFAULT_PACKAGES += $(eval $(call BuildTarget))
在image/Makefile中定义编译镜像操作:
include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/image.mk define Image/BuildKernel $(foreach k,$(filter zImage Image,$(KERNELNAME)), \ cp $(KDIR)/$(KERNELNAME) $(BIN_DIR)/$(IMG_PREFIX)-$(k) \ ) endef define Image/Build/Initramfs $(foreach k,$(filter zImage Image,$(KERNELNAME)), \ cp $(KDIR)/$(k)-initramfs $(BIN_DIR)/$(IMG_PREFIX)-$(k)-initramfs \ ) endef define Image/Build/gzip gzip -f9n $(BIN_DIR)/$(IMG_ROOTFS)-$(1).img endef $(eval $(call Image/gzip-ext4-padded-squashfs)) define Image/Build $(call Image/Build/$(1)) $(CP) $(KDIR)/root.$(1) $(BIN_DIR)/$(IMG_ROOTFS)-$(1).img $(call Image/Build/gzip/$(1)) endef $(eval $(call BuildImage))
2.2 Subtarget配置
在ca53/target.mk中定义Subtarget ca53配置:
ARCH:=aarch64 SUBTARGET:=ca53 BOARDNAME:=venom qemu ca53 CPU_TYPE:=cortex-a53 KERNELNAME:=Image define Target/Description Build multi-platform images for the ARMv8 instruction set architecture endef
2.3 Target Profile配置
在profiles/xxx.mk中定义Target Profile,以profile-a为例:
define Profile/profile-a NAME:=Profile A PACKAGES:=kmod-a kmod-b endef define Profile/profile-a/Description Profile a. endef $(eval $(call Profile,profile-a))
2.4 生成的临时config文件
根据上面的Target/Subtarget/Target Profile配置,生成临时文件tmp/.config-target.in:
config DEFAULT_TARGET_venom_ca53 bool depends on TARGET_PER_DEVICE_ROOTFS default y if TARGET_venom_ca53 select DEFAULT_base-files if TARGET_PER_DEVICE_ROOTFS select DEFAULT_ca-bundle if TARGET_PER_DEVICE_ROOTFS ... select DEFAULT_ppp if TARGET_PER_DEVICE_ROOTFS select DEFAULT_ppp-mod-pppoe if TARGET_PER_DEVICE_ROOTFS choice prompt "Target System" default TARGET_ath79 reset if !DEVEL config TARGET_venom bool "QEMU venom" select HAS_SUBTARGETS endchoice choice prompt "Subtarget" if HAS_SUBTARGETS config TARGET_venom_ca53 bool "venom qemu ca53" select LINUX_5_10 if !TESTING_KERNEL select LINUX_5_10 if TESTING_KERNEL depends on TARGET_venom select DISPLAY_SUPPORT select USES_DEVICETREE select GPIO_SUPPORT select PCI_SUPPORT select USES_INITRAMFS select RTC_SUPPORT select VIRTIO_SUPPORT select aarch64 help Build multi-platform images for the ARMv8 instruction set architecture endchoice choice prompt "Target Profile" default TARGET_MULTI_PROFILE if BUILDBOT default TARGET_venom_ca53_profile-a if TARGET_venom_ca53 && !BUILDBOT config TARGET_MULTI_PROFILE bool "Multiple devices" depends on HAS_DEVICES help Instead of only building a single image, or all images, this allows you to select images to be built for multiple devices in one build. config TARGET_venom_ca53_profile-a bool "Profile A" depends on TARGET_venom_ca53 select DEFAULT_base-files select DEFAULT_busybox ... select DEFAULT_urandom-seed select DEFAULT_urngd help Profile a. config TARGET_venom_ca53_profile-b bool "Profile B" depends on TARGET_venom_ca53 select DEFAULT_base-files select DEFAULT_busybox ... select DEFAULT_urandom-seed select DEFAULT_urngd help Profile b. endchoice menu "Target Devices" depends on TARGET_MULTI_PROFILE config TARGET_ALL_PROFILES bool "Enable all profiles by default" default BUILDBOT config TARGET_PER_DEVICE_ROOTFS bool "Use a per-device root filesystem that adds profile packages" default BUILDBOT help ... endmenu config HAS_SUBTARGETS bool config HAS_DEVICES bool config TARGET_BOARD string default "venom" if TARGET_venom config TARGET_SUBTARGET string default "generic" if !HAS_SUBTARGETS default "ca53" if TARGET_venom_ca53 config TARGET_PROFILE string default "profile-a" if TARGET_venom_ca53_profile-a default "profile-b" if TARGET_venom_ca53_profile-b config TARGET_ARCH_PACKAGES string default "aarch64_cortex-a53" if TARGET_venom_ca53 config DEFAULT_TARGET_OPTIMIZATION string default "-Os -pipe -mcpu=cortex-a53" if TARGET_venom_ca53 default "-Os -pipe -funit-at-a-time" config CPU_TYPE string default "cortex-a53" if TARGET_venom_ca53 default "" config LINUX_5_10 bool config DEFAULT_base-files bool config MODULE_DEFAULT_base-files tristate depends on TARGET_PER_DEVICE_ROOTFS depends on m default m if DEFAULT_base-files select PACKAGE_base-files config DEFAULT_busybox bool... config DEFAULT_urngd bool config MODULE_DEFAULT_urngd tristate depends on TARGET_PER_DEVICE_ROOTFS depends on m default m if DEFAULT_urngd select PACKAGE_urngd
2.5 配置选项解释
- BOARD:指定当前正在编译的硬件平台或开发板的名称。
- BOARDNAME:开发板的友好名称,用于在OpenWrt系统中标识设备。
- FEATURES:编译过程中启用的特性列表,定义的特性在scripts/target-metadata.pl中解析转换成宏定义写入到/tmp/.config-target.in中。支持的特性有:
arm_v(x) = select arm_v(x) audio = select AUDIO_SUPPORT boot-part = select USES_BOOT_PART broken = depends on BROKEN cpiogz = select USES_CPIOGZ display = select DISPLAY_SUPPORT dt = select USES_DEVICETREE dt-overlay = select HAS_DT_OVERLAY_SUPPORT emmc = select EMMC_SUPPORT ext4 = select USES_EXT4 fpu = select HAS_FPU gpio = select GPIO_SUPPORT jffs2 = select USES_JFFS2 jffs2_nand = select USES_JFFS2_NAND legacy-sdcard = select LEGACY_SDCARD_SUPPORT low_mem = select LOW_MEMORY_FOOTPRINT minor = select USES_MINOR mips16 = select HAS_MIPS16 nand = select NAND_SUPPORT nommu = select NOMMU pci = select PCI_SUPPORT pcie = select PCIE_SUPPORT pcmcia = select PCMCIA_SUPPORT powerpc64 = select powerpc64 pwm = "\select PWM_SUPPORT ramdisk = select USES_INITRAMFS rfkill = select RFKILL_SUPPORT rootfs-part = select USES_ROOTFS_PART rtc = select RTC_SUPPORT separate_ramdisk = select USES_INITRAMFS select USES_SEPARATE_INITRAMFS small_flash = select SMALL_FLASH spe_fpu = select HAS_SPE_FPU squashfs = select USES_SQUASHFS targz = select USES_TARGZ testing-kernel = select HAS_TESTING_KERNEL ubifs = select USES_UBIFS usb = select USB_SUPPORT usbgadget = select USB_GADGET_SUPPORT virtio = select VIRTIO_SUPPORT
- SUBTARGETS:对于支持多个子型号或变体的开发板,列出所有子目标。
- KERNEL_PATCHVER:内核补丁的版本号,用于标识当前使用的内核补丁集。
- KERNEL_OUT:内核编译输出的目录。
- DEFAULT_PACKAGES:默认情况下,固件中包含的软件包列表。
- KERNELNAME:内核映像的名称,通常用于启动脚本和设备树。
- UBIFS_OPTS:用于Ubifs文件系统的编译选项。
- MKUBIFS_OPTS:mkubifs工具的编译选项,用于创建Ubifs文件系统映像。
- UBINIZE_OPTS:ubinize工具的编译选项,用于打包和压缩固件。
- BLOCKSIZE:Ubifs文件系统中使用的块大小。
- PAGESIZE:Ubifs文件系统中使用的页大小。
- SUBPAGESIZE:Ubifs文件系统中使用的子页大小。
- FILESYSTEMS:固件支持的文件系统类型列表,比如ext4,squashfs,ubifs等。
- DEVICE_VENDOR:设备的制造商或供应商名称。
- DEVICE_MODEL:设备型号。
- SOC:系统芯片的型号,用于标识处理器架构。
- UBOOT_DEVICE_NAME:U-Boot引导加载程序中使用的设备名称。
- DEVICE_DTS:设备树源文件的名称,用于描述硬件配置。
- TARGET_DEVICES:目标设备列表,用于标识哪些设备将使用这个固件。