diff --git a/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/config.json b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/config.json
new file mode 100644
index 000000000..1a9742fdb
--- /dev/null
+++ b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/config.json
@@ -0,0 +1,9 @@
+{
+ "ddr_cfg_list": [
+ "",
+ "ddr3_1866_x16",
+ "ddr3_2133_x16",
+ "ddr_auto_x16"
+ ],
+ "board_information": "C906B + SD + QFN SIP 256MB"
+}
diff --git a/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/cv1812cp_milkv_duo256m_sd_defconfig b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/cv1812cp_milkv_duo256m_sd_defconfig
new file mode 100644
index 000000000..55e3485a3
--- /dev/null
+++ b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/cv1812cp_milkv_duo256m_sd_defconfig
@@ -0,0 +1,30 @@
+CONFIG_CHIP_cv1812cp=y
+CONFIG_BOARD_milkv_duo256m_sd=y
+CONFIG_DDR_CFG_ddr3_1866_x16=y
+CONFIG_ARCH="riscv"
+CONFIG_CROSS_COMPILE="riscv64-unknown-linux-musl-"
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+CONFIG_KERNEL_ENTRY_HACK=y
+CONFIG_KERNEL_ENTRY_HACK_ADDR="0x80200000"
+CONFIG_TOOLCHAIN_MUSL_RISCV64=y
+CONFIG_FLASH_SIZE_SHRINK=y
+CONFIG_BOOT_IMAGE_SINGLE_DTB=y
+CONFIG_STORAGE_TYPE_sd=y
+CONFIG_SENSOR_SONY_IMX327=y
+CONFIG_SENSOR_SMS_SC035HGS=y
+CONFIG_UBOOT_2021_10=y
+CONFIG_KERNEL_SRC_5.10=y
+CONFIG_KERNEL_LZMA=y
+CONFIG_SKIP_RAMDISK=y
+# CONFIG_ROOTFS_OVERLAYFS is not set
+CONFIG_TARGET_PACKAGE_DROPBEAR=y
+CONFIG_TARGET_PACKAGE_MTD-UTILS=y
+# CONFIG_TARGET_PACKAGE_RSYSLOG is not set
+CONFIG_TARGET_PACKAGE_BUSYBOX_SYSLOGD_SCRIPT=y
+# CONFIG_ENABLE_FREERTOS is not set
+CONFIG_ENABLE_RTOS_DUMP_PRINT=y
+CONFIG_DUMP_PRINT_SZ_IDX=17
+CONFIG_TARGET_PACKAGE_GATORD=n
+CONFIG_TARGET_PACKAGE_NTP=y
+# CONFIG_TARGET_PACKAGE_WIFI is not set
+CONFIG_BUILDROOT_FS=y
diff --git a/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/dts_riscv/cv1812cp_milkv_duo256m_sd.dts b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/dts_riscv/cv1812cp_milkv_duo256m_sd.dts
new file mode 100644
index 000000000..ae1618529
--- /dev/null
+++ b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/dts_riscv/cv1812cp_milkv_duo256m_sd.dts
@@ -0,0 +1,22 @@
+/dts-v1/;
+#include "cv181x_base_riscv.dtsi"
+#include "cv181x_asic_qfn.dtsi"
+#include "cv181x_asic_sd.dtsi"
+#include "cv181x_default_memmap.dtsi"
+
+&mipi_rx{
+ snsr-reset = <&portc 17 GPIO_ACTIVE_LOW>, <&portc 17 GPIO_ACTIVE_LOW>, <&portc 17 GPIO_ACTIVE_LOW>;
+};
+
+&i2c0 {
+ status = "disabled";
+};
+
+&i2c4 {
+ status = "disabled";
+};
+
+/ {
+
+};
+
diff --git a/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/linux/cvitek_cv1812cp_milkv_duo256m_sd_defconfig b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/linux/cvitek_cv1812cp_milkv_duo256m_sd_defconfig
new file mode 100644
index 000000000..0de820d9e
--- /dev/null
+++ b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/linux/cvitek_cv1812cp_milkv_duo256m_sd_defconfig
@@ -0,0 +1,277 @@
+CONFIG_CC_OPTIMIZE_FOR_SIZE=y
+# CONFIG_SWAP is not set
+CONFIG_SYSVIPC=y
+CONFIG_POSIX_MQUEUE=y
+CONFIG_NO_HZ_IDLE=y
+CONFIG_HIGH_RES_TIMERS=y
+CONFIG_PREEMPT=y
+CONFIG_IKCONFIG=y
+CONFIG_IKCONFIG_PROC=y
+CONFIG_LOG_BUF_SHIFT=15
+CONFIG_BLK_DEV_INITRD=y
+# CONFIG_SYSFS_SYSCALL is not set
+# CONFIG_FHANDLE is not set
+# CONFIG_BASE_FULL is not set
+# CONFIG_AIO is not set
+CONFIG_EMBEDDED=y
+# CONFIG_SLUB_DEBUG is not set
+CONFIG_FORCE_MAX_ZONEORDER=10
+CONFIG_ARCH_CVITEK=y
+CONFIG_SOC_THEAD=y
+# CONFIG_RISCV_SWIOTLB is not set
+CONFIG_VECTOR=y
+CONFIG_VECTOR_0_7=y
+# CONFIG_COMPAT is not set
+CONFIG_ARCH_CVITEK_CHIP="cv181x"
+CONFIG_ARCH_CV181X_ASIC=y
+CONFIG_POWER_RESET=y
+CONFIG_COMPAT_32BIT_TIME=y
+CONFIG_STRICT_KERNEL_RWX=n
+CONFIG_MODULES=y
+CONFIG_MODULE_FORCE_LOAD=y
+CONFIG_MODULE_UNLOAD=y
+# CONFIG_BLK_DEV_BSG is not set
+# CONFIG_MQ_IOSCHED_DEADLINE is not set
+# CONFIG_MQ_IOSCHED_KYBER is not set
+# CONFIG_COREDUMP is not set
+CONFIG_CMA=y
+CONFIG_NET=y
+CONFIG_PACKET=y
+CONFIG_UNIX=y
+CONFIG_INET=y
+# CONFIG_INET_DIAG is not set
+# CONFIG_IPV6 is not set
+CONFIG_CFG80211=y
+CONFIG_RFKILL=y
+CONFIG_UEVENT_HELPER=y
+CONFIG_DEVTMPFS=y
+CONFIG_DEVTMPFS_MOUNT=y
+# CONFIG_ALLOW_DEV_COREDUMP is not set
+CONFIG_MTD=y
+CONFIG_MTD_CMDLINE_PARTS=y
+# CONFIG_MTD_OF_PARTS is not set
+CONFIG_MTD_BLOCK=y
+CONFIG_MTD_RAW_NAND=y
+CONFIG_MTD_UBI=y
+CONFIG_MTD_UBI_BLOCK=y
+CONFIG_NETDEVICES=y
+# CONFIG_NET_CORE is not set
+# CONFIG_NET_VENDOR_ALACRITECH is not set
+# CONFIG_NET_VENDOR_AMAZON is not set
+# CONFIG_NET_VENDOR_AQUANTIA is not set
+# CONFIG_NET_VENDOR_ARC is not set
+# CONFIG_NET_VENDOR_AURORA is not set
+# CONFIG_NET_VENDOR_BROADCOM is not set
+# CONFIG_NET_VENDOR_CADENCE is not set
+# CONFIG_NET_VENDOR_CAVIUM is not set
+# CONFIG_NET_VENDOR_CORTINA is not set
+# CONFIG_NET_VENDOR_EZCHIP is not set
+# CONFIG_NET_VENDOR_HUAWEI is not set
+# CONFIG_NET_VENDOR_INTEL is not set
+# CONFIG_NET_VENDOR_MARVELL is not set
+# CONFIG_NET_VENDOR_MICREL is not set
+# CONFIG_NET_VENDOR_MICROCHIP is not set
+# CONFIG_NET_VENDOR_MICROSEMI is not set
+# CONFIG_NET_VENDOR_NATSEMI is not set
+# CONFIG_NET_VENDOR_NETRONOME is not set
+# CONFIG_NET_VENDOR_NI is not set
+# CONFIG_NET_VENDOR_QUALCOMM is not set
+# CONFIG_NET_VENDOR_RENESAS is not set
+# CONFIG_NET_VENDOR_ROCKER is not set
+# CONFIG_NET_VENDOR_SAMSUNG is not set
+# CONFIG_NET_VENDOR_SEEQ is not set
+# CONFIG_NET_VENDOR_SOLARFLARE is not set
+# CONFIG_NET_VENDOR_SOCIONEXT is not set
+CONFIG_STMMAC_ETH=y
+# CONFIG_DWMAC_GENERIC is not set
+# CONFIG_NET_VENDOR_SYNOPSYS is not set
+# CONFIG_NET_VENDOR_VIA is not set
+# CONFIG_NET_VENDOR_WIZNET is not set
+CONFIG_CVITEK_PHY=y
+# CONFIG_USB_NET_DRIVERS is not set
+# CONFIG_WLAN_VENDOR_ADMTEK is not set
+# CONFIG_WLAN_VENDOR_ATH is not set
+# CONFIG_WLAN_VENDOR_ATMEL is not set
+# CONFIG_WLAN_VENDOR_BROADCOM is not set
+# CONFIG_WLAN_VENDOR_CISCO is not set
+# CONFIG_WLAN_VENDOR_INTEL is not set
+# CONFIG_WLAN_VENDOR_INTERSIL is not set
+# CONFIG_WLAN_VENDOR_MARVELL is not set
+# CONFIG_WLAN_VENDOR_MEDIATEK is not set
+# CONFIG_WLAN_VENDOR_RALINK is not set
+# CONFIG_RTL8188FU is not set
+# CONFIG_WLAN_VENDOR_RSI is not set
+# CONFIG_WLAN_VENDOR_ST is not set
+# CONFIG_WLAN_VENDOR_TI is not set
+# CONFIG_WLAN_VENDOR_ZYDAS is not set
+CONFIG_INPUT=y
+CONFIG_INPUT_MOUSEDEV=y
+CONFIG_INPUT_MOUSEDEV_PSAUX=y
+CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
+CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
+CONFIG_INPUT_EVDEV=y
+# CONFIG_SERIO is not set
+# CONFIG_VT is not set
+# CONFIG_LEGACY_PTYS is not set
+CONFIG_SERIAL_8250=y
+CONFIG_SERIAL_8250_CONSOLE=y
+CONFIG_SERIAL_8250_NR_UARTS=5
+CONFIG_SERIAL_8250_RUNTIME_UARTS=5
+CONFIG_SERIAL_8250_DW=y
+CONFIG_SERIAL_EARLYCON_RISCV_SBI=y
+CONFIG_HW_RANDOM=y
+CONFIG_I2C=y
+CONFIG_I2C_CHARDEV=y
+CONFIG_I2C_MUX=y
+CONFIG_I2C_DESIGNWARE_PLATFORM=y
+CONFIG_SPI=y
+# CONFIG_PTP_1588_CLOCK is not set
+CONFIG_PINCTRL=y
+CONFIG_CVITEK_PINCTRL_CV1835=y
+CONFIG_GPIOLIB=y
+CONFIG_GPIO_SYSFS=y
+CONFIG_GPIO_DWAPB=y
+CONFIG_POWER_RESET=y
+CONFIG_THERMAL=y
+CONFIG_THERMAL_NETLINK=y
+CONFIG_THERMAL_WRITABLE_TRIPS=y
+CONFIG_THERMAL_EMULATION=y
+CONFIG_WATCHDOG=y
+CONFIG_MEDIA_SUPPORT=n
+CONFIG_VIDEO_V4L2_SUBDEV_API=n
+# CONFIG_DVB_NET is not set
+# CONFIG_DVB_DYNAMIC_MINORS is not set
+CONFIG_V4L_PLATFORM_DRIVERS=n
+CONFIG_V4L_MEM2MEM_DRIVERS=n
+CONFIG_VIDEO_MEM2MEM_DEINTERLACE=n
+CONFIG_VIDEO_CVITEK_CIF=m
+CONFIG_VIDEO_CVITEK_SNS_I2C=m
+CONFIG_FB=y
+CONFIG_FB_CVITEK=m
+CONFIG_SOUND=y
+CONFIG_SND=y
+# CONFIG_SND_SUPPORT_OLD_API is not set
+# CONFIG_SND_PROC_FS is not set
+# CONFIG_SND_DRIVERS is not set
+CONFIG_SND_HDA_PREALLOC_SIZE=1
+# CONFIG_SND_SPI is not set
+# CONFIG_SND_USB is not set
+CONFIG_SND_SOC=y
+CONFIG_SND_SOC_CV182XA_CV182XAADC=y
+CONFIG_SND_SOC_CV182XA_CV182XADAC=y
+CONFIG_SND_CV1835_I2S=y
+CONFIG_SND_SOC_CV182XAADC=y
+CONFIG_SND_SOC_CV182XADAC=y
+CONFIG_SND_SOC_CV1835_USE_AUDIO_PLL=y
+CONFIG_CV1835_I2S_SUBSYS=y
+CONFIG_USB=y
+CONFIG_USB_DWC2=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_LIBCOMPOSITE=y
+CONFIG_USB_F_ACM=y
+CONFIG_USB_U_SERIAL=y
+CONFIG_USB_U_ETHER=y
+CONFIG_USB_U_AUDIO=y
+CONFIG_USB_F_SERIAL=y
+CONFIG_USB_F_ECM=y
+CONFIG_USB_F_EEM=y
+CONFIG_USB_F_RNDIS=y
+CONFIG_USB_F_MASS_STORAGE=y
+CONFIG_USB_F_FS=y
+CONFIG_USB_F_UAC1=y
+CONFIG_USB_F_UVC=y
+CONFIG_USB_CONFIGFS=y
+CONFIG_USB_CONFIGFS_SERIAL=y
+CONFIG_USB_CONFIGFS_RNDIS=y
+CONFIG_USB_CONFIGFS_ACM=y
+CONFIG_MMC=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_PLTFM=y
+CONFIG_MMC_SDHCI_CVI=y
+CONFIG_RTC_CLASS=y
+CONFIG_DMADEVICES=y
+CONFIG_DW_DMAC_CVITEK=y
+CONFIG_RTC_CLASS=y
+# CONFIG_VIRTIO_MENU is not set
+CONFIG_STAGING=y
+CONFIG_ION=y
+CONFIG_ION_SYSTEM_HEAP=y
+CONFIG_ION_CARVEOUT_HEAP=y
+CONFIG_ION_CMA_HEAP=y
+# CONFIG_IOMMU_SUPPORT is not set
+CONFIG_CV1835_SYSDMA_REMAP=y
+CONFIG_PWM=y
+CONFIG_SIFIVE_PLIC=y
+CONFIG_ANDROID=y
+# CONFIG_MANDATORY_FILE_LOCKING is not set
+CONFIG_MSDOS_FS=y
+CONFIG_VFAT_FS=y
+# CONFIG_PROC_PAGE_MONITOR is not set
+CONFIG_TMPFS=y
+CONFIG_CONFIGFS_FS=y
+CONFIG_JFFS2_FS=y
+CONFIG_JFFS2_FS_WBUF_VERIFY=y
+CONFIG_UBIFS_FS=y
+CONFIG_SQUASHFS=y
+CONFIG_EXT3_FS=y
+CONFIG_EXT4_FS=y
+CONFIG_EXT4_USE_FOR_EXT2=y
+CONFIG_EXT4_DEBUG=y
+# CONFIG_SQUASHFS_ZLIB is not set
+CONFIG_SQUASHFS_LZ4=n
+CONFIG_SQUASHFS_XZ=y
+CONFIG_NETWORK_FILESYSTEMS=y
+CONFIG_NFS_FS=y
+CONFIG_NFS_V2=y
+CONFIG_NFS_V3=y
+CONFIG_ROOT_NFS=y
+CONFIG_NLS_CODEPAGE_437=y
+CONFIG_NLS_ISO8859_1=y
+CONFIG_NLS_ISO8859_2=y
+CONFIG_NLS_ISO8859_3=y
+CONFIG_CRYPTO_SHA256=y
+# CONFIG_CRYPTO_HW is not set
+# CONFIG_XZ_DEC_X86 is not set
+# CONFIG_XZ_DEC_POWERPC is not set
+# CONFIG_XZ_DEC_IA64 is not set
+# CONFIG_XZ_DEC_ARMTHUMB is not set
+# CONFIG_XZ_DEC_SPARC is not set
+CONFIG_DMA_CMA=y
+CONFIG_CMA_SIZE_MBYTES=0
+CONFIG_PRINTK_TIME=y
+# CONFIG_DEBUG_BUGVERBOSE is not set
+# CONFIG_ENABLE_MUST_CHECK is not set
+# CONFIG_SCHED_DEBUG is not set
+# CONFIG_DEBUG_PREEMPT is not set
+# CONFIG_FTRACE is not set
+# CONFIG_RUNTIME_TESTING_MENU is not set
+CONFIG_DYNAMIC_DEBUG=y
+CONFIG_DEBUG_INFO=n
+CONFIG_DEBUG_INFO_DWARF4=n
+CONFIG_DEBUG_FS=y
+CONFIG_GDB_SCRIPTS=y
+# CONFIG_ENABLE_MUST_CHECK is not set
+CONFIG_DEBUG_FS=y
+CONFIG_BLK_DEV_INITRD=y
+CONFIG_RD_GZIP=y
+CONFIG_RD_BZIP2=y
+CONFIG_RD_LZMA=y
+CONFIG_RD_XZ=y
+CONFIG_RD_LZO=y
+CONFIG_RD_LZ4=y
+CONFIG_RD_ZSTD=y
+CONFIG_KALLSYMS=y
+CONFIG_FRAME_POINTER=n
+CONFIG_DEBUG_MISC=n
+CONFIG_RCU_TRACE=y
+CONFIG_USB_CONFIGFS_MASS_STORAGE=y
+CONFIG_MULTIUSER=y
+CONFIG_BUG=n
+CONFIG_IO_URING=n
+CONFIG_ADVISE_SYSCALLS=n
+CONFIG_SIGNALFD=n
+CONFIG_TIMERFD=n
+CONFIG_EPOLL=n
+CONFIG_ELF_CORE=y
+CONFIG_COREDUMP=y
+CONFIG_PROC_SYSCTL=y
diff --git a/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/memmap.py b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/memmap.py
new file mode 100755
index 000000000..fcc097d01
--- /dev/null
+++ b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/memmap.py
@@ -0,0 +1,85 @@
+SIZE_1M = 0x100000
+SIZE_1K = 1024
+
+
+# Only attributes in class MemoryMap are generated to .h
+class MemoryMap:
+ # No prefix "CVIMMAP_" for the items in _no_prefix[]
+ _no_prefix = [
+ "CONFIG_SYS_TEXT_BASE" # u-boot's CONFIG_SYS_TEXT_BASE is used without CPP.
+ ]
+
+ DRAM_BASE = 0x80000000
+ DRAM_SIZE = 256 * SIZE_1M
+
+ # ==============
+ # C906L FreeRTOS
+ # ==============
+ FREERTOS_SIZE = 2 * SIZE_1M
+ # FreeRTOS is at the end of DRAM
+ FREERTOS_ADDR = DRAM_BASE + DRAM_SIZE - FREERTOS_SIZE
+ FSBL_C906L_START_ADDR = FREERTOS_ADDR
+
+ # ==============================
+ # OpenSBI | arm-trusted-firmware
+ # ==============================
+ # Monitor is at the begining of DRAM
+ MONITOR_ADDR = DRAM_BASE
+
+ ATF_SIZE = 512 * SIZE_1K
+ OPENSBI_SIZE = 512 * SIZE_1K
+ OPENSBI_FDT_ADDR = MONITOR_ADDR + OPENSBI_SIZE
+
+ # =========================
+ # memory@DRAM_BASE in .dts.
+ # =========================
+ # Ignore the area of FreeRTOS in u-boot and kernel
+ KERNEL_MEMORY_ADDR = DRAM_BASE
+ KERNEL_MEMORY_SIZE = DRAM_SIZE - FREERTOS_SIZE
+
+ # =================
+ # Multimedia buffer. Used by u-boot/kernel/FreeRTOS
+ # =================
+ ION_SIZE = 75 * SIZE_1M
+ H26X_BITSTREAM_SIZE = 2 * SIZE_1M
+ H26X_ENC_BUFF_SIZE = 0
+ ISP_MEM_BASE_SIZE = 20 * SIZE_1M
+ FREERTOS_RESERVED_ION_SIZE = H26X_BITSTREAM_SIZE + H26X_ENC_BUFF_SIZE + ISP_MEM_BASE_SIZE
+
+ # ION after FreeRTOS
+ ION_ADDR = FREERTOS_ADDR - ION_SIZE
+
+ # Buffers of the fast image are inside the ION buffer
+ H26X_BITSTREAM_ADDR = ION_ADDR
+ H26X_ENC_BUFF_ADDR = H26X_BITSTREAM_ADDR + H26X_BITSTREAM_SIZE
+ ISP_MEM_BASE_ADDR = H26X_ENC_BUFF_ADDR + H26X_ENC_BUFF_SIZE
+
+ assert ISP_MEM_BASE_ADDR + ISP_MEM_BASE_SIZE <= ION_ADDR + ION_SIZE
+
+ # Boot logo is after the ION buffer
+ # Framebuffer uses boot logo's reserved memory
+ BOOTLOGO_SIZE = 1800 * SIZE_1K
+ BOOTLOGO_ADDR = ION_ADDR - BOOTLOGO_SIZE
+ FRAMEBUFFER_SIZE = BOOTLOGO_SIZE
+ FRAMEBUFFER_ADDR = BOOTLOGO_ADDR
+
+ # ===================
+ # FSBL and u-boot-2021
+ # ===================
+ CVI_UPDATE_HEADER_SIZE = SIZE_1K
+ UIMAG_SIZE = 16 * SIZE_1M
+
+ # kernel image loading buffer
+ UIMAG_ADDR = DRAM_BASE + 24 * SIZE_1M
+ CVI_UPDATE_HEADER_ADDR = UIMAG_ADDR - CVI_UPDATE_HEADER_SIZE
+
+ # FSBL decompress buffer
+ FSBL_UNZIP_ADDR = UIMAG_ADDR
+ FSBL_UNZIP_SIZE = UIMAG_SIZE
+
+ assert UIMAG_ADDR + UIMAG_SIZE <= BOOTLOGO_ADDR
+
+ # u-boot's run address and entry point
+ CONFIG_SYS_TEXT_BASE = DRAM_BASE + 2 * SIZE_1M
+ # u-boot's init stack point is only used before board_init_f()
+ CONFIG_SYS_INIT_SP_ADDR = UIMAG_ADDR + UIMAG_SIZE
diff --git a/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/partition/partition_sd.xml b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/partition/partition_sd.xml
new file mode 100644
index 000000000..c127b61ab
--- /dev/null
+++ b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/partition/partition_sd.xml
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/rootfs_script/clean_rootfs.sh b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/rootfs_script/clean_rootfs.sh
new file mode 100755
index 000000000..26692d889
--- /dev/null
+++ b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/rootfs_script/clean_rootfs.sh
@@ -0,0 +1,70 @@
+#!/bin/bash
+
+SYSTEM_DIR=$1
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/libz*
+rm -f $SYSTEM_DIR/mnt/system/lib/libz*
+
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/3rd/libcvi*
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/3rd/libmad*
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/3rd/libmp3*
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/3rd/libopencv*
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/libopencv*
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/libcvi_rtsp.so
+rm -f $SYSTEM_DIR/mnt/system/data/install/lib/libcvi_rtsp.so
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/libcvikernel.so
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/*.a
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/libgst*
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/libg*
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/gstreamer-1.0/libgst*
+rm -f $SYSTEM_DIR/mnt/system/data/install/lib/libcrypto.so*
+rm -f $SYSTEM_DIR/mnt/system/data/install/lib/libssl.so*
+rm -f $SYSTEM_DIR/mnt/system/data/install/lib/libcvi_protobuf.so*
+rm -f $SYSTEM_DIR/mnt/system/data/install/lib/libprotobuf-lite.so*
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/libcviai*
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/libcvi_ispd.so*
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/libraw_replay.so*
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/libcvi_ive_tpu.so*
+rm -rf $SYSTEM_DIR/mnt/system/usr/lib/gio
+rm -rf $SYSTEM_DIR/mnt/system/usr/lib/glib*
+rm -rf $SYSTEM_DIR/mnt/system/usr/lib/gstreamer-1.0*
+rm -rf $SYSTEM_DIR/mnt/system/usr/libexec*
+rm -rf $SYSTEM_DIR/mnt/system/usr/bin
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/libcvimath.so
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/libcviruntime.so
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/libcnpy.so
+rm -f $SYSTEM_DIR/mnt/system/usr/lib/libcipher.so
+
+rm -f $SYSTEM_DIR/mnt/system/lib/libcipher.so*
+rm -f $SYSTEM_DIR/mnt/system/lib/libcvi_ispd.so*
+rm -f $SYSTEM_DIR/mnt/system/lib/libraw_replay.so*
+rm -f $SYSTEM_DIR/mnt/system/lib/libmad.so*
+rm -f $SYSTEM_DIR/mnt/system/lib/libmp3*
+rm -f $SYSTEM_DIR/mnt/system/lib/libnanomsg*
+
+#del 3rdparty lib
+#del thttpd/libwebsockets lib
+rm -f $SYSTEM_DIR/mnt/system/lib/libthttpd*
+rm -f $SYSTEM_DIR/mnt/system/lib/libwebsocket*
+if [ $SDK_VER = "uclibc" ]
+then
+ #del opencv lib
+ rm -f $SYSTEM_DIR/mnt/system/lib/libopencv*
+ #del ffmpeg lib
+ rm -f $SYSTEM_DIR/mnt/system/lib/libav*
+ #save /mnt/system/lib/ openssl lib; need by ntpdate/wpa_supplicant
+else
+ #glibc ramdisk(rootfs/common_arm/usr/lib/) has libcrypto.so and libssl.so
+ #del openssl
+ rm -f $SYSTEM_DIR/mnt/system/lib/libssl*
+ rm -f $SYSTEM_DIR/mnt/system/lib/libcrypto*
+fi
+
+rm -rf $SYSTEM_DIR/etc/init.d/S23ntp
+rm -rf $SYSTEM_DIR/bin/ntpd
+
+du -sh $SYSTEM_DIR/* |sort -rh
+du -sh $SYSTEM_DIR/mnt/* |sort -rh
+du -sh $SYSTEM_DIR/mnt/system/* |sort -rh
+du -sh $SYSTEM_DIR/mnt/system/lib/* |sort -rh
+du -sh $SYSTEM_DIR/mnt/system/data/install/* |sort -rh
+du -sh $SYSTEM_DIR/usr/* |sort -rh
diff --git a/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/u-boot/cvi_board_init.c b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/u-boot/cvi_board_init.c
new file mode 100644
index 000000000..2938a3ec9
--- /dev/null
+++ b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/u-boot/cvi_board_init.c
@@ -0,0 +1,8 @@
+int cvi_board_init(void)
+{
+ PINMUX_CONFIG(PAD_MIPI_TXM1, IIC2_SDA);
+ PINMUX_CONFIG(PAD_MIPI_TXP1, IIC2_SCL);
+ PINMUX_CONFIG(PAD_MIPI_TXM0, CAM_MCLK1);
+
+ return 0;
+}
diff --git a/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/u-boot/cvitek.h b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/u-boot/cvitek.h
new file mode 100644
index 000000000..8a122c238
--- /dev/null
+++ b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/u-boot/cvitek.h
@@ -0,0 +1,12 @@
+/*
+ *VO control GPIOs
+ */
+#define VO_GPIO_RESET_PORT portb
+#define VO_GPIO_RESET_INDEX 5
+#define VO_GPIO_RESET_ACTIVE GPIO_ACTIVE_LOW
+#define VO_GPIO_PWM_PORT portb
+#define VO_GPIO_PWM_INDEX 4
+#define VO_GPIO_PWM_ACTIVE GPIO_ACTIVE_HIGH
+#define VO_GPIO_POWER_CT_PORT portb
+#define VO_GPIO_POWER_CT_INDEX 3
+#define VO_GPIO_POWER_CT_ACTIVE GPIO_ACTIVE_HIGH
diff --git a/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/u-boot/cvitek_cv1812cp_milkv_duo256m_sd_defconfig b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/u-boot/cvitek_cv1812cp_milkv_duo256m_sd_defconfig
new file mode 100644
index 000000000..055f12eb5
--- /dev/null
+++ b/build/boards/cv181x/cv1812cp_milkv_duo256m_sd/u-boot/cvitek_cv1812cp_milkv_duo256m_sd_defconfig
@@ -0,0 +1,43 @@
+CONFIG_RISCV=y
+CONFIG_SYS_MALLOC_F_LEN=0x2000
+CONFIG_NR_DRAM_BANKS=1
+CONFIG_DEFAULT_DEVICE_TREE="cv181x_asic"
+CONFIG_IDENT_STRING=" cvitek_cv181x"
+CONFIG_ARCH_RV64I=y
+CONFIG_RISCV_SMODE=y
+CONFIG_TARGET_CVITEK_CV181X=y
+CONFIG_DISTRO_DEFAULTS=y
+CONFIG_FIT=y
+# CONFIG_ARCH_FIXUP_FDT_MEMORY is not set
+CONFIG_BOOTDELAY=1
+CONFIG_SYS_PROMPT="cv181x_c906# "
+# CONFIG_CMD_CONSOLE is not set
+# CONFIG_CMD_XIMG is not set
+# CONFIG_CMD_EDITENV is not set
+# CONFIG_CMD_CRC32 is not set
+# CONFIG_CMD_LZMADEC is not set
+# CONFIG_CMD_UNLZ4 is not set
+# CONFIG_CMD_UNZIP is not set
+# CONFIG_CMD_LOADS is not set
+CONFIG_CMD_MMC=y
+# CONFIG_CMD_ITEST is not set
+CONFIG_CMD_CACHE=y
+CONFIG_CMD_CVI_SD_UPDATE=y
+# CONFIG_ISO_PARTITION is not set
+# CONFIG_EFI_PARTITION is not set
+CONFIG_NET_RANDOM_ETHADDR=y
+CONFIG_MMC=y
+CONFIG_MMC_SDHCI=y
+CONFIG_MMC_SDHCI_SDMA=y
+CONFIG_MMC_SDHCI_CVITEK=y
+CONFIG_MTD=y
+# CONFIG_PHY_SMSC is not set
+CONFIG_DM_ETH=y
+CONFIG_ETH_DESIGNWARE=y
+CONFIG_PHY_CVITEK=y
+CONFIG_SYS_NS16550=y
+CONFIG_SPI=y
+CONFIG_LZ4=y
+CONFIG_LZMA=y
+# CONFIG_TOOLS_LIBCRYPTO is not set
+CONFIG_ENV_IS_NOWHERE=y
diff --git a/build/boards/default/dts/cv181x/cv181x_asic_qfn.dtsi b/build/boards/default/dts/cv181x/cv181x_asic_qfn.dtsi
index 5bb417dc9..93081c5d7 100644
--- a/build/boards/default/dts/cv181x/cv181x_asic_qfn.dtsi
+++ b/build/boards/default/dts/cv181x/cv181x_asic_qfn.dtsi
@@ -13,7 +13,7 @@
};
&dac{
- mute-gpio-r = <&porte 2 GPIO_ACTIVE_LOW>;
+ mute-gpio-r = <&porte 1 GPIO_ACTIVE_LOW>;
};
&spi0 {
diff --git a/build/boards/default/dts/cv181x/cv181x_asic_sd.dtsi b/build/boards/default/dts/cv181x/cv181x_asic_sd.dtsi
new file mode 100644
index 000000000..5af9620d8
--- /dev/null
+++ b/build/boards/default/dts/cv181x/cv181x_asic_sd.dtsi
@@ -0,0 +1,4 @@
+/ {
+ /delete-node/ cv-emmc@4300000;
+ /delete-node/ cv-spinf@4060000;
+};
diff --git a/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/.gitignore b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/.gitignore
new file mode 100644
index 000000000..602738bf8
--- /dev/null
+++ b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/.gitignore
@@ -0,0 +1,2 @@
+mnt/system/
+usr/bin
diff --git a/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/etc/dnsmasq.conf b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/etc/dnsmasq.conf
new file mode 100644
index 000000000..fcdb620ff
--- /dev/null
+++ b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/etc/dnsmasq.conf
@@ -0,0 +1,4 @@
+interface=usb0
+dhcp-range=192.168.42.2,192.168.42.242,1h
+dhcp-option=3
+dhcp-option=6
diff --git a/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/etc/init.d/S99user b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/etc/init.d/S99user
new file mode 100755
index 000000000..32b524845
--- /dev/null
+++ b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/etc/init.d/S99user
@@ -0,0 +1,50 @@
+#!/bin/sh
+${CVI_SHOPTS}
+#
+# Start firmware
+#
+export USERDATAPATH=/mnt/data/
+export SYSTEMPATH=/mnt/system/
+
+case "$1" in
+ start)
+ echo "init mpp system..."
+ if [ -d $SYSTEMPATH/ko ]; then
+ sh $SYSTEMPATH/ko/loadsystemko.sh
+ fi
+
+ echo "Starting app..."
+
+ if [ -f $SYSTEMPATH/duo-init.sh ]; then
+ . $SYSTEMPATH/duo-init.sh &
+ fi
+
+ if [ -f $SYSTEMPATH/blink.sh ]; then
+ . $SYSTEMPATH/blink.sh &
+ fi
+
+ if [ -f $SYSTEMPATH/usb.sh ]; then
+ . $SYSTEMPATH/usb.sh &
+ fi
+
+ if [ -f $USERDATAPATH/auto.sh ]; then
+ usleep 30000
+ . $USERDATAPATH/auto.sh &
+ exit 1
+ fi
+ if [ -f $SYSTEMPATH/auto.sh ]; then
+ usleep 30000
+ . $SYSTEMPATH/auto.sh &
+ fi
+ ;;
+ stop)
+ ;;
+ restart|reload)
+ ;;
+ *)
+ echo "Usage: $0 {start|stop|restart}"
+ exit 1
+esac
+
+exit $?
+
diff --git a/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/etc/inittab b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/etc/inittab
new file mode 100644
index 000000000..2c9793ce9
--- /dev/null
+++ b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/etc/inittab
@@ -0,0 +1,40 @@
+# /etc/inittab
+#
+# Copyright (C) 2001 Erik Andersen
+#
+# Note: BusyBox init doesn't support runlevels. The runlevels field is
+# completely ignored by BusyBox init. If you want runlevels, use
+# sysvinit.
+#
+# Format for each entry: :::
+#
+# id == tty to run on, or empty for /dev/console
+# runlevels == ignored
+# action == one of sysinit, respawn, askfirst, wait, and once
+# process == program to run
+
+# Startup the system
+::sysinit:/bin/mount -t proc proc /proc
+::sysinit:/bin/mount -o remount,rw /
+::sysinit:/bin/mkdir -p /dev/pts /dev/shm
+::sysinit:/bin/mount -a
+::sysinit:/sbin/swapon -a
+null::sysinit:/bin/ln -sf /proc/self/fd /dev/fd
+null::sysinit:/bin/ln -sf /proc/self/fd/0 /dev/stdin
+null::sysinit:/bin/ln -sf /proc/self/fd/1 /dev/stdout
+null::sysinit:/bin/ln -sf /proc/self/fd/2 /dev/stderr
+::sysinit:/bin/hostname -F /etc/hostname
+# now run any rc scripts
+::sysinit:/etc/init.d/rcS
+
+# Put a getty on the serial port
+# console::respawn:/sbin/getty -L console 0 vt100 # GENERIC_SERIAL
+console::respawn:/sbin/getty -L console 115200 vt100 -n -l /usr/local/bin/autologin
+
+# Stuff to do for the 3-finger salute
+#::ctrlaltdel:/sbin/reboot
+
+# Stuff to do before rebooting
+::shutdown:/etc/init.d/rcK
+::shutdown:/sbin/swapoff -a
+::shutdown:/bin/umount -a -r
diff --git a/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/etc/profile b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/etc/profile
new file mode 100644
index 000000000..d99b37863
--- /dev/null
+++ b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/etc/profile
@@ -0,0 +1,37 @@
+export PATH="/bin:/sbin:/usr/bin:/usr/sbin"
+export PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/mnt/system/usr/bin:/mnt/system/usr/sbin:/mnt/data/bin:/mnt/data/sbin"
+
+if [ "$PS1" ]; then
+ if [ "`id -u`" -eq 0 ]; then
+ export PS1='# '
+ else
+ export PS1='$ '
+ fi
+fi
+
+export PAGER='/bin/more '
+export EDITOR='/bin/vi'
+
+# Source configuration files from /etc/profile.d
+for i in /etc/profile.d/*.sh ; do
+ if [ -r "$i" ]; then
+ . $i
+ fi
+ unset i
+done
+
+export HOSTNAME="$(hostname)"
+export OLDPWD=/root
+
+if [ '$USER' == 'root' ]; then
+ export PS1='[\u@\h]\w\# '
+else
+ export PS1='[\u@\h]\w\$ '
+fi
+
+alias ll='ls -alF'
+alias la='ls -A'
+alias l='ls -CF'
+
+export TERM=vt100
+export TERMINFO=/usr/share/terminfo
diff --git a/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/etc/run_usb.sh b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/etc/run_usb.sh
new file mode 100755
index 000000000..760c70284
--- /dev/null
+++ b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/etc/run_usb.sh
@@ -0,0 +1,292 @@
+CLASS=acm
+VID=0x3346
+PID=0x1003
+MSC_PID=0x1008
+RNDIS_PID=0x1009
+UVC_PID=0x100A
+UAC_PID=0x100B
+ADB_VID=0x18D1
+ADB_PID=0x4EE0
+ADB_PID_M1=0x4EE2
+ADB_PID_M2=0x4EE4
+MANUFACTURER="Cvitek"
+PRODUCT="USB Com Port"
+PRODUCT_RNDIS="RNDIS"
+PRODUCT_UVC="UVC"
+PRODUCT_UAC="UAC"
+PRODUCT_ADB="ADB"
+ADBD_PATH=/usr/bin/
+SERIAL="0123456789"
+MSC_FILE=$3
+CVI_DIR=/tmp/usb
+CVI_GADGET=$CVI_DIR/usb_gadget/cvitek
+CVI_FUNC=$CVI_GADGET/functions
+FUNC_NUM=0
+MAX_EP_NUM=4
+TMP_NUM=0
+INTF_NUM=0
+EP_IN=0
+EP_OUT=0
+
+case "$2" in
+ acm)
+ CLASS=acm
+ ;;
+ msc)
+ CLASS=mass_storage
+ PID=$MSC_PID
+ ;;
+ cvg)
+ CLASS=cvg
+ ;;
+ rndis)
+ CLASS=rndis
+ PID=$RNDIS_PID
+ PRODUCT=$PRODUCT_RNDIS
+ ;;
+ uvc)
+ CLASS=uvc
+ PID=$UVC_PID
+ PRODUCT=$PRODUCT_UVC
+ ;;
+ uac1)
+ CLASS=uac1
+ PID=$UAC_PID
+ PRODUCT=$PRODUCT_UAC
+ ;;
+ adb)
+ CLASS=ffs.adb
+ VID=$ADB_VID
+ PID=$ADB_PID
+ PRODUCT=$PRODUCT_ADB
+ ;;
+ *)
+ if [ "$1" = "probe" ] ; then
+ echo "Usage: $0 probe {acm|msc|cvg|rndis|uvc|uac1|adb}"
+ exit 1
+ fi
+esac
+
+calc_func() {
+ FUNC_NUM=$(ls $CVI_GADGET/functions -l | grep ^d | wc -l)
+ echo "$FUNC_NUM file(s)"
+}
+
+res_check() {
+ TMP_NUM=$(find $CVI_GADGET/functions/ -name "acm*" | wc -l)
+ EP_OUT=$(($EP_OUT+$TMP_NUM))
+ TMP_NUM=$(($TMP_NUM * 2))
+ EP_IN=$(($EP_IN+$TMP_NUM))
+ INTF_NUM=$(($INTF_NUM+$TMP_NUM))
+ TMP_NUM=$(find $CVI_GADGET/functions/ -name "mass_storage*" | wc -l)
+ EP_IN=$(($EP_IN+$TMP_NUM))
+ EP_OUT=$(($EP_OUT+$TMP_NUM))
+ INTF_NUM=$(($INTF_NUM+$TMP_NUM))
+ TMP_NUM=$(find $CVI_GADGET/functions/ -name "cvg*" | wc -l)
+ EP_IN=$(($EP_IN+$TMP_NUM))
+ EP_OUT=$(($EP_OUT+$TMP_NUM))
+ INTF_NUM=$(($INTF_NUM+$TMP_NUM))
+ TMP_NUM=$(find $CVI_GADGET/functions/ -name "rndis*" | wc -l)
+ EP_OUT=$(($EP_OUT+$TMP_NUM))
+ TMP_NUM=$(($TMP_NUM * 2))
+ EP_IN=$(($EP_IN+$TMP_NUM))
+ INTF_NUM=$(($INTF_NUM+$TMP_NUM))
+ TMP_NUM=$(find $CVI_GADGET/functions/ -name "uvc*" | wc -l)
+ TMP_NUM=$(($TMP_NUM * 2))
+ EP_IN=$(($EP_IN+$TMP_NUM))
+ INTF_NUM=$(($INTF_NUM+$TMP_NUM))
+ TMP_NUM=$(find $CVI_GADGET/functions/ -name "uac1*" | wc -l)
+ TMP_NUM=$(($TMP_NUM * 2))
+ EP_IN=$(($EP_IN+$TMP_NUM))
+ EP_OUT=$(($EP_OUT+$TMP_NUM))
+ INTF_NUM=$(($INTF_NUM+$TMP_NUM))
+ TMP_NUM=$(find $CVI_GADGET/functions/ -name ffs.adb | wc -l)
+ EP_IN=$(($EP_IN+$TMP_NUM))
+ EP_OUT=$(($EP_OUT+$TMP_NUM))
+ INTF_NUM=$(($INTF_NUM+$TMP_NUM))
+
+ if [ "$CLASS" = "acm" ] ; then
+ EP_IN=$(($EP_IN+2))
+ EP_OUT=$(($EP_OUT+1))
+ fi
+ if [ "$CLASS" = "mass_storage" ] ; then
+ EP_IN=$(($EP_IN+1))
+ EP_OUT=$(($EP_OUT+1))
+ fi
+ if [ "$CLASS" = "cvg" ] ; then
+ EP_IN=$(($EP_IN+1))
+ EP_OUT=$(($EP_OUT+1))
+ fi
+ if [ "$CLASS" = "rndis" ] ; then
+ EP_IN=$(($EP_IN+2))
+ EP_OUT=$(($EP_OUT+1))
+ fi
+ if [ "$CLASS" = "uvc" ] ; then
+ EP_IN=$(($EP_IN+2))
+ fi
+ if [ "$CLASS" = "uac1" ] ; then
+ EP_IN=$(($EP_IN+1))
+ EP_OUT=$(($EP_OUT+1))
+ fi
+ if [ "$CLASS" = "ffs.adb" ] ; then
+ EP_IN=$(($EP_IN+1))
+ EP_OUT=$(($EP_OUT+1))
+ fi
+ echo "$EP_IN in ep"
+ echo "$EP_OUT out ep"
+ if [ $EP_IN -gt $MAX_EP_NUM ]; then
+ echo "reach maximum resource"
+ exit 1
+ fi
+ if [ $EP_OUT -gt $MAX_EP_NUM ]; then
+ echo "reach maximum resource"
+ exit 1
+ fi
+}
+
+probe() {
+ if [ ! -d $CVI_DIR ]; then
+ mkdir $CVI_DIR
+ fi
+ if [ ! -d $CVI_DIR/usb_gadget ]; then
+ # Enale USB ConfigFS
+ mount none $CVI_DIR -t configfs
+ # Create gadget dev
+ mkdir $CVI_GADGET
+ # Set the VID and PID
+ echo $VID >$CVI_GADGET/idVendor
+ echo $PID >$CVI_GADGET/idProduct
+ # Set the product information string
+ mkdir $CVI_GADGET/strings/0x409
+ echo $MANUFACTURER>$CVI_GADGET/strings/0x409/manufacturer
+ echo $PRODUCT>$CVI_GADGET/strings/0x409/product
+ echo $SERIAL>$CVI_GADGET/strings/0x409/serialnumber
+ # Set the USB configuration
+ mkdir $CVI_GADGET/configs/c.1
+ mkdir $CVI_GADGET/configs/c.1/strings/0x409
+ echo "config1">$CVI_GADGET/configs/c.1/strings/0x409/configuration
+ # Set the MaxPower of USB descriptor
+ echo 120 >$CVI_GADGET/configs/c.1/MaxPower
+ fi
+ # get current functions number
+ calc_func
+ # assign the class code for composite device
+ if [ ! $FUNC_NUM -eq 0 ]; then
+ echo 0xEF >$CVI_GADGET/bDeviceClass
+ echo 0x02 >$CVI_GADGET/bDeviceSubClass
+ echo 0x01 >$CVI_GADGET/bDeviceProtocol
+ fi
+ # resource check
+ res_check
+ # create the desired function
+ if [ "$CLASS" = "ffs.adb" ] ; then
+ # adb shall be the last function to probe. Override the pid/vid
+ echo $VID >$CVI_GADGET/idVendor
+ echo $PID >$CVI_GADGET/idProduct
+ # choose pid for different function number
+ if [ $INTF_NUM -eq 1 ]; then
+ echo $ADB_PID_M1 >$CVI_GADGET/idProduct
+ fi
+ if [ $INTF_NUM -eq 2 ]; then
+ echo $ADB_PID_M2 >$CVI_GADGET/idProduct
+ fi
+ mkdir $CVI_GADGET/functions/$CLASS
+ else
+ mkdir $CVI_GADGET/functions/$CLASS.usb$FUNC_NUM
+ fi
+ if [ "$CLASS" = "mass_storage" ] ; then
+ echo $MSC_FILE >$CVI_GADGET/functions/$CLASS.usb$FUNC_NUM/lun.0/file
+ fi
+ if [ "$CLASS" = "rndis" ] ; then
+ #OS STRING
+ echo 1 >$CVI_GADGET/os_desc/use
+ echo 0xcd >$CVI_GADGET/os_desc/b_vendor_code
+ echo MSFT100 >$CVI_GADGET/os_desc/qw_sign
+ #COMPATIBLE ID
+ echo RNDIS >$CVI_FUNC/rndis.usb$FUNC_NUM/os_desc/interface.rndis/compatible_id
+ #MAKE c.1 THE ONE ASSOCIATED WITH OS DESCRIPTORS
+ ln -s $CVI_GADGET/configs/c.1 $CVI_GADGET/os_desc
+ #MAKE "Icons" EXTENDED PROPERTY
+ mkdir $CVI_FUNC/rndis.usb$FUNC_NUM/os_desc/interface.rndis/Icons
+ echo 2 >$CVI_FUNC/rndis.usb$FUNC_NUM/os_desc/interface.rndis/Icons/type
+ echo "%SystemRoot%\\system32\\shell32.dll,-233" >$CVI_FUNC/rndis.usb$FUNC_NUM/os_desc/interface.rndis/Icons/data
+ #MAKE "Label" EXTENDED PROPERTY
+ mkdir $CVI_FUNC/rndis.usb$FUNC_NUM/os_desc/interface.rndis/Label
+ echo 1 >$CVI_FUNC/rndis.usb$FUNC_NUM/os_desc/interface.rndis/Label/type
+ echo "XYZ Device" >$CVI_FUNC/rndis.usb$FUNC_NUM/os_desc/interface.rndis/Label/data
+ fi
+
+}
+
+start() {
+ # link this function to the configuration
+ calc_func
+ if [ $FUNC_NUM -eq 0 ]; then
+ echo "Functions Empty!"
+ exit 1
+ fi
+ if [ -d $CVI_GADGET/functions/ffs.adb ]; then
+ FUNC_NUM=$(($FUNC_NUM-1))
+ fi
+ for i in `seq 0 $(($FUNC_NUM-1))`;
+ do
+ find $CVI_GADGET/functions/ -name "*.usb$i" | xargs -I % ln -s % $CVI_GADGET/configs/c.1
+ done
+ if [ -d $CVI_GADGET/functions/ffs.adb ]; then
+ ln -s $CVI_GADGET/functions/ffs.adb $CVI_GADGET/configs/c.1
+ mkdir /dev/usb-ffs/adb -p
+ mount -t functionfs adb /dev/usb-ffs/adb
+ if [ -f $ADBD_PATH/adbd ]; then
+ $ADBD_PATH/adbd &
+ fi
+ else
+ # Start the gadget driver
+ UDC=`ls /sys/class/udc/ | awk '{print $1}'`
+ echo ${UDC} >$CVI_GADGET/UDC
+ fi
+}
+
+stop() {
+ if [ -d $CVI_GADGET/configs/c.1/ffs.adb ]; then
+ pkill adbd
+ rm $CVI_GADGET/configs/c.1/ffs.adb
+ else
+ echo "" >$CVI_GADGET/UDC
+ fi
+ find $CVI_GADGET/configs/ -name "*.usb*" | xargs rm -f
+ rmdir $CVI_GADGET/configs/c.*/strings/0x409/
+ tmp_dirs=$(find $CVI_GADGET/os_desc/c.* -type d)
+ if [ -n tmp_dirs ]; then
+ echo "remove os_desc!"
+ rm -rf $CVI_GADGET/os_desc/c.*/
+ find $CVI_GADGET/functions/ -name Icons | xargs rmdir
+ find $CVI_GADGET/functions/ -name Label | xargs rmdir
+ fi
+ rmdir $CVI_GADGET/configs/c.*/
+ rmdir $CVI_GADGET/functions/*
+ rmdir $CVI_GADGET/strings/0x409/
+ rmdir $CVI_GADGET
+ umount $CVI_DIR
+ rmdir $CVI_DIR
+}
+
+case "$1" in
+ start)
+ start
+ ;;
+ stop)
+ stop
+ ;;
+ probe)
+ probe
+ ;;
+ UDC)
+ ls /sys/class/udc/ >$CVI_GADGET/UDC
+ ;;
+ *)
+ echo "Usage: $0 probe {acm|msc|cvg|uvc|uac1} {file (msc)}"
+ echo "Usage: $0 start"
+ echo "Usage: $0 stop"
+ exit 1
+esac
+exit $?
diff --git a/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/etc/uhubon.sh b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/etc/uhubon.sh
new file mode 100755
index 000000000..a8256765d
--- /dev/null
+++ b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/etc/uhubon.sh
@@ -0,0 +1,83 @@
+GPIO_HUBPORT_EN=449
+GPIO_ROLESEL=450
+GPIO_HUBRST=451
+SYS_GPIO=/sys/class/gpio
+
+hub_on() {
+ echo "turn on usb hub"
+ if [ ! -d $SYS_GPIO/gpio$GPIO_HUBPORT_EN ]; then
+ echo $GPIO_HUBPORT_EN >/sys/class/gpio/export
+ fi
+
+ if [ ! -d $SYS_GPIO/gpio$GPIO_ROLESEL ]; then
+ echo $GPIO_ROLESEL >/sys/class/gpio/export
+ fi
+
+ if [ ! -d $SYS_GPIO/gpio$GPIO_HUBRST ]; then
+ echo $GPIO_HUBRST >/sys/class/gpio/export
+ fi
+
+ echo "out" >/sys/class/gpio/gpio$GPIO_HUBPORT_EN/direction
+ echo "out" >/sys/class/gpio/gpio$GPIO_ROLESEL/direction
+ echo "out" >/sys/class/gpio/gpio$GPIO_HUBRST/direction
+
+ echo 1 >/sys/class/gpio/gpio$GPIO_HUBPORT_EN/value
+ echo 0 >/sys/class/gpio/gpio$GPIO_ROLESEL/value
+ echo 0 >/sys/class/gpio/gpio$GPIO_HUBRST/value
+}
+
+hub_off() {
+ echo "turn off usb hub"
+ if [ ! -d $SYS_GPIO/gpio$GPIO_HUBPORT_EN ]; then
+ echo $GPIO_HUBPORT_EN >/sys/class/gpio/export
+ fi
+
+ if [ ! -d $SYS_GPIO/gpio$GPIO_ROLESEL ]; then
+ echo $GPIO_ROLESEL >/sys/class/gpio/export
+ fi
+
+ if [ ! -d $SYS_GPIO/gpio$GPIO_HUBRST ]; then
+ echo $GPIO_HUBRST >/sys/class/gpio/export
+ fi
+
+ echo "out" >/sys/class/gpio/gpio$GPIO_HUBPORT_EN/direction
+ echo "out" >/sys/class/gpio/gpio$GPIO_ROLESEL/direction
+ echo "out" >/sys/class/gpio/gpio$GPIO_HUBRST/direction
+
+ echo 0 >/sys/class/gpio/gpio$GPIO_HUBPORT_EN/value
+ echo 1 >/sys/class/gpio/gpio$GPIO_ROLESEL/value
+ echo 1 >/sys/class/gpio/gpio$GPIO_HUBRST/value
+}
+
+inst_mod() {
+ insmod /mnt/system/ko/configfs.ko
+ insmod /mnt/system/ko/libcomposite.ko
+ insmod /mnt/system/ko/u_serial.ko
+ insmod /mnt/system/ko/usb_f_acm.ko
+ insmod /mnt/system/ko/cvi_usb_f_cvg.ko
+ insmod /mnt/system/ko/usb_f_uvc.ko
+ insmod /mnt/system/ko/usb_f_fs.ko
+ insmod /mnt/system/ko/u_audio.ko
+ insmod /mnt/system/ko/usb_f_uac1.ko
+ insmod /mnt/system/ko/usb_f_serial.ko
+ insmod /mnt/system/ko/usb_f_mass_storage.ko
+ insmod /mnt/system/ko/u_ether.ko
+ insmod /mnt/system/ko/usb_f_ecm.ko
+ insmod /mnt/system/ko/usb_f_eem.ko
+ insmod /mnt/system/ko/usb_f_rndis.ko
+}
+
+case "$1" in
+ host)
+ insmod /mnt/system/ko/dwc2.ko
+ echo host > /proc/cviusb/otg_role
+ ;;
+ device)
+ echo device > /proc/cviusb/otg_role
+ ;;
+ *)
+ echo "Usage: $0 host"
+ echo "Usage: $0 device"
+ exit 1
+esac
+exit $?
diff --git a/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/lib/ld-musl-riscv64v0p7_xthead.so.1 b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/lib/ld-musl-riscv64v0p7_xthead.so.1
new file mode 120000
index 000000000..4665bcf84
--- /dev/null
+++ b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/lib/ld-musl-riscv64v0p7_xthead.so.1
@@ -0,0 +1 @@
+../usr/lib64v0p7_xthead/lp64d/libc.so
\ No newline at end of file
diff --git a/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/usr/lib64v0p7_xthead/lp64d/libc.so b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/usr/lib64v0p7_xthead/lp64d/libc.so
new file mode 100755
index 000000000..8a2b8ff7d
Binary files /dev/null and b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/usr/lib64v0p7_xthead/lp64d/libc.so differ
diff --git a/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/usr/local/bin/autologin b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/usr/local/bin/autologin
new file mode 100755
index 000000000..6f12842ec
--- /dev/null
+++ b/buildroot-2021.05/board/milkv/milkv-duo256m/overlay/usr/local/bin/autologin
@@ -0,0 +1,2 @@
+#! /bin/sh
+exec /bin/login -f root
diff --git a/buildroot-2021.05/configs/milkv-duo256m_musl_riscv64_defconfig b/buildroot-2021.05/configs/milkv-duo256m_musl_riscv64_defconfig
new file mode 100644
index 000000000..3555b8f51
--- /dev/null
+++ b/buildroot-2021.05/configs/milkv-duo256m_musl_riscv64_defconfig
@@ -0,0 +1,469 @@
+#
+# Automatically generated file; DO NOT EDIT.
+# Buildroot -g8c59e72e33-dirty Configuration
+#
+BR2_HAVE_DOT_CONFIG=y
+BR2_HOST_GCC_AT_LEAST_4_9=y
+BR2_HOST_GCC_AT_LEAST_5=y
+BR2_HOST_GCC_AT_LEAST_6=y
+BR2_HOST_GCC_AT_LEAST_7=y
+
+#
+# Target options
+#
+BR2_ARCH_IS_64=y
+BR2_ARCH_HAS_MMU_MANDATORY=y
+BR2_riscv=y
+BR2_ARCH_HAS_TOOLCHAIN_BUILDROOT=y
+BR2_ARCH_NEEDS_GCC_AT_LEAST_4_8=y
+BR2_ARCH_NEEDS_GCC_AT_LEAST_4_9=y
+BR2_ARCH_NEEDS_GCC_AT_LEAST_5=y
+BR2_ARCH_NEEDS_GCC_AT_LEAST_6=y
+BR2_ARCH_NEEDS_GCC_AT_LEAST_7=y
+BR2_ARCH="riscv64"
+BR2_ENDIAN="LITTLE"
+BR2_GCC_TARGET_ABI="lp64d"
+BR2_BINFMT_SUPPORTS_SHARED=y
+BR2_READELF_ARCH_NAME="RISC-V"
+BR2_BINFMT_ELF=y
+BR2_RISCV_ISA_RVI=y
+BR2_RISCV_ISA_RVM=y
+BR2_RISCV_ISA_RVA=y
+BR2_RISCV_ISA_RVF=y
+BR2_RISCV_ISA_RVD=y
+BR2_riscv_g=y
+# BR2_riscv_custom is not set
+# BR2_RISCV_32 is not set
+BR2_RISCV_64=y
+# BR2_RISCV_ABI_LP64 is not set
+# BR2_RISCV_ABI_LP64F is not set
+BR2_RISCV_ABI_LP64D=y
+
+#
+# Build options
+#
+
+#
+# Commands
+#
+BR2_WGET="wget --passive-ftp -nd -t 3"
+BR2_SVN="svn --non-interactive"
+BR2_BZR="bzr"
+BR2_GIT="git"
+BR2_CVS="cvs"
+BR2_LOCALFILES="cp"
+BR2_SCP="scp"
+BR2_HG="hg"
+BR2_ZCAT="gzip -d -c"
+BR2_BZCAT="bzcat"
+BR2_XZCAT="xzcat"
+BR2_LZCAT="lzip -d -c"
+BR2_TAR_OPTIONS=""
+BR2_DEFCONFIG="./configs/milkv-duo256m_musl_riscv64_defconfig"
+BR2_DL_DIR="$(TOPDIR)/dl"
+BR2_HOST_DIR="$(BASE_DIR)/host"
+
+#
+# Mirrors and Download locations
+#
+BR2_PRIMARY_SITE=""
+BR2_BACKUP_SITE="http://sources.buildroot.net"
+BR2_KERNEL_MIRROR="https://cdn.kernel.org/pub"
+BR2_GNU_MIRROR="http://ftpmirror.gnu.org"
+BR2_LUAROCKS_MIRROR="http://rocks.moonscript.org"
+BR2_CPAN_MIRROR="http://cpan.metacpan.org"
+BR2_JLEVEL=0
+# BR2_CCACHE is not set
+# BR2_ENABLE_DEBUG is not set
+BR2_STRIP_strip=y
+BR2_STRIP_EXCLUDE_FILES=""
+BR2_STRIP_EXCLUDE_DIRS=""
+# BR2_OPTIMIZE_0 is not set
+# BR2_OPTIMIZE_1 is not set
+# BR2_OPTIMIZE_2 is not set
+# BR2_OPTIMIZE_3 is not set
+# BR2_OPTIMIZE_G is not set
+BR2_OPTIMIZE_S=y
+# BR2_OPTIMIZE_FAST is not set
+# BR2_STATIC_LIBS is not set
+BR2_SHARED_LIBS=y
+# BR2_SHARED_STATIC_LIBS is not set
+BR2_PACKAGE_OVERRIDE_FILE="$(CONFIG_DIR)/local.mk"
+BR2_GLOBAL_PATCH_DIR=""
+
+#
+# Advanced
+#
+BR2_COMPILER_PARANOID_UNSAFE_PATH=y
+# BR2_FORCE_HOST_BUILD is not set
+# BR2_REPRODUCIBLE is not set
+# BR2_PER_PACKAGE_DIRECTORIES is not set
+
+#
+# Security Hardening Options
+#
+BR2_PIC_PIE=y
+# BR2_SSP_NONE is not set
+# BR2_SSP_REGULAR is not set
+BR2_SSP_STRONG=y
+# BR2_SSP_ALL is not set
+BR2_SSP_OPTION="-fstack-protector-strong"
+# BR2_RELRO_NONE is not set
+# BR2_RELRO_PARTIAL is not set
+BR2_RELRO_FULL=y
+
+#
+# Fortify Source needs a glibc toolchain and optimization
+#
+
+#
+# Toolchain
+#
+BR2_TOOLCHAIN=y
+BR2_TOOLCHAIN_USES_MUSL=y
+# BR2_TOOLCHAIN_BUILDROOT is not set
+BR2_TOOLCHAIN_EXTERNAL=y
+
+#
+# Toolchain External Options
+#
+BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
+# BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD is not set
+BR2_TOOLCHAIN_EXTERNAL_PREINSTALLED=y
+# BR2_TOOLCHAIN_EXTERNAL_PATH="/data/sam/sdk/cv180x_v400/host-tools/gcc/riscv64-linux-musl-x86_64"
+BR2_TOOLCHAIN_EXTERNAL_MUSL=y
+BR2_PACKAGE_HAS_TOOLCHAIN_EXTERNAL=y
+BR2_PACKAGE_PROVIDES_TOOLCHAIN_EXTERNAL="toolchain-external-custom"
+BR2_TOOLCHAIN_EXTERNAL_PREFIX="riscv64-unknown-linux-musl"
+BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="riscv64-unknown-linux-musl"
+BR2_TOOLCHAIN_EXTERNAL_GCC_10=y
+BR2_TOOLCHAIN_EXTERNAL_HEADERS_5_10=y
+BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y
+BR2_TOOLCHAIN_EXTERNAL_HAS_SSP=y
+BR2_TOOLCHAIN_EXTERNAL_HAS_SSP_STRONG=y
+BR2_TOOLCHAIN_EXTERNAL_CXX=y
+
+#
+# Toolchain Generic Options
+#
+BR2_TOOLCHAIN_SUPPORTS_ALWAYS_LOCKFREE_ATOMIC_INTS=y
+BR2_TOOLCHAIN_SUPPORTS_VARIADIC_MI_THUNK=y
+BR2_USE_WCHAR=y
+BR2_ENABLE_LOCALE=y
+BR2_INSTALL_LIBSTDCPP=y
+BR2_TOOLCHAIN_HAS_THREADS=y
+BR2_TOOLCHAIN_HAS_THREADS_DEBUG=y
+BR2_TOOLCHAIN_HAS_THREADS_NPTL=y
+BR2_TOOLCHAIN_HAS_SSP=y
+BR2_TOOLCHAIN_HAS_SSP_STRONG=y
+BR2_TOOLCHAIN_HAS_UCONTEXT=y
+BR2_TOOLCHAIN_SUPPORTS_PIE=y
+BR2_TOOLCHAIN_EXTRA_LIBS=""
+BR2_USE_MMU=y
+BR2_TARGET_OPTIMIZATION=""
+BR2_TARGET_LDFLAGS="-mcpu=c906fdv -march=rv64imafdcv0p7xthead -mcmodel=medany -mabi=lp64d"
+# BR2_ECLIPSE_REGISTER is not set
+BR2_TOOLCHAIN_HEADERS_AT_LEAST_5_10=y
+BR2_TOOLCHAIN_HEADERS_AT_LEAST="5.10"
+BR2_TOOLCHAIN_GCC_AT_LEAST_10=y
+BR2_TOOLCHAIN_GCC_AT_LEAST="10"
+BR2_TOOLCHAIN_HAS_MNAN_OPTION=y
+BR2_TOOLCHAIN_HAS_SYNC_1=y
+BR2_TOOLCHAIN_HAS_SYNC_2=y
+BR2_TOOLCHAIN_HAS_SYNC_4=y
+BR2_TOOLCHAIN_HAS_SYNC_8=y
+BR2_TOOLCHAIN_HAS_LIBATOMIC=y
+BR2_TOOLCHAIN_HAS_ATOMIC=y
+
+#
+# System configuration
+#
+BR2_ROOTFS_SKELETON_DEFAULT=y
+# BR2_ROOTFS_SKELETON_CUSTOM is not set
+BR2_TARGET_GENERIC_HOSTNAME="milkv-duo"
+BR2_TARGET_GENERIC_ISSUE="Welcome to Milk-V Duo 256M"
+BR2_TARGET_GENERIC_PASSWD_SHA256=y
+# BR2_TARGET_GENERIC_PASSWD_SHA512 is not set
+BR2_TARGET_GENERIC_PASSWD_METHOD="sha-256"
+BR2_INIT_BUSYBOX=y
+# BR2_INIT_SYSV is not set
+# BR2_INIT_OPENRC is not set
+
+#
+# systemd needs a glibc toolchain w/ SSP, headers >= 3.10, host and target gcc >= 5
+#
+# BR2_INIT_NONE is not set
+# BR2_ROOTFS_DEVICE_CREATION_STATIC is not set
+BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_DEVTMPFS=y
+# BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_MDEV is not set
+# BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV is not set
+BR2_ROOTFS_DEVICE_TABLE="system/device_table.txt"
+# BR2_ROOTFS_DEVICE_TABLE_SUPPORTS_EXTENDED_ATTRIBUTES is not set
+# BR2_ROOTFS_MERGED_USR is not set
+BR2_TARGET_ENABLE_ROOT_LOGIN=y
+BR2_TARGET_GENERIC_ROOT_PASSWD="milkv"
+BR2_SYSTEM_BIN_SH_BUSYBOX=y
+
+#
+# bash, dash, mksh, zsh need BR2_PACKAGE_BUSYBOX_SHOW_OTHERS
+#
+# BR2_SYSTEM_BIN_SH_NONE is not set
+BR2_TARGET_GENERIC_GETTY=y
+BR2_TARGET_GENERIC_GETTY_PORT="console"
+BR2_TARGET_GENERIC_GETTY_BAUDRATE_KEEP=y
+# BR2_TARGET_GENERIC_GETTY_BAUDRATE_9600 is not set
+# BR2_TARGET_GENERIC_GETTY_BAUDRATE_19200 is not set
+# BR2_TARGET_GENERIC_GETTY_BAUDRATE_38400 is not set
+# BR2_TARGET_GENERIC_GETTY_BAUDRATE_57600 is not set
+# BR2_TARGET_GENERIC_GETTY_BAUDRATE_115200 is not set
+BR2_TARGET_GENERIC_GETTY_BAUDRATE="0"
+BR2_TARGET_GENERIC_GETTY_TERM="vt100"
+BR2_TARGET_GENERIC_GETTY_OPTIONS=""
+BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW=y
+BR2_SYSTEM_DHCP=""
+BR2_SYSTEM_DEFAULT_PATH="/bin:/sbin:/usr/bin:/usr/sbin"
+BR2_ENABLE_LOCALE_PURGE=y
+BR2_ENABLE_LOCALE_WHITELIST="C en_US"
+# BR2_SYSTEM_ENABLE_NLS is not set
+# BR2_TARGET_TZ_INFO is not set
+BR2_ROOTFS_USERS_TABLES=""
+BR2_ROOTFS_OVERLAY="board/milkv/milkv-duo256m/overlay"
+BR2_ROOTFS_POST_BUILD_SCRIPT=""
+BR2_ROOTFS_POST_FAKEROOT_SCRIPT=""
+BR2_ROOTFS_POST_IMAGE_SCRIPT=""
+
+#
+# Kernel
+#
+# BR2_LINUX_KERNEL is not set
+
+#
+# Target packages
+#
+BR2_PACKAGE_BUSYBOX=y
+BR2_PACKAGE_BUSYBOX_CONFIG="package/busybox/busybox.config"
+BR2_PACKAGE_BUSYBOX_CONFIG_FRAGMENT_FILES=""
+# BR2_PACKAGE_BUSYBOX_SHOW_OTHERS is not set
+# BR2_PACKAGE_BUSYBOX_INDIVIDUAL_BINARIES is not set
+# BR2_PACKAGE_BUSYBOX_WATCHDOG is not set
+BR2_PACKAGE_SKELETON=y
+BR2_PACKAGE_HAS_SKELETON=y
+BR2_PACKAGE_PROVIDES_SKELETON="skeleton-init-sysv"
+BR2_PACKAGE_SKELETON_INIT_COMMON=y
+BR2_PACKAGE_SKELETON_INIT_SYSV=y
+
+#
+# dt needs a glibc or uClibc toolchain w/ threads
+#
+# BR2_PACKAGE_DUMA is not set
+# BR2_PACKAGE_FIO is not set
+BR2_PACKAGE_GDB_ARCH_SUPPORTS=y
+BR2_PACKAGE_GDB=y
+# BR2_PACKAGE_IOZONE is not set
+
+#
+# ktap needs a Linux kernel to be built
+#
+# BR2_PACKAGE_LATENCYTOP is not set
+# BR2_PACKAGE_LMBENCH is not set
+BR2_PACKAGE_LTP_TESTSUITE_ARCH_SUPPORTS=y
+# BR2_PACKAGE_LTP_TESTSUITE is not set
+# BR2_PACKAGE_LTTNG_BABELTRACE is not set
+
+#
+# Development tools
+#
+BR2_PACKAGE_PROVIDES_HOST_GETTEXT="host-gettext-tiny"
+
+#
+# Filesystem and flash utilities
+#
+# BR2_PACKAGE_ABOOTIMG is not set
+
+#
+# davfs2 needs a glibc or uClibc toolchain
+#
+# BR2_PACKAGE_DOSFSTOOLS is not set
+BR2_PACKAGE_E2FSPROGS=y
+# BR2_PACKAGE_E2FSPROGS_DEBUGFS is not set
+# BR2_PACKAGE_E2FSPROGS_E2IMAGE is not set
+
+BR2_PACKAGE_HOST_GENIMAGE=y
+
+#
+# e2scrub needs bash, coreutils, lvm2, and util-linux
+#
+# BR2_PACKAGE_E2FSPROGS_E4DEFRAG is not set
+BR2_PACKAGE_E2FSPROGS_FSCK=y
+# BR2_PACKAGE_E2FSPROGS_FUSE2FS is not set
+BR2_PACKAGE_E2FSPROGS_RESIZE2FS=y
+
+#
+# eudev needs eudev /dev management
+#
+# BR2_PACKAGE_EVEMU is not set
+BR2_PACKAGE_EVTEST=y
+# BR2_PACKAGE_FAN_CTRL is not set
+# BR2_PACKAGE_FCONFIG is not set
+BR2_PACKAGE_FLASHROM_ARCH_SUPPORTS=y
+
+#
+# Compression and decompression
+#
+BR2_PACKAGE_PROVIDES_HOST_ZLIB="host-libzlib"
+# BR2_PACKAGE_ZZIPLIB is not set
+
+#
+# Crypto
+#
+# BR2_PACKAGE_BEARSSL is not set
+# BR2_PACKAGE_BEECRYPT is not set
+BR2_PACKAGE_BOTAN_ARCH_SUPPORTS=y
+# BR2_PACKAGE_BOTAN is not set
+# BR2_PACKAGE_CA_CERTIFICATES is not set
+
+#
+# cryptodev needs a Linux kernel to be built
+#
+BR2_PACKAGE_LIBGPG_ERROR_ARCH_SUPPORTS=y
+# BR2_PACKAGE_LIBGPG_ERROR is not set
+BR2_PACKAGE_LIBGPG_ERROR_SYSCFG="riscv64-unknown-linux-gnu"
+BR2_PACKAGE_PROVIDES_HOST_OPENSSL="host-libopenssl"
+
+#
+# JSON/XML
+#
+BR2_PACKAGE_JSON_C=y
+
+#
+# Multimedia
+#
+BR2_PACKAGE_LIBCAMERA_ARCH_SUPPORTS=y
+# BR2_PACKAGE_LIBCAMERA is not set
+
+#
+# libcgroup needs a glibc toolchain w/ C++
+#
+BR2_PACKAGE_MUSL_COMPAT_HEADERS=y
+# BR2_PACKAGE_MUSL_FTS is not set
+# BR2_PACKAGE_ORC is not set
+# BR2_PACKAGE_P11_KIT is not set
+BR2_PACKAGE_POCO_ARCH_SUPPORTS=y
+# BR2_PACKAGE_POCO is not set
+BR2_PACKAGE_PROTOBUF_ARCH_SUPPORTS=y
+# BR2_PACKAGE_PROTOBUF is not set
+# BR2_PACKAGE_PROTOBUF_C is not set
+
+#
+# vdr needs a glibc toolchain w/ C++, dynamic library, NPTL, wchar, headers >= 3.9
+#
+BR2_PACKAGE_WPA_SUPPLICANT=y
+BR2_PACKAGE_WPA_SUPPLICANT_NL80211=y
+BR2_PACKAGE_WPA_SUPPLICANT_CLI=y
+BR2_PACKAGE_WPA_SUPPLICANT_WPA_CLIENT_SO=y
+# BR2_PACKAGE_WPA_SUPPLICANT_PASSPHRASE is not set
+BR2_PACKAGE_WPA_SUPPLICANT_CTRL_IFACE=y
+# BR2_PACKAGE_WPA_SUPPLICANT_DBUS is not set
+
+#
+# emlog needs a Linux kernel to be built
+#
+BR2_PACKAGE_HTOP=y
+BR2_PACKAGE_INITSCRIPTS=y
+
+#
+# iotop depends on python or python3
+#
+# BR2_PACKAGE_IPRUTILS is not set
+# BR2_PACKAGE_IRQBALANCE is not set
+# BR2_PACKAGE_KEYUTILS is not set
+BR2_PACKAGE_KMOD=y
+
+#
+# unscd needs a glibc toolchain
+#
+BR2_PACKAGE_UTIL_LINUX=y
+BR2_PACKAGE_UTIL_LINUX_LIBBLKID=y
+# BR2_PACKAGE_UTIL_LINUX_LIBFDISK is not set
+# BR2_PACKAGE_UTIL_LINUX_LIBMOUNT is not set
+# BR2_PACKAGE_UTIL_LINUX_LIBSMARTCOLS is not set
+BR2_PACKAGE_UTIL_LINUX_LIBUUID=y
+
+#
+# su needs a uClibc or glibc toolchain w/ wchar, locale, dynamic library
+#
+BR2_PACKAGE_UTIL_LINUX_UUIDD=y
+
+#
+# Filesystem images
+#
+BR2_TARGET_ROOTFS_EXT2=y
+# BR2_TARGET_ROOTFS_EXT2_2r0 is not set
+# BR2_TARGET_ROOTFS_EXT2_2r1 is not set
+# BR2_TARGET_ROOTFS_EXT2_3 is not set
+BR2_TARGET_ROOTFS_EXT2_4=y
+BR2_TARGET_ROOTFS_EXT2_GEN=4
+BR2_TARGET_ROOTFS_EXT2_REV=1
+BR2_TARGET_ROOTFS_EXT2_LABEL="rootfs"
+BR2_TARGET_ROOTFS_EXT2_SIZE="200M"
+BR2_TARGET_ROOTFS_EXT2_INODES=0
+BR2_TARGET_ROOTFS_EXT2_RESBLKS=5
+BR2_TARGET_ROOTFS_EXT2_MKFS_OPTIONS="-O ^64bit"
+BR2_TARGET_ROOTFS_EXT2_NONE=y
+
+#
+# initramfs needs a Linux kernel to be built
+#
+BR2_TARGET_ROOTFS_TAR=y
+BR2_TARGET_ROOTFS_TAR_XZ=y
+BR2_TARGET_ROOTFS_TAR_OPTIONS=""
+
+#
+# Host utilities
+#
+BR2_PACKAGE_HOST_E2FSPROGS=y
+BR2_PACKAGE_HOST_UTIL_LINUX=y
+
+#
+# Legacy options removed in 2019.11
+#
+BR2_TOOLCHAIN_EXTRA_EXTERNAL_LIBS=""
+
+#
+# Legacy options removed in 2017.08
+#
+# BR2_TARGET_GRUB is not set
+# BR2_PACKAGE_SIMICSFS is not set
+# BR2_BINUTILS_VERSION_2_26_X is not set
+BR2_XTENSA_OVERLAY_DIR=""
+BR2_XTENSA_CUSTOM_NAME=""
+# BR2_PACKAGE_HOST_MKE2IMG is not set
+BR2_TARGET_ROOTFS_EXT2_BLOCKS=0
+BR2_TARGET_ROOTFS_EXT2_EXTRA_INODES=0
+
+#
+# Legacy options removed in 2017.05
+#
+BR2_TARGET_ROOTFS_EXT2_EXTRA_BLOCKS=0
+
+BR2_PACKAGE_SPIDEV_TEST=y
+BR2_PACKAGE_STRACE=y
+
+#
+# NetworkManager needs udev /dev management and a glibc toolchain w/ headers >= 3.2, dynamic library, wchar, threads
+#
+
+BR2_PACKAGE_DHCPCD=y
+BR2_PACKAGE_DNSMASQ=y
+BR2_PACKAGE_DROPBEAR=y
+BR2_PACKAGE_DROPBEAR_CLIENT=y
+# BR2_PACKAGE_DROPBEAR_DISABLE_REVERSEDNS is not set
+BR2_PACKAGE_DROPBEAR_SMALL=y
+# BR2_PACKAGE_DROPBEAR_WTMP is not set
+# BR2_PACKAGE_DROPBEAR_LASTLOG is not set
+# BR2_PACKAGE_DROPBEAR_LEGACY_CRYPTO is not set
+# BR2_PACKAGE_DROPBEAR_LOCALOPTIONS_FILE=""
+
+BR2_PACKAGE_NTP=y
+BR2_PACKAGE_NTP_NTPDATE=y
+BR2_PACKAGE_NTP_NTPTIME=y
diff --git a/device/milkv-duo256m/boardconfig.sh b/device/milkv-duo256m/boardconfig.sh
new file mode 100644
index 000000000..d5a54ef6c
--- /dev/null
+++ b/device/milkv-duo256m/boardconfig.sh
@@ -0,0 +1,8 @@
+#!/bin/bash
+
+export MV_BOARD=milkv-duo256m
+export MV_BOARD_CPU=cv1812cp
+export MV_VENDOR=milkv
+export MV_BUILD_ENV=milkvsetup.sh
+export MV_BOARD_LINK=cv1812cp_milkv_duo256m_sd
+
diff --git a/device/milkv-duo256m/genimage.cfg b/device/milkv-duo256m/genimage.cfg
new file mode 100644
index 000000000..027bde1eb
--- /dev/null
+++ b/device/milkv-duo256m/genimage.cfg
@@ -0,0 +1,33 @@
+image boot.vfat {
+ vfat {
+ label = "boot"
+ files = {
+ "fip.bin",
+ "rawimages/boot.sd",
+ }
+ }
+ size = 128M
+}
+
+image rootfs.ext4 {
+ ext4 {
+ label = "rootfs"
+ }
+ size = 768M
+}
+
+image milkv-duo256m.img {
+ hdimage {
+ }
+
+ partition boot {
+ partition-type = 0xC
+ bootable = "true"
+ image = "boot.vfat"
+ }
+
+ partition rootfs {
+ partition-type = 0x83
+ image = "rootfs.ext4"
+ }
+}
diff --git a/device/milkv-duo256m/overlay/mnt/system/blink.sh b/device/milkv-duo256m/overlay/mnt/system/blink.sh
new file mode 100755
index 000000000..0670e77b6
--- /dev/null
+++ b/device/milkv-duo256m/overlay/mnt/system/blink.sh
@@ -0,0 +1,21 @@
+#!/bin/sh
+
+LED_PIN=354
+
+LED_GPIO=/sys/class/gpio/gpio${LED_PIN}
+
+if test -d ${LED_GPIO}; then
+ echo "PIN ${LED_PIN} already exported"
+else
+ echo ${LED_PIN} > /sys/class/gpio/export
+fi
+
+echo out > ${LED_GPIO}/direction
+
+while true; do
+ echo 0 > ${LED_GPIO}/value
+ sleep 0.5
+ echo 1 > ${LED_GPIO}/value
+ sleep 0.5
+done
+
diff --git a/device/milkv-duo256m/overlay/mnt/system/duo-init.sh b/device/milkv-duo256m/overlay/mnt/system/duo-init.sh
new file mode 100755
index 000000000..fda9d7862
--- /dev/null
+++ b/device/milkv-duo256m/overlay/mnt/system/duo-init.sh
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+# Set Pin-29(GP22) to GPIO
+devmem 0x0502707c 32 0x111
+devmem 0x03001068 32 0x3
+
+# Set Pin-19(GP14) to GPIO
+duo-pinmux -w GP14/GP14 > /dev/null
+
+# insmod pwm module
+insmod /mnt/system/ko/cv181x_pwm.ko
diff --git a/device/milkv-duo256m/overlay/mnt/system/usb-host.sh b/device/milkv-duo256m/overlay/mnt/system/usb-host.sh
new file mode 100755
index 000000000..a80cdb89f
--- /dev/null
+++ b/device/milkv-duo256m/overlay/mnt/system/usb-host.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+echo host > /proc/cviusb/otg_role >> /tmp/usb.log 2>&1
+
diff --git a/device/milkv-duo256m/overlay/mnt/system/usb-rndis.sh b/device/milkv-duo256m/overlay/mnt/system/usb-rndis.sh
new file mode 100755
index 000000000..e0f132b3a
--- /dev/null
+++ b/device/milkv-duo256m/overlay/mnt/system/usb-rndis.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+/etc/uhubon.sh device >> /tmp/rndis.log 2>&1
+/etc/run_usb.sh probe rndis >> /tmp/rndis.log 2>&1
+/etc/run_usb.sh start rndis >> /tmp/rndis.log 2>&1
+
+sleep 0.5
+ifconfig usb0 192.168.42.1
+
+count=`ps | grep dnsmasq | grep -v grep | wc -l`
+if [ ${count} -lt 1 ] ;then
+ echo "/etc/init.d/S80dnsmasq start" >> /tmp/rndis.log 2>&1
+ /etc/init.d/S80dnsmasq start >> /tmp/rndis.log 2>&1
+fi
diff --git a/device/milkv-duo256m/overlay/mnt/system/usb.sh b/device/milkv-duo256m/overlay/mnt/system/usb.sh
new file mode 120000
index 000000000..3827f5be8
--- /dev/null
+++ b/device/milkv-duo256m/overlay/mnt/system/usb.sh
@@ -0,0 +1 @@
+usb-rndis.sh
\ No newline at end of file
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/LzmaDec.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/LzmaDec.o
new file mode 100644
index 000000000..6f1f5e00a
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/LzmaDec.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/assert.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/assert.o
new file mode 100644
index 000000000..66f0c9d51
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/assert.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/bigdigits.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/bigdigits.o
new file mode 100644
index 000000000..4cc799de9
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/bigdigits.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/bl2_helper.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/bl2_helper.o
new file mode 100644
index 000000000..a1b9be274
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/bl2_helper.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/bl2_opt.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/bl2_opt.o
new file mode 100644
index 000000000..f324d9f9f
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/bl2_opt.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/cache.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/cache.o
new file mode 100644
index 000000000..1aa15e30b
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/cache.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/cpu_helper.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/cpu_helper.o
new file mode 100644
index 000000000..de42c6c53
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/cpu_helper.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/cvx16_dram_cap_check.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/cvx16_dram_cap_check.o
new file mode 100644
index 000000000..182ff5bc7
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/cvx16_dram_cap_check.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/cvx16_pinmux.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/cvx16_pinmux.o
new file mode 100644
index 000000000..f42ed1e9e
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/cvx16_pinmux.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/ddr.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/ddr.o
new file mode 100644
index 000000000..a4b761ff1
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/ddr.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/ddr_patch_regs.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/ddr_patch_regs.o
new file mode 100644
index 000000000..c7c55d036
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/ddr_patch_regs.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/ddr_pkg_info.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/ddr_pkg_info.o
new file mode 100644
index 000000000..678b5d0f1
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/ddr_pkg_info.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/ddr_sys.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/ddr_sys.o
new file mode 100644
index 000000000..824190936
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/ddr_sys.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/ddr_sys_bring_up.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/ddr_sys_bring_up.o
new file mode 100644
index 000000000..7eb5e0ddd
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/ddr_sys_bring_up.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/ddrc_init.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/ddrc_init.o
new file mode 100644
index 000000000..b1c5b3d4c
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/ddrc_init.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/decompress.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/decompress.o
new file mode 100644
index 000000000..d62b9aebc
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/decompress.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/delay_timer.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/delay_timer.o
new file mode 100644
index 000000000..5d4733a7d
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/delay_timer.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/lz4_all.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/lz4_all.o
new file mode 100644
index 000000000..0070f5a7b
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/lz4_all.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/mem.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/mem.o
new file mode 100644
index 000000000..8d9581dfc
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/mem.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/misc.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/misc.o
new file mode 100644
index 000000000..6fbaeddad
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/misc.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/misc_helpers.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/misc_helpers.o
new file mode 100644
index 000000000..f0c1708be
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/misc_helpers.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/phy_init.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/phy_init.o
new file mode 100644
index 000000000..f436caf48
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/phy_init.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/phy_pll_init.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/phy_pll_init.o
new file mode 100644
index 000000000..00269ecc2
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/phy_pll_init.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/platform.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/platform.o
new file mode 100644
index 000000000..2b0f8c0ac
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/platform.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/putchar.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/putchar.o
new file mode 100644
index 000000000..e0faaffe1
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/putchar.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/security.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/security.o
new file mode 100644
index 000000000..ef0cb094a
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/security.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/sha256.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/sha256.o
new file mode 100644
index 000000000..e35dd8775
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/sha256.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/strchr.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/strchr.o
new file mode 100644
index 000000000..bd6c9310f
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/strchr.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/strcmp.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/strcmp.o
new file mode 100644
index 000000000..ef55ea70b
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/strcmp.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/strlen.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/strlen.o
new file mode 100644
index 000000000..0d78f4b3c
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/strlen.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/strncmp.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/strncmp.o
new file mode 100644
index 000000000..79394bc13
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/strncmp.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/strnlen.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/strnlen.o
new file mode 100644
index 000000000..92bc06633
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/strnlen.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/tf_printf.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/tf_printf.o
new file mode 100644
index 000000000..56a17b211
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/tf_printf.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/uart_dw.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/uart_dw.o
new file mode 100644
index 000000000..8cfd76e90
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/uart_dw.o differ
diff --git a/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/xxhash.o b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/xxhash.o
new file mode 100644
index 000000000..6394f000c
Binary files /dev/null and b/fsbl/plat/cv181x/bl2_objs/cv1812cp_milkv_duo256m_sd/bl2/xxhash.o differ
diff --git a/middleware/v2/.gitignore b/middleware/v2/.gitignore
index 78682dc5f..6e87ce078 100644
--- a/middleware/v2/.gitignore
+++ b/middleware/v2/.gitignore
@@ -6,6 +6,7 @@
*.dwo
ko
+ko_shrink
lib
bin
diff --git a/middleware/v2/cv181x/ko/cv181x_fast_image.ko b/middleware/v2/cv181x/ko/cv181x_fast_image.ko
deleted file mode 100644
index 54ccd039b..000000000
Binary files a/middleware/v2/cv181x/ko/cv181x_fast_image.ko and /dev/null differ
diff --git a/middleware/v2/cv181x/ko/cv181x_rtos_cmdqu.ko b/middleware/v2/cv181x/ko/cv181x_rtos_cmdqu.ko
deleted file mode 100644
index e1eb0beae..000000000
Binary files a/middleware/v2/cv181x/ko/cv181x_rtos_cmdqu.ko and /dev/null differ
diff --git a/middleware/v2/cv181x/ko_shrink/cv181x_fast_image.ko b/middleware/v2/cv181x/ko_shrink/cv181x_fast_image.ko
deleted file mode 100644
index c51ce7492..000000000
Binary files a/middleware/v2/cv181x/ko_shrink/cv181x_fast_image.ko and /dev/null differ
diff --git a/middleware/v2/cv181x/ko_shrink/cv181x_rtos_cmdqu.ko b/middleware/v2/cv181x/ko_shrink/cv181x_rtos_cmdqu.ko
deleted file mode 100644
index 6c6597ca5..000000000
Binary files a/middleware/v2/cv181x/ko_shrink/cv181x_rtos_cmdqu.ko and /dev/null differ
diff --git a/ramdisk/rootfs/overlay/cv181x_musl_riscv64/system/ko/loadsystemko.sh b/ramdisk/rootfs/overlay/cv181x_musl_riscv64/system/ko/loadsystemko.sh
index 4da66be11..6c3bdf5d6 100644
--- a/ramdisk/rootfs/overlay/cv181x_musl_riscv64/system/ko/loadsystemko.sh
+++ b/ramdisk/rootfs/overlay/cv181x_musl_riscv64/system/ko/loadsystemko.sh
@@ -5,8 +5,8 @@ ${CVI_SHOPTS}
#
insmod /mnt/system/ko/cv181x_sys.ko
insmod /mnt/system/ko/cv181x_base.ko
-insmod /mnt/system/ko/cv181x_rtos_cmdqu.ko
-insmod /mnt/system/ko/cv181x_fast_image.ko
+#insmod /mnt/system/ko/cv181x_rtos_cmdqu.ko
+#insmod /mnt/system/ko/cv181x_fast_image.ko
insmod /mnt/system/ko/cvi_mipi_rx.ko
insmod /mnt/system/ko/snsr_i2c.ko
insmod /mnt/system/ko/cv181x_vi.ko
diff --git a/u-boot-2021.10/include/configs/cv181x-asic.h b/u-boot-2021.10/include/configs/cv181x-asic.h
index 70de6daeb..1c276f1c4 100644
--- a/u-boot-2021.10/include/configs/cv181x-asic.h
+++ b/u-boot-2021.10/include/configs/cv181x-asic.h
@@ -210,6 +210,8 @@
#else
#define ROOTARGS "ubi.mtd=ROOTFS ubi.block=0,0"
#endif /* CONFIG_SKIP_RAMDISK */
+ #elif defined(CONFIG_SD_BOOT)
+ #define ROOTARGS "root=" ROOTFS_DEV " rootwait rw"
#else
#define ROOTARGS "rootfstype=squashfs rootwait ro root=" ROOTFS_DEV
#endif
@@ -289,16 +291,22 @@
#define SD_BOOTM_COMMAND \
SET_BOOTARGS \
- "echo Boot from SD with ramboot.itb;" \
- "mmc dev 1 && fatload mmc 1 ${uImage_addr} ramboot.itb; " \
+ "echo Boot from SD ...;" \
+ "mmc dev 0 && fatload mmc 0 ${uImage_addr} boot.sd; " \
"if test $? -eq 0; then " \
UBOOT_VBOOT_BOOTM_COMMAND \
"fi;"
- #ifdef CONFIG_ENABLE_ALIOS_UPDATE
- #define CONFIG_BOOTCOMMAND "cvi_update_rtos"
+
+ #ifndef CONFIG_SD_BOOT
+ #ifdef CONFIG_ENABLE_ALIOS_UPDATE
+ #define CONFIG_BOOTCOMMAND "cvi_update_rtos"
+ #else
+ #define CONFIG_BOOTCOMMAND SHOWLOGOCMD "cvi_update || run norboot || run nandboot ||run emmcboot"
+ #endif
#else
- #define CONFIG_BOOTCOMMAND SHOWLOGOCMD "cvi_update || run norboot || run nandboot ||run emmcboot"
+ #define CONFIG_BOOTCOMMAND SHOWLOGOCMD "run sdboot"
#endif
+
#if defined(CONFIG_NAND_SUPPORT)
/* For spi nand boot, need to reset DMA and its setting before exiting uboot */
/* 0x4330058 : DMA reset */