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
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
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&nbsp;GK7605v100<br>![GK7605v100][GK7605v100]         |   +    |   +    |   +    |     |      |     |      | [⬇][fwGK7605v100]  | WIP    |
 | GrainMedia&nbsp;GM8135<br>![GM8135][GM8135]               |        |   +    |   +    |     |      |     |      | [⬇][fwGM8135]      | WIP    |
 | GrainMedia&nbsp;GM8136<br>![GM8136][GM8136]               |        |   +    |   +    |     |      |     |      | [⬇][fwGM8136]      | WIP    |
-| HiSilicon&nbsp;Hi3516Av100<br>![Hi3516Av100][Hi3516Av100] |        |   +    |   +    |     |      |     |      | [⬇][fwHi3516Av100] | WIP    |
-| HiSilicon&nbsp;Hi3516Av200<br>![Hi3516Av200][Hi3516Av200] |        |   +    |   +    |     |      |     |      | [⬇][fwHi3516Av200] | WIP    |
-| HiSilicon&nbsp;Hi3516Av300<br>![Hi3516Av300][Hi3516Av300] |        |   +    |   +    |     |      |     |      | [⬇][fwHi3516Av300] | WIP    |
-| HiSilicon&nbsp;Hi3516Cv100<br>![Hi3516Cv100][Hi3516Cv100] |        |   +    |   +    |  +  |      |     |      | [⬇][fwHi3516Cv100] | WIP    |
-| HiSilicon&nbsp;Hi3516Cv200<br>![Hi3516Cv200][Hi3516Cv200] |        |   +    |   +    |  +  |  +   |  +  |      | [⬇][fwHi3516Cv200] | DONE   |
+| HiSilicon&nbsp;Hi3516Av100<br>![Hi3516Av100][Hi3516Av100] |   +    |   +    |   +    |     |      |     |      | [⬇][fwHi3516Av100] | WIP    |
+| HiSilicon&nbsp;Hi3516Av200<br>![Hi3516Av200][Hi3516Av200] |   +    |   +    |   +    |     |      |     |      | [⬇][fwHi3516Av200] | WIP    |
+| HiSilicon&nbsp;Hi3516Av300<br>![Hi3516Av300][Hi3516Av300] |   +    |   +    |   +    |     |      |     |      | [⬇][fwHi3516Av300] | WIP    |
+| HiSilicon&nbsp;Hi3516Cv100<br>![Hi3516Cv100][Hi3516Cv100] |   +    |   +    |   +    |  +  |      |     |      | [⬇][fwHi3516Cv100] | WIP    |
+| HiSilicon&nbsp;Hi3516Cv200<br>![Hi3516Cv200][Hi3516Cv200] |   +    |   +    |   +    |  +  |  +   |  +  |      | [⬇][fwHi3516Cv200] | DONE   |
 | HiSilicon&nbsp;Hi3516Cv300<br>![Hi3516Cv300][Hi3516Cv300] |   +    |   +    |   +    |  +  |  +   |  +  |  +   | [⬇][fwHi3516Cv300] | DONE   |
-| HiSilicon&nbsp;Hi3516Cv500<br>![Hi3516Cv500][Hi3516Cv500] |        |   +    |   +    |     |      |     |      | [⬇][fwHi3516Cv500] | WIP    |
-| HiSilicon&nbsp;Hi3516Dv100<br>![Hi3516Dv100][Hi3516Dv100] |        |   +    |   +    |     |      |     |      | [⬇][fwHi3516Dv100] | WIP    |
+| HiSilicon&nbsp;Hi3516Cv500<br>![Hi3516Cv500][Hi3516Cv500] |   +    |   +    |   +    |     |      |     |      | [⬇][fwHi3516Cv500] | WIP    |
+| HiSilicon&nbsp;Hi3516Dv100<br>![Hi3516Dv100][Hi3516Dv100] |   +    |   +    |   +    |     |      |     |      | [⬇][fwHi3516Dv100] | WIP    |
 | HiSilicon&nbsp;Hi3516Dv200<br>![Hi3516Dv200][Hi3516Dv200] |   +    |   +    |   +    |  +  |  +   |  +  |  +   | [⬇][fwHi3516Dv200] | DONE   |
