From a04c837678811463a9db0ab6ba2b737c53f4908c Mon Sep 17 00:00:00 2001 From: Lu Date: Fri, 22 Mar 2024 15:42:49 +0800 Subject: [PATCH] 20240322 --- README.md | 6 +- .../config.json | 3 +- .../dts_arm/sg2002_licheea53nano_sd.dts} | 53 ++- .../linux/sg2002_licheea53nano_sd_defconfig} | 388 +++++------------- .../memmap.py | 4 +- .../partition/partition_sd.xml | 0 .../sg2002_licheea53nano_sd_defconfig} | 18 +- .../u-boot/cvi_board_init.c | 0 .../sg2002_licheea53nano_sd/u-boot/cvitek.h | 13 + .../u-boot/sg2002_licheea53nano_sd_defconfig} | 11 +- .../sg2002_licheearmnano_sd/u-boot/cvitek.h | 0 .../sg2002_licheervnano_sd_defconfig | 2 +- .../u-boot/cvi_board_init.c | 8 +- .../u-boot/sg2002_licheervnano_sd_defconfig | 2 +- .../common/sd_tools/genimage_rootless.cfg | 1 - .../sd_tools/sd_gen_burn_image_rootless.sh | 1 - .../etc/init.d/{S03usbdev => S00usbdev} | 0 .../overlay/etc/init.d/{S00kmod => S01kmod} | 3 - .../overlay/etc/init.d/{S01fs => S02fs} | 0 .../etc/init.d/{S02config => S03config} | 0 .../SG200X/overlay/etc/init.d/S25wifimod | 13 + .../cvitek/SG200X/overlay/etc/init.d/S30wifi | 2 +- .../SG200X/overlay/etc/init.d/S99ednctest | 39 ++ .../SG200X/overlay/etc/init.d/S99modeltest | 35 ++ .../cvitek/SG200X/overlay/etc/ssh/sshd_config | 4 +- .../SG200X/overlay/mnt/cfg/param/cvi_sdr_bin | Bin 0 -> 222105 bytes .../SG200X/overlay/mnt/data/sensor_cfg.ini | 34 ++ .../configs/cvitek_SG200X_32bit_defconfig | 383 +++++++++++++++++ .../cvitek_SG200X_musl_riscv64_defconfig | 14 +- buildroot/package/Config.in | 2 + buildroot/package/gb-test-roms/Config.in | 4 + .../package/gb-test-roms/gb-test-roms.mk | 20 + buildroot/package/mgba/Config.in | 8 + buildroot/package/mgba/mgba.mk | 18 + .../package/tpudemo-sg200x/tpudemo-sg200x.mk | 2 +- linux_5.10/drivers/video/fbdev/Makefile | 3 +- middleware/v2/.gitignore | 43 -- middleware/v2/component/isp/.gitignore | 2 - middleware/v2/sample/gyro/.gitignore | 3 - middleware/v2/sample/ive/.gitignore | 36 -- u-boot-2021.10/cmd/cvi_vo.c | 39 +- u-boot-2021.10/include/configs/mars-asic.h | 3 +- .../include/cvitek/cvi_panels/cvi_panels.h | 10 +- 43 files changed, 770 insertions(+), 460 deletions(-) rename build/boards/sg200x/{sg2002_licheearmnano_sd => sg2002_licheea53nano_sd}/config.json (65%) rename build/boards/sg200x/{sg2002_licheearmnano_sd/dts_arm/sg2002_licheearmnano_sd.dts => sg2002_licheea53nano_sd/dts_arm/sg2002_licheea53nano_sd.dts} (58%) rename build/boards/sg200x/{sg2002_licheearmnano_sd/linux/sg2002_licheearmnano_sd_defconfig => sg2002_licheea53nano_sd/linux/sg2002_licheea53nano_sd_defconfig} (51%) rename build/boards/sg200x/{sg2002_licheearmnano_sd => sg2002_licheea53nano_sd}/memmap.py (97%) mode change 100755 => 100644 rename build/boards/sg200x/{sg2002_licheearmnano_sd => sg2002_licheea53nano_sd}/partition/partition_sd.xml (100%) rename build/boards/sg200x/{sg2002_licheearmnano_sd/sg2002_licheearmnano_sd_defconfig => sg2002_licheea53nano_sd/sg2002_licheea53nano_sd_defconfig} (60%) rename build/boards/sg200x/{sg2002_licheearmnano_sd => sg2002_licheea53nano_sd}/u-boot/cvi_board_init.c (100%) create mode 100644 build/boards/sg200x/sg2002_licheea53nano_sd/u-boot/cvitek.h rename build/boards/sg200x/{sg2002_licheearmnano_sd/u-boot/sg2002_licheearmnano_sd_defconfig => sg2002_licheea53nano_sd/u-boot/sg2002_licheea53nano_sd_defconfig} (87%) delete mode 100644 build/boards/sg200x/sg2002_licheearmnano_sd/u-boot/cvitek.h rename buildroot/board/cvitek/SG200X/overlay/etc/init.d/{S03usbdev => S00usbdev} (100%) rename buildroot/board/cvitek/SG200X/overlay/etc/init.d/{S00kmod => S01kmod} (90%) rename buildroot/board/cvitek/SG200X/overlay/etc/init.d/{S01fs => S02fs} (100%) rename buildroot/board/cvitek/SG200X/overlay/etc/init.d/{S02config => S03config} (100%) create mode 100755 buildroot/board/cvitek/SG200X/overlay/etc/init.d/S25wifimod create mode 100755 buildroot/board/cvitek/SG200X/overlay/etc/init.d/S99ednctest create mode 100755 buildroot/board/cvitek/SG200X/overlay/etc/init.d/S99modeltest create mode 100644 buildroot/board/cvitek/SG200X/overlay/mnt/cfg/param/cvi_sdr_bin create mode 100644 buildroot/board/cvitek/SG200X/overlay/mnt/data/sensor_cfg.ini create mode 100644 buildroot/configs/cvitek_SG200X_32bit_defconfig create mode 100644 buildroot/package/gb-test-roms/Config.in create mode 100644 buildroot/package/gb-test-roms/gb-test-roms.mk create mode 100644 buildroot/package/mgba/Config.in create mode 100644 buildroot/package/mgba/mgba.mk delete mode 100644 middleware/v2/.gitignore delete mode 100644 middleware/v2/component/isp/.gitignore delete mode 100644 middleware/v2/sample/gyro/.gitignore delete mode 100755 middleware/v2/sample/ive/.gitignore diff --git a/README.md b/README.md index 282c1d528..89ea60554 100644 --- a/README.md +++ b/README.md @@ -5,9 +5,11 @@ ``` git clone https://github.com/LicheeRV-Nano-Build --depth=1 cd LicheeRV-Nano-Build -wget https://sophon-file.sophon.cn/sophon-prod-s3/drive/23/03/07/16/host-tools.tar.gz -tar xf host-tools.tar.gz +git clone https://github.com/sophgo/host-tools --depth=1 source build/cvisetup.sh +# C906: defconfig sg2002_licheervnano_sd +# A53: +# defconfig sg2002_licheea53nano_sd build_all ``` diff --git a/build/boards/sg200x/sg2002_licheearmnano_sd/config.json b/build/boards/sg200x/sg2002_licheea53nano_sd/config.json similarity index 65% rename from build/boards/sg200x/sg2002_licheearmnano_sd/config.json rename to build/boards/sg200x/sg2002_licheea53nano_sd/config.json index f5def6416..6e2c48547 100644 --- a/build/boards/sg200x/sg2002_licheearmnano_sd/config.json +++ b/build/boards/sg200x/sg2002_licheea53nano_sd/config.json @@ -1,9 +1,8 @@ { "ddr_cfg_list": [ - "", "ddr3_1866_x16", "ddr3_2133_x16", "ddr_auto_x16" ], - "board_information": "CA53 + DDR 256MB" + "board_information": "CA53" } diff --git a/build/boards/sg200x/sg2002_licheearmnano_sd/dts_arm/sg2002_licheearmnano_sd.dts b/build/boards/sg200x/sg2002_licheea53nano_sd/dts_arm/sg2002_licheea53nano_sd.dts similarity index 58% rename from build/boards/sg200x/sg2002_licheearmnano_sd/dts_arm/sg2002_licheearmnano_sd.dts rename to build/boards/sg200x/sg2002_licheea53nano_sd/dts_arm/sg2002_licheea53nano_sd.dts index 63faf49c1..2ae738a31 100644 --- a/build/boards/sg200x/sg2002_licheearmnano_sd/dts_arm/sg2002_licheearmnano_sd.dts +++ b/build/boards/sg200x/sg2002_licheea53nano_sd/dts_arm/sg2002_licheea53nano_sd.dts @@ -146,32 +146,31 @@ }; }; - wifisd:wifi-sd@4320000 { - compatible = "cvitek,cv181x-sdio"; - bus-width = <4>; - reg = <0x0 0x4320000 0x0 0x1000>; - reg_names = "core_mem"; - src-frequency = <375000000>; - min-frequency = <400000>; // 400Khz - //max-frequency = <50000000>; // 50Mhz - //max-frequency = <45000000>; // 45Mhz - //max-frequency = <40000000>; // 40Mhz - //max-frequency = <35000000>; // 35Mhz - //max-frequency = <30000000>; // 30Mhz - max-frequency = <25000000>; // 25Mhz - //max-frequency = <20000000>; // 20Mhz - //max-frequency = <15000000>; // 15Mhz - //max-frequency = <10000000>; // 10Mhz - //max-frequency = <5000000>; // 5Mhz - 64_addressing; - reset_tx_rx_phy; - non-removable; - pll_index = <0x7>; - pll_reg = <0x300207C>; - no-mmc; - no-sd; - status = "okay"; - interrupts = <38 IRQ_TYPE_LEVEL_HIGH>; - interrupt-parent = <&plic0>; + wifisd:wifi-sd@4320000 { + compatible = "cvitek,cv181x-sdio"; + bus-width = <4>; + reg = <0x0 0x4320000 0x0 0x1000>; + reg_names = "core_mem"; + src-frequency = <375000000>; + min-frequency = <400000>; // 400Khz + //max-frequency = <50000000>; // 50Mhz + //max-frequency = <45000000>; // 45Mhz + //max-frequency = <40000000>; // 40Mhz + //max-frequency = <35000000>; // 35Mhz + //max-frequency = <30000000>; // 30Mhz + max-frequency = <25000000>; // 25Mhz + //max-frequency = <20000000>; // 20Mhz + //max-frequency = <15000000>; // 15Mhz + //max-frequency = <10000000>; // 10Mhz + //max-frequency = <5000000>; // 5Mhz + 64_addressing; + reset_tx_rx_phy; + non-removable; + pll_index = <0x7>; + pll_reg = <0x300207C>; + no-mmc; + no-sd; + status = "okay"; + interrupts = ; }; }; diff --git a/build/boards/sg200x/sg2002_licheearmnano_sd/linux/sg2002_licheearmnano_sd_defconfig b/build/boards/sg200x/sg2002_licheea53nano_sd/linux/sg2002_licheea53nano_sd_defconfig similarity index 51% rename from build/boards/sg200x/sg2002_licheearmnano_sd/linux/sg2002_licheearmnano_sd_defconfig rename to build/boards/sg200x/sg2002_licheea53nano_sd/linux/sg2002_licheea53nano_sd_defconfig index ccd0fe7e6..0cb714780 100644 --- a/build/boards/sg200x/sg2002_licheearmnano_sd/linux/sg2002_licheearmnano_sd_defconfig +++ b/build/boards/sg200x/sg2002_licheea53nano_sd/linux/sg2002_licheea53nano_sd_defconfig @@ -1,5 +1,23 @@ +CONFIG_KERNEL_XZ=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_LOG_BUF_SHIFT=15 +CONFIG_BLK_DEV_INITRD=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +# CONFIG_UID16 is not set +# 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_ARM_LPAE=y CONFIG_SWP_EMULATE=y +# CONFIG_VDSO is not set CONFIG_HAVE_ARM_ARCH_TIMER=y CONFIG_ARM_PSCI=y CONFIG_THUMB2_KERNEL=y @@ -7,59 +25,50 @@ CONFIG_FORCE_MAX_ZONEORDER=10 # CONFIG_ATAGS is not set CONFIG_VFP=y CONFIG_NEON=y -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=n -# 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_SUSPEND is not set CONFIG_ARCH_CVITEK=y -CONFIG_SOC_THEAD=y -# CONFIG_COMPAT is not set +CONFIG_ARCH_CV181X=y CONFIG_ARCH_CVITEK_CHIP="mars" CONFIG_ARCH_CV181X_ASIC=y CONFIG_POWER_RESET=y -CONFIG_COMPAT_32BIT_TIME=y -CONFIG_STRICT_KERNEL_RWX=n +# CONFIG_STACKPROTECTOR is not set CONFIG_MODULES=y CONFIG_MODULE_FORCE_LOAD=y CONFIG_MODULE_UNLOAD=y +# CONFIG_LBDAF is not set # CONFIG_BLK_DEV_BSG is not set +# CONFIG_IOSCHED_DEADLINE is not set +# CONFIG_IOSCHED_CFQ is not set # CONFIG_MQ_IOSCHED_DEADLINE is not set # CONFIG_MQ_IOSCHED_KYBER is not set -CONFIG_ELF_CORE=y -CONFIG_COREDUMP=y -CONFIG_PROC_SYSCTL=y +# CONFIG_COREDUMP is not set CONFIG_CMA=y CONFIG_NET=y CONFIG_PACKET=y CONFIG_UNIX=y CONFIG_INET=y +# CONFIG_INET_XFRM_MODE_TRANSPORT is not set +# CONFIG_INET_XFRM_MODE_TUNNEL is not set +# CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_DIAG is not set # CONFIG_IPV6 is not set CONFIG_CFG80211=m CONFIG_RFKILL=y -CONFIG_UEVENT_HELPER=y CONFIG_DEVTMPFS=y CONFIG_DEVTMPFS_MOUNT=y # CONFIG_ALLOW_DEV_COREDUMP is not set +CONFIG_DMA_CMA=n +CONFIG_CMA_SIZE_MBYTES=0 CONFIG_MTD=y CONFIG_MTD_CMDLINE_PARTS=y # CONFIG_MTD_OF_PARTS is not set CONFIG_MTD_BLOCK=y +CONFIG_MTD_NAND=y CONFIG_MTD_RAW_NAND=y +CONFIG_MTD_NAND_PLATFORM=y +CONFIG_MTD_NAND_CVSNFC=y +CONFIG_MTD_SPI_NOR=y +CONFIG_SPI_CVI_SPIF=y CONFIG_MTD_UBI=y CONFIG_MTD_UBI_BLOCK=y CONFIG_NETDEVICES=y @@ -72,11 +81,15 @@ CONFIG_NETDEVICES=y # CONFIG_NET_VENDOR_BROADCOM is not set # CONFIG_NET_VENDOR_CADENCE is not set # CONFIG_NET_VENDOR_CAVIUM is not set +# CONFIG_NET_VENDOR_CIRRUS is not set # CONFIG_NET_VENDOR_CORTINA is not set # CONFIG_NET_VENDOR_EZCHIP is not set +# CONFIG_NET_VENDOR_FARADAY is not set +# CONFIG_NET_VENDOR_HISILICON 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_MELLANOX is not set # CONFIG_NET_VENDOR_MICREL is not set # CONFIG_NET_VENDOR_MICROCHIP is not set # CONFIG_NET_VENDOR_MICROSEMI is not set @@ -89,6 +102,7 @@ CONFIG_NETDEVICES=y # CONFIG_NET_VENDOR_SAMSUNG is not set # CONFIG_NET_VENDOR_SEEQ is not set # CONFIG_NET_VENDOR_SOLARFLARE is not set +# CONFIG_NET_VENDOR_SMSC is not set # CONFIG_NET_VENDOR_SOCIONEXT is not set CONFIG_STMMAC_ETH=y # CONFIG_DWMAC_GENERIC is not set @@ -107,17 +121,12 @@ CONFIG_CVITEK_PHY=y # 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_RTL8188FU=m # 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 @@ -128,11 +137,11 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=5 CONFIG_SERIAL_8250_DW=y CONFIG_HW_RANDOM=y CONFIG_I2C=y +CONFIG_I2C_SMBUS=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 @@ -142,227 +151,11 @@ CONFIG_THERMAL_NETLINK=y CONFIG_THERMAL_WRITABLE_TRIPS=y CONFIG_THERMAL_EMULATION=y CONFIG_WATCHDOG=y -CONFIG_MEDIA_SUPPORT=y -CONFIG_VIDEO_V4L2_SUBDEV_API=y -CONFIG_V4L_PLATFORM_DRIVERS=y -CONFIG_V4L_MEM2MEM_DRIVERS=y -CONFIG_VIDEO_MEM2MEM_DEINTERLACE=y +CONFIG_MEDIA_SUPPORT=n CONFIG_VIDEO_CVITEK=m CONFIG_VIDEO_CVITEK_CIF=m CONFIG_VIDEO_CVITEK_SNS_I2C=m CONFIG_VIDEO_CVITEK_MIPI_TX=m -# -# Media SPI Adapters -# -# CONFIG_CXD2880_SPI_DRV is not set -# end of Media SPI Adapters -# -# Customize TV tuners -# -# CONFIG_MEDIA_TUNER_SIMPLE is not set -# CONFIG_MEDIA_TUNER_TDA18250 is not set -# CONFIG_MEDIA_TUNER_TDA8290 is not set -# CONFIG_MEDIA_TUNER_TDA827X is not set -# CONFIG_MEDIA_TUNER_TDA18271 is not set -# CONFIG_MEDIA_TUNER_TDA9887 is not set -# CONFIG_MEDIA_TUNER_TEA5761 is not set -# CONFIG_MEDIA_TUNER_TEA5767 is not set -# CONFIG_MEDIA_TUNER_MSI001 is not set -# CONFIG_MEDIA_TUNER_MT20XX is not set -# CONFIG_MEDIA_TUNER_MT2060 is not set -# CONFIG_MEDIA_TUNER_MT2063 is not set -# CONFIG_MEDIA_TUNER_MT2266 is not set -# CONFIG_MEDIA_TUNER_MT2131 is not set -# CONFIG_MEDIA_TUNER_QT1010 is not set -# CONFIG_MEDIA_TUNER_XC2028 is not set -# CONFIG_MEDIA_TUNER_XC5000 is not set -# CONFIG_MEDIA_TUNER_XC4000 is not set -# CONFIG_MEDIA_TUNER_MXL5005S is not set -# CONFIG_MEDIA_TUNER_MXL5007T is not set -# CONFIG_MEDIA_TUNER_MC44S803 is not set -# CONFIG_MEDIA_TUNER_MAX2165 is not set -# CONFIG_MEDIA_TUNER_TDA18218 is not set -# CONFIG_MEDIA_TUNER_FC0011 is not set -# CONFIG_MEDIA_TUNER_FC0012 is not set -# CONFIG_MEDIA_TUNER_FC0013 is not set -# CONFIG_MEDIA_TUNER_TDA18212 is not set -# CONFIG_MEDIA_TUNER_E4000 is not set -# CONFIG_MEDIA_TUNER_FC2580 is not set -# CONFIG_MEDIA_TUNER_M88RS6000T is not set -# CONFIG_MEDIA_TUNER_TUA9001 is not set -# CONFIG_MEDIA_TUNER_SI2157 is not set -# CONFIG_MEDIA_TUNER_IT913X is not set -# CONFIG_MEDIA_TUNER_R820T is not set -# CONFIG_MEDIA_TUNER_MXL301RF is not set -# CONFIG_MEDIA_TUNER_QM1D1C0042 is not set -# CONFIG_MEDIA_TUNER_QM1D1B0004 is not set -# end of Customize TV tuners -# -# Customise DVB Frontends -# - -# -# Multistandard (satellite) frontends -# -# CONFIG_DVB_STB0899 is not set -# CONFIG_DVB_STB6100 is not set -# CONFIG_DVB_STV090x is not set -# CONFIG_DVB_STV0910 is not set -# CONFIG_DVB_STV6110x is not set -# CONFIG_DVB_STV6111 is not set -# CONFIG_DVB_MXL5XX is not set -# CONFIG_DVB_M88DS3103 is not set - -# -# Multistandard (cable + terrestrial) frontends -# -# CONFIG_DVB_DRXK is not set -# CONFIG_DVB_TDA18271C2DD is not set -# CONFIG_DVB_SI2165 is not set -# CONFIG_DVB_MN88472 is not set -# CONFIG_DVB_MN88473 is not set - -# -# DVB-S (satellite) frontends -# -# CONFIG_DVB_CX24110 is not set -# CONFIG_DVB_CX24123 is not set -# CONFIG_DVB_MT312 is not set -# CONFIG_DVB_ZL10036 is not set -# CONFIG_DVB_ZL10039 is not set -# CONFIG_DVB_S5H1420 is not set -# CONFIG_DVB_STV0288 is not set -# CONFIG_DVB_STB6000 is not set -# CONFIG_DVB_STV0299 is not set -# CONFIG_DVB_STV6110 is not set -# CONFIG_DVB_STV0900 is not set -# CONFIG_DVB_TDA8083 is not set -# CONFIG_DVB_TDA10086 is not set -# CONFIG_DVB_TDA8261 is not set -# CONFIG_DVB_VES1X93 is not set -# CONFIG_DVB_TUNER_ITD1000 is not set -# CONFIG_DVB_TUNER_CX24113 is not set -# CONFIG_DVB_TDA826X is not set -# CONFIG_DVB_TUA6100 is not set -# CONFIG_DVB_CX24116 is not set -# CONFIG_DVB_CX24117 is not set -# CONFIG_DVB_CX24120 is not set -# CONFIG_DVB_SI21XX is not set -# CONFIG_DVB_TS2020 is not set -# CONFIG_DVB_DS3000 is not set -# CONFIG_DVB_MB86A16 is not set -# CONFIG_DVB_TDA10071 is not set - -# -# DVB-T (terrestrial) frontends -# -# CONFIG_DVB_SP8870 is not set -# CONFIG_DVB_SP887X is not set -# CONFIG_DVB_CX22700 is not set -# CONFIG_DVB_CX22702 is not set -# CONFIG_DVB_S5H1432 is not set -# CONFIG_DVB_DRXD is not set -# CONFIG_DVB_L64781 is not set -# CONFIG_DVB_TDA1004X is not set -# CONFIG_DVB_NXT6000 is not set -# CONFIG_DVB_MT352 is not set -# CONFIG_DVB_ZL10353 is not set -# CONFIG_DVB_DIB3000MB is not set -# CONFIG_DVB_DIB3000MC is not set -# CONFIG_DVB_DIB7000M is not set -# CONFIG_DVB_DIB7000P is not set -# CONFIG_DVB_DIB9000 is not set -# CONFIG_DVB_TDA10048 is not set -# CONFIG_DVB_AF9013 is not set -# CONFIG_DVB_EC100 is not set -# CONFIG_DVB_STV0367 is not set -# CONFIG_DVB_CXD2820R is not set -# CONFIG_DVB_CXD2841ER is not set -# CONFIG_DVB_RTL2830 is not set -# CONFIG_DVB_RTL2832 is not set -# CONFIG_DVB_RTL2832_SDR is not set -# CONFIG_DVB_SI2168 is not set -# CONFIG_DVB_ZD1301_DEMOD is not set -# CONFIG_DVB_CXD2880 is not set - -# -# DVB-C (cable) frontends -# -# CONFIG_DVB_VES1820 is not set -# CONFIG_DVB_TDA10021 is not set -# CONFIG_DVB_TDA10023 is not set -# CONFIG_DVB_STV0297 is not set - -# -# ATSC (North American/Korean Terrestrial/Cable DTV) frontends -# -# CONFIG_DVB_NXT200X is not set -# CONFIG_DVB_OR51211 is not set -# CONFIG_DVB_OR51132 is not set -# CONFIG_DVB_BCM3510 is not set -# CONFIG_DVB_LGDT330X is not set -# CONFIG_DVB_LGDT3305 is not set -# CONFIG_DVB_LGDT3306A is not set -# CONFIG_DVB_LG2160 is not set -# CONFIG_DVB_S5H1409 is not set -# CONFIG_DVB_AU8522_DTV is not set -# CONFIG_DVB_AU8522_V4L is not set -# CONFIG_DVB_S5H1411 is not set - -# -# ISDB-T (terrestrial) frontends -# -# CONFIG_DVB_S921 is not set -# CONFIG_DVB_DIB8000 is not set -# CONFIG_DVB_MB86A20S is not set - -# -# ISDB-S (satellite) & ISDB-T (terrestrial) frontends -# -# CONFIG_DVB_TC90522 is not set -# CONFIG_DVB_MN88443X is not set - -# -# Digital terrestrial only tuners/PLL -# -# CONFIG_DVB_PLL is not set -# CONFIG_DVB_TUNER_DIB0070 is not set -# CONFIG_DVB_TUNER_DIB0090 is not set -# -# SEC control devices for DVB-S -# -# CONFIG_DVB_DRX39XYJ is not set -# CONFIG_DVB_LNBH25 is not set -# CONFIG_DVB_LNBH29 is not set -# CONFIG_DVB_LNBP21 is not set -# CONFIG_DVB_LNBP22 is not set -# CONFIG_DVB_ISL6405 is not set -# CONFIG_DVB_ISL6421 is not set -# CONFIG_DVB_ISL6423 is not set -# CONFIG_DVB_A8293 is not set -# CONFIG_DVB_LGS8GL5 is not set -# CONFIG_DVB_LGS8GXX is not set -# CONFIG_DVB_ATBM8830 is not set -# CONFIG_DVB_TDA665x is not set -# CONFIG_DVB_IX2505V is not set -# CONFIG_DVB_M88RS2000 is not set -# CONFIG_DVB_AF9033 is not set -# CONFIG_DVB_HORUS3A is not set -# CONFIG_DVB_ASCOT2E is not set -# CONFIG_DVB_HELENE is not set -# -# Common Interface (EN50221) controller drivers -# -# CONFIG_DVB_CXD2099 is not set -# CONFIG_DVB_SP2 is not set -# end of Customise DVB Frontends -# -# Digital TV options -# -# CONFIG_DVB_NET is not set -# CONFIG_DVB_DYNAMIC_MINORS is not set -# end of Digital TV options - CONFIG_FB=y CONFIG_FB_CVITEK=m CONFIG_SOUND=y @@ -370,7 +163,8 @@ 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_HDA_PREALLOC_SIZE=n +# CONFIG_SND_ARM is not set # CONFIG_SND_SPI is not set # CONFIG_SND_USB is not set CONFIG_SND_SOC=y @@ -379,24 +173,18 @@ CONFIG_SND_SOC_CV182XA_CV182XADAC=y CONFIG_SND_CV1835_I2S=y CONFIG_SND_SOC_CV182XAADC=y CONFIG_SND_SOC_CV182XADAC=y +# CONFIG_SND_SOC_CV182X_CV182XPDM is not set +# CONFIG_SND_SOC_CV1835PDM is not set +# CONFIG_SND_SOC_CV1835_CONCURRENT_I2S is not set 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_WATCHDOG_CORE=y CONFIG_MMC=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_PLTFM=y CONFIG_MMC_SDHCI_CVI=y -CONFIG_BLK_CMDLINE_PARSER=y -CONFIG_PARTITION_ADVANCED=y -CONFIG_CMDLINE_PARTITION=y -CONFIG_EFI_PARTITION=n -CONFIG_DYNAMIC_DEBUG=y -CONFIG_EXT4_FS=y -CONFIG_DMADEVICES=y -CONFIG_DW_DMAC_CVITEK=y -CONFIG_RTC_CLASS=y +CONFIG_DMADEVICES=n +CONFIG_DW_DMAC_CVITEK=n # CONFIG_VIRTIO_MENU is not set CONFIG_STAGING=y CONFIG_ION=y @@ -404,23 +192,28 @@ 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_CV1835_SYSDMA_REMAP=n CONFIG_PWM=y -CONFIG_SIFIVE_PLIC=y CONFIG_ANDROID=y +# CONFIG_TEE=y +# CONFIG_OPTEE=y # CONFIG_MANDATORY_FILE_LOCKING is not set +CONFIG_EXT3_FS=y +CONFIG_EXT4_FS=y CONFIG_MSDOS_FS=y CONFIG_VFAT_FS=y # CONFIG_PROC_PAGE_MONITOR is not set CONFIG_TMPFS=y -CONFIG_CONFIGFS_FS=y +CONFIG_CONFIGFS_FS=m CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS_WBUF_VERIFY=y CONFIG_UBIFS_FS=y CONFIG_SQUASHFS=y +CONFIG_SQUASHFS_FILE_DIRECT=y # CONFIG_SQUASHFS_ZLIB is not set -CONFIG_SQUASHFS_LZ4=y CONFIG_SQUASHFS_XZ=y +CONFIG_SQUASHFS_EMBEDDED=y +CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=1 CONFIG_NETWORK_FILESYSTEMS=y CONFIG_NFS_FS=y CONFIG_NFS_V2=y @@ -430,6 +223,7 @@ CONFIG_NLS_CODEPAGE_437=y CONFIG_NLS_ISO8859_1=y CONFIG_NLS_ISO8859_2=y CONFIG_NLS_ISO8859_3=y +# CONFIG_CRYPTO_ECHAINIV is not set CONFIG_CRYPTO_SHA256=y # CONFIG_CRYPTO_HW is not set # CONFIG_XZ_DEC_X86 is not set @@ -437,25 +231,26 @@ CONFIG_CRYPTO_SHA256=y # 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_DYNAMIC_DEBUG=y -# CONFIG_DEBUG_BUGVERBOSE is not set -CONFIG_DEBUG_INFO=n -CONFIG_DEBUG_INFO_DWARF4=n -CONFIG_GDB_SCRIPTS=y # CONFIG_ENABLE_MUST_CHECK is not set CONFIG_DEBUG_FS=y -CONFIG_KALLSYMS=y -CONFIG_FRAME_POINTER=n -CONFIG_DEBUG_MISC=n -CONFIG_RCU_TRACE=n # CONFIG_SCHED_DEBUG is not set # CONFIG_DEBUG_PREEMPT is not set +# CONFIG_DEBUG_BUGVERBOSE is not set # CONFIG_FTRACE is not set # CONFIG_RUNTIME_TESTING_MENU is not set -CONFIG_USB_ROLE_SWITCH=y +# CONFIG_MTD_SPI_NOR_USE_4K_SECTORS is not set + +CONFIG_RTC_CLASS=y + +CONFIG_BLK_DEV_LOOP=y +CONFIG_SCSI=y +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_SG=y +CONFIG_USB=y +CONFIG_USB_OTG=y +CONFIG_USB_OTG_FSM=y +CONFIG_USB_STORAGE=y CONFIG_USB_LIBCOMPOSITE=y CONFIG_USB_F_ACM=y CONFIG_USB_U_SERIAL=y @@ -466,32 +261,27 @@ 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 -# buggy driver, need fix -# CONFIG_USB_F_UVC is not set +CONFIG_USB_F_UVC=y +CONFIG_USB_UAS=y +CONFIG_USB_DWC2=y +CONFIG_USB_DWC2_DUAL_ROLE=y +CONFIG_USB_GADGET=y +CONFIG_U_SERIAL_CONSOLE=y CONFIG_USB_CONFIGFS=y CONFIG_USB_CONFIGFS_SERIAL=y CONFIG_USB_CONFIGFS_ACM=y -# CONFIG_USB_CONFIGFS_OBEX is not set -# CONFIG_USB_CONFIGFS_NCM is not set CONFIG_USB_CONFIGFS_ECM=y -# CONFIG_USB_CONFIGFS_ECM_SUBSET is not set CONFIG_USB_CONFIGFS_RNDIS=y CONFIG_USB_CONFIGFS_EEM=y CONFIG_USB_CONFIGFS_MASS_STORAGE=y -# CONFIG_USB_CONFIGFS_F_LB_SS is not set +CONFIG_USB_CONFIGFS_F_FS=y +CONFIG_USB_CONFIGFS_F_UAC1=y +CONFIG_USB_CONFIGFS_F_UVC=y CONFIG_USB_CONFIGFS_F_FS=y CONFIG_USB_CONFIGFS_UEVENT=y -CONFIG_USB_CONFIGFS_F_UAC1=y -# CONFIG_USB_CONFIGFS_F_UAC1_LEGACY is not set -# CONFIG_USB_CONFIGFS_F_UAC2 is not set -# CONFIG_USB_CONFIGFS_F_MIDI is not set -# CONFIG_USB_CONFIGFS_F_HID is not set -CONFIG_USB_CONFIGFS_F_UVC=y -CONFIG_BUG=n -CONFIG_ADVISE_SYSCALLS=n -CONFIG_TIMERFD=n +CONFIG_USB_PHY=y +CONFIG_USB_GPIO_VBUS=y # for licheervnano CONFIG_FB_SIMPLE=y @@ -544,6 +334,12 @@ CONFIG_V4L2_FLASH_LED_CLASS=y CONFIG_MEDIA_USB_SUPPORT=y CONFIG_USB_VIDEO_CLASS=y CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y +CONFIG_AIC_WLAN_SUPPORT=y +CONFIG_INPUT_EVDEV=y +CONFIG_KEYBOARD_GPIO=y +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_HYNITRON_TS=y +CONFIG_USB_DWC2=y # these driver may broken codec driver # CONFIG_FUSE_FS is not set diff --git a/build/boards/sg200x/sg2002_licheearmnano_sd/memmap.py b/build/boards/sg200x/sg2002_licheea53nano_sd/memmap.py old mode 100755 new mode 100644 similarity index 97% rename from build/boards/sg200x/sg2002_licheearmnano_sd/memmap.py rename to build/boards/sg200x/sg2002_licheea53nano_sd/memmap.py index 4c676f060..b1eee2418 --- a/build/boards/sg200x/sg2002_licheearmnano_sd/memmap.py +++ b/build/boards/sg200x/sg2002_licheea53nano_sd/memmap.py @@ -15,7 +15,7 @@ class MemoryMap: # ============== # C906L FreeRTOS # ============== - FREERTOS_SIZE = 2 * SIZE_1M + FREERTOS_SIZE = 768 * SIZE_1K # FreeRTOS is at the end of DRAM FREERTOS_ADDR = DRAM_BASE + DRAM_SIZE - FREERTOS_SIZE FSBL_C906L_START_ADDR = FREERTOS_ADDR @@ -40,7 +40,7 @@ class MemoryMap: # ================= # Multimedia buffer. Used by u-boot/kernel/FreeRTOS # ================= - ION_SIZE = 75 * SIZE_1M + ION_SIZE = 70 * SIZE_1M H26X_BITSTREAM_SIZE = 2 * SIZE_1M H26X_ENC_BUFF_SIZE = 0 ISP_MEM_BASE_SIZE = 20 * SIZE_1M diff --git a/build/boards/sg200x/sg2002_licheearmnano_sd/partition/partition_sd.xml b/build/boards/sg200x/sg2002_licheea53nano_sd/partition/partition_sd.xml similarity index 100% rename from build/boards/sg200x/sg2002_licheearmnano_sd/partition/partition_sd.xml rename to build/boards/sg200x/sg2002_licheea53nano_sd/partition/partition_sd.xml diff --git a/build/boards/sg200x/sg2002_licheearmnano_sd/sg2002_licheearmnano_sd_defconfig b/build/boards/sg200x/sg2002_licheea53nano_sd/sg2002_licheea53nano_sd_defconfig similarity index 60% rename from build/boards/sg200x/sg2002_licheearmnano_sd/sg2002_licheearmnano_sd_defconfig rename to build/boards/sg200x/sg2002_licheea53nano_sd/sg2002_licheea53nano_sd_defconfig index 158e74d73..453883935 100644 --- a/build/boards/sg200x/sg2002_licheearmnano_sd/sg2002_licheearmnano_sd_defconfig +++ b/build/boards/sg200x/sg2002_licheea53nano_sd/sg2002_licheea53nano_sd_defconfig @@ -1,25 +1,23 @@ CONFIG_CHIP_sg2002=y -CONFIG_BOARD_licheearmnano_sd=y +CONFIG_BOARD_licheea53nano_sd=y CONFIG_DDR_CFG_ddr3_1866_x16=y -CONFIG_ARCH="arm64" -CONFIG_CROSS_COMPILE="aarch64-linux-gnu-" -CONFIG_CROSS_COMPILE_KERNEL="aarch64-linux-gnu-" +CONFIG_ARCH="arm" CONFIG_CC_OPTIMIZE_FOR_SIZE=y CONFIG_KERNEL_ENTRY_HACK=y -CONFIG_KERNEL_ENTRY_HACK_ADDR="0x80200000" -CONFIG_TOOLCHAIN_GLIBC_ARM64=y -CONFIG_FLASH_SIZE_SHRINK=y -CONFIG_BOOT_IMAGE_SINGLE_DTB=y +CONFIG_KERNEL_ENTRY_HACK_ADDR="0x80108000" +CONFIG_TOOLCHAIN_GLIBC_ARM=y # CONFIG_FLASH_SIZE_SHRINK is not set CONFIG_CP_EXT_WIRELESS=y +CONFIG_BOOT_IMAGE_SINGLE_DTB=y CONFIG_STORAGE_TYPE_sd=y -CONFIG_MIPI_PANEL_ZCT2133V1=y CONFIG_SENSOR_GCORE_GC4653=y CONFIG_UBOOT_2021_10=y CONFIG_KERNEL_SRC_5.10=y +CONFIG_KERNEL_SRC="linux_5.10" CONFIG_KERNEL_LZMA=y CONFIG_SKIP_RAMDISK=y CONFIG_SENSOR_TUNING_PARAM_cv181x_src_gcore_gc4653=y # CONFIG_ROOTFS_OVERLAYFS is not set -# CONFIG_ENABLE_FREERTOS is not set +# CONFIG_TARGET_PACKAGE_RSYSLOG is not set # CONFIG_TARGET_PACKAGE_GATORD is not set +CONFIG_ENABLE_FREERTOS=y diff --git a/build/boards/sg200x/sg2002_licheearmnano_sd/u-boot/cvi_board_init.c b/build/boards/sg200x/sg2002_licheea53nano_sd/u-boot/cvi_board_init.c similarity index 100% rename from build/boards/sg200x/sg2002_licheearmnano_sd/u-boot/cvi_board_init.c rename to build/boards/sg200x/sg2002_licheea53nano_sd/u-boot/cvi_board_init.c diff --git a/build/boards/sg200x/sg2002_licheea53nano_sd/u-boot/cvitek.h b/build/boards/sg200x/sg2002_licheea53nano_sd/u-boot/cvitek.h new file mode 100644 index 000000000..d515dc254 --- /dev/null +++ b/build/boards/sg200x/sg2002_licheea53nano_sd/u-boot/cvitek.h @@ -0,0 +1,13 @@ +/* + *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/sg200x/sg2002_licheearmnano_sd/u-boot/sg2002_licheearmnano_sd_defconfig b/build/boards/sg200x/sg2002_licheea53nano_sd/u-boot/sg2002_licheea53nano_sd_defconfig similarity index 87% rename from build/boards/sg200x/sg2002_licheearmnano_sd/u-boot/sg2002_licheearmnano_sd_defconfig rename to build/boards/sg200x/sg2002_licheea53nano_sd/u-boot/sg2002_licheea53nano_sd_defconfig index d242825b0..76b75bbca 100644 --- a/build/boards/sg200x/sg2002_licheearmnano_sd/u-boot/sg2002_licheearmnano_sd_defconfig +++ b/build/boards/sg200x/sg2002_licheea53nano_sd/u-boot/sg2002_licheea53nano_sd_defconfig @@ -3,11 +3,15 @@ CONFIG_SYS_MALLOC_F_LEN=0x2000 CONFIG_NR_DRAM_BANKS=1 CONFIG_DEFAULT_DEVICE_TREE="soph_asic" CONFIG_IDENT_STRING=" soph" +CONFIG_ARMV8_SET_SMPEN=y CONFIG_TARGET_CVITEK_CV181X=y +#CONFIG_CVITEK_SPI_FLASH=y CONFIG_DISTRO_DEFAULTS=y CONFIG_FIT=y # CONFIG_ARCH_FIXUP_FDT_MEMORY is not set CONFIG_BOOTDELAY=1 +# CONFIG_DISPLAY_CPUINFO is not set +# CONFIG_DISPLAY_BOARDINFO is not set CONFIG_SYS_PROMPT="soph# " # CONFIG_CMD_CONSOLE is not set # CONFIG_CMD_XIMG is not set @@ -23,7 +27,10 @@ CONFIG_CMD_CACHE=y CONFIG_CMD_CVI_SD_UPDATE=y # CONFIG_ISO_PARTITION is not set # CONFIG_EFI_PARTITION is not set +CONFIG_OF_CONTROL=y CONFIG_NET_RANDOM_ETHADDR=y +CONFIG_DM=y +CONFIG_DM_MMC=y CONFIG_MMC=y CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_SDMA=y @@ -38,6 +45,7 @@ CONFIG_SPI=y CONFIG_LZ4=y CONFIG_LZMA=y # CONFIG_TOOLS_LIBCRYPTO is not set +# CONFIG_SPI_FLASH_USE_4K_SECTORS is not set CONFIG_ENV_IS_NOWHERE=y # for licheervnano @@ -61,6 +69,3 @@ CONFIG_BMP_32BPP=y CONFIG_BOOTLOGO=y CONFIG_CMD_CVI_VO=y CONFIG_CMD_GPIO=y - -CONFIG_MMC_IO_VOLTAGE=y -CONFIG_MMC_UHS_SUPPORT=y diff --git a/build/boards/sg200x/sg2002_licheearmnano_sd/u-boot/cvitek.h b/build/boards/sg200x/sg2002_licheearmnano_sd/u-boot/cvitek.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/build/boards/sg200x/sg2002_licheervnano_sd/sg2002_licheervnano_sd_defconfig b/build/boards/sg200x/sg2002_licheervnano_sd/sg2002_licheervnano_sd_defconfig index 3b2e829ce..48efc7a20 100644 --- a/build/boards/sg200x/sg2002_licheervnano_sd/sg2002_licheervnano_sd_defconfig +++ b/build/boards/sg200x/sg2002_licheervnano_sd/sg2002_licheervnano_sd_defconfig @@ -16,7 +16,7 @@ CONFIG_MIPI_PANEL_ZCT2133V1=y CONFIG_SENSOR_GCORE_GC4653=y CONFIG_UBOOT_2021_10=y CONFIG_KERNEL_SRC_5.10=y -CONFIG_KERNEL_LZMA=y +CONFIG_KERNEL_UNCOMPRESSED=y CONFIG_SKIP_RAMDISK=y CONFIG_SENSOR_TUNING_PARAM_cv181x_src_gcore_gc4653=y # CONFIG_ROOTFS_OVERLAYFS is not set diff --git a/build/boards/sg200x/sg2002_licheervnano_sd/u-boot/cvi_board_init.c b/build/boards/sg200x/sg2002_licheervnano_sd/u-boot/cvi_board_init.c index dcd3f942d..a52a157e9 100644 --- a/build/boards/sg200x/sg2002_licheervnano_sd/u-boot/cvi_board_init.c +++ b/build/boards/sg200x/sg2002_licheervnano_sd/u-boot/cvi_board_init.c @@ -73,7 +73,7 @@ int cvi_board_init(void) val &= ~(1 << 26); // set level to low mmio_write_32(0x03020000, val); - suck_loop(200); + suck_loop(50); user_led_toggle(); val = mmio_read_32(0x03020000); // signal level @@ -116,8 +116,8 @@ int cvi_board_init(void) mmio_write_32(0x030010ac, 0x4); // PWRGPIO 2 PWM 10 // camera function - //mmio_write_32(0x0300116C, 0x5); // RX4N CAM_MCLK0 for inside preview board - mmio_write_32(0x0300118C, 0x5); // RX0N CAM_MCLK1 + mmio_write_32(0x0300116C, 0x5); // RX4N CAM_MCLK0 for alpha + //mmio_write_32(0x0300118C, 0x5); // RX0N CAM_MCLK1 for beta // camera/tp i2c mmio_write_32(0x03001090, 0x5); // PWR_GPIO6 IIC4_SCL @@ -130,7 +130,7 @@ int cvi_board_init(void) mmio_write_32(0x0502707c, 0x11);// Unlock PWR_GPIO[4] // wait hardware bootup - suck_loop(100); + suck_loop(50); user_led_off(); return 0; } diff --git a/build/boards/sg200x/sg2002_licheervnano_sd/u-boot/sg2002_licheervnano_sd_defconfig b/build/boards/sg200x/sg2002_licheervnano_sd/u-boot/sg2002_licheervnano_sd_defconfig index 93629912e..9c7d750f7 100644 --- a/build/boards/sg200x/sg2002_licheervnano_sd/u-boot/sg2002_licheervnano_sd_defconfig +++ b/build/boards/sg200x/sg2002_licheervnano_sd/u-boot/sg2002_licheervnano_sd_defconfig @@ -9,7 +9,7 @@ CONFIG_TARGET_CVITEK_CV181X=y CONFIG_DISTRO_DEFAULTS=y CONFIG_FIT=y # CONFIG_ARCH_FIXUP_FDT_MEMORY is not set -CONFIG_BOOTDELAY=1 +CONFIG_BOOTDELAY=0 CONFIG_SYS_PROMPT="soph# " # CONFIG_CMD_CONSOLE is not set # CONFIG_CMD_XIMG is not set diff --git a/build/tools/common/sd_tools/genimage_rootless.cfg b/build/tools/common/sd_tools/genimage_rootless.cfg index a00ca6db0..9e5d3c762 100644 --- a/build/tools/common/sd_tools/genimage_rootless.cfg +++ b/build/tools/common/sd_tools/genimage_rootless.cfg @@ -6,7 +6,6 @@ image boot.vfat { "rawimages/boot.sd", "usb.dev", "usb.rndis0", - "fb", "wifi.sta", } } diff --git a/build/tools/common/sd_tools/sd_gen_burn_image_rootless.sh b/build/tools/common/sd_tools/sd_gen_burn_image_rootless.sh index ccc9263f1..2d1476e10 100755 --- a/build/tools/common/sd_tools/sd_gen_burn_image_rootless.sh +++ b/build/tools/common/sd_tools/sd_gen_burn_image_rootless.sh @@ -27,7 +27,6 @@ cp -fv ${output_dir}/rawimages/boot.sd ${output_dir}/input/rawimages/ cp -fv ${output_dir}/rawimages/rootfs.sd ${output_dir}/input/ touch ${output_dir}/input/usb.dev touch ${output_dir}/input/usb.rndis0 -touch ${output_dir}/input/fb touch ${output_dir}/input/wifi.sta touch ${output_dir}/input/gt9xx cp -fv ${THISDIR}/genimage_rootless.cfg ${output_dir}/genimage.cfg diff --git a/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S03usbdev b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S00usbdev similarity index 100% rename from buildroot/board/cvitek/SG200X/overlay/etc/init.d/S03usbdev rename to buildroot/board/cvitek/SG200X/overlay/etc/init.d/S00usbdev diff --git a/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S00kmod b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S01kmod similarity index 90% rename from buildroot/board/cvitek/SG200X/overlay/etc/init.d/S00kmod rename to buildroot/board/cvitek/SG200X/overlay/etc/init.d/S01kmod index 606c76547..edc7de285 100755 --- a/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S00kmod +++ b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S01kmod @@ -29,9 +29,6 @@ then insmod soph_pwm.ko insmod soph_saradc.ko insmod soph_wiegand.ko - insmod cfg80211.ko - insmod 3rd/aic8800_bsp.ko - insmod 3rd/aic8800_fdrv.ko echo "OK" exit 0 fi diff --git a/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S01fs b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S02fs similarity index 100% rename from buildroot/board/cvitek/SG200X/overlay/etc/init.d/S01fs rename to buildroot/board/cvitek/SG200X/overlay/etc/init.d/S02fs diff --git a/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S02config b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S03config similarity index 100% rename from buildroot/board/cvitek/SG200X/overlay/etc/init.d/S02config rename to buildroot/board/cvitek/SG200X/overlay/etc/init.d/S03config diff --git a/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S25wifimod b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S25wifimod new file mode 100755 index 000000000..4f12af9db --- /dev/null +++ b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S25wifimod @@ -0,0 +1,13 @@ +#!/bin/sh + +if [ "$1" = "start" ] +then + . /etc/profile + printf "load wifi kernel module: " + cd /mnt/system/ko/ + insmod cfg80211.ko + insmod 3rd/aic8800_bsp.ko + insmod 3rd/aic8800_fdrv.ko + echo "OK" + exit 0 +fi diff --git a/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S30wifi b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S30wifi index 0e51183e3..176b6d582 100755 --- a/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S30wifi +++ b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S30wifi @@ -62,7 +62,7 @@ start() { wpa_passphrase "$ssid" "$pass" >> /etc/wpa_supplicant.conf fi wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf - if [ -e /boot/wifi.dhcp ] + if [ ! -e /boot/wifi.nodhcp ] then (udhcpc -i wlan0 -t 10 -T 1 -A 5 -b -p /run/udhcpc.wlan0.pid) & fi diff --git a/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S99ednctest b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S99ednctest new file mode 100755 index 000000000..9a3ed269d --- /dev/null +++ b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S99ednctest @@ -0,0 +1,39 @@ +#!/bin/sh + +case "$1" in + start) + printf "Starting ednctest: " + if [ -e /boot/ednctest ] + then + touch /tmp/ednctest + fi + . /etc/profile + ( + while true + do + if [ ! -e /tmp/ednctest ] + then + break + fi + if [ ! -e /tmp/rand.h264 ] + then + dd if=/dev/urandom of=/tmp/rand.yuv bs=1M count=2 + /mnt/system/usr/bin/sample_venc -h 1080 -w 1080 -c 264 -i rand.yuv -o /tmp/rand + fi + /mnt/system/usr/bin/sample_vcodec sample_vdec -c 264 -i rand.h264 -o rand + done + ) & + [ $? = 0 ] && echo "OK" || echo "FAIL" + ;; + stop) + printf "Stopping ednctest: " + rm /tmp/ednctest + echo "OK" + ;; + restart) + printf "Restart ednctest: " + $(realpath ${0}) stop + $(realpath ${0}) start + echo "OK" + ;; +esac diff --git a/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S99modeltest b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S99modeltest new file mode 100755 index 000000000..d97a23f83 --- /dev/null +++ b/buildroot/board/cvitek/SG200X/overlay/etc/init.d/S99modeltest @@ -0,0 +1,35 @@ +#!/bin/sh + +case "$1" in + start) + printf "Starting modeltest: " + if [ -e /boot/modeltest ] + then + touch /tmp/modeltest + fi + ( + while true + do + if [ ! -e /tmp/modeltest ] + then + break + fi + cd /usr/bin/ + nice -n 19 model_runner_test 10000 + done + ) & + [ $? = 0 ] && echo "OK" || echo "FAIL" + ;; + stop) + printf "Stopping modeltest: " + rm /tmp/modeltest + killall model_runner + echo "OK" + ;; + restart) + printf "Restart modeltest: " + $(realpath ${0}) stop + $(realpath ${0}) start + echo "OK" + ;; +esac diff --git a/buildroot/board/cvitek/SG200X/overlay/etc/ssh/sshd_config b/buildroot/board/cvitek/SG200X/overlay/etc/ssh/sshd_config index a65bf3fd5..09bf60d89 100644 --- a/buildroot/board/cvitek/SG200X/overlay/etc/ssh/sshd_config +++ b/buildroot/board/cvitek/SG200X/overlay/etc/ssh/sshd_config @@ -17,7 +17,9 @@ #HostKey /etc/ssh/ssh_host_rsa_key #HostKey /etc/ssh/ssh_host_ecdsa_key -#HostKey /etc/ssh/ssh_host_ed25519_key +# generate rsa & ecdsa use a lot of time, so disable it + +HostKey /etc/ssh/ssh_host_ed25519_key # Ciphers and keying #RekeyLimit default none diff --git a/buildroot/board/cvitek/SG200X/overlay/mnt/cfg/param/cvi_sdr_bin b/buildroot/board/cvitek/SG200X/overlay/mnt/cfg/param/cvi_sdr_bin new file mode 100644 index 0000000000000000000000000000000000000000..5b1da5cfebb6d2dcb73fcea34adfbde6ae6654b4 GIT binary patch literal 222105 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�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 literal 0 HcmV?d00001 diff --git a/buildroot/board/cvitek/SG200X/overlay/mnt/data/sensor_cfg.ini b/buildroot/board/cvitek/SG200X/overlay/mnt/data/sensor_cfg.ini new file mode 100644 index 000000000..c1f4c0834 --- /dev/null +++ b/buildroot/board/cvitek/SG200X/overlay/mnt/data/sensor_cfg.ini @@ -0,0 +1,34 @@ +[source] + +;type = SOURCE_USER_FE + +dev_num = 1 + +; section for sensor + +[sensor] + +; sensor name +name = GCORE_GC4653_MIPI_4M_30FPS_10BIT + +bus_id = 4 + +sns_i2c_addr = 29 + +mipi_dev = 0 + +lane_id = 2, 1, 0, -1, -1 + +pn_swap = 0, 0, 0, 0, 0 + +mclk_en = 1 + +mclk = 0 + +;port = 0 + +;pin = 2 + +;pol = 1 + +;fps = 30 diff --git a/buildroot/configs/cvitek_SG200X_32bit_defconfig b/buildroot/configs/cvitek_SG200X_32bit_defconfig new file mode 100644 index 000000000..5ae3e97f6 --- /dev/null +++ b/buildroot/configs/cvitek_SG200X_32bit_defconfig @@ -0,0 +1,383 @@ +BR2_arm=y +BR2_cortex_a53=y +BR2_ARM_EABIHF=y +BR2_ARM_FPU_FP_ARMV8=y + +BR2_TOOLCHAIN_EXTERNAL=y +BR2_TOOLCHAIN_EXTERNAL_ARM_ARM=y +BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y +BR2_TOOLCHAIN_EXTERNAL_GDB_SERVER_COPY=y +BR2_OPTIMIZE_2=y + +BR2_CCACHE=y +BR2_REPRODUCIBLE=y +BR2_PER_PACKAGE_DIRECTORIES=y + +BR2_TARGET_GENERIC_HOSTNAME="licheea53nano" +BR2_TARGET_GENERIC_ISSUE="Welcome to Linux" +BR2_TARGET_GENERIC_ROOT_PASSWD="root" + +BR2_PACKAGE_AIC8800_SDIO_FIRMWARE=y + +BR2_INIT_SYSV=y +BR2_ROOTFS_MERGED_USR=y +BR2_ENABLE_LOCALE_WHITELIST="C en_US en_US.utf8" +BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV=y +BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y +BR2_PACKAGE_KMOD=y +# dont rename network card, +# BR2_PACKAGE_EUDEV_RULES_GEN is not set +BR2_PACKAGE_EUDEV_ENABLE_HWDB=y +BR2_PACKAGE_BLUEZ5_UTILS=y +BR2_PACKAGE_BLUEZ5_UTILS_CLIENT=y +BR2_PACKAGE_BLUEZ5_UTILS_TOOLS=y +BR2_PACKAGE_BLUEZ5_UTILS_DEPRECATED=y +BR2_PACKAGE_BLUEZ5_UTILS_PLUGINS_HID=y +BR2_PACKAGE_BLUEZ5_UTILS_PLUGINS_NETWORK=y +BR2_PACKAGE_BLUEZ5_UTILS_TOOLS_HID2HCI=y +BR2_PACKAGE_BLUEZ5_UTILS_MONITOR=y +BR2_PACKAGE_BLUEZ_ALSA=y +BR2_PACKAGE_BLUEZ_ALSA_RFCOMM=y +BR2_PACKAGE_BLUEZ_ALSA_HCITOP=y +BR2_PACKAGE_NTP=y +BR2_PACKAGE_NTP_NTPD=y +BR2_PACKAGE_NTP_NTPDATE=y +BR2_PACKAGE_MACCHANGER=y +BR2_PACKAGE_AVAHI=y +BR2_PACKAGE_AVAHI_AUTOIPD=y +# avahi mdns is buggy +# BR2_PACKAGE_AVAHI_DAEMON is not set +# BR2_PACKAGE_AVAHI_LIBDNSSD_COMPATIBILITY is not set +# BR2_PACKAGE_AVAHI_DEFAULT_SERVICES is not set +BR2_PACKAGE_MDNSD=y +BR2_PACKAGE_MDNSD_MQUERY=y +BR2_PACKAGE_MDNSD_HTTP_SERVICE=y +BR2_PACKAGE_MDNSD_SSH_SERVICE=y +BR2_PACKAGE_WIRELESS_TOOLS=y +BR2_PACKAGE_WIRELESS_TOOLS_IFRENAME=y +BR2_PACKAGE_WIRELESS_TOOLS_IWCONFIG=y +BR2_PACKAGE_WIRELESS_TOOLS_LIB=y +BR2_PACKAGE_AIRCRACK_NG=y +BR2_PACKAGE_UTIL_LINUX_RFKILL=y +BR2_PACKAGE_IPERF3=y +BR2_PACKAGE_ETHTOOL=y +BR2_PACKAGE_DNSMASQ=y +BR2_PACKAGE_DNSMASQ_DHCP=y +BR2_PACKAGE_RSYNC=y +BR2_PACKAGE_SOCAT=y +BR2_PACKAGE_TINC=y +BR2_PACKAGE_WIRELESS_REGDB=y +BR2_PACKAGE_MOSH=y +BR2_PACKAGE_LRZSZ=y +BR2_PACKAGE_IW=y +BR2_PACKAGE_WIREGUARD_TOOLS=y +BR2_PACKAGE_WPA_SUPPLICANT=y +BR2_PACKAGE_WPA_SUPPLICANT_NL80211=y +BR2_PACKAGE_WPA_SUPPLICANT_WPA3=y +BR2_PACKAGE_WPA_SUPPLICANT_AUTOSCAN=y +BR2_PACKAGE_WPA_SUPPLICANT_AP_SUPPORT=y +BR2_PACKAGE_WPA_SUPPLICANT_OVERRIDES=y +BR2_PACKAGE_WPA_SUPPLICANT_WIFI_DISPLAY=y +BR2_PACKAGE_WPA_SUPPLICANT_MESH_NETWORKING=y +BR2_PACKAGE_WPA_SUPPLICANT_IBSS_RSN=y +BR2_PACKAGE_WPA_SUPPLICANT_WEXT=y +BR2_PACKAGE_WPA_SUPPLICANT_EAP=y +BR2_PACKAGE_WPA_SUPPLICANT_HOTSPOT=y +BR2_PACKAGE_WPA_SUPPLICANT_DEBUG_SYSLOG=y +BR2_PACKAGE_WPA_SUPPLICANT_WPS=y +BR2_PACKAGE_WPA_SUPPLICANT_CLI=y +BR2_PACKAGE_WPA_SUPPLICANT_WPA_CLIENT_SO=y +BR2_PACKAGE_WPA_SUPPLICANT_PASSPHRASE=y +BR2_PACKAGE_WPA_SUPPLICANT_CTRL_IFACE=y +BR2_PACKAGE_WPA_SUPPLICANT_DBUS=y +BR2_PACKAGE_HOSTAPD=y +BR2_PACKAGE_HOSTAPD_DRIVER_HOSTAP=y +BR2_PACKAGE_HOSTAPD_DRIVER_NL80211=y +BR2_PACKAGE_HOSTAPD_ACS=y +BR2_PACKAGE_HOSTAPD_EAP=y +BR2_PACKAGE_HOSTAPD_WPS=y +BR2_PACKAGE_HOSTAPD_WPA3=y +# BR2_PACKAGE_HOSTAPD_VLAN is not set +BR2_PACKAGE_OPENSSH=y +BR2_PACKAGE_OPENSSH_CLIENT=y +BR2_PACKAGE_OPENSSH_SERVER=y +BR2_PACKAGE_OPENSSH_KEY_UTILS=y +BR2_PACKAGE_HAVEGED=y +BR2_PACKAGE_LIBOPENSSL_BIN=y +BR2_PACKAGE_LIBOPENSSL_ENGINES=y +BR2_PACKAGE_PARTED=y +BR2_PACKAGE_MEMTESTER=y +BR2_PACKAGE_CACHE_CALIBRATOR=y +BR2_PACKAGE_DHRYSTONE=y +BR2_PACKAGE_RAMSPEED=y +BR2_PACKAGE_SPIDEV_TEST=y +BR2_PACKAGE_STRESS_NG=y +BR2_PACKAGE_STRACE=y +BR2_PACKAGE_VMTOUCH=y +BR2_PACKAGE_ALSA_UTILS=y +BR2_PACKAGE_ALSA_UTILS_ALSACTL=y +BR2_PACKAGE_ALSA_UTILS_ALSAMIXER=y +BR2_PACKAGE_ALSA_UTILS_APLAY=y +BR2_PACKAGE_MPG123=y +BR2_PACKAGE_BZIP2=y +BR2_PACKAGE_LRZIP=y +BR2_PACKAGE_LZIP=y +BR2_PACKAGE_P7ZIP=y +BR2_PACKAGE_PIGZ=y +BR2_PACKAGE_PIXZ=y +BR2_PACKAGE_UNRAR=y +BR2_PACKAGE_UNZIP=y +BR2_PACKAGE_ZIP=y +BR2_PACKAGE_ZSTD=y +BR2_PACKAGE_LZOP=y +BR2_PACKAGE_BROTLI=y +BR2_PACKAGE_LIBZIP=y +BR2_PACKAGE_LZ4_PROGS=y +BR2_PACKAGE_SZIP=y +BR2_PACKAGE_CA_CERTIFICATES=y +BR2_PACKAGE_EVTEST=y +BR2_PACKAGE_FILE=y +BR2_PACKAGE_EMPTY=y +BR2_PACKAGE_E2FSPROGS=y +BR2_PACKAGE_E2FSPROGS_RESIZE2FS=y +BR2_PACKAGE_TMUX=y +BR2_PACKAGE_HTOP=y +BR2_PACKAGE_LIBCURL=y +BR2_PACKAGE_LIBCURL_CURL=y +BR2_PACKAGE_LIBCURL_VERBOSE=y +BR2_PACKAGE_LIBCURL_PROXY_SUPPORT=y +BR2_PACKAGE_LIBCURL_COOKIES_SUPPORT=y +BR2_PACKAGE_LIBCURL_WEBSOCKETS_SUPPORT=y +BR2_PACKAGE_LIBCURL_EXTRA_PROTOCOLS_FEATURES=y +BR2_PACKAGE_LIBCURL_OPENSSL=y +BR2_PACKAGE_LIBWEBSOCKETS=y +BR2_PACKAGE_WATCHDOG=y +BR2_PACKAGE_SQUASHFS=y +BR2_PACKAGE_SQUASHFS_GZIP=y +BR2_PACKAGE_SQUASHFS_LZ4=y +BR2_PACKAGE_SQUASHFS_LZMA=y +BR2_PACKAGE_SQUASHFS_LZO=y +BR2_PACKAGE_SQUASHFS_XZ=y +BR2_PACKAGE_SQUASHFS_ZSTD=y +BR2_PACKAGE_LCDTEST=y +BR2_PACKAGE_ASCII_INVADERS=y +BR2_PACKAGE_GNUCHESS=y +BR2_PACKAGE_SL=y +BR2_PACKAGE_XORCURSES=y +BR2_PACKAGE_INPUT_EVENT_DAEMON=y +BR2_PACKAGE_BLUEZ_TOOLS=y +BR2_PACKAGE_TPUDEMO_SG200X=y +BR2_PACKAGE_SG2002_CODEC_FIRMWARE=y +BR2_PACKAGE_TCPDUMP=y +BR2_PACKAGE_SSDP_RESPONDER=y +BR2_PACKAGE_PPPD=y +BR2_PACKAGE_NFTABLES=y +BR2_PACKAGE_IPTABLES=y +BR2_PACKAGE_IPTABLES_NFTABLES=y +BR2_PACKAGE_NCURSES_WCHAR=y +BR2_PACKAGE_LIBEDIT=y +BR2_PACKAGE_NGINX=y +BR2_PACKAGE_NGINX_HTTP=y +BR2_PACKAGE_NGINX_HTTP_DAV_MODULE=y +BR2_PACKAGE_NGINX_HTTP_MP4_MODULE=y +BR2_PACKAGE_NGINX_HTTP_FLV_MODULE=y +BR2_PACKAGE_NGINX_HTTP_GUNZIP_MODULE=y +BR2_PACKAGE_NGINX_STREAM=y +BR2_PACKAGE_NGINX_SELECT_MODULE=y +BR2_PACKAGE_NGINX_HTTP_FASTCGI_MODULE=y +BR2_PACKAGE_NGINX_HTTP_UWSGI_MODULE=y +BR2_PACKAGE_NGINX_HTTP_SCGI_MODULE=y +BR2_PACKAGE_RTC_TOOLS=y +BR2_PACKAGE_PICOCOM=y +BR2_PACKAGE_FBGRAB=y +BR2_PACKAGE_MHZ=y +BR2_PACKAGE_SETSERIAL=y +BR2_PACKAGE_UBOOT_TOOLS=y +BR2_PACKAGE_UBOOT_TOOLS_FIT_SUPPORT=y +BR2_PACKAGE_UBOOT_TOOLS_MKIMAGE=y +BR2_PACKAGE_UBOOT_TOOLS_DUMPIMAGE=y + +# if your sdnand is small, you can delete some package + +BR2_PACKAGE_IMAGEMAGICK=y +BR2_PACKAGE_OCRAD=y +BR2_PACKAGE_SDL=y +BR2_PACKAGE_SDL_FBCON=y +BR2_PACKAGE_SDL_GFX=y +BR2_PACKAGE_SDL_IMAGE=y +BR2_PACKAGE_SDL_IMAGE_BMP=y +BR2_PACKAGE_SDL_IMAGE_GIF=y +BR2_PACKAGE_SDL_IMAGE_JPEG=y +BR2_PACKAGE_SDL_IMAGE_PNG=y +BR2_PACKAGE_SDL_IMAGE_WEBP=y +BR2_PACKAGE_SDL_MIXER=y +BR2_PACKAGE_SDL_NET=y +BR2_PACKAGE_SDL_SOUND=y +BR2_PACKAGE_SDL_SOUND_PLAYSOUND=y +BR2_PACKAGE_LBREAKOUT2=y +BR2_PACKAGE_LBREAKOUT2_AUDIO=y +BR2_PACKAGE_LBREAKOUT2_NET=y +BR2_PACKAGE_LTRIS=y +BR2_PACKAGE_LTRIS_AUDIO=y +BR2_PACKAGE_PRBOOM=y +BR2_PACKAGE_DOOM_WAD=y +BR2_PACKAGE_TCL=y +# BR2_PACKAGE_TCL_SHLIB_ONLY is not set +# BR2_PACKAGE_TCL_DEL_ENCODINGS is not set +BR2_PACKAGE_EXPECT=y +BR2_PACKAGE_TCLLIB=y +BR2_PACKAGE_OPENCV4=y +BR2_PACKAGE_OPENCV4_LIB_CALIB3D=y +BR2_PACKAGE_OPENCV4_LIB_DNN=y +BR2_PACKAGE_OPENCV4_LIB_HIGHGUI=y +BR2_PACKAGE_OPENCV4_LIB_OBJDETECT=y +BR2_PACKAGE_OPENCV4_LIB_PHOTO=y +BR2_PACKAGE_OPENCV4_LIB_SHAPE=y +BR2_PACKAGE_OPENCV4_LIB_STITCHING=y +BR2_PACKAGE_OPENCV4_LIB_SUPERRES=y +BR2_PACKAGE_OPENCV4_LIB_TS=y +BR2_PACKAGE_OPENCV4_LIB_VIDEOSTAB=y +BR2_PACKAGE_OPENCV4_BUILD_TESTS=y +BR2_PACKAGE_OPENCV4_BUILD_PERF_TESTS=y +BR2_PACKAGE_OPENCV4_WITH_FFMPEG=y +BR2_PACKAGE_OPENCV4_WITH_JPEG=y +BR2_PACKAGE_OPENCV4_WITH_PNG=y +BR2_PACKAGE_OPENCV4_WITH_TBB=y +BR2_PACKAGE_OPENCV4_WITH_TIFF=y +BR2_PACKAGE_OPENCV4_WITH_V4L=y +BR2_PACKAGE_OPENCV4_WITH_WEBP=y +BR2_PACKAGE_OPENCV4_INSTALL_DATA=y +BR2_PACKAGE_LIBQRENCODE=y +BR2_PACKAGE_LIBQRENCODE_TOOLS=y +BR2_PACKAGE_FFMPEG=y +BR2_PACKAGE_FFMPEG_FFMPEG=y +BR2_PACKAGE_FFMPEG_FFPROBE=y +BR2_PACKAGE_FFMPEG_GPL=y +BR2_PACKAGE_FFMPEG_NONFREE=y +BR2_PACKAGE_FFMPEG_POSTPROC=y +BR2_PACKAGE_MULTICAT=y +BR2_PACKAGE_WQY_ZENHEI=y +BR2_PACKAGE_DEJAVU=y +BR2_PACKAGE_GNUPLOT=y +BR2_PACKAGE_TESSERACT_OCR=y +BR2_PACKAGE_TESSERACT_OCR_LANG_ENG=y +BR2_PACKAGE_TESSERACT_OCR_LANG_CHI_SIM=y +BR2_PACKAGE_TESSERACT_OCR_LANG_CHI_TRA=y +BR2_PACKAGE_QT5=y +BR2_PACKAGE_QT5BASE_SQLITE_SYSTEM=y +BR2_PACKAGE_QT5BASE_GUI=y +BR2_PACKAGE_QT5BASE_LINUXFB=y +BR2_PACKAGE_QT5BASE_WIDGETS=y +BR2_PACKAGE_QT5BASE_DEFAULT_QPA="linuxfb" +BR2_PACKAGE_QT5BASE_FONTCONFIG=y +BR2_PACKAGE_QT5BASE_GIF=y +BR2_PACKAGE_QT5BASE_PNG=y +BR2_PACKAGE_QT5BASE_JPEG=y +BR2_PACKAGE_QT5BASE_SYSLOG=y +BR2_PACKAGE_QT5BASE_DBUS=y +BR2_PACKAGE_QT5BASE_TSLIB=y +BR2_PACKAGE_QT5BASE_EXAMPLES=y +BR2_PACKAGE_QT5BASE_CONCURRENT=y +BR2_PACKAGE_QT5CONNECTIVITY=y +BR2_PACKAGE_QT5IMAGEFORMATS=y +BR2_PACKAGE_QT5MULTIMEDIA=y +BR2_PACKAGE_QT5SENSORS=y +BR2_PACKAGE_QT5SERIALBUS=y +BR2_PACKAGE_QT5CHARTS=y +BR2_PACKAGE_QT5COAP=y +BR2_PACKAGE_QT5ENGINIO=y +BR2_PACKAGE_QT5KNX=y +BR2_PACKAGE_QT5LOCATION=y +BR2_PACKAGE_QT5MQTT=y +BR2_PACKAGE_QT5OPCUA=y +BR2_PACKAGE_QT5REMOTEOBJECTS=y +BR2_PACKAGE_QT5SPEECH=y +BR2_PACKAGE_QT5SVG=y +BR2_PACKAGE_QT5WEBSOCKETS=y +BR2_PACKAGE_QT5WEBCHANNEL=y +BR2_PACKAGE_QEXTSERIALPORT=y +BR2_PACKAGE_QT5X11EXTRAS=y +BR2_PACKAGE_QT5XMLPATTERNS=y +BR2_PACKAGE_QT5BASE_MYSQL=y +BR2_PACKAGE_QJSON=y +BR2_PACKAGE_QUAZIP=y +BR2_PACKAGE_PYTHON3=y +BR2_PACKAGE_PYTHON3_2TO3=y +BR2_PACKAGE_PYTHON3_BZIP2=y +BR2_PACKAGE_PYTHON3_CODECSCJK=y +BR2_PACKAGE_PYTHON3_CURSES=y +BR2_PACKAGE_PYTHON3_SSL=y +BR2_PACKAGE_PYTHON3_UNICODEDATA=y +BR2_PACKAGE_PYTHON3_SQLITE=y +BR2_PACKAGE_PYTHON3_XZ=y +BR2_PACKAGE_PYTHON3_ZLIB=y +BR2_PACKAGE_PYTHON_NUMPY=y +BR2_PACKAGE_OPENCV4_LIB_PYTHON=y +BR2_PACKAGE_OPENCV4_WITH_QT5=y +BR2_PACKAGE_PYTHON_BSDIFF4=y +BR2_PACKAGE_PYTHON_BEAUTIFULSOUP4=y +BR2_PACKAGE_PYTHON_CFFI=y +BR2_PACKAGE_PYTHON_CRC16=y +BR2_PACKAGE_PYTHON_DBUS_FAST=y +BR2_PACKAGE_PYTHON_DATEUTIL=y +BR2_PACKAGE_PYTHON_DBUS_NEXT=y +BR2_PACKAGE_PYTHON_DJANGO=y +BR2_PACKAGE_PYTHON_FLASK=y +BR2_PACKAGE_PYTHON_EVDEV=y +BR2_PACKAGE_PYTHON_FLASK_BABEL=y +BR2_PACKAGE_PYTHON_FLASK_CORS=y +BR2_PACKAGE_PYTHON_FLASK_JSONRPC=y +BR2_PACKAGE_PYTHON_FLASK_LOGIN=y +BR2_PACKAGE_PYTHON_FLASK_SMOREST=y +BR2_PACKAGE_PYTHON_FLASK_SQLALCHEMY=y +BR2_PACKAGE_PYTHON_FLASK_WTF=y +BR2_PACKAGE_PYTHON_HWDATA=y +BR2_PACKAGE_PYTHON_PIP=y +BR2_PACKAGE_PYTHON_PEXPECT=y +BR2_PACKAGE_PYTHON_PSUTIL=y +BR2_PACKAGE_PYTHON_PYAES=y +BR2_PACKAGE_PYTHON_PYALSA=y +BR2_PACKAGE_PYTHON_PYDEVMEM=y +BR2_PACKAGE_PYTHON_PYUSB=y +BR2_PACKAGE_PYTHON_REQUESTS=y +BR2_PACKAGE_PYTHON_REQUESTS_OAUTHLIB=y +BR2_PACKAGE_PYTHON_REQUESTS_TOOLBELT=y +BR2_PACKAGE_PYTHON_SERIAL=y +BR2_PACKAGE_PYTHON_SERIAL_ASYNCIO=y +BR2_PACKAGE_PYTHON_WEBSOCKETS=y +BR2_PACKAGE_PYTHON_WEBSOCKET_CLIENT=y +BR2_PACKAGE_PYTHON_XMODEM=y +BR2_PACKAGE_PYTHON3_PY_PYC=y +BR2_PACKAGE_PYTHON_PYQT5=y +BR2_PACKAGE_PYTHON_PYQRCODE=y +BR2_PACKAGE_PYTHON_PYLIBFDT=y +BR2_PACKAGE_PYTHON3_READLINE=y +BR2_PACKAGE_PYTHON_JEDI=y +BR2_PACKAGE_PYTHON_LIBUSB1=y +BR2_PACKAGE_PYTHON_LXML=y +BR2_PACKAGE_PYTHON_MARKDOWN=y +BR2_PACKAGE_PYTHON_MSGPACK=y +BR2_PACKAGE_PYTHON_PERIPHERY=y +BR2_PACKAGE_PYTHON_PILLOW=y +BR2_PACKAGE_PYTHON_POSIX_IPC=y +BR2_PACKAGE_PYTHON_PROTOBUF=y +BR2_PACKAGE_PYTHON_PYGAME=y +BR2_PACKAGE_PYTHON_PYGAME_IMAGE=y +BR2_PACKAGE_PYTHON_PYGAME_EXAMPLES=y +BR2_PACKAGE_PYTHON_PYGAME_FONT=y +BR2_PACKAGE_PYTHON_PYGAME_MIXER=y +BR2_PACKAGE_PYTHON_PYUDEV=y +BR2_PACKAGE_PYTHON_PYYAML=y +BR2_PACKAGE_PYTHON_QRCODE=y +BR2_PACKAGE_PYTHON_QRCODE_PIL=y +BR2_PACKAGE_PYTHON_INTELHEX=y + +BR2_PACKAGE_VIM=y +BR2_PACKAGE_VIM_RUNTIME=y + +BR2_TARGET_ROOTFS_EXT2=y +BR2_TARGET_ROOTFS_EXT2_4=y +BR2_TARGET_ROOTFS_EXT2_SIZE="900M" + +BR2_ROOTFS_OVERLAY="$(TOPDIR)/board/cvitek/SG200X/overlay" +BR2_PACKAGE_BUSYBOX_CONFIG_FRAGMENT_FILES="$(TOPDIR)/board/cvitek/SG200X/busybox-extra.config" diff --git a/buildroot/configs/cvitek_SG200X_musl_riscv64_defconfig b/buildroot/configs/cvitek_SG200X_musl_riscv64_defconfig index c456ce037..7cd7d8107 100644 --- a/buildroot/configs/cvitek_SG200X_musl_riscv64_defconfig +++ b/buildroot/configs/cvitek_SG200X_musl_riscv64_defconfig @@ -197,18 +197,6 @@ BR2_PACKAGE_NFTABLES=y BR2_PACKAGE_IPTABLES=y BR2_PACKAGE_IPTABLES_NFTABLES=y BR2_PACKAGE_NCURSES_WCHAR=y -BR2_PACKAGE_LIBEDIT=y -BR2_PACKAGE_NGINX=y -BR2_PACKAGE_NGINX_HTTP=y -BR2_PACKAGE_NGINX_HTTP_DAV_MODULE=y -BR2_PACKAGE_NGINX_HTTP_MP4_MODULE=y -BR2_PACKAGE_NGINX_HTTP_FLV_MODULE=y -BR2_PACKAGE_NGINX_HTTP_GUNZIP_MODULE=y -BR2_PACKAGE_NGINX_STREAM=y -BR2_PACKAGE_NGINX_SELECT_MODULE=y -BR2_PACKAGE_NGINX_HTTP_FASTCGI_MODULE=y -BR2_PACKAGE_NGINX_HTTP_UWSGI_MODULE=y -BR2_PACKAGE_NGINX_HTTP_SCGI_MODULE=y BR2_PACKAGE_RTC_TOOLS=y BR2_PACKAGE_PICOCOM=y BR2_PACKAGE_FBGRAB=y @@ -393,6 +381,8 @@ BR2_PACKAGE_PYTHON_PYYAML=y BR2_PACKAGE_PYTHON_QRCODE=y BR2_PACKAGE_PYTHON_QRCODE_PIL=y BR2_PACKAGE_PYTHON_INTELHEX=y +BR2_PACKAGE_MGBA=y +BR2_PACKAGE_GB_TEST_ROMS=y BR2_PACKAGE_VIM=y BR2_PACKAGE_VIM_RUNTIME=y diff --git a/buildroot/package/Config.in b/buildroot/package/Config.in index e9e1505e9..cdef51d09 100644 --- a/buildroot/package/Config.in +++ b/buildroot/package/Config.in @@ -2808,6 +2808,8 @@ menu "Sipeed" source "package/tpudemo-sg200x/Config.in" source "package/xuantie-gdb/Config.in" source "package/sg2002-codec-firmware/Config.in" + source "package/mgba/Config.in" + source "package/gb-test-roms/Config.in" endmenu diff --git a/buildroot/package/gb-test-roms/Config.in b/buildroot/package/gb-test-roms/Config.in new file mode 100644 index 000000000..06f8edf34 --- /dev/null +++ b/buildroot/package/gb-test-roms/Config.in @@ -0,0 +1,4 @@ +config BR2_PACKAGE_GB_TEST_ROMS + bool "gb-test-roms" + help + game boy test roms diff --git a/buildroot/package/gb-test-roms/gb-test-roms.mk b/buildroot/package/gb-test-roms/gb-test-roms.mk new file mode 100644 index 000000000..a5ba46458 --- /dev/null +++ b/buildroot/package/gb-test-roms/gb-test-roms.mk @@ -0,0 +1,20 @@ +################################################################################ +# +# gb-test-roms +# +################################################################################ + +GB_TEST_ROMS_VERSION = 7.0 +GB_TEST_ROMS_SOURCE = game-boy-test-roms-v$(GB_TEST_ROMS_VERSION).zip +GB_TEST_ROMS_SITE = https://github.com/c-sp/gameboy-test-roms/releases/download/v$(GB_TEST_ROMS_VERSION) + +define GB_TEST_ROMS_EXTRACT_CMDS + unzip $(GB_TEST_ROMS_DL_DIR)/$(GB_TEST_ROMS_SOURCE) -d $(@D) +endef + +define GB_TEST_ROMS_INSTALL_TARGET_CMDS + mkdir -pv $(TARGET_DIR)/usr/share/gb-test-roms/ + rsync -r --verbose --copy-dirlinks --copy-links --hard-links ${@D}/* $(TARGET_DIR)/usr/share/gb-test-roms/ +endef + +$(eval $(generic-package)) diff --git a/buildroot/package/mgba/Config.in b/buildroot/package/mgba/Config.in new file mode 100644 index 000000000..0ff4f6cec --- /dev/null +++ b/buildroot/package/mgba/Config.in @@ -0,0 +1,8 @@ +config BR2_PACKAGE_MGBA + bool "mgba" + depends on BR2_PACKAGE_SDL + depends on BR2_PACKAGE_QT5 + help + game boy advance emulator + + https://github.com/mgba-emu/mgba diff --git a/buildroot/package/mgba/mgba.mk b/buildroot/package/mgba/mgba.mk new file mode 100644 index 000000000..0e8c788fc --- /dev/null +++ b/buildroot/package/mgba/mgba.mk @@ -0,0 +1,18 @@ +################################################################################ +# +# mgba +# +################################################################################ + +MGBA_VERSION = a2587cb8cff265d9f327a9413b4f2c5e607850fb +MGBA_SITE = $(call github,mgba-emu,mgba,$(MGBA_VERSION)) +MGBA_DEPENDENCIES = qt5base qt5svg qt5multimedia sdl + +MGBA_CONF_OPTS += -DBUILD_SDL=ON +MGBA_CONF_OPTS += -DBUILD_QT=OFF +MGBA_CONF_OPTS += -DBUILD_GL=OFF +MGBA_CONF_OPTS += -DBUILD_GLES2=OFF +MGBA_CONF_OPTS += -DBUILD_GLES2=OFF +MGBA_CONF_OPTS += -DUSE_PNG=OFF + +$(eval $(cmake-package)) diff --git a/buildroot/package/tpudemo-sg200x/tpudemo-sg200x.mk b/buildroot/package/tpudemo-sg200x/tpudemo-sg200x.mk index df05ef589..0cb79f4da 100644 --- a/buildroot/package/tpudemo-sg200x/tpudemo-sg200x.mk +++ b/buildroot/package/tpudemo-sg200x/tpudemo-sg200x.mk @@ -4,7 +4,7 @@ # ################################################################################ -TPUDEMO_SG200X_VERSION = 118431aa403322f040dcad8ccd7f9fd7c07b9923 +TPUDEMO_SG200X_VERSION = 345541b2f2a30e4efaa7505aa3b911826ec78505 TPUDEMO_SG200X_SITE = $(call github,0x754C,tpudemo-sg200x,$(TPUDEMO_SG200X_VERSION)) define TPUDEMO_SG200X_INSTALL_TARGET_CMDS diff --git a/linux_5.10/drivers/video/fbdev/Makefile b/linux_5.10/drivers/video/fbdev/Makefile index a34d55ff9..079bea4f8 100644 --- a/linux_5.10/drivers/video/fbdev/Makefile +++ b/linux_5.10/drivers/video/fbdev/Makefile @@ -128,7 +128,8 @@ obj-$(CONFIG_FB_OF) += offb.o obj-$(CONFIG_FB_MX3) += mx3fb.o obj-$(CONFIG_FB_DA8XX) += da8xx-fb.o obj-$(CONFIG_FB_SSD1307) += ssd1307fb.o -obj-$(CONFIG_FB_SIMPLE) += simplefb.o dc8000-fb.o +obj-$(CONFIG_FB_SIMPLE) += simplefb.o +# dc8000-fb.o # the test framebuffer is last obj-$(CONFIG_FB_VIRTUAL) += vfb.o diff --git a/middleware/v2/.gitignore b/middleware/v2/.gitignore deleted file mode 100644 index 12ab46d03..000000000 --- a/middleware/v2/.gitignore +++ /dev/null @@ -1,43 +0,0 @@ -*.d -*.o -*.dep -*.dwo - -*_asan -sample/audio/sample_audio -sample/audio/sample_audio_aec -sample/audio/sample_audio_nr -sample/audio/sample_audio_resample -sample/audio/sample_audio_transcode -sample/audio/sample_audio_rtos -sample/cipher/sample_cipher -sample/cvg/sample_cvg -sample/mipi_tx/sample_dsi -sample/fisheye/sample_fisheye -sample/overlay/sample_overlay -sample/region/sample_region -sample/venc/sample_vcodec -sample/vdec/sample_vdec -sample/venc/sample_venc -sample/vio/sample_vio -sample/vdecvo/sample_vdecvo -sample/multivenc/sample_multivenc -sample/ir_auto/ir_auto -sample/mipi_tx/lt9611/lt9611 -sample/osdc/sample_osdc -sample/scene_auto/sample_scene_auto -sample/sensor_test/sensor_test -sample/tp2863_tp2803/sample_test_tp2863_tp2803 - -modules/venc/vc/jpeg/driver/bm_jpg_test -modules/venc/vc/jpeg/driver/bmjpuapi/bmjpegdec -modules/venc/vc/jpeg/driver/bmjpuapi/bmjpegenc -modules/venc/vc/vcodec/codebase/cvi_h265_enc_test -modules/venc/vc/vcodec/codebase/cvi_h264_dec -modules/venc/vc/vcodec/codebase/cvi_h265_dec -modules/venc/vc/jpeg/driver/cvi_jpg_codec - -modules/venc/vc/vcodec/codebase/sample/cvi_vcodec_version.h -modules/venc/vc/jpeg/driver/include/version.h - -.vscode/settings.json diff --git a/middleware/v2/component/isp/.gitignore b/middleware/v2/component/isp/.gitignore deleted file mode 100644 index 31dc3078b..000000000 --- a/middleware/v2/component/isp/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.d -*.o diff --git a/middleware/v2/sample/gyro/.gitignore b/middleware/v2/sample/gyro/.gitignore deleted file mode 100644 index 90e0a5ccc..000000000 --- a/middleware/v2/sample/gyro/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -sample_get_gyro -sample_get_acc -sample_get_temp diff --git a/middleware/v2/sample/ive/.gitignore b/middleware/v2/sample/ive/.gitignore deleted file mode 100755 index 0564bb2a8..000000000 --- a/middleware/v2/sample/ive/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -sample_add -sample_sub -sample_and -sample_xor -sample_or -sample_erode -sample_dilate -sample_thresh -sample_thresh_U16 -sample_thresh_S16 -sample_ordstatfilter -sample_resize -sample_sad -sample_ncc -sample_map -sample_lbp -sample_integ -sample_hist -sample_gradfg -sample_csc -sample_filter -sample_filterandcsc -sample_cannyhysedge -sample_cannyedge -sample_dma -sample_magandang -sample_bernsen -sample_sobel -sample_normgrad -sample_16bitto8bit -sample_stcandicorner -sample_framediffmotion -sample_gmm -sample_gmm2 -sample_bgmodel -sample_query diff --git a/u-boot-2021.10/cmd/cvi_vo.c b/u-boot-2021.10/cmd/cvi_vo.c index 41124a874..959c11c63 100644 --- a/u-boot-2021.10/cmd/cvi_vo.c +++ b/u-boot-2021.10/cmd/cvi_vo.c @@ -3,8 +3,10 @@ * Copyright (C) Cvitek Co., Ltd. 2019-2020. All rights reserved. */ +#include #include #include +#include #include #include #include @@ -17,6 +19,8 @@ #include +#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) + #define PANLE_ADAPTIVITY 0 enum sclr_vo_intf intf_type = SCLR_VO_INTF_MIPI; @@ -154,8 +158,7 @@ static void dsi_panel_init(void) u8 prepare = panel_desc.hs_timing_cfg->prepare; u8 zero = panel_desc.hs_timing_cfg->zero; u8 trail = panel_desc.hs_timing_cfg->trail; - - debug("Init panel %s\n", panel_desc.panel_name); + printf("Init panel %s\n", panel_desc.panel_name); mipi_tx_set_combo_dev_cfg(panel_desc.dev_cfg); dsi_init(0, panel_desc.dsi_init_cmds, panel_desc.dsi_init_cmds_size); dphy_set_hs_settle(prepare, zero, trail); @@ -183,6 +186,38 @@ static int do_startvo(struct cmd_tbl *cmdtp, int flag, int argc, char * const ar return CMD_RET_USAGE; uclass_get_device(UCLASS_VIDEO, 0, &udev); + char *panel_name = NULL; + panel_name = env_get("panel"); + if (panel_name != NULL) { + if (strcmp(panel_name,"zct2133v1") == 0) { // 7inch + panel_desc.panel_name = "zct2133v1-800x1280"; + panel_desc.dev_cfg = &dev_cfg_zct2133v1_800x1280; + panel_desc.hs_timing_cfg = &hs_timing_cfg_zct2133v1_800x1280; + panel_desc.dsi_init_cmds = dsi_init_cmds_zct2133v1_800x1280; + panel_desc.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_zct2133v1_800x1280); + } else if (strcmp(panel_name,"st7701_dxq5d0019b480854") == 0) { // 5inch + panel_desc.panel_name = "ST7701-480x854dxq"; + panel_desc.dev_cfg = &dev_cfg_st7701_480x854dxq; + panel_desc.hs_timing_cfg = &hs_timing_cfg_st7701_480x854dxq; + panel_desc.dsi_init_cmds = dsi_init_cmds_st7701_480x854dxq; + panel_desc.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_st7701_480x854dxq); + } else if (strcmp(panel_name,"st7701_hd228001c31") == 0) { // 2.8 inch + panel_desc.panel_name = "ST7701-368x552"; + panel_desc.dev_cfg = &dev_cfg_st7701_368x552; + panel_desc.hs_timing_cfg = &hs_timing_cfg_st7701_368x552; + panel_desc.dsi_init_cmds = dsi_init_cmds_st7701_368x552; + panel_desc.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_st7701_368x552); + } else if (strcmp(panel_name,"st7701_d300fpc9307a") == 0) { // 3 inch + panel_desc.panel_name = "ST7701-480x854"; + panel_desc.dev_cfg = &dev_cfg_st7701_480x854; + panel_desc.hs_timing_cfg = &hs_timing_cfg_st7701_480x854; + panel_desc.dsi_init_cmds = dsi_init_cmds_st7701_480x854; + panel_desc.dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_st7701_480x854); + } else { + printf("panel %s not found\n\r", panel_name); + } + } + switch (intf) { case VO_INTF_MIPI: { mipi_tx_set_mode(0); diff --git a/u-boot-2021.10/include/configs/mars-asic.h b/u-boot-2021.10/include/configs/mars-asic.h index 12cdefac8..8ac86c47b 100644 --- a/u-boot-2021.10/include/configs/mars-asic.h +++ b/u-boot-2021.10/include/configs/mars-asic.h @@ -256,6 +256,7 @@ "sdboot=" SD_BOOTM_COMMAND "\0" \ "sdbootauto=" SD_BOOTM_COMMAND_AUTO "\0" \ "othbootargs=" OTHERBOOTARGS "\0" \ + "loadenvcmd=mmc info;load mmc 0:1 ${uImage_addr} uEnv.txt; if test $? -eq 0; then env import ${uImage_addr} - ; fi;\0" \ PARTS_OFFSET /********************************************************************************/ @@ -311,7 +312,7 @@ #ifdef CONFIG_ENABLE_ALIOS_UPDATE #define CONFIG_BOOTCOMMAND "cvi_update_rtos" #elif CONFIG_SD_BOOT - #define CONFIG_BOOTCOMMAND SHOWLOGOCMD "run sdboot || run sdbootauto" + #define CONFIG_BOOTCOMMAND "run loadenvcmd ; " SHOWLOGOCMD "run sdboot || run sdbootauto" #else #define CONFIG_BOOTCOMMAND SHOWLOGOCMD "cvi_update || run norboot || run nandboot ||run emmcboot" #endif diff --git a/u-boot-2021.10/include/cvitek/cvi_panels/cvi_panels.h b/u-boot-2021.10/include/cvitek/cvi_panels/cvi_panels.h index 23c436d7b..0df7de9d3 100644 --- a/u-boot-2021.10/include/cvitek/cvi_panels/cvi_panels.h +++ b/u-boot-2021.10/include/cvitek/cvi_panels/cvi_panels.h @@ -12,6 +12,7 @@ #include "cvi_i80.h" #include "cvi_lvds.h" + struct panel_desc_s { char *panel_name; const struct combo_dev_cfg_s *dev_cfg; @@ -24,6 +25,11 @@ struct panel_desc_s { struct cvi_lvds_cfg_s *lvds_cfg; }; +#include "dsi_st7701_d300fpc9307a.h" +#include "dsi_zct2133v1.h" +#include "dsi_st7701_dxq5d0019b480854.h" +#include "dsi_st7701_hd228001c31.h" + #ifdef MIPI_PANEL_HX8394 #include "dsi_hx8394_evb.h" static struct panel_desc_s panel_desc = { @@ -79,7 +85,6 @@ static struct panel_desc_s panel_desc = { .dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_ota7290b_320x1280) }; #elif defined(MIPI_PANEL_ST7701_D300FPC9307A) -#include "dsi_st7701_d300fpc9307a.h" static struct panel_desc_s panel_desc = { .panel_name = "ST7701-480x854", .dev_cfg = &dev_cfg_st7701_480x854, @@ -106,7 +111,6 @@ static struct panel_desc_s panel_desc = { .dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_icn9707_480x1920) }; #elif defined(MIPI_PANEL_ST7701_DXQ5D0019B480854) -#include "dsi_st7701_dxq5d0019b480854.h" static struct panel_desc_s panel_desc = { .panel_name = "ST7701-480x854dxq", .dev_cfg = &dev_cfg_st7701_480x854dxq, @@ -133,7 +137,6 @@ static struct panel_desc_s panel_desc = { .dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_st7701_480x800) }; #elif defined(MIPI_PANEL_ST7701_HD228001C31) -#include "dsi_st7701_hd228001c31.h" static struct panel_desc_s panel_desc = { .panel_name = "ST7701-368x552", .dev_cfg = &dev_cfg_st7701_368x552, @@ -160,7 +163,6 @@ static struct panel_desc_s panel_desc = { .dsi_init_cmds_size = ARRAY_SIZE(dsi_init_cmds_st7785m_240x320) }; #elif defined(MIPI_PANEL_ZCT2133V1) -#include "dsi_zct2133v1.h" static struct panel_desc_s panel_desc = { .panel_name = "zct2133v1-800x1280", .dev_cfg = &dev_cfg_zct2133v1_800x1280,