补充
authorP15692025051 <846603105@qq.com>
Fri, 30 Jan 2026 11:49:15 +0000 (19:49 +0800)
committerP15692025051 <846603105@qq.com>
Fri, 30 Jan 2026 11:49:15 +0000 (19:49 +0800)
2.sdk/sdk/product/craneg_modem/config/watch/lv_conf.h
2.sdk/sdk/product/craneg_modem/lv_gui_main.c

index 6034b4c..c78b103 100644 (file)
-/**
- * @file lv_conf.h
- *
- */
-
-/*
- * COPY THIS FILE AS `lv_conf.h` NEXT TO the `lvgl` FOLDER
- */
-
-#if 1 /*Set it to "1" to enable content*/
-
-#ifndef LV_CONF_H
-#define LV_CONF_H
-/* clang-format off */
-
-#include <stdint.h>
-
-#if 1 // @CHENG_MODIFY
-#include "lv_conf_CUSTOM.h"
-#endif
-
-/*====================
-   Graphical settings
- *====================*/
-//#define USE_LV_WATCH_UI_360_360 0
-//#define USE_LV_WATCH_UI_240_320 0 // 1
-//#define USE_LV_WATCH_UI_240_280 1
-
-/* Maximal horizontal and vertical resolution to support by the library.*/
-#if USE_LV_WATCH_UI_360_360
-#define LV_HOR_RES_MAX          (360)
-#define LV_VER_RES_MAX          (360)
-#elif USE_LV_WATCH_UI_240_320
-#define LV_HOR_RES_MAX          (240)
-#define LV_VER_RES_MAX          (320)
-#elif USE_LV_WATCH_UI_240_280
-#define LV_HOR_RES_MAX          (240)
-#define LV_VER_RES_MAX          (280)
-#elif USE_LV_WATCH_UI_466_466
-#define LV_HOR_RES_MAX          (466)
-#define LV_VER_RES_MAX          (466)
-#else // USE_LV_WATCH_UI_240_240
-#define LV_HOR_RES_MAX          (240)
-#define LV_VER_RES_MAX          (240)
-#endif
-/* Horizontal and vertical resolution of the library.*/
-#define LV_HOR_RES          (LV_HOR_RES_MAX)
-#define LV_VER_RES          (LV_VER_RES_MAX)
-
-/* Color depth:
- * - 1:  1 byte per pixel
- * - 8:  RGB233
- * - 16: RGB565
- * - 32: ARGB8888
- */
-#define LV_COLOR_DEPTH     16
-
-/* Swap the 2 bytes of RGB565 color.
- * Useful if the display has a 8 bit interface (e.g. SPI)*/
-#define LV_COLOR_16_SWAP   0
-
-/* 1: Enable screen transparency.
- * Useful for OSD or other overlapping GUIs.
- * Requires `LV_COLOR_DEPTH = 32` colors and the screen's style should be modified: `style.body.opa = ...`*/
-#define LV_COLOR_SCREEN_TRANSP    0
-
-/*Images pixels with this color will not be drawn (with chroma keying)*/
-#define LV_COLOR_TRANSP    LV_COLOR_LIME         /*LV_COLOR_LIME: pure green*/
-
-/* Enable anti-aliasing (lines, and radiuses will be smoothed) */
-#define LV_ANTIALIAS        1
-
-/* Default display refresh period.
- * Can be changed in the display driver (`lv_disp_drv_t`).*/
-#define LV_DISP_DEF_REFR_PERIOD      15      /*[ms]*/
-
-/* Dot Per Inch: used to initialize default sizes.
- * E.g. a button with width = LV_DPI / 2 -> half inch wide
- * (Not so important, you can adjust it to modify default sizes and spaces)*/
-#define LV_DPI              100     /*[px]*/
-
-/* The the real width of the display changes some default values:
- * default object sizes, layout of examples, etc.
- * According to the width of the display (hor. res. / dpi)
- * the displays fall in 4 categories.
- * The 4th is extra large which has no upper limit so not listed here
- * The upper limit of the categories are set below in 0.1 inch unit.
- */
-#define LV_DISP_SMALL_LIMIT  30
-#define LV_DISP_MEDIUM_LIMIT 50
-#define LV_DISP_LARGE_LIMIT  70
-
-/* Type of coordinates. Should be `int16_t` (or `int32_t` for extreme cases) */
-typedef int16_t lv_coord_t;
-
-/*=========================
-   Memory manager settings
- *=========================*/
-
-/* LittelvGL's internal memory manager's settings.
- * The graphical objects and other related data are stored here. */
-
-/* 1: use custom malloc/free, 0: use the built-in `lv_mem_alloc` and `lv_mem_free` */
-#define LV_MEM_CUSTOM      1
-#if LV_MEM_CUSTOM == 0
-/* Size of the memory used by `lv_mem_alloc` in bytes (>= 2kB)*/
-#  define LV_MEM_SIZE    (2 * 1024U * 1024U)
-
-/* Complier prefix for a big array declaration */
-#  define LV_MEM_ATTR
-
-/* Set an address for the memory pool instead of allocating it as an array.
- * Can be in external SRAM too. */
-#  define LV_MEM_ADR          0
-
-/* Automatically defrag. on free. Defrag. means joining the adjacent free cells. */
-#  define LV_MEM_AUTO_DEFRAG  1
-#else       /*LV_MEM_CUSTOM*/
-#  define LV_MEM_CUSTOM_INCLUDE <stdlib.h>   /*Header for the dynamic memory function*/
-#  define LV_MEM_CUSTOM_ALLOC   malloc       /*Wrapper to malloc*/
-#  define LV_MEM_CUSTOM_FREE    free         /*Wrapper to free*/
-#  define LV_MEM_USE_MALLOC_DEFINE           /*define lv_mem_alloc to malloc*/
-#  include <stdlib.h>
-#endif     /*LV_MEM_CUSTOM*/
-
-/* Use the standard memcpy and memset instead of LVGL's own functions.
- * The standard functions might or might not be faster depending on their implementation. */
-#define LV_MEMCPY_MEMSET_STD    0
-
-#define SDK_MMI_POOL_SIZE (3 * 1024 * 1024)
-
-/* Garbage Collector settings
- * Used if lvgl is binded to higher level language and the memory is managed by that language */
-#define LV_ENABLE_GC 0
-#if LV_ENABLE_GC != 0
-#  define LV_GC_INCLUDE "gc.h"                           /*Include Garbage Collector related things*/
-#  define LV_MEM_CUSTOM_REALLOC   your_realloc           /*Wrapper to realloc*/
-#  define LV_MEM_CUSTOM_GET_SIZE  your_mem_get_size      /*Wrapper to lv_mem_get_size*/
-#endif /* LV_ENABLE_GC */
-
-/*=======================
-   Input device settings
- *=======================*/
-
-/* Input device default settings.
- * Can be changed in the Input device driver (`lv_indev_drv_t`)*/
-
-/* Input device read period in milliseconds */
-#define LV_INDEV_DEF_READ_PERIOD          15
-
-/* Drag threshold in pixels */
-#define LV_INDEV_DEF_DRAG_LIMIT           2
-
-/* Drag throw slow-down in [%]. Greater value -> faster slow-down */
-#define LV_INDEV_DEF_DRAG_THROW           2
-
-/* Long press time in milliseconds.
- * Time to send `LV_EVENT_LONG_PRESSSED`) */
-#define LV_INDEV_DEF_LONG_PRESS_TIME      400
-
-/* Repeated trigger period in long press [ms]
- * Time between `LV_EVENT_LONG_PRESSED_REPEAT */
-#define LV_INDEV_DEF_LONG_PRESS_REP_TIME  100
-
-
-/* Gesture threshold in pixels */
-#define LV_INDEV_DEF_GESTURE_LIMIT        2
-
-/* Gesture min velocity at release before swipe (pixels)*/
-#define LV_INDEV_DEF_GESTURE_MIN_VELOCITY 1
-
-/*==================
- * Feature usage
- *==================*/
-
-/*1: Enable the Animations */
-#define LV_USE_ANIMATION        1
-#if LV_USE_ANIMATION
-
-/*Declare the type of the user data of animations (can be e.g. `void *`, `int`, `struct`)*/
-typedef void * lv_anim_user_data_t;
-
-#endif
-
-/* 1: Enable shadow drawing*/
-#define LV_USE_SHADOW           1
-#if LV_USE_SHADOW
-/* Allow buffering some shadow calculation
- * LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer,
- * where shadow size is `shadow_width + radius`
- * Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost*/
-#define LV_SHADOW_CACHE_SIZE    0
-#endif
-
-/*1: enable outline drawing on rectangles*/
-#define LV_USE_OUTLINE  1
-
-/*1: enable pattern drawing on rectangles*/
-#define LV_USE_PATTERN  1
-
-/*1: enable value string drawing on rectangles*/
-#define LV_USE_VALUE_STR    1
-
-/* 1: Use other blend modes than normal (`LV_BLEND_MODE_...`)*/
-#define LV_USE_BLEND_MODES      1
-
-/* 1: Use the `opa_scale` style property to set the opacity of an object and its children at once*/
-#define LV_USE_OPA_SCALE        1
-
-/* 1: Use image zoom and rotation*/
-#define LV_USE_IMG_TRANSFORM    1
-
-/* 1: Enable object groups (for keyboard/encoder navigation) */
-#define LV_USE_GROUP            1
-#if LV_USE_GROUP
-typedef void * lv_group_user_data_t;
-#endif  /*LV_USE_GROUP*/
-
-/* 1: Enable GPU interface*/
-#define LV_USE_GPU              1   /*Only enables `gpu_fill_cb` and `gpu_blend_cb` in the disp. drv- */
-#define LV_USE_GPU_STM32_DMA2D  0
-
-/*If enabling LV_USE_GPU_STM32_DMA2D, LV_GPU_DMA2D_CMSIS_INCLUDE must be defined to include path of CMSIS header of target processor
-e.g. "stm32f769xx.h" or "stm32f429xx.h" */
-#define LV_GPU_DMA2D_CMSIS_INCLUDE
-
-/*1: Use PXP for CPU off-load on NXP RTxxx platforms */
-#define LV_USE_GPU_NXP_PXP      0
-
-/*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c)
- *   and call lv_gpu_nxp_pxp_init() automatically during lv_init(). Note that symbol FSL_RTOS_FREE_RTOS
- *   has to be defined in order to use FreeRTOS OSA, otherwise bare-metal implementation is selected.
- *0: lv_gpu_nxp_pxp_init() has to be called manually before lv_init()
- * */
-#define LV_USE_GPU_NXP_PXP_AUTO_INIT 0
-
-/*1: Use VG-Lite for CPU offload on NXP RTxxx platforms */
-#define LV_USE_GPU_NXP_VG_LITE   0
-
-/* 1: Enable file system (might be required for images */
-#define LV_USE_FILESYSTEM       1
-#if LV_USE_FILESYSTEM
-/*Declare the type of the user data of file system drivers (can be e.g. `void *`, `int`, `struct`)*/
-typedef void * lv_fs_drv_user_data_t;
-#endif
-
-/*1: Add a `user_data` to drivers and objects*/
-#define LV_USE_USER_DATA        1
-
-/*1: Show CPU usage and FPS count in the right bottom corner*/
-#define LV_USE_PERF_MONITOR     0
-
-/*1: Use the functions and types from the older API if possible */
-#define LV_USE_API_EXTENSION_V6  1
-#define LV_USE_API_EXTENSION_V7  1
-
-/*========================
- * Image decoder and cache
- *========================*/
-
-/* 1: Enable indexed (palette) images */
-#define LV_IMG_CF_INDEXED       1
-
-/* 1: Enable alpha indexed images */
-#define LV_IMG_CF_ALPHA         1
-
-/* Default image cache size. Image caching keeps the images opened.
- * If only the built-in image formats are used there is no real advantage of caching.
- * (I.e. no new image decoder is added)
- * With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images.
- * However the opened images might consume additional RAM.
- * LV_IMG_CACHE_DEF_SIZE must be >= 1 */
-#define LV_IMG_CACHE_DEF_SIZE       20
-
-/*limit cache max mem size, 0 to close this feature */
-#define LV_IMG_CACHE_MEM_SIZE_LIMIT  0//(1024*1024*2)
-
-/*Declare the type of the user data of image decoder (can be e.g. `void *`, `int`, `struct`)*/
-typedef void * lv_img_decoder_user_data_t;
-
-/*=====================
- *  Compiler settings
- *====================*/
-  /* For big endian systems set to 1 */
-#define LV_BIG_ENDIAN_SYSTEM    0
-
-/* Define a custom attribute to `lv_tick_inc` function */
-#define LV_ATTRIBUTE_TICK_INC
-
-/* Define a custom attribute to `lv_task_handler` function */
-#define LV_ATTRIBUTE_TASK_HANDLER
-
-/* Define a custom attribute to `lv_disp_flush_ready` function */
-#define LV_ATTRIBUTE_FLUSH_READY
-
-/* Required alignment size for buffers */
-#define LV_ATTRIBUTE_MEM_ALIGN_SIZE
-
-/* With size optimization (-Os) the compiler might not align data to
- * 4 or 8 byte boundary. Some HW may need even 32 or 64 bytes.
- * This alignment will be explicitly applied where needed.
- * LV_ATTRIBUTE_MEM_ALIGN_SIZE should be used to specify required align size.
- * E.g. __attribute__((aligned(LV_ATTRIBUTE_MEM_ALIGN_SIZE))) */
-#define LV_ATTRIBUTE_MEM_ALIGN
-
-/* Attribute to mark large constant arrays for example
- * font's bitmaps */
-#define LV_ATTRIBUTE_LARGE_CONST
-
-/* Prefix performance critical functions to place them into a faster memory (e.g RAM)
- * Uses 15-20 kB extra memory */
-#define LV_ATTRIBUTE_FAST_MEM
-
-/* Export integer constant to binding.
- * This macro is used with constants in the form of LV_<CONST> that
- * should also appear on lvgl binding API such as Micropython
- *
- * The default value just prevents a GCC warning.
- */
-#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning
-
-/* Prefix variables that are used in GPU accelerated operations, often these need to be
- * placed in RAM sections that are DMA accessible */
-#define LV_ATTRIBUTE_DMA
-
-/*===================
- *  HAL settings
- *==================*/
-
-/* 1: use a custom tick source.
- * It removes the need to manually update the tick with `lv_tick_inc`) */
-#define LV_TICK_CUSTOM     0
-#if LV_TICK_CUSTOM == 1
-#define LV_TICK_CUSTOM_INCLUDE  "something.h"       /*Header for the sys time function*/
-#define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis())     /*Expression evaluating to current systime in ms*/
-#endif   /*LV_TICK_CUSTOM*/
-
-typedef void * lv_disp_drv_user_data_t;             /*Type of user data in the display driver*/
-typedef void * lv_indev_drv_user_data_t;            /*Type of user data in the input device driver*/
-
-/*================
- * Log settings
- *===============*/
-
-/*1: Enable the log module*/
-#define LV_USE_LOG      1//0
-#if LV_USE_LOG
-/* How important log should be added:
- * LV_LOG_LEVEL_TRACE       A lot of logs to give detailed information
- * LV_LOG_LEVEL_INFO        Log important events
- * LV_LOG_LEVEL_WARN        Log if something unwanted happened but didn't cause a problem
- * LV_LOG_LEVEL_ERROR       Only critical issue, when the system may fail
- * LV_LOG_LEVEL_NONE        Do not log anything
- */
-#  define LV_LOG_LEVEL    LV_LOG_LEVEL_WARN
-//#  define LV_LOG_LEVEL    LV_LOG_LEVEL_TRACE //only used for debug
-
-/* 1: Print the log with 'printf';
- * 0: user need to register a callback with `lv_log_register_print_cb`*/
-#  define LV_LOG_PRINTF   1
-#endif  /*LV_USE_LOG*/
-
-/*=================
- * Debug settings
- *================*/
-
-/* If Debug is enabled LittelvGL validates the parameters of the functions.
- * If an invalid parameter is found an error log message is printed and
- * the MCU halts at the error. (`LV_USE_LOG` should be enabled)
- * If you are debugging the MCU you can pause
- * the debugger to see exactly where  the issue is.
- *
- * The behavior of asserts can be overwritten by redefining them here.
- * E.g. #define LV_ASSERT_MEM(p)  <my_assert_code>
- */
-#define LV_USE_DEBUG        1
-#if LV_USE_DEBUG
-
-/*Check if the parameter is NULL. (Quite fast) */
-#define LV_USE_ASSERT_NULL      1
-
-/*Checks is the memory is successfully allocated or no. (Quite fast)*/
-#define LV_USE_ASSERT_MEM       1
-
-/*Check the integrity of `lv_mem` after critical operations. (Slow)*/
-#define LV_USE_ASSERT_MEM_INTEGRITY       0
-
-/* Check the strings.
- * Search for NULL, very long strings, invalid characters, and unnatural repetitions. (Slow)
- * If disabled `LV_USE_ASSERT_NULL` will be performed instead (if it's enabled) */
-#define LV_USE_ASSERT_STR       0
-
-/* Check NULL, the object's type and existence (e.g. not deleted). (Quite slow)
- * If disabled `LV_USE_ASSERT_NULL` will be performed instead (if it's enabled) */
-#define LV_USE_ASSERT_OBJ       0
-
-/*Check if the styles are properly initialized. (Fast)*/
-#define LV_USE_ASSERT_STYLE     1
-
-#endif /*LV_USE_DEBUG*/
-
-/*==================
- *    FONT USAGE
- *===================*/
-
-/* The built-in fonts contains the ASCII range and some Symbols with  4 bit-per-pixel.
- * The symbols are available via `LV_SYMBOL_...` defines
- * More info about fonts: https://docs.lvgl.com/#Fonts
- * To create a new font go to: https://lvgl.com/ttf-font-to-c-array
- */
-
-/* Montserrat fonts with bpp = 4
- * https://fonts.google.com/specimen/Montserrat  */
-#define LV_FONT_MONTSERRAT_8     0
-#define LV_FONT_MONTSERRAT_10    0
-#define LV_FONT_MONTSERRAT_12    1
-#define LV_FONT_MONTSERRAT_14    1
-#define LV_FONT_MONTSERRAT_16    0
-#define LV_FONT_MONTSERRAT_18    0
-#define LV_FONT_MONTSERRAT_20    1
-#define LV_FONT_MONTSERRAT_22    0
-#define LV_FONT_MONTSERRAT_24    1
-#define LV_FONT_MONTSERRAT_26    0
-#define LV_FONT_MONTSERRAT_28    0
-#define LV_FONT_MONTSERRAT_30    0
-#define LV_FONT_MONTSERRAT_32    0
-#define LV_FONT_MONTSERRAT_34    0
-#define LV_FONT_MONTSERRAT_36    0
-#define LV_FONT_MONTSERRAT_38    0
-#define LV_FONT_MONTSERRAT_40    1
-#define LV_FONT_MONTSERRAT_42    0
-#define LV_FONT_MONTSERRAT_44    0
-#define LV_FONT_MONTSERRAT_46    0
-#define LV_FONT_MONTSERRAT_48    0
-
-/* Demonstrate special features */
-#define LV_FONT_MONTSERRAT_12_SUBPX      1
-#define LV_FONT_MONTSERRAT_28_COMPRESSED 1  /*bpp = 3*/
-#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0  /*Hebrew, Arabic, PErisan letters and all their forms*/
-#define LV_FONT_SIMSUN_16_CJK            0  /*1000 most common CJK radicals*/
-
-/*Pixel perfect monospace font
- * http://pelulamu.net/unscii/ */
-#define LV_FONT_UNSCII_8     0
-#define LV_FONT_UNSCII_16    0
-
-/* Optionally declare your custom fonts here.
- * You can use these fonts as default font too
- * and they will be available globally. E.g.
- * #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) \
- *                                LV_FONT_DECLARE(my_font_2)
- */
-#define LV_FONT_CUSTOM_DECLARE
-
-/* Enable it if you have fonts with a lot of characters.
- * The limit depends on the font size, font face and bpp
- * but with > 10,000 characters if you see issues probably you need to enable it.*/
-#define LV_FONT_FMT_TXT_LARGE   0
-
-/* Enables/disables support for compressed fonts. If it's disabled, compressed
- * glyphs cannot be processed by the library and won't be rendered.
- */
-#define LV_USE_FONT_COMPRESSED 1
-
-/* Enable subpixel rendering */
-#define LV_USE_FONT_SUBPX 1
-#if LV_USE_FONT_SUBPX
-/* Set the pixel order of the display.
- * Important only if "subpx fonts" are used.
- * With "normal" font it doesn't matter.
- */
-#define LV_FONT_SUBPX_BGR    0
-#endif
-
-/*Declare the type of the user data of fonts (can be e.g. `void *`, `int`, `struct`)*/
-typedef void * lv_font_user_data_t;
-
-/*================
- *  THEME USAGE
- *================*/
-
-/*Always enable at least on theme*/
-
-/* No theme, you can apply your styles as you need
- * No flags. Set LV_THEME_DEFAULT_FLAG 0 */
- #define LV_USE_THEME_EMPTY       1
-
-/*Simple to the create your theme based on it
- * No flags. Set LV_THEME_DEFAULT_FLAG 0 */
- #define LV_USE_THEME_TEMPLATE    0
-
- /* A fast and impressive theme.
-  * Flags:
-  * LV_THEME_MATERIAL_FLAG_LIGHT: light theme
-  * LV_THEME_MATERIAL_FLAG_DARK: dark theme
-  * LV_THEME_MATERIAL_FLAG_NO_TRANSITION: disable transitions (state change animations)
-  * LV_THEME_MATERIAL_FLAG_NO_FOCUS: disable indication of focused state)
-  * */
- #define LV_USE_THEME_MATERIAL    0
-
-/* Mono-color theme for monochrome displays.
- * If LV_THEME_DEFAULT_COLOR_PRIMARY is LV_COLOR_BLACK the
- * texts and borders will be black and the background will be
- * white. Else the colors are inverted.
- * No flags. Set LV_THEME_DEFAULT_FLAG 0 */
- #define LV_USE_THEME_MONO        0
-
-#define LV_THEME_DEFAULT_INCLUDE            <stdint.h>      /*Include a header for the init. function*/
-#define LV_THEME_DEFAULT_INIT               lv_theme_empty_init
-#define LV_THEME_DEFAULT_COLOR_PRIMARY      LV_COLOR_RED
-#define LV_THEME_DEFAULT_COLOR_SECONDARY    LV_COLOR_BLUE
-#define LV_THEME_DEFAULT_FLAG               0
-#define LV_THEME_DEFAULT_FONT_SMALL         &lv_font_montserrat_20
-#define LV_THEME_DEFAULT_FONT_NORMAL        &lv_font_montserrat_20
-#define LV_THEME_DEFAULT_FONT_SUBTITLE      &lv_font_montserrat_20
-#define LV_THEME_DEFAULT_FONT_TITLE         &lv_font_montserrat_20
-
-/*=================
- *  Text settings
- *=================*/
-
-/* Select a character encoding for strings.
- * Your IDE or editor should have the same character encoding
- * - LV_TXT_ENC_UTF8
- * - LV_TXT_ENC_ASCII
- * */
-#define LV_TXT_ENC LV_TXT_ENC_UTF8
-
- /*Can break (wrap) texts on these chars*/
-#define LV_TXT_BREAK_CHARS                  " ,.;:-_"
-
-/* If a word is at least this long, will break wherever "prettiest"
- * To disable, set to a value <= 0 */
-#define LV_TXT_LINE_BREAK_LONG_LEN          12
-
-/* Minimum number of characters in a long word to put on a line before a break.
- * Depends on LV_TXT_LINE_BREAK_LONG_LEN. */
-#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN  3
-
-/* Minimum number of characters in a long word to put on a line after a break.
- * Depends on LV_TXT_LINE_BREAK_LONG_LEN. */
-#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3
-
-/* The control character to use for signalling text recoloring. */
-#define LV_TXT_COLOR_CMD "#"
-
-/* Support bidirectional texts.
- * Allows mixing Left-to-Right and Right-to-Left texts.
- * The direction will be processed according to the Unicode Bidirectioanl Algorithm:
- * https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/
-#define LV_USE_BIDI     0
-#if LV_USE_BIDI
-/* Set the default direction. Supported values:
- * `LV_BIDI_DIR_LTR` Left-to-Right
- * `LV_BIDI_DIR_RTL` Right-to-Left
- * `LV_BIDI_DIR_AUTO` detect texts base direction */
-#define LV_BIDI_BASE_DIR_DEF  LV_BIDI_DIR_AUTO
-#endif
-
-/* Enable Arabic/Persian processing
- * In these languages characters should be replaced with
- * an other form based on their position in the text */
-#define LV_USE_ARABIC_PERSIAN_CHARS 0
-
-/*Change the built in (v)snprintf functions*/
-#define LV_SPRINTF_CUSTOM   0
-#if LV_SPRINTF_CUSTOM
-#  define LV_SPRINTF_INCLUDE <stdio.h>
-#  define lv_snprintf     snprintf
-#  define lv_vsnprintf    vsnprintf
-#else   /*!LV_SPRINTF_CUSTOM*/
-#  define LV_SPRINTF_DISABLE_FLOAT 1
-#endif  /*LV_SPRINTF_CUSTOM*/
-
-/*===================
- *  LV_OBJ SETTINGS
- *==================*/
-#define LV_USE_USER_DATA_FREE 0
-
-#if LV_USE_USER_DATA
-/*Declare the type of the user data of object (can be e.g. `void *`, `int`, `struct`)*/
-typedef struct
-{
-    void * user_data;
-    void * user_data_for_client;
-    uint32_t user_num;
-}lv_obj_user_data_t;
-
-/*Provide a function to free user data*/
-#define LV_USE_USER_DATA_FREE 0
-#if LV_USE_USER_DATA_FREE
-#  define LV_USER_DATA_FREE_INCLUDE  "something.h"  /*Header for user data free function*/
-/* Function prototype : void user_data_free(lv_obj_t * obj); */
-#  define LV_USER_DATA_FREE  (user_data_free)       /*Invoking for user data free function*/
-#endif
-#endif
-
-/*1: enable `lv_obj_realaign()` based on `lv_obj_align()` parameters*/
-#define LV_USE_OBJ_REALIGN          1
-
-/* Enable to make the object clickable on a larger area.
- * LV_EXT_CLICK_AREA_OFF or 0: Disable this feature
- * LV_EXT_CLICK_AREA_TINY: The extra area can be adjusted horizontally and vertically (0..255 px)
- * LV_EXT_CLICK_AREA_FULL: The extra area can be adjusted in all 4 directions (-32k..+32k px)
- */
-#define LV_USE_EXT_CLICK_AREA  LV_EXT_CLICK_AREA_OFF
-
-/*==================
- *  LV OBJ X USAGE
- *================*/
-/*
- * Documentation of the object types: https://docs.lvgl.com/#Object-types
- */
-
-/*Arc (dependencies: -)*/
-#define LV_USE_ARC      1
-
-/*Bar (dependencies: -)*/
-#define LV_USE_BAR      1
-
-/*Button (dependencies: lv_cont*/
-#define LV_USE_BTN      1
-
-/*Button matrix (dependencies: -)*/
-#define LV_USE_BTNMATRIX     1
-
-/*Calendar (dependencies: -)*/
-#define LV_USE_CALENDAR 1
-#if LV_USE_CALENDAR
-#  define LV_CALENDAR_WEEK_STARTS_MONDAY    0
-#endif
-
-/*Canvas (dependencies: lv_img)*/
-#define LV_USE_CANVAS   1
-
-/*Check box (dependencies: lv_btn, lv_label)*/
-#define LV_USE_CHECKBOX       1
-
-/*Chart (dependencies: -)*/
-#define LV_USE_CHART    1
-#if LV_USE_CHART
-#  define LV_CHART_AXIS_TICK_LABEL_MAX_LEN    20
-#endif
-
-/*Container (dependencies: -*/
-#define LV_USE_CONT     1
-
-/*Color picker (dependencies: -*/
-//#define LV_USE_CPICKER   1
-
-/*Drop down list (dependencies: lv_page, lv_label, lv_symbol_def.h)*/
-#define LV_USE_DROPDOWN    1
-#if LV_USE_DROPDOWN != 0
-/*Open and close default animation time [ms] (0: no animation)*/
-#  define LV_DROPDOWN_DEF_ANIM_TIME     200
-#endif
-
-/*Gauge (dependencies:lv_bar, lv_linemeter)*/
-#define LV_USE_GAUGE    1
-
-/*Image (dependencies: lv_label*/
-#define LV_USE_IMG      1
-
-/*Image Button (dependencies: lv_btn*/
-#define LV_USE_IMGBTN   1
-#if LV_USE_IMGBTN
-/*1: The imgbtn requires left, mid and right parts and the width can be set freely*/
-#  define LV_IMGBTN_TILED 0
-#endif
-
-/*Keyboard (dependencies: lv_btnm)*/
-#define LV_USE_KEYBOARD       1
-
-/*Label (dependencies: -*/
-#define LV_USE_LABEL    1
-#if LV_USE_LABEL != 0
-/*Hor, or ver. scroll speed [px/sec] in 'LV_LABEL_LONG_ROLL/ROLL_CIRC' mode*/
-#  define LV_LABEL_DEF_SCROLL_SPEED       25
-
-/* Waiting period at beginning/end of animation cycle */
-#  define LV_LABEL_WAIT_CHAR_COUNT        3
-
-/*Enable selecting text of the label */
-#  define LV_LABEL_TEXT_SEL               0
-
-/*Store extra some info in labels (12 bytes) to speed up drawing of very long texts*/
-#  define LV_LABEL_LONG_TXT_HINT          0
-#endif
-
-/*LED (dependencies: -)*/
-#define LV_USE_LED      1
-#if LV_USE_LED
-#  define LV_LED_BRIGHT_MIN  120      /*Minimal brightness*/
-#  define LV_LED_BRIGHT_MAX  255     /*Maximal brightness*/
-#endif
-
-/*Line (dependencies: -*/
-#define LV_USE_LINE     1
-
-/*List (dependencies: lv_page, lv_btn, lv_label, (lv_img optionally for icons ))*/
-#define LV_USE_LIST     1
-#if LV_USE_LIST != 0
-/*Default animation time of focusing to a list element [ms] (0: no animation)  */
-#  define LV_LIST_DEF_ANIM_TIME  100
-#endif
-
-/*Line meter (dependencies: *;)*/
-#define LV_USE_LINEMETER   1
-#if LV_USE_LINEMETER
-/* Draw line more precisely at cost of performance.
- * Useful if there are lot of lines any minor are visible
- * 0: No extra precision
- * 1: Some extra precision
- * 2: Best precision
- */
-#  define LV_LINEMETER_PRECISE    0
-#endif
-
-/*Mask (dependencies: -)*/
-#define LV_USE_OBJMASK  1
-
-/*Message box (dependencies: lv_rect, lv_btnm, lv_label)*/
-#define LV_USE_MSGBOX     1
-
-/*Page (dependencies: lv_cont)*/
-#define LV_USE_PAGE     1
-#if LV_USE_PAGE != 0
-/*Focus default animation time [ms] (0: no animation)*/
-#  define LV_PAGE_DEF_ANIM_TIME     400
-#endif
-
-/*Preload (dependencies: lv_arc, lv_anim)*/
-#define LV_USE_SPINNER      1
-#if LV_USE_SPINNER != 0
-#  define LV_SPINNER_DEF_ARC_LENGTH   60      /*[deg]*/
-#  define LV_SPINNER_DEF_SPIN_TIME    1000    /*[ms]*/
-#  define LV_SPINNER_DEF_ANIM         LV_SPINNER_TYPE_SPINNING_ARC
-#endif
-
-/*Roller (dependencies: lv_ddlist)*/
-#define LV_USE_ROLLER    1
-#if LV_USE_ROLLER != 0
-/*Focus animation time [ms] (0: no animation)*/
-#  define LV_ROLLER_DEF_ANIM_TIME     200
-
-/*Number of extra "pages" when the roller is infinite*/
-#  define LV_ROLLER_INF_PAGES         7
-#endif
-
-/*Slider (dependencies: lv_bar)*/
-#define LV_USE_SLIDER    1
-
-/*Spinbox (dependencies: lv_ta)*/
-#define LV_USE_SPINBOX       1
-
-/*Switch (dependencies: lv_slider)*/
-#define LV_USE_SWITCH       1
-
-/*Text area (dependencies: lv_label, lv_page)*/
-#define LV_USE_TEXTAREA       1
-#if LV_USE_TEXTAREA != 0
-#  define LV_TEXTAREA_DEF_CURSOR_BLINK_TIME 400     /*ms*/
-#  define LV_TEXTAREA_DEF_PWD_SHOW_TIME     1500    /*ms*/
-#endif
-
-/*Table (dependencies: lv_label)*/
-#define LV_USE_TABLE    1
-#if LV_USE_TABLE
-#  define LV_TABLE_COL_MAX    12
-#  define LV_TABLE_CELL_STYLE_CNT 4
-#endif
-
-/*Tab (dependencies: lv_page, lv_btnm)*/
-#define LV_USE_TABVIEW      1
-#  if LV_USE_TABVIEW != 0
-/*Time of slide animation [ms] (0: no animation)*/
-#  define LV_TABVIEW_DEF_ANIM_TIME    300
-#endif
-
-/*Tileview (dependencies: lv_page) */
-#define LV_USE_TILEVIEW     1
-#if LV_USE_TILEVIEW
-/*Time of slide animation [ms] (0: no animation)*/
-#  define LV_TILEVIEW_DEF_ANIM_TIME   300
-#endif
-
-/*Window (dependencies: lv_cont, lv_btn, lv_label, lv_img, lv_page)*/
-#define LV_USE_WIN      1
-
-/*==================
- * Non-user section
- *==================*/
-
-#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)    /* Disable warnings for Visual Studio*/
-#  define _CRT_SECURE_NO_WARNINGS
-#endif
-
-#define LV_WATCH_MOUSEWHEEL 0
-
-/* Image decoder */
-#define USE_LV_DRAW_IMG_PNG_DECODER 1
-#define USE_LV_DRAW_IMG_JPEG_DECODER 1
-#define USE_LV_DRAW_IMG_JPEG_DECODER_HW_MODE 0
-#define USE_LV_DRAW_IMG_JPEG_DECODER_INC_JLIB 0
-
-/* GIF player */
-#define USE_LV_DRAW_GIF_PLAYER    1
-
-#define USE_LV_FLASH_FS         1
-#define USE_LV_ROM_FS           1
-#define FILE_INODE_BUF_SIZE    16 /*Lv_romfs.c file cahce size set 16,Low memory change size to 4*/
-#define USE_LV_SD_FS            0 // 1
-#define USE_LV_BARCODE          0
-#define USE_LV_QRCODE           1
-
-#define USE_LV_WATCH_DEMO 1
-
-/* xtimer */
-#define TIMER_HZ_32K (32768ul)
-#define TIMER_HZ_1M (1000000ul)
-
-#define XTIMER_HZ TIMER_HZ_32K
-
-#if (XTIMER_HZ == TIMER_HZ_32K)
-#define XTIMER_BACKOFF 1
-#define XTIMER_OVERHEAD 0
-#define XTIMER_ISR_BACKOFF 1
-#else /* 1MH */
-#define XTIMER_BACKOFF 30
-#define XTIMER_OVERHEAD 20
-#define XTIMER_ISR_BACKOFF 20
-#endif
-
-#define USE_SDK_API 1
-
-extern int uart_printf(const char* fmt, ...);
-#define printf(fmt, ...)  uart_printf(fmt, ##__VA_ARGS__)
-//#define printf(fmt, args...)  watch_uart_printf(fmt, ##args)
-
-/*--END OF LV_CONF_H--*/
-
-/* Bluetooth */
-#define USE_LV_BLUETOOTH 0
-#define USE_LV_BLE_DEMO 0
-
-/* SD auto mount */
-#define USE_LV_WATCH_SD_AUTO_MOUNT 0
-
-/* DM */
-#define USE_LV_DM 0
-
-/*multi-task safe setting for lv_task, exclude other lv_objx */
-#define LV_TASK_MULTITASK_SAFE
-
-/* WLAN */
-#define USE_LV_WLAN 0
-
-
-
-#endif /*LV_CONF_H*/
-
-#endif /*End of "Content enable"*/
+/**\r
+ * @file lv_conf.h\r
+ *\r
+ */\r
+\r
+/*\r
+ * COPY THIS FILE AS `lv_conf.h` NEXT TO the `lvgl` FOLDER\r
+ */\r
+\r
+#if 1 /*Set it to "1" to enable content*/\r
+\r
+#ifndef LV_CONF_H\r
+#define LV_CONF_H\r
+/* clang-format off */\r
+\r
+#include <stdint.h>\r
+\r
+#if 1 // @CHENG_MODIFY\r
+#include "lv_conf_CUSTOM.h"\r
+#endif\r
+\r
+/*====================\r
+   Graphical settings\r
+ *====================*/\r
+//#define USE_LV_WATCH_UI_360_360 0\r
+//#define USE_LV_WATCH_UI_240_320 0 // 1\r
+//#define USE_LV_WATCH_UI_240_280 1\r
+\r
+/* Maximal horizontal and vertical resolution to support by the library.*/\r
+#if USE_LV_WATCH_UI_360_360\r
+#define LV_HOR_RES_MAX          (360)\r
+#define LV_VER_RES_MAX          (360)\r
+#elif USE_LV_WATCH_UI_240_320\r
+#define LV_HOR_RES_MAX          (240)\r
+#define LV_VER_RES_MAX          (320)\r
+#elif USE_LV_WATCH_UI_240_280\r
+#define LV_HOR_RES_MAX          (240)\r
+#define LV_VER_RES_MAX          (280)\r
+#elif USE_LV_WATCH_UI_466_466\r
+#define LV_HOR_RES_MAX          (466)\r
+#define LV_VER_RES_MAX          (466)\r
+#else // USE_LV_WATCH_UI_240_240\r
+#define LV_HOR_RES_MAX          (240)\r
+#define LV_VER_RES_MAX          (240)\r
+#endif\r
+/* Horizontal and vertical resolution of the library.*/\r
+#define LV_HOR_RES          (LV_HOR_RES_MAX)\r
+#define LV_VER_RES          (LV_VER_RES_MAX)\r
+\r
+/* Color depth:\r
+ * - 1:  1 byte per pixel\r
+ * - 8:  RGB233\r
+ * - 16: RGB565\r
+ * - 32: ARGB8888\r
+ */\r
+#define LV_COLOR_DEPTH     16\r
+\r
+/* Swap the 2 bytes of RGB565 color.\r
+ * Useful if the display has a 8 bit interface (e.g. SPI)*/\r
+#define LV_COLOR_16_SWAP   0\r
+\r
+/* 1: Enable screen transparency.\r
+ * Useful for OSD or other overlapping GUIs.\r
+ * Requires `LV_COLOR_DEPTH = 32` colors and the screen's style should be modified: `style.body.opa = ...`*/\r
+#define LV_COLOR_SCREEN_TRANSP    0\r
+\r
+/*Images pixels with this color will not be drawn (with chroma keying)*/\r
+#define LV_COLOR_TRANSP    LV_COLOR_LIME         /*LV_COLOR_LIME: pure green*/\r
+\r
+/* Enable anti-aliasing (lines, and radiuses will be smoothed) */\r
+#define LV_ANTIALIAS        1\r
+\r
+/* Default display refresh period.\r
+ * Can be changed in the display driver (`lv_disp_drv_t`).*/\r
+#define LV_DISP_DEF_REFR_PERIOD      15      /*[ms]*/\r
+\r
+/* Dot Per Inch: used to initialize default sizes.\r
+ * E.g. a button with width = LV_DPI / 2 -> half inch wide\r
+ * (Not so important, you can adjust it to modify default sizes and spaces)*/\r
+#define LV_DPI              100     /*[px]*/\r
+\r
+/* The the real width of the display changes some default values:\r
+ * default object sizes, layout of examples, etc.\r
+ * According to the width of the display (hor. res. / dpi)\r
+ * the displays fall in 4 categories.\r
+ * The 4th is extra large which has no upper limit so not listed here\r
+ * The upper limit of the categories are set below in 0.1 inch unit.\r
+ */\r
+#define LV_DISP_SMALL_LIMIT  30\r
+#define LV_DISP_MEDIUM_LIMIT 50\r
+#define LV_DISP_LARGE_LIMIT  70\r
+\r
+/* Type of coordinates. Should be `int16_t` (or `int32_t` for extreme cases) */\r
+typedef int16_t lv_coord_t;\r
+\r
+/*=========================\r
+   Memory manager settings\r
+ *=========================*/\r
+\r
+/* LittelvGL's internal memory manager's settings.\r
+ * The graphical objects and other related data are stored here. */\r
+\r
+/* 1: use custom malloc/free, 0: use the built-in `lv_mem_alloc` and `lv_mem_free` */\r
+#define LV_MEM_CUSTOM      1\r
+#if LV_MEM_CUSTOM == 0\r
+/* Size of the memory used by `lv_mem_alloc` in bytes (>= 2kB)*/\r
+#  define LV_MEM_SIZE    (2 * 1024U * 1024U)\r
+\r
+/* Complier prefix for a big array declaration */\r
+#  define LV_MEM_ATTR\r
+\r
+/* Set an address for the memory pool instead of allocating it as an array.\r
+ * Can be in external SRAM too. */\r
+#  define LV_MEM_ADR          0\r
+\r
+/* Automatically defrag. on free. Defrag. means joining the adjacent free cells. */\r
+#  define LV_MEM_AUTO_DEFRAG  1\r
+#else       /*LV_MEM_CUSTOM*/\r
+#  define LV_MEM_CUSTOM_INCLUDE <stdlib.h>   /*Header for the dynamic memory function*/\r
+#  define LV_MEM_CUSTOM_ALLOC   malloc       /*Wrapper to malloc*/\r
+#  define LV_MEM_CUSTOM_FREE    free         /*Wrapper to free*/\r
+#  define LV_MEM_USE_MALLOC_DEFINE           /*define lv_mem_alloc to malloc*/\r
+#  include <stdlib.h>\r
+#endif     /*LV_MEM_CUSTOM*/\r
+\r
+/* Use the standard memcpy and memset instead of LVGL's own functions.\r
+ * The standard functions might or might not be faster depending on their implementation. */\r
+#define LV_MEMCPY_MEMSET_STD    0\r
+\r
+#define SDK_MMI_POOL_SIZE (3 * 1024 * 1024)\r
+\r
+/* Garbage Collector settings\r
+ * Used if lvgl is binded to higher level language and the memory is managed by that language */\r
+#define LV_ENABLE_GC 0\r
+#if LV_ENABLE_GC != 0\r
+#  define LV_GC_INCLUDE "gc.h"                           /*Include Garbage Collector related things*/\r
+#  define LV_MEM_CUSTOM_REALLOC   your_realloc           /*Wrapper to realloc*/\r
+#  define LV_MEM_CUSTOM_GET_SIZE  your_mem_get_size      /*Wrapper to lv_mem_get_size*/\r
+#endif /* LV_ENABLE_GC */\r
+\r
+/*=======================\r
+   Input device settings\r
+ *=======================*/\r
+\r
+/* Input device default settings.\r
+ * Can be changed in the Input device driver (`lv_indev_drv_t`)*/\r
+\r
+/* Input device read period in milliseconds */\r
+#define LV_INDEV_DEF_READ_PERIOD          15\r
+\r
+/* Drag threshold in pixels */\r
+#define LV_INDEV_DEF_DRAG_LIMIT           2\r
+\r
+/* Drag throw slow-down in [%]. Greater value -> faster slow-down */\r
+#define LV_INDEV_DEF_DRAG_THROW           2\r
+\r
+/* Long press time in milliseconds.\r
+ * Time to send `LV_EVENT_LONG_PRESSSED`) */\r
+#define LV_INDEV_DEF_LONG_PRESS_TIME      400\r
+\r
+/* Repeated trigger period in long press [ms]\r
+ * Time between `LV_EVENT_LONG_PRESSED_REPEAT */\r
+#define LV_INDEV_DEF_LONG_PRESS_REP_TIME  100\r
+\r
+\r
+/* Gesture threshold in pixels */\r
+#define LV_INDEV_DEF_GESTURE_LIMIT        2\r
+\r
+/* Gesture min velocity at release before swipe (pixels)*/\r
+#define LV_INDEV_DEF_GESTURE_MIN_VELOCITY 1\r
+\r
+/*==================\r
+ * Feature usage\r
+ *==================*/\r
+\r
+/*1: Enable the Animations */\r
+#define LV_USE_ANIMATION        1\r
+#if LV_USE_ANIMATION\r
+\r
+/*Declare the type of the user data of animations (can be e.g. `void *`, `int`, `struct`)*/\r
+typedef void * lv_anim_user_data_t;\r
+\r
+#endif\r
+\r
+/* 1: Enable shadow drawing*/\r
+#define LV_USE_SHADOW           1\r
+#if LV_USE_SHADOW\r
+/* Allow buffering some shadow calculation\r
+ * LV_SHADOW_CACHE_SIZE is the max. shadow size to buffer,\r
+ * where shadow size is `shadow_width + radius`\r
+ * Caching has LV_SHADOW_CACHE_SIZE^2 RAM cost*/\r
+#define LV_SHADOW_CACHE_SIZE    0\r
+#endif\r
+\r
+/*1: enable outline drawing on rectangles*/\r
+#define LV_USE_OUTLINE  1\r
+\r
+/*1: enable pattern drawing on rectangles*/\r
+#define LV_USE_PATTERN  1\r
+\r
+/*1: enable value string drawing on rectangles*/\r
+#define LV_USE_VALUE_STR    1\r
+\r
+/* 1: Use other blend modes than normal (`LV_BLEND_MODE_...`)*/\r
+#define LV_USE_BLEND_MODES      1\r
+\r
+/* 1: Use the `opa_scale` style property to set the opacity of an object and its children at once*/\r
+#define LV_USE_OPA_SCALE        1\r
+\r
+/* 1: Use image zoom and rotation*/\r
+#define LV_USE_IMG_TRANSFORM    1\r
+\r
+/* 1: Enable object groups (for keyboard/encoder navigation) */\r
+#define LV_USE_GROUP            1\r
+#if LV_USE_GROUP\r
+typedef void * lv_group_user_data_t;\r
+#endif  /*LV_USE_GROUP*/\r
+\r
+/* 1: Enable GPU interface*/\r
+#define LV_USE_GPU              1   /*Only enables `gpu_fill_cb` and `gpu_blend_cb` in the disp. drv- */\r
+#define LV_USE_GPU_STM32_DMA2D  0\r
+\r
+/*If enabling LV_USE_GPU_STM32_DMA2D, LV_GPU_DMA2D_CMSIS_INCLUDE must be defined to include path of CMSIS header of target processor\r
+e.g. "stm32f769xx.h" or "stm32f429xx.h" */\r
+#define LV_GPU_DMA2D_CMSIS_INCLUDE\r
+\r
+/*1: Use PXP for CPU off-load on NXP RTxxx platforms */\r
+#define LV_USE_GPU_NXP_PXP      0\r
+\r
+/*1: Add default bare metal and FreeRTOS interrupt handling routines for PXP (lv_gpu_nxp_pxp_osa.c)\r
+ *   and call lv_gpu_nxp_pxp_init() automatically during lv_init(). Note that symbol FSL_RTOS_FREE_RTOS\r
+ *   has to be defined in order to use FreeRTOS OSA, otherwise bare-metal implementation is selected.\r
+ *0: lv_gpu_nxp_pxp_init() has to be called manually before lv_init()\r
+ * */\r
+#define LV_USE_GPU_NXP_PXP_AUTO_INIT 0\r
+\r
+/*1: Use VG-Lite for CPU offload on NXP RTxxx platforms */\r
+#define LV_USE_GPU_NXP_VG_LITE   0\r
+\r
+/* 1: Enable file system (might be required for images */\r
+#define LV_USE_FILESYSTEM       1\r
+#if LV_USE_FILESYSTEM\r
+/*Declare the type of the user data of file system drivers (can be e.g. `void *`, `int`, `struct`)*/\r
+typedef void * lv_fs_drv_user_data_t;\r
+#endif\r
+\r
+/*1: Add a `user_data` to drivers and objects*/\r
+#define LV_USE_USER_DATA        1\r
+\r
+/*1: Show CPU usage and FPS count in the right bottom corner*/\r
+#define LV_USE_PERF_MONITOR     0\r
+\r
+/*1: Use the functions and types from the older API if possible */\r
+#define LV_USE_API_EXTENSION_V6  1\r
+#define LV_USE_API_EXTENSION_V7  1\r
+\r
+/*========================\r
+ * Image decoder and cache\r
+ *========================*/\r
+\r
+/* 1: Enable indexed (palette) images */\r
+#define LV_IMG_CF_INDEXED       1\r
+\r
+/* 1: Enable alpha indexed images */\r
+#define LV_IMG_CF_ALPHA         1\r
+\r
+/* Default image cache size. Image caching keeps the images opened.\r
+ * If only the built-in image formats are used there is no real advantage of caching.\r
+ * (I.e. no new image decoder is added)\r
+ * With complex image decoders (e.g. PNG or JPG) caching can save the continuous open/decode of images.\r
+ * However the opened images might consume additional RAM.\r
+ * LV_IMG_CACHE_DEF_SIZE must be >= 1 */\r
+#define LV_IMG_CACHE_DEF_SIZE       5\r
+\r
+/*limit cache max mem size, 0 to close this feature */\r
+#define LV_IMG_CACHE_MEM_SIZE_LIMIT  1600*1024//(1024*1024*2)\r
+\r
+/*Declare the type of the user data of image decoder (can be e.g. `void *`, `int`, `struct`)*/\r
+typedef void * lv_img_decoder_user_data_t;\r
+\r
+/*=====================\r
+ *  Compiler settings\r
+ *====================*/\r
+  /* For big endian systems set to 1 */\r
+#define LV_BIG_ENDIAN_SYSTEM    0\r
+\r
+/* Define a custom attribute to `lv_tick_inc` function */\r
+#define LV_ATTRIBUTE_TICK_INC\r
+\r
+/* Define a custom attribute to `lv_task_handler` function */\r
+#define LV_ATTRIBUTE_TASK_HANDLER\r
+\r
+/* Define a custom attribute to `lv_disp_flush_ready` function */\r
+#define LV_ATTRIBUTE_FLUSH_READY\r
+\r
+/* Required alignment size for buffers */\r
+#define LV_ATTRIBUTE_MEM_ALIGN_SIZE\r
+\r
+/* With size optimization (-Os) the compiler might not align data to\r
+ * 4 or 8 byte boundary. Some HW may need even 32 or 64 bytes.\r
+ * This alignment will be explicitly applied where needed.\r
+ * LV_ATTRIBUTE_MEM_ALIGN_SIZE should be used to specify required align size.\r
+ * E.g. __attribute__((aligned(LV_ATTRIBUTE_MEM_ALIGN_SIZE))) */\r
+#define LV_ATTRIBUTE_MEM_ALIGN\r
+\r
+/* Attribute to mark large constant arrays for example\r
+ * font's bitmaps */\r
+#define LV_ATTRIBUTE_LARGE_CONST\r
+\r
+/* Prefix performance critical functions to place them into a faster memory (e.g RAM)\r
+ * Uses 15-20 kB extra memory */\r
+#define LV_ATTRIBUTE_FAST_MEM\r
+\r
+/* Export integer constant to binding.\r
+ * This macro is used with constants in the form of LV_<CONST> that\r
+ * should also appear on lvgl binding API such as Micropython\r
+ *\r
+ * The default value just prevents a GCC warning.\r
+ */\r
+#define LV_EXPORT_CONST_INT(int_value) struct _silence_gcc_warning\r
+\r
+/* Prefix variables that are used in GPU accelerated operations, often these need to be\r
+ * placed in RAM sections that are DMA accessible */\r
+#define LV_ATTRIBUTE_DMA\r
+\r
+/*===================\r
+ *  HAL settings\r
+ *==================*/\r
+\r
+/* 1: use a custom tick source.\r
+ * It removes the need to manually update the tick with `lv_tick_inc`) */\r
+#define LV_TICK_CUSTOM     0\r
+#if LV_TICK_CUSTOM == 1\r
+#define LV_TICK_CUSTOM_INCLUDE  "something.h"       /*Header for the sys time function*/\r
+#define LV_TICK_CUSTOM_SYS_TIME_EXPR (millis())     /*Expression evaluating to current systime in ms*/\r
+#endif   /*LV_TICK_CUSTOM*/\r
+\r
+typedef void * lv_disp_drv_user_data_t;             /*Type of user data in the display driver*/\r
+typedef void * lv_indev_drv_user_data_t;            /*Type of user data in the input device driver*/\r
+\r
+/*================\r
+ * Log settings\r
+ *===============*/\r
+\r
+/*1: Enable the log module*/\r
+#define LV_USE_LOG      1//0\r
+#if LV_USE_LOG\r
+/* How important log should be added:\r
+ * LV_LOG_LEVEL_TRACE       A lot of logs to give detailed information\r
+ * LV_LOG_LEVEL_INFO        Log important events\r
+ * LV_LOG_LEVEL_WARN        Log if something unwanted happened but didn't cause a problem\r
+ * LV_LOG_LEVEL_ERROR       Only critical issue, when the system may fail\r
+ * LV_LOG_LEVEL_NONE        Do not log anything\r
+ */\r
+#  define LV_LOG_LEVEL    LV_LOG_LEVEL_WARN\r
+//#  define LV_LOG_LEVEL    LV_LOG_LEVEL_TRACE //only used for debug\r
+\r
+/* 1: Print the log with 'printf';\r
+ * 0: user need to register a callback with `lv_log_register_print_cb`*/\r
+#  define LV_LOG_PRINTF   1\r
+#endif  /*LV_USE_LOG*/\r
+\r
+/*=================\r
+ * Debug settings\r
+ *================*/\r
+\r
+/* If Debug is enabled LittelvGL validates the parameters of the functions.\r
+ * If an invalid parameter is found an error log message is printed and\r
+ * the MCU halts at the error. (`LV_USE_LOG` should be enabled)\r
+ * If you are debugging the MCU you can pause\r
+ * the debugger to see exactly where  the issue is.\r
+ *\r
+ * The behavior of asserts can be overwritten by redefining them here.\r
+ * E.g. #define LV_ASSERT_MEM(p)  <my_assert_code>\r
+ */\r
+#define LV_USE_DEBUG        1\r
+#if LV_USE_DEBUG\r
+\r
+/*Check if the parameter is NULL. (Quite fast) */\r
+#define LV_USE_ASSERT_NULL      1\r
+\r
+/*Checks is the memory is successfully allocated or no. (Quite fast)*/\r
+#define LV_USE_ASSERT_MEM       1\r
+\r
+/*Check the integrity of `lv_mem` after critical operations. (Slow)*/\r
+#define LV_USE_ASSERT_MEM_INTEGRITY       0\r
+\r
+/* Check the strings.\r
+ * Search for NULL, very long strings, invalid characters, and unnatural repetitions. (Slow)\r
+ * If disabled `LV_USE_ASSERT_NULL` will be performed instead (if it's enabled) */\r
+#define LV_USE_ASSERT_STR       0\r
+\r
+/* Check NULL, the object's type and existence (e.g. not deleted). (Quite slow)\r
+ * If disabled `LV_USE_ASSERT_NULL` will be performed instead (if it's enabled) */\r
+#define LV_USE_ASSERT_OBJ       0\r
+\r
+/*Check if the styles are properly initialized. (Fast)*/\r
+#define LV_USE_ASSERT_STYLE     1\r
+\r
+#endif /*LV_USE_DEBUG*/\r
+\r
+/*==================\r
+ *    FONT USAGE\r
+ *===================*/\r
+\r
+/* The built-in fonts contains the ASCII range and some Symbols with  4 bit-per-pixel.\r
+ * The symbols are available via `LV_SYMBOL_...` defines\r
+ * More info about fonts: https://docs.lvgl.com/#Fonts\r
+ * To create a new font go to: https://lvgl.com/ttf-font-to-c-array\r
+ */\r
+\r
+/* Montserrat fonts with bpp = 4\r
+ * https://fonts.google.com/specimen/Montserrat  */\r
+#define LV_FONT_MONTSERRAT_8     0\r
+#define LV_FONT_MONTSERRAT_10    0\r
+#define LV_FONT_MONTSERRAT_12    1\r
+#define LV_FONT_MONTSERRAT_14    1\r
+#define LV_FONT_MONTSERRAT_16    0\r
+#define LV_FONT_MONTSERRAT_18    0\r
+#define LV_FONT_MONTSERRAT_20    1\r
+#define LV_FONT_MONTSERRAT_22    0\r
+#define LV_FONT_MONTSERRAT_24    1\r
+#define LV_FONT_MONTSERRAT_26    0\r
+#define LV_FONT_MONTSERRAT_28    0\r
+#define LV_FONT_MONTSERRAT_30    0\r
+#define LV_FONT_MONTSERRAT_32    0\r
+#define LV_FONT_MONTSERRAT_34    0\r
+#define LV_FONT_MONTSERRAT_36    0\r
+#define LV_FONT_MONTSERRAT_38    0\r
+#define LV_FONT_MONTSERRAT_40    1\r
+#define LV_FONT_MONTSERRAT_42    0\r
+#define LV_FONT_MONTSERRAT_44    0\r
+#define LV_FONT_MONTSERRAT_46    0\r
+#define LV_FONT_MONTSERRAT_48    0\r
+\r
+/* Demonstrate special features */\r
+#define LV_FONT_MONTSERRAT_12_SUBPX      1\r
+#define LV_FONT_MONTSERRAT_28_COMPRESSED 1  /*bpp = 3*/\r
+#define LV_FONT_DEJAVU_16_PERSIAN_HEBREW 0  /*Hebrew, Arabic, PErisan letters and all their forms*/\r
+#define LV_FONT_SIMSUN_16_CJK            0  /*1000 most common CJK radicals*/\r
+\r
+/*Pixel perfect monospace font\r
+ * http://pelulamu.net/unscii/ */\r
+#define LV_FONT_UNSCII_8     0\r
+#define LV_FONT_UNSCII_16    0\r
+\r
+/* Optionally declare your custom fonts here.\r
+ * You can use these fonts as default font too\r
+ * and they will be available globally. E.g.\r
+ * #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) \\r
+ *                                LV_FONT_DECLARE(my_font_2)\r
+ */\r
+#define LV_FONT_CUSTOM_DECLARE\r
+\r
+/* Enable it if you have fonts with a lot of characters.\r
+ * The limit depends on the font size, font face and bpp\r
+ * but with > 10,000 characters if you see issues probably you need to enable it.*/\r
+#define LV_FONT_FMT_TXT_LARGE   0\r
+\r
+/* Enables/disables support for compressed fonts. If it's disabled, compressed\r
+ * glyphs cannot be processed by the library and won't be rendered.\r
+ */\r
+#define LV_USE_FONT_COMPRESSED 1\r
+\r
+/* Enable subpixel rendering */\r
+#define LV_USE_FONT_SUBPX 1\r
+#if LV_USE_FONT_SUBPX\r
+/* Set the pixel order of the display.\r
+ * Important only if "subpx fonts" are used.\r
+ * With "normal" font it doesn't matter.\r
+ */\r
+#define LV_FONT_SUBPX_BGR    0\r
+#endif\r
+\r
+/*Declare the type of the user data of fonts (can be e.g. `void *`, `int`, `struct`)*/\r
+typedef void * lv_font_user_data_t;\r
+\r
+/*================\r
+ *  THEME USAGE\r
+ *================*/\r
+\r
+/*Always enable at least on theme*/\r
+\r
+/* No theme, you can apply your styles as you need\r
+ * No flags. Set LV_THEME_DEFAULT_FLAG 0 */\r
+ #define LV_USE_THEME_EMPTY       1\r
+\r
+/*Simple to the create your theme based on it\r
+ * No flags. Set LV_THEME_DEFAULT_FLAG 0 */\r
+ #define LV_USE_THEME_TEMPLATE    0\r
+\r
+ /* A fast and impressive theme.\r
+  * Flags:\r
+  * LV_THEME_MATERIAL_FLAG_LIGHT: light theme\r
+  * LV_THEME_MATERIAL_FLAG_DARK: dark theme\r
+  * LV_THEME_MATERIAL_FLAG_NO_TRANSITION: disable transitions (state change animations)\r
+  * LV_THEME_MATERIAL_FLAG_NO_FOCUS: disable indication of focused state)\r
+  * */\r
+ #define LV_USE_THEME_MATERIAL    0\r
+\r
+/* Mono-color theme for monochrome displays.\r
+ * If LV_THEME_DEFAULT_COLOR_PRIMARY is LV_COLOR_BLACK the\r
+ * texts and borders will be black and the background will be\r
+ * white. Else the colors are inverted.\r
+ * No flags. Set LV_THEME_DEFAULT_FLAG 0 */\r
+ #define LV_USE_THEME_MONO        0\r
+\r
+#define LV_THEME_DEFAULT_INCLUDE            <stdint.h>      /*Include a header for the init. function*/\r
+#define LV_THEME_DEFAULT_INIT               lv_theme_empty_init\r
+#define LV_THEME_DEFAULT_COLOR_PRIMARY      LV_COLOR_RED\r
+#define LV_THEME_DEFAULT_COLOR_SECONDARY    LV_COLOR_BLUE\r
+#define LV_THEME_DEFAULT_FLAG               0\r
+#define LV_THEME_DEFAULT_FONT_SMALL         &lv_font_montserrat_20\r
+#define LV_THEME_DEFAULT_FONT_NORMAL        &lv_font_montserrat_20\r
+#define LV_THEME_DEFAULT_FONT_SUBTITLE      &lv_font_montserrat_20\r
+#define LV_THEME_DEFAULT_FONT_TITLE         &lv_font_montserrat_20\r
+\r
+/*=================\r
+ *  Text settings\r
+ *=================*/\r
+\r
+/* Select a character encoding for strings.\r
+ * Your IDE or editor should have the same character encoding\r
+ * - LV_TXT_ENC_UTF8\r
+ * - LV_TXT_ENC_ASCII\r
+ * */\r
+#define LV_TXT_ENC LV_TXT_ENC_UTF8\r
+\r
+ /*Can break (wrap) texts on these chars*/\r
+#define LV_TXT_BREAK_CHARS                  " ,.;:-_"\r
+\r
+/* If a word is at least this long, will break wherever "prettiest"\r
+ * To disable, set to a value <= 0 */\r
+#define LV_TXT_LINE_BREAK_LONG_LEN          12\r
+\r
+/* Minimum number of characters in a long word to put on a line before a break.\r
+ * Depends on LV_TXT_LINE_BREAK_LONG_LEN. */\r
+#define LV_TXT_LINE_BREAK_LONG_PRE_MIN_LEN  3\r
+\r
+/* Minimum number of characters in a long word to put on a line after a break.\r
+ * Depends on LV_TXT_LINE_BREAK_LONG_LEN. */\r
+#define LV_TXT_LINE_BREAK_LONG_POST_MIN_LEN 3\r
+\r
+/* The control character to use for signalling text recoloring. */\r
+#define LV_TXT_COLOR_CMD "#"\r
+\r
+/* Support bidirectional texts.\r
+ * Allows mixing Left-to-Right and Right-to-Left texts.\r
+ * The direction will be processed according to the Unicode Bidirectioanl Algorithm:\r
+ * https://www.w3.org/International/articles/inline-bidi-markup/uba-basics*/\r
+#define LV_USE_BIDI     0\r
+#if LV_USE_BIDI\r
+/* Set the default direction. Supported values:\r
+ * `LV_BIDI_DIR_LTR` Left-to-Right\r
+ * `LV_BIDI_DIR_RTL` Right-to-Left\r
+ * `LV_BIDI_DIR_AUTO` detect texts base direction */\r
+#define LV_BIDI_BASE_DIR_DEF  LV_BIDI_DIR_AUTO\r
+#endif\r
+\r
+/* Enable Arabic/Persian processing\r
+ * In these languages characters should be replaced with\r
+ * an other form based on their position in the text */\r
+#define LV_USE_ARABIC_PERSIAN_CHARS 0\r
+\r
+/*Change the built in (v)snprintf functions*/\r
+#define LV_SPRINTF_CUSTOM   0\r
+#if LV_SPRINTF_CUSTOM\r
+#  define LV_SPRINTF_INCLUDE <stdio.h>\r
+#  define lv_snprintf     snprintf\r
+#  define lv_vsnprintf    vsnprintf\r
+#else   /*!LV_SPRINTF_CUSTOM*/\r
+#  define LV_SPRINTF_DISABLE_FLOAT 1\r
+#endif  /*LV_SPRINTF_CUSTOM*/\r
+\r
+/*===================\r
+ *  LV_OBJ SETTINGS\r
+ *==================*/\r
+#define LV_USE_USER_DATA_FREE 0\r
+\r
+#if LV_USE_USER_DATA\r
+/*Declare the type of the user data of object (can be e.g. `void *`, `int`, `struct`)*/\r
+typedef struct\r
+{\r
+    void * user_data;\r
+    void * user_data_for_client;\r
+    uint32_t user_num;\r
+}lv_obj_user_data_t;\r
+\r
+/*Provide a function to free user data*/\r
+#define LV_USE_USER_DATA_FREE 0\r
+#if LV_USE_USER_DATA_FREE\r
+#  define LV_USER_DATA_FREE_INCLUDE  "something.h"  /*Header for user data free function*/\r
+/* Function prototype : void user_data_free(lv_obj_t * obj); */\r
+#  define LV_USER_DATA_FREE  (user_data_free)       /*Invoking for user data free function*/\r
+#endif\r
+#endif\r
+\r
+/*1: enable `lv_obj_realaign()` based on `lv_obj_align()` parameters*/\r
+#define LV_USE_OBJ_REALIGN          1\r
+\r
+/* Enable to make the object clickable on a larger area.\r
+ * LV_EXT_CLICK_AREA_OFF or 0: Disable this feature\r
+ * LV_EXT_CLICK_AREA_TINY: The extra area can be adjusted horizontally and vertically (0..255 px)\r
+ * LV_EXT_CLICK_AREA_FULL: The extra area can be adjusted in all 4 directions (-32k..+32k px)\r
+ */\r
+#define LV_USE_EXT_CLICK_AREA  LV_EXT_CLICK_AREA_OFF\r
+\r
+/*==================\r
+ *  LV OBJ X USAGE\r
+ *================*/\r
+/*\r
+ * Documentation of the object types: https://docs.lvgl.com/#Object-types\r
+ */\r
+\r
+/*Arc (dependencies: -)*/\r
+#define LV_USE_ARC      1\r
+\r
+/*Bar (dependencies: -)*/\r
+#define LV_USE_BAR      1\r
+\r
+/*Button (dependencies: lv_cont*/\r
+#define LV_USE_BTN      1\r
+\r
+/*Button matrix (dependencies: -)*/\r
+#define LV_USE_BTNMATRIX     1\r
+\r
+/*Calendar (dependencies: -)*/\r
+#define LV_USE_CALENDAR 1\r
+#if LV_USE_CALENDAR\r
+#  define LV_CALENDAR_WEEK_STARTS_MONDAY    0\r
+#endif\r
+\r
+/*Canvas (dependencies: lv_img)*/\r
+#define LV_USE_CANVAS   1\r
+\r
+/*Check box (dependencies: lv_btn, lv_label)*/\r
+#define LV_USE_CHECKBOX       1\r
+\r
+/*Chart (dependencies: -)*/\r
+#define LV_USE_CHART    1\r
+#if LV_USE_CHART\r
+#  define LV_CHART_AXIS_TICK_LABEL_MAX_LEN    20\r
+#endif\r
+\r
+/*Container (dependencies: -*/\r
+#define LV_USE_CONT     1\r
+\r
+/*Color picker (dependencies: -*/\r
+//#define LV_USE_CPICKER   1\r
+\r
+/*Drop down list (dependencies: lv_page, lv_label, lv_symbol_def.h)*/\r
+#define LV_USE_DROPDOWN    1\r
+#if LV_USE_DROPDOWN != 0\r
+/*Open and close default animation time [ms] (0: no animation)*/\r
+#  define LV_DROPDOWN_DEF_ANIM_TIME     200\r
+#endif\r
+\r
+/*Gauge (dependencies:lv_bar, lv_linemeter)*/\r
+#define LV_USE_GAUGE    1\r
+\r
+/*Image (dependencies: lv_label*/\r
+#define LV_USE_IMG      1\r
+\r
+/*Image Button (dependencies: lv_btn*/\r
+#define LV_USE_IMGBTN   1\r
+#if LV_USE_IMGBTN\r
+/*1: The imgbtn requires left, mid and right parts and the width can be set freely*/\r
+#  define LV_IMGBTN_TILED 0\r
+#endif\r
+\r
+/*Keyboard (dependencies: lv_btnm)*/\r
+#define LV_USE_KEYBOARD       1\r
+\r
+/*Label (dependencies: -*/\r
+#define LV_USE_LABEL    1\r
+#if LV_USE_LABEL != 0\r
+/*Hor, or ver. scroll speed [px/sec] in 'LV_LABEL_LONG_ROLL/ROLL_CIRC' mode*/\r
+#  define LV_LABEL_DEF_SCROLL_SPEED       25\r
+\r
+/* Waiting period at beginning/end of animation cycle */\r
+#  define LV_LABEL_WAIT_CHAR_COUNT        3\r
+\r
+/*Enable selecting text of the label */\r
+#  define LV_LABEL_TEXT_SEL               0\r
+\r
+/*Store extra some info in labels (12 bytes) to speed up drawing of very long texts*/\r
+#  define LV_LABEL_LONG_TXT_HINT          0\r
+#endif\r
+\r
+/*LED (dependencies: -)*/\r
+#define LV_USE_LED      1\r
+#if LV_USE_LED\r
+#  define LV_LED_BRIGHT_MIN  120      /*Minimal brightness*/\r
+#  define LV_LED_BRIGHT_MAX  255     /*Maximal brightness*/\r
+#endif\r
+\r
+/*Line (dependencies: -*/\r
+#define LV_USE_LINE     1\r
+\r
+/*List (dependencies: lv_page, lv_btn, lv_label, (lv_img optionally for icons ))*/\r
+#define LV_USE_LIST     1\r
+#if LV_USE_LIST != 0\r
+/*Default animation time of focusing to a list element [ms] (0: no animation)  */\r
+#  define LV_LIST_DEF_ANIM_TIME  100\r
+#endif\r
+\r
+/*Line meter (dependencies: *;)*/\r
+#define LV_USE_LINEMETER   1\r
+#if LV_USE_LINEMETER\r
+/* Draw line more precisely at cost of performance.\r
+ * Useful if there are lot of lines any minor are visible\r
+ * 0: No extra precision\r
+ * 1: Some extra precision\r
+ * 2: Best precision\r
+ */\r
+#  define LV_LINEMETER_PRECISE    0\r
+#endif\r
+\r
+/*Mask (dependencies: -)*/\r
+#define LV_USE_OBJMASK  1\r
+\r
+/*Message box (dependencies: lv_rect, lv_btnm, lv_label)*/\r
+#define LV_USE_MSGBOX     1\r
+\r
+/*Page (dependencies: lv_cont)*/\r
+#define LV_USE_PAGE     1\r
+#if LV_USE_PAGE != 0\r
+/*Focus default animation time [ms] (0: no animation)*/\r
+#  define LV_PAGE_DEF_ANIM_TIME     400\r
+#endif\r
+\r
+/*Preload (dependencies: lv_arc, lv_anim)*/\r
+#define LV_USE_SPINNER      1\r
+#if LV_USE_SPINNER != 0\r
+#  define LV_SPINNER_DEF_ARC_LENGTH   60      /*[deg]*/\r
+#  define LV_SPINNER_DEF_SPIN_TIME    1000    /*[ms]*/\r
+#  define LV_SPINNER_DEF_ANIM         LV_SPINNER_TYPE_SPINNING_ARC\r
+#endif\r
+\r
+/*Roller (dependencies: lv_ddlist)*/\r
+#define LV_USE_ROLLER    1\r
+#if LV_USE_ROLLER != 0\r
+/*Focus animation time [ms] (0: no animation)*/\r
+#  define LV_ROLLER_DEF_ANIM_TIME     200\r
+\r
+/*Number of extra "pages" when the roller is infinite*/\r
+#  define LV_ROLLER_INF_PAGES         7\r
+#endif\r
+\r
+/*Slider (dependencies: lv_bar)*/\r
+#define LV_USE_SLIDER    1\r
+\r
+/*Spinbox (dependencies: lv_ta)*/\r
+#define LV_USE_SPINBOX       1\r
+\r
+/*Switch (dependencies: lv_slider)*/\r
+#define LV_USE_SWITCH       1\r
+\r
+/*Text area (dependencies: lv_label, lv_page)*/\r
+#define LV_USE_TEXTAREA       1\r
+#if LV_USE_TEXTAREA != 0\r
+#  define LV_TEXTAREA_DEF_CURSOR_BLINK_TIME 400     /*ms*/\r
+#  define LV_TEXTAREA_DEF_PWD_SHOW_TIME     1500    /*ms*/\r
+#endif\r
+\r
+/*Table (dependencies: lv_label)*/\r
+#define LV_USE_TABLE    1\r
+#if LV_USE_TABLE\r
+#  define LV_TABLE_COL_MAX    12\r
+#  define LV_TABLE_CELL_STYLE_CNT 4\r
+#endif\r
+\r
+/*Tab (dependencies: lv_page, lv_btnm)*/\r
+#define LV_USE_TABVIEW      1\r
+#  if LV_USE_TABVIEW != 0\r
+/*Time of slide animation [ms] (0: no animation)*/\r
+#  define LV_TABVIEW_DEF_ANIM_TIME    300\r
+#endif\r
+\r
+/*Tileview (dependencies: lv_page) */\r
+#define LV_USE_TILEVIEW     1\r
+#if LV_USE_TILEVIEW\r
+/*Time of slide animation [ms] (0: no animation)*/\r
+#  define LV_TILEVIEW_DEF_ANIM_TIME   300\r
+#endif\r
+\r
+/*Window (dependencies: lv_cont, lv_btn, lv_label, lv_img, lv_page)*/\r
+#define LV_USE_WIN      1\r
+\r
+/*==================\r
+ * Non-user section\r
+ *==================*/\r
+\r
+#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)    /* Disable warnings for Visual Studio*/\r
+#  define _CRT_SECURE_NO_WARNINGS\r
+#endif\r
+\r
+#define LV_WATCH_MOUSEWHEEL 0\r
+\r
+/* Image decoder */\r
+#define USE_LV_DRAW_IMG_PNG_DECODER 1\r
+#define USE_LV_DRAW_IMG_JPEG_DECODER 1\r
+#define USE_LV_DRAW_IMG_JPEG_DECODER_HW_MODE 0\r
+#define USE_LV_DRAW_IMG_JPEG_DECODER_INC_JLIB 0\r
+\r
+/* GIF player */\r
+#define USE_LV_DRAW_GIF_PLAYER    1\r
+\r
+#define USE_LV_FLASH_FS         1\r
+#define USE_LV_ROM_FS           1\r
+#define FILE_INODE_BUF_SIZE    16 /*Lv_romfs.c file cahce size set 16,Low memory change size to 4*/\r
+#define USE_LV_SD_FS            0 // 1\r
+#define USE_LV_BARCODE          0\r
+#define USE_LV_QRCODE           1\r
+\r
+#define USE_LV_WATCH_DEMO 1\r
+\r
+/* xtimer */\r
+#define TIMER_HZ_32K (32768ul)\r
+#define TIMER_HZ_1M (1000000ul)\r
+\r
+#define XTIMER_HZ TIMER_HZ_32K\r
+\r
+#if (XTIMER_HZ == TIMER_HZ_32K)\r
+#define XTIMER_BACKOFF 1\r
+#define XTIMER_OVERHEAD 0\r
+#define XTIMER_ISR_BACKOFF 1\r
+#else /* 1MH */\r
+#define XTIMER_BACKOFF 30\r
+#define XTIMER_OVERHEAD 20\r
+#define XTIMER_ISR_BACKOFF 20\r
+#endif\r
+\r
+#define USE_SDK_API 1\r
+\r
+extern int uart_printf(const char* fmt, ...);\r
+#define printf(fmt, ...)  uart_printf(fmt, ##__VA_ARGS__)\r
+//#define printf(fmt, args...)  watch_uart_printf(fmt, ##args)\r
+\r
+/*--END OF LV_CONF_H--*/\r
+\r
+/* Bluetooth */\r
+#define USE_LV_BLUETOOTH 0\r
+#define USE_LV_BLE_DEMO 0\r
+\r
+/* SD auto mount */\r
+#define USE_LV_WATCH_SD_AUTO_MOUNT 0\r
+\r
+/* DM */\r
+#define USE_LV_DM 0\r
+\r
+/*multi-task safe setting for lv_task, exclude other lv_objx */\r
+#define LV_TASK_MULTITASK_SAFE\r
+\r
+/* WLAN */\r
+#define USE_LV_WLAN 0\r
+\r
+\r
+\r
+#endif /*LV_CONF_H*/\r
+\r
+#endif /*End of "Content enable"*/\r
index 099b214..3bfaba8 100644 (file)
-#if 1
-#include <stdio.h>
-#include "lvgl.h"
-#include "lv_drivers/display/crane_lcdc.h"
-#include "lv_drivers/display/st7789v_spi.h"
-#include "lv_drivers/display/st7789v_mcu.h"
-#include "lv_drivers/display/st7735s_spi.h"
-#include "lv_drivers/display/st7567_spi.h"
-#include "lv_drivers/display/rm69330_mipi.h"
-#include "lv_drivers/display/icna3310_mipi.h"
-#include "lv_drivers/display/co5300_mipi.h"
-#include "lv_drivers/display/ili9806e_mipi.h"
-#include "lv_drivers/display/gc9a01_spi.h"
-#include "lv_drivers/indev/ft6x36.h"
-#include "lv_drivers/indev/bl6133.h"
-#include "lv_drivers/indev/stc820.h"
-#include "lv_drivers/indev/tpfw.h"
-#include "lv_drivers/indev/crane_keypadc.h"
-#include "lv_drivers/indev/zinitix.h"
-#include "lv_drivers/indev/CT1711.h"
-#include "lv_drivers/indev/si24rx/si24rx.h"
-#include "lv_drivers/indev/si24rx/si24rx_drv.h"
-#include "lv_drivers/indev/my_xMotion.h"
-#include "lv_drivers/common/backlight.h"
-#include "lv_drivers/common/lv_pm.h"
-#include "lv_drivers/common/i2c.h"
-#include "board.h"
-#include "ril/ril.h"
-#include "lvgl/hal/hal.h"
-#include "lv_drivers/indev/crane_evb_keypad.h"
-#include "lvgl/src/lv_misc/lv_romfs.h"
-#include "lv_drivers/display/st9a01_spi.h"
-#include "lv_drivers/display/gc9c01_3_2_spi.h"
-#include "lv_drivers/display/gc9307_spi.h"
-#include "lv_drivers/display/st7789v2_spi.h"
-#if USE_MULTI_KEY
-#include "lv_drivers/indev/multi_key.h"
-#endif
-#if USE_GH3018
-#include "lv_drivers/indev/gh3018.h"
-#endif
-#if USE_HX3918
-#include "lv_drivers/indev/HX3918/hx3918.h"
-#endif
-#if USE_FR8012HAQ
-#include "lv_drivers/indev/FR8012HAQ/fr8012haq.h"
-#endif
-#if USE_WMM300
-#include "lv_drivers/indev/WMM300/whale_algo.h"
-#endif
-#if USE_ACNT180
-#include "lv_drivers/indev/ACNT180.h"
-#elif USE_ACNT117
-#include "lv_drivers/indev/ACNT117.h"
-#endif
-#if USE_SOS_KEY
-#include "lv_drivers/indev/sos_key.h"
-#endif
-unsigned is_phase1 = 1;
-
-//Simware begin
-extern void gpio_set_value(unsigned int  gpio,unsigned int  value);
-#if USE_BT_SENSOR_HUB != 0
-extern int SensorHub_int_gpio_d2_ent_callback(void);
-extern int SensorHub_int_gpio_d2_exit_callback(void);
-extern void hal_SensorHub_adaptor_init(void);
-#endif
-//Simware end
-#if USE_SDK_API
-/* override SDK config */
-unsigned int g_asrlcd_framebuffer[0];
-unsigned char mmiPool[SDK_MMI_POOL_SIZE];
-const unsigned int mmiPoolSize = SDK_MMI_POOL_SIZE;
-#endif
-
-#define GUI_TASK_PRIORITY    200
-TASK_HANDLE *gui_task_id;
-/*supported panels */
-static struct crane_panel_t *panels[] = {
-#if 1
-#if USE_LCD_PANEL_ST7735S_SPI_POC
-    &st7735s_spi,
-#elif USE_LCD_PANEL_ST7567_SPI_4WIRE_1LANE_1IF
-    &st7567_spi,
-#elif USE_LCD_PANEL_ST7789V_MCU
-    &st7789v_mcu,
-#elif USE_LCD_PANEL_RM69330_MIPI
-    &rm69330_mipi,
-#elif USE_LCD_PANEL_ICNA3310_MIPI
-    &icna3310_mipi,
-#elif USE_LCD_PANEL_CO5300_MIPI
-    &co5300_mipi,
-#elif USE_LCD_PANEL_ILI9806E_MIPI
-    &ili9806e_mipi,
-//#else
-    //&st7789v_spi,
-#endif
-#endif
-
-#if USE_LCD_PANEL_GC9A01_SPI_WATCH
-    &gc9a01_spi,
-#endif
-#if USE_LCD_PANEL_ST9A01_4_1_SPI_POC
-    &st9a01_spi,
-#endif
-#if USE_LCD_PANEL_GC9C01_3_2_SPI_POC
-    &gc9c01_3_2_spi,
-#endif
-#if USE_LCD_PANEL_GC9307_4_1_SPI_POC
-    &gc9307_spi,
-#endif
-#if USE_LCD_PANEL_ST7789V2_SPI_WATCH
-    &st7789v2_spi,
-#endif
-};
-
-#if USE_LCD_PANEL_ST7789V_SPI_WATCH
-static uint32_t lcd_watch_mfp_cfgs[] = {
-    MFP_REG(GPIO_20) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DCLK */
-    MFP_REG(GPIO_21) | MFP_AF0 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS1 */
-    MFP_REG(GPIO_22) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS0 */
-    MFP_REG(GPIO_23) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DOUT */
-    MFP_REG(GPIO_24) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DIN0 */
-    MFP_REG(GPIO_25) | MFP_AF2 | MFP_PULL_LOW  | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* VSYNC */
-    MFP_REG(GPIO_26) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SMPN_RST */
-    MFP_EOC
-};
-
-static struct lcd_info_t lcd_info = {
-    .mfp = (uint32_t *)lcd_watch_mfp_cfgs,
-    .clk = 312000, /* 104000 */
-};
-#endif
-
-#if USE_LCD_PANEL_ST7789V_SPI_PHONE
-static uint32_t lcd_mfp_cfgs[] = {
-    MFP_REG(GPIO_20) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DCLK */
-    MFP_REG(GPIO_21) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS1 */
-    MFP_REG(GPIO_22) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS0 */
-    MFP_REG(GPIO_23) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DOUT */
-    MFP_REG(GPIO_24) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DIN0 */
-    MFP_REG(GPIO_25) | MFP_AF2 | MFP_PULL_LOW  | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* VSYNC */
-    MFP_REG(GPIO_26) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SMPN_RST */
-    MFP_REG(GPIO_27) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE,
-    MFP_REG(GPIO_69_TDS_DIO2) | MFP_AF0 | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE,
-    MFP_EOC
-};
-
-static struct lcd_info_t lcd_info = {
-    .mfp = (uint32_t *)lcd_mfp_cfgs,
-    .clk = 312000, /* 104000 */
-};
-#endif
-
-#if USE_LCD_PANEL_ST7789V_MCU
-static uint32_t lcd_mfp_cfgs[] = {
-    MFP_REG(GPIO_22) | MFP_AF6 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*CS0*/
-    MFP_REG(GPIO_26) | MFP_AF6 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*RST*/
-    MFP_REG(GPIO_20) | MFP_AF6 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DB0*/
-    MFP_REG(GPIO_31) | MFP_AF3 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DB1*/
-    MFP_REG(GPIO_32) | MFP_AF3 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DB2*/
-    MFP_REG(GPIO_121) | MFP_AF3 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DB3*/
-    MFP_REG(GPIO_124) | MFP_AF3 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DB4*/
-    MFP_REG(GPIO_21) | MFP_AF6 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DB5*/
-    MFP_REG(GPIO_27) | MFP_AF6 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DB6*/
-    MFP_REG(GPIO_28) | MFP_AF6 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DB7*/
-    MFP_REG(GPIO_23) | MFP_AF6 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*RDB*/
-    MFP_REG(GPIO_24) | MFP_AF6 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*WRB*/
-#if USE_LCD_MCU_DCX_GPIO
-    MFP_REG(GPIO_81) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DCX*/
-#else
-    MFP_REG(GPIO_SLAVE_RESET_OUT_N) | MFP_AF5 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DCX*/
-#endif
-#if LCD_TE_ENABLE
-    MFP_REG(GPIO_25) | MFP_AF6 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*TE*/
-#endif
-    MFP_EOC
-};
-
-struct lcd_info_t lcd_info = {
-    .mfp = (uint32_t *)lcd_mfp_cfgs,
-    .clk = 52000, /* 52000 */
-};
-#endif
-
-
-#if USE_LCD_PANEL_ST7735S_SPI_POC
-static uint32_t lcd_poc_mfp_cfgs[] = {
-    MFP_REG(GPIO_20) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DCLK */
-    MFP_REG(GPIO_27) | MFP_AF0 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS1 */
-    MFP_REG(GPIO_22) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS0 */
-    MFP_REG(GPIO_23) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DOUT */
-    MFP_REG(GPIO_24) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DIN0 */
-    MFP_REG(GPIO_25) | MFP_AF2 | MFP_PULL_LOW  | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* VSYNC */
-    MFP_REG(GPIO_26) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SMPN_RST */
-    MFP_EOC
-};
-
-static struct lcd_info_t lcd_info = {
-    .mfp = (uint32_t *)lcd_poc_mfp_cfgs,
-    .clk = 104000, /* 104000 */
-};
-#endif
-
-#if USE_LCD_PANEL_ST7567_SPI_4WIRE_1LANE_1IF
-static uint32_t lcd_poc_mfp_cfgs[] = {
-    MFP_REG(GPIO_20) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DCLK */
-    MFP_REG(GPIO_21) | MFP_AF0 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS1 */
-    MFP_REG(GPIO_22) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS0 */
-    MFP_REG(GPIO_23) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DOUT */
-    MFP_REG(GPIO_24) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DIN0 */
-    //MFP_REG(GPIO_25) | MFP_AF2 | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* VSYNC */
-    MFP_REG(GPIO_26) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SMPN_RST */
-    MFP_EOC
-};
-
-static struct lcd_info_t lcd_info = {
-    .mfp = (uint32_t *)lcd_poc_mfp_cfgs,
-    .clk = 104000, /* 104000 */
-};
-#endif
-
-#if USE_LCD_PANEL_GC9C01_3_2_SPI_POC
-static uint32_t lcd_watch_mfp_spi_3_2_cfgs[] = {
-    MFP_REG(GPIO_20) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DCLK */
-    MFP_REG(GPIO_21) | MFP_AF3 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS1 */
-    MFP_REG(GPIO_22) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS0 */
-    //MFP_REG(GPIO_23) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DOUT */
-    MFP_REG(GPIO_24) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DIN0 */
-    MFP_REG(GPIO_25) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* VSYNC */
-    MFP_REG(GPIO_26) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SMPN_RST */
-    //MFP_REG(GPIO_27) | MFP_AF0 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DIN1 */
-    MFP_EOC
-};
-
-static struct lcd_info_t gc9c01_lcd_spi_3_2_info =
-{
-    .mfp = (uint32_t *)lcd_watch_mfp_spi_3_2_cfgs,
-    .clk = 312000, /* 104000 */
-};
-#endif
-
-#if  USE_LCD_PANEL_ST9A01_4_1_SPI_POC || USE_LCD_PANEL_GC9307_4_1_SPI_POC || USE_LCD_PANEL_ST7789V2_SPI_WATCH
-
-static uint32_t lcd_poc_mfp_spi_4_1_cfgs[] = {
-    MFP_REG(GPIO_20) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DCLK */
-    MFP_REG(GPIO_21) | MFP_AF0 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS1 */
-    MFP_REG(GPIO_22) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS0 */
-    MFP_REG(GPIO_23) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DOUT */
-    MFP_REG(GPIO_24) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DIN0 */
-    MFP_REG(GPIO_25) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* VSYNC */
-    MFP_REG(GPIO_26) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SMPN_RST */
-    MFP_EOC
-};
-#endif
-#if DRV_PROJECT_Z5_K7 || DRV_PROJECT_Z5_K7_EN || USE_LCD_PANEL_GC9A01_SPI_WATCH|| DRV_PROJECT_Z5_I7 || DRV_PROJECT_Z5_HA_K7 || DRV_PROJECT_Z5_Z11 || DRV_PROJECT_Z5_Z11_2 \
-       || DRV_PROJECT_Z5_LT_K7
-static uint32_t lcd_poc_mfp_spi_3_2_cfgs[] = {
-    MFP_REG(GPIO_20) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DCLK */
-    MFP_REG(GPIO_21) | MFP_AF3 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS1 */
-    MFP_REG(GPIO_22) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS0 */
-    //MFP_REG(GPIO_23) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DOUT */
-    MFP_REG(GPIO_24) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DIN0 */
-    MFP_REG(GPIO_25) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* VSYNC */
-    MFP_REG(GPIO_26) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SMPN_RST */
-    //MFP_REG(GPIO_27) | MFP_AF0 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DIN1 */
-    MFP_EOC
-};
-#endif
-#if USE_LCD_PANEL_GC9A01_SPI_WATCH
-static struct lcd_info_t gc9a01_lcd_spi_3_2_info =
-{
-    .mfp = (uint32_t *)lcd_poc_mfp_spi_3_2_cfgs,
-    .clk = 312000, /* 104000 */
-};
-#endif
-
-#if USE_LCD_PANEL_ST9A01_4_1_SPI_POC
-static struct lcd_info_t st9a01_lcd_spi_4_1_info =
-{
-    .mfp = (uint32_t *)lcd_poc_mfp_spi_4_1_cfgs,
-    .clk = 104000, /* 104000 */
-};
-#endif
-
-#if USE_LCD_PANEL_GC9307_4_1_SPI_POC
-static struct lcd_info_t gc9307_lcd_spi_4_1_info =
-{
-    .mfp = (uint32_t *)lcd_poc_mfp_spi_4_1_cfgs,
-    .clk = 312000, /* 104000 */
-};
-#endif
-
-#if USE_LCD_PANEL_ST7789V2_SPI_WATCH
-#if DRV_PROJECT_Z5_K6
-static struct lcd_info_t st7789v2_lcd_spi_4_1_info =
-{
-    .mfp = (uint32_t *)lcd_poc_mfp_spi_4_1_cfgs,
-    .clk = 312000, /* 104000 */
-};
-#elif DRV_PROJECT_Z5_K7 || DRV_PROJECT_Z5_K7_EN || DRV_PROJECT_Z5_I7 || DRV_PROJECT_Z5_HA_K7 || DRV_PROJECT_Z5_Z11  || DRV_PROJECT_Z5_Z11_2 \
-       || DRV_PROJECT_Z5_LT_K7
-static struct lcd_info_t st7789v2_lcd_spi_3_2_info =
-{
-    .mfp = (uint32_t *)lcd_poc_mfp_spi_3_2_cfgs,
-    .clk = 312000, /* 104000 */
-};
-#endif
-#endif
-
-#if USE_CRANE_LCD_MIPI
-unsigned int lcd_mipi_mfp_cfgs[] = {
-    MFP_REG(GPIO_26) | MFP_AF2 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*RST*/
-    MFP_REG(GPIO_19) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_REG(GPIO_23) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-#if LCD_TE_ENABLE
-    MFP_REG(GPIO_25) | MFP_AF2 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*TE*/
-#endif
-#if LCD_BACKLIGHT_ENABLE
-    MFP_REG(GPIO_31) | MFP_AF2 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*pwm for backlight*/
-    //MFP_REG(GPIO_31) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*config to gpio before pwm ready*/
-#endif
-    MFP_EOC
-};
-
-
-static struct lcd_info_t lcd_info = {
-    .mfp = (uint32_t *)lcd_mipi_mfp_cfgs,
-#if USE_CRANE_LCD_MIPI_CMD
-    .clk = 26000,
-#else
-    .clk = 17300,
-#endif
-};
-#endif
-
-static struct lcd_info_t *lcd_info_detect[]= {
-#if USE_CRANE_LCD_MIPI_CMD
-    &lcd_info,
-#else
-    #if USE_LCD_PANEL_GC9A01_SPI_WATCH
-        &gc9a01_lcd_spi_3_2_info,
-    #endif
-    #if USE_LCD_PANEL_ST9A01_4_1_SPI_POC
-        &st9a01_lcd_spi_4_1_info,
-    #endif
-    #if USE_LCD_PANEL_GC9C01_3_2_SPI_POC
-        &gc9c01_lcd_spi_3_2_info,
-    #endif
-    #if USE_LCD_PANEL_GC9307_4_1_SPI_POC
-        &gc9307_lcd_spi_4_1_info,
-    #endif
-    #if USE_LCD_PANEL_ST7789V2_SPI_WATCH
-    #if DRV_PROJECT_Z5_K6
-        &st7789v2_lcd_spi_4_1_info,
-    #elif DRV_PROJECT_Z5_K7 || DRV_PROJECT_Z5_K7_EN || DRV_PROJECT_Z5_Z12 || DRV_PROJECT_Z5_I7 || DRV_PROJECT_Z5_HA_K7 || DRV_PROJECT_Z5_DS_Z12XW_QCB || DRV_PROJECT_Z5_Z11 || DRV_PROJECT_Z5_Z11_2 \
-               || DRV_PROJECT_Z5_LT_K7
-        &st7789v2_lcd_spi_3_2_info,
-    #endif
-    #endif
-#endif
-};
-
-static struct crane_panel_t *lcd = NULL;
-static struct lcd_info_t * lcd_interface_info = NULL;
-
-#if USE_LCD_PANEL_ICNA3310_MIPI
-unsigned int oled_power_mfp_cfgs[] = {
-    MFP_REG(GPIO_76) | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*power*/
-    MFP_EOC
-};
-
-static void oled_power_set(unsigned char on)
-{
-    uint32_t *mfp;
-
-    mfp = (uint32_t *)&oled_power_mfp_cfgs;
-
-    mfp_config((uint32_t *)mfp);
-    gpio_set_direction(GPIO76, GPIO_OUT);
-    gpio_output_set(GPIO76, on);
-    printf("oled_power_set=%d\n",on);
-}
-#endif
-static void lcdc_pwr_onoff(int on)
-{
-    int pm_type = pmic_get_type();
-
-    if (pm_type == PM_812) { // PM812
-        if (on) {
-            /* enable ldo8 and set t0 2.8V */
-            PM812_Ldo_8_set_2_8();
-            PM812_Ldo_8_set(1);
-        }
-        else {
-            /* disable ldo8 */
-            PM812_Ldo_8_set(0);
-        }
-    }
-    else if (pm_type == PM_813) {  // PM813
-        if (on) {
-            Ningbo_Ldo_1_set_2_8();
-            Ningbo_Ldo_1_set(1);
-#if USE_LCD_PANEL_ICNA3310_MIPI
-            oled_power_set(1);
-#endif
-        }
-        else {
-            Ningbo_Ldo_1_set(0);
-#if USE_LCD_PANEL_ICNA3310_MIPI
-            oled_power_set(0);
-#endif
-        }
-    }
-    else if (pm_type == PM_802) {  // PM802
-        /* ldo is enabled by default */
-    }
-    else if (pm_type == PM_803) {  // PM803
-        GuilinLite_Ldo_6_set_2_8();
-        GuilinLite_Ldo_6_set(TRUE);
-    }
-    else {
-        printf("unknown PMIC, lcd_pwr_onoff failed.\n");
-    }
-}
-
-static struct crane_panel_t *lcd_init(void)
-{
-#if 0
-    int cnt, i;
-    struct crane_panel_t *p;
-    
-    
-    lcdc_pwr_onoff(1);
-    if (lcdc_init(&lcd_info) < 0) {
-        goto error;
-    }
-
-    cnt = ARRAY_SIZE(panels);
-
-    for (i = 0; i < cnt; i++) {
-        p = panels[i];
-        if (p->probe(lcd_info.clk) == 0) {
-            return p;
-        }
-    }
-
-error:
-    return NULL;
-#else
-    int cnt, i;
-    struct crane_panel_t *p;
-
-    lcdc_pwr_onoff(1);
-    
-    cnt = ARRAY_SIZE(lcd_info_detect);
-    lv_udelay(1*1000*1000);
-
-    for (i = 0; i < cnt; i++)
-    {
-        if (lcdc_init(lcd_info_detect[i]) < 0)
-        {
-           continue;
-        }
-        lcd_interface_info = lcd_info_detect[i];
-        p = panels[i];
-        //if restart by error,should call lcdc_reset_panel
-        if(startup_silent_reset())
-            lcdc_reset_panel();
-        if (p->probe((lcd_info_detect[i])->clk) == 0)
-        {
-            return p;
-        }
-    }
-
-#if 0
-    //if detect fail, return first
-       lcd_interface_info = lcd_info_detect[0];
-    return panels[0];
-#else
-    lcd_interface_info = NULL;
-    return NULL;
-#endif
-#endif
-}
-
-void lcdc_resume(void)
-{
-#if 0
-    lcdc_init(&lcd_info);
-    if(lcd) lcd->probe(lcd_info.clk);
-#else
-    if(lcd_interface_info) lcdc_init(lcd_interface_info);
-    if(lcd) lcd->probe(lcd_interface_info->clk);
-#endif
-}
-
-void lcd_idle_refresh(void)
-{
-    if(lcd && lcd->idle_flush) {
-        lcd->idle_flush();
-    }
-}
-#if CONFIG_BOARD_SIMWARE_W61_V2
-extern void gpio_set_value(unsigned int gpio,unsigned int value);
-#if CONFIG_BOARD_SIMWARE_W61_V2
-#define HAL_TP_LDO_EN  GPIO_00
-#define HAL_TP_LDO_EN_GPIO GPIO0
-#endif
-static const uint32_t touch_ldo_en_mfp_cfgs[]=
-{
-    MFP_REG(HAL_TP_LDO_EN) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_NONE | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, //TP LDO EN
-    MFP_EOC
-};
-static void tp_power_onoff(bool on)
-{
-    //LDO EN PIN
-       gpio_set_direction(HAL_TP_LDO_EN_GPIO, GPIO_OUT);
-       if(on){
-        gpio_set_value(HAL_TP_LDO_EN_GPIO, 1);          
-       }else{
-        gpio_set_value(HAL_TP_LDO_EN_GPIO, 0); 
-       }       
-}
-#endif
-
-#if USE_FT6X36
-static const uint32_t touch_mfp_cfgs[] = {
-    MFP_REG(GPIO_13) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_NONE | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_REG(GPIO_14) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_NONE | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_EOC            /*End of configuration, must have */
-};
-
-static const uint32_t touch_mfp_cfgs_3601s[] = {
-    MFP_REG(GPIO_121) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_NONE | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_REG(GPIO_124) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_NONE | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_EOC            /*End of configuration, must have */
-};
-
-static const struct ft6x36_info tp_info = {
-    .irq_pin = GPIO13,
-    .rst_pin = GPIO14,
-    .i2c_addr = 0x38, /* 7-bit i2c addr */
-};
-
-static const struct ft6x36_info tp_info_3601s = {
-    .irq_pin = GPIO121,
-    .rst_pin = GPIO124,
-    .i2c_addr = 0x38, /* 7-bit i2c addr */
-};
-
-static void tp_init_ft6x36(void)
-{
-    lv_indev_drv_t indev_tp_drv;
-    const struct ft6x36_info *tp;
-    uint32_t *mfp;
-
-    if (isChip_3601S() || is_chip_3603()) {
-        mfp = (uint32_t *)&touch_mfp_cfgs_3601s;
-        tp = &tp_info_3601s;
-    } else {
-        mfp = (uint32_t *)&touch_mfp_cfgs;
-        tp = &tp_info;
-    }
-
-    mfp_config((uint32_t *)mfp);
-    /* power is enabled in lcd_init */
-    ft6x36_init(tp);
-    lv_indev_drv_init(&indev_tp_drv);
-    indev_tp_drv.type = LV_INDEV_TYPE_POINTER;
-    indev_tp_drv.read_cb = ft6x36_read;
-    lv_indev_drv_register(&indev_tp_drv);
-}
-#endif
-
-#if USE_BL6133
-static const uint32_t touch_bl6133_mfp_cfgs[] = {
-    MFP_REG(GPIO_82) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_REG(GPIO_83) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_EOC            /*End of configuration, must have */
-};
-
-static const struct bl6133_info tp_bl6133_info = {
-    .irq_pin = GPIO83,
-    .rst_pin = GPIO82,
-    .i2c_addr = 0x2d, /* 7-bit i2c addr */
-};
-
-static int tp_init_bl6133(void)
-{
-    int ret = 0;
-    lv_indev_drv_t indev_tp_drv;
-    const struct bl6133_info *tp;
-    uint32_t *mfp;
-//#if USE_W61_TP
-   int pm_type = pmic_get_type();
-   if(pm_type == PM_813)
-   {
-          Ningbo_Ldo_9_set_3_3();
-          Ningbo_Ldo_9_set(1);
-   }
-//#endif
-    mfp = (uint32_t *)&touch_bl6133_mfp_cfgs;
-    tp = &tp_bl6133_info;
-
-    mfp_config((uint32_t *)mfp);
-#if BL6133_TP_FW_UPDATE
-    bl6133_firmware_update();
-#endif
-
-    /* power is enabled in lcd_init */
-    ret = bl6133_init(tp);
-    if(ret != 0){
-        cplog_printf("bl6133 probe fail\n");
-        return ret;
-    }
-    lv_indev_drv_init(&indev_tp_drv);
-    indev_tp_drv.type = LV_INDEV_TYPE_POINTER;
-    indev_tp_drv.read_cb = bl6133_read;
-    lv_indev_drv_register(&indev_tp_drv);
-       cplog_printf("tp_init_bl6133 ret=%d\n",ret);
-    return ret;
-}
-#endif
-
-#if USE_STC820
-static const uint32_t touch_stc820_mfp_cfgs[] = {
-    MFP_REG(GPIO_82) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_REG(GPIO_83) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_EOC            /*End of configuration, must have */
-};
-
-static const struct stc820_info tp_stc820_info = {
-    .irq_pin = GPIO83,
-    .rst_pin = GPIO82,
-    .i2c_addr = 0x15, /* 7-bit i2c addr */
-};
-
-static int tp_init_stc820(void)
-{
-    int ret = 0;
-    lv_indev_drv_t indev_tp_drv;
-    const struct stc820_info *tp;
-    uint32_t *mfp;
-//#if USE_W61_TP
-   int pm_type = pmic_get_type();
-   if(pm_type == PM_813)
-   {
-          Ningbo_Ldo_9_set_3_3();
-          Ningbo_Ldo_9_set(1);
-   }
-//#endif
-    mfp = (uint32_t *)&touch_stc820_mfp_cfgs;
-    tp = &tp_stc820_info;
-
-    mfp_config((uint32_t *)mfp);
-
-
-    set_info(tp);
-#if STC820_TP_FW_UPDATE
-    ctp_hynitron_update();
-#endif
-/* power is enabled in lcd_init */
-    ret = stc820_init(tp);
-    if(ret != 0){
-        cplog_printf("stc820 probe fail\n");
-        return ret;
-    }
-    lv_indev_drv_init(&indev_tp_drv);
-    indev_tp_drv.type = LV_INDEV_TYPE_POINTER;
-    indev_tp_drv.read_cb = stc820_read;
-    lv_indev_drv_register(&indev_tp_drv);
-       cplog_printf("tp_init_stc820 ret=%d\n",ret);
-    return ret;
-}
-#endif
-
-#if USE_ZINITIX_TOUCH
-static void tp_init_zinitix(void)
-{
-    lv_indev_drv_t indev_tp_drv;
-
-    /* power is enabled in lcd_init */
-    zinitix_init();
-    lv_indev_drv_init(&indev_tp_drv);
-    indev_tp_drv.type = LV_INDEV_TYPE_POINTER;
-    indev_tp_drv.read_cb = zinitix_read;
-    lv_indev_drv_register(&indev_tp_drv);
-}
-#endif
-
-#if USE_CRANE_EVB_KEYPAD
-static const uint32_t keypad_mfp_cfgs[] = {
-    MFP_REG(GPIO_00) | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_REG(GPIO_01) | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_REG(GPIO_02) | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_REG(GPIO_03) | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_REG(GPIO_04) | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_REG(GPIO_05) | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_REG(GPIO_06) | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_REG(GPIO_07) | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_REG(GPIO_08) | MFP_AF2 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_REG(GPIO_09) | MFP_AF2 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_EOC /*End of configuration, must have */
-};
-
-lv_indev_t *keypad_dev;
-
-static uint32_t keypad_evb_cb(struct keypad_param *arg)
-{
-#if 0
-    if(arg->data.key == LV_KEY_END) {
-        if(arg->key_event == KEY_EVENT_CLICK) {
-            Hal_Lcd_Sleep();
-            uint32_t wake_up_flag = Hal_Pm_Suspend();
-
-            printf("pm wake up, wake_up_flag 0x%08x ################\n", wake_up_flag);
-            if(wake_up_flag & PM_RESUME_ALL) {
-                Hal_Pm_Resume();
-                Hal_Lcd_Wakeup();
-            }
-        }
-        return KEY_HANDLE_OVER;
-    }
-#endif
-    return KEY_HANDLE_CONT;
-}
-
-static void keypad_init_evb(void)
-{
-    lv_indev_drv_t indev_kp_drv;
-
-    mfp_config((uint32_t *)keypad_mfp_cfgs);
-    keypad_crane_evb_init(keypad_evb_cb);
-
-    lv_indev_drv_init(&indev_kp_drv);
-    indev_kp_drv.type = LV_INDEV_TYPE_KEYPAD;
-    indev_kp_drv.read_cb = keypad_crane_evb_read;
-    keypad_dev = lv_indev_drv_register(&indev_kp_drv);
-}
-#endif
-
-
-int pm_state_flag = -1;
-static uint8_t pm_state = PM_ON;
-#define OSA_SUSPEND             0xFFFFFFFF
-static int  sdk_c1_enter()
-{
-    if(pm_state == PM_ON)
-        return 1;
-    if(Hal_low_power_sleep_is_vetoed())
-        return 1;
-    
-    return 0;
-}
-
-static int  sdk_c1_exit()
-{
-    return 0;
-}
-
-static int sdk_d2_enter()
-{
-#if USE_CRANE_KEYPADC
-    keypad_clear_wakup_interrupt();
-#endif
-    if(pm_state == PM_ON) {
-        return 1;
-    }
-
-#if USE_BT_SENSOR_HUB != 0
-    SensorHub_int_gpio_d2_ent_callback();
-#endif
-
-#if USE_MY_XMOTION
-    xmotion_int_gpio_d2_ent_callback();
-#endif
-#if USE_FR8012HAQ
-
-    fr8012haq_int_gpio_d2_ent_callback();
-#endif
-#if USE_MULTI_KEY
-    multi_key_d2_enter();
-#endif
-
-    return 0;
-}
-
-static int sdk_d2_exit(BOOL ExitFromD2)
-{
-#if USE_BT_SENSOR_HUB != 0
-    SensorHub_int_gpio_d2_exit_callback();
-#endif
-
-#if USE_MY_XMOTION
-    xmotion_int_gpio_d2_exit_callback();
-#endif
-#if USE_FR8012HAQ
-    fr8012haq_int_gpio_d2_exit_callback();
-#endif
-#if USE_MULTI_KEY
-    multi_key_d2_exit();
-#endif
-
-    return 0;
-}
-
-static int sdk_uiSuspend(void)
-{
-    if(pm_state == PM_ON)
-        return 1;
-    if(Hal_low_power_sleep_is_vetoed())
-        return 1;
-
-    return 0;
-}
-
-void sys_pm_init(void)
-{
-    uart_printf("sys_pm_init~~\n");
-    mmiD2CallbackRegister((UINT32)sdk_d2_enter, (UINT32)sdk_d2_exit);
-    mmiC1CallbackRegister((UINT32)sdk_c1_enter, (UINT32)sdk_c1_exit);
-    mmiStatusCallbackRegister((UINT32)sdk_uiSuspend);
-}
-
-extern void pm_unlock(void);
-
-uint32_t sys_pm_set_state(int state)
-{
-    if(state == PM_ON) {
-        if(pm_state != state) {
-            board_sys_tick_start();
-            pm_state = state;
-        }
-
-        return 0;
-    } else {
-        if(pm_state != state) {
-            board_sys_tick_stop();
-            mdelay(20);
-            pm_state = state;
-        }
-
-        if(pm_state_flag == -1) {
-            pm_state_flag = uos_create_flag();
-        }
-
-        uint32_t flag = 0;
-        #if USE_ONKEY_HISR
-        extern int onkey_queue_empty(void);
-        if (!onkey_queue_empty()) {
-            flag = PM_RESUME_ONKEY;
-            uart_printf("gui resume: onkey queue NOT empty, onkey, flag: 0x%x ~~~ \n", flag);
-            pm_unlock();
-        } else
-        #endif
-        {
-            uart_printf("gui suspend: %d ~~~  \n", pm_state_flag);
-            pm_unlock();
-            if(uos_wait_flag(pm_state_flag, PM_RESUME_ALL, UOS_FLAG_OR_CLEAR, &flag, OSA_SUSPEND) == 0) {
-                uart_printf("gui resume: flag: 0x%x ~~~  \n", flag);
-            }
-        }
-
-        if(pm_state_flag != -1) {
-            int tmp = pm_state_flag;
-            pm_state_flag = -1;
-            uos_delete_flag(tmp);
-        }
-        return flag;
-    }
-}
-
-void sys_pm_wakeup(void)
-{
-    if(pm_state_flag!=-1)
-        uos_set_flag(pm_state_flag, PM_RESUME_UI, UOS_FLAG_OR);
-}
-
-#if 1//simware add
-void sys_pm_wakeup_no_lcd(void)
-{
-    if(pm_state_flag!=-1)
-        uos_set_flag(pm_state_flag, PM_RESUME_NO_LCD, UOS_FLAG_OR);
-}
-#endif
-
-#if USE_CRANE_EVB_KEYPAD
-#include "lv_drivers/indev/crane_keypadc.h"
-
-void normal_key_wakeup(uint32_t key)
-{
-    if(pm_state_flag != -1) {
-        if(key == KP_PWR) {
-            uos_set_flag(pm_state_flag, PM_RESUME_ENDKEY, UOS_FLAG_OR);
-        } else {
-            uos_set_flag(pm_state_flag, PM_RESUME_NORMALKEY, UOS_FLAG_OR);
-        }
-    }
-}
-
-void onkey_wakeup()
-{
-    if(pm_state_flag != -1) {
-        uos_set_flag(pm_state_flag, PM_RESUME_ONKEY, UOS_FLAG_OR);
-    }
-}
-#endif
-
-#if USE_CRANE_WATCH_KEYPAD
-#include "lv_watch/lv_watch.h"
-#include "lv_drivers/indev/crane_watch_keypad.h"
-uint8_t restarted_flag = false;
-
-void onkey_wakeup(void)
-{
-    if(pm_state_flag != -1) {
-        uos_set_flag(pm_state_flag, PM_RESUME_ONKEY, UOS_FLAG_OR);
-    }
-}
-
-static int prmode_enter_suspend = 0;
-
-static uint32_t prmode_suspend(void)
-{
-    uint32_t flag = 0;
-
-    printf("prmode suspend pm_state = %d~~~  \n", pm_state);
-    board_sys_tick_stop();
-    mdelay(20);
-    pm_state = PM_SUSPEND;
-
-    if(pm_state_flag == -1) {
-        pm_state_flag = uos_create_flag();
-    }
-
-    if(uos_wait_flag(pm_state_flag, PM_RESUME_ONKEY, UOS_FLAG_OR_CLEAR, &flag, OSA_SUSPEND) == 0) {
-        uart_printf("prmode resume: flag: 0x%x, pm_state = %d~~~  \n", flag, pm_state);
-        if(pm_state_flag != -1) {
-            int tmp = pm_state_flag;
-            pm_state_flag = -1;
-            uos_delete_flag(tmp);
-        }
-        board_sys_tick_start();
-        return flag;
-    } else {
-        printf("prmode_suspend: uos wait flag failed\n");
-        board_sys_tick_start();
-    }
-
-    return 0;
-}
-
-static void prmode_onkey_callback(void)
-{
-    int state = 0;
-    read_onkey(&state);
-
-    if((state == ONKEY_PRESSED)) {
-        printf("onkey callback prmode: %d, pm_state = %d,  pm_state_flag = %d\n",
-            state, pm_state, pm_state_flag);
-        if ((pm_state == PM_SUSPEND) && (pm_state_flag != -1)) {
-            printf("prmode resume\n");
-            uos_set_flag(pm_state_flag, PM_RESUME_ONKEY, UOS_FLAG_OR);
-            pm_state = PM_ON;
-        } else if (pm_state == PM_ON){
-            printf("prmode suspend\n");
-            prmode_enter_suspend = 1;
-        }
-    }
-
-}
-
-static void prmode_task(lv_task_t *task)
-{
-    printf("lvgl prmode task\n");
-    if (prmode_enter_suspend) {
-        prmode_enter_suspend = 0;
-        prmode_suspend();
-    }
-}
-
-static void prmode_pm_init(void)
-{
-    PM812_ONKEY_BIND_INTC(prmode_onkey_callback);
-    PM812_ONKEY_INTC_ENABLE(true);
-    lv_task_create(prmode_task, 1000, LV_TASK_PRIO_MID, NULL);
-}
-
-int is_in_poweroff_chg_mode(void)
-{
-    int ret = 0;
-    HAL_POWERUP_REASON reason = Hal_Powerup_Get_Reason();
-
-    if ((HAL_POWERUP_BAT == reason)||(HAL_POWERUP_USB == reason)) {
-        if (restarted_flag == false) {
-            ret = 1;
-        }
-    }
-
-    return ret;
-}
-
-static void keypad_watch_cb(struct keypad_param *arg)
-{
-    static bool set_lcd_only = false;
-
-    if(!watch_is_ready()) return;   // in start procedure
-
-       //printf("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, arg->data.key);
-       
-    if(arg->data.key == LV_KEY_END) 
-       {
-       #ifdef MMI_PROJECT_Z5_HA_K18_NFC
-               if(true == mmi_k18_nfc_experience_screen_active())
-               {
-                       return;
-               }
-       #endif
-
-        lv_obj_t * facau_obj = lv_watch_get_activity_obj(ACT_ID_FACTORY_MODE_AUTOTEST);
-        lv_obj_t * emht_obj = lv_watch_get_activity_obj(ACT_ID_ENGINEER_MODE_ITEM_HWT);
-        if(NULL != facau_obj) {
-            autotest_key_event(arg);
-        } else if(NULL != emht_obj) {
-            #if USE_LV_WATCH_ENGINEER_MODE!= 0
-            hardware_testing_key_event(arg);
-            #endif
-        } else {
-            if(arg->key_event == KEY_EVENT_CLICK) {
-                               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-                if(set_lcd_only) {
-                    set_lcd_only = false;
-                } else {
-                    if(lv_watch_is_activity_one_level()) {
-                        watch_suspend_by_key();
-                    } else {
-                        lv_watch_go_home();
-                    }
-                }
-            } else if(arg->key_event == KEY_EVENT_LONG_PRESS) {
-                set_lcd_only = false;
-                // sos
-                if(1 != is_in_poweroff_chg_mode()) {
-                                       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-                    //sos_btn_action(NULL);
-                               #ifdef __MMI_KEY_POWER_LONG_PRESS_SCREEN_SUPPORT__
-                                       mmi_key_power_long_press_action();
-                               #endif
-                }
-            } else if(arg->key_event == KEY_EVENT_POWER_ON) {
-                set_lcd_only = false;
-                if(restarted_flag) return;
-                HAL_POWERUP_REASON reason = Hal_Powerup_Get_Reason();
-                if(((HAL_POWERUP_BAT == reason)||(HAL_POWERUP_USB == reason))&&(0 != Hal_Battery_Get_Status())) {
-                    // from power off charging to power up
-                    restarted_flag = true;
-                                       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-                    watch_restart_req();
-                }
-            } else if(arg->key_event == KEY_EVENT_PRESS) {
-                               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-                if(!watch_get_lcd_status()) {
-                    watch_set_lcd_status(true);
-                    set_lcd_only = true;
-                }
-            }
-        }
-    } 
-       else if(arg->data.key == LV_KEY_ESC) 
-       {
-               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);
-        if(arg->key_event == KEY_EVENT_CLICK) {
-            lv_watch_go_back();
-        }
-    }
-}
-
-lv_indev_t *keypad_dev;
-
-static void keypad_init_watch(void)
-{
-    lv_indev_drv_t indev_kp_drv;
-    printf("keypad_init_watch\n");
-    keypad_watch_init(keypad_watch_cb);
-
-    lv_indev_drv_init(&indev_kp_drv);
-    indev_kp_drv.type = LV_INDEV_TYPE_KEYPAD;
-    indev_kp_drv.read_cb = keypad_watch_read;
-    keypad_dev = lv_indev_drv_register(&indev_kp_drv);
-}
-#endif
-
-#if USE_LV_PHONE != 0
-extern void phone_poweron_logo(void);
-extern void Ui_Phone_main(void);
-#endif
-
-static void show_poweron_logo(void)
-{
-    #if USE_LV_WATCH
-    watch_poweron_logo();
-    #endif
-
-    #if USE_LV_PHONE != 0
-    phone_poweron_logo();
-    #endif
-
-    lv_udelay(60 * 1000); /* wait for the logo display complete */
-    lcd_backlight(2);
-    lcd_backlight_valid();
-}
-
-static void gui_disp_wait(struct _disp_drv_t * disp_drv)
-{
-    (void)disp_drv;
-    uos_sleep(1);
-}
-
-#if USE_LV_WATCH_REFR_MONITOR_CB
-/** OPTIONAL: Called after every refresh cycle to tell the rendering and flushing time + the
- * number of flushed pixels */
-static void refr_monitor_cb(struct _disp_drv_t * disp_drv, uint32_t time, uint32_t px)
-{
-    (void)disp_drv;
-    printf("t: %u, pixel: %u\n", (unsigned)time, (unsigned)px);
-}
-#endif
-
-
-
-static int gui_init(void)
-{
-    lcd = lcd_init();
-    if (!lcd) {
-        printf("lcd init failed\n");
-        //return -1;
-    }
-    /*Create a display buffer*/
-    static lv_disp_buf_t disp_buf;
-    static lv_color_t buf1[LV_HOR_RES_MAX * LV_VER_RES_MAX];            /*A screen sized buffer*/
-    static lv_color_t buf2[LV_HOR_RES_MAX * LV_VER_RES_MAX];            /*An other screen sized buffer*/
-    //char *buf1 = lv_mem_aligned_alloc(LV_HOR_RES_MAX * LV_VER_RES_MAX * 2, 32);
-    //char *buf2 = lv_mem_aligned_alloc(LV_HOR_RES_MAX * LV_VER_RES_MAX * 2, 32);
-    lv_disp_buf_init(&disp_buf, buf1, buf2, LV_HOR_RES_MAX * LV_VER_RES_MAX);   /*Initialize the display buffer*/
-
-    /*Create a display*/
-    lv_disp_drv_t disp_drv;
-    lv_disp_drv_init(&disp_drv);            /*Basic initialization*/
-    disp_drv.buffer = &disp_buf;
-    disp_drv.hor_res = LV_HOR_RES_MAX;
-    disp_drv.ver_res = LV_VER_RES_MAX;
-    if(lcd) disp_drv.flush_cb = lcd->flush;
-    disp_drv.wait_cb = gui_disp_wait;
-#if USE_LV_WATCH_REFR_MONITOR_CB
-    disp_drv.monitor_cb = refr_monitor_cb;
-#endif
-    lcdc_set_disp(lv_disp_drv_register(&disp_drv));
-    return 0;
-}
-
-static void board_touch_init(void)
-{
-    static int tp_probe_state = -1;
-#if CONFIG_BOARD_SIMWARE_W61_V2
-    mfp_config((uint32_t *)touch_ldo_en_mfp_cfgs);     
-    tp_power_onoff(1);
-#elif CONFIG_BOARD_SIMWARE_W71 || CONFIG_BOARD_SIMWARE_A90 || CONFIG_BOARD_SIMWARE_A90SH || CONFIG_BOARD_SIMWARE_H81
-       int pm_type = pmic_get_type();
-
-    if (pm_type == PM_803) {
-        cplog_printf("board_touch_init 872\n");
-           GuilinLite_Ldo_8_set_3_0();
-               GuilinLite_Ldo_8_set(true);
-    }
-#endif
-#if USE_FT6X36
-    tp_init_ft6x36();
-#endif
-#if USE_BL6133
-    if(tp_probe_state != 0)
-       tp_probe_state = tp_init_bl6133();
-#endif
-#if USE_STC820
-    if(tp_probe_state != 0)
-       tp_probe_state = tp_init_stc820();
-#endif
-#if USE_ZINITIX_TOUCH
-    tp_init_zinitix();
-#endif
-    cplog_printf("tp_probe_state=%d\n",tp_probe_state);
-}
-
-static int board_init(void)
-{
-    pmic_init();
-    //setuartlogon();
-
-       board_touch_init();
-       
-    if (isSysRestartByRdProduction() == 0) {
-#if USE_CRANE_EVB_KEYPAD
-        keypad_init_evb();
-#endif
-#if USE_CRANE_WATCH_KEYPAD
-        keypad_init_watch();
-#endif
-    }
-
-    return 0;
-}
-
-void invalidate_dcache_range(unsigned long start, unsigned long stop)
-{
-    arch_invalidate_cache_range(start, (stop-start));
-}
-
-char * gcvt(double value, int32_t ndigit, char * buf)
-{
-    unsigned idx = 0;
-    unsigned digi_cnt = 0;
-    if(value < 0){
-        buf[0] = '-';
-        value = -value;
-        idx ++;
-    }
-
-    long int_part = (long)value;
-    double float_part = value - int_part;
-    snprintf(buf+idx, ndigit+1, "%ld", int_part);
-    digi_cnt = strlen(buf) - idx;
-
-    if((digi_cnt >= ndigit) || (float_part < 0.0000000001))
-        return buf;
-
-    idx = strlen(buf);
-    buf[idx++] = '.';
-
-    while(digi_cnt < ndigit) {
-        int_part = (int)(float_part * 10);
-        float_part = float_part * 10 - int_part;
-        buf[idx++] = '0' + int_part;
-        digi_cnt ++;
-        if(float_part < 0.0000000001) {
-            break;
-        }
-    }
-
-    buf[idx] = '\0';
-    return buf;
-}
-
-static lv_task_t * backlight_on_task;
-static void backlight_task(lv_task_t * task)
-{
-    if(!lv_refr_vdb_is_flushing()) {
-        lcd_backlight_valid_for_silent_reset();
-        lv_task_del(backlight_on_task);
-#if USE_LV_WATCH_DEMO != 0
-        watch_set_ready_state(true);
-#endif
-    }
-}
-
-//#if (USE_LV_WATCH_ALIPAY != 0) || (USE_LV_WATCH_SW_ALIPAY != 0)
-//extern bool do_upay_init(void);
-//static lv_task_t * upay_init_task = NULL;
-//static void upayinit_task(lv_task_t * param)
-//{
-//    if(do_upay_init()) {
-//        lv_task_del(upay_init_task);
-//        upay_init_task = NULL;
-//    }
-//}
-//#endif
-
-static void mmi_init(void)
-{
-    FS_PowerOn();
-}
-
-#if CONFIG_BOARD_SIMWARE_A90 || CONFIG_BOARD_SIMWARE_A90SH || CONFIG_BOARD_SIMWARE_H81
-const uint32_t bt_ldo_en_cfgs[] = {
-    MFP_REG(GPIO_34) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, //bt chip en
-    MFP_EOC                    /*End of configuration, must have */
-};
-
-const uint32_t hrm_ldo_en_cfgs[] = {
-    MFP_REG(GPIO_81) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /* hrm vio en */
-    MFP_REG(GPIO_84) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_NONE | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /* hrm rst */ 
-    MFP_REG(GPIO_32) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_NONE | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /* hrm int */
-#if CONFIG_BOARD_SIMWARE_H81
-    MFP_REG(GPIO_18) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /* HRM_DCDC_EN */
-#endif
-       MFP_EOC                 /*End of configuration, must have */
-};
-#endif
-
-#if USE_BT_SENSOR_HUB != 0
-static void SensorHub_init_timer_callback(void* param)
-{
-    SensorHub_device_check_cmd();
-    SensorHub_boot_bin_check_cmd();
-}
-#endif
-
-#ifdef MMI_PROJECT_Z5_HA_K18
-static int MATResponseCallback_0(TelAtParserID chnlId, const char* response, int size)
-{
-       cplog_printf("[@CHENG_DEBUG][%s][%d]: chnlId=%d,size=%d\n", __FUNCTION__, __LINE__, chnlId, size);
-       cplog_printf("[@CHENG_DEBUG][%d]: response=%s\n", __LINE__, response);
-       
-#if 0
-       MATRspParseRet ret;
-       MATReturnPara resp_return;
-
-       ret = MATHandleResponse(chnlId, response, size, &resp_return);
-       cplog_printf("[@CHENG_DEBUG][%s][%d]: ret=%d\n", __FUNCTION__, __LINE__, ret);
-       if (ret == MAT_RSP_PARSER_WAIT_FOR_TERMINAL)
-       {
-               return 0;
-       }
-       else if(ret == MAT_RSP_PARSER_OK)
-       {
-               //fatal_printf("SIMCardTest AT Response: resultCode = %d; cmd_type = %d; numItems = %d\n",
-               //                       resp_return.resultCode, resp_return.cmd_type, resp_return.numItems);
-       }
-
-       MATConfIndFree(&resp_return);
-#endif
-
-       return 0;
-}
-
-static int MATResponseCallback_1(TelAtParserID chnlId, const char* response, int size)
-{
-       cplog_printf("[@CHENG_DEBUG][%s][%d]: chnlId=%d,size=%d\n", __FUNCTION__, __LINE__, chnlId, size);
-       cplog_printf("[@CHENG_DEBUG][%d]: response=%s\n", __LINE__, response);
-
-       return 0;
-}
-
-static void mmi_at_grip_action(void)
-{
-       char const * command_str0 = "AT*GRIP=2,5,2,3\r\n";
-       //if (IsAtCmdSrvReady())
-       cplog_printf("[@CHENG_DEBUG][%s][%d]: %s\n", __FUNCTION__, __LINE__, command_str0);
-       //MATSetConfIndCB(TEL_AT_CMD_ATP_6, MATResponseCallback_0);
-       ATRecv(TEL_AT_CMD_ATP_6, (void*)command_str0, strlen(command_str0));
-
-
-       char const * command_str1 = "AT*GRIP=2,5,2,5\r\n";
-       cplog_printf("[@CHENG_DEBUG][%s][%d]: %s\n", __FUNCTION__, __LINE__, command_str1);
-       //MATSetConfIndCB(TEL_AT_CMD_ATP_6, MATResponseCallback_1);
-       ATRecv(TEL_AT_CMD_ATP_6, (void*)command_str1, strlen(command_str1));
-}
-#endif
-
-extern void dm_init();
-static void gui_main(void *param)
-{
-    int silent_reset = startup_silent_reset();
-    board_init();
-    mmi_init(); /* some API from mmi, such as from mci_audio.cpp, depends on it */
-    board_sys_tick_init(5, lv_tick_inc); /* update tick every 5 ms */
-    Hal_Init();
-    
-#if CONFIG_BOARD_SIMWARE_A90 || CONFIG_BOARD_SIMWARE_A90SH || CONFIG_BOARD_SIMWARE_H81
-    mfp_config((uint32_t *)bt_ldo_en_cfgs);
-    mfp_config((uint32_t *)hrm_ldo_en_cfgs);
-    //bt ldo en
-    gpio_set_direction(GPIO34, GPIO_OUT);
-    gpio_set_value(GPIO34, 1);
-    //hmr ldo en
-    gpio_set_direction(GPIO81, GPIO_OUT);
-    gpio_set_value(GPIO81, 1);
-    gpio_set_direction(GPIO84, GPIO_IN);
-    gpio_set_direction(GPIO32, GPIO_IN);
-#if CONFIG_BOARD_SIMWARE_H81
-    gpio_set_direction(GPIO18, GPIO_OUT);
-    gpio_set_value(GPIO18, 1);
-#else
-    //2.4G UM3204 power
-    GuilinLite_Ldo_7_set_1_8();
-    GuilinLite_Ldo_7_set(TRUE);
-#endif
-#endif
-
-    if (isSysRestartByRdProduction() == 0) {
-        if(0 == silent_reset) {
-            show_poweron_logo();  //show logo if not silent reset
-        }
-#if USE_LV_WATCH_DEMO != 0
-        watch_power_on_req();
-#else
-        Ui_Phone_main();
-#endif
-        if(silent_reset) {
-            backlight_on_task = lv_task_create(backlight_task, 30, LV_TASK_PRIO_MID, NULL);
-        }
-    } else {
-        Ril_Init_Crane(0);
-        #if USE_CRANE_WATCH_KEYPAD
-        prmode_pm_init();
-        #endif
-    }
-//#if (USE_LV_WATCH_ALIPAY != 0) || (USE_LV_WATCH_SW_ALIPAY != 0)
-//    if(NULL == upay_init_task) {
-//        upay_init_task = lv_task_create(upayinit_task, 150, LV_TASK_PRIO_MID, NULL);
-//    }
-//#endif
-
-    app_sensor_task_init();
-    
-    i2c_initialize(I2C_MASTER_CI2C1);
-
-#if USE_BT_SENSOR_HUB != 0
-    hal_SensorHub_adaptor_init();
-    SensorHub_reboot_cmd();
-    Hal_Timer_Start(2000, SensorHub_init_timer_callback, NULL, FALSE);
-#endif
-
-#if USE_GPS
-       hal_gps_adaptor_init();
-#endif
-
-#if USE_SI24RX
-    si24rx_init();
-    //si24rx_test();
-#endif
-
-#if USE_CT1711
-    Ct1711_my_init();
-#endif
-
-#if USE_MULTI_KEY
-    multi_key_mfp_init();
-
-#endif
-
-#if USE_SOS_KEY
-    sos_key_mfp_init();
-#endif
-
-#if USE_MY_XMOTION
-    xMotion_my_init();
-#endif
-
-#if USE_GH3018
-    gh3018_init();
-#endif
-#if USE_HX3918
-    Hx3918_Init();
-#endif
-#if USE_FR8012HAQ
-    Fr8012haq_Init();
-#endif
-#if USE_WMM300
-    Wmm300_Init();
-#endif
-#if USE_ACNT180
-    hal_acnt180_init();
-#elif USE_ACNT117
-    hal_acnt117_init();
-#endif
-
-#ifdef MMI_PROJECT_Z5_HA_K18
-       mmi_at_grip_action();
-#endif
-
-#if USE_DS_DM
-    cplog_printf("dm_init()!!!!!!!!!\n");
-    dm_init();
-#endif
-    is_phase1 = 0;
-    while(1) {
-        lv_task_handler();
-        uos_sleep(1); /* 1 os tick == 5 ms */
-    }
-
-}
-
-extern void set_sdcard_power_gpio(uint8_t num);
-
-#if CONFIG_BOARD_SIMWARE_W61_V2
-#define GPIO_EXT_PA    GPIO34
-static const uint32_t extpa803_mfp_cfgs[] = {
-    MFP_REG(GPIO_34) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW| MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_EOC            /*End of configuration, must have */
-};
-#elif CONFIG_BOARD_SIMWARE_W71 || CONFIG_BOARD_SIMWARE_A90 || CONFIG_BOARD_SIMWARE_A90SH || CONFIG_BOARD_SIMWARE_H81
-#define GPIO_EXT_PA    GPIO28
-static const uint32_t extpa803_mfp_cfgs[] = {
-    MFP_REG(GPIO_28) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW| MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_EOC            /*End of configuration, must have */
-};
-#else
-#define GPIO_EXT_PA    GPIO75
-static const uint32_t extpa803_mfp_cfgs[] = {
-    MFP_REG(GPIO_75) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW| MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,
-    MFP_EOC            /*End of configuration, must have */
-};
-#endif
-static void speaker_extpa_init(void)
-{
-    gpio_set_direction(GPIO_EXT_PA, GPIO_OUT);
-    gpio_output_set(GPIO_EXT_PA, 0);
-
-    mfp_config(extpa803_mfp_cfgs);
-    //cplog_printf("speaker_extpa_init \n");
-}
-static void speaker_extpa_enable(uint32_t on)
-{
-    int i = 0;
-    volatile int j = 0;
-    cplog_printf("speaker_extpa_enable : %d\n", on);
-    if(0 == on) {
-        gpio_output_set(GPIO_EXT_PA, 0);
-    } else {
-        for (i = 0; i < on; ++i) {
-            gpio_output_set(GPIO_EXT_PA, 0);
-            lv_udelay(1);
-            gpio_output_set(GPIO_EXT_PA, 1);
-            lv_udelay(1);
-        }
-    }
-}
-
-static uint8_t boot_flag = 0;
-
-uint8_t boot_flag_get(void)
-{
-    return boot_flag;
-}
-
-void boot_flag_set(uint8_t value)
-{
-    pmic_user_defined_flags_set(value);
-}
-
-int ui_init_phase1(void)
-{
-    extern void ui_log_init(void);
-    ui_log_init();
-
-    boot_flag = pmic_user_defined_flags_get();
-    pmic_user_defined_flags_set(0);
-
-    lv_init();
-    lv_pm_init();
-    is_phase1 = 1;
-    if (isSysRestartByRdProduction() == 0) {
-        timer_enable(); /* for mdelay */
-        gui_init();
-        timer_disable();
-    }
-
-    if(pmic_get_type() == PM_803) {
-        set_sdcard_power_gpio(70);
-
-        speaker_extpa_init();
-        AudioHAL_AifBindSpeakerPA_CB(speaker_extpa_enable);
-    }
-    return 0;
-}
-
-
-int ui_init_phase2(void)
-{
-#ifdef __CHENG_DEBUG__
-       extern void set_uart_dev_diag(void);
-
-       set_uart_dev_diag();
-#endif
-
-    if(lv_refr_vdb_is_flushing()) {
-        printf("Error: power on logo flush failed!!\n");
-    }
-    uos_init();
-#if USE_LV_ROM_FS
-    lv_romfs_init(1);
-#endif
-    //gui_task_id = uos_create_task(gui_main, NULL, 64, 0x4000, GUI_TASK_PRIORITY, "gui_task");
-    gui_task_id = uos_create_task(gui_main, NULL, 64, 0x8000, GUI_TASK_PRIORITY, "gui_task");
-    printf("gui task %d,  queue id %d\n", gui_task_id, gui_task_id->nMailBoxId);
-    return 0;
-}
-
-int test_backlight_on(void)
-{
-    printf("real test_backlight_on\n");
-    if (lcd == NULL) {
-        printf("init LCD\n");
-        gui_init();
-    }
-
-    lcd_backlight(2);
-    lcd_backlight_valid();
-
-    return 1;
-}
-
-int test_backlight_off(void)
-{
-    static lv_task_t * suspend_task = NULL;
-//    extern Usb_PlugCallback Send_usb_status;
-//    Send_usb_status = NULL;
-
-    watch_set_lcd_status(false);
-    if (NULL == suspend_task) {
-        suspend_task = lv_task_create(watch_suspend, 200, LV_TASK_PRIO_HIGH, (void *)WATCH_SUSPEND_KEY);
-    }
-    return 1;
-}
-
-void test_gui_init(void)
-{
-    if (lcd == NULL) {
-        printf("init LCD\n");
-        gui_init();
-    }
-}
-
-int test_watch_lcd(void)
-{
-    int i = 0;
-
-    printf("real test_watch_lcd\n");
-    if (lcd == NULL) {
-        printf("init LCD\n");
-        gui_init();
-    }
-    show_poweron_logo();
-
-    for (i = 0; i < ARRAY_SIZE(panels); ++i) {
-        unsigned panel_id = 0;
-
-        if (panels[i]->readid(&panel_id) == 0) {
-            printf("LCD%d Read Display ID = 0x%X\n", i, panel_id);
-            //#ZC@20210616 skip
-            if (panel_id == 0x9a01 || panel_id == 0x858552) {
-                return 1;
-            }
-        }
-    }
-
-    return 0;
-}
-
-//set fotadm tcp server ip
-char* get_fotadm_tcp_server_ip()
-{
-       return "sob-net-web-public-1256182135.cos.ap-chongqing.myqcloud.com";
-}
-//set fotadm version
-char* get_fotadm_version()
-{
-       return "K7.01";
-}
-//set fota debug log
-bool is_debug_fota()
-{
-       return false;
-}
-//get fota server port
-int get_adups_tcp_server_port()
-{
-    return 80;
-}
-//get fota json path
-char * get_fotadm_json_path(void)
-{
-    return "/otatest/update.json";
-}
-// #ifdef    __cplusplus
-// extern "C" {
-    
-// #endif
-// #ifdef    __cplusplus
-// }
-// #endif
-static int sATPInd = TEL_AT_CMD_ATP_5;
-//#include "framework/hal/hwtest/hwtest/hwtest.h"
-char AT_read_data[200] = {0};
-int AT_read_data_len = 0;
-void at_delay(uint32_t ms)
-{
-       uos_sleep(ms/5);
-    //DelayInUs(ms*1000);
-}
-static int HandleATitem32CARDIDCallback(TelAtParserID chnlId, const char* response, int size)
-{
-       // MATRspParseRet ret;
-       // MATReturnPara resp_return;
-    cplog_printf("HandleATResponseCallback!!!!!!!!!!!!!! \n");
-    cplog_printf("SIMCardTest1: size:%d response = %s\n", size,response);
-       //ASSERT(chnlId == sATPInd);
-    if(AT_read_data_len + size>sizeof(AT_read_data))
-    {
-        size = sizeof(AT_read_data)-AT_read_data_len;
-    }
-    memcpy(&AT_read_data[AT_read_data_len],response,size);
-    AT_read_data_len += size;
-       cplog_printf("SIMCardTest2: size:%d response = %s\n", size,response);
-
-       return 0;
-}
-//#include "hop/telephony/atcmdsrv/inc/teldef.h"
-//SendATCMDWaitResp(AT_channel, at_str, 150, "+EPIN",1,"+CME ERROR", resp_str, sizeof(resp_str));
-int item32_CARDID_write(char * data)
-{
-    int err=0;
-    char read_cmddata[201]={0};
-    char cmdString[201] = {0};
-    char *cmd_str  ;
-    
-       at_delay(100);
-    cplog_printf("item32_CARDID_write:IsAtCmdSrvReady:%d \n",IsAtCmdSrvReady());
-    MATSetConfIndCB(sATPInd, HandleATitem32CARDIDCallback);
-    AT_read_data_len = 0;
-    memset(AT_read_data,0,sizeof(AT_read_data));
-    cplog_printf("item32_CARDID_write:IsAtCmdSrvReady:%d \n",IsAtCmdSrvReady());
-    ATRecv(sATPInd, (void*)"AT+CFUN=0\r\n", strlen(cmd_str));
-    cplog_printf("item32_CARDID_write1.2:sATPInd:%d \n",sATPInd);
-    int t_count = 70;
-    while (t_count--)
-    {
-        at_delay(5);
-        if(strstr(AT_read_data,"ok"))
-        {   
-            cplog_printf("AT_read_data:%s",AT_read_data);
-            break;
-        }
-            
-    }   
-    cplog_printf("item32_CARDID_write2:sATPInd:%d \n",sATPInd);
-
-    //cmd_str = "AT*PROD=1\r\n";
-
-    AT_read_data_len = 0;
-    memset(AT_read_data,0,sizeof(AT_read_data));
-    cplog_printf("item32_CARDID_write:IsAtCmdSrvReady:%d \n",IsAtCmdSrvReady());
-       ATRecv(sATPInd, (void*)"AT*PROD=1\r\n", strlen(cmd_str));
-    t_count = 70;
-    while (t_count--)
-    {
-        at_delay(5);
-        if(strstr(AT_read_data,"ok"))
-            break;
-    }
-
-
-    AT_read_data_len = 0;
-    memset(AT_read_data,0,sizeof(AT_read_data));
-    cplog_printf("item32_CARDID_write:IsAtCmdSrvReady:%d \n",IsAtCmdSrvReady());
-       ATRecv(sATPInd, (void*)"AT+CFUN=?\r\n", strlen(cmd_str));
-    t_count = 70;
-    while (t_count--)
-    {
-        at_delay(5);
-        if(strstr(AT_read_data,"ok"))
-            break;
-    }
-
-    snprintf(cmdString,200,"AT*MRD_ITEM32=W,CARDID,0101,12NOV2010,%s\r\n",data);
-    cplog_printf("item32_CARDID_write3:cmdString:%s \n",cmdString);
-    AT_read_data_len = 0;
-    memset(AT_read_data,0,sizeof(AT_read_data));
-    cplog_printf("item32_CARDID_write:IsAtCmdSrvReady:%d \n",IsAtCmdSrvReady());
-    ATRecv(sATPInd, (void*)cmdString, strlen(cmdString));
-    t_count = 70;
-    while (t_count--)
-    {
-        at_delay(5);
-        if(strstr(AT_read_data,"ok"))
-            break;
-    }
-    cplog_printf("t_count:%d",t_count);
-
-
-    cplog_printf("item32_CARDID_write4:sATPInd:%d \n",sATPInd);
-    //cmd_str = "AT*PROD=0\r\n";
-    AT_read_data_len = 0;
-    memset(AT_read_data,0,sizeof(AT_read_data));
-    cplog_printf("item32_CARDID_write:IsAtCmdSrvReady:%d \n",IsAtCmdSrvReady());
-    ATRecv(sATPInd, (void*)"AT*PROD=0\r\n", strlen(cmd_str));
-    t_count = 70;
-    while (t_count--)
-    {
-        at_delay(5);
-        if(strstr(AT_read_data,"ok"))
-            break;
-    }
-
-
-    cplog_printf("item32_CARDID_write5:sATPInd:%d \n",sATPInd);
-    //cmd_str = "AT+CFUN=1\r\n";
-    AT_read_data_len = 0;
-    memset(AT_read_data,0,sizeof(AT_read_data));
-    cplog_printf("item32_CARDID_write:IsAtCmdSrvReady:%d \n",IsAtCmdSrvReady());
-    ATRecv(sATPInd, (void*)"AT+CFUN=1\r\n", strlen(cmd_str));
-    cplog_printf("item32_CARDID_write6:sATPInd:%d \n",sATPInd);
-    t_count = 70;
-    while (t_count--)
-    {
-        at_delay(5);
-        if(strstr(AT_read_data,"ok"))
-            break;
-    }
-    
-
-error:
-    
-    return err;
-}
-int tem32_CARDID_read(char * data,int data_MAX_len)
-{
-    int err=0;
-    
-    char *cmd_str = "AT*MRD_ITEM32=R, CARDID\r\n";
-    cplog_printf("tem32_CARDID_read1:sATPInd:%d \n",sATPInd);
-    AT_read_data_len = 0;
-    memset(AT_read_data,0,sizeof(AT_read_data));
-
-    cplog_printf("tem32_CARDID_read1.1:sATPInd:%d \n",sATPInd);
-    MATSetConfIndCB(sATPInd, HandleATitem32CARDIDCallback);
-    cplog_printf("tem32_CARDID_read1.2:sATPInd:%d \n",sATPInd);
-    ATRecv(sATPInd, (void*)cmd_str, strlen(cmd_str));
-
-    int t_count = 100;
-    while (t_count--)
-    {
-        at_delay(5);
-        if(strstr(AT_read_data,"ok"))
-            break;
-    }
-    
-    cplog_printf("tem32_CARDID_read1:err:%d str:%s\n",err,AT_read_data);
-    if(AT_read_data == 0 )
-        goto error;
-    char *data_tmp=AT_read_data;
-    int count_flag = 0;
-    while(*data_tmp)
-    {
-        if(*data_tmp == ',')
-        {
-            count_flag++;
-            if(count_flag>=3)
-            {
-                strncpy(data,data_tmp+1,data_MAX_len);
-            }
-        }
-        
-        data_tmp++;
-    }
-error:
-    
-    return err;
-}
-#include "factory_mode.c"
-
-
-void mmi_at_antenna_coupling_test_start(void)
-{
-       char const * command_str0 = "AT+CFUN=0\r\n";
-       //if (IsAtCmdSrvReady())
-       ATRecv(TEL_AT_CMD_ATP_6, (void*)command_str0, strlen(command_str0));
-
-       char const * command_str1 = "AT+LTEPOWER=0,8,0\r\n";
-       ATRecv(TEL_AT_CMD_ATP_6, (void*)command_str1, strlen(command_str1));
-}
-
-void mmi_at_antenna_coupling_test_stop(void)
-{
-       char const * command_str0 = "AT+LTEPOWER=0,1,9\r\n";
-       //if (IsAtCmdSrvReady())
-       ATRecv(TEL_AT_CMD_ATP_6, (void*)command_str0, strlen(command_str0));
-
-       char const * command_str1 = "AT+CFUN=1\r\n";
-       ATRecv(TEL_AT_CMD_ATP_6, (void*)command_str1, strlen(command_str1));
-}
-
-
-#endif
-
+#if 1\r
+#include <stdio.h>\r
+#include "lvgl.h"\r
+#include "lv_drivers/display/crane_lcdc.h"\r
+#include "lv_drivers/display/st7789v_spi.h"\r
+#include "lv_drivers/display/st7789v_mcu.h"\r
+#include "lv_drivers/display/st7735s_spi.h"\r
+#include "lv_drivers/display/st7567_spi.h"\r
+#include "lv_drivers/display/rm69330_mipi.h"\r
+#include "lv_drivers/display/icna3310_mipi.h"\r
+#include "lv_drivers/display/co5300_mipi.h"\r
+#include "lv_drivers/display/ili9806e_mipi.h"\r
+#include "lv_drivers/display/gc9a01_spi.h"\r
+#include "lv_drivers/indev/ft6x36.h"\r
+#include "lv_drivers/indev/bl6133.h"\r
+#include "lv_drivers/indev/stc820.h"\r
+#include "lv_drivers/indev/tpfw.h"\r
+#include "lv_drivers/indev/crane_keypadc.h"\r
+#include "lv_drivers/indev/zinitix.h"\r
+#include "lv_drivers/indev/CT1711.h"\r
+#include "lv_drivers/indev/si24rx/si24rx.h"\r
+#include "lv_drivers/indev/si24rx/si24rx_drv.h"\r
+#include "lv_drivers/indev/my_xMotion.h"\r
+#include "lv_drivers/common/backlight.h"\r
+#include "lv_drivers/common/lv_pm.h"\r
+#include "lv_drivers/common/i2c.h"\r
+#include "board.h"\r
+#include "ril/ril.h"\r
+#include "lvgl/hal/hal.h"\r
+#include "lv_drivers/indev/crane_evb_keypad.h"\r
+#include "lvgl/src/lv_misc/lv_romfs.h"\r
+#include "lv_drivers/display/st9a01_spi.h"\r
+#include "lv_drivers/display/gc9c01_3_2_spi.h"\r
+#include "lv_drivers/display/gc9307_spi.h"\r
+#include "lv_drivers/display/st7789v2_spi.h"\r
+#if USE_MULTI_KEY\r
+#include "lv_drivers/indev/multi_key.h"\r
+#endif\r
+#if USE_GH3018\r
+#include "lv_drivers/indev/gh3018.h"\r
+#endif\r
+#if USE_HX3918\r
+#include "lv_drivers/indev/HX3918/hx3918.h"\r
+#endif\r
+#if USE_FR8012HAQ\r
+#include "lv_drivers/indev/FR8012HAQ/fr8012haq.h"\r
+#endif\r
+#if USE_WMM300\r
+#include "lv_drivers/indev/WMM300/whale_algo.h"\r
+#endif\r
+#if USE_ACNT180\r
+#include "lv_drivers/indev/ACNT180.h"\r
+#elif USE_ACNT117\r
+#include "lv_drivers/indev/ACNT117.h"\r
+#endif\r
+#if USE_SOS_KEY\r
+#include "lv_drivers/indev/sos_key.h"\r
+#endif\r
+unsigned is_phase1 = 1;\r
+\r
+//Simware begin\r
+extern void gpio_set_value(unsigned int  gpio,unsigned int  value);\r
+#if USE_BT_SENSOR_HUB != 0\r
+extern int SensorHub_int_gpio_d2_ent_callback(void);\r
+extern int SensorHub_int_gpio_d2_exit_callback(void);\r
+extern void hal_SensorHub_adaptor_init(void);\r
+#endif\r
+//Simware end\r
+#if USE_SDK_API\r
+/* override SDK config */\r
+unsigned int g_asrlcd_framebuffer[0];\r
+unsigned char mmiPool[SDK_MMI_POOL_SIZE];\r
+const unsigned int mmiPoolSize = SDK_MMI_POOL_SIZE;\r
+#endif\r
+\r
+#define GUI_TASK_PRIORITY    200\r
+TASK_HANDLE *gui_task_id;\r
+/*supported panels */\r
+static struct crane_panel_t *panels[] = {\r
+#if 1\r
+#if USE_LCD_PANEL_ST7735S_SPI_POC\r
+    &st7735s_spi,\r
+#elif USE_LCD_PANEL_ST7567_SPI_4WIRE_1LANE_1IF\r
+    &st7567_spi,\r
+#elif USE_LCD_PANEL_ST7789V_MCU\r
+    &st7789v_mcu,\r
+#elif USE_LCD_PANEL_RM69330_MIPI\r
+    &rm69330_mipi,\r
+#elif USE_LCD_PANEL_ICNA3310_MIPI\r
+    &icna3310_mipi,\r
+#elif USE_LCD_PANEL_CO5300_MIPI\r
+    &co5300_mipi,\r
+#elif USE_LCD_PANEL_ILI9806E_MIPI\r
+    &ili9806e_mipi,\r
+//#else\r
+    //&st7789v_spi,\r
+#endif\r
+#endif\r
+\r
+#if USE_LCD_PANEL_GC9A01_SPI_WATCH\r
+    &gc9a01_spi,\r
+#endif\r
+#if USE_LCD_PANEL_ST9A01_4_1_SPI_POC\r
+    &st9a01_spi,\r
+#endif\r
+#if USE_LCD_PANEL_GC9C01_3_2_SPI_POC\r
+    &gc9c01_3_2_spi,\r
+#endif\r
+#if USE_LCD_PANEL_GC9307_4_1_SPI_POC\r
+    &gc9307_spi,\r
+#endif\r
+#if USE_LCD_PANEL_ST7789V2_SPI_WATCH\r
+    &st7789v2_spi,\r
+#endif\r
+};\r
+\r
+#if USE_LCD_PANEL_ST7789V_SPI_WATCH\r
+static uint32_t lcd_watch_mfp_cfgs[] = {\r
+    MFP_REG(GPIO_20) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DCLK */\r
+    MFP_REG(GPIO_21) | MFP_AF0 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS1 */\r
+    MFP_REG(GPIO_22) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS0 */\r
+    MFP_REG(GPIO_23) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DOUT */\r
+    MFP_REG(GPIO_24) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DIN0 */\r
+    MFP_REG(GPIO_25) | MFP_AF2 | MFP_PULL_LOW  | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* VSYNC */\r
+    MFP_REG(GPIO_26) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SMPN_RST */\r
+    MFP_EOC\r
+};\r
+\r
+static struct lcd_info_t lcd_info = {\r
+    .mfp = (uint32_t *)lcd_watch_mfp_cfgs,\r
+    .clk = 312000, /* 104000 */\r
+};\r
+#endif\r
+\r
+#if USE_LCD_PANEL_ST7789V_SPI_PHONE\r
+static uint32_t lcd_mfp_cfgs[] = {\r
+    MFP_REG(GPIO_20) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DCLK */\r
+    MFP_REG(GPIO_21) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS1 */\r
+    MFP_REG(GPIO_22) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS0 */\r
+    MFP_REG(GPIO_23) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DOUT */\r
+    MFP_REG(GPIO_24) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DIN0 */\r
+    MFP_REG(GPIO_25) | MFP_AF2 | MFP_PULL_LOW  | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* VSYNC */\r
+    MFP_REG(GPIO_26) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SMPN_RST */\r
+    MFP_REG(GPIO_27) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE,\r
+    MFP_REG(GPIO_69_TDS_DIO2) | MFP_AF0 | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE,\r
+    MFP_EOC\r
+};\r
+\r
+static struct lcd_info_t lcd_info = {\r
+    .mfp = (uint32_t *)lcd_mfp_cfgs,\r
+    .clk = 312000, /* 104000 */\r
+};\r
+#endif\r
+\r
+#if USE_LCD_PANEL_ST7789V_MCU\r
+static uint32_t lcd_mfp_cfgs[] = {\r
+    MFP_REG(GPIO_22) | MFP_AF6 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*CS0*/\r
+    MFP_REG(GPIO_26) | MFP_AF6 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*RST*/\r
+    MFP_REG(GPIO_20) | MFP_AF6 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DB0*/\r
+    MFP_REG(GPIO_31) | MFP_AF3 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DB1*/\r
+    MFP_REG(GPIO_32) | MFP_AF3 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DB2*/\r
+    MFP_REG(GPIO_121) | MFP_AF3 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DB3*/\r
+    MFP_REG(GPIO_124) | MFP_AF3 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DB4*/\r
+    MFP_REG(GPIO_21) | MFP_AF6 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DB5*/\r
+    MFP_REG(GPIO_27) | MFP_AF6 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DB6*/\r
+    MFP_REG(GPIO_28) | MFP_AF6 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DB7*/\r
+    MFP_REG(GPIO_23) | MFP_AF6 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*RDB*/\r
+    MFP_REG(GPIO_24) | MFP_AF6 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*WRB*/\r
+#if USE_LCD_MCU_DCX_GPIO\r
+    MFP_REG(GPIO_81) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DCX*/\r
+#else\r
+    MFP_REG(GPIO_SLAVE_RESET_OUT_N) | MFP_AF5 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*DCX*/\r
+#endif\r
+#if LCD_TE_ENABLE\r
+    MFP_REG(GPIO_25) | MFP_AF6 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*TE*/\r
+#endif\r
+    MFP_EOC\r
+};\r
+\r
+struct lcd_info_t lcd_info = {\r
+    .mfp = (uint32_t *)lcd_mfp_cfgs,\r
+    .clk = 52000, /* 52000 */\r
+};\r
+#endif\r
+\r
+\r
+#if USE_LCD_PANEL_ST7735S_SPI_POC\r
+static uint32_t lcd_poc_mfp_cfgs[] = {\r
+    MFP_REG(GPIO_20) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DCLK */\r
+    MFP_REG(GPIO_27) | MFP_AF0 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS1 */\r
+    MFP_REG(GPIO_22) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS0 */\r
+    MFP_REG(GPIO_23) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DOUT */\r
+    MFP_REG(GPIO_24) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DIN0 */\r
+    MFP_REG(GPIO_25) | MFP_AF2 | MFP_PULL_LOW  | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* VSYNC */\r
+    MFP_REG(GPIO_26) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SMPN_RST */\r
+    MFP_EOC\r
+};\r
+\r
+static struct lcd_info_t lcd_info = {\r
+    .mfp = (uint32_t *)lcd_poc_mfp_cfgs,\r
+    .clk = 104000, /* 104000 */\r
+};\r
+#endif\r
+\r
+#if USE_LCD_PANEL_ST7567_SPI_4WIRE_1LANE_1IF\r
+static uint32_t lcd_poc_mfp_cfgs[] = {\r
+    MFP_REG(GPIO_20) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DCLK */\r
+    MFP_REG(GPIO_21) | MFP_AF0 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS1 */\r
+    MFP_REG(GPIO_22) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS0 */\r
+    MFP_REG(GPIO_23) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DOUT */\r
+    MFP_REG(GPIO_24) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DIN0 */\r
+    //MFP_REG(GPIO_25) | MFP_AF2 | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* VSYNC */\r
+    MFP_REG(GPIO_26) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SMPN_RST */\r
+    MFP_EOC\r
+};\r
+\r
+static struct lcd_info_t lcd_info = {\r
+    .mfp = (uint32_t *)lcd_poc_mfp_cfgs,\r
+    .clk = 104000, /* 104000 */\r
+};\r
+#endif\r
+\r
+#if USE_LCD_PANEL_GC9C01_3_2_SPI_POC\r
+static uint32_t lcd_watch_mfp_spi_3_2_cfgs[] = {\r
+    MFP_REG(GPIO_20) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DCLK */\r
+    MFP_REG(GPIO_21) | MFP_AF3 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS1 */\r
+    MFP_REG(GPIO_22) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS0 */\r
+    //MFP_REG(GPIO_23) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DOUT */\r
+    MFP_REG(GPIO_24) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DIN0 */\r
+    MFP_REG(GPIO_25) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* VSYNC */\r
+    MFP_REG(GPIO_26) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SMPN_RST */\r
+    //MFP_REG(GPIO_27) | MFP_AF0 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DIN1 */\r
+    MFP_EOC\r
+};\r
+\r
+static struct lcd_info_t gc9c01_lcd_spi_3_2_info =\r
+{\r
+    .mfp = (uint32_t *)lcd_watch_mfp_spi_3_2_cfgs,\r
+    .clk = 312000, /* 104000 */\r
+};\r
+#endif\r
+\r
+#if  USE_LCD_PANEL_ST9A01_4_1_SPI_POC || USE_LCD_PANEL_GC9307_4_1_SPI_POC || USE_LCD_PANEL_ST7789V2_SPI_WATCH\r
+\r
+static uint32_t lcd_poc_mfp_spi_4_1_cfgs[] = {\r
+    MFP_REG(GPIO_20) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DCLK */\r
+    MFP_REG(GPIO_21) | MFP_AF0 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS1 */\r
+    MFP_REG(GPIO_22) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS0 */\r
+    MFP_REG(GPIO_23) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DOUT */\r
+    MFP_REG(GPIO_24) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DIN0 */\r
+    MFP_REG(GPIO_25) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* VSYNC */\r
+    MFP_REG(GPIO_26) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SMPN_RST */\r
+    MFP_EOC\r
+};\r
+#endif\r
+#if DRV_PROJECT_Z5_K7 || DRV_PROJECT_Z5_K7_EN || USE_LCD_PANEL_GC9A01_SPI_WATCH|| DRV_PROJECT_Z5_I7 || DRV_PROJECT_Z5_HA_K7 || DRV_PROJECT_Z5_Z11 || DRV_PROJECT_Z5_Z11_2 \\r
+       || DRV_PROJECT_Z5_LT_K7\r
+static uint32_t lcd_poc_mfp_spi_3_2_cfgs[] = {\r
+    MFP_REG(GPIO_20) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DCLK */\r
+    MFP_REG(GPIO_21) | MFP_AF3 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS1 */\r
+    MFP_REG(GPIO_22) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_CS0 */\r
+    //MFP_REG(GPIO_23) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DOUT */\r
+    MFP_REG(GPIO_24) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DIN0 */\r
+    MFP_REG(GPIO_25) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* VSYNC */\r
+    MFP_REG(GPIO_26) | MFP_AF2 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SMPN_RST */\r
+    //MFP_REG(GPIO_27) | MFP_AF0 | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_DRIVE_MEDIUM | MFP_LPM_EDGE_NONE, /* SPI_DIN1 */\r
+    MFP_EOC\r
+};\r
+#endif\r
+#if USE_LCD_PANEL_GC9A01_SPI_WATCH\r
+static struct lcd_info_t gc9a01_lcd_spi_3_2_info =\r
+{\r
+    .mfp = (uint32_t *)lcd_poc_mfp_spi_3_2_cfgs,\r
+    .clk = 312000, /* 104000 */\r
+};\r
+#endif\r
+\r
+#if USE_LCD_PANEL_ST9A01_4_1_SPI_POC\r
+static struct lcd_info_t st9a01_lcd_spi_4_1_info =\r
+{\r
+    .mfp = (uint32_t *)lcd_poc_mfp_spi_4_1_cfgs,\r
+    .clk = 104000, /* 104000 */\r
+};\r
+#endif\r
+\r
+#if USE_LCD_PANEL_GC9307_4_1_SPI_POC\r
+static struct lcd_info_t gc9307_lcd_spi_4_1_info =\r
+{\r
+    .mfp = (uint32_t *)lcd_poc_mfp_spi_4_1_cfgs,\r
+    .clk = 312000, /* 104000 */\r
+};\r
+#endif\r
+\r
+#if USE_LCD_PANEL_ST7789V2_SPI_WATCH\r
+#if DRV_PROJECT_Z5_K6\r
+static struct lcd_info_t st7789v2_lcd_spi_4_1_info =\r
+{\r
+    .mfp = (uint32_t *)lcd_poc_mfp_spi_4_1_cfgs,\r
+    .clk = 312000, /* 104000 */\r
+};\r
+#elif DRV_PROJECT_Z5_K7 || DRV_PROJECT_Z5_K7_EN || DRV_PROJECT_Z5_I7 || DRV_PROJECT_Z5_HA_K7 || DRV_PROJECT_Z5_Z11  || DRV_PROJECT_Z5_Z11_2 \\r
+       || DRV_PROJECT_Z5_LT_K7\r
+static struct lcd_info_t st7789v2_lcd_spi_3_2_info =\r
+{\r
+    .mfp = (uint32_t *)lcd_poc_mfp_spi_3_2_cfgs,\r
+    .clk = 312000, /* 104000 */\r
+};\r
+#endif\r
+#endif\r
+\r
+#if USE_CRANE_LCD_MIPI\r
+unsigned int lcd_mipi_mfp_cfgs[] = {\r
+    MFP_REG(GPIO_26) | MFP_AF2 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*RST*/\r
+    MFP_REG(GPIO_19) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_REG(GPIO_23) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+#if LCD_TE_ENABLE\r
+    MFP_REG(GPIO_25) | MFP_AF2 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*TE*/\r
+#endif\r
+#if LCD_BACKLIGHT_ENABLE\r
+    MFP_REG(GPIO_31) | MFP_AF2 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*pwm for backlight*/\r
+    //MFP_REG(GPIO_31) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*config to gpio before pwm ready*/\r
+#endif\r
+    MFP_EOC\r
+};\r
+\r
+\r
+static struct lcd_info_t lcd_info = {\r
+    .mfp = (uint32_t *)lcd_mipi_mfp_cfgs,\r
+#if USE_CRANE_LCD_MIPI_CMD\r
+    .clk = 26000,\r
+#else\r
+    .clk = 17300,\r
+#endif\r
+};\r
+#endif\r
+\r
+static struct lcd_info_t *lcd_info_detect[]= {\r
+#if USE_CRANE_LCD_MIPI_CMD\r
+    &lcd_info,\r
+#else\r
+    #if USE_LCD_PANEL_GC9A01_SPI_WATCH\r
+        &gc9a01_lcd_spi_3_2_info,\r
+    #endif\r
+    #if USE_LCD_PANEL_ST9A01_4_1_SPI_POC\r
+        &st9a01_lcd_spi_4_1_info,\r
+    #endif\r
+    #if USE_LCD_PANEL_GC9C01_3_2_SPI_POC\r
+        &gc9c01_lcd_spi_3_2_info,\r
+    #endif\r
+    #if USE_LCD_PANEL_GC9307_4_1_SPI_POC\r
+        &gc9307_lcd_spi_4_1_info,\r
+    #endif\r
+    #if USE_LCD_PANEL_ST7789V2_SPI_WATCH\r
+    #if DRV_PROJECT_Z5_K6\r
+        &st7789v2_lcd_spi_4_1_info,\r
+    #elif DRV_PROJECT_Z5_K7 || DRV_PROJECT_Z5_K7_EN || DRV_PROJECT_Z5_Z12 || DRV_PROJECT_Z5_I7 || DRV_PROJECT_Z5_HA_K7 || DRV_PROJECT_Z5_DS_Z12XW_QCB || DRV_PROJECT_Z5_Z11 || DRV_PROJECT_Z5_Z11_2 \\r
+               || DRV_PROJECT_Z5_LT_K7\r
+        &st7789v2_lcd_spi_3_2_info,\r
+    #endif\r
+    #endif\r
+#endif\r
+};\r
+\r
+static struct crane_panel_t *lcd = NULL;\r
+static struct lcd_info_t * lcd_interface_info = NULL;\r
+\r
+#if USE_LCD_PANEL_ICNA3310_MIPI\r
+unsigned int oled_power_mfp_cfgs[] = {\r
+    MFP_REG(GPIO_76) | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /*power*/\r
+    MFP_EOC\r
+};\r
+\r
+static void oled_power_set(unsigned char on)\r
+{\r
+    uint32_t *mfp;\r
+\r
+    mfp = (uint32_t *)&oled_power_mfp_cfgs;\r
+\r
+    mfp_config((uint32_t *)mfp);\r
+    gpio_set_direction(GPIO76, GPIO_OUT);\r
+    gpio_output_set(GPIO76, on);\r
+    printf("oled_power_set=%d\n",on);\r
+}\r
+#endif\r
+static void lcdc_pwr_onoff(int on)\r
+{\r
+    int pm_type = pmic_get_type();\r
+\r
+    if (pm_type == PM_812) { // PM812\r
+        if (on) {\r
+            /* enable ldo8 and set t0 2.8V */\r
+            PM812_Ldo_8_set_2_8();\r
+            PM812_Ldo_8_set(1);\r
+        }\r
+        else {\r
+            /* disable ldo8 */\r
+            PM812_Ldo_8_set(0);\r
+        }\r
+    }\r
+    else if (pm_type == PM_813) {  // PM813\r
+        if (on) {\r
+            Ningbo_Ldo_1_set_2_8();\r
+            Ningbo_Ldo_1_set(1);\r
+#if USE_LCD_PANEL_ICNA3310_MIPI\r
+            oled_power_set(1);\r
+#endif\r
+        }\r
+        else {\r
+            Ningbo_Ldo_1_set(0);\r
+#if USE_LCD_PANEL_ICNA3310_MIPI\r
+            oled_power_set(0);\r
+#endif\r
+        }\r
+    }\r
+    else if (pm_type == PM_802) {  // PM802\r
+        /* ldo is enabled by default */\r
+    }\r
+    else if (pm_type == PM_803) {  // PM803\r
+        GuilinLite_Ldo_6_set_2_8();\r
+        GuilinLite_Ldo_6_set(TRUE);\r
+    }\r
+    else {\r
+        printf("unknown PMIC, lcd_pwr_onoff failed.\n");\r
+    }\r
+}\r
+\r
+static struct crane_panel_t *lcd_init(void)\r
+{\r
+#if 0\r
+    int cnt, i;\r
+    struct crane_panel_t *p;\r
+    \r
+    \r
+    lcdc_pwr_onoff(1);\r
+    if (lcdc_init(&lcd_info) < 0) {\r
+        goto error;\r
+    }\r
+\r
+    cnt = ARRAY_SIZE(panels);\r
+\r
+    for (i = 0; i < cnt; i++) {\r
+        p = panels[i];\r
+        if (p->probe(lcd_info.clk) == 0) {\r
+            return p;\r
+        }\r
+    }\r
+\r
+error:\r
+    return NULL;\r
+#else\r
+    int cnt, i;\r
+    struct crane_panel_t *p;\r
+\r
+    lcdc_pwr_onoff(1);\r
+    \r
+    cnt = ARRAY_SIZE(lcd_info_detect);\r
+    lv_udelay(1*1000*1000);\r
+\r
+    for (i = 0; i < cnt; i++)\r
+    {\r
+        if (lcdc_init(lcd_info_detect[i]) < 0)\r
+        {\r
+           continue;\r
+        }\r
+        lcd_interface_info = lcd_info_detect[i];\r
+        p = panels[i];\r
+        //if restart by error,should call lcdc_reset_panel\r
+        if(startup_silent_reset())\r
+            lcdc_reset_panel();\r
+        if (p->probe((lcd_info_detect[i])->clk) == 0)\r
+        {\r
+            return p;\r
+        }\r
+    }\r
+\r
+#if 0\r
+    //if detect fail, return first\r
+       lcd_interface_info = lcd_info_detect[0];\r
+    return panels[0];\r
+#else\r
+    lcd_interface_info = NULL;\r
+    return NULL;\r
+#endif\r
+#endif\r
+}\r
+\r
+void lcdc_resume(void)\r
+{\r
+#if 0\r
+    lcdc_init(&lcd_info);\r
+    if(lcd) lcd->probe(lcd_info.clk);\r
+#else\r
+    if(lcd_interface_info) lcdc_init(lcd_interface_info);\r
+    if(lcd) lcd->probe(lcd_interface_info->clk);\r
+#endif\r
+}\r
+\r
+void lcd_idle_refresh(void)\r
+{\r
+    if(lcd && lcd->idle_flush) {\r
+        lcd->idle_flush();\r
+    }\r
+}\r
+#if CONFIG_BOARD_SIMWARE_W61_V2\r
+extern void gpio_set_value(unsigned int gpio,unsigned int value);\r
+#if CONFIG_BOARD_SIMWARE_W61_V2\r
+#define HAL_TP_LDO_EN  GPIO_00\r
+#define HAL_TP_LDO_EN_GPIO GPIO0\r
+#endif\r
+static const uint32_t touch_ldo_en_mfp_cfgs[]=\r
+{\r
+    MFP_REG(HAL_TP_LDO_EN) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_NONE | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, //TP LDO EN\r
+    MFP_EOC\r
+};\r
+static void tp_power_onoff(bool on)\r
+{\r
+    //LDO EN PIN\r
+       gpio_set_direction(HAL_TP_LDO_EN_GPIO, GPIO_OUT);\r
+       if(on){\r
+        gpio_set_value(HAL_TP_LDO_EN_GPIO, 1);          \r
+       }else{\r
+        gpio_set_value(HAL_TP_LDO_EN_GPIO, 0); \r
+       }       \r
+}\r
+#endif\r
+\r
+#if USE_FT6X36\r
+static const uint32_t touch_mfp_cfgs[] = {\r
+    MFP_REG(GPIO_13) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_NONE | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_REG(GPIO_14) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_NONE | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_EOC            /*End of configuration, must have */\r
+};\r
+\r
+static const uint32_t touch_mfp_cfgs_3601s[] = {\r
+    MFP_REG(GPIO_121) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_NONE | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_REG(GPIO_124) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_NONE | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_EOC            /*End of configuration, must have */\r
+};\r
+\r
+static const struct ft6x36_info tp_info = {\r
+    .irq_pin = GPIO13,\r
+    .rst_pin = GPIO14,\r
+    .i2c_addr = 0x38, /* 7-bit i2c addr */\r
+};\r
+\r
+static const struct ft6x36_info tp_info_3601s = {\r
+    .irq_pin = GPIO121,\r
+    .rst_pin = GPIO124,\r
+    .i2c_addr = 0x38, /* 7-bit i2c addr */\r
+};\r
+\r
+static void tp_init_ft6x36(void)\r
+{\r
+    lv_indev_drv_t indev_tp_drv;\r
+    const struct ft6x36_info *tp;\r
+    uint32_t *mfp;\r
+\r
+    if (isChip_3601S() || is_chip_3603()) {\r
+        mfp = (uint32_t *)&touch_mfp_cfgs_3601s;\r
+        tp = &tp_info_3601s;\r
+    } else {\r
+        mfp = (uint32_t *)&touch_mfp_cfgs;\r
+        tp = &tp_info;\r
+    }\r
+\r
+    mfp_config((uint32_t *)mfp);\r
+    /* power is enabled in lcd_init */\r
+    ft6x36_init(tp);\r
+    lv_indev_drv_init(&indev_tp_drv);\r
+    indev_tp_drv.type = LV_INDEV_TYPE_POINTER;\r
+    indev_tp_drv.read_cb = ft6x36_read;\r
+    lv_indev_drv_register(&indev_tp_drv);\r
+}\r
+#endif\r
+\r
+#if USE_BL6133\r
+static const uint32_t touch_bl6133_mfp_cfgs[] = {\r
+    MFP_REG(GPIO_82) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_REG(GPIO_83) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_EOC            /*End of configuration, must have */\r
+};\r
+\r
+static const struct bl6133_info tp_bl6133_info = {\r
+    .irq_pin = GPIO83,\r
+    .rst_pin = GPIO82,\r
+    .i2c_addr = 0x2d, /* 7-bit i2c addr */\r
+};\r
+\r
+static int tp_init_bl6133(void)\r
+{\r
+    int ret = 0;\r
+    lv_indev_drv_t indev_tp_drv;\r
+    const struct bl6133_info *tp;\r
+    uint32_t *mfp;\r
+//#if USE_W61_TP\r
+   int pm_type = pmic_get_type();\r
+   if(pm_type == PM_813)\r
+   {\r
+          Ningbo_Ldo_9_set_3_3();\r
+          Ningbo_Ldo_9_set(1);\r
+   }\r
+//#endif\r
+    mfp = (uint32_t *)&touch_bl6133_mfp_cfgs;\r
+    tp = &tp_bl6133_info;\r
+\r
+    mfp_config((uint32_t *)mfp);\r
+#if BL6133_TP_FW_UPDATE\r
+    bl6133_firmware_update();\r
+#endif\r
+\r
+    /* power is enabled in lcd_init */\r
+    ret = bl6133_init(tp);\r
+    if(ret != 0){\r
+        cplog_printf("bl6133 probe fail\n");\r
+        return ret;\r
+    }\r
+    lv_indev_drv_init(&indev_tp_drv);\r
+    indev_tp_drv.type = LV_INDEV_TYPE_POINTER;\r
+    indev_tp_drv.read_cb = bl6133_read;\r
+    lv_indev_drv_register(&indev_tp_drv);\r
+       cplog_printf("tp_init_bl6133 ret=%d\n",ret);\r
+    return ret;\r
+}\r
+#endif\r
+\r
+#if USE_STC820\r
+static const uint32_t touch_stc820_mfp_cfgs[] = {\r
+    MFP_REG(GPIO_82) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_REG(GPIO_83) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_EOC            /*End of configuration, must have */\r
+};\r
+\r
+static const struct stc820_info tp_stc820_info = {\r
+    .irq_pin = GPIO83,\r
+    .rst_pin = GPIO82,\r
+    .i2c_addr = 0x15, /* 7-bit i2c addr */\r
+};\r
+\r
+static int tp_init_stc820(void)\r
+{\r
+    int ret = 0;\r
+    lv_indev_drv_t indev_tp_drv;\r
+    const struct stc820_info *tp;\r
+    uint32_t *mfp;\r
+//#if USE_W61_TP\r
+   int pm_type = pmic_get_type();\r
+   if(pm_type == PM_813)\r
+   {\r
+          Ningbo_Ldo_9_set_3_3();\r
+          Ningbo_Ldo_9_set(1);\r
+   }\r
+//#endif\r
+    mfp = (uint32_t *)&touch_stc820_mfp_cfgs;\r
+    tp = &tp_stc820_info;\r
+\r
+    mfp_config((uint32_t *)mfp);\r
+\r
+\r
+    set_info(tp);\r
+#if STC820_TP_FW_UPDATE\r
+    ctp_hynitron_update();\r
+#endif\r
+/* power is enabled in lcd_init */\r
+    ret = stc820_init(tp);\r
+    if(ret != 0){\r
+        cplog_printf("stc820 probe fail\n");\r
+        return ret;\r
+    }\r
+    lv_indev_drv_init(&indev_tp_drv);\r
+    indev_tp_drv.type = LV_INDEV_TYPE_POINTER;\r
+    indev_tp_drv.read_cb = stc820_read;\r
+    lv_indev_drv_register(&indev_tp_drv);\r
+       cplog_printf("tp_init_stc820 ret=%d\n",ret);\r
+    return ret;\r
+}\r
+#endif\r
+\r
+#if USE_ZINITIX_TOUCH\r
+static void tp_init_zinitix(void)\r
+{\r
+    lv_indev_drv_t indev_tp_drv;\r
+\r
+    /* power is enabled in lcd_init */\r
+    zinitix_init();\r
+    lv_indev_drv_init(&indev_tp_drv);\r
+    indev_tp_drv.type = LV_INDEV_TYPE_POINTER;\r
+    indev_tp_drv.read_cb = zinitix_read;\r
+    lv_indev_drv_register(&indev_tp_drv);\r
+}\r
+#endif\r
+\r
+#if USE_CRANE_EVB_KEYPAD\r
+static const uint32_t keypad_mfp_cfgs[] = {\r
+    MFP_REG(GPIO_00) | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_REG(GPIO_01) | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_REG(GPIO_02) | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_REG(GPIO_03) | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_REG(GPIO_04) | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_REG(GPIO_05) | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_REG(GPIO_06) | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_REG(GPIO_07) | MFP_AF1 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_REG(GPIO_08) | MFP_AF2 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_REG(GPIO_09) | MFP_AF2 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_EOC /*End of configuration, must have */\r
+};\r
+\r
+lv_indev_t *keypad_dev;\r
+\r
+static uint32_t keypad_evb_cb(struct keypad_param *arg)\r
+{\r
+#if 0\r
+    if(arg->data.key == LV_KEY_END) {\r
+        if(arg->key_event == KEY_EVENT_CLICK) {\r
+            Hal_Lcd_Sleep();\r
+            uint32_t wake_up_flag = Hal_Pm_Suspend();\r
+\r
+            printf("pm wake up, wake_up_flag 0x%08x ################\n", wake_up_flag);\r
+            if(wake_up_flag & PM_RESUME_ALL) {\r
+                Hal_Pm_Resume();\r
+                Hal_Lcd_Wakeup();\r
+            }\r
+        }\r
+        return KEY_HANDLE_OVER;\r
+    }\r
+#endif\r
+    return KEY_HANDLE_CONT;\r
+}\r
+\r
+static void keypad_init_evb(void)\r
+{\r
+    lv_indev_drv_t indev_kp_drv;\r
+\r
+    mfp_config((uint32_t *)keypad_mfp_cfgs);\r
+    keypad_crane_evb_init(keypad_evb_cb);\r
+\r
+    lv_indev_drv_init(&indev_kp_drv);\r
+    indev_kp_drv.type = LV_INDEV_TYPE_KEYPAD;\r
+    indev_kp_drv.read_cb = keypad_crane_evb_read;\r
+    keypad_dev = lv_indev_drv_register(&indev_kp_drv);\r
+}\r
+#endif\r
+\r
+\r
+int pm_state_flag = -1;\r
+static uint8_t pm_state = PM_ON;\r
+#define OSA_SUSPEND             0xFFFFFFFF\r
+static int  sdk_c1_enter()\r
+{\r
+    if(pm_state == PM_ON)\r
+        return 1;\r
+    if(Hal_low_power_sleep_is_vetoed())\r
+        return 1;\r
+    \r
+    return 0;\r
+}\r
+\r
+static int  sdk_c1_exit()\r
+{\r
+    return 0;\r
+}\r
+\r
+static int sdk_d2_enter()\r
+{\r
+#if USE_CRANE_KEYPADC\r
+    keypad_clear_wakup_interrupt();\r
+#endif\r
+    if(pm_state == PM_ON) {\r
+        return 1;\r
+    }\r
+\r
+#if USE_BT_SENSOR_HUB != 0\r
+    SensorHub_int_gpio_d2_ent_callback();\r
+#endif\r
+\r
+#if USE_MY_XMOTION\r
+    xmotion_int_gpio_d2_ent_callback();\r
+#endif\r
+#if USE_FR8012HAQ\r
+\r
+    fr8012haq_int_gpio_d2_ent_callback();\r
+#endif\r
+#if USE_MULTI_KEY\r
+    multi_key_d2_enter();\r
+#endif\r
+\r
+    return 0;\r
+}\r
+\r
+static int sdk_d2_exit(BOOL ExitFromD2)\r
+{\r
+#if USE_BT_SENSOR_HUB != 0\r
+    SensorHub_int_gpio_d2_exit_callback();\r
+#endif\r
+\r
+#if USE_MY_XMOTION\r
+    xmotion_int_gpio_d2_exit_callback();\r
+#endif\r
+#if USE_FR8012HAQ\r
+    fr8012haq_int_gpio_d2_exit_callback();\r
+#endif\r
+#if USE_MULTI_KEY\r
+    multi_key_d2_exit();\r
+#endif\r
+\r
+    return 0;\r
+}\r
+\r
+static int sdk_uiSuspend(void)\r
+{\r
+    if(pm_state == PM_ON)\r
+        return 1;\r
+    if(Hal_low_power_sleep_is_vetoed())\r
+        return 1;\r
+\r
+    return 0;\r
+}\r
+\r
+void sys_pm_init(void)\r
+{\r
+    uart_printf("sys_pm_init~~\n");\r
+    mmiD2CallbackRegister((UINT32)sdk_d2_enter, (UINT32)sdk_d2_exit);\r
+    mmiC1CallbackRegister((UINT32)sdk_c1_enter, (UINT32)sdk_c1_exit);\r
+    mmiStatusCallbackRegister((UINT32)sdk_uiSuspend);\r
+}\r
+\r
+extern void pm_unlock(void);\r
+\r
+uint32_t sys_pm_set_state(int state)\r
+{\r
+    if(state == PM_ON) {\r
+        if(pm_state != state) {\r
+            board_sys_tick_start();\r
+            pm_state = state;\r
+        }\r
+\r
+        return 0;\r
+    } else {\r
+        if(pm_state != state) {\r
+            board_sys_tick_stop();\r
+            mdelay(20);\r
+            pm_state = state;\r
+        }\r
+\r
+        if(pm_state_flag == -1) {\r
+            pm_state_flag = uos_create_flag();\r
+        }\r
+\r
+        uint32_t flag = 0;\r
+        #if USE_ONKEY_HISR\r
+        extern int onkey_queue_empty(void);\r
+        if (!onkey_queue_empty()) {\r
+            flag = PM_RESUME_ONKEY;\r
+            uart_printf("gui resume: onkey queue NOT empty, onkey, flag: 0x%x ~~~ \n", flag);\r
+            pm_unlock();\r
+        } else\r
+        #endif\r
+        {\r
+            uart_printf("gui suspend: %d ~~~  \n", pm_state_flag);\r
+            pm_unlock();\r
+            if(uos_wait_flag(pm_state_flag, PM_RESUME_ALL, UOS_FLAG_OR_CLEAR, &flag, OSA_SUSPEND) == 0) {\r
+                uart_printf("gui resume: flag: 0x%x ~~~  \n", flag);\r
+            }\r
+        }\r
+\r
+        if(pm_state_flag != -1) {\r
+            int tmp = pm_state_flag;\r
+            pm_state_flag = -1;\r
+            uos_delete_flag(tmp);\r
+        }\r
+        return flag;\r
+    }\r
+}\r
+\r
+void sys_pm_wakeup(void)\r
+{\r
+    if(pm_state_flag!=-1)\r
+        uos_set_flag(pm_state_flag, PM_RESUME_UI, UOS_FLAG_OR);\r
+}\r
+\r
+#if 1//simware add\r
+void sys_pm_wakeup_no_lcd(void)\r
+{\r
+    if(pm_state_flag!=-1)\r
+        uos_set_flag(pm_state_flag, PM_RESUME_NO_LCD, UOS_FLAG_OR);\r
+}\r
+#endif\r
+\r
+#if USE_CRANE_EVB_KEYPAD\r
+#include "lv_drivers/indev/crane_keypadc.h"\r
+\r
+void normal_key_wakeup(uint32_t key)\r
+{\r
+    if(pm_state_flag != -1) {\r
+        if(key == KP_PWR) {\r
+            uos_set_flag(pm_state_flag, PM_RESUME_ENDKEY, UOS_FLAG_OR);\r
+        } else {\r
+            uos_set_flag(pm_state_flag, PM_RESUME_NORMALKEY, UOS_FLAG_OR);\r
+        }\r
+    }\r
+}\r
+\r
+void onkey_wakeup()\r
+{\r
+    if(pm_state_flag != -1) {\r
+        uos_set_flag(pm_state_flag, PM_RESUME_ONKEY, UOS_FLAG_OR);\r
+    }\r
+}\r
+#endif\r
+\r
+#if USE_CRANE_WATCH_KEYPAD\r
+#include "lv_watch/lv_watch.h"\r
+#include "lv_drivers/indev/crane_watch_keypad.h"\r
+uint8_t restarted_flag = false;\r
+\r
+void onkey_wakeup(void)\r
+{\r
+    if(pm_state_flag != -1) {\r
+        uos_set_flag(pm_state_flag, PM_RESUME_ONKEY, UOS_FLAG_OR);\r
+    }\r
+}\r
+\r
+static int prmode_enter_suspend = 0;\r
+\r
+static uint32_t prmode_suspend(void)\r
+{\r
+    uint32_t flag = 0;\r
+\r
+    printf("prmode suspend pm_state = %d~~~  \n", pm_state);\r
+    board_sys_tick_stop();\r
+    mdelay(20);\r
+    pm_state = PM_SUSPEND;\r
+\r
+    if(pm_state_flag == -1) {\r
+        pm_state_flag = uos_create_flag();\r
+    }\r
+\r
+    if(uos_wait_flag(pm_state_flag, PM_RESUME_ONKEY, UOS_FLAG_OR_CLEAR, &flag, OSA_SUSPEND) == 0) {\r
+        uart_printf("prmode resume: flag: 0x%x, pm_state = %d~~~  \n", flag, pm_state);\r
+        if(pm_state_flag != -1) {\r
+            int tmp = pm_state_flag;\r
+            pm_state_flag = -1;\r
+            uos_delete_flag(tmp);\r
+        }\r
+        board_sys_tick_start();\r
+        return flag;\r
+    } else {\r
+        printf("prmode_suspend: uos wait flag failed\n");\r
+        board_sys_tick_start();\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+static void prmode_onkey_callback(void)\r
+{\r
+    int state = 0;\r
+    read_onkey(&state);\r
+\r
+    if((state == ONKEY_PRESSED)) {\r
+        printf("onkey callback prmode: %d, pm_state = %d,  pm_state_flag = %d\n",\r
+            state, pm_state, pm_state_flag);\r
+        if ((pm_state == PM_SUSPEND) && (pm_state_flag != -1)) {\r
+            printf("prmode resume\n");\r
+            uos_set_flag(pm_state_flag, PM_RESUME_ONKEY, UOS_FLAG_OR);\r
+            pm_state = PM_ON;\r
+        } else if (pm_state == PM_ON){\r
+            printf("prmode suspend\n");\r
+            prmode_enter_suspend = 1;\r
+        }\r
+    }\r
+\r
+}\r
+\r
+static void prmode_task(lv_task_t *task)\r
+{\r
+    printf("lvgl prmode task\n");\r
+    if (prmode_enter_suspend) {\r
+        prmode_enter_suspend = 0;\r
+        prmode_suspend();\r
+    }\r
+}\r
+\r
+static void prmode_pm_init(void)\r
+{\r
+    PM812_ONKEY_BIND_INTC(prmode_onkey_callback);\r
+    PM812_ONKEY_INTC_ENABLE(true);\r
+    lv_task_create(prmode_task, 1000, LV_TASK_PRIO_MID, NULL);\r
+}\r
+\r
+int is_in_poweroff_chg_mode(void)\r
+{\r
+    int ret = 0;\r
+    HAL_POWERUP_REASON reason = Hal_Powerup_Get_Reason();\r
+\r
+    if ((HAL_POWERUP_BAT == reason)||(HAL_POWERUP_USB == reason)) {\r
+        if (restarted_flag == false) {\r
+            ret = 1;\r
+        }\r
+    }\r
+\r
+    return ret;\r
+}\r
+\r
+static void keypad_watch_cb(struct keypad_param *arg)\r
+{\r
+    static bool set_lcd_only = false;\r
+\r
+    if(!watch_is_ready()) return;   // in start procedure\r
+\r
+       //printf("[@CHENG_DEBUG][%s][%d]: %d\n", __FUNCTION__, __LINE__, arg->data.key);\r
+       \r
+    if(arg->data.key == LV_KEY_END) \r
+       {\r
+       #ifdef MMI_PROJECT_Z5_HA_K18_NFC\r
+               if(true == mmi_k18_nfc_experience_screen_active())\r
+               {\r
+                       return;\r
+               }\r
+       #endif\r
+\r
+        lv_obj_t * facau_obj = lv_watch_get_activity_obj(ACT_ID_FACTORY_MODE_AUTOTEST);\r
+        lv_obj_t * emht_obj = lv_watch_get_activity_obj(ACT_ID_ENGINEER_MODE_ITEM_HWT);\r
+        if(NULL != facau_obj) {\r
+            autotest_key_event(arg);\r
+        } else if(NULL != emht_obj) {\r
+            #if USE_LV_WATCH_ENGINEER_MODE!= 0\r
+            hardware_testing_key_event(arg);\r
+            #endif\r
+        } else {\r
+            if(arg->key_event == KEY_EVENT_CLICK) {\r
+                               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);\r
+                if(set_lcd_only) {\r
+                    set_lcd_only = false;\r
+                } else {\r
+                    if(lv_watch_is_activity_one_level()) {\r
+                        watch_suspend_by_key();\r
+                    } else {\r
+                        lv_watch_go_home();\r
+                    }\r
+                }\r
+            } else if(arg->key_event == KEY_EVENT_LONG_PRESS) {\r
+                set_lcd_only = false;\r
+                // sos\r
+                if(1 != is_in_poweroff_chg_mode()) {\r
+                                       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);\r
+                    //sos_btn_action(NULL);\r
+                               #ifdef __MMI_KEY_POWER_LONG_PRESS_SCREEN_SUPPORT__\r
+                                       mmi_key_power_long_press_action();\r
+                               #endif\r
+                }\r
+            } else if(arg->key_event == KEY_EVENT_POWER_ON) {\r
+                set_lcd_only = false;\r
+                if(restarted_flag) return;\r
+                HAL_POWERUP_REASON reason = Hal_Powerup_Get_Reason();\r
+                if(((HAL_POWERUP_BAT == reason)||(HAL_POWERUP_USB == reason))&&(0 != Hal_Battery_Get_Status())) {\r
+                    // from power off charging to power up\r
+                    restarted_flag = true;\r
+                                       printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);\r
+                    watch_restart_req();\r
+                }\r
+            } else if(arg->key_event == KEY_EVENT_PRESS) {\r
+                               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);\r
+                if(!watch_get_lcd_status()) {\r
+                    watch_set_lcd_status(true);\r
+                    set_lcd_only = true;\r
+                }\r
+            }\r
+        }\r
+    } \r
+       else if(arg->data.key == LV_KEY_ESC) \r
+       {\r
+               printf("[@CHENG_DEBUG][%s][%d]: \n", __FUNCTION__, __LINE__);\r
+        if(arg->key_event == KEY_EVENT_CLICK) {\r
+            lv_watch_go_back();\r
+        }\r
+    }\r
+}\r
+\r
+lv_indev_t *keypad_dev;\r
+\r
+static void keypad_init_watch(void)\r
+{\r
+    lv_indev_drv_t indev_kp_drv;\r
+    printf("keypad_init_watch\n");\r
+    keypad_watch_init(keypad_watch_cb);\r
+\r
+    lv_indev_drv_init(&indev_kp_drv);\r
+    indev_kp_drv.type = LV_INDEV_TYPE_KEYPAD;\r
+    indev_kp_drv.read_cb = keypad_watch_read;\r
+    keypad_dev = lv_indev_drv_register(&indev_kp_drv);\r
+}\r
+#endif\r
+\r
+#if USE_LV_PHONE != 0\r
+extern void phone_poweron_logo(void);\r
+extern void Ui_Phone_main(void);\r
+#endif\r
+\r
+static void show_poweron_logo(void)\r
+{\r
+    #if USE_LV_WATCH\r
+    watch_poweron_logo();\r
+    #endif\r
+\r
+    #if USE_LV_PHONE != 0\r
+    phone_poweron_logo();\r
+    #endif\r
+\r
+    lv_udelay(60 * 1000); /* wait for the logo display complete */\r
+    lcd_backlight(2);\r
+    lcd_backlight_valid();\r
+}\r
+\r
+static void gui_disp_wait(struct _disp_drv_t * disp_drv)\r
+{\r
+    (void)disp_drv;\r
+    uos_sleep(1);\r
+}\r
+\r
+#if USE_LV_WATCH_REFR_MONITOR_CB\r
+/** OPTIONAL: Called after every refresh cycle to tell the rendering and flushing time + the\r
+ * number of flushed pixels */\r
+static void refr_monitor_cb(struct _disp_drv_t * disp_drv, uint32_t time, uint32_t px)\r
+{\r
+    (void)disp_drv;\r
+    printf("t: %u, pixel: %u\n", (unsigned)time, (unsigned)px);\r
+}\r
+#endif\r
+\r
+\r
+\r
+static int gui_init(void)\r
+{\r
+    lcd = lcd_init();\r
+    if (!lcd) {\r
+        printf("lcd init failed\n");\r
+        //return -1;\r
+    }\r
+    /*Create a display buffer*/\r
+    static lv_disp_buf_t disp_buf;\r
+    static lv_color_t buf1[LV_HOR_RES_MAX * LV_VER_RES_MAX];            /*A screen sized buffer*/\r
+    static lv_color_t buf2[LV_HOR_RES_MAX * LV_VER_RES_MAX];            /*An other screen sized buffer*/\r
+    //char *buf1 = lv_mem_aligned_alloc(LV_HOR_RES_MAX * LV_VER_RES_MAX * 2, 32);\r
+    //char *buf2 = lv_mem_aligned_alloc(LV_HOR_RES_MAX * LV_VER_RES_MAX * 2, 32);\r
+    lv_disp_buf_init(&disp_buf, buf1, buf2, LV_HOR_RES_MAX * LV_VER_RES_MAX);   /*Initialize the display buffer*/\r
+\r
+    /*Create a display*/\r
+    lv_disp_drv_t disp_drv;\r
+    lv_disp_drv_init(&disp_drv);            /*Basic initialization*/\r
+    disp_drv.buffer = &disp_buf;\r
+    disp_drv.hor_res = LV_HOR_RES_MAX;\r
+    disp_drv.ver_res = LV_VER_RES_MAX;\r
+    if(lcd) disp_drv.flush_cb = lcd->flush;\r
+    disp_drv.wait_cb = gui_disp_wait;\r
+#if USE_LV_WATCH_REFR_MONITOR_CB\r
+    disp_drv.monitor_cb = refr_monitor_cb;\r
+#endif\r
+    lcdc_set_disp(lv_disp_drv_register(&disp_drv));\r
+    return 0;\r
+}\r
+\r
+static void board_touch_init(void)\r
+{\r
+    static int tp_probe_state = -1;\r
+#if CONFIG_BOARD_SIMWARE_W61_V2\r
+    mfp_config((uint32_t *)touch_ldo_en_mfp_cfgs);     \r
+    tp_power_onoff(1);\r
+#elif CONFIG_BOARD_SIMWARE_W71 || CONFIG_BOARD_SIMWARE_A90 || CONFIG_BOARD_SIMWARE_A90SH || CONFIG_BOARD_SIMWARE_H81\r
+       int pm_type = pmic_get_type();\r
+\r
+    if (pm_type == PM_803) {\r
+        cplog_printf("board_touch_init 872\n");\r
+           GuilinLite_Ldo_8_set_3_0();\r
+               GuilinLite_Ldo_8_set(true);\r
+    }\r
+#endif\r
+#if USE_FT6X36\r
+    tp_init_ft6x36();\r
+#endif\r
+#if USE_BL6133\r
+    if(tp_probe_state != 0)\r
+       tp_probe_state = tp_init_bl6133();\r
+#endif\r
+#if USE_STC820\r
+    if(tp_probe_state != 0)\r
+       tp_probe_state = tp_init_stc820();\r
+#endif\r
+#if USE_ZINITIX_TOUCH\r
+    tp_init_zinitix();\r
+#endif\r
+    cplog_printf("tp_probe_state=%d\n",tp_probe_state);\r
+}\r
+\r
+static int board_init(void)\r
+{\r
+    pmic_init();\r
+    //setuartlogon();\r
+\r
+       board_touch_init();\r
+       \r
+    if (isSysRestartByRdProduction() == 0) {\r
+#if USE_CRANE_EVB_KEYPAD\r
+        keypad_init_evb();\r
+#endif\r
+#if USE_CRANE_WATCH_KEYPAD\r
+        keypad_init_watch();\r
+#endif\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+void invalidate_dcache_range(unsigned long start, unsigned long stop)\r
+{\r
+    arch_invalidate_cache_range(start, (stop-start));\r
+}\r
+\r
+char * gcvt(double value, int32_t ndigit, char * buf)\r
+{\r
+    unsigned idx = 0;\r
+    unsigned digi_cnt = 0;\r
+    if(value < 0){\r
+        buf[0] = '-';\r
+        value = -value;\r
+        idx ++;\r
+    }\r
+\r
+    long int_part = (long)value;\r
+    double float_part = value - int_part;\r
+    snprintf(buf+idx, ndigit+1, "%ld", int_part);\r
+    digi_cnt = strlen(buf) - idx;\r
+\r
+    if((digi_cnt >= ndigit) || (float_part < 0.0000000001))\r
+        return buf;\r
+\r
+    idx = strlen(buf);\r
+    buf[idx++] = '.';\r
+\r
+    while(digi_cnt < ndigit) {\r
+        int_part = (int)(float_part * 10);\r
+        float_part = float_part * 10 - int_part;\r
+        buf[idx++] = '0' + int_part;\r
+        digi_cnt ++;\r
+        if(float_part < 0.0000000001) {\r
+            break;\r
+        }\r
+    }\r
+\r
+    buf[idx] = '\0';\r
+    return buf;\r
+}\r
+\r
+static lv_task_t * backlight_on_task;\r
+static void backlight_task(lv_task_t * task)\r
+{\r
+    if(!lv_refr_vdb_is_flushing()) {\r
+        lcd_backlight_valid_for_silent_reset();\r
+        lv_task_del(backlight_on_task);\r
+#if USE_LV_WATCH_DEMO != 0\r
+        watch_set_ready_state(true);\r
+#endif\r
+    }\r
+}\r
+\r
+//#if (USE_LV_WATCH_ALIPAY != 0) || (USE_LV_WATCH_SW_ALIPAY != 0)\r
+//extern bool do_upay_init(void);\r
+//static lv_task_t * upay_init_task = NULL;\r
+//static void upayinit_task(lv_task_t * param)\r
+//{\r
+//    if(do_upay_init()) {\r
+//        lv_task_del(upay_init_task);\r
+//        upay_init_task = NULL;\r
+//    }\r
+//}\r
+//#endif\r
+\r
+static void mmi_init(void)\r
+{\r
+    FS_PowerOn();\r
+}\r
+\r
+#if CONFIG_BOARD_SIMWARE_A90 || CONFIG_BOARD_SIMWARE_A90SH || CONFIG_BOARD_SIMWARE_H81\r
+const uint32_t bt_ldo_en_cfgs[] = {\r
+    MFP_REG(GPIO_34) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_HIGH | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, //bt chip en\r
+    MFP_EOC                    /*End of configuration, must have */\r
+};\r
+\r
+const uint32_t hrm_ldo_en_cfgs[] = {\r
+    MFP_REG(GPIO_81) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /* hrm vio en */\r
+    MFP_REG(GPIO_84) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_NONE | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /* hrm rst */ \r
+    MFP_REG(GPIO_32) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_NONE | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /* hrm int */\r
+#if CONFIG_BOARD_SIMWARE_H81\r
+    MFP_REG(GPIO_18) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW | MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE, /* HRM_DCDC_EN */\r
+#endif\r
+       MFP_EOC                 /*End of configuration, must have */\r
+};\r
+#endif\r
+\r
+#if USE_BT_SENSOR_HUB != 0\r
+static void SensorHub_init_timer_callback(void* param)\r
+{\r
+    SensorHub_device_check_cmd();\r
+    SensorHub_boot_bin_check_cmd();\r
+}\r
+#endif\r
+\r
+#ifdef MMI_PROJECT_Z5_HA_K18\r
+static int MATResponseCallback_0(TelAtParserID chnlId, const char* response, int size)\r
+{\r
+       cplog_printf("[@CHENG_DEBUG][%s][%d]: chnlId=%d,size=%d\n", __FUNCTION__, __LINE__, chnlId, size);\r
+       cplog_printf("[@CHENG_DEBUG][%d]: response=%s\n", __LINE__, response);\r
+       \r
+#if 0\r
+       MATRspParseRet ret;\r
+       MATReturnPara resp_return;\r
+\r
+       ret = MATHandleResponse(chnlId, response, size, &resp_return);\r
+       cplog_printf("[@CHENG_DEBUG][%s][%d]: ret=%d\n", __FUNCTION__, __LINE__, ret);\r
+       if (ret == MAT_RSP_PARSER_WAIT_FOR_TERMINAL)\r
+       {\r
+               return 0;\r
+       }\r
+       else if(ret == MAT_RSP_PARSER_OK)\r
+       {\r
+               //fatal_printf("SIMCardTest AT Response: resultCode = %d; cmd_type = %d; numItems = %d\n",\r
+               //                       resp_return.resultCode, resp_return.cmd_type, resp_return.numItems);\r
+       }\r
+\r
+       MATConfIndFree(&resp_return);\r
+#endif\r
+\r
+       return 0;\r
+}\r
+\r
+static int MATResponseCallback_1(TelAtParserID chnlId, const char* response, int size)\r
+{\r
+       cplog_printf("[@CHENG_DEBUG][%s][%d]: chnlId=%d,size=%d\n", __FUNCTION__, __LINE__, chnlId, size);\r
+       cplog_printf("[@CHENG_DEBUG][%d]: response=%s\n", __LINE__, response);\r
+\r
+       return 0;\r
+}\r
+\r
+static void mmi_at_grip_action(void)\r
+{\r
+       char const * command_str0 = "AT*GRIP=2,5,2,3\r\n";\r
+       //if (IsAtCmdSrvReady())\r
+       cplog_printf("[@CHENG_DEBUG][%s][%d]: %s\n", __FUNCTION__, __LINE__, command_str0);\r
+       //MATSetConfIndCB(TEL_AT_CMD_ATP_6, MATResponseCallback_0);\r
+       ATRecv(TEL_AT_CMD_ATP_6, (void*)command_str0, strlen(command_str0));\r
+\r
+\r
+       char const * command_str1 = "AT*GRIP=2,5,2,5\r\n";\r
+       cplog_printf("[@CHENG_DEBUG][%s][%d]: %s\n", __FUNCTION__, __LINE__, command_str1);\r
+       //MATSetConfIndCB(TEL_AT_CMD_ATP_6, MATResponseCallback_1);\r
+       ATRecv(TEL_AT_CMD_ATP_6, (void*)command_str1, strlen(command_str1));\r
+}\r
+#endif\r
+\r
+extern void dm_init();\r
+static void gui_main(void *param)\r
+{\r
+    int silent_reset = startup_silent_reset();\r
+    board_init();\r
+    mmi_init(); /* some API from mmi, such as from mci_audio.cpp, depends on it */\r
+    board_sys_tick_init(5, lv_tick_inc); /* update tick every 5 ms */\r
+    Hal_Init();\r
+    \r
+#if CONFIG_BOARD_SIMWARE_A90 || CONFIG_BOARD_SIMWARE_A90SH || CONFIG_BOARD_SIMWARE_H81\r
+    mfp_config((uint32_t *)bt_ldo_en_cfgs);\r
+    mfp_config((uint32_t *)hrm_ldo_en_cfgs);\r
+    //bt ldo en\r
+    gpio_set_direction(GPIO34, GPIO_OUT);\r
+    gpio_set_value(GPIO34, 1);\r
+    //hmr ldo en\r
+    gpio_set_direction(GPIO81, GPIO_OUT);\r
+    gpio_set_value(GPIO81, 1);\r
+    gpio_set_direction(GPIO84, GPIO_IN);\r
+    gpio_set_direction(GPIO32, GPIO_IN);\r
+#if CONFIG_BOARD_SIMWARE_H81\r
+    gpio_set_direction(GPIO18, GPIO_OUT);\r
+    gpio_set_value(GPIO18, 1);\r
+#else\r
+    //2.4G UM3204 power\r
+    GuilinLite_Ldo_7_set_1_8();\r
+    GuilinLite_Ldo_7_set(TRUE);\r
+#endif\r
+#endif\r
+\r
+    if (isSysRestartByRdProduction() == 0) {\r
+        if(0 == silent_reset) {\r
+            show_poweron_logo();  //show logo if not silent reset\r
+        }\r
+#if USE_LV_WATCH_DEMO != 0\r
+        watch_power_on_req();\r
+#else\r
+        Ui_Phone_main();\r
+#endif\r
+        if(silent_reset) {\r
+            backlight_on_task = lv_task_create(backlight_task, 30, LV_TASK_PRIO_MID, NULL);\r
+        }\r
+    } else {\r
+        Ril_Init_Crane(0);\r
+        #if USE_CRANE_WATCH_KEYPAD\r
+        prmode_pm_init();\r
+        #endif\r
+    }\r
+//#if (USE_LV_WATCH_ALIPAY != 0) || (USE_LV_WATCH_SW_ALIPAY != 0)\r
+//    if(NULL == upay_init_task) {\r
+//        upay_init_task = lv_task_create(upayinit_task, 150, LV_TASK_PRIO_MID, NULL);\r
+//    }\r
+//#endif\r
+\r
+    app_sensor_task_init();\r
+    \r
+    i2c_initialize(I2C_MASTER_CI2C1);\r
+\r
+#if USE_BT_SENSOR_HUB != 0\r
+    hal_SensorHub_adaptor_init();\r
+    SensorHub_reboot_cmd();\r
+    Hal_Timer_Start(2000, SensorHub_init_timer_callback, NULL, FALSE);\r
+#endif\r
+\r
+#if USE_GPS\r
+       hal_gps_adaptor_init();\r
+#endif\r
+\r
+#if USE_SI24RX\r
+    si24rx_init();\r
+    //si24rx_test();\r
+#endif\r
+\r
+#if USE_CT1711\r
+    Ct1711_my_init();\r
+#endif\r
+\r
+#if USE_MULTI_KEY\r
+    multi_key_mfp_init();\r
+\r
+#endif\r
+\r
+#if USE_SOS_KEY\r
+    sos_key_mfp_init();\r
+#endif\r
+\r
+#if USE_MY_XMOTION\r
+    xMotion_my_init();\r
+#endif\r
+\r
+#if USE_GH3018\r
+    gh3018_init();\r
+#endif\r
+#if USE_HX3918\r
+    Hx3918_Init();\r
+#endif\r
+#if USE_FR8012HAQ\r
+    Fr8012haq_Init();\r
+#endif\r
+#if USE_WMM300\r
+    Wmm300_Init();\r
+#endif\r
+#if USE_ACNT180\r
+    hal_acnt180_init();\r
+#elif USE_ACNT117\r
+    hal_acnt117_init();\r
+#endif\r
+\r
+#ifdef MMI_PROJECT_Z5_HA_K18\r
+       //mmi_at_grip_action();\r
+#endif\r
+\r
+#if USE_DS_DM\r
+    cplog_printf("dm_init()!!!!!!!!!\n");\r
+    dm_init();\r
+#endif\r
+    is_phase1 = 0;\r
+    while(1) {\r
+        lv_task_handler();\r
+        uos_sleep(1); /* 1 os tick == 5 ms */\r
+    }\r
+\r
+}\r
+\r
+extern void set_sdcard_power_gpio(uint8_t num);\r
+\r
+#if CONFIG_BOARD_SIMWARE_W61_V2\r
+#define GPIO_EXT_PA    GPIO34\r
+static const uint32_t extpa803_mfp_cfgs[] = {\r
+    MFP_REG(GPIO_34) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW| MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_EOC            /*End of configuration, must have */\r
+};\r
+#elif CONFIG_BOARD_SIMWARE_W71 || CONFIG_BOARD_SIMWARE_A90 || CONFIG_BOARD_SIMWARE_A90SH || CONFIG_BOARD_SIMWARE_H81\r
+#define GPIO_EXT_PA    GPIO28\r
+static const uint32_t extpa803_mfp_cfgs[] = {\r
+    MFP_REG(GPIO_28) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW| MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_EOC            /*End of configuration, must have */\r
+};\r
+#else\r
+#define GPIO_EXT_PA    GPIO75\r
+static const uint32_t extpa803_mfp_cfgs[] = {\r
+    MFP_REG(GPIO_75) | MFP_AF0 | MFP_DRIVE_MEDIUM | MFP_PULL_LOW| MFP_SLEEP_DIR | MFP_LPM_EDGE_NONE,\r
+    MFP_EOC            /*End of configuration, must have */\r
+};\r
+#endif\r
+static void speaker_extpa_init(void)\r
+{\r
+    gpio_set_direction(GPIO_EXT_PA, GPIO_OUT);\r
+    gpio_output_set(GPIO_EXT_PA, 0);\r
+\r
+    mfp_config(extpa803_mfp_cfgs);\r
+    //cplog_printf("speaker_extpa_init \n");\r
+}\r
+static void speaker_extpa_enable(uint32_t on)\r
+{\r
+    int i = 0;\r
+    volatile int j = 0;\r
+    cplog_printf("speaker_extpa_enable : %d\n", on);\r
+    if(0 == on) {\r
+        gpio_output_set(GPIO_EXT_PA, 0);\r
+    } else {\r
+        for (i = 0; i < on; ++i) {\r
+            gpio_output_set(GPIO_EXT_PA, 0);\r
+            lv_udelay(1);\r
+            gpio_output_set(GPIO_EXT_PA, 1);\r
+            lv_udelay(1);\r
+        }\r
+    }\r
+}\r
+\r
+static uint8_t boot_flag = 0;\r
+\r
+uint8_t boot_flag_get(void)\r
+{\r
+    return boot_flag;\r
+}\r
+\r
+void boot_flag_set(uint8_t value)\r
+{\r
+    pmic_user_defined_flags_set(value);\r
+}\r
+\r
+int ui_init_phase1(void)\r
+{\r
+    extern void ui_log_init(void);\r
+    ui_log_init();\r
+\r
+    boot_flag = pmic_user_defined_flags_get();\r
+    pmic_user_defined_flags_set(0);\r
+\r
+    lv_init();\r
+    lv_pm_init();\r
+    is_phase1 = 1;\r
+    if (isSysRestartByRdProduction() == 0) {\r
+        timer_enable(); /* for mdelay */\r
+        gui_init();\r
+        timer_disable();\r
+    }\r
+\r
+    if(pmic_get_type() == PM_803) {\r
+        set_sdcard_power_gpio(70);\r
+\r
+        speaker_extpa_init();\r
+        AudioHAL_AifBindSpeakerPA_CB(speaker_extpa_enable);\r
+    }\r
+    return 0;\r
+}\r
+\r
+\r
+int ui_init_phase2(void)\r
+{\r
+#ifdef __CHENG_DEBUG__\r
+       extern void set_uart_dev_diag(void);\r
+\r
+       set_uart_dev_diag();\r
+#endif\r
+\r
+    if(lv_refr_vdb_is_flushing()) {\r
+        printf("Error: power on logo flush failed!!\n");\r
+    }\r
+    uos_init();\r
+#if USE_LV_ROM_FS\r
+    lv_romfs_init(1);\r
+#endif\r
+    //gui_task_id = uos_create_task(gui_main, NULL, 64, 0x4000, GUI_TASK_PRIORITY, "gui_task");\r
+    gui_task_id = uos_create_task(gui_main, NULL, 64, 0x8000, GUI_TASK_PRIORITY, "gui_task");\r
+    printf("gui task %d,  queue id %d\n", gui_task_id, gui_task_id->nMailBoxId);\r
+    return 0;\r
+}\r
+\r
+int test_backlight_on(void)\r
+{\r
+    printf("real test_backlight_on\n");\r
+    if (lcd == NULL) {\r
+        printf("init LCD\n");\r
+        gui_init();\r
+    }\r
+\r
+    lcd_backlight(2);\r
+    lcd_backlight_valid();\r
+\r
+    return 1;\r
+}\r
+\r
+int test_backlight_off(void)\r
+{\r
+    static lv_task_t * suspend_task = NULL;\r
+//    extern Usb_PlugCallback Send_usb_status;\r
+//    Send_usb_status = NULL;\r
+\r
+    watch_set_lcd_status(false);\r
+    if (NULL == suspend_task) {\r
+        suspend_task = lv_task_create(watch_suspend, 200, LV_TASK_PRIO_HIGH, (void *)WATCH_SUSPEND_KEY);\r
+    }\r
+    return 1;\r
+}\r
+\r
+void test_gui_init(void)\r
+{\r
+    if (lcd == NULL) {\r
+        printf("init LCD\n");\r
+        gui_init();\r
+    }\r
+}\r
+\r
+int test_watch_lcd(void)\r
+{\r
+    int i = 0;\r
+\r
+    printf("real test_watch_lcd\n");\r
+    if (lcd == NULL) {\r
+        printf("init LCD\n");\r
+        gui_init();\r
+    }\r
+    show_poweron_logo();\r
+\r
+    for (i = 0; i < ARRAY_SIZE(panels); ++i) {\r
+        unsigned panel_id = 0;\r
+\r
+        if (panels[i]->readid(&panel_id) == 0) {\r
+            printf("LCD%d Read Display ID = 0x%X\n", i, panel_id);\r
+            //#ZC@20210616 skip\r
+            if (panel_id == 0x9a01 || panel_id == 0x858552) {\r
+                return 1;\r
+            }\r
+        }\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+//set fotadm tcp server ip\r
+char* get_fotadm_tcp_server_ip()\r
+{\r
+       return "sob-net-web-public-1256182135.cos.ap-chongqing.myqcloud.com";\r
+}\r
+//set fotadm version\r
+char* get_fotadm_version()\r
+{\r
+       return "K7.01";\r
+}\r
+//set fota debug log\r
+bool is_debug_fota()\r
+{\r
+       return false;\r
+}\r
+//get fota server port\r
+int get_adups_tcp_server_port()\r
+{\r
+    return 80;\r
+}\r
+//get fota json path\r
+char * get_fotadm_json_path(void)\r
+{\r
+    return "/otatest/update.json";\r
+}\r
+// #ifdef    __cplusplus\r
+// extern "C" {\r
+    \r
+// #endif\r
+// #ifdef    __cplusplus\r
+// }\r
+// #endif\r
+static int sATPInd = TEL_AT_CMD_ATP_5;\r
+//#include "framework/hal/hwtest/hwtest/hwtest.h"\r
+char AT_read_data[200] = {0};\r
+int AT_read_data_len = 0;\r
+void at_delay(uint32_t ms)\r
+{\r
+       uos_sleep(ms/5);\r
+    //DelayInUs(ms*1000);\r
+}\r
+static int HandleATitem32CARDIDCallback(TelAtParserID chnlId, const char* response, int size)\r
+{\r
+       // MATRspParseRet ret;\r
+       // MATReturnPara resp_return;\r
+    cplog_printf("HandleATResponseCallback!!!!!!!!!!!!!! \n");\r
+    cplog_printf("SIMCardTest1: size:%d response = %s\n", size,response);\r
+       //ASSERT(chnlId == sATPInd);\r
+    if(AT_read_data_len + size>sizeof(AT_read_data))\r
+    {\r
+        size = sizeof(AT_read_data)-AT_read_data_len;\r
+    }\r
+    memcpy(&AT_read_data[AT_read_data_len],response,size);\r
+    AT_read_data_len += size;\r
+       cplog_printf("SIMCardTest2: size:%d response = %s\n", size,response);\r
+\r
+       return 0;\r
+}\r
+//#include "hop/telephony/atcmdsrv/inc/teldef.h"\r
+//SendATCMDWaitResp(AT_channel, at_str, 150, "+EPIN",1,"+CME ERROR", resp_str, sizeof(resp_str));\r
+int item32_CARDID_write(char * data)\r
+{\r
+    int err=0;\r
+    char read_cmddata[201]={0};\r
+    char cmdString[201] = {0};\r
+    char *cmd_str  ;\r
+    \r
+       at_delay(100);\r
+    cplog_printf("item32_CARDID_write:IsAtCmdSrvReady:%d \n",IsAtCmdSrvReady());\r
+    MATSetConfIndCB(sATPInd, HandleATitem32CARDIDCallback);\r
+    AT_read_data_len = 0;\r
+    memset(AT_read_data,0,sizeof(AT_read_data));\r
+    cplog_printf("item32_CARDID_write:IsAtCmdSrvReady:%d \n",IsAtCmdSrvReady());\r
+    ATRecv(sATPInd, (void*)"AT+CFUN=0\r\n", strlen(cmd_str));\r
+    cplog_printf("item32_CARDID_write1.2:sATPInd:%d \n",sATPInd);\r
+    int t_count = 70;\r
+    while (t_count--)\r
+    {\r
+        at_delay(5);\r
+        if(strstr(AT_read_data,"ok"))\r
+        {   \r
+            cplog_printf("AT_read_data:%s",AT_read_data);\r
+            break;\r
+        }\r
+            \r
+    }   \r
+    cplog_printf("item32_CARDID_write2:sATPInd:%d \n",sATPInd);\r
+\r
+    //cmd_str = "AT*PROD=1\r\n";\r
+\r
+    AT_read_data_len = 0;\r
+    memset(AT_read_data,0,sizeof(AT_read_data));\r
+    cplog_printf("item32_CARDID_write:IsAtCmdSrvReady:%d \n",IsAtCmdSrvReady());\r
+       ATRecv(sATPInd, (void*)"AT*PROD=1\r\n", strlen(cmd_str));\r
+    t_count = 70;\r
+    while (t_count--)\r
+    {\r
+        at_delay(5);\r
+        if(strstr(AT_read_data,"ok"))\r
+            break;\r
+    }\r
+\r
+\r
+    AT_read_data_len = 0;\r
+    memset(AT_read_data,0,sizeof(AT_read_data));\r
+    cplog_printf("item32_CARDID_write:IsAtCmdSrvReady:%d \n",IsAtCmdSrvReady());\r
+       ATRecv(sATPInd, (void*)"AT+CFUN=?\r\n", strlen(cmd_str));\r
+    t_count = 70;\r
+    while (t_count--)\r
+    {\r
+        at_delay(5);\r
+        if(strstr(AT_read_data,"ok"))\r
+            break;\r
+    }\r
+\r
+    snprintf(cmdString,200,"AT*MRD_ITEM32=W,CARDID,0101,12NOV2010,%s\r\n",data);\r
+    cplog_printf("item32_CARDID_write3:cmdString:%s \n",cmdString);\r
+    AT_read_data_len = 0;\r
+    memset(AT_read_data,0,sizeof(AT_read_data));\r
+    cplog_printf("item32_CARDID_write:IsAtCmdSrvReady:%d \n",IsAtCmdSrvReady());\r
+    ATRecv(sATPInd, (void*)cmdString, strlen(cmdString));\r
+    t_count = 70;\r
+    while (t_count--)\r
+    {\r
+        at_delay(5);\r
+        if(strstr(AT_read_data,"ok"))\r
+            break;\r
+    }\r
+    cplog_printf("t_count:%d",t_count);\r
+\r
+\r
+    cplog_printf("item32_CARDID_write4:sATPInd:%d \n",sATPInd);\r
+    //cmd_str = "AT*PROD=0\r\n";\r
+    AT_read_data_len = 0;\r
+    memset(AT_read_data,0,sizeof(AT_read_data));\r
+    cplog_printf("item32_CARDID_write:IsAtCmdSrvReady:%d \n",IsAtCmdSrvReady());\r
+    ATRecv(sATPInd, (void*)"AT*PROD=0\r\n", strlen(cmd_str));\r
+    t_count = 70;\r
+    while (t_count--)\r
+    {\r
+        at_delay(5);\r
+        if(strstr(AT_read_data,"ok"))\r
+            break;\r
+    }\r
+\r
+\r
+    cplog_printf("item32_CARDID_write5:sATPInd:%d \n",sATPInd);\r
+    //cmd_str = "AT+CFUN=1\r\n";\r
+    AT_read_data_len = 0;\r
+    memset(AT_read_data,0,sizeof(AT_read_data));\r
+    cplog_printf("item32_CARDID_write:IsAtCmdSrvReady:%d \n",IsAtCmdSrvReady());\r
+    ATRecv(sATPInd, (void*)"AT+CFUN=1\r\n", strlen(cmd_str));\r
+    cplog_printf("item32_CARDID_write6:sATPInd:%d \n",sATPInd);\r
+    t_count = 70;\r
+    while (t_count--)\r
+    {\r
+        at_delay(5);\r
+        if(strstr(AT_read_data,"ok"))\r
+            break;\r
+    }\r
+    \r
+\r
+error:\r
+    \r
+    return err;\r
+}\r
+int tem32_CARDID_read(char * data,int data_MAX_len)\r
+{\r
+    int err=0;\r
+    \r
+    char *cmd_str = "AT*MRD_ITEM32=R, CARDID\r\n";\r
+    cplog_printf("tem32_CARDID_read1:sATPInd:%d \n",sATPInd);\r
+    AT_read_data_len = 0;\r
+    memset(AT_read_data,0,sizeof(AT_read_data));\r
+\r
+    cplog_printf("tem32_CARDID_read1.1:sATPInd:%d \n",sATPInd);\r
+    MATSetConfIndCB(sATPInd, HandleATitem32CARDIDCallback);\r
+    cplog_printf("tem32_CARDID_read1.2:sATPInd:%d \n",sATPInd);\r
+    ATRecv(sATPInd, (void*)cmd_str, strlen(cmd_str));\r
+\r
+    int t_count = 100;\r
+    while (t_count--)\r
+    {\r
+        at_delay(5);\r
+        if(strstr(AT_read_data,"ok"))\r
+            break;\r
+    }\r
+    \r
+    cplog_printf("tem32_CARDID_read1:err:%d str:%s\n",err,AT_read_data);\r
+    if(AT_read_data == 0 )\r
+        goto error;\r
+    char *data_tmp=AT_read_data;\r
+    int count_flag = 0;\r
+    while(*data_tmp)\r
+    {\r
+        if(*data_tmp == ',')\r
+        {\r
+            count_flag++;\r
+            if(count_flag>=3)\r
+            {\r
+                strncpy(data,data_tmp+1,data_MAX_len);\r
+            }\r
+        }\r
+        \r
+        data_tmp++;\r
+    }\r
+error:\r
+    \r
+    return err;\r
+}\r
+#include "factory_mode.c"\r
+\r
+\r
+void mmi_at_antenna_coupling_test_start(void)\r
+{\r
+       char const * command_str0 = "AT+CFUN=0\r\n";\r
+       //if (IsAtCmdSrvReady())\r
+       ATRecv(TEL_AT_CMD_ATP_6, (void*)command_str0, strlen(command_str0));\r
+\r
+       char const * command_str1 = "AT+LTEPOWER=0,8,0\r\n";\r
+       ATRecv(TEL_AT_CMD_ATP_6, (void*)command_str1, strlen(command_str1));\r
+}\r
+\r
+void mmi_at_antenna_coupling_test_stop(void)\r
+{\r
+       char const * command_str0 = "AT+LTEPOWER=0,1,9\r\n";\r
+       //if (IsAtCmdSrvReady())\r
+       ATRecv(TEL_AT_CMD_ATP_6, (void*)command_str0, strlen(command_str0));\r
+\r
+       char const * command_str1 = "AT+CFUN=1\r\n";\r
+       ATRecv(TEL_AT_CMD_ATP_6, (void*)command_str1, strlen(command_str1));\r
+}\r
+\r
+\r
+#endif\r
+\r