From da098fba4d2ebefa5460a6b6624ac07108e764a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=8F=AF=E4=BA=AE?= Date: Tue, 12 Dec 2023 14:23:53 +0800 Subject: [PATCH] v1.0.2: fitimage for demo88 mmc --- .../baremetal/bootloader/cmd/SConscript | 4 +- .../baremetal/bootloader/cmd/mmc_boot.c | 42 ++------ .../bootloader/cmd/mmc_boot_no_fitimage.c | 101 ++++++++++++++++++ .../baremetal/bootloader/include/fitimage.h | 8 ++ .../bootloader/lib/fitimage/fitimage.c | 90 ++++++++++++---- ..._demo88-mmc_baremetal_bootloader_defconfig | 93 +++++++++++----- ..._demo88-mmc_rt-thread_helloworld_defconfig | 59 ++++------ target/d21x/demo88-mmc/pack/bootloader.bin | Bin 90768 -> 97680 bytes target/d21x/demo88-mmc/pack/image_cfg.json | 14 +-- 9 files changed, 281 insertions(+), 130 deletions(-) create mode 100644 application/baremetal/bootloader/cmd/mmc_boot_no_fitimage.c diff --git a/application/baremetal/bootloader/cmd/SConscript b/application/baremetal/bootloader/cmd/SConscript index 48e4dc9d..5c902e50 100644 --- a/application/baremetal/bootloader/cmd/SConscript +++ b/application/baremetal/bootloader/cmd/SConscript @@ -19,8 +19,10 @@ if GetDepend('AIC_BOOTLOADER_CMD_NOR_BOOT') and not GetDepend('LPKG_USING_FDTLIB src += Glob('nor_boot_no_fitimage.c') if GetDepend('AIC_BOOTLOADER_CMD_NAND_BOOT'): src += Glob('nand_boot.c') -if GetDepend('AIC_BOOTLOADER_CMD_MMC_BOOT'): +if GetDepend('AIC_BOOTLOADER_CMD_MMC_BOOT') and GetDepend('LPKG_USING_FDTLIB'): src += Glob('mmc_boot.c') +if GetDepend('AIC_BOOTLOADER_CMD_MMC_BOOT') and not GetDepend('LPKG_USING_FDTLIB'): + src += Glob('mmc_boot_no_fitimage.c') if GetDepend('AIC_BOOTLOADER_CMD_PSRAM_TEST'): src += Glob('psram_test.c') if GetDepend('AIC_BOOTLOADER_CMD_XIP_BOOT'): diff --git a/application/baremetal/bootloader/cmd/mmc_boot.c b/application/baremetal/bootloader/cmd/mmc_boot.c index 1f0fe722..b42b0ea7 100644 --- a/application/baremetal/bootloader/cmd/mmc_boot.c +++ b/application/baremetal/bootloader/cmd/mmc_boot.c @@ -17,6 +17,7 @@ #include #include #include +#include "fitimage.h" #define APPLICATION_PART "os" #define MMC_BOOT_CONTROL_ID 0 @@ -24,12 +25,10 @@ static int do_mmc_boot(int argc, char *argv[]) { int ret = 0, mmc_id = MMC_BOOT_CONTROL_ID; - struct image_header *head = NULL; struct aic_sdmc *host = NULL; struct aic_partition *part = NULL, *parts = NULL; - void *la; - u64 blkstart, blkcnt; - u32 start_us; + struct spl_load_info info; + ulong entry_point; ret = mmc_init(mmc_id); if (ret) { @@ -62,39 +61,20 @@ static int do_mmc_boot(int argc, char *argv[]) goto out; } - head = malloc(MMC_BLOCK_SIZE); - blkstart = part->start / MMC_BLOCK_SIZE; - ret = mmc_bread(host, blkstart, 1, (void *)head); - if (ret < 0) { - printf("Read image header failed.\n"); + info.dev = (void *)host; + info.priv = (void *)part; + info.dev_type = DEVICE_MMC; + info.bl_len = MMC_BLOCK_SIZE; + + ret = spl_load_simple_fit(&info, &entry_point); + if (ret < 0) goto out; - } - ret = image_verify_magic((void *)head, AIC_IMAGE_MAGIC); - if (ret) { - printf("Application header is unknown.\n"); - goto out; - } - - la = (void *)(unsigned long)head->load_address; - - start_us = aic_get_time_us(); - blkcnt = ROUNDUP(head->image_len, MMC_BLOCK_SIZE) / MMC_BLOCK_SIZE; - ret = mmc_bread(host, blkstart, blkcnt, la); - show_speed("mmc read speed", head->image_len, aic_get_time_us() - start_us); - - if (ret < 0) { - printf("Read image failed.\n"); - goto out; - } - - boot_app(la); + boot_app((void *)entry_point); out: if (parts) mmc_free_partition(parts); - if (head) - free(head); return ret; } diff --git a/application/baremetal/bootloader/cmd/mmc_boot_no_fitimage.c b/application/baremetal/bootloader/cmd/mmc_boot_no_fitimage.c new file mode 100644 index 00000000..1f0fe722 --- /dev/null +++ b/application/baremetal/bootloader/cmd/mmc_boot_no_fitimage.c @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2023, Artinchip Technology Co., Ltd + * + * SPDX-License-Identifier: Apache-2.0 + * + * Wu Dehuang + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define APPLICATION_PART "os" +#define MMC_BOOT_CONTROL_ID 0 + +static int do_mmc_boot(int argc, char *argv[]) +{ + int ret = 0, mmc_id = MMC_BOOT_CONTROL_ID; + struct image_header *head = NULL; + struct aic_sdmc *host = NULL; + struct aic_partition *part = NULL, *parts = NULL; + void *la; + u64 blkstart, blkcnt; + u32 start_us; + + ret = mmc_init(mmc_id); + if (ret) { + printf("sdmc %d init failed.\n", mmc_id); + return ret; + } + + host = find_mmc_dev_by_index(mmc_id); + if (!host) { + pr_err("find mmc dev failed.\n"); + return -1; + } + + parts = mmc_create_gpt_part(); + if (!parts) { + pr_err("sdmc %d create gpt part failed.\n", mmc_id); + goto out; + } + + part = parts; + while (part) { + if (!strcmp(part->name, APPLICATION_PART)) + break; + + part = part->next; + } + + if (!part) { + printf("Failed to get application partition.\n"); + goto out; + } + + head = malloc(MMC_BLOCK_SIZE); + blkstart = part->start / MMC_BLOCK_SIZE; + ret = mmc_bread(host, blkstart, 1, (void *)head); + if (ret < 0) { + printf("Read image header failed.\n"); + goto out; + } + + ret = image_verify_magic((void *)head, AIC_IMAGE_MAGIC); + if (ret) { + printf("Application header is unknown.\n"); + goto out; + } + + la = (void *)(unsigned long)head->load_address; + + start_us = aic_get_time_us(); + blkcnt = ROUNDUP(head->image_len, MMC_BLOCK_SIZE) / MMC_BLOCK_SIZE; + ret = mmc_bread(host, blkstart, blkcnt, la); + show_speed("mmc read speed", head->image_len, aic_get_time_us() - start_us); + + if (ret < 0) { + printf("Read image failed.\n"); + goto out; + } + + boot_app(la); + +out: + if (parts) + mmc_free_partition(parts); + if (head) + free(head); + return ret; +} + +CONSOLE_CMD(mmc_boot, do_mmc_boot, "Boot from eMMC/SD."); diff --git a/application/baremetal/bootloader/include/fitimage.h b/application/baremetal/bootloader/include/fitimage.h index 9534a9d8..1b2b141f 100644 --- a/application/baremetal/bootloader/include/fitimage.h +++ b/application/baremetal/bootloader/include/fitimage.h @@ -17,6 +17,13 @@ struct spl_fit_info { int conf_node; /* FDT offset to selected configuration node */ }; +typedef enum +{ + DEVICE_MMC, + DEVICE_SPINAND, + DEVICE_SPINOR, +} boot_dev_type; + /** * Information required to load data from a device * @@ -27,6 +34,7 @@ struct spl_fit_info { struct spl_load_info { void *dev; void *priv; + boot_dev_type dev_type; int bl_len; }; diff --git a/application/baremetal/bootloader/lib/fitimage/fitimage.c b/application/baremetal/bootloader/lib/fitimage/fitimage.c index 24e67b65..0a6d8172 100644 --- a/application/baremetal/bootloader/lib/fitimage/fitimage.c +++ b/application/baremetal/bootloader/lib/fitimage/fitimage.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -105,10 +106,8 @@ int spl_fit_get_image_name(const struct spl_fit_info *ctx, } } - if (!found) { - printf("no string for index %d\n", index); + if (!found) return -1; - } *outname = str; return 0; @@ -238,15 +237,42 @@ int fit_image_get_entry(const void *fit, int noffset, ulong *entry) return fit_image_get_address(fit, noffset, FIT_ENTRY_PROP, entry); } +static int spl_read(struct spl_load_info *info, ulong offset, void *buf, int size) +{ + int rdlen = 0; + + if (info->dev_type == DEVICE_SPINAND || info->dev_type == DEVICE_SPINOR) { +#if defined(AIC_MTD_BARE_DRV) + struct mtd_dev *mtd = (struct mtd_dev *)info->dev; + + rdlen = mtd_read(mtd, offset, buf, size); +#endif + } else if (info->dev_type == DEVICE_MMC) { +#if defined(AIC_SDMC_DRV) + int blkcnt, blkstart, blkoffset, byte_offset; + struct aic_sdmc *host = (struct aic_sdmc *)info->dev; + struct aic_partition *part = (struct aic_partition *)info->priv; + + blkstart = part->start / info->bl_len; + blkoffset = offset / info->bl_len; + byte_offset = offset % info->bl_len; + blkcnt = ALIGN_UP(size, info->bl_len) / info->bl_len; + blkcnt = mmc_bread(host, blkstart + blkoffset, blkcnt, (u8 *)(buf - byte_offset)); + rdlen = info->bl_len * blkcnt; + rdlen = min(rdlen, size); +#endif + } + + return rdlen; +} + int spl_load_fit_image(struct spl_load_info *info, struct spl_fit_info *ctx, int node, ulong *entry_point) { ulong load_addr = 0; unsigned int length; int ret, offset = 0; - int start_offset, overhead, read_length; const void *fit = ctx->fit; bool external_data = false; - struct mtd_dev *mtd = (struct mtd_dev *)info->dev; u64 start_us; if (fit_image_get_load(fit, node, &load_addr)) @@ -270,17 +296,19 @@ int spl_load_fit_image(struct spl_load_info *info, struct spl_fit_info *ctx, int if (fit_image_get_data_size(fit, node, &length)) return -1; - start_offset = ALIGN_DOWN(offset, info->bl_len); - overhead = offset - start_offset; - read_length = ALIGN_UP(offset + length, info->bl_len) - start_offset; - start_us = aic_get_time_us(); - ret = mtd_read(mtd, start_offset, (u8 *)(load_addr - overhead), read_length); - show_speed("mtd read", read_length, aic_get_time_us() - start_us); + ret = spl_read(info, offset, (u8 *)load_addr, length); + show_speed("spl read", length, aic_get_time_us() - start_us); + +#ifdef CRC32_MTD_READ + unsigned int crc32_val = crc32(0, NULL, 0); + crc32_val = crc32(crc32_val, (u8 *)load_addr, length); + printf("mtd read crc32 = 0x%x KB/s\n", crc32_val); +#endif if (ret < 0) { - printf("mtd read external_data error\n"); + printf("spl read external_data error\n"); return -1; } } @@ -304,37 +332,51 @@ int spl_load_fit_image(struct spl_load_info *info, struct spl_fit_info *ctx, int int spl_load_simple_fit(struct spl_load_info *info, ulong *entry_point) { - struct fdt_header header; + struct fdt_header *header; struct spl_fit_info ctx; void *buf = NULL; - int size, ret = 0; + int size, buf_size, ret = 0; int index = 0, node = -1; - struct mtd_dev *mtd = (struct mtd_dev *)info->dev; - ret = mtd_read(mtd, 0, (void *)&header, sizeof(header)); + header = aicos_malloc(MEM_DEFAULT, + ALIGN_UP(sizeof(struct fdt_header), info->bl_len)); + if (!header) + { + printf("No space to malloc for header\n"); + return -1; + } + + /* read itb tree header, to parse itb tree totalsize */ + ret = spl_read(info, 0, (void *)header, sizeof(struct fdt_header)); if (ret < 0) { - printf("mtd read header error\n"); - return -1; + printf("spl read header error\n"); + goto __exit_header; } - if (fdt_magic(&header) != FDT_MAGIC) + if (fdt_magic(header) != FDT_MAGIC) { printf("Not found FIT\n"); - return -1; + goto __exit_header; } - size = FIT_ALIGN(fdt_totalsize(&header), 4); + size = FIT_ALIGN(fdt_totalsize(header), 4); ctx.ext_data_offset = size; + if (info->dev_type == DEVICE_MMC) { + buf_size = ROUNDUP(size, info->bl_len); + size = buf_size; + } + buf = aicos_malloc(MEM_DEFAULT, size); if (!buf) { printf("No space to malloc for itb\n"); - return -1; + goto __exit_header; } - ret = mtd_read(mtd, 0, buf, size); + /* read itb tree */ + ret = spl_read(info, 0, buf, size); if (ret < 0) { printf("mtd read itb error\n"); @@ -381,5 +423,7 @@ int spl_load_simple_fit(struct spl_load_info *info, ulong *entry_point) __exit: aicos_free(MEM_DEFAULT, buf); +__exit_header: + aicos_free(MEM_DEFAULT, header); return ret; } diff --git a/target/configs/d21x_demo88-mmc_baremetal_bootloader_defconfig b/target/configs/d21x_demo88-mmc_baremetal_bootloader_defconfig index 7eb707e1..6376fe88 100644 --- a/target/configs/d21x_demo88-mmc_baremetal_bootloader_defconfig +++ b/target/configs/d21x_demo88-mmc_baremetal_bootloader_defconfig @@ -87,10 +87,6 @@ CONFIG_AIC_SDMC_DRV_VER="10" # Board options # -# -# Peripheral Devices: -# - # # Interface Related: # @@ -126,6 +122,9 @@ CONFIG_AIC_DEV_UART0_RX_MODE=0 # CONFIG_AIC_USING_PWM1 is not set # CONFIG_AIC_USING_PWM2 is not set # CONFIG_AIC_USING_PWM3 is not set +# CONFIG_AIC_USING_HRTIMER0 is not set +# CONFIG_AIC_USING_HRTIMER1 is not set +# CONFIG_AIC_USING_HRTIMER2 is not set # CONFIG_AIC_USING_CAN0 is not set # CONFIG_AIC_USING_CAN1 is not set # CONFIG_AIC_USING_CIR is not set @@ -155,6 +154,7 @@ CONFIG_AIC_SDMC0_SMP_PHASE=0 # # SDMC1 Parameter # +# CONFIG_AIC_SD_USING_HOTPLUG is not set # CONFIG_AIC_SDMC1_IS_SDIO is not set CONFIG_AIC_SDMC1_DRV_PHASE=3 CONFIG_AIC_SDMC1_SMP_PHASE=0 @@ -179,11 +179,6 @@ CONFIG_AIC_SDMC1_SMP_PHASE=0 # # CONFIG_AIC_USING_DE is not set # CONFIG_AIC_USING_GE is not set - -# -# Graphics Engine Parameter -# -CONFIG_AIC_GE_DITHER=y # CONFIG_AIC_USING_VE is not set # CONFIG_AIC_USING_DVP is not set @@ -218,6 +213,19 @@ CONFIG_AIC_DRAM_CMA_SIZE=0x0 # # Clocks Options # +CONFIG_AIC_CLK_PLL_INT0_FREQ=600000000 +CONFIG_AIC_CLK_PLL_INT1_FREQ=1200000000 +CONFIG_AIC_CLK_PLL_FRA1_FREQ=491520000 +CONFIG_AIC_CLK_PLL_FRA2_FREQ=840000000 +# CONFIG_AIC_CLK_PLL_FRA2_SSC_DIS is not set +CONFIG_AIC_CLK_CPU_FREQ=600000000 +CONFIG_AIC_CLK_AXI0_FREQ=240000000 +CONFIG_AIC_CLK_AHB0_FREQ=240000000 +CONFIG_AIC_CLK_APB0_FREQ=100000000 +# CONFIG_AIC_USING_CLK_OUT0 is not set +# CONFIG_AIC_USING_CLK_OUT1 is not set +# CONFIG_AIC_USING_CLK_OUT2 is not set +# CONFIG_AIC_USING_CLK_OUT3 is not set # CONFIG_AIC_USING_PM is not set # @@ -228,6 +236,18 @@ CONFIG_AIC_DRAM_CMA_SIZE=0x0 # CONFIG_AIC_USING_CE is not set # CONFIG_AIC_USING_MTOP is not set +# +# Baremetal options +# +CONFIG_KERNEL_BAREMETAL=y +CONFIG_DRIVER_HAL_EN=y +CONFIG_DRIVER_BARE_DRV_EN=y +CONFIG_AIC_NORMALSTACK_SIZE=8092 +CONFIG_ARCH_RISCV=y +CONFIG_ARCH_RISCV_FPU=y +CONFIG_ARCH_RISCV_FPU_D=y +CONFIG_ARCH_RISCV64=y + # # Bootloader options # @@ -245,6 +265,7 @@ CONFIG_AIC_BOOTLOADER_MMC_SUPPORT=y # CONFIG_AIC_BOOTLOADER_SPINOR_SUPPORT is not set # CONFIG_AIC_BOOTLOADER_SPINAND_SUPPORT is not set # CONFIG_AIC_BOOTLOADER_PSRAM_EN is not set +# CONFIG_AIC_BOOTLOADER_AXICFG_SUPPORT is not set CONFIG_AIC_BOOT_USB_DRV=y # CONFIG_AIC_BOOT_USBH_DRV is not set # CONFIG_AIC_BOOTLOADER_UDISK_SUPPORT is not set @@ -257,7 +278,6 @@ CONFIG_AIC_BOOTLOADER_FATFS_SUPPORT=y # # Upgrading # -CONFIG_AIC_BOOTLOADER_UPGBOOT_PIN="PA.0" CONFIG_AICUPG_UART_ENABLE=y CONFIG_AICUPG_USB_ENABLE=y # CONFIG_AICUPG_USB_DMA_ENABLE is not set @@ -277,26 +297,9 @@ CONFIG_AIC_BOOTLOADER_CMD_MEM=y # Debug # # CONFIG_AICUPG_DEBUG is not set +# CONFIG_AICUPG_UART_DEBUG is not set # CONFIG_AIC_SHOW_BOOT_TIME is not set -# -# Baremetal options -# -CONFIG_KERNEL_BAREMETAL=y -CONFIG_DRIVER_HAL_EN=y -CONFIG_DRIVER_BARE_DRV_EN=y -CONFIG_AIC_NORMALSTACK_SIZE=8092 -CONFIG_ARCH_RISCV=y -CONFIG_ARCH_RISCV_FPU=y -CONFIG_ARCH_RISCV_FPU_D=y -CONFIG_ARCH_RISCV64=y -# CONFIG_AIC_BAREMETAL_LOG_NONE is not set -# CONFIG_AIC_BAREMETAL_LOG_ERR is not set -CONFIG_AIC_BAREMETAL_LOG_WARN=y -# CONFIG_AIC_BAREMETAL_LOG_INFO is not set -# CONFIG_AIC_BAREMETAL_LOG_DEBUG is not set -CONFIG_AIC_BAREMETAL_LOG_LEVEL=4 - # # Local packages options # @@ -309,6 +312,8 @@ CONFIG_AIC_BAREMETAL_LOG_LEVEL=4 # CONFIG_LPKG_USING_CHERRYUSB is not set # CONFIG_LPKG_USING_LVGL is not set # CONFIG_LPKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_LPKG_USING_AWTK is not set +# CONFIG_AIC_TOUCH_PANEL_GT911 is not set # CONFIG_LPKG_USING_LWIP is not set # CONFIG_LPKG_USING_DFS_UFFS is not set # CONFIG_LPKG_USING_LITTLEFS is not set @@ -325,13 +330,22 @@ CONFIG_AIC_BAREMETAL_LOG_LEVEL=4 # CONFIG_LPKG_USING_I2C_TOOLS is not set # CONFIG_LPKG_USING_BEEP is not set # CONFIG_LPKG_USING_MEMLEAK_CHECK is not set +# CONFIG_LPKG_USING_WEBCLIENT is not set +# CONFIG_LPKG_USING_OTA_DOWNLOADER is not set +# CONFIG_LPKG_USING_RPMSG_LITE is not set +# CONFIG_LPKG_RPMSG_LITE_CUSTOM_CONFIG is not set +# CONFIG_LPKG_USING_FREETYPE is not set # CONFIG_LPKG_USING_DFS is not set # CONFIG_LPKG_USING_MAD is not set +CONFIG_LPKG_USING_FDTLIB=y # # ArtInChip packages options # # CONFIG_LPKG_MPP is not set +CONFIG_LPKG_USING_ENV=y +# CONFIG_AIC_ENV_INTERFACE is not set +# CONFIG_LPKG_USING_PINMUX_CHECHK is not set # # Drivers options @@ -356,7 +370,22 @@ CONFIG_AIC_UMM_HEAP_BARE_DRV=y # Peripheral # CONFIG_LPKG_USING_SPINAND=y +# CONFIG_SPI_NAND_DOSILICON is not set +# CONFIG_SPI_NAND_ETRON is not set +# CONFIG_SPI_NAND_MICRON is not set +# CONFIG_SPI_NAND_MACRONIX is not set +CONFIG_SPI_NAND_WINBOND=y +# CONFIG_SPI_NAND_GIGADEVICE is not set +# CONFIG_SPI_NAND_TOSHIBA is not set +# CONFIG_SPI_NAND_FORESEE is not set +# CONFIG_SPI_NAND_XTX is not set +# CONFIG_SPI_NAND_ZETTA is not set +# CONFIG_SPI_NAND_ZBIT is not set +# CONFIG_SPI_NAND_ESMT is not set +# CONFIG_SPI_NAND_UMTEK is not set +# CONFIG_SPI_NAND_QUANXING is not set # CONFIG_LPKG_USING_SFUD is not set +# CONFIG_AIC_NFTL_SUPPORT is not set CONFIG_AIC_WIRELESS_LAN=y CONFIG_WLAN_REALTEK=y # CONFIG_RTL8733_WLAN_DRV is not set @@ -370,7 +399,6 @@ CONFIG_WLAN_REALTEK=y # # Gt911 touch panel options # -# CONFIG_AIC_TOUCH_PANEL_GT911 is not set # # External Audio Codec Support @@ -380,6 +408,12 @@ CONFIG_WLAN_REALTEK=y # # Drivers debug # +# CONFIG_AIC_LOG_LEVEL_NONE is not set +# CONFIG_AIC_LOG_LEVEL_ERR is not set +CONFIG_AIC_LOG_LEVEL_WARN=y +# CONFIG_AIC_LOG_LEVEL_INFO is not set +# CONFIG_AIC_LOG_LEVEL_DEBUG is not set +CONFIG_AIC_LOG_LEVEL=4 # CONFIG_AIC_CMU_DRV_DEBUG is not set # CONFIG_AIC_GPIO_DRV_DEBUG is not set # CONFIG_AIC_DMA_DRV_DEBUG is not set @@ -396,4 +430,5 @@ CONFIG_WLAN_REALTEK=y # CONFIG_AIC_RTC_DRV_TEST is not set CONFIG_AIC_SDMC_DRV_TEST=y # CONFIG_AIC_FILE_CRC32_TEST is not set +# CONFIG_AIC_MTD_LOAD_FILE_TEST is not set # CONFIG_AIC_WDT_DRV_TEST is not set diff --git a/target/configs/d21x_demo88-mmc_rt-thread_helloworld_defconfig b/target/configs/d21x_demo88-mmc_rt-thread_helloworld_defconfig index 68c8b9b3..d9d45ab7 100644 --- a/target/configs/d21x_demo88-mmc_rt-thread_helloworld_defconfig +++ b/target/configs/d21x_demo88-mmc_rt-thread_helloworld_defconfig @@ -65,10 +65,7 @@ CONFIG_AIC_UART_DRV=y CONFIG_AIC_UART_DRV_V10=y CONFIG_AIC_UART_DRV_VER="10" CONFIG_AIC_UART_DEV_NUM=8 -CONFIG_AIC_I2C_DRV=y -CONFIG_AIC_I2C_DRV_V10=y -CONFIG_AIC_I2C_DRV_VER="10" -CONFIG_AIC_I2C_CH_NUM=4 +# CONFIG_AIC_I2C_DRV is not set CONFIG_AIC_QSPI_DRV=y CONFIG_AIC_QSPI_DRV_V10=y CONFIG_AIC_QSPI_DRV_VER="10" @@ -103,7 +100,9 @@ CONFIG_AIC_VE_DRV_VER="10" CONFIG_AIC_ADCIM_DRV=y CONFIG_AIC_ADCIM_DRV_V10=y CONFIG_AIC_ADCIM_DRV_VER="10" -# CONFIG_AIC_RTP_DRV is not set +CONFIG_AIC_RTP_DRV=y +CONFIG_AIC_RTP_DRV_V10=y +CONFIG_AIC_RTP_DRV_VER="10" CONFIG_AIC_TSEN_DRV=y CONFIG_AIC_TSEN_DRV_V10=y CONFIG_AIC_TSEN_DRV_VER="10" @@ -176,13 +175,7 @@ CONFIG_AIC_DEV_UART1_MODE=0 # CONFIG_AIC_USING_I2C0 is not set # CONFIG_AIC_USING_I2C1 is not set # CONFIG_AIC_USING_I2C2 is not set -CONFIG_AIC_USING_I2C3=y - -# -# I2c3 Parameter -# -CONFIG_AIC_DEV_I2C3_MASTER=y -# CONFIG_AIC_DEV_I2C3_SLAVE is not set +# CONFIG_AIC_USING_I2C3 is not set # CONFIG_AIC_USING_PWM0 is not set # CONFIG_AIC_USING_PWM1 is not set # CONFIG_AIC_USING_PWM2 is not set @@ -236,7 +229,17 @@ CONFIG_AIC_SDMC1_SMP_PHASE=0 # # Analog Related: # -# CONFIG_AIC_USING_RTP is not set +CONFIG_AIC_USING_RTP=y + +# +# RTP parameter +# +CONFIG_AIC_RTP_PERIOD_MS=15 +CONFIG_AIC_RTP_MAX_PRESSURE=800 +CONFIG_AIC_RTP_X_PLATE=235 +CONFIG_AIC_RTP_Y_PLATE=0 +CONFIG_AIC_RTP_PDEB=0xffffffff +CONFIG_AIC_RTP_DELAY=0x4f00004f CONFIG_AIC_USING_TSEN=y # CONFIG_AIC_USING_GPAI0 is not set # CONFIG_AIC_USING_GPAI1 is not set @@ -343,20 +346,7 @@ CONFIG_AIC_USING_VE=y # Camera Support # # CONFIG_AIC_USING_CAMERA is not set -CONFIG_AIC_USING_AUDIO=y - -# -# Audio Parameter -# -CONFIG_AIC_AUDIO_PLAYBACK=y -CONFIG_AIC_AUDIO_PA_ENABLE_GPIO="PA.7" -CONFIG_AIC_AUDIO_EN_PIN_HIGH=y -# CONFIG_AIC_AUDIO_EN_PIN_LOW is not set -# CONFIG_AIC_AUDIO_SPK_0 is not set -CONFIG_AIC_AUDIO_SPK_1=y -# CONFIG_AIC_AUDIO_SPK_0_1 is not set -CONFIG_AIC_AUDIO_DMIC=y -# CONFIG_AIC_AUDIO_AMIC is not set +# CONFIG_AIC_USING_AUDIO is not set # # System Related: @@ -518,6 +508,7 @@ CONFIG_RT_USING_FINSH=y CONFIG_FINSH_USING_MSH=y CONFIG_FINSH_THREAD_NAME="tshell" CONFIG_FINSH_PROMPT_NAME="aic" +# CONFIG_FINSH_POLL_MODE is not set CONFIG_FINSH_THREAD_PRIORITY=20 CONFIG_FINSH_THREAD_STACK_SIZE=4096 CONFIG_FINSH_USING_HISTORY=y @@ -625,7 +616,7 @@ CONFIG_RT_AUDIO_RECORD_PIPE_SIZE=2048 CONFIG_RT_USING_SENSOR=y CONFIG_RT_USING_SENSOR_CMD=y CONFIG_RT_USING_TOUCH=y -CONFIG_RT_TOUCH_PIN_IRQ=y +# CONFIG_RT_TOUCH_PIN_IRQ is not set CONFIG_RT_USING_HWCRYPTO=y CONFIG_RT_HWCRYPTO_DEFAULT_NAME="hwcryto" CONFIG_RT_HWCRYPTO_IV_MAX_SIZE=16 @@ -1326,7 +1317,7 @@ CONFIG_LPKG_LVGL_DISP_REFR_PERIOD=5 # CONFIG_LPKG_LVGL_USING_DEMOS is not set # CONFIG_LPKG_USING_LV_MUSIC_DEMO is not set # CONFIG_LPKG_USING_AWTK is not set -CONFIG_AIC_TOUCH_PANEL_GT911=y +# CONFIG_AIC_TOUCH_PANEL_GT911 is not set # CONFIG_LPKG_USING_LWIP is not set CONFIG_LPKG_USING_DFS_UFFS=y CONFIG_LPKG_UFFS_PATH="/packages/third-party/uffs" @@ -1354,8 +1345,6 @@ CONFIG_LPKG_UFFS_VER="latest" # CONFIG_LPKG_USING_MEMLEAK_CHECK is not set # CONFIG_LPKG_USING_WEBCLIENT is not set # CONFIG_LPKG_USING_OTA_DOWNLOADER is not set -# CONFIG_LPKG_USING_RPMSG_LITE is not set -# CONFIG_LPKG_RPMSG_LITE_CUSTOM_CONFIG is not set # CONFIG_LPKG_USING_FREETYPE is not set # CONFIG_LPKG_USING_DFS is not set CONFIG_LPKG_USING_MAD=y @@ -1407,6 +1396,7 @@ CONFIG_SPI_NAND_WINBOND=y # CONFIG_SPI_NAND_UMTEK is not set # CONFIG_SPI_NAND_QUANXING is not set # CONFIG_LPKG_USING_SFUD is not set +# CONFIG_AIC_NFTL_SUPPORT is not set # CONFIG_AIC_WIRELESS_LAN is not set # @@ -1416,9 +1406,6 @@ CONFIG_SPI_NAND_WINBOND=y # # Gt911 touch panel options # -CONFIG_AIC_TOUCH_PANEL_GT911_I2C_CHA="i2c3" -CONFIG_AIC_TOUCH_PANEL_GT911_RST_PIN="PA.8" -CONFIG_AIC_TOUCH_PANEL_GT911_INT_PIN="PA.9" # # External Audio Codec Support @@ -1432,7 +1419,6 @@ CONFIG_AIC_TOUCH_PANEL_GT911_INT_PIN="PA.9" # CONFIG_AIC_GPIO_DRV_DEBUG is not set # CONFIG_AIC_DMA_DRV_DEBUG is not set # CONFIG_AIC_UART_DRV_DEBUG is not set -# CONFIG_AIC_I2C_DRV_DEBUG is not set # CONFIG_AIC_RTC_DRV_DEBUG is not set # CONFIG_AIC_QSPI_DRV_DEBUG is not set # CONFIG_AIC_FB_DRV_DEBUG is not set @@ -1453,10 +1439,9 @@ CONFIG_AIC_RTC_DRV_TEST=y # CONFIG_AIC_VE_TEST is not set # CONFIG_AIC_CAN_DRV_TEST is not set # CONFIG_AIC_AUDIO_DRV_TEST is not set -# CONFIG_AIC_I2C_DRV_TEST is not set -# CONFIG_AIC_TP_DRV_TEST is not set # CONFIG_AIC_WDT_DRV_TEST is not set # CONFIG_AIC_GPAI_TEST is not set # CONFIG_AIC_TSEN_TEST is not set # CONFIG_AIC_ZLIB_TEST is not set +CONFIG_AIC_RTP_TEST=y # CONFIG_AIC_SID_BARE_TEST is not set diff --git a/target/d21x/demo88-mmc/pack/bootloader.bin b/target/d21x/demo88-mmc/pack/bootloader.bin index f4953e8b58f5e90674075aed0196a7adf5709c37..f04e05480c802865e872e7aca8be23ab653d5040 100644 GIT binary patch delta 34249 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 z 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 delta 27400 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 RD71!m7jTK