LXR | KVM | PM | Time | Interrupt | Systems Performance | Bootup Optimization

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:目标设备列表,用于标识哪些设备将使用这个固件。

参考《[OpenWrt Wiki] Adding a new device》。

posted on 2024-08-10 23:59  ArnoldLu  阅读(138)  评论(0编辑  收藏  举报

导航