From da7b459793adcef9fe9b577cf832930daea73737 Mon Sep 17 00:00:00 2001 From: AD-Aleksandrov Date: Sun, 24 Sep 2017 14:49:05 +0300 Subject: [PATCH] sun50i target - sun50i include - added orange-pi-pc2.conf - added u-boot and linux: mainline - updated sdcard_image-sunxi.bbclass to build the image for sun50i board --- .gitignore | 1 + classes/sdcard_image-sunxi.bbclass | 26 +- conf/machine/include/sun50i.inc | 11 + conf/machine/include/sunxi.inc | 2 + conf/machine/orange-pi-pc2.conf | 13 + recipes-bsp/u-boot/u-boot-sun50i/bl31.bin | Bin 0 -> 32776 bytes recipes-bsp/u-boot/u-boot-sun50i/boot.cmd | 11 + recipes-bsp/u-boot/u-boot-sun50i_2017.09.bb | 52 + recipes-kernel/linux/linux-sun50i/defconfig | 5600 +++++++++++++++++++ recipes-kernel/linux/linux-sun50i_4.13.bb | 28 + 10 files changed, 5740 insertions(+), 4 deletions(-) create mode 100644 .gitignore create mode 100644 conf/machine/include/sun50i.inc create mode 100644 conf/machine/orange-pi-pc2.conf create mode 100644 recipes-bsp/u-boot/u-boot-sun50i/bl31.bin create mode 100644 recipes-bsp/u-boot/u-boot-sun50i/boot.cmd create mode 100644 recipes-bsp/u-boot/u-boot-sun50i_2017.09.bb create mode 100644 recipes-kernel/linux/linux-sun50i/defconfig create mode 100644 recipes-kernel/linux/linux-sun50i_4.13.bb diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b25c15b --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*~ diff --git a/classes/sdcard_image-sunxi.bbclass b/classes/sdcard_image-sunxi.bbclass index eef0612..d07ff9c 100644 --- a/classes/sdcard_image-sunxi.bbclass +++ b/classes/sdcard_image-sunxi.bbclass @@ -66,6 +66,12 @@ IMAGE_CMD_sunxi-sdimg () { mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin ::uImage + # Clean device tree dir target + if [ ${SOC_FAMILY} = "sun50i" ]; then + mkdir -p ${DEPLOY_DIR_IMAGE}/${MANUFACTURER} + rm -rf ${DEPLOY_DIR_IMAGE}/${MANUFACTURER}/* + fi + # Copy device tree file if test -n "${KERNEL_DEVICETREE}"; then for DTS_FILE in ${KERNEL_DEVICETREE}; do @@ -74,10 +80,17 @@ IMAGE_CMD_sunxi-sdimg () { kernel_bin="`readlink ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${MACHINE}.bin`" kernel_bin_for_dtb="`readlink ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb | sed "s,$DTS_BASE_NAME,${MACHINE},g;s,\.dtb$,.bin,g"`" if [ $kernel_bin = $kernel_bin_for_dtb ]; then - mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb ::/${DTS_BASE_NAME}.dtb + if [ ${SOC_FAMILY} = "sun50i" ]; then + cp ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb ${DEPLOY_DIR_IMAGE}/${MANUFACTURER}/${DTS_BASE_NAME}.dtb + else + mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${KERNEL_IMAGETYPE}-${DTS_BASE_NAME}.dtb ::/${DTS_BASE_NAME}.dtb + fi fi fi done + if [ ${SOC_FAMILY} = "sun50i" ]; then + mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/${MANUFACTURER} :: + fi fi if [ -e "${DEPLOY_DIR_IMAGE}/fex.bin" ] @@ -104,7 +117,12 @@ IMAGE_CMD_sunxi-sdimg () { dd if=${SDIMG_ROOTFS} of=${SDIMG} conv=notrunc seek=1 bs=$(expr 1024 \* ${BOOT_SPACE_ALIGNED} + ${IMAGE_ROOTFS_ALIGNMENT} \* 1024) && sync && sync fi - #write u-boot and spl at the beginint of sdcard in one shot - dd if=${DEPLOY_DIR_IMAGE}/u-boot-sunxi-with-spl.bin of=${SDIMG} bs=1024 seek=8 conv=notrunc - + # Write u-boot and spl at the beginning of sdcard + if [ ${SOC_FAMILY} = "sun50i" ] + then + dd if=${DEPLOY_DIR_IMAGE}/sunxi-spl.bin of=${SDIMG} bs=1024 seek=8 conv=notrunc + dd if=${DEPLOY_DIR_IMAGE}/u-boot.itb of=${SDIMG} bs=1024 seek=40 conv=notrunc + else + dd if=${DEPLOY_DIR_IMAGE}/u-boot-sunxi-with-spl.bin of=${SDIMG} bs=1024 seek=8 conv=notrunc + fi } diff --git a/conf/machine/include/sun50i.inc b/conf/machine/include/sun50i.inc new file mode 100644 index 0000000..19de034 --- /dev/null +++ b/conf/machine/include/sun50i.inc @@ -0,0 +1,11 @@ +require conf/machine/include/sunxi.inc +require conf/machine/include/sunxi-mali.inc +require conf/machine/include/arm/arch-armv8.inc + +SOC_FAMILY = "sun50i" + +PREFERRED_PROVIDER_virtual/kernel = "linux-sun50i" +PREFERRED_PROVIDER_u-boot = "u-boot-sun50i" +PREFERRED_PROVIDER_virtual/bootloader = "u-boot-sun50i" + +KERNEL_IMAGETYPE = "Image" diff --git a/conf/machine/include/sunxi.inc b/conf/machine/include/sunxi.inc index ef03bed..418fdd4 100644 --- a/conf/machine/include/sunxi.inc +++ b/conf/machine/include/sunxi.inc @@ -5,6 +5,8 @@ include conf/machine/include/soc-family.inc MACHINE_SOCARCH_SUFFIX ?= "" MACHINE_SOCARCH_SUFFIX_sun4i = "-sun4i" +MANUFACTURER ?= "allwinner" + PREFERRED_PROVIDER_virtual/xserver = "xserver-xorg" XSERVER = "xserver-xorg \ xf86-video-fbturbo \ diff --git a/conf/machine/orange-pi-pc2.conf b/conf/machine/orange-pi-pc2.conf new file mode 100644 index 0000000..0c2e079 --- /dev/null +++ b/conf/machine/orange-pi-pc2.conf @@ -0,0 +1,13 @@ +#@TYPE: Machine +#@NAME: orange-pi-pc2 +#@DESCRIPTION: Machine configuration for the orange-pi-pc2, base on allwinner H5 CPU + +require conf/machine/include/sun50i.inc + +PREFERRED_VERSION_linux = "4.13+git%" +PREFERRED_VERSION_u-boot = "v2017.09%" + +KERNEL_DEVICETREE = "${MANUFACTURER}/sun50i-h5-orangepi-pc2.dtb" +UBOOT_MACHINE = "orangepi_pc2_defconfig" + +DEFAULTTUNE = "aarch64" diff --git a/recipes-bsp/u-boot/u-boot-sun50i/bl31.bin b/recipes-bsp/u-boot/u-boot-sun50i/bl31.bin new file mode 100644 index 0000000000000000000000000000000000000000..8f2f69f8700ba654af6f7e3566fc254e6cbce96f GIT binary patch literal 32776 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 R#ADyp*9nLKz*8C~2yQTez-xb3;?R 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