From de142c03a8bf2da3d0bdcfa0ac9260d1fe393b3b Mon Sep 17 00:00:00 2001 From: cronyx <xcronyx@gmail.com> Date: Tue, 31 May 2022 21:07:54 +0300 Subject: [PATCH 1/9] add config and workflow for hi3516av100 ultimate --- .../workflows/hi3516av100_ultimate_images.yml | 138 ++++++++++++++++++ .../unknown_unknown_gk7205v200_fpv_defconfig | 2 +- .../unknown_unknown_gk7205v300_fpv_defconfig | 2 +- .../kernel/hi3516av100.generic.config | 7 +- ...own_unknown_hi3516av100_ultimate_defconfig | 108 ++++++++++++++ building.sh | 6 + .../package/majestic-hi3516av100/Config.in | 4 + .../majestic-hi3516av100.mk | 6 + 8 files changed, 270 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/hi3516av100_ultimate_images.yml create mode 100644 br-ext-chip-hisilicon/configs/unknown_unknown_hi3516av100_ultimate_defconfig diff --git a/.github/workflows/hi3516av100_ultimate_images.yml b/.github/workflows/hi3516av100_ultimate_images.yml new file mode 100644 index 00000000..f01a412d --- /dev/null +++ b/.github/workflows/hi3516av100_ultimate_images.yml @@ -0,0 +1,138 @@ +name: "Hi3516Av100 (ultimate)" + +on: + push: + branches: + - production + tags: + - "v*" + schedule: + - cron: "00 03 * * *" + workflow_dispatch: + +jobs: + build_core: + name: OpenIPC firmware for Hi3516Av100 (ultimate) + runs-on: ubuntu-latest + + steps: + + - name: Checkout + id: checkout + uses: actions/checkout@v2 + + - name: Install build dependencies + id: install + run: | + make install-deps + mkdir -p tmp + + - name: Free disk space + id: freshing + run: | + sudo swapoff -a + sudo rm -f /swapfile + sudo apt clean + docker rmi $(docker image ls -aq) + df -h + + - name: Prepare buildroot + id: prepare + run: | + HEAD_TAG=$(git tag --points-at HEAD) + GIT_HASH=$(git rev-parse --short $GITHUB_SHA) + BRANCH_NAME=$(echo $GITHUB_REF | cut -d'/' -f 3) + if [ -z "$HEAD_TAG" ]; then + TAG_NAME="latest" + RELEASE_NAME="Development Build" + PRERELEASE=true + else + TAG_NAME=${{ github.ref }} + RELEASE_NAME="Release ${{ github.ref }}" + PRERELEASE=false + fi + echo "GIT_HASH=$GIT_HASH" >> $GITHUB_ENV + echo "TAG_NAME=$TAG_NAME" >> $GITHUB_ENV + echo "RELEASE_NAME=$RELEASE_NAME" >> $GITHUB_ENV + echo "PRERELEASE=$PRERELEASE" >> $GITHUB_ENV + echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV + echo "BOARD=hi3516av100" >> $GITHUB_ENV + cd $GITHUB_WORKSPACE + make prepare + + - name: Build Hi3516Av100 (ultimate) firmware + id: build-hi3516av100-ultimate-firmware + continue-on-error: true + run: | + ARCHIVE_FW="${GITHUB_WORKSPACE}/output/images/openipc.${BOARD}-ultimate-br.tgz" + ARCHIVE_FW_NAND="${GITHUB_WORKSPACE}/output/images/openipc.${BOARD}-nand-br.tgz" + echo "ARCHIVE_FW=$ARCHIVE_FW" >> $GITHUB_ENV + echo "ARCHIVE_FW_NAND=$ARCHIVE_FW_NAND" >> $GITHUB_ENV + cd $GITHUB_WORKSPACE + make PLATFORM=hisilicon BOARD=unknown_unknown_${BOARD}_ultimate all + [[ $(stat --printf="%s" ${GITHUB_WORKSPACE}/output/images/uImage) -gt 3145728 ]] && echo "TG_NOTIFY=Warning, kernel size exceeded : $(stat --printf="%s" ${GITHUB_WORKSPACE}/output/images/uImage) ... ${BOARD} (ultimate)" >> $GITHUB_ENV && exit 1 + [[ $(stat --printf="%s" ${GITHUB_WORKSPACE}/output/images/rootfs.squashfs) -gt 10485760 ]] && echo "TG_NOTIFY=Warning, rootfs size exceeded - $(stat --printf="%s" ${GITHUB_WORKSPACE}/output/images/rootfs.squashfs) vs 10485760... ${BOARD} (ultimate)" >> $GITHUB_ENV && exit 1 + cd ${GITHUB_WORKSPACE}/output/images + mv uImage uImage.${BOARD} + mv rootfs.squashfs rootfs.squashfs.${BOARD} + mv rootfs.ubi rootfs.ubi.${BOARD} + mv rootfs.ubifs rootfs.ubifs.${BOARD} + md5sum rootfs.squashfs.${BOARD} > rootfs.squashfs.${BOARD}.md5sum + md5sum uImage.${BOARD} > uImage.${BOARD}.md5sum + md5sum rootfs.ubifs.${BOARD} > rootfs.ubifs.${BOARD}.md5sum + md5sum uImage.${BOARD} > uImage.${BOARD}.md5sum + tar -cvzf $ARCHIVE_FW uImage* *rootfs.squashfs.${BOARD}* + tar -cvzf $ARCHIVE_FW_NAND uImage* *rootfs.ubi*.${BOARD}* + + - name: Send warning message to telegram channel + env: + TG_TOKEN: ${{ secrets.TELEGRAM_TOKEN_BOT_OPENIPC }} + TG_CHANNEL: ${{ secrets.TELEGRAM_CHANNEL_OPENIPC_DEV }} + if: steps.build-hi3516av100-ultimate-firmware.outcome != 'success' + run: | + TG_OPTIONS="-s --connect-timeout 30 --max-time 30" + TG_NOTIFY="${TG_NOTIFY:=Warning, Buildroot compiling error... ${BOARD} (ultimate)}" + TG_HEADER=$(echo -e "\r\n$TG_NOTIFY \r\n\r\nCommit: $GIT_HASH \r\nBranch: $BRANCH_NAME \r\nTag: $TAG_NAME \r\n\r\n\xE2\x9A\xA0 GitHub Actions") + curl $TG_OPTIONS -H "Content-Type: multipart/form-data" -X POST https://api.telegram.org/bot$TG_TOKEN/sendMessage \ + -F chat_id=$TG_CHANNEL -F text="$TG_HEADER" + + - name: Create release + uses: actions/create-release@v1 + continue-on-error: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ env.TAG_NAME }} + release_name: ${{ env.RELEASE_NAME }} + draft: false + prerelease: ${{ env.PRERELEASE }} + + - name: Upload FW to release + uses: svenstaro/upload-release-action@v2 + continue-on-error: true + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: ${{ env.ARCHIVE_FW }} + asset_name: openipc.${{ env.BOARD }}-ultimate-br.tgz + tag: ${{ env.TAG_NAME }} + overwrite: true + + - name: Upload FW to release + uses: svenstaro/upload-release-action@v2 + continue-on-error: true + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: ${{ env.ARCHIVE_FW_NAND }} + asset_name: openipc.${{ env.BOARD }}-nand-br.tgz + tag: ${{ env.TAG_NAME }} + overwrite: true + + - name: Send binary file to telegram channel + env: + TG_TOKEN: ${{ secrets.TELEGRAM_TOKEN_BOT_OPENIPC }} + TG_CHANNEL: ${{ secrets.TELEGRAM_CHANNEL_OPENIPC_DEV }} + run: | + TG_OPTIONS="-s --connect-timeout 30 --max-time 30" + TG_HEADER=$(echo -e "\r\nCommit: $GIT_HASH \r\nBranch: $BRANCH_NAME \r\nTag: $TAG_NAME \r\n\r\n\xE2\x9C\x85 GitHub Actions") + curl $TG_OPTIONS -H "Content-Type: multipart/form-data" -X POST https://api.telegram.org/bot$TG_TOKEN/sendDocument \ + -F chat_id=$TG_CHANNEL -F document="@$ARCHIVE_FW" -F caption="$TG_HEADER" diff --git a/br-ext-chip-goke/configs/unknown_unknown_gk7205v200_fpv_defconfig b/br-ext-chip-goke/configs/unknown_unknown_gk7205v200_fpv_defconfig index c92fdcc7..e2a6400e 100644 --- a/br-ext-chip-goke/configs/unknown_unknown_gk7205v200_fpv_defconfig +++ b/br-ext-chip-goke/configs/unknown_unknown_gk7205v200_fpv_defconfig @@ -71,7 +71,7 @@ BR2_PACKAGE_LIBWEBSOCKETS_OPENIPC=y BR2_PACKAGE_LIBYAML=y BR2_PACKAGE_MAJESTIC_FONTS=y BR2_PACKAGE_MAJESTIC_GK7205V200=y -# BR2_PACKAGE_MAJESTIC_FPV=y +# BR2_PACKAGE_MAJESTIC_FPV is not set BR2_PACKAGE_MBEDTLS_OPENIPC=y # BR2_PACKAGE_MBEDTLS_OPENIPC_PROGRAMS is not set # BR2_PACKAGE_MBEDTLS_OPENIPC_COMPRESSION is not set diff --git a/br-ext-chip-goke/configs/unknown_unknown_gk7205v300_fpv_defconfig b/br-ext-chip-goke/configs/unknown_unknown_gk7205v300_fpv_defconfig index 29146c20..47da9951 100644 --- a/br-ext-chip-goke/configs/unknown_unknown_gk7205v300_fpv_defconfig +++ b/br-ext-chip-goke/configs/unknown_unknown_gk7205v300_fpv_defconfig @@ -71,7 +71,7 @@ BR2_PACKAGE_LIBWEBSOCKETS_OPENIPC=y BR2_PACKAGE_LIBYAML=y BR2_PACKAGE_MAJESTIC_FONTS=y BR2_PACKAGE_MAJESTIC_GK7205V200=y -# BR2_PACKAGE_MAJESTIC_FPV=y +# BR2_PACKAGE_MAJESTIC_FPV is not set BR2_PACKAGE_MBEDTLS_OPENIPC=y # BR2_PACKAGE_MBEDTLS_OPENIPC_PROGRAMS is not set # BR2_PACKAGE_MBEDTLS_OPENIPC_COMPRESSION is not set diff --git a/br-ext-chip-hisilicon/board/hi3516av100/kernel/hi3516av100.generic.config b/br-ext-chip-hisilicon/board/hi3516av100/kernel/hi3516av100.generic.config index 2f047716..dd987055 100644 --- a/br-ext-chip-hisilicon/board/hi3516av100/kernel/hi3516av100.generic.config +++ b/br-ext-chip-hisilicon/board/hi3516av100/kernel/hi3516av100.generic.config @@ -927,7 +927,12 @@ CONFIG_HISFC350_CHIP_NUM=2 CONFIG_HISFC350_ENABLE_CHIPSELECT_1=y # CONFIG_HISFC350_ENABLE_INTR_DMA is not set # CONFIG_CMD_SPI_BLOCK_PROTECTION is not set -# CONFIG_MTD_UBI is not set +CONFIG_MTD_UBI=y +CONFIG_MTD_UBI_WL_THRESHOLD=4096 +CONFIG_MTD_UBI_BEB_LIMIT=20 +# CONFIG_MTD_UBI_FASTMAP is not set +# CONFIG_MTD_UBI_GLUEBI is not set +CONFIG_MTD_UBI_BLOCK=y CONFIG_DTC=y CONFIG_OF=y # CONFIG_OF_UNITTEST is not set diff --git a/br-ext-chip-hisilicon/configs/unknown_unknown_hi3516av100_ultimate_defconfig b/br-ext-chip-hisilicon/configs/unknown_unknown_hi3516av100_ultimate_defconfig new file mode 100644 index 00000000..c8bbfdea --- /dev/null +++ b/br-ext-chip-hisilicon/configs/unknown_unknown_hi3516av100_ultimate_defconfig @@ -0,0 +1,108 @@ +# Architecture +BR2_arm=y +BR2_cortex_a7=y +BR2_ARM_EABI=y +BR2_ARM_FPU_NEON_VFPV4=y +BR2_ARM_INSTRUCTIONS_THUMB2=y +BR2_KERNEL_HEADERS_VERSION=y +BR2_DEFAULT_KERNEL_VERSION="4.9.37" +BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_4_9=y + +# Toolchain +BR2_PER_PACKAGE_DIRECTORIES=y +BR2_GCC_VERSION_7_X=y +# BR2_TOOLCHAIN_USES_UCLIBC is not set +# BR2_TOOLCHAIN_BUILDROOT_UCLIBC is not set +# BR2_TOOLCHAIN_BUILDROOT_LIBC="uclibc" +BR2_TOOLCHAIN_USES_MUSL=y +BR2_TOOLCHAIN_BUILDROOT_MUSL=y +BR2_TOOLCHAIN_BUILDROOT_LIBC="musl" +BR2_TOOLCHAIN_BUILDROOT_CXX=y +BR2_TOOLCHAIN_BUILDROOT_LOCALE=y +BR2_TOOLCHAIN_BUILDROOT_USE_SSP=y + +# Kernel +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_CUSTOM_VERSION=y +BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="4.9.37" +BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL_HISILICON_PATH)/board/hi3516av100/kernel/hi3516av100.generic.config" +BR2_LINUX_KERNEL_UIMAGE=y +BR2_LINUX_KERNEL_XZ=y +BR2_LINUX_KERNEL_EXT_HISI_PATCHER=y +BR2_LINUX_KERNEL_EXT_HISI_PATCHER_LIST="$(BR2_EXTERNAL_HISILICON_PATH)/board/hi3516av100/kernel/patches/ $(BR2_EXTERNAL_HISILICON_PATH)/board/hi3516av100/kernel/overlay" + +# Filesystem +# BR2_TARGET_TZ_INFO is not set +BR2_TARGET_ROOTFS_CPIO=y +BR2_TARGET_ROOTFS_SQUASHFS=y +BR2_TARGET_ROOTFS_SQUASHFS4_XZ=y +BR2_TARGET_ROOTFS_UBI=y +BR2_TARGET_ROOTFS_UBI_SUBSIZE=2048 +BR2_TARGET_ROOTFS_UBI_USE_CUSTOM_CONFIG=y +BR2_TARGET_ROOTFS_UBI_CUSTOM_CONFIG_FILE="$(TOPDIR)/../scripts/ubinize.cfg" +BR2_TARGET_ROOTFS_UBIFS_LEBSIZE=0x1f000 +BR2_ROOTFS_OVERLAY="$(TOPDIR)/../general/overlay" +BR2_ROOTFS_POST_BUILD_SCRIPT="$(TOPDIR)/../scripts/executing_commands_for_$(BR2_TOOLCHAIN_BUILDROOT_LIBC).sh" + +# OpenIPC configuration +BR2_TOOLCHAIN_BUILDROOT_VENDOR="openipc" +BR2_TARGET_GENERIC_ISSUE="Welcome to OpenIPC v2.2" +BR2_TARGET_GENERIC_HOSTNAME="openipc-hi3516av100-ultimate" +BR2_GLOBAL_PATCH_DIR="$(TOPDIR)/../general/package/all-patches" + +# OpenIPC packages +BR2_PACKAGE_BUSYBOX_CONFIG="$(TOPDIR)/../general/package/busybox/busybox.config" +BR2_PACKAGE_DROPBEAR_OPENIPC=y +# BR2_PACKAGE_FDK_AAC_OPENIPC is not set +BR2_PACKAGE_FWPRINTENV_OPENIPC=y +BR2_PACKAGE_HASERL=y +BR2_PACKAGE_HISI_GPIO is not set +BR2_PACKAGE_HISILICON_OSDRV_HI3516AV100=y +BR2_PACKAGE_IPCTOOL=y +BR2_PACKAGE_JSON_C=y +BR2_PACKAGE_LAME_OPENIPC=y +BR2_PACKAGE_LIBCURL_OPENIPC=y +BR2_PACKAGE_LIBCURL_OPENIPC_CURL=y +# BR2_PACKAGE_LIBCURL_OPENIPC_VERBOSE is not set +# BR2_PACKAGE_LIBCURL_OPENIPC_PROXY_SUPPORT is not set +# BR2_PACKAGE_LIBCURL_OPENIPC_COOKIES_SUPPORT is not set +# BR2_PACKAGE_LIBCURL_OPENIPC_EXTRA_PROTOCOLS_FEATURES is not set +BR2_PACKAGE_LIBCURL_OPENIPC_MBEDTLS=y +BR2_PACKAGE_LIBEVENT_OPENIPC=y +BR2_PACKAGE_LIBEVENT_OPENIPC_REMOVE_PYSCRIPT=y +BR2_PACKAGE_LIBOGG_OPENIPC=y +BR2_PACKAGE_LIBWEBSOCKETS_OPENIPC=y +BR2_PACKAGE_LIBYAML=y +BR2_PACKAGE_MAJESTIC_FONTS=y +BR2_PACKAGE_MAJESTIC_HI3516AV100=y +# BR2_PACKAGE_MAJESTIC_ULTIMATE is not set +BR2_PACKAGE_MBEDTLS_OPENIPC=y +# BR2_PACKAGE_MBEDTLS_OPENIPC_PROGRAMS is not set +# BR2_PACKAGE_MBEDTLS_OPENIPC_COMPRESSION is not set +BR2_PACKAGE_MICROBE_WEB=y +# BR2_PACKAGE_MINI_SNMPD is not set +BR2_PACKAGE_MOTORS=y +BR2_PACKAGE_OPUS_OPENIPC=y +BR2_PACKAGE_OPUS_OPENIPC_FIXED_POINT=y +# BR2_PACKAGE_SSHPASS is not set +BR2_PACKAGE_UACME_OPENIPC=y +BR2_PACKAGE_VTUND_OPENIPC=y +BR2_PACKAGE_YAML_CLI=y + +# WiFi +BR2_PACKAGE_WIRELESS_TOOLS=y +BR2_PACKAGE_WPA_SUPPLICANT=y +BR2_PACKAGE_WPA_SUPPLICANT_CLI=y +BR2_PACKAGE_WPA_SUPPLICANT_NL80211=y +BR2_PACKAGE_WPA_SUPPLICANT_PASSPHRASE=y +BR2_PACKAGE_LINUX_FIRMWARE_OPENIPC=y +BR2_PACKAGE_LINUX_FIRMWARE_OPENIPC_MT7601U=y +# BR2_PACKAGE_RTL8188EU is not set + +# WIREGUARD +BR2_PACKAGE_WIREGUARD_LINUX_COMPAT=y +BR2_PACKAGE_WIREGUARD_TOOLS=y + +# ZEROTIER +BR2_PACKAGE_ZEROTIER_ONE=y diff --git a/building.sh b/building.sh index 58071ed0..0fabc07b 100755 --- a/building.sh +++ b/building.sh @@ -274,6 +274,11 @@ hi3516av100() { fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename } +hi3516av100_ultimate() { + soc="hi3516av100" + fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_ultimate all && rename +} + hi3516dv100() { soc="hi3516dv100" fresh && make PLATFORM=hisilicon BOARD=unknown_unknown_${soc}_openipc all && rename @@ -605,6 +610,7 @@ xm550() { # hi3518ev200_hs303v3 # OpenIPC # # hi3516av100 # OpenIPC +# hi3516av100_ultimate # OpenIPC_ultimate version # hi3516dv100 # OpenIPC # # hi3516cv300 # OpenIPC diff --git a/general/package/majestic-hi3516av100/Config.in b/general/package/majestic-hi3516av100/Config.in index 4fd81742..b076d881 100644 --- a/general/package/majestic-hi3516av100/Config.in +++ b/general/package/majestic-hi3516av100/Config.in @@ -5,3 +5,7 @@ config BR2_PACKAGE_MAJESTIC_HI3516AV100 Tiny but powerful IPC streaming software https://openipc.org + +config BR2_PACKAGE_MAJESTIC_ULTIMATE + bool "Use this option for the ultimate build" + default n diff --git a/general/package/majestic-hi3516av100/majestic-hi3516av100.mk b/general/package/majestic-hi3516av100/majestic-hi3516av100.mk index af49b082..946dafce 100644 --- a/general/package/majestic-hi3516av100/majestic-hi3516av100.mk +++ b/general/package/majestic-hi3516av100/majestic-hi3516av100.mk @@ -10,6 +10,12 @@ MAJESTIC_HI3516AV100_SITE = https://openipc.s3-eu-west-1.amazonaws.com MAJESTIC_HI3516AV100_LICENSE = MIT MAJESTIC_HI3516AV100_LICENSE_FILES = LICENSE +ifeq ($(BR2_PACKAGE_MAJESTIC_ULTIMATE),y) +MAJESTIC_HI3516AV100_SOURCE = majestic.hi3516av100.ultimate.master.tar.bz2 +else +MAJESTIC_HI3516AV100_SOURCE = majestic.hi3516av100.lite.master.tar.bz2 +endif + define MAJESTIC_HI3516AV100_INSTALL_TARGET_CMDS $(INSTALL) -m 755 -d $(TARGET_DIR)/etc $(INSTALL) -m 644 $(@D)/majestic-mini.yaml $(TARGET_DIR)/etc/majestic.yaml From 39876d430946cbe86924364d4466afc6291d97a1 Mon Sep 17 00:00:00 2001 From: Dmitry Ermakov <de@dimer.org.ua> Date: Wed, 1 Jun 2022 01:05:15 +0300 Subject: [PATCH 2/9] Get sensor from JZ structures --- general/package/ingenic-osdrv-t31/files/script/S95ingenic | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/general/package/ingenic-osdrv-t31/files/script/S95ingenic b/general/package/ingenic-osdrv-t31/files/script/S95ingenic index bf396dc1..06a4b1d7 100755 --- a/general/package/ingenic-osdrv-t31/files/script/S95ingenic +++ b/general/package/ingenic-osdrv-t31/files/script/S95ingenic @@ -37,7 +37,8 @@ start() { load_ingenic # # - export SENSOR=$(fw_printenv -n sensor) + # export SENSOR=$(fw_printenv -n sensor) + export SENSOR=$(cat /proc/jz/sinfo/info | sed -e 's/.*://') load_majestic } From 1613f4101641276eb25e3046c142e64add5e8546 Mon Sep 17 00:00:00 2001 From: Dmitry Ermakov <de@dimer.org.ua> Date: Wed, 1 Jun 2022 01:12:57 +0300 Subject: [PATCH 3/9] Add SC5235 for T31 --- .../files/script/load_ingenic | 42 ++++++++++--------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/general/package/ingenic-osdrv-t31/files/script/load_ingenic b/general/package/ingenic-osdrv-t31/files/script/load_ingenic index bf2350d4..e516e99e 100755 --- a/general/package/ingenic-osdrv-t31/files/script/load_ingenic +++ b/general/package/ingenic-osdrv-t31/files/script/load_ingenic @@ -33,30 +33,34 @@ check_return "get sensor type" SENSOR=${SENSOR_INFO#*:} case ${SENSOR} in - "sc2232") - ISP_PARAM="isp_clk=125000000" - SENSOR_PARAM="" +"sc2232") + ISP_PARAM="isp_clk=125000000" + SENSOR_PARAM="" ;; - "sc2135") - ISP_PARAM="isp_clk=100000000" - SENSOR_PARAM="" +"sc2135") + ISP_PARAM="isp_clk=100000000" + SENSOR_PARAM="" ;; - "sc2335") - ISP_PARAM="isp_clk=100000000 isp_ch0_pre_dequeue_time=20 isp_ch0_pre_dequeue_interrupt_process=0 isp_memopt=1" - SENSOR_PARAM="" +"sc2335") + ISP_PARAM="isp_clk=100000000 isp_ch0_pre_dequeue_time=20 isp_ch0_pre_dequeue_interrupt_process=0 isp_memopt=1" + SENSOR_PARAM="" ;; - "gc2053") - ISP_PARAM="isp_clk=125000000" - SENSOR_PARAM="sensor_max_fps=25 data_interface=1" +"sc5235") + ISP_PARAM="isp_clk=200000000" + SENSOR_PARAM="" ;; - "imx307") - ISP_PARAM="isp_clk=125000000 ispw=1920 isph=1080 isptop=20 ispleft=12" - SENSOR_PARAM="" +"gc2053") + ISP_PARAM="isp_clk=125000000" + SENSOR_PARAM="sensor_max_fps=25 data_interface=1" ;; - *) - ISP_PARAM="isp_clk=125000000" - SENSOR_PARAM="" - break +"imx307") + ISP_PARAM="isp_clk=125000000 ispw=1920 isph=1080 isptop=20 ispleft=12" + SENSOR_PARAM="" + ;; +*) + ISP_PARAM="isp_clk=125000000" + SENSOR_PARAM="" + break ;; esac From 6d8e72e9e1d636c31933cf655382dd8cb0dda495 Mon Sep 17 00:00:00 2001 From: Dmitry Ermakov <de@dimer.org.ua> Date: Wed, 1 Jun 2022 01:17:45 +0300 Subject: [PATCH 4/9] Add SC5235 sensor params --- .../files/sensor/params/sc5235-t31.bin | Bin 0 -> 159736 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 general/package/ingenic-osdrv-t31/files/sensor/params/sc5235-t31.bin diff --git a/general/package/ingenic-osdrv-t31/files/sensor/params/sc5235-t31.bin b/general/package/ingenic-osdrv-t31/files/sensor/params/sc5235-t31.bin new file mode 100644 index 0000000000000000000000000000000000000000..0159cd6f245cf9c3cbc9423e90ded8fa73118d30 GIT binary patch literal 159736 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 O9_y=Kt6M;ydHr83&ttOy literal 0 HcmV?d00001 From ed09b07f669b9c6f46574f7c86183a8c4b3c5ea0 Mon Sep 17 00:00:00 2001 From: Dmitry Ermakov <de@dimer.org.ua> Date: Thu, 2 Jun 2022 17:17:14 +0300 Subject: [PATCH 5/9] [T31] Add ircut module for HICHIP boards --- .../ingenic-osdrv-t31/files/kmod/ircut.ko | Bin 0 -> 4392 bytes .../ingenic-osdrv-t31/files/script/load_ingenic | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 general/package/ingenic-osdrv-t31/files/kmod/ircut.ko diff --git a/general/package/ingenic-osdrv-t31/files/kmod/ircut.ko b/general/package/ingenic-osdrv-t31/files/kmod/ircut.ko new file mode 100644 index 0000000000000000000000000000000000000000..81933594dcec100f08b393a63db68b92ea5d968d GIT binary patch literal 4392 zcmd^CON<=V6}??OJu}86v<KsiiAidp85`o1yJtpxtXOJ1#`Z)58Jrlrh*a*We$!KN zcU99>Wd_LzD|q1rXiTJtC|Lw4ELb3!AQndAlSP!jBClC_>1_B3h$Dq`&Z&BDx_Sfz zd7ImMbwBUEbMJkh>UvK<xOliwD2SngjLSe1*)=9oD9h4Z>aa(4$xa!8ydABGcI4sX za?gL_7h1n8d^-2U-~aK4$KE}@_fKozO5O1omn+4o@_=9IzqMOr<a;6(+QG`CymoQB z{PyB5dFSHP`QJ%dUcESV;YEx*SNXG)DqF7AWvYrC<o4-Fd1n32@*`3y&m(r7DS)a! z?Mr#4B=w1cSe0Ak;EvBevnog%QANhYnz&y^Dqk1bL5|$ZQ+t@t#E$*Y3y5KIVJuSW zgVF!$%LILihy2!&>pF5>M~>^P%a*rx?*!CGeXBBD*SU(RiS@BgVzag}sRMZ%YUdo( zrng+PE!MgNdG-5c<T3&Kv1#VY*cfL`ovjOVO=Z~V!+!c1+i?FdHgm@sSf7{wRjdc| zLU_b2PjAOMY`G>D@yUssUoY0deBqbQL)NzwW6#0w{@vqZ7bh_<XJqU(W}2t>pBC{0 zubnj2zP2AEYx_>AUZC2}s)!dR?WP@svE5TGKZ;e)_Iq9u+f8-a_mq7DfV83KpJs31 z$99x>o{FNCq&)?XrrI<XgVHe=dr~LTNaEG7ci`v=X#+Nh)PW;Qi|A{rt_qsb0ReWW z(ek|mvret*)aG2*k4|^p=!r())|{&A+TET~oo;M*!ls)9?Xc0bA6i)Y;p~iitY**7 z99;O3t%HH}(Yk1uoa?4^BX1f#zDd6x)y&QHjQzhIb7X#gzrAN6XsN*W?B0ws>&)6S z)!IEyZRRd}&bil_!CUdGIDO$1-iDrUqkYjDoBnKHjGg^=zt3%!l8vY7&n*9|zc4g@ zGB^H#o1nCUL<)GD%1BY1=*dppSO$-K8DBLLPOfs`>ntaJyZK$eDNYY3J63CPCaw5u zNjDRDbaOpwEvL5pU?qfG*lffN#;G}T=_uD#Yc7Jel{h$g+6^J-nBg)!-YciVz*A1V z>PIdd6AoC8B5}O1(@}v=r`zmFnr|bHd;W3~D|mF8YB^~+jb(opi};o4oABfe;YFSj z|10z7eMH-d$^X_-t)B$HqGd93&K<~G(CTQUGh6X52YxFWV-Syf125enygI=1d&c~a z-v_@u-YdYPAMuD~@Qy&v=XVs!CD;s^I_6=><Gl{NHQ0#9+6>;Kkn?y<{se4>4Bjyq z@_2i16j_3ec+At_H6R1OYv%a`gh|*8(U1C1&=}XOAqOx&L-b?+Q<@vRs}S<@XYzXz ze);^)AV01Z^MkmN-+9QyHFzIDScPuL;Qbs1`tkdTbP~daOiZ7|COwaqkNYfwRbgXX z9!=sg-(REU@jd`vod!)N?ysQd@!rhUu?>9&?+wVrHThLbP;zAQdmA=}VNN9aeLoY^ zC;Qm`s(EU};|%;>Gzz%M?~jo4`TY&~?SYN;-lF}O*JZR%`uz|rrCrz*CMOz9=~r?x z?R(9^qXII1tliW~JN@3Hpvm}=o3&-v$H?z83_Sn0qp=R=!5Z>-zsF)V4G8*-$h}&+ z8{gRAqu~6YEdlI4>fkR?|BlGZ)WJz3h{rgk8?wDO3eGtx-KBBB_fp5i@jWyO&h;rF z2;Uc@;76&$X^}d3oBD2%m^%0ca*TVHcKn(Af;#v(^*eQ3aJWbbg#$uH!7J2}PZ}4z zP8~M^#v27cL>+?`sdF&M()C!FFxF*_WpONwC!TdjHjaKv+W&;+Z<0@AzA&K{ovFjm z*1WFyNpgUnCCA?TGAeGYPUck{T5+x`fO1sac$*vl@mw$cQAm!8f|q5Eis>6<U?>W1 zDmf~qCw*Wj3U}*(igNQnfmBR)(ZEzpPflL{#z0B^Cx<E?kq`SfY7bUo;l~k_jgBQr z_xWYrzYm;r3C+TM>`%39{R+tckk-?61IiDy&Y3BoUJsly<5FJ(ub{P4{U&(^d_Y^} zJe0`|!&Z3?GWT{yTjggEer#0C_X`^`_t=O1-$3Vho>Rtq9efJyu-5+qZm105U9Hry z&$i)rRqL#00`>e;>tysd*Xc`;Comsh!#G3izhjer_a>eD*%18?Z_*#zq|2)Brr+|8 zm)&>V5SJM(dhIY$TJ}RPZW|dNVOqo$OH2F|6W2Zd@WLa<A9NQEx!HB8He}Nmr>Y*a z5_Ti0EY4T?sPQqw$86TkZ#AUl>Q6CO-?N4Q&6TSv9Y6BmVy<!U%74arZPf^puKB8K zb^Xv?!DS4WN<SX5HvOLRVm}PrFp0ZKEZv?T#HTX+9D2uZt;TNDR;r6wDPW{x_jIG3 OC`r|xdOT54EdK?JBL<ED literal 0 HcmV?d00001 diff --git a/general/package/ingenic-osdrv-t31/files/script/load_ingenic b/general/package/ingenic-osdrv-t31/files/script/load_ingenic index e516e99e..101613bd 100755 --- a/general/package/ingenic-osdrv-t31/files/script/load_ingenic +++ b/general/package/ingenic-osdrv-t31/files/script/load_ingenic @@ -87,3 +87,5 @@ if [ $? -ne 0 ]; then insmod ${KMOD_PATH/%\//}/sensor_${SENSOR}_t31.ko ${SENSOR_PARAM} check_return "insmod sensor drv" fi +# temporary hax to claim gpio 57,58 on HICHIP boards +insmod ${KMOD_PATH/%\//}/ircut.ko \ No newline at end of file From b0d047d0dbfa07c031d1ac09e5fa15991007e98f Mon Sep 17 00:00:00 2001 From: Dmitry Ermakov <de@dimer.org.ua> Date: Thu, 2 Jun 2022 17:28:03 +0300 Subject: [PATCH 6/9] Add T21 actions --- .github/workflows/rv1109_images.yml | 2 +- .github/workflows/rv1126_images.yml | 2 +- .github/workflows/t21_images.yml | 139 ++++++++++++++++++ .../unknown_unknown_t21_openipc_defconfig | 102 +++++++++++++ 4 files changed, 243 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/t21_images.yml create mode 100644 br-ext-chip-ingenic/configs/unknown_unknown_t21_openipc_defconfig diff --git a/.github/workflows/rv1109_images.yml b/.github/workflows/rv1109_images.yml index 94111391..a220590d 100644 --- a/.github/workflows/rv1109_images.yml +++ b/.github/workflows/rv1109_images.yml @@ -69,7 +69,7 @@ jobs: echo "ARCHIVE_FW=$ARCHIVE_FW" >> $GITHUB_ENV echo "ARCHIVE_FW_NAND=$ARCHIVE_FW_NAND" >> $GITHUB_ENV cd $GITHUB_WORKSPACE - make PLATFORM=rockchip BOARD=unknown_unknown_${BOARD} all + make PLATFORM=rockchip BOARD=unknown_unknown_${BOARD}_openipc all # [[ $(stat --printf="%s" ${GITHUB_WORKSPACE}/output/images/uImage) -gt 3145728 ]] && echo "TG_NOTIFY=Warning, kernel size exceeded : $(stat --printf="%s" ${GITHUB_WORKSPACE}/output/images/uImage) ... ${BOARD}" >> $GITHUB_ENV && exit 1 # [[ $(stat --printf="%s" ${GITHUB_WORKSPACE}/output/images/rootfs.squashfs) -gt 10485760 ]] && echo "TG_NOTIFY=Warning, rootfs size exceeded - $(stat --printf="%s" ${GITHUB_WORKSPACE}/output/images/rootfs.squashfs) vs 10485760... ${BOARD}" >> $GITHUB_ENV && exit 1 cd ${GITHUB_WORKSPACE}/output/images diff --git a/.github/workflows/rv1126_images.yml b/.github/workflows/rv1126_images.yml index df229db3..3ffd571c 100644 --- a/.github/workflows/rv1126_images.yml +++ b/.github/workflows/rv1126_images.yml @@ -69,7 +69,7 @@ jobs: echo "ARCHIVE_FW=$ARCHIVE_FW" >> $GITHUB_ENV echo "ARCHIVE_FW_NAND=$ARCHIVE_FW_NAND" >> $GITHUB_ENV cd $GITHUB_WORKSPACE - make PLATFORM=rockchip BOARD=unknown_unknown_${BOARD} all + make PLATFORM=rockchip BOARD=unknown_unknown_${BOARD}_openipc all # [[ $(stat --printf="%s" ${GITHUB_WORKSPACE}/output/images/uImage) -gt 3145728 ]] && echo "TG_NOTIFY=Warning, kernel size exceeded : $(stat --printf="%s" ${GITHUB_WORKSPACE}/output/images/uImage) ... ${BOARD}" >> $GITHUB_ENV && exit 1 # [[ $(stat --printf="%s" ${GITHUB_WORKSPACE}/output/images/rootfs.squashfs) -gt 10485760 ]] && echo "TG_NOTIFY=Warning, rootfs size exceeded - $(stat --printf="%s" ${GITHUB_WORKSPACE}/output/images/rootfs.squashfs) vs 10485760... ${BOARD}" >> $GITHUB_ENV && exit 1 cd ${GITHUB_WORKSPACE}/output/images diff --git a/.github/workflows/t21_images.yml b/.github/workflows/t21_images.yml new file mode 100644 index 00000000..8503b942 --- /dev/null +++ b/.github/workflows/t21_images.yml @@ -0,0 +1,139 @@ +name: "T21" + +on: + push: + branches: + - production + tags: + - "v*" + schedule: + - cron: "00 02 * * *" + workflow_dispatch: + +jobs: + build_core: + name: OpenIPC firmware for T21 + runs-on: ubuntu-18.04 + + steps: + + - name: Checkout + id: checkout + uses: actions/checkout@v2 + + - name: Install build dependencies + id: install + run: | + make install-deps + mkdir -p tmp + + - name: Free disk space + id: freshing + run: | + sudo swapoff -a + sudo rm -f /swapfile + sudo apt clean + docker rmi $(docker image ls -aq) + df -h + + - name: Prepare buildroot + id: prepare + run: | + HEAD_TAG=$(git tag --points-at HEAD) + GIT_HASH=$(git rev-parse --short $GITHUB_SHA) + BRANCH_NAME=$(echo $GITHUB_REF | cut -d'/' -f 3) + if [ -z "$HEAD_TAG" ]; then + TAG_NAME="latest" + RELEASE_NAME="Development Build" + PRERELEASE=true + else + TAG_NAME=${{ github.ref }} + RELEASE_NAME="Release ${{ github.ref }}" + PRERELEASE=false + fi + echo "GIT_HASH=$GIT_HASH" >> $GITHUB_ENV + echo "TAG_NAME=$TAG_NAME" >> $GITHUB_ENV + echo "RELEASE_NAME=$RELEASE_NAME" >> $GITHUB_ENV + echo "PRERELEASE=$PRERELEASE" >> $GITHUB_ENV + echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV + cd $GITHUB_WORKSPACE + make prepare + + - name: Build T21 firmware + id: build-t21-firmware + continue-on-error: true + run: | + ARCHIVE_FW="${GITHUB_WORKSPACE}/output/images/openipc.t21-br.tgz" + echo "ARCHIVE_FW=$ARCHIVE_FW" >> $GITHUB_ENV + cd $GITHUB_WORKSPACE + make PLATFORM=ingenic BOARD=unknown_unknown_t21_openipc all + [[ $(stat --printf="%s" ${GITHUB_WORKSPACE}/output/images/uImage) -gt 2097152 ]] && echo "TG_NOTIFY=Warning, kernel size exceeded : $(stat --printf="%s" ${GITHUB_WORKSPACE}/output/images/uImage) vs 2097152... T21" >> $GITHUB_ENV && exit 1 + [[ $(stat --printf="%s" ${GITHUB_WORKSPACE}/output/images/rootfs.squashfs) -gt 5242880 ]] && echo "TG_NOTIFY=Warning, rootfs size exceeded - $(stat --printf="%s" ${GITHUB_WORKSPACE}/output/images/rootfs.squashfs) vs 5242880... T21" >> $GITHUB_ENV && exit 1 + cd ${GITHUB_WORKSPACE}/output/images + mv uImage uImage.t21 + mv rootfs.squashfs rootfs.squashfs.t21 + md5sum rootfs.squashfs.t21 > rootfs.squashfs.t21.md5sum + md5sum uImage.t21 > uImage.t21.md5sum + tar -cvzf $ARCHIVE_FW *t21* + + - name: Build T21 SDK + id: build-t21-sdk + continue-on-error: true + run: | + ARCHIVE_SDK="${GITHUB_WORKSPACE}/output/images/mipsel-openipc-linux-musl_sdk-buildroot.tar.gz" + echo "ARCHIVE_SDK=$ARCHIVE_SDK" >> $GITHUB_ENV + cd $GITHUB_WORKSPACE/output + make sdk + + - name: Send warning message to telegram channel + env: + TG_TOKEN: ${{ secrets.TELEGRAM_TOKEN_BOT_OPENIPC }} + TG_CHANNEL: ${{ secrets.TELEGRAM_CHANNEL_OPENIPC_DEV }} + if: steps.build-t21-firmware.outcome != 'success' || steps.build-t21-sdk.outcome != 'success' + run: | + TG_OPTIONS="-s --connect-timeout 30 --max-time 30" + TG_NOTIFY="${TG_NOTIFY:=Warning, Buildroot compiling error... T21}" + TG_HEADER=$(echo -e "\r\n$TG_NOTIFY \r\n\r\nCommit: $GIT_HASH \r\nBranch: $BRANCH_NAME \r\nTag: $TAG_NAME \r\n\r\n\xE2\x9A\xA0 GitHub Actions") + curl $TG_OPTIONS -H "Content-Type: multipart/form-data" -X POST https://api.telegram.org/bot$TG_TOKEN/sendMessage \ + -F chat_id=$TG_CHANNEL -F text="$TG_HEADER" + + - name: Create release + uses: actions/create-release@v1 + continue-on-error: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ env.TAG_NAME }} + release_name: ${{ env.RELEASE_NAME }} + draft: false + prerelease: ${{ env.PRERELEASE }} + + - name: Upload FW to release + uses: svenstaro/upload-release-action@v2 + continue-on-error: true + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: ${{ env.ARCHIVE_FW }} + asset_name: "openipc.t21-br.tgz" + tag: ${{ env.TAG_NAME }} + overwrite: true + + - name: Upload SDK to release + uses: svenstaro/upload-release-action@v2 + continue-on-error: true + with: + repo_token: ${{ secrets.GITHUB_TOKEN }} + file: ${{ env.ARCHIVE_SDK }} + asset_name: "mipsel-openipc-t21-linux-musl_sdk-buildroot.tar.gz" + tag: ${{ env.TAG_NAME }} + overwrite: true + + - name: Send binary file to telegram channel + env: + TG_TOKEN: ${{ secrets.TELEGRAM_TOKEN_BOT_OPENIPC }} + TG_CHANNEL: ${{ secrets.TELEGRAM_CHANNEL_OPENIPC_DEV }} + run: | + TG_OPTIONS="-s --connect-timeout 30 --max-time 30" + TG_HEADER=$(echo -e "\r\nCommit: $GIT_HASH \r\nBranch: $BRANCH_NAME \r\nTag: $TAG_NAME \r\n\r\n\xE2\x9C\x85 GitHub Actions") + curl $TG_OPTIONS -H "Content-Type: multipart/form-data" -X POST https://api.telegram.org/bot$TG_TOKEN/sendDocument \ + -F chat_id=$TG_CHANNEL -F document="@$ARCHIVE_FW" -F caption="$TG_HEADER" diff --git a/br-ext-chip-ingenic/configs/unknown_unknown_t21_openipc_defconfig b/br-ext-chip-ingenic/configs/unknown_unknown_t21_openipc_defconfig new file mode 100644 index 00000000..01cb172c --- /dev/null +++ b/br-ext-chip-ingenic/configs/unknown_unknown_t21_openipc_defconfig @@ -0,0 +1,102 @@ +# Architecture +BR2_mipsel=y +BR2_mips_xburst=y +# BR2_MIPS_SOFT_FLOAT is not set +BR2_MIPS_FP32_MODE_32=y +# BR2_MIPS_FP32_MODE_XX is not set +BR2_MIPS_NAN_LEGACY=y +BR2_MIPS_OABI32=y +BR2_KERNEL_HEADERS_VERSION=y +BR2_DEFAULT_KERNEL_VERSION="3.10.14" +BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_3_10=y + +# Toolchain +BR2_PER_PACKAGE_DIRECTORIES=y +BR2_GCC_VERSION_7_X=y +# BR2_TOOLCHAIN_USES_UCLIBC is not set +# BR2_TOOLCHAIN_BUILDROOT_UCLIBC is not set +# BR2_TOOLCHAIN_BUILDROOT_LIBC="uclibc" +BR2_EXTRA_GCC_CONFIG_OPTIONS="--with-float=hard" +BR2_TOOLCHAIN_USES_MUSL=y +BR2_TOOLCHAIN_BUILDROOT_MUSL=y +BR2_TOOLCHAIN_BUILDROOT_LIBC="musl" +BR2_TOOLCHAIN_BUILDROOT_CXX=y +BR2_TOOLCHAIN_BUILDROOT_LOCALE=y +BR2_TOOLCHAIN_BUILDROOT_USE_SSP=y + +# Kernel +BR2_LINUX_KERNEL=y +BR2_LINUX_KERNEL_CUSTOM_VERSION=y +BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE="3.10.14" +BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG=y +BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE="$(BR2_EXTERNAL_INGENIC_PATH)/board/t31/kernel/t21.generic.config" +BR2_LINUX_KERNEL_UIMAGE=y +BR2_LINUX_KERNEL_LZMA=y +BR2_LINUX_KERNEL_EXT_INGENIC_PATCHER=y +BR2_LINUX_KERNEL_EXT_INGENIC_PATCHER_LIST="$(BR2_EXTERNAL_INGENIC_PATH)/board/t31/kernel/patches/ $(BR2_EXTERNAL_INGENIC_PATH)/board/t31/kernel/overlay" + +# Filesystem +# BR2_TARGET_TZ_INFO is not set +BR2_TARGET_ROOTFS_CPIO=y +BR2_TARGET_ROOTFS_SQUASHFS=y +BR2_TARGET_ROOTFS_SQUASHFS4_XZ=y +BR2_ROOTFS_OVERLAY="$(TOPDIR)/../general/overlay" +BR2_ROOTFS_POST_BUILD_SCRIPT="$(TOPDIR)/../scripts/executing_commands_for_$(BR2_TOOLCHAIN_BUILDROOT_LIBC).sh" + +# OpenIPC configuration +BR2_TOOLCHAIN_BUILDROOT_VENDOR="openipc" +BR2_TARGET_GENERIC_ISSUE="Welcome to OpenIPC v2.2" +BR2_TARGET_GENERIC_HOSTNAME="openipc-t21" +BR2_GLOBAL_PATCH_DIR="$(TOPDIR)/../general/package/all-patches" + +# OpenIPC packages +BR2_PACKAGE_BUSYBOX_CONFIG="$(TOPDIR)/../general/package/busybox/busybox.config" +BR2_PACKAGE_DROPBEAR_OPENIPC=y +# BR2_PACKAGE_FDK_AAC_OPENIPC is not set +BR2_PACKAGE_FWPRINTENV_OPENIPC=y +BR2_PACKAGE_INGENIC_OSDRV_T31=y +BR2_PACKAGE_HASERL=y +BR2_PACKAGE_HISI_GPIO=y +BR2_PACKAGE_IPCTOOL=y +BR2_PACKAGE_JSON_C=y +BR2_PACKAGE_LAME_OPENIPC=y +BR2_PACKAGE_LIBCURL_OPENIPC=y +BR2_PACKAGE_LIBCURL_OPENIPC_CURL=y +# BR2_PACKAGE_LIBCURL_OPENIPC_VERBOSE is not set +# BR2_PACKAGE_LIBCURL_OPENIPC_PROXY_SUPPORT is not set +# BR2_PACKAGE_LIBCURL_OPENIPC_COOKIES_SUPPORT is not set +# BR2_PACKAGE_LIBCURL_OPENIPC_EXTRA_PROTOCOLS_FEATURES is not set +BR2_PACKAGE_LIBCURL_OPENIPC_MBEDTLS=y +BR2_PACKAGE_LIBEVENT_OPENIPC=y +BR2_PACKAGE_LIBEVENT_OPENIPC_REMOVE_PYSCRIPT=y +BR2_PACKAGE_LIBOGG_OPENIPC=y +BR2_PACKAGE_LIBWEBSOCKETS_OPENIPC=y +BR2_PACKAGE_LIBYAML=y +BR2_PACKAGE_MAJESTIC_FONTS=y +BR2_PACKAGE_MAJESTIC_T31=y +BR2_PACKAGE_MBEDTLS_OPENIPC=y +# BR2_PACKAGE_MBEDTLS_OPENIPC_PROGRAMS is not set +# BR2_PACKAGE_MBEDTLS_OPENIPC_COMPRESSION is not set +BR2_PACKAGE_MICROBE_WEB=y +# BR2_PACKAGE_MINI_SNMPD is not set +BR2_PACKAGE_MOTORS=y +BR2_PACKAGE_OPUS_OPENIPC=y +BR2_PACKAGE_OPUS_OPENIPC_FIXED_POINT=y +# BR2_PACKAGE_SSHPASS is not set +BR2_PACKAGE_UACME_OPENIPC=y +BR2_PACKAGE_VTUND_OPENIPC=y +BR2_PACKAGE_YAML_CLI=y + +# WiFi +BR2_PACKAGE_WIRELESS_TOOLS=y +BR2_PACKAGE_WPA_SUPPLICANT=y +BR2_PACKAGE_WPA_SUPPLICANT_CLI=y +BR2_PACKAGE_WPA_SUPPLICANT_NL80211=y +BR2_PACKAGE_WPA_SUPPLICANT_PASSPHRASE=y +BR2_PACKAGE_LINUX_FIRMWARE_OPENIPC=y +BR2_PACKAGE_LINUX_FIRMWARE_OPENIPC_MT7601U=y +# BR2_PACKAGE_RTL8188EU is not set + +# WIREGUARD +# BR2_PACKAGE_WIREGUARD_LINUX_COMPAT=y +# BR2_PACKAGE_WIREGUARD_TOOLS=y From a7c7f4681abb9cfef46a4d39ee25e8c0b17d95ab Mon Sep 17 00:00:00 2001 From: Dmitry Ermakov <de@dimer.org.ua> Date: Thu, 2 Jun 2022 17:32:50 +0300 Subject: [PATCH 7/9] [T31] rmmod for ircut --- general/package/ingenic-osdrv-t31/files/script/load_ingenic | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/general/package/ingenic-osdrv-t31/files/script/load_ingenic b/general/package/ingenic-osdrv-t31/files/script/load_ingenic index 101613bd..4688eedb 100755 --- a/general/package/ingenic-osdrv-t31/files/script/load_ingenic +++ b/general/package/ingenic-osdrv-t31/files/script/load_ingenic @@ -88,4 +88,4 @@ if [ $? -ne 0 ]; then check_return "insmod sensor drv" fi # temporary hax to claim gpio 57,58 on HICHIP boards -insmod ${KMOD_PATH/%\//}/ircut.ko \ No newline at end of file +insmod ${KMOD_PATH/%\//}/ircut.ko; rmmod ircut From cab1c9c1a8f393249e9e14662df9bf137b7d6ef8 Mon Sep 17 00:00:00 2001 From: Igor Zalatov <zig@dolphin.flymon.net> Date: Thu, 2 Jun 2022 17:37:21 +0300 Subject: [PATCH 8/9] Update docs --- docs/index.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/index.md b/docs/index.md index 72b9ffc3..c9e2e474 100644 --- a/docs/index.md +++ b/docs/index.md @@ -48,28 +48,28 @@ _NB! Downloads are for research only, without any guarantee._ | Goke GK7605v100<br>![GK7605v100][GK7605v100] | + | + | + | | | | | [⬇][fwGK7605v100] | WIP | | GrainMedia GM8135<br>![GM8135][GM8135] | | + | + | | | | | [⬇][fwGM8135] | WIP | | GrainMedia GM8136<br>![GM8136][GM8136] | | + | + | | | | | [⬇][fwGM8136] | WIP | -| HiSilicon Hi3516Av100<br>![Hi3516Av100][Hi3516Av100] | | + | + | | | | | [⬇][fwHi3516Av100] | WIP | -| HiSilicon Hi3516Av200<br>![Hi3516Av200][Hi3516Av200] | | + | + | | | | | [⬇][fwHi3516Av200] | WIP | -| HiSilicon Hi3516Av300<br>![Hi3516Av300][Hi3516Av300] | | + | + | | | | | [⬇][fwHi3516Av300] | WIP | -| HiSilicon Hi3516Cv100<br>![Hi3516Cv100][Hi3516Cv100] | | + | + | + | | | | [⬇][fwHi3516Cv100] | WIP | -| HiSilicon Hi3516Cv200<br>![Hi3516Cv200][Hi3516Cv200] | | + | + | + | + | + | | [⬇][fwHi3516Cv200] | DONE | +| HiSilicon Hi3516Av100<br>![Hi3516Av100][Hi3516Av100] | + | + | + | | | | | [⬇][fwHi3516Av100] | WIP | +| HiSilicon Hi3516Av200<br>![Hi3516Av200][Hi3516Av200] | + | + | + | | | | | [⬇][fwHi3516Av200] | WIP | +| HiSilicon Hi3516Av300<br>![Hi3516Av300][Hi3516Av300] | + | + | + | | | | | [⬇][fwHi3516Av300] | WIP | +| HiSilicon Hi3516Cv100<br>![Hi3516Cv100][Hi3516Cv100] | + | + | + | + | | | | [⬇][fwHi3516Cv100] | WIP | +| HiSilicon Hi3516Cv200<br>![Hi3516Cv200][Hi3516Cv200] | + | + | + | + | + | + | | [⬇][fwHi3516Cv200] | DONE | | HiSilicon Hi3516Cv300<br>![Hi3516Cv300][Hi3516Cv300] | + | + | + | + | + | + | + | [⬇][fwHi3516Cv300] | DONE | -| HiSilicon Hi3516Cv500<br>![Hi3516Cv500][Hi3516Cv500] | | + | + | | | | | [⬇][fwHi3516Cv500] | WIP | -| HiSilicon Hi3516Dv100<br>![Hi3516Dv100][Hi3516Dv100] | | + | + | | | | | [⬇][fwHi3516Dv100] | WIP | +| HiSilicon Hi3516Cv500<br>![Hi3516Cv500][Hi3516Cv500] | + | + | + | | | | | [⬇][fwHi3516Cv500] | WIP | +| HiSilicon Hi3516Dv100<br>![Hi3516Dv100][Hi3516Dv100] | + | + | + | | | | | [⬇][fwHi3516Dv100] | WIP | | HiSilicon Hi3516Dv200<br>![Hi3516Dv200][Hi3516Dv200] | + | + | + | + | + | + | + | [⬇][fwHi3516Dv200] | DONE | -| HiSilicon Hi3516Dv300<br>![Hi3516Dv300][Hi3516Dv300] | | + | + | | | | | [⬇][fwHi3516Dv300] | WIP | +| HiSilicon Hi3516Dv300<br>![Hi3516Dv300][Hi3516Dv300] | + | + | + | | | | | [⬇][fwHi3516Dv300] | WIP | | HiSilicon Hi3516Ev100<br>![Hi3516Ev100][Hi3516Ev100] | + | + | + | + | + | + | + | [⬇][fwHi3516Ev100] | DONE | | HiSilicon Hi3516Ev200<br>![Hi3516Ev200][Hi3516Ev200] | + | + | + | + | + | + | + | [⬇][fwHi3516Ev200] | DONE | | HiSilicon Hi3516Ev300<br>![Hi3516Ev300][Hi3516Ev300] | + | + | + | + | + | + | + | [⬇][fwHi3516Ev300] | DONE | -| HiSilicon Hi3518Cv100<br>![Hi3518Cv100][Hi3518Cv100] | | + | + | + | | | | [⬇][fwHi3518Cv100] | WIP | -| HiSilicon Hi3518Ev100<br>![Hi3518Ev100][Hi3518Ev100] | | + | + | + | | | | [⬇][fwHi3518Ev100] | WIP | -| HiSilicon Hi3518Ev200<br>![Hi3518Ev200][Hi3518Ev200] | | + | + | + | + | + | | [⬇][fwHi3518Ev200] | DONE | +| HiSilicon Hi3518Cv100<br>![Hi3518Cv100][Hi3518Cv100] | + | + | + | + | | | | [⬇][fwHi3518Cv100] | WIP | +| HiSilicon Hi3518Ev100<br>![Hi3518Ev100][Hi3518Ev100] | + | + | + | + | | | | [⬇][fwHi3518Ev100] | WIP | +| HiSilicon Hi3518Ev200<br>![Hi3518Ev200][Hi3518Ev200] | + | + | + | + | + | + | | [⬇][fwHi3518Ev200] | DONE | | HiSilicon Hi3518Ev300<br>![Hi3518Ev300][Hi3518Ev300] | + | + | + | + | + | + | + | [⬇][fwHi3518Ev300] | DONE | -| HiSilicon Hi3519v101<br>![Hi3519v101][Hi3519v101] | | + | + | | | | | [⬇][fwHi3519v101] | WIP | +| HiSilicon Hi3519v101<br>![Hi3519v101][Hi3519v101] | + | + | + | | | | | [⬇][fwHi3519v101] | WIP | | Ingenic T10<br>![T10][T10] | | | | | | | | | R&D | | Ingenic T20<br>![T20][T20] | | | | | | | | | R&D | | Ingenic T21<br>![T21][T21] | | | | | | | | | R&D | -| Ingenic T31<br>![T31][T31] | | + | + | | | | | [⬇][fwT31] | WIP | +| Ingenic T31<br>![T31][T31] | | + | + | | | | | [⬇][fwT31] | DONE | | MStar MSC313E<br>![MSC313E][MSC313E] | | | | | | | | | R&D | | MStar MSC316D<br>![MSC316D][MSC316D] | | | | | | | | | R&D | | Novatek NT98562<br>![NT98562][NT98562] | | + | + | | | | | [⬇][fwNT98562] | WIP | From b4e11466792363a1b92aa9d0949d0f7e47e411b9 Mon Sep 17 00:00:00 2001 From: Dmitry Ermakov <de@dimer.org.ua> Date: Fri, 3 Jun 2022 00:27:07 +0300 Subject: [PATCH 9/9] Fix T10-T30 configs & patches ( thx @p0isk ) --- .../patches/0005-disable-i2c-clk-get.patch | 130 ++++++++++++++++++ .../t31/kernel/patches/0006-phy-connect.patch | 19 +++ .../t31/kernel/patches/0007-sfc-mtd.patch | 65 +++++++++ .../board/t31/kernel/t10.generic.config | 4 +- .../board/t31/kernel/t20.generic.config | 11 +- .../board/t31/kernel/t21.generic.config | 5 +- .../board/t31/kernel/t30.generic.config | 4 +- 7 files changed, 222 insertions(+), 16 deletions(-) create mode 100644 br-ext-chip-ingenic/board/t31/kernel/patches/0006-phy-connect.patch create mode 100644 br-ext-chip-ingenic/board/t31/kernel/patches/0007-sfc-mtd.patch diff --git a/br-ext-chip-ingenic/board/t31/kernel/patches/0005-disable-i2c-clk-get.patch b/br-ext-chip-ingenic/board/t31/kernel/patches/0005-disable-i2c-clk-get.patch index 9a8dbc8d..bde73a83 100644 --- a/br-ext-chip-ingenic/board/t31/kernel/patches/0005-disable-i2c-clk-get.patch +++ b/br-ext-chip-ingenic/board/t31/kernel/patches/0005-disable-i2c-clk-get.patch @@ -31,3 +31,133 @@ if(clk->parent == get_clk_from_id(CLK_ID_EXT1)) return clk->parent->rate; +--- a/arch/mips/xburst/soc-t21/common/clk/clk_cgu.c ++++ b/arch/mips/xburst/soc-t21/common/clk/clk_cgu.c +@@ -111,18 +111,19 @@ + unsigned long x; + unsigned long flags; + int no = CLK_CGU_NO(clk->flags); +- +- if (!(strcmp(clk->name, "cgu_i2s"))) { +- unsigned int reg_val = 0; +- int m = 0, n = 0; +- reg_val = cpm_inl(cgu_clks[no].off) & 0xf0000000; +- n = reg_val & 0xfffff; +- m = (reg_val >> 20) & 0x1ff; +- +- printk(KERN_DEBUG"%s, parent = %ld, rate = %ld, m = %d, n = %d, reg val = 0x%08x\n", +- __func__, clk->parent->rate, clk->rate, m, n, cpm_inl(cgu_clks[no].off)); +- return (clk->parent->rate * m) / n; +- } ++ ++// FixMe: This leads to hang during boot with GCC>5.5.0 ++// if (!(strcmp(clk->name, "cgu_i2s"))) { ++// unsigned int reg_val = 0; ++// int m = 0, n = 0; ++// reg_val = cpm_inl(cgu_clks[no].off) & 0xf0000000; ++// n = reg_val & 0xfffff; ++// m = (reg_val >> 20) & 0x1ff; ++// ++// printk(KERN_DEBUG"%s, parent = %ld, rate = %ld, m = %d, n = %d, reg val = 0x%08x\n", ++// __func__, clk->parent->rate, clk->rate, m, n, cpm_inl(cgu_clks[no].off)); ++// return (clk->parent->rate * m) / n; ++// } + + if(clk->parent == get_clk_from_id(CLK_ID_EXT1)) + return clk->parent->rate; +--- a/arch/mips/xburst/soc-t10/common/clk/clk_cgu.c ++++ b/arch/mips/xburst/soc-t10/common/clk/clk_cgu.c +@@ -99,17 +99,18 @@ + unsigned long flags; + int no = CLK_CGU_NO(clk->flags); + +- if (!(strcmp(clk->name, "cgu_i2s"))) { +- unsigned int reg_val = 0; +- int m = 0, n = 0; +- reg_val = cpm_inl(cgu_clks[no].off) & 0xf0000000; +- n = reg_val & 0x1fff; +- m = (reg_val >> 13) & 0x1ff; +- +- printk(KERN_DEBUG"%s, parent = %ld, rate = %ld, m = %d, n = %d, reg val = 0x%08x\n", +- __func__, clk->parent->rate, clk->rate, m, n, cpm_inl(cgu_clks[no].off)); +- return (clk->parent->rate * m) / n; +- } ++// FixMe: This leads to hang during boot with GCC>5.5.0 ++// if (!(strcmp(clk->name, "cgu_i2s"))) { ++// unsigned int reg_val = 0; ++// int m = 0, n = 0; ++// reg_val = cpm_inl(cgu_clks[no].off) & 0xf0000000; ++// n = reg_val & 0x1fff; ++// m = (reg_val >> 13) & 0x1ff; ++// ++// printk(KERN_DEBUG"%s, parent = %ld, rate = %ld, m = %d, n = %d, reg val = 0x%08x\n", ++// __func__, clk->parent->rate, clk->rate, m, n, cpm_inl(cgu_clks[no].off)); ++// return (clk->parent->rate * m) / n; ++// } + + if(clk->parent == get_clk_from_id(CLK_ID_EXT1)) + return clk->parent->rate; +--- a/arch/mips/xburst/soc-t20/common/clk/clk_cgu.c ++++ b/arch/mips/xburst/soc-t20/common/clk/clk_cgu.c +@@ -100,17 +100,18 @@ + unsigned long flags; + int no = CLK_CGU_NO(clk->flags); + +- if (!(strcmp(clk->name, "cgu_i2s"))) { +- unsigned int reg_val = 0; +- int m = 0, n = 0; +- reg_val = cpm_inl(cgu_clks[no].off) & 0xf0000000; +- n = reg_val & 0x1fff; +- m = (reg_val >> 13) & 0x1ff; +- +- printk(KERN_DEBUG"%s, parent = %ld, rate = %ld, m = %d, n = %d, reg val = 0x%08x\n", +- __func__, clk->parent->rate, clk->rate, m, n, cpm_inl(cgu_clks[no].off)); +- return (clk->parent->rate * m) / n; +- } ++// FixMe: This leads to hang during boot with GCC>5.5.0 ++// if (!(strcmp(clk->name, "cgu_i2s"))) { ++// unsigned int reg_val = 0; ++// int m = 0, n = 0; ++// reg_val = cpm_inl(cgu_clks[no].off) & 0xf0000000; ++// n = reg_val & 0x1fff; ++// m = (reg_val >> 13) & 0x1ff; ++// ++// printk(KERN_DEBUG"%s, parent = %ld, rate = %ld, m = %d, n = %d, reg val = 0x%08x\n", ++// __func__, clk->parent->rate, clk->rate, m, n, cpm_inl(cgu_clks[no].off)); ++// return (clk->parent->rate * m) / n; ++// } + + if(clk->parent == get_clk_from_id(CLK_ID_EXT1)) + return clk->parent->rate; +--- a/arch/mips/xburst/soc-t30/common/clk/clk_cgu.c ++++ b/arch/mips/xburst/soc-t30/common/clk/clk_cgu.c +@@ -112,17 +112,18 @@ + unsigned long flags; + int no = CLK_CGU_NO(clk->flags); + +- if (!(strcmp(clk->name, "cgu_i2s"))) { +- unsigned int reg_val = 0; +- int m = 0, n = 0; +- reg_val = cpm_inl(cgu_clks[no].off) & 0xf0000000; +- n = reg_val & 0xfffff; +- m = (reg_val >> 20) & 0x1ff; +- +- printk(KERN_DEBUG"%s, parent = %ld, rate = %ld, m = %d, n = %d, reg val = 0x%08x\n", +- __func__, clk->parent->rate, clk->rate, m, n, cpm_inl(cgu_clks[no].off)); +- return (clk->parent->rate * m) / n; +- } ++// FixMe: This leads to hang during boot with GCC>5.5.0 ++// if (!(strcmp(clk->name, "cgu_i2s"))) { ++// unsigned int reg_val = 0; ++// int m = 0, n = 0; ++// reg_val = cpm_inl(cgu_clks[no].off) & 0xf0000000; ++// n = reg_val & 0xfffff; ++// m = (reg_val >> 20) & 0x1ff; ++// ++// printk(KERN_DEBUG"%s, parent = %ld, rate = %ld, m = %d, n = %d, reg val = 0x%08x\n", ++// __func__, clk->parent->rate, clk->rate, m, n, cpm_inl(cgu_clks[no].off)); ++// return (clk->parent->rate * m) / n; ++// } + + if(clk->parent == get_clk_from_id(CLK_ID_EXT1)) + return clk->parent->rate; diff --git a/br-ext-chip-ingenic/board/t31/kernel/patches/0006-phy-connect.patch b/br-ext-chip-ingenic/board/t31/kernel/patches/0006-phy-connect.patch new file mode 100644 index 00000000..7e852dd5 --- /dev/null +++ b/br-ext-chip-ingenic/board/t31/kernel/patches/0006-phy-connect.patch @@ -0,0 +1,19 @@ +--- a/drivers/net/ethernet/ingenic/jz_mac_v13.c ++++ b/drivers/net/ethernet/ingenic/jz_mac_v13.c +@@ -875,13 +875,13 @@ + PHY_INTERFACE_MODE_RMII); + #elif defined(CONFIG_JZ_MAC_RGMII) + phydev = phy_connect(dev, dev_name(&phydev->dev), &jz_mac_adjust_link, +- 0, PHY_INTERFACE_MODE_RGMII); ++ PHY_INTERFACE_MODE_RGMII); + #elif defined(CONFIG_JZ_MAC_GMII) + phydev = phy_connect(dev, dev_name(&phydev->dev), &jz_mac_adjust_link, +- 0, PHY_INTERFACE_MODE_GMII); ++ PHY_INTERFACE_MODE_GMII); + #else + phydev = phy_connect(dev, dev_name(&phydev->dev), &jz_mac_adjust_link, +- 0, PHY_INTERFACE_MODE_MII); ++ PHY_INTERFACE_MODE_MII); + #endif + + if (IS_ERR(phydev)) { diff --git a/br-ext-chip-ingenic/board/t31/kernel/patches/0007-sfc-mtd.patch b/br-ext-chip-ingenic/board/t31/kernel/patches/0007-sfc-mtd.patch new file mode 100644 index 00000000..e3d26693 --- /dev/null +++ b/br-ext-chip-ingenic/board/t31/kernel/patches/0007-sfc-mtd.patch @@ -0,0 +1,65 @@ +--- a/drivers/mtd/devices/Kconfig ++++ b/drivers/mtd/devices/Kconfig +@@ -73,6 +73,11 @@ + help + Now support GD25LQ64C + ++config MTD_JZ_SFC_NORFLASH ++ bool "Support ingenic spi-mtd" ++ help ++ nothing ++ + config MTD_JZ_SFC + tristate "Ingenic JZ series SFC driver" + depends on MACH_XBURST +@@ -93,7 +98,7 @@ + + config SFC_DMA + bool "used dma" +- depends on MTD_JZ_SFC_NOR ++ depends on (MTD_JZ_SFC_NOR || MTD_JZ_SFC_NORFLASH) + help + used dma + +@@ -101,13 +106,13 @@ + int "JZ SFC speed in MHZ" + range 10 200 + default 50 +- depends on MTD_JZ_SFC ++ depends on (MTD_JZ_SFC || MTD_JZ_SFC_NORFLASH) + help + Select sfc speed. + Examples: + 50 => 50 MHZ + +-if MTD_JZ_SFC ++if (MTD_JZ_SFC || MTD_JZ_SFC_NORFLASH) + + choice + prompt "sfc Mode" +@@ -116,13 +121,13 @@ + + config SPI_STARDARD + bool "standard spi mode" +- depends on MTD_JZ_SFC ++ depends on (MTD_JZ_SFC || MTD_JZ_SFC_NORFLASH) + help + Say Y here to enable spi STANDARD MODE + + config SPI_QUAD + bool "quad spi mode" +- depends on MTD_JZ_SFC ++ depends on (MTD_JZ_SFC || MTD_JZ_SFC_NORFLASH) + help + Say Y Here to enable spi QUAD MODE + endchoice +--- a/drivers/mtd/devices/Makefile ++++ b/drivers/mtd/devices/Makefile +@@ -18,6 +18,7 @@ + obj-$(CONFIG_MTD_BCM47XXSFLASH) += bcm47xxsflash.o + obj-$(CONFIG_MTD_JZ_SPI_NORFLASH) += jz_spi_norflash.o + obj-$(CONFIG_MTD_JZ_SFC_NOR) += jz_sfc.o ++obj-$(CONFIG_MTD_JZ_SFC_NORFLASH) += jz_sfc.o + obj-$(CONFIG_MTD_JZ_SFC_NAND) += jz_sfc_common.o jz_sfc_nand.o nand_device/ + + diff --git a/br-ext-chip-ingenic/board/t31/kernel/t10.generic.config b/br-ext-chip-ingenic/board/t31/kernel/t10.generic.config index 624fa382..16381fca 100644 --- a/br-ext-chip-ingenic/board/t31/kernel/t10.generic.config +++ b/br-ext-chip-ingenic/board/t31/kernel/t10.generic.config @@ -630,9 +630,7 @@ CONFIG_MTD_CFI_I2=y # Self-contained MTD device drivers # # CONFIG_MTD_JZ_SPI_NORFLASH is not set -CONFIG_MTD_JZ_SFC=y -CONFIG_MTD_JZ_SFC_NOR=y -# CONFIG_MTD_JZ_SFC_NAND is not set +CONFIG_MTD_JZ_SFC_NORFLASH=y CONFIG_SFC_DMA=y CONFIG_SFC_SPEED=50 CONFIG_SPI_STARDARD=y diff --git a/br-ext-chip-ingenic/board/t31/kernel/t20.generic.config b/br-ext-chip-ingenic/board/t31/kernel/t20.generic.config index 55427a72..e87e02a7 100644 --- a/br-ext-chip-ingenic/board/t31/kernel/t20.generic.config +++ b/br-ext-chip-ingenic/board/t31/kernel/t20.generic.config @@ -633,9 +633,7 @@ CONFIG_MTD_CFI_I2=y # Self-contained MTD device drivers # # CONFIG_MTD_JZ_SPI_NORFLASH is not set -CONFIG_MTD_JZ_SFC=y -CONFIG_MTD_JZ_SFC_NOR=y -# CONFIG_MTD_JZ_SFC_NAND is not set +CONFIG_MTD_JZ_SFC_NORFLASH=y CONFIG_SFC_DMA=y CONFIG_SFC_SPEED=50 CONFIG_SPI_STARDARD=y @@ -1219,9 +1217,10 @@ CONFIG_JZ_IPU_V13=y # CONFIG_BACKLIGHT_LCD_SUPPORT is not set # CONFIG_JZ_VPU_IRQ_TEST is not set # CONFIG_JZ_VPU is not set -CONFIG_AVPU=y -CONFIG_AVPU_NO_DMABUF=1 -CONFIG_AVPU_DRIVER=y +CONFIG_SOC_VPU=y +CONFIG_CHANNEL_NODE_NUM=4 +CONFIG_VPU_NODE_NUM=1 +CONFIG_JZ_NVPU=y CONFIG_SOUND=y CONFIG_SOUND_OSS_CORE=y CONFIG_SOUND_OSS_CORE_PRECLAIM=y diff --git a/br-ext-chip-ingenic/board/t31/kernel/t21.generic.config b/br-ext-chip-ingenic/board/t31/kernel/t21.generic.config index bb2c8da7..f4fb60c7 100644 --- a/br-ext-chip-ingenic/board/t31/kernel/t21.generic.config +++ b/br-ext-chip-ingenic/board/t31/kernel/t21.generic.config @@ -631,10 +631,7 @@ CONFIG_MTD_CFI_I2=y # # Self-contained MTD device drivers # -# CONFIG_MTD_JZ_SPI_NORFLASH is not set -CONFIG_MTD_JZ_SFC=y -CONFIG_MTD_JZ_SFC_NOR=y -# CONFIG_MTD_JZ_SFC_NAND is not set +CONFIG_MTD_JZ_SFC_NORFLASH=y CONFIG_SFC_DMA=y CONFIG_SFC_SPEED=50 CONFIG_SPI_STARDARD=y diff --git a/br-ext-chip-ingenic/board/t31/kernel/t30.generic.config b/br-ext-chip-ingenic/board/t31/kernel/t30.generic.config index a394f708..33c8f125 100644 --- a/br-ext-chip-ingenic/board/t31/kernel/t30.generic.config +++ b/br-ext-chip-ingenic/board/t31/kernel/t30.generic.config @@ -631,9 +631,7 @@ CONFIG_MTD_CFI_I2=y # Self-contained MTD device drivers # # CONFIG_MTD_JZ_SPI_NORFLASH is not set -CONFIG_MTD_JZ_SFC=y -CONFIG_MTD_JZ_SFC_NOR=y -# CONFIG_MTD_JZ_SFC_NAND is not set +CONFIG_MTD_JZ_SFC_NORFLASH=y CONFIG_SFC_DMA=y CONFIG_SFC_SPEED=50 CONFIG_SPI_STARDARD=y