-| HiSilicon&nbsp;Hi3516Dv300<br>![Hi3516Dv300][Hi3516Dv300] |        |   +    |   +    |     |      |     |      | [⬇][fwHi3516Dv300] | WIP    |
+| HiSilicon&nbsp;Hi3516Dv300<br>![Hi3516Dv300][Hi3516Dv300] |   +    |   +    |   +    |     |      |     |      | [⬇][fwHi3516Dv300] | WIP    |
 | HiSilicon&nbsp;Hi3516Ev100<br>![Hi3516Ev100][Hi3516Ev100] |   +    |   +    |   +    |  +  |  +   |  +  |  +   | [⬇][fwHi3516Ev100] | DONE   |
 | HiSilicon&nbsp;Hi3516Ev200<br>![Hi3516Ev200][Hi3516Ev200] |   +    |   +    |   +    |  +  |  +   |  +  |  +   | [⬇][fwHi3516Ev200] | DONE   |
 | HiSilicon&nbsp;Hi3516Ev300<br>![Hi3516Ev300][Hi3516Ev300] |   +    |   +    |   +    |  +  |  +   |  +  |  +   | [⬇][fwHi3516Ev300] | DONE   |
-| HiSilicon&nbsp;Hi3518Cv100<br>![Hi3518Cv100][Hi3518Cv100] |        |   +    |   +    |  +  |      |     |      | [⬇][fwHi3518Cv100] | WIP    |
-| HiSilicon&nbsp;Hi3518Ev100<br>![Hi3518Ev100][Hi3518Ev100] |        |   +    |   +    |  +  |      |     |      | [⬇][fwHi3518Ev100] | WIP    |
-| HiSilicon&nbsp;Hi3518Ev200<br>![Hi3518Ev200][Hi3518Ev200] |        |   +    |   +    |  +  |  +   |  +  |      | [⬇][fwHi3518Ev200] | DONE   |
+| HiSilicon&nbsp;Hi3518Cv100<br>![Hi3518Cv100][Hi3518Cv100] |   +    |   +    |   +    |  +  |      |     |      | [⬇][fwHi3518Cv100] | WIP    |
+| HiSilicon&nbsp;Hi3518Ev100<br>![Hi3518Ev100][Hi3518Ev100] |   +    |   +    |   +    |  +  |      |     |      | [⬇][fwHi3518Ev100] | WIP    |
+| HiSilicon&nbsp;Hi3518Ev200<br>![Hi3518Ev200][Hi3518Ev200] |   +    |   +    |   +    |  +  |  +   |  +  |      | [⬇][fwHi3518Ev200] | DONE   |
 | HiSilicon&nbsp;Hi3518Ev300<br>![Hi3518Ev300][Hi3518Ev300] |   +    |   +    |   +    |  +  |  +   |  +  |  +   | [⬇][fwHi3518Ev300] | DONE   |
-| HiSilicon&nbsp;Hi3519v101<br>![Hi3519v101][Hi3519v101]    |        |   +    |   +    |     |      |     |      | [⬇][fwHi3519v101]  | WIP    |
+| HiSilicon&nbsp;Hi3519v101<br>![Hi3519v101][Hi3519v101]    |   +    |   +    |   +    |     |      |     |      | [⬇][fwHi3519v101]  | WIP    |
 | Ingenic&nbsp;T10<br>![T10][T10]                           |        |        |        |     |      |     |      |                    | R&D    |
 | Ingenic&nbsp;T20<br>![T20][T20]                           |        |        |        |     |      |     |      |                    | R&D    |
 | Ingenic&nbsp;T21<br>![T21][T21]                           |        |        |        |     |      |     |      |                    | R&D    |
-| Ingenic&nbsp;T31<br>![T31][T31]                           |        |   +    |   +    |     |      |     |      | [⬇][fwT31]         | WIP    |
+| Ingenic&nbsp;T31<br>![T31][T31]                           |        |   +    |   +    |     |      |     |      | [⬇][fwT31]         | DONE   |
 | MStar&nbsp;MSC313E<br>![MSC313E][MSC313E]                 |        |        |        |     |      |     |      |                    | R&D    |
 | MStar&nbsp;MSC316D<br>![MSC316D][MSC316D]                 |        |        |        |     |      |     |      |                    | R&D    |
 | Novatek&nbsp;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