Merge pull request #56 from yue-xiaomin/dev

add NOR/NAND configurations
This commit is contained in:
Carbon
2024-01-17 03:34:22 +00:00
committed by GitHub
75 changed files with 2553 additions and 20 deletions

View File

@ -71,10 +71,12 @@ Usage:
./build.sh [board] - Build [board] directly, supported boards asfollows: ./build.sh [board] - Build [board] directly, supported boards asfollows:
milkv-duo milkv-duo
milkv-duo-lite milkv-duo-lite
milkv-duo-spinand
milkv-duo-spinor
milkv-duo256m milkv-duo256m
milkv-duo256m-lite milkv-duo256m-lite
``` ```
最下边列出的是当前支持的目标版本列表,带 `lite` 后缀的为精简版,不包含 pythonpip, pinpong 等库和应用包。 最下边列出的是当前支持的目标版本列表,带 `lite` 后缀的为精简版,不包含 pythonpip, pinpong 等库和应用包。`spinor`或者`spinand` 后缀的为基于IOB板载NOR FLASH或者NAND FLASH的版本。
如提示中所示,有两种方法来编译目录版本。 如提示中所示,有两种方法来编译目录版本。
@ -84,8 +86,11 @@ milkv-duo256m-lite
Select a target to build: Select a target to build:
1. milkv-duo 1. milkv-duo
2. milkv-duo-lite 2. milkv-duo-lite
3. milkv-duo256m 3. milkv-duo-spinand
4. milkv-duo256m-lite 4. milkv-duo-spinor
5. milkv-duo256m
6. milkv-duo256m-lite
7. milkv-duos
Which would you like: Which would you like:
``` ```
@ -94,7 +99,7 @@ Which would you like:
# ./build.sh milkv-duo # ./build.sh milkv-duo
``` ```
编译成功后可以在 `out` 目录下看到生成的SD卡烧录镜像 `milkv-duo-*-*.img` 编译成功后可以在 `out` 目录下看到生成的SD卡烧录镜像 `milkv-duo-*-*.img`或者NOR FLASH/NAND FLASH 的烧录文件目录`milkv-duo-*-*`
*注: 第一次编译会自动下载所需的工具链,大小为 840M 左右,下载完会自动解压到 SDK 目录下的 `host-tools` 目录,下次编译时检测到已存在 `host-tools` 目录,就不会再次下载了* *注: 第一次编译会自动下载所需的工具链,大小为 840M 左右,下载完会自动解压到 SDK 目录下的 `host-tools` 目录,下次编译时检测到已存在 `host-tools` 目录,就不会再次下载了*
@ -110,6 +115,8 @@ tar -xf host-tools.tar.gz -C /your/sdk/path/
``` ```
milkv-duo cv1800b_milkv_duo_sd milkv-duo cv1800b_milkv_duo_sd
milkv-duo-lite cv1800b_milkv_duo_sd milkv-duo-lite cv1800b_milkv_duo_sd
milkv-duo-spinand cv1800b_milkv_duo_spinand
milkv-duo-spinor cv1800b_milkv_duo_spinor
milkv-duo256m cv1812cp_milkv_duo256m_sd milkv-duo256m cv1812cp_milkv_duo256m_sd
milkv-duo256m-lite cv1812cp_milkv_duo256m_sd milkv-duo256m-lite cv1812cp_milkv_duo256m_sd
``` ```
@ -138,6 +145,8 @@ pack_sd_image
生成的固件位置: 生成的固件位置:
``` ```
Duo: install/soc_cv1800b_milkv_duo_sd/[board].img Duo: install/soc_cv1800b_milkv_duo_sd/[board].img
Duo(nor): install/soc_cv1800b_milkv_duo_sd/fip.bin、boot.spinor、rootfs.spinor
Duo(nand): install/soc_cv1800b_milkv_duo_sd/fip.bin、boot.spinand、rootfs.spinand、system.spinand、cfg.spinand
Duo256M: install/soc_cv1812cp_milkv_duo256m_sd/[board].img Duo256M: install/soc_cv1812cp_milkv_duo256m_sd/[board].img
``` ```
@ -188,6 +197,8 @@ docker exec -it duodocker /bin/bash -c "cd /home/work && cat /etc/issue && ./bui
``` ```
milkv-duo milkv-duo
milkv-duo-lite milkv-duo-lite
milkv-duo-spinand
milkv-duo-spinor
milkv-duo256m milkv-duo256m
milkv-duo256m-lite milkv-duo256m-lite
``` ```
@ -231,6 +242,8 @@ root@8edea33c2239:/# cd /home/work/
``` ```
milkv-duo cv1800b_milkv_duo_sd milkv-duo cv1800b_milkv_duo_sd
milkv-duo-lite cv1800b_milkv_duo_sd milkv-duo-lite cv1800b_milkv_duo_sd
milkv-duo-spinand cv1800b_milkv_duo_spinand
milkv-duo-spinor cv1800b_milkv_duo_spinor
milkv-duo256m cv1812cp_milkv_duo256m_sd milkv-duo256m cv1812cp_milkv_duo256m_sd
milkv-duo256m-lite cv1812cp_milkv_duo256m_sd milkv-duo256m-lite cv1812cp_milkv_duo256m_sd
``` ```
@ -259,6 +272,8 @@ pack_sd_image
生成的固件位置: 生成的固件位置:
``` ```
Duo: install/soc_cv1800b_milkv_duo_sd/[board].img Duo: install/soc_cv1800b_milkv_duo_sd/[board].img
Duo(nor): install/soc_cv1800b_milkv_duo_sd/fip.bin、boot.spinor、rootfs.spinor
Duo(nand): install/soc_cv1800b_milkv_duo_sd/fip.bin、boot.spinand、rootfs.spinand、system.spinand、cfg.spinand
Duo256M: install/soc_cv1812cp_milkv_duo256m_sd/[board].img Duo256M: install/soc_cv1812cp_milkv_duo256m_sd/[board].img
``` ```
@ -332,6 +347,14 @@ appendWindowsPath = false
```bash ```bash
sudo dd if=milkv-duo-XXX.img of=/dev/sdX sudo dd if=milkv-duo-XXX.img of=/dev/sdX
``` ```
## IOB板FLASH烧录
- 需要IOB板FLASH位置处焊接上NOR或者NAND FLASH(需要用户后期自己动手)
- 准备一张没有烧录SD镜像的SD卡将out下`milkv-duo-spinor-*-*`或者`milkv-duo-spinand-*-*`目录下全部文件拷贝至内存卡根目录
- 将拷贝好镜像的 TF 卡插入 Milk-V Duo 的 TF 卡槽中
- 接好串口线,可观察刻录进度
- 开机上电即开始刻录镜像到NOR或者NAND等待uboot中自动刻录镜像完成
- 拔掉Milk-V Duo 的 TF 卡槽中的 TF 卡重新上电即可从NOR或者NAND启动
## 开机 ## 开机

View File

@ -111,6 +111,11 @@ function milkv_build()
popd popd
fi fi
# clean nor/nand img
if [ -f "${OUTPUT_DIR}/upgrade.zip" ]; then
rm -rf ${OUTPUT_DIR}/*
fi
clean_all clean_all
build_all build_all
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
@ -154,10 +159,37 @@ function milkv_pack_sd()
fi fi
} }
function milkv_pack_nor_nand()
{
[ ! -d out ] && mkdir out
if [ -f "${OUTPUT_DIR}/upgrade.zip" ]; then
nor_out_name=${MILKV_BOARD}-`date +%Y%m%d-%H%M`
mkdir -p out/$nor_out_name
if [ "${STORAGE_TYPE}" == "spinor" ]; then
cp ${OUTPUT_DIR}/fip.bin out/$nor_out_name
cp ${OUTPUT_DIR}/*.spinor out/$nor_out_name
else
cp ${OUTPUT_DIR}/fip.bin out/$nor_out_name
cp ${OUTPUT_DIR}/*.spinand out/$nor_out_name
fi
touch ${OUTPUT_DIR}/how_to_download.txt
echo "Copy all to a blank tf card, power on and automatically download firmware to NOR or NAND in U-bOOT." >> out/$nor_out_name/how_to_download.txt
print_info "Create spinor img successful: ${nor_out_name}"
else
print_err "Create spinor img failed!"
exit 1
fi
}
function milkv_pack() function milkv_pack()
{ {
if [ "${STORAGE_TYPE}" == "sd" ]; then if [ "${STORAGE_TYPE}" == "sd" ]; then
milkv_pack_sd milkv_pack_sd
else
milkv_pack_nor_nand
fi fi
} }

View File

@ -562,6 +562,16 @@ br-rootfs-prepare:export CROSS_COMPILE_KERNEL=$(patsubst "%",%,$(CONFIG_CROSS_CO
br-rootfs-prepare:export CROSS_COMPILE_SDK=$(patsubst "%",%,$(CONFIG_CROSS_COMPILE_SDK)) br-rootfs-prepare:export CROSS_COMPILE_SDK=$(patsubst "%",%,$(CONFIG_CROSS_COMPILE_SDK))
br-rootfs-prepare: br-rootfs-prepare:
$(call print_target) $(call print_target)
ifneq ($(STORAGE_TYPE), sd)
#${Q}cp -r ${RAMDISK_PATH}/rootfs/buildroot_fs/arm/* $(BR_ROOTFS_DIR)
$(call TARGET_PACKAGE_INSTALL_BR_ROOTFS)
${Q}mkdir -p $(BR_ROOTFS_DIR)/etc/init.d/
${Q}python3 $(COMMON_TOOLS_PATH)/image_tool/create_automount.py $(FLASH_PARTITION_XML) $(BR_ROOTFS_DIR)/etc/init.d/
# Generate /etc/fw_env.config
# ${Q}mkdir -p $(BR_ROOTFS_DIR)/etc
${Q}python3 $(COMMON_TOOLS_PATH)/image_tool/mkcvipart.py $(FLASH_PARTITION_XML) $(BR_ROOTFS_DIR)/etc --fw_env
endif
# copy ko and mmf libs # copy ko and mmf libs
${Q}mkdir -p $(BR_ROOTFS_DIR)/mnt/system ${Q}mkdir -p $(BR_ROOTFS_DIR)/mnt/system
${Q}cp -arf ${SYSTEM_OUT_DIR}/* $(BR_ROOTFS_DIR)/mnt/system/ ${Q}cp -arf ${SYSTEM_OUT_DIR}/* $(BR_ROOTFS_DIR)/mnt/system/
@ -579,6 +589,14 @@ endif
${Q}mkdir -p $(BR_OVERLAY_DIR) ${Q}mkdir -p $(BR_OVERLAY_DIR)
${Q}cp -arf $(BR_ROOTFS_DIR)/* $(BR_OVERLAY_DIR) ${Q}cp -arf $(BR_ROOTFS_DIR)/* $(BR_OVERLAY_DIR)
# create partition mounting points and move sytems to read-write partitions
ifeq ($(STORAGE_TYPE), spinand)
${Q}mkdir -p $(BR_OVERLAY_DIR)/mnt/cfg
${Q}mkdir -p $(BR_OVERLAY_DIR)/mnt/data
${Q}mkdir -p $(OUTPUT_DIR)/system
${Q}cp -arf $(BR_OVERLAY_DIR)/mnt/system/* $(OUTPUT_DIR)/system
endif
br-rootfs-pack:export TARGET_OUTPUT_DIR=$(BR_DIR)/output/$(BR_BOARD) br-rootfs-pack:export TARGET_OUTPUT_DIR=$(BR_DIR)/output/$(BR_BOARD)
br-rootfs-pack: br-rootfs-pack:
$(call print_target) $(call print_target)
@ -587,8 +605,16 @@ br-rootfs-pack:
# ${Q}rm -rf $(BR_ROOTFS_DIR)/* # ${Q}rm -rf $(BR_ROOTFS_DIR)/*
${Q}rm -rf $(BR_MV_VENDOR_DIR) ${Q}rm -rf $(BR_MV_VENDOR_DIR)
# copy rootfs to rawimg dir # copy rootfs to rawimg dir
ifeq ($(STORAGE_TYPE), spinand)
${Q}python3 $(COMMON_TOOLS_PATH)/spinand_tool/mkubiimg.py --ubionly $(FLASH_PARTITION_XML) ROOTFS $(TARGET_OUTPUT_DIR)/images/rootfs.squashfs $(OUTPUT_DIR)/rawimages/rootfs.spinand -b $(CONFIG_NANDFLASH_BLOCKSIZE) -p $(CONFIG_NANDFLASH_PAGESIZE)
$(call raw2cimg ,rootfs.$(STORAGE_TYPE))
else ifeq ($(STORAGE_TYPE), spinor)
${Q}cp $(TARGET_OUTPUT_DIR)/images/rootfs.squashfs $(OUTPUT_DIR)/rawimages/rootfs.$(STORAGE_TYPE)
$(call raw2cimg ,rootfs.$(STORAGE_TYPE))
else
${Q}cp $(TARGET_OUTPUT_DIR)/images/rootfs.ext4 $(OUTPUT_DIR)/rawimages/rootfs_ext4.$(STORAGE_TYPE) ${Q}cp $(TARGET_OUTPUT_DIR)/images/rootfs.ext4 $(OUTPUT_DIR)/rawimages/rootfs_ext4.$(STORAGE_TYPE)
$(call raw2cimg ,rootfs_ext4.$(STORAGE_TYPE)) $(call raw2cimg ,rootfs_ext4.$(STORAGE_TYPE))
endif
ifeq ($(CONFIG_BUILDROOT_FS),y) ifeq ($(CONFIG_BUILDROOT_FS),y)
rootfs:br-rootfs-prepare rootfs:br-rootfs-prepare

View File

@ -0,0 +1,6 @@
{
"ddr_cfg_list": [
"ddr2_1333_x16"
],
"board_information": "C906B + SPINAND 128MB + QFN SIP 64MB"
}

View File

@ -0,0 +1,44 @@
CONFIG_CHIP_cv1800b=y
CONFIG_BOARD_milkv_duo_spinand=y
CONFIG_DDR_CFG_ddr2_1333_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_NO_FB=y
CONFIG_NO_TP=y
CONFIG_DDR_64MB_SIZE=y
CONFIG_BOOT_IMAGE_SINGLE_DTB=y
CONFIG_STORAGE_TYPE_spinand=y
CONFIG_SENSOR_TUNING_PARAM_cv180x_src_sms_sc200ai=y
CONFIG_SENSOR_SMS_SC200AI=y
CONFIG_SENSOR_GCORE_GC2053=y
CONFIG_SENSOR_GCORE_GC2083=y
CONFIG_SENSOR_SMS_SC035HGS=y
CONFIG_SENSOR_OV_OV5647=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_CVITRACER is not set
# CONFIG_TARGET_PACKAGE_GDBSERVER is not set
# CONFIG_TARGET_PACKAGE_LIBCRYPTO is not set
# CONFIG_TARGET_PACKAGE_LIBZ is not set
# CONFIG_TARGET_PACKAGE_OTASERVER is not set
# CONFIG_TARGET_PACKAGE_RSYSLOG is not set
CONFIG_TARGET_PACKAGE_CRONTABS=y
# CONFIG_TARGET_PACKAGE_GATORD is not set
CONFIG_TARGET_PACKAGE_WIFI=y
CONFIG_TARGET_PACKAGE_DROPBEAR=y
CONFIG_TARGET_PACKAGE_NTP=y
CONFIG_ENABLE_FREERTOS=y
CONFIG_ENABLE_RTOS_DUMP_PRINT=y
CONFIG_DUMP_PRINT_SZ_IDX=17
CONFIG_USE_4K_ERASE_SIZE_FOR_JFFS2=y
CONFIG_USB_OSDRV_CVITEK_GADGET=n
CONFIG_BUILDROOT_FS=y
CONFIG_BUILD_FOR_DEBUG=y

View File

@ -0,0 +1,39 @@
/dts-v1/;
#include "cv180x_base_riscv.dtsi"
#include "cv180x_asic_qfn.dtsi"
#include "cv180x_asic_spinand.dtsi"
#include "cv180x_default_memmap.dtsi"
&mipi_rx{
snsr-reset = <&portc 8 GPIO_ACTIVE_LOW>, <&portc 8 GPIO_ACTIVE_LOW>, <&portc 8 GPIO_ACTIVE_LOW>;
};
&spi0 {
status = "okay";
flash@0 {
compatible = "winbond,w25n01", "spi-nand";
reg = <0>;
};
};
&spi2 {
status = "okay";
spidev@0 {
status = "okay";
};
};
&uart4 {
status = "okay";
};
&i2c1 {
status = "okay";
clock-frequency = <100000>;
};
/ {
};

View File

@ -0,0 +1,271 @@
# 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=n
CONFIG_IKCONFIG_PROC=n
CONFIG_LOG_BUF_SHIFT=15
CONFIG_BLK_DEV_INITRD=y
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
# CONFIG_SYSFS_SYSCALL is not set
# CONFIG_FHANDLE is not set
# CONFIG_BUG is not set
# CONFIG_BASE_FULL is not set
# CONFIG_EPOLL is not set
# CONFIG_SIGNALFD is not set
# CONFIG_TIMERFD is not set
# CONFIG_AIO is not set
# CONFIG_IO_URING is not set
# CONFIG_ADVISE_SYSCALLS 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_CV180X=y
CONFIG_ARCH_CVITEK_CHIP="cv180x"
CONFIG_ARCH_CV180X_ASIC=y
CONFIG_COMPAT_32BIT_TIME=y
# CONFIG_STRICT_KERNEL_RWX is not set
CONFIG_MODULES=y
CONFIG_MODULE_FORCE_LOAD=y
CONFIG_MODULE_UNLOAD=y
CONFIG_BLOCK=y
CONFIG_BLK_SCSI_REQUEST=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_IP_MULTICAST=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
# CONFIG_INET_DIAG is not set
CONFIG_IPV6_ROUTER_PREF=y
CONFIG_IPV6_ROUTE_INFO=y
CONFIG_IPV6_OPTIMISTIC_DAD=y
# CONFIG_IPV6_SIT is not set
CONFIG_IPV6_MROUTE=y
CONFIG_CFG80211=y
# CONFIG_CFG80211_CRDA_SUPPORT is not set
CONFIG_CFG80211_WEXT=y
CONFIG_MAC80211=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_NAND_CVSNFC=y
CONFIG_MTD_SPI_NOR=y
CONFIG_SPI_CVI_SPIF=y
CONFIG_SCSI=y
CONFIG_SCSI_DMA=y
CONFIG_SCSI_PROC_FS=y
CONFIG_BLK_DEV_SD=y
CONFIG_SCSI_LOWLEVEL=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_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_MICROCHIP is not set
# CONFIG_WLAN_VENDOR_RALINK is not set
# CONFIG_WLAN_VENDOR_REALTEK 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_WLAN_VENDOR_QUANTENNA is not set
# CONFIG_WLAN_VENDOR_ICOMMSEMI is not set
# CONFIG_WLAN_VENDOR_AICSEMI 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_CV180X_THERMAL=m
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_FB_TFT=y
CONFIG_FB_TFT_SSD1306=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_STORAGE=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_USB_ROLE_SWITCH=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_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_CVI_MAILBOX=y
CONFIG_PWM=y
CONFIG_SIFIVE_PLIC=y
CONFIG_ANDROID=y
CONFIG_EXT3_FS=y
CONFIG_EXT4_DEBUG=y
# CONFIG_MANDATORY_FILE_LOCKING is not set
CONFIG_VFAT_FS=y
# CONFIG_PROC_PAGE_MONITOR is not set
CONFIG_TMPFS=y
CONFIG_JFFS2_FS=y
CONFIG_JFFS2_FS_WBUF_VERIFY=y
CONFIG_UBIFS_FS=y
CONFIG_SQUASHFS=y
CONFIG_SQUASHFS_XZ=y
CONFIG_NFS_FS=y
CONFIG_NFS_V4=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_ECDH=y
CONFIG_CRYPTO_ECB=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_DYNAMIC_DEBUG=y
# CONFIG_ENABLE_MUST_CHECK is not set
# CONFIG_FRAME_POINTER is not set
CONFIG_DEBUG_FS=y
# CONFIG_DEBUG_MISC 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

View File

@ -0,0 +1,82 @@
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 = 64 * SIZE_1M
# ==============
# C906L FreeRTOS
# ==============
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
# ==============================
# 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 = 26.80078125 * SIZE_1M
H26X_BITSTREAM_SIZE = 0 * SIZE_1M
H26X_ENC_BUFF_SIZE = 0
ISP_MEM_BASE_SIZE = 0 * SIZE_1M
BOOTLOGO_SIZE = 0 * SIZE_1M
FREERTOS_RESERVED_ION_SIZE = H26X_BITSTREAM_SIZE + H26X_ENC_BUFF_SIZE + ISP_MEM_BASE_SIZE + BOOTLOGO_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
# Boot logo is after ISP buffer and inside the ION buffer
BOOTLOGO_ADDR = ISP_MEM_BASE_ADDR + ISP_MEM_BASE_SIZE
assert BOOTLOGO_ADDR + BOOTLOGO_SIZE <= ION_ADDR + ION_SIZE
# ===================
# FSBL and u-boot-2021
# ===================
CVI_UPDATE_HEADER_SIZE = SIZE_1K
UIMAG_SIZE = 15 * SIZE_1M
# kernel image loading buffer
UIMAG_ADDR = DRAM_BASE + 20 * 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 <= ION_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

View File

@ -0,0 +1,10 @@
<physical_partition type="spinand">
<partition label="fip" size_in_kb="2560" file="fip.bin"/>
<partition label="BOOT" size_in_kb="6144" file="boot.spinand"/>
<partition label="ENV" size_in_kb="128" file="" />
<partition label="ENV_BAK" size_in_kb="128" file="" />
<partition label="ROOTFS" size_in_kb="40960" file="rootfs.spinand" />
<partition label="SYSTEM" size_in_kb="71680" file="system.spinand" mountpoint="/mnt/system" type="ubifs" />
<partition label="CFG" size_in_kb="4096" file="cfg.spinand" mountpoint="/mnt/cfg" type="ubifs" />
<partition label="DATA" file="" mountpoint="/mnt/data" type="ubifs" />
</physical_partition>

View File

@ -0,0 +1,30 @@
#!/bin/bash
SYSTEM_DIR=$1
rm -rf $SYSTEM_DIR/mnt/system/usr
rm -rf $SYSTEM_DIR/mnt/system/lib
rm -rf $SYSTEM_DIR/etc/init.d/S01syslogd
rm -rf $SYSTEM_DIR/etc/init.d/S02klogd
rm -rf $SYSTEM_DIR/etc/init.d/S02sysctl
rm -rf $SYSTEM_DIR/etc/init.d/S20urandom
rm -rf $SYSTEM_DIR/etc/init.d/S40network
rm -rf $SYSTEM_DIR/etc/init.d/S23ntp
rm -rf $SYSTEM_DIR/bin/ntpd
rm -rf $SYSTEM_DIR/mnt/cfg/secure.img
#del cv181x_mipi_tx.ko
rm -rf $SYSTEM_DIR/mnt/system/ko/cv181x_mipi_tx.ko
sed -i "/cv181x_mipi_tx.ko/d" $SYSTEM_DIR/mnt/system/ko/loadsystemko.sh
if [ $BUILD_FOR_DEBUG != "y" ]
then
#del dmesg cmd if CONFIG_PRINTK=n
#sed -i "/dmesg/d" $SYSTEM_DIR/mnt/system/ko/loadsystemko.sh
#del debugfs node
sed -i "/debugfs/d" $SYSTEM_DIR/etc/fstab
fi
du -sh $SYSTEM_DIR/* |sort -rh

View File

@ -0,0 +1,45 @@
int cvi_board_init(void)
{
// sensor mclk reset
PINMUX_CONFIG(PAD_MIPIRX0P, CAM_MCLK0); // Camera MCLK0
PINMUX_CONFIG(PAD_MIPIRX1N, XGPIOC_8); // Camera Reset
// all default gpio
PINMUX_CONFIG(SD0_PWR_EN, XGPIOA_14); // Duo Pin 19
PINMUX_CONFIG(SPK_EN, XGPIOA_15); // Duo Pin 20
//PINMUX_CONFIG(SPINOR_MISO, XGPIOA_23); // Duo Pin 21
//PINMUX_CONFIG(SPINOR_CS_X, XGPIOA_24); // Duo Pin 22
//PINMUX_CONFIG(SPINOR_SCK, XGPIOA_22); // Duo Pin 24
//PINMUX_CONFIG(SPINOR_MOSI, XGPIOA_25); // Duo Pin 25
//PINMUX_CONFIG(SPINOR_WP_X, XGPIOA_27); // Duo Pin 26
//PINMUX_CONFIG(SPINOR_HOLD_X, XGPIOA_26); // Duo Pin 27
PINMUX_CONFIG(PWR_SEQ2, PWR_GPIO_4); // Duo Pin 29
// ADC pins set to gpio
PINMUX_CONFIG(ADC1, XGPIOB_3); // ADC1
PINMUX_CONFIG(USB_VBUS_DET, XGPIOB_6); // ADC2
// I2C0
PINMUX_CONFIG(IIC0_SCL, IIC0_SCL);
PINMUX_CONFIG(IIC0_SDA, IIC0_SDA);
// I2C1
PINMUX_CONFIG(PAD_MIPIRX1P, IIC1_SDA);
PINMUX_CONFIG(PAD_MIPIRX0N, IIC1_SCL);
// PWM
PINMUX_CONFIG(SD1_D2, PWM_5);
PINMUX_CONFIG(SD1_D1, PWM_6);
// UART 4
PINMUX_CONFIG(SD1_GPIO1, UART4_TX);
PINMUX_CONFIG(SD1_GPIO0, UART4_RX);
// SPI
PINMUX_CONFIG(SD1_CLK, SPI2_SCK);
PINMUX_CONFIG(SD1_CMD, SPI2_SDO);
PINMUX_CONFIG(SD1_D0, SPI2_SDI);
PINMUX_CONFIG(SD1_D3, SPI2_CS_X);
return 0;
}

View File

@ -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

View File

@ -0,0 +1,50 @@
CONFIG_RISCV=y
CONFIG_SYS_MALLOC_F_LEN=0x2000
CONFIG_NR_DRAM_BANKS=1
CONFIG_DEFAULT_DEVICE_TREE="cv180x_asic"
CONFIG_IDENT_STRING=" cvitek_cv180x"
CONFIG_ARCH_RV64I=y
CONFIG_RISCV_SMODE=y
CONFIG_TARGET_CVITEK_CV180X=y
CONFIG_DISTRO_DEFAULTS=y
CONFIG_FIT=y
# CONFIG_ARCH_FIXUP_FDT_MEMORY is not set
CONFIG_BOOTDELAY=1
CONFIG_SYS_PROMPT="cv180x_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_SPI_FLASH is not set
# 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_SPI_FLASH_USE_4K_SECTORS is not set
CONFIG_NAND_BOOT=y
CONFIG_NAND_SUPPORT=y
CONFIG_MTD_RAW_NAND=y
CONFIG_NAND_FLASH_CVSNFC_V3=y
CONFIG_ENV_IS_IN_NAND=y

View File

@ -0,0 +1,6 @@
{
"ddr_cfg_list": [
"ddr2_1333_x16"
],
"board_information": "C906B + SPINOR 32MB + QFN SIP 64MB"
}

View File

@ -0,0 +1,44 @@
CONFIG_CHIP_cv1800b=y
CONFIG_BOARD_milkv_duo_spinor=y
CONFIG_DDR_CFG_ddr2_1333_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_NO_FB=y
CONFIG_NO_TP=y
CONFIG_DDR_64MB_SIZE=y
CONFIG_BOOT_IMAGE_SINGLE_DTB=y
CONFIG_STORAGE_TYPE_spinor=y
CONFIG_SENSOR_TUNING_PARAM_cv180x_src_sms_sc200ai=y
CONFIG_SENSOR_SMS_SC200AI=y
CONFIG_SENSOR_GCORE_GC2053=y
CONFIG_SENSOR_GCORE_GC2083=y
CONFIG_SENSOR_SMS_SC035HGS=y
CONFIG_SENSOR_OV_OV5647=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_CVITRACER is not set
# CONFIG_TARGET_PACKAGE_GDBSERVER is not set
# CONFIG_TARGET_PACKAGE_LIBCRYPTO is not set
# CONFIG_TARGET_PACKAGE_LIBZ is not set
# CONFIG_TARGET_PACKAGE_OTASERVER is not set
# CONFIG_TARGET_PACKAGE_RSYSLOG is not set
CONFIG_TARGET_PACKAGE_CRONTABS=y
# CONFIG_TARGET_PACKAGE_GATORD is not set
CONFIG_TARGET_PACKAGE_WIFI=y
CONFIG_TARGET_PACKAGE_DROPBEAR=y
CONFIG_TARGET_PACKAGE_NTP=y
CONFIG_ENABLE_FREERTOS=y
CONFIG_ENABLE_RTOS_DUMP_PRINT=y
CONFIG_DUMP_PRINT_SZ_IDX=17
CONFIG_USE_4K_ERASE_SIZE_FOR_JFFS2=y
CONFIG_USB_OSDRV_CVITEK_GADGET=n
CONFIG_BUILDROOT_FS=y
CONFIG_BUILD_FOR_DEBUG=y

View File

@ -0,0 +1,39 @@
/dts-v1/;
#include "cv180x_base_riscv.dtsi"
#include "cv180x_asic_qfn.dtsi"
#include "cv180x_asic_sd.dtsi"
#include "cv180x_default_memmap.dtsi"
&mipi_rx{
snsr-reset = <&portc 8 GPIO_ACTIVE_LOW>, <&portc 8 GPIO_ACTIVE_LOW>, <&portc 8 GPIO_ACTIVE_LOW>;
};
&spi0 {
status = "okay";
flash@0 {
compatible = "winbond,w25q256", "jedec,spi-nor";
reg = <0>;
};
};
&spi2 {
status = "okay";
spidev@0 {
status = "okay";
};
};
&uart4 {
status = "okay";
};
&i2c1 {
status = "okay";
clock-frequency = <100000>;
};
/ {
};

View File

@ -0,0 +1,240 @@
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_SYSFS_SYSCALL is not set
# CONFIG_FHANDLE is not set
# CONFIG_BUG is not set
# CONFIG_BASE_FULL is not set
# CONFIG_EPOLL is not set
# CONFIG_SIGNALFD is not set
# CONFIG_TIMERFD is not set
# CONFIG_AIO is not set
# CONFIG_IO_URING is not set
# CONFIG_ADVISE_SYSCALLS 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_CV180X=y
CONFIG_ARCH_CVITEK_CHIP="cv180x"
CONFIG_ARCH_CV180X_ASIC=y
CONFIG_COMPAT_32BIT_TIME=y
# CONFIG_STRICT_KERNEL_RWX is not set
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_IP_MULTICAST=y
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
# CONFIG_INET_DIAG is not set
CONFIG_IPV6_ROUTER_PREF=y
CONFIG_IPV6_ROUTE_INFO=y
CONFIG_IPV6_OPTIMISTIC_DAD=y
# CONFIG_IPV6_SIT is not set
CONFIG_IPV6_MROUTE=y
CONFIG_CFG80211=y
CONFIG_CFG80211_WEXT=y
CONFIG_MAC80211=y
CONFIG_RFKILL=y
CONFIG_RFKILL_INPUT=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_SPI_NOR=y
CONFIG_SPI_CVI_SPIF=y
CONFIG_EEPROM_93CX6=m
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=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_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_MICROCHIP is not set
# CONFIG_WLAN_VENDOR_RALINK is not set
# CONFIG_WLAN_VENDOR_REALTEK 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_WLAN_VENDOR_QUANTENNA is not set
# CONFIG_WLAN_VENDOR_ICOMMSEMI is not set
# CONFIG_WLAN_VENDOR_AICSEMI 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_SPI_DESIGNWARE=y
CONFIG_SPI_DW_MMIO=y
CONFIG_SPI_SPIDEV=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_CV180X_THERMAL=m
CONFIG_WATCHDOG=y
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_STORAGE=y
CONFIG_USB_DWC2=y
CONFIG_USB_GADGET=y
CONFIG_USB_CONFIGFS=y
CONFIG_USB_CONFIGFS_SERIAL=y
CONFIG_USB_CONFIGFS_ACM=y
CONFIG_USB_CONFIGFS_RNDIS=y
CONFIG_USB_CONFIGFS_MASS_STORAGE=y
CONFIG_USB_ROLE_SWITCH=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_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_FB_TFT=y
CONFIG_FB_TFT_SSD1306=m
# CONFIG_IOMMU_SUPPORT is not set
CONFIG_CV1835_SYSDMA_REMAP=y
CONFIG_PWM=y
CONFIG_SIFIVE_PLIC=y
CONFIG_ANDROID=y
CONFIG_EXT3_FS=y
CONFIG_EXT4_DEBUG=y
# CONFIG_MANDATORY_FILE_LOCKING is not set
CONFIG_VFAT_FS=y
# CONFIG_PROC_PAGE_MONITOR is not set
CONFIG_TMPFS=y
CONFIG_JFFS2_FS=y
CONFIG_JFFS2_FS_WBUF_VERIFY=y
CONFIG_SQUASHFS=y
# CONFIG_SQUASHFS_ZLIB is not set
CONFIG_SQUASHFS_XZ=y
CONFIG_NFS_FS=y
CONFIG_NFS_V4=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_ECDH=y
CONFIG_CRYPTO_ECB=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_DYNAMIC_DEBUG=y
# CONFIG_ENABLE_MUST_CHECK is not set
# CONFIG_FRAME_POINTER is not set
CONFIG_DEBUG_FS=y
# CONFIG_DEBUG_MISC 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

View File

@ -0,0 +1,82 @@
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 = 64 * SIZE_1M
# ==============
# C906L FreeRTOS
# ==============
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
# ==============================
# 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 = 26.80078125 * SIZE_1M
H26X_BITSTREAM_SIZE = 0 * SIZE_1M
H26X_ENC_BUFF_SIZE = 0
ISP_MEM_BASE_SIZE = 0 * SIZE_1M
BOOTLOGO_SIZE = 0 * SIZE_1M
FREERTOS_RESERVED_ION_SIZE = H26X_BITSTREAM_SIZE + H26X_ENC_BUFF_SIZE + ISP_MEM_BASE_SIZE + BOOTLOGO_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
# Boot logo is after ISP buffer and inside the ION buffer
BOOTLOGO_ADDR = ISP_MEM_BASE_ADDR + ISP_MEM_BASE_SIZE
assert BOOTLOGO_ADDR + BOOTLOGO_SIZE <= ION_ADDR + ION_SIZE
# ===================
# FSBL and u-boot-2021
# ===================
CVI_UPDATE_HEADER_SIZE = SIZE_1K
UIMAG_SIZE = 15 * SIZE_1M
# kernel image loading buffer
UIMAG_ADDR = DRAM_BASE + 20 * 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 <= ION_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

View File

@ -0,0 +1,7 @@
<physical_partition type="spinor">
<partition label="fip" size_in_kb="640" readonly="false" file="fip.bin"/>
<partition label="BOOT" size_in_kb="4096" readonly="false" file="boot.spinor"/>
<partition label="ENV" size_in_kb="64" file="" />
<partition label="ROOTFS" size_in_kb="27968" readonly="true" file="rootfs.spinor" />
</physical_partition>

View File

@ -0,0 +1,30 @@
#!/bin/bash
SYSTEM_DIR=$1
rm -rf $SYSTEM_DIR/mnt/system/usr
rm -rf $SYSTEM_DIR/mnt/system/lib
rm -rf $SYSTEM_DIR/etc/init.d/S01syslogd
rm -rf $SYSTEM_DIR/etc/init.d/S02klogd
rm -rf $SYSTEM_DIR/etc/init.d/S02sysctl
rm -rf $SYSTEM_DIR/etc/init.d/S20urandom
rm -rf $SYSTEM_DIR/etc/init.d/S40network
rm -rf $SYSTEM_DIR/etc/init.d/S23ntp
rm -rf $SYSTEM_DIR/bin/ntpd
rm -rf $SYSTEM_DIR/mnt/cfg/secure.img
#del cv181x_mipi_tx.ko
rm -rf $SYSTEM_DIR/mnt/system/ko/cv181x_mipi_tx.ko
sed -i "/cv181x_mipi_tx.ko/d" $SYSTEM_DIR/mnt/system/ko/loadsystemko.sh
if [ $BUILD_FOR_DEBUG != "y" ]
then
#del dmesg cmd if CONFIG_PRINTK=n
#sed -i "/dmesg/d" $SYSTEM_DIR/mnt/system/ko/loadsystemko.sh
#del debugfs node
sed -i "/debugfs/d" $SYSTEM_DIR/etc/fstab
fi
du -sh $SYSTEM_DIR/* |sort -rh

View File

@ -0,0 +1,45 @@
int cvi_board_init(void)
{
// sensor mclk reset
PINMUX_CONFIG(PAD_MIPIRX0P, CAM_MCLK0); // Camera MCLK0
PINMUX_CONFIG(PAD_MIPIRX1N, XGPIOC_8); // Camera Reset
// all default gpio
PINMUX_CONFIG(SD0_PWR_EN, XGPIOA_14); // Duo Pin 19
PINMUX_CONFIG(SPK_EN, XGPIOA_15); // Duo Pin 20
//PINMUX_CONFIG(SPINOR_MISO, XGPIOA_23); // Duo Pin 21
//PINMUX_CONFIG(SPINOR_CS_X, XGPIOA_24); // Duo Pin 22
//PINMUX_CONFIG(SPINOR_SCK, XGPIOA_22); // Duo Pin 24
//PINMUX_CONFIG(SPINOR_MOSI, XGPIOA_25); // Duo Pin 25
//PINMUX_CONFIG(SPINOR_WP_X, XGPIOA_27); // Duo Pin 26
//PINMUX_CONFIG(SPINOR_HOLD_X, XGPIOA_26); // Duo Pin 27
PINMUX_CONFIG(PWR_SEQ2, PWR_GPIO_4); // Duo Pin 29
// ADC pins set to gpio
PINMUX_CONFIG(ADC1, XGPIOB_3); // ADC1
PINMUX_CONFIG(USB_VBUS_DET, XGPIOB_6); // ADC2
// I2C0
PINMUX_CONFIG(IIC0_SCL, IIC0_SCL);
PINMUX_CONFIG(IIC0_SDA, IIC0_SDA);
// I2C1
PINMUX_CONFIG(PAD_MIPIRX1P, IIC1_SDA);
PINMUX_CONFIG(PAD_MIPIRX0N, IIC1_SCL);
// PWM
PINMUX_CONFIG(SD1_D2, PWM_5);
PINMUX_CONFIG(SD1_D1, PWM_6);
// UART 4
PINMUX_CONFIG(SD1_GPIO1, UART4_TX);
PINMUX_CONFIG(SD1_GPIO0, UART4_RX);
// SPI
PINMUX_CONFIG(SD1_CLK, SPI2_SCK);
PINMUX_CONFIG(SD1_CMD, SPI2_SDO);
PINMUX_CONFIG(SD1_D0, SPI2_SDI);
PINMUX_CONFIG(SD1_D3, SPI2_CS_X);
return 0;
}

View File

@ -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

View File

@ -0,0 +1,50 @@
CONFIG_RISCV=y
CONFIG_SYS_MALLOC_F_LEN=0x2000
CONFIG_NR_DRAM_BANKS=1
CONFIG_DEFAULT_DEVICE_TREE="cv180x_asic"
CONFIG_IDENT_STRING="cvitek_cv180x"
CONFIG_ARCH_RV64I=y
CONFIG_RISCV_SMODE=y
CONFIG_TARGET_CVITEK_CV180X=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_SYS_PROMPT="cv180x_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_SPI_FLASH_USE_4K_SECTORS is not set
# CONFIG_NAND_BOOT is not set
# CONFIG_ONENAND_BOOT is not set
CONFIG_QSPI_BOOT=y
# CONFIG_SATA_BOOT is not set
CONFIG_SPI_BOOT=y

View File

@ -529,19 +529,19 @@ function cvi_setup_env()
# envs setup for specific ${SDK_VER} # envs setup for specific ${SDK_VER}
envs_sdk_ver envs_sdk_ver
if [ "${STORAGE_TYPE}" == "spinand" ]; then # if [ "${STORAGE_TYPE}" == "spinand" ]; then
PAGE_SUFFIX=2k # PAGE_SUFFIX=2k
if [ ${NANDFLASH_PAGESIZE} == 4096 ]; then # if [ ${NANDFLASH_PAGESIZE} == 4096 ]; then
PAGE_SUFFIX=4k # PAGE_SUFFIX=4k
fi # fi
if [[ "$ENABLE_ALIOS" != "y" ]]; then # if [[ "$ENABLE_ALIOS" != "y" ]]; then
pushd "$BUILD_PATH"/boards/"${CHIP_ARCH,,}"/"$PROJECT_FULLNAME"/partition/ # pushd "$BUILD_PATH"/boards/"${CHIP_ARCH,,}"/"$PROJECT_FULLNAME"/partition/
ln -fs ../../../default/partition/partition_spinand_page_"$PAGE_SUFFIX".xml \ # ln -fs ../../../default/partition/partition_spinand_page_"$PAGE_SUFFIX".xml \
partition_"$STORAGE_TYPE".xml # partition_"$STORAGE_TYPE".xml
popd # popd
fi # fi
fi # fi
# configure flash partition table # configure flash partition table
if [ -z "${STORAGE_TYPE}" ]; then if [ -z "${STORAGE_TYPE}" ]; then

View File

@ -0,0 +1,41 @@
BR2_riscv=y
BR2_TOOLCHAIN_EXTERNAL=y
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="riscv64-unknown-linux-musl"
BR2_TOOLCHAIN_EXTERNAL_HEADERS_5_10=y
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y
BR2_TOOLCHAIN_EXTERNAL_CXX=y
BR2_TARGET_LDFLAGS="-mcpu=c906fdv -march=rv64imafdcv0p7xthead -mcmodel=medany -mabi=lp64d"
BR2_TARGET_GENERIC_HOSTNAME="milkv-duo"
BR2_TARGET_GENERIC_ISSUE="Welcome to Milk-V Duo"
BR2_TARGET_GENERIC_ROOT_PASSWD="milkv"
BR2_ROOTFS_OVERLAY="board/milkv/milkv-duo-spinand/overlay"
BR2_PACKAGE_DUO_PINMUX=y
BR2_PACKAGE_SPIDEV_TEST=y
BR2_PACKAGE_STRACE=y
BR2_PACKAGE_E2FSPROGS=y
BR2_PACKAGE_E2FSPROGS_RESIZE2FS=y
BR2_PACKAGE_MTD=y
BR2_PACKAGE_EVTEST=y
BR2_PACKAGE_OPENSSL=y
BR2_PACKAGE_FREETYPE=y
BR2_PACKAGE_EXPAT=y
BR2_PACKAGE_JSON_C=y
BR2_PACKAGE_LIBXSLT=y
BR2_PACKAGE_LIBNL=y
BR2_PACKAGE_LIBFFI=y
BR2_PACKAGE_DHCPCD=y
BR2_PACKAGE_DNSMASQ=y
BR2_PACKAGE_DROPBEAR=y
BR2_PACKAGE_ETHTOOL=y
BR2_PACKAGE_IPERF3=y
BR2_PACKAGE_NTP=y
BR2_PACKAGE_NTP_NTPDATE=y
BR2_PACKAGE_NTP_NTPTIME=y
BR2_PACKAGE_HTOP=y
BR2_PACKAGE_KMOD=y
BR2_PACKAGE_UTIL_LINUX_UUIDD=y
BR2_TARGET_ROOTFS_SQUASHFS=y
BR2_TARGET_ROOTFS_SQUASHFS4_XZ=y
# BR2_TARGET_ROOTFS_TAR is not set
BR2_PACKAGE_HOST_E2FSPROGS=y
BR2_PACKAGE_HOST_GENIMAGE=y

View File

@ -0,0 +1,41 @@
BR2_riscv=y
BR2_TOOLCHAIN_EXTERNAL=y
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_PREFIX="riscv64-unknown-linux-musl"
BR2_TOOLCHAIN_EXTERNAL_HEADERS_5_10=y
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y
BR2_TOOLCHAIN_EXTERNAL_CXX=y
BR2_TARGET_LDFLAGS="-mcpu=c906fdv -march=rv64imafdcv0p7xthead -mcmodel=medany -mabi=lp64d"
BR2_TARGET_GENERIC_HOSTNAME="milkv-duo"
BR2_TARGET_GENERIC_ISSUE="Welcome to Milk-V Duo"
BR2_TARGET_GENERIC_ROOT_PASSWD="milkv"
BR2_ROOTFS_OVERLAY="board/milkv/milkv-duo-spinor/overlay"
BR2_PACKAGE_DUO_PINMUX=y
BR2_PACKAGE_SPIDEV_TEST=y
BR2_PACKAGE_STRACE=y
BR2_PACKAGE_E2FSPROGS=y
BR2_PACKAGE_E2FSPROGS_RESIZE2FS=y
BR2_PACKAGE_MTD=y
BR2_PACKAGE_EVTEST=y
BR2_PACKAGE_OPENSSL=y
BR2_PACKAGE_FREETYPE=y
BR2_PACKAGE_EXPAT=y
BR2_PACKAGE_JSON_C=y
BR2_PACKAGE_LIBXSLT=y
BR2_PACKAGE_LIBNL=y
BR2_PACKAGE_LIBFFI=y
BR2_PACKAGE_DHCPCD=y
BR2_PACKAGE_DNSMASQ=y
BR2_PACKAGE_DROPBEAR=y
BR2_PACKAGE_ETHTOOL=y
BR2_PACKAGE_IPERF3=y
BR2_PACKAGE_NTP=y
BR2_PACKAGE_NTP_NTPDATE=y
BR2_PACKAGE_NTP_NTPTIME=y
BR2_PACKAGE_HTOP=y
BR2_PACKAGE_KMOD=y
BR2_PACKAGE_UTIL_LINUX_UUIDD=y
BR2_TARGET_ROOTFS_SQUASHFS=y
BR2_TARGET_ROOTFS_SQUASHFS4_XZ=y
# BR2_TARGET_ROOTFS_TAR is not set
BR2_PACKAGE_HOST_E2FSPROGS=y
BR2_PACKAGE_HOST_GENIMAGE=y

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

View File

Binary file not shown.

View File

@ -0,0 +1,8 @@
#!/bin/bash
export MV_BOARD=milkv-duo-spinand
export MV_BOARD_CPU=cv1800b
export MV_VENDOR=milkv
export MV_BUILD_ENV=milkvsetup.sh
export MV_BOARD_LINK=cv1800b_milkv_duo_spinand

View File

@ -0,0 +1,6 @@
mnt/system/
mnt/cfg/
mnt/data/
usr/bin
usr/share
usr/lib

View File

@ -0,0 +1,4 @@
interface=usb0
dhcp-range=192.168.42.2,192.168.42.242,1h
dhcp-option=3
dhcp-option=6

View File

@ -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 $?

View File

@ -0,0 +1,40 @@
# /etc/inittab
#
# Copyright (C) 2001 Erik Andersen <andersen@codepoet.org>
#
# 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>:<runlevels>:<action>:<process>
#
# 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

View File

@ -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

View File

@ -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 $?

View File

@ -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 $?

View File

@ -0,0 +1 @@
../usr/lib64v0p7_xthead/lp64d/libc.so

View File

@ -0,0 +1,2 @@
#! /bin/sh
exec /bin/login -f root

View File

@ -0,0 +1,43 @@
flash nand-128M-2048 {
pebsize = 131072
numpebs = 1024
minimum-io-unit-size = 2048
}
image milkv-duospinand.img {
flash {
}
flashtype = "nand-128M-2048"
partition fip {
image = "fip.bin"
size = 2560k
}
partition boot {
image = "rawimages/boot.spinand"
size = 6144k
}
partition env {
size = 128k
}
partition env_bak {
size = 128k
}
partition rootfs {
image = "rootfs.spinand"
size = 40960k
}
partition system {
image = "rawimages/system.spinand"
size = 71680k
partition cfg {
image = "rawimages/cfg.spinand"
size = 4096k
}
}

View File

@ -0,0 +1,21 @@
#!/bin/sh
LED_PIN=440
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

View File

@ -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/cv180x_pwm.ko

View File

@ -0,0 +1,4 @@
#!/bin/sh
echo host > /proc/cviusb/otg_role >> /tmp/usb.log 2>&1

View File

@ -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

View File

@ -0,0 +1 @@
usb-host.sh

View File

@ -0,0 +1,8 @@
#!/bin/bash
export MV_BOARD=milkv-duo-spinor
export MV_BOARD_CPU=cv1800b
export MV_VENDOR=milkv
export MV_BUILD_ENV=milkvsetup.sh
export MV_BOARD_LINK=cv1800b_milkv_duo_spinor

View File

@ -0,0 +1,6 @@
mnt/system/
mnt/cfg/
mnt/data/
usr/bin
usr/share
usr/lib

View File

@ -0,0 +1,4 @@
interface=usb0
dhcp-range=192.168.42.2,192.168.42.242,1h
dhcp-option=3
dhcp-option=6

View File

@ -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 $?

View File

@ -0,0 +1,40 @@
# /etc/inittab
#
# Copyright (C) 2001 Erik Andersen <andersen@codepoet.org>
#
# 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>:<runlevels>:<action>:<process>
#
# 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

View File

@ -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

View File

@ -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 $?

View File

@ -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 $?

View File

@ -0,0 +1 @@
../usr/lib64v0p7_xthead/lp64d/libc.so

View File

@ -0,0 +1,2 @@
#! /bin/sh
exec /bin/login -f root

View File

@ -0,0 +1,30 @@
flash nor-32M-256 {
pebsize = 4096
numpebs = 8192
minimum-io-unit-size = 256
}
image milkv-duospinor.img {
flash {
}
flashtype = "nor-32M-256"
partition fip {
image = "fip.bin"
size = 640k
}
partition boot {
image = "rawimages/boot.spinor"
size = 4096k
}
partition env {
size = 64k
}
partition rootfs {
image = "rawimages/rootfs.spinor"
size = 27968k
}
}

View File

@ -0,0 +1,21 @@
#!/bin/sh
LED_PIN=440
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

View File

@ -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/cv180x_pwm.ko

View File

@ -0,0 +1,4 @@
#!/bin/sh
echo host > /proc/cviusb/otg_role >> /tmp/usb.log 2>&1

View File

@ -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

View File

@ -0,0 +1 @@
usb-host.sh

View File

@ -0,0 +1 @@
cv1800b_wdmb_0008a_spinor

View File

@ -0,0 +1 @@
cv1800b_wdmb_0008a_spinor

View File

@ -86,7 +86,8 @@ int _prgImage(char *file, uint32_t chunk_header_size, char *file_name)
#elif defined(CONFIG_SPI_FLASH) #elif defined(CONFIG_SPI_FLASH)
if (update_magic == SD_UPDATE_MAGIC && (!strcmp(file_name, "fip_spl.bin") if (update_magic == SD_UPDATE_MAGIC && (!strcmp(file_name, "fip_spl.bin")
|| !strcmp(file_name, "fip.bin") || !strcmp(file_name, "fip.bin")
|| !strcmp(file_name, "boot.spinor"))) { || !strcmp(file_name, "boot.spinor")
|| !strcmp(file_name, "rootfs.spinor"))) {
snprintf(cmd, 255, "sf update %p 0x%x 0x%x", snprintf(cmd, 255, "sf update %p 0x%x 0x%x",
(void *)file + chunk_header_size, offset, size); (void *)file + chunk_header_size, offset, size);
} else { } else {