static void chip_watchdog_init(void)\r
{\r
watchdog_turnon_clk();\r
+#ifdef CONFIG_SYSTEM_VIEW\r
+ watchdog_func_adapt(CHIP_WDT_TIMEOUT_128S);\r
+ uapi_watchdog_init(CHIP_WDT_TIMEOUT_128S);\r
+#else\r
watchdog_func_adapt(CHIP_WDT_TIMEOUT_32S);\r
uapi_watchdog_init(CHIP_WDT_TIMEOUT_32S);\r
+#endif\r
uapi_watchdog_enable(WDT_MODE_INTERRUPT);\r
}\r
\r
#include "pm_control.h"
#include "dfx_system_init.h"
#include "cpu_load.h"
+#include "exception_dump.h"
#ifdef SUPPORT_AT_CMD
#include "at_cmd_api.h"
void save_file_main(void)
{
+ if (osKernelGetState() == osKernelRunning) {
+ dump_norflash_trace_to_file();
+ }
g_semaphore_save = osSemaphoreNew(1, 0, NULL);
if (!g_semaphore_save) {
panic(PANIC_LOG, LOG_PANIC_MUTEX_NOT_READY);
}\r
#endif\r
\r
+#ifdef CFG_SDIO_EMMC_COEXIST\r
+static void sdio_init(void)\r
+{\r
+ init_sdio_pinmux();\r
+ sdio_drv_context_init();\r
+}\r
+#endif\r
+\r
#ifdef CFG_DRIVERS_NANDFLASH\r
static void nandflash_init(void)\r
{\r
g_store_init_select = STORE_CLASS_EMMC;\r
sdiom_internal_freq_handler_register(mmc_set_internal_clk);\r
#endif\r
+#ifdef CFG_SDIO_EMMC_COEXIST\r
+ sdio_init();\r
+#endif\r
#ifdef CFG_DRIVERS_NANDFLASH\r
yaffs_nand_drv_checkptset(YAFFS_CHECKPT_SKIPED);\r
nandflash_init();\r
uapi_calendar_init();\r
#ifdef SUPPORT_AT_OHOSFWK\r
ohos_startup();\r
+#endif\r
+#ifdef CONFIG_SYSTEM_VIEW\r
+ SEGGER_SYSVIEW_Conf();\r
+ // 请在抓取systemview开始的地方调用SEGGER_SYSVIEW_Start接口\r
#endif\r
uapi_pm_remove_sleep_veto(PM_ID_DEBUG);\r
set_startup_finish_flag();\r
add_subdirectory_if_exist(alipay)
if("SUPPORT_AUTO_OTA" IN_LIST DEFINES)
add_subdirectory_if_exist(auto_ota)
-endif()
\ No newline at end of file
+endif()
+add_subdirectory_with_alias_if_exist(SystemView ${PROJECT_BINARY_DIR}/systemview)
\ No newline at end of file
--- /dev/null
+#===============================================================================
+# @brief cmake file
+# Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved.
+#===============================================================================
+set(COMPONENT_NAME "systemview")
+
+set(SOURCES
+ ${CMAKE_CURRENT_SOURCE_DIR}/Src/SEGGER/SEGGER_RTT.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/Src/SEGGER/SEGGER_SYSVIEW.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/Src/Sample/LiteOS/SEGGER_SYSVIEW_LiteOS.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/Src/Sample/LiteOS/Config/SEGGER_SYSVIEW_Config_LiteOS.c
+)
+
+set(PUBLIC_HEADER
+ ${CMAKE_CURRENT_SOURCE_DIR}/Src/SEGGER
+ ${CMAKE_CURRENT_SOURCE_DIR}/Src/Config
+ ${CMAKE_CURRENT_SOURCE_DIR}/Src/Sample/LiteOS
+)
+
+set(PRIVATE_HEADER
+)
+
+set(PRIVATE_DEFINES
+)
+
+set(PUBLIC_DEFINES
+ CONFIG_SYSTEM_VIEW
+)
+
+# use this when you want to add ccflags like -include xxx
+set(COMPONENT_PUBLIC_CCFLAGS
+)
+
+set(COMPONENT_CCFLAGS
+-Wno-pointer-arith
+-Wno-strict-prototypes
+-Wno-implicit-function-declaration
+-Wno-unused-function
+-Wno-int-conversion
+)
+
+set(WHOLE_LINK
+ true
+)
+
+set(MAIN_COMPONENT
+ false
+)
+
+build_component()
\ No newline at end of file
--- /dev/null
+启用systemview调试。 注意:当前仅适配liteos版本。源代码需要用户获取,SDK仅发布litesos适配部分,建议使用v3.42版本。\r
+1)在config.py对应target增加systemview组件。\r
+2)在kernel/liteos/liteos_v207.1.0/Huawei_LiteOS/tools/build/config/brandy.config将LOSCFG_SYSTEM_VIEW配置为y\r
+3)将systemview源代码放置application/wearable/SystemView/Src下,其中Sample中sdk已发布了LiteOS适配。\r
+4)SystemView/Src/Sample/LiteOS/Tooladapt下SYSVIEW_LiteOS.txt放置在PC端SYSTEMVIEW工具的Description文件夹下。\r
+\r
+\r
+在线模式。\r
+1.在SEGGER_SYSVIEW_ConfDefaults.h中将SEGGER_SYSVIEW_POST_MORTEM_MODE配置为0\r
+2.在SEGGER_SYSVIEW_ConfDefaults.h中将SEGGER_SYSVIEW_RTT_BUFFER_SIZE修改为(16 * 1024)\r
+3.通过application.lst中获取_SEGGER_RTT 变量地址。\r
+4.通过工具的recorder configuration配置RTT的Detection地址,然后启动采集。\r
+\r
--- /dev/null
+/*********************************************************************\r
+* SEGGER Microcontroller GmbH & Co. KG *\r
+* The Embedded Experts *\r
+**********************************************************************\r
+* *\r
+* (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG *\r
+* *\r
+* www.segger.com Support: support@segger.com *\r
+* *\r
+**********************************************************************\r
+* *\r
+* SEGGER SystemView * Real-time application analysis *\r
+* *\r
+**********************************************************************\r
+* *\r
+* All rights reserved. *\r
+* *\r
+* SEGGER strongly recommends to not make any changes *\r
+* to or modify the source code of this software in order to stay *\r
+* compatible with the RTT protocol and J-Link. *\r
+* *\r
+* Redistribution and use in source and binary forms, with or *\r
+* without modification, are permitted provided that the following *\r
+* conditions are met: *\r
+* *\r
+* o Redistributions of source code must retain the above copyright *\r
+* notice, this list of conditions and the following disclaimer. *\r
+* *\r
+* o Redistributions in binary form must reproduce the above *\r
+* copyright notice, this list of conditions and the following *\r
+* disclaimer in the documentation and/or other materials provided *\r
+* with the distribution. *\r
+* *\r
+* o Neither the name of SEGGER Microcontroller GmbH & Co. KG *\r
+* nor the names of its contributors may be used to endorse or *\r
+* promote products derived from this software without specific *\r
+* prior written permission. *\r
+* *\r
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *\r
+* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *\r
+* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *\r
+* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *\r
+* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *\r
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *\r
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *\r
+* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *\r
+* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *\r
+* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *\r
+* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *\r
+* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *\r
+* DAMAGE. *\r
+* *\r
+**********************************************************************\r
+* *\r
+* SystemView version: V2.52a *\r
+* *\r
+**********************************************************************\r
+-------------------------- END-OF-HEADER -----------------------------\r
+\r
+File : SEGGER_SYSVIEW_Config_FreeRTOS.c\r
+Purpose : Sample setup configuration of SystemView with FreeRTOS.\r
+Revision: $Rev: 7745 $\r
+*/\r
+#include "los_base.h"\r
+#include "los_config.h"\r
+#include "los_hwi_pri.h"\r
+#include "tcxo.h"\r
+#include "SEGGER_SYSVIEW.h"\r
+\r
+#define configCPU_CLOCK_HZ ( OS_SYS_CLOCK )\r
+\r
+extern const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI;\r
+\r
+/*********************************************************************\r
+*\r
+* Defines, configurable\r
+*\r
+**********************************************************************\r
+*/\r
+// The application name to be displayed in SystemViewer\r
+#define SYSVIEW_APP_NAME "LiteOS Demo Application"\r
+\r
+// The target device name\r
+#define SYSVIEW_DEVICE_NAME "RISCV"\r
+\r
+// Frequency of the timestamp. Must match SEGGER_SYSVIEW_GET_TIMESTAMP in SEGGER_SYSVIEW_Conf.h\r
+#define SYSVIEW_TIMESTAMP_FREQ (configCPU_CLOCK_HZ)\r
+\r
+// System Frequency. SystemcoreClock is used in most CMSIS compatible projects.\r
+#define SYSVIEW_CPU_FREQ configCPU_CLOCK_HZ\r
+\r
+// The lowest RAM address used for IDs (pointers)\r
+#define SYSVIEW_RAM_BASE (0x20000000)\r
+\r
+/********************************************************************* \r
+*\r
+* _cbSendSystemDesc()\r
+*\r
+* Function description\r
+* Sends SystemView description strings.\r
+*/\r
+static void _cbSendSystemDesc(void) {\r
+ SEGGER_SYSVIEW_SendSysDesc("N="SYSVIEW_APP_NAME",D="SYSVIEW_DEVICE_NAME",O=LiteOS");\r
+ SEGGER_SYSVIEW_SendSysDesc("I#15=SysTick");\r
+}\r
+\r
+/*********************************************************************\r
+*\r
+* Global functions\r
+*\r
+**********************************************************************\r
+*/\r
+void SEGGER_SYSVIEW_Conf(void) {\r
+ SEGGER_SYSVIEW_Init(SYSVIEW_TIMESTAMP_FREQ, SYSVIEW_CPU_FREQ, \r
+ &SYSVIEW_X_OS_TraceAPI, _cbSendSystemDesc);\r
+ SEGGER_SYSVIEW_SetRAMBase(SYSVIEW_RAM_BASE);\r
+}\r
+\r
+U32 SEGGER_SYSVIEW_X_GetTimestamp(void) {\r
+ return uapi_tcxo_get_count();\r
+}\r
+\r
+U32 SEGGER_SYSVIEW_X_GetInterruptId(void) {\r
+ return OsIntNumGet();\r
+}\r
+\r
+/*************************** End of file ****************************/\r
--- /dev/null
+/* ********************************************************************\r
+* SEGGER Microcontroller GmbH & Co. KG *\r
+* The Embedded Experts *\r
+**********************************************************************\r
+* *\r
+* (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG *\r
+* *\r
+* www.segger.com Support: support@segger.com *\r
+* *\r
+**********************************************************************\r
+* *\r
+* SEGGER SystemView * Real-time application analysis *\r
+* *\r
+**********************************************************************\r
+* *\r
+* All rights reserved. *\r
+* *\r
+* SEGGER strongly recommends to not make any changes *\r
+* to or modify the source code of this software in order to stay *\r
+* compatible with the RTT protocol and J-Link. *\r
+* *\r
+* Redistribution and use in source and binary forms, with or *\r
+* without modification, are permitted provided that the following *\r
+* conditions are met: *\r
+* *\r
+* o Redistributions of source code must retain the above copyright *\r
+* notice, this list of conditions and the following disclaimer. *\r
+* *\r
+* o Redistributions in binary form must reproduce the above *\r
+* copyright notice, this list of conditions and the following *\r
+* disclaimer in the documentation and/or other materials provided *\r
+* with the distribution. *\r
+* *\r
+* o Neither the name of SEGGER Microcontroller GmbH & Co. KG *\r
+* nor the names of its contributors may be used to endorse or *\r
+* promote products derived from this software without specific *\r
+* prior written permission. *\r
+* *\r
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *\r
+* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *\r
+* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *\r
+* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *\r
+* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *\r
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *\r
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *\r
+* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *\r
+* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *\r
+* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *\r
+* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *\r
+* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *\r
+* DAMAGE. *\r
+* *\r
+**********************************************************************\r
+* *\r
+* SystemView version: V2.52a *\r
+* *\r
+**********************************************************************\r
+-------------------------- END-OF-HEADER -----------------------------\r
+\r
+File : SEGGER_SYSVIEW_FreeRTOS.c\r
+Purpose : Interface between FreeRTOS and SystemView.\r
+Revision: $Rev: 7947 $\r
+*/\r
+#include "los_base.h"\r
+#include "los_task.h"\r
+#include "los_config.h"\r
+#include "los_task_pri.h"\r
+#include "SEGGER_SYSVIEW.h"\r
+#include "SEGGER_SYSVIEW_LiteOS.h"\r
+#include "string.h" // Required for memset\r
+\r
+#define PRODUCT_TSK_MAX_SUPPORT_NUM 32 /* max num task */\r
+typedef UINT32 TickType_t;\r
+#define configTICK_RATE_HZ ((TickType_t)1000)\r
+#define portTICK_PERIOD_MS ((TickType_t)1000 / configTICK_RATE_HZ)\r
+typedef struct SYSVIEW_FREERTOS_TASK_STATUS SYSVIEW_FREERTOS_TASK_STATUS;\r
+\r
+struct SYSVIEW_FREERTOS_TASK_STATUS {\r
+ U32 xHandle;\r
+ const char *pcTaskName;\r
+ unsigned uxCurrentPriority;\r
+ U32 pxStack;\r
+ unsigned uStackHighWaterMark;\r
+};\r
+\r
+static SYSVIEW_FREERTOS_TASK_STATUS _aTasks[SYSVIEW_LITEOS_MAX_NOF_TASKS];\r
+static unsigned _NumTasks;\r
+\r
+static inline U64 MC_GetTick(void)\r
+{\r
+ return uapi_tcxo_get_ms();\r
+}\r
+/* ********************************************************************\r
+ *\r
+ * _cbSendTaskList()\r
+ *\r
+ * Function description\r
+ * This function is part of the link between FreeRTOS and SYSVIEW.\r
+ * Called from SystemView when asked by the host, it uses SYSVIEW\r
+ * functions to send the entire task list to the host.\r
+ */\r
+static void _cbSendTaskList(void)\r
+{\r
+ unsigned n;\r
+\r
+ for (n = 0; n < _NumTasks; n++) {\r
+#if INCLUDE_uxTaskGetStackHighWaterMark // Report Task Stack High Watermark\r
+ _aTasks[n].uStackHighWaterMark = uxTaskGetStackHighWaterMark((TaskHandle_t)_aTasks[n].xHandle);\r
+#endif\r
+ SYSVIEW_SendTaskInfo((U32)_aTasks[n].xHandle, _aTasks[n].pcTaskName, (unsigned)_aTasks[n].uxCurrentPriority,\r
+ (U32)_aTasks[n].pxStack, (unsigned)_aTasks[n].uStackHighWaterMark);\r
+ }\r
+}\r
+\r
+/* ********************************************************************\r
+ *\r
+ * _cbGetTime()\r
+ *\r
+ * Function description\r
+ * This function is part of the link between FreeRTOS and SYSVIEW.\r
+ * Called from SystemView when asked by the host, returns the\r
+ * current system time in micro seconds.\r
+ */\r
+static U64 _cbGetTime(void)\r
+{\r
+ U64 Time;\r
+\r
+ Time = MC_GetTick();\r
+ Time *= portTICK_PERIOD_MS;\r
+ Time *= 1000;\r
+ return Time;\r
+}\r
+\r
+/* ********************************************************************\r
+ *\r
+ * Global functions\r
+ *\r
+ * *********************************************************************\r
+ */\r
+/* ********************************************************************\r
+ *\r
+ * SYSVIEW_AddTask()\r
+ *\r
+ * Function description\r
+ * Add a task to the internal list and record its information.\r
+ */\r
+void SYSVIEW_AddTask(U32 xHandle, const char *pcTaskName, unsigned uxCurrentPriority, U32 pxStack,\r
+ unsigned uStackHighWaterMark)\r
+{\r
+ if (memcmp(pcTaskName, "IdleCore000", 11) == 0) {\r
+ return;\r
+ }\r
+\r
+ if (_NumTasks >= SYSVIEW_LITEOS_MAX_NOF_TASKS) {\r
+ SEGGER_SYSVIEW_Warn("SYSTEMVIEW: Could not record task information. Maximum number of tasks reached.");\r
+ return;\r
+ }\r
+\r
+ _aTasks[_NumTasks].xHandle = xHandle;\r
+ _aTasks[_NumTasks].pcTaskName = pcTaskName;\r
+ _aTasks[_NumTasks].uxCurrentPriority = uxCurrentPriority;\r
+ _aTasks[_NumTasks].pxStack = pxStack;\r
+ _aTasks[_NumTasks].uStackHighWaterMark = uStackHighWaterMark;\r
+\r
+ _NumTasks++;\r
+\r
+ SYSVIEW_SendTaskInfo(xHandle, pcTaskName, uxCurrentPriority, pxStack, uStackHighWaterMark);\r
+}\r
+\r
+/* ********************************************************************\r
+ *\r
+ * SYSVIEW_UpdateTask()\r
+ *\r
+ * Function description\r
+ * Update a task in the internal list and record its information.\r
+ */\r
+void SYSVIEW_UpdateTask(U32 xHandle, const char *pcTaskName, unsigned uxCurrentPriority, U32 pxStack,\r
+ unsigned uStackHighWaterMark)\r
+{\r
+ unsigned n;\r
+\r
+ if (memcmp(pcTaskName, "IdleCore000", 11) == 0) {\r
+ return;\r
+ }\r
+\r
+ for (n = 0; n < _NumTasks; n++) {\r
+ if (_aTasks[n].xHandle == xHandle) {\r
+ break;\r
+ }\r
+ }\r
+ if (n < _NumTasks) {\r
+ _aTasks[n].pcTaskName = pcTaskName;\r
+ _aTasks[n].uxCurrentPriority = uxCurrentPriority;\r
+ _aTasks[n].pxStack = pxStack;\r
+ _aTasks[n].uStackHighWaterMark = uStackHighWaterMark;\r
+\r
+ SYSVIEW_SendTaskInfo(xHandle, pcTaskName, uxCurrentPriority, pxStack, uStackHighWaterMark);\r
+ } else {\r
+ SYSVIEW_AddTask(xHandle, pcTaskName, uxCurrentPriority, pxStack, uStackHighWaterMark);\r
+ }\r
+}\r
+\r
+/* ********************************************************************\r
+ *\r
+ * SYSVIEW_DeleteTask()\r
+ *\r
+ * Function description\r
+ * Delete a task from the internal list.\r
+ */\r
+void SYSVIEW_DeleteTask(U32 xHandle)\r
+{\r
+ unsigned n;\r
+\r
+ if (_NumTasks == 0) {\r
+ return; // Early out\r
+ }\r
+ for (n = 0; n < _NumTasks; n++) {\r
+ if (_aTasks[n].xHandle == xHandle) {\r
+ break;\r
+ }\r
+ }\r
+ if (n == (_NumTasks - 1)) {\r
+ //\r
+ // Task is last item in list.\r
+ // Simply zero the item and decrement number of tasks.\r
+ //\r
+ memset(&_aTasks[n], 0, sizeof(_aTasks[n]));\r
+ _NumTasks--;\r
+ } else if (n < _NumTasks) {\r
+ //\r
+ // Task is in the middle of the list.\r
+ // Move last item to current position and decrement number of tasks.\r
+ // Order of tasks does not really matter, so no need to move all following items.\r
+ //\r
+ _aTasks[n].xHandle = _aTasks[_NumTasks - 1].xHandle;\r
+ _aTasks[n].pcTaskName = _aTasks[_NumTasks - 1].pcTaskName;\r
+ _aTasks[n].uxCurrentPriority = _aTasks[_NumTasks - 1].uxCurrentPriority;\r
+ _aTasks[n].pxStack = _aTasks[_NumTasks - 1].pxStack;\r
+ _aTasks[n].uStackHighWaterMark = _aTasks[_NumTasks - 1].uStackHighWaterMark;\r
+ memset(&_aTasks[_NumTasks - 1], 0, sizeof(_aTasks[_NumTasks - 1]));\r
+ _NumTasks--;\r
+ }\r
+}\r
+\r
+/* ********************************************************************\r
+ *\r
+ * SYSVIEW_SendTaskInfo()\r
+ *\r
+ * Function description\r
+ * Record task information.\r
+ */\r
+void SYSVIEW_SendTaskInfo(U32 TaskID, const char *sName, unsigned Prio, U32 StackBase, unsigned StackSize)\r
+{\r
+ SEGGER_SYSVIEW_TASKINFO TaskInfo;\r
+\r
+ memset(&TaskInfo, 0, sizeof(TaskInfo)); // Fill all elements with 0 to allow extending the structure in future\r
+ // version without breaking the code\r
+ TaskInfo.TaskID = TaskID;\r
+ TaskInfo.sName = sName;\r
+ TaskInfo.Prio = Prio;\r
+ TaskInfo.StackBase = StackBase;\r
+ TaskInfo.StackSize = StackSize;\r
+ SEGGER_SYSVIEW_SendTaskInfo(&TaskInfo);\r
+}\r
+\r
+/* ********************************************************************\r
+ *\r
+ * SYSVIEW_RecordU32x4()\r
+ *\r
+ * Function description\r
+ * Record an event with 4 parameters\r
+ */\r
+void SYSVIEW_RecordU32x4(unsigned Id, U32 Para0, U32 Para1, U32 Para2, U32 Para3)\r
+{\r
+ U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + 4 * SEGGER_SYSVIEW_QUANTA_U32];\r
+ U8 *pPayload;\r
+ //\r
+ pPayload = SEGGER_SYSVIEW_PREPARE_PACKET(aPacket); // Prepare the packet for SystemView\r
+ pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para0); // Add the first parameter to the packet\r
+ pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para1); // Add the second parameter to the packet\r
+ pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para2); // Add the third parameter to the packet\r
+ pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para3); // Add the fourth parameter to the packet\r
+ //\r
+ SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, Id); // Send the packet\r
+}\r
+\r
+/* ********************************************************************\r
+ *\r
+ * SYSVIEW_RecordU32x5()\r
+ *\r
+ * Function description\r
+ * Record an event with 5 parameters\r
+ */\r
+void SYSVIEW_RecordU32x5(unsigned Id, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4)\r
+{\r
+ U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + 5 * SEGGER_SYSVIEW_QUANTA_U32];\r
+ U8 *pPayload;\r
+ //\r
+ pPayload = SEGGER_SYSVIEW_PREPARE_PACKET(aPacket); // Prepare the packet for SystemView\r
+ pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para0); // Add the first parameter to the packet\r
+ pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para1); // Add the second parameter to the packet\r
+ pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para2); // Add the third parameter to the packet\r
+ pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para3); // Add the fourth parameter to the packet\r
+ pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para4); // Add the fifth parameter to the packet\r
+ //\r
+ SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, Id); // Send the packet\r
+}\r
+\r
+/* ******************************************************************\r
+ *\r
+ * SEGGER_SYSVIEW_RecordU32_String\r
+ *\r
+ * Function description\r
+ * Record an event with 1 parameter and one description string\r
+ */\r
+void SEGGER_SYSVIEW_RecordU32_String(U32 EventID, U32 Para0, const char *sDescription)\r
+{\r
+ U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_STRING_LEN + 1];\r
+ U8 *pPayload;\r
+\r
+ pPayload = SEGGER_SYSVIEW_PREPARE_PACKET(aPacket);\r
+ pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para0);\r
+ pPayload = SEGGER_SYSVIEW_EncodeString(pPayload, sDescription, SEGGER_SYSVIEW_MAX_STRING_LEN);\r
+ SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, EventID);\r
+}\r
+\r
+/* ******************************************************************\r
+ *\r
+ * SEGGER_SYSVIEW_RecordU32x2_String\r
+ *\r
+ * Function description\r
+ * Record an event with 2 parameter and one description string\r
+ */\r
+void SEGGER_SYSVIEW_RecordU32x2_String(U32 EventID, U32 Para0, U32 Para1, const char *sDescription)\r
+{\r
+ U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_STRING_LEN + 1];\r
+ U8 *pPayload;\r
+\r
+ pPayload = SEGGER_SYSVIEW_PREPARE_PACKET(aPacket);\r
+ pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para0);\r
+ pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para1);\r
+ pPayload = SEGGER_SYSVIEW_EncodeString(pPayload, sDescription, SEGGER_SYSVIEW_MAX_STRING_LEN);\r
+ SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, EventID);\r
+}\r
+\r
+/* ******************************************************************\r
+ *\r
+ * SEGGER_SYSVIEW_RecordU32x3_String\r
+ *\r
+ * Function description\r
+ * Record an event with 3 parameter and one description string\r
+ */\r
+void SEGGER_SYSVIEW_RecordU32x3_String(U32 EventID, U32 Para0, U32 Para1, U32 Para2, const char *sDescription)\r
+{\r
+ U8 aPacket[SEGGER_SYSVIEW_INFO_SIZE + SEGGER_SYSVIEW_QUANTA_U32 + SEGGER_SYSVIEW_MAX_STRING_LEN + 1];\r
+ U8 *pPayload;\r
+\r
+ pPayload = SEGGER_SYSVIEW_PREPARE_PACKET(aPacket);\r
+ pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para0);\r
+ pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para1);\r
+ pPayload = SEGGER_SYSVIEW_EncodeU32(pPayload, Para2);\r
+ pPayload = SEGGER_SYSVIEW_EncodeString(pPayload, sDescription, SEGGER_SYSVIEW_MAX_STRING_LEN);\r
+ SEGGER_SYSVIEW_SendPacket(&aPacket[0], pPayload, EventID);\r
+}\r
+\r
+\r
+/**\r
+ * queue trace.\r
+ */\r
+#if (ENABLE_QUEUE_TRACE == 1)\r
+void LOS_TRACE_QUEUE_CREATE(UINT32 queueId, UINT16 len, UINT16 msgSize, UINTPTR queue, UINT8 queueMemType)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x4(ID_OFFSET + ID_LOS_QUEUECREATE, queueId, (UINT32)len, (UINT32)queue,\r
+ (UINT32)queueMemType);\r
+}\r
+void LOS_TRACE_QUEUE_DELETE(UINT32 queueId, UINT8 queueState, UINT16 readWriteableCnt)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x3(ID_OFFSET + ID_LOS_QUEUEDELETE, queueId, (UINT32)queueState, (UINT32)readWriteableCnt);\r
+}\r
+void LOS_TRACE_QUEUE_RW(UINT32 queueId, UINT16 queueSize, UINT32 bufferSize, UINT32 operateType, UINT16 readableCnt,\r
+ UINT16 writeableCnt, UINT32 timeout)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x5(ID_OFFSET + ID_LOS_QUEUERW, queueId, operateType, (UINT32)readableCnt,\r
+ (UINT32)writeableCnt, timeout);\r
+}\r
+#endif\r
+\r
+/**\r
+ * event trace.\r
+ */\r
+#if (ENABLE_EVENT_TRACE == 1)\r
+void LOS_TRACE_EVENT_CREATE(UINTPTR eventCB)\r
+{\r
+ SEGGER_SYSVIEW_RecordString(ID_OFFSET + ID_LOS_EVENTINIT, "EventCreate.");\r
+}\r
+void LOS_TRACE_EVENT_READ(UINTPTR eventCB, UINT32 uwEventID, UINT32 eventMask, UINT32 mode, UINT32 timeout)\r
+{\r
+ if (mode == LOS_WAITMODE_OR) {\r
+ SEGGER_SYSVIEW_RecordU32x2_String(ID_OFFSET + ID_LOS_EVENTREAD, uwEventID, eventMask, "OR");\r
+ } else if (mode == LOS_WAITMODE_AND) {\r
+ SEGGER_SYSVIEW_RecordU32x2_String(ID_OFFSET + ID_LOS_EVENTREAD, uwEventID, eventMask, "AND");\r
+ }\r
+}\r
+void LOS_TRACE_EVENT_WRITE(UINTPTR eventCB, UINT32 uwEventID, UINT32 events)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x2(ID_OFFSET + ID_LOS_EVENTWRITE, uwEventID, events);\r
+}\r
+void LOS_TRACE_EVENT_CLEAR(UINTPTR eventCB, UINT32 uwEventID, UINT32 events)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x2(ID_OFFSET + ID_LOS_EVENTCLEAR, uwEventID, events);\r
+}\r
+void LOS_TRACE_EVENT_DELETE(UINTPTR eventCB, UINT32 ret)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32_String(ID_OFFSET + ID_LOS_EVENTDESTROY, ret, "EventDestroy");\r
+}\r
+\r
+void LOS_TRACE_EVENT_COND_READ(UINTPTR eventCB, UINT32 uwEventID)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32(ID_OFFSET + ID_LOS_CON_READ, uwEventID);\r
+}\r
+void LOS_TRACE_EVENT_COND_WRITE(UINTPTR eventCB, UINT32 uwEventID)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32(ID_OFFSET + ID_LOS_CON_WRITE, uwEventID);\r
+}\r
+#endif\r
+\r
+/**\r
+ * mutex trace.\r
+ */\r
+#if (ENABLE_EVENT_TRACE == 1)\r
+void LOS_TRACE_MUX_CREATE(UINT32 muxId)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32_String(ID_OFFSET + ID_LOS_MUXCREATE, muxId, "muxStat = mux_used");\r
+}\r
+void LOS_TRACE_MUX_POST(UINT32 muxHandle, UINT16 muxCount, UINT32 taskId)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x3(ID_OFFSET + ID_LOS_MUXPOST, muxHandle, (UINT32)muxCount, taskId);\r
+}\r
+void LOS_TRACE_MUX_PEND(UINT32 muxHandle, UINT16 muxCount, UINT32 taskId, UINT32 timeout)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x4(ID_OFFSET + ID_LOS_MUXPEND, muxHandle, (UINT32)muxCount, taskId, timeout);\r
+}\r
+void LOS_TRACE_MUX_DELETE(UINT32 muxHandle, UINT8 muxStat, UINT16 muxCount, UINT32 taskId)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x4(ID_OFFSET + ID_LOS_MUXDELETE, muxHandle, (UINT32)muxStat, (UINT32)muxCount, taskId);\r
+}\r
+#endif\r
+\r
+/**\r
+ * semphore trace.\r
+ */\r
+#if (ENABLE_SEM_TRACE == 1)\r
+void LOS_TRACE_SEM_CREATE(UINT32 semId, UINT8 type, UINT16 count)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x3(ID_OFFSET + ID_LOS_SEMCREATE, semId, (UINT32)type, (UINT32)count);\r
+}\r
+void LOS_TRACE_SEM_DELETE(UINT32 semHandle, UINT32 ret)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x2_String(ID_OFFSET + ID_LOS_SEMDELETE, semHandle, ret, "semStat = OS_SEM_UNUSED");\r
+}\r
+void LOS_TRACE_SEM_PEND(UINT32 semHandle, UINT16 semCount, UINT32 timeout)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x3(ID_OFFSET + ID_LOS_SEMPEND, semHandle, (UINT32)semCount, timeout);\r
+}\r
+void LOS_TRACE_SEM_POST(UINT32 semHandle, UINT8 semType, UINT16 semCount)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x3(ID_OFFSET + ID_LOS_SEMPOST, semHandle, (UINT32)semType, (UINT32)semCount);\r
+}\r
+#endif\r
+\r
+/**\r
+ * memory alloc&free trace.\r
+ */\r
+#if (ENABLE_MEM_TRACE == 1)\r
+void LOS_TRACE_MEM_INFO_REQ(VOID *pool)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32(ID_OFFSET + ID_LOS_MEMINIT, (UINT32)pool);\r
+}\r
+void LOS_TRACE_MEM_ALLOC(VOID *pool, UINTPTR ptr, UINT32 size)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x3(ID_OFFSET + ID_LOS_MEMALLOC, (UINT32)pool, (UINT32)ptr, size);\r
+}\r
+void LOS_TRACE_MEM_FREE(VOID *pool, UINTPTR ptr)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x2(ID_OFFSET + ID_LOS_MEMFREE, (UINT32)pool, (UINT32)ptr);\r
+}\r
+void LOS_TRACE_MEM_REALLOC(VOID *pool, UINTPTR ptr, UINT32 size)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x3(ID_OFFSET + ID_LOS_MEMREALLOC, (UINT32)pool, (UINT32)ptr, size);\r
+}\r
+void LOS_TRACE_MEM_ALLOC_ALIGN(VOID *pool, UINTPTR ptr, UINT32 size, UINT32 boundary)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x4(ID_OFFSET + ID_LOS_MEMALLOCALIGN, (UINT32)pool, (UINT32)ptr, (UINT32)size,\r
+ (UINT32)boundary);\r
+}\r
+#endif\r
+\r
+/**\r
+ * task trace.\r
+ */\r
+#if (ENABLE_TASK_TRACE == 1)\r
+#ifdef LOSCFG_KERNEL_SMP\r
+void LOS_TRACE_TASK_SIGNAL(UINT32 taskId, UINT32 mpSignal)\r
+{\r
+ ;\r
+}\r
+#endif\r
+// void LOS_TRACE_TASK_DELAY(UINT32 tick);\r
+void LOS_TRACE_TASK_RESUME(UINT32 taskId, UINT16 taskStatus, UINT16 priority)\r
+{\r
+ LosTaskCB *newTask = OS_TCB_FROM_TID(taskId);\r
+ SEGGER_SYSVIEW_OnTaskStartReady((UINT32)newTask);\r
+}\r
+void LOS_TRACE_TASK_DELETE(UINT32 taskId, UINT16 taskStatus, UINT32 usrStack)\r
+{\r
+ LosTaskCB *newTask = OS_TCB_FROM_TID(taskId);\r
+ SEGGER_SYSVIEW_RecordU32_String(ID_OFFSET + ID_LOS_TASK_DELETE, taskId, newTask->taskName);\r
+ SYSVIEW_DeleteTask((UINT32)newTask);\r
+}\r
+void LOS_TRACE_TASK_PRIOSET(UINT32 taskId, UINT16 taskStatus, UINT16 priority, UINT16 taskPrio)\r
+{\r
+ LosTaskCB *newTask = OS_TCB_FROM_TID(taskId);\r
+ SEGGER_SYSVIEW_RecordU32x2(ID_OFFSET + ID_LOS_TASK_PRIOSET, SEGGER_SYSVIEW_ShrinkId((U32)newTask), priority);\r
+ SYSVIEW_UpdateTask((UINT32)newTask, &(newTask->taskName[0]), (UINT32)priority, (UINT32)newTask->stackPointer, 0);\r
+}\r
+\r
+// sched trace\r
+void LOS_TRACE_TASK_SWITCH(UINT32 taskId, UINT16 runPriority, UINT16 curTaskStatus, UINT16 newPriority,\r
+ UINT16 newTaskStatus)\r
+{\r
+ LosTaskCB *newTask = OS_TCB_FROM_TID(taskId);\r
+ if (memcmp(newTask->taskName, "IdleCore000", 11) == 0) {\r
+ SEGGER_SYSVIEW_OnIdle();\r
+ } else {\r
+ SEGGER_SYSVIEW_OnTaskStartExec((UINT32)newTask);\r
+ }\r
+}\r
+#ifndef LOSCFG_SCHED_LATENCY\r
+void LOS_TRACE_TASK_SIGNAL(UINT32 taskId, UINT32 schedFlag) {}\r
+#endif\r
+void LOS_TRACE_TASK_SUSPEND(UINT32 taskId, UINT16 taskStatus, UINT32 currTaskId)\r
+{\r
+ LosTaskCB *newTask = OS_TCB_FROM_TID(taskId);\r
+ SEGGER_SYSVIEW_OnTaskStopReady((UINT32)newTask, ((3u << 3) | 3));\r
+}\r
+\r
+void LOS_TRACE_MOVED_TASK_TO_READY_STATE(const LosTaskCB *pstTaskCB)\r
+{\r
+ SEGGER_SYSVIEW_OnTaskStartReady((UINT32)pstTaskCB);\r
+}\r
+void LOS_TRACE_MOVED_TASK_TO_DELAYED_LIST(const LosTaskCB *pstTaskCB)\r
+{\r
+ ;\r
+}\r
+void LOS_TRACE_MOVED_TASK_TO_SUSPENDED_LIST(const LosTaskCB *pstTaskCB)\r
+{\r
+ ;\r
+}\r
+\r
+void LOS_TRACE_ISR_EXIT_TO_SCHEDULER(void)\r
+{\r
+ ;\r
+}\r
+void LOS_TRACE_ISR_ENTER(U32 hwiIndex)\r
+{\r
+ ;\r
+}\r
+void LOS_TRACE_ISR_EXIT(U32 hwiIndex)\r
+{\r
+ ;\r
+}\r
+#endif\r
+\r
+/**\r
+ * swtmr trace.\r
+ */\r
+#if (ENABLE_SWTMR_TRACE == 1)\r
+void LOS_TRACE_SWTMR_EXPIRED(UINT16 timerId)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32(ID_OFFSET + ID_LOS_SWTMR_EXPIRED, (UINT32)timerId);\r
+}\r
+void LOS_TRACE_SWTMR_CREATE(UINT16 timerId)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32(ID_OFFSET + ID_LOS_SWTMR_CREATE, (UINT32)timerId);\r
+}\r
+void LOS_TRACE_SWTMR_START(UINT16 timerId, UINT8 mode, UINT8 overrun, UINT32 interval, UINT32 expiry)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x5(ID_OFFSET + ID_LOS_SWTMR_START, (UINT32)timerId, (UINT32)mode, (UINT32)overrun,\r
+ (UINT32)interval, (UINT32)expiry);\r
+}\r
+void LOS_TRACE_SWTMR_STOP(UINT16 timerId)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32(ID_OFFSET + ID_LOS_SWTMR_STOP, (UINT32)timerId);\r
+}\r
+void LOS_TRACE_SWTMR_DELETE(UINT16 timerId)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32(ID_OFFSET + ID_LOS_SWTMR_DELETE, (UINT32)timerId);\r
+}\r
+#endif\r
+\r
+/**\r
+ * hwi trace.\r
+ */\r
+// Machine timer interrupt too frequency\r
+#define OS_TICK_INT_NUM_SYSTEM_VIEW 7\r
+void LOS_TRACE_HWI_RESPONSE_IN(UINT32 hwiNum)\r
+{\r
+ if (hwiNum == OS_TICK_INT_NUM_SYSTEM_VIEW) {\r
+ return;\r
+ }\r
+ SEGGER_SYSVIEW_RecordU32(ID_OFFSET + LOS_TRACE_HWI_RESPONSE_IN, hwiNum);\r
+ SEGGER_SYSVIEW_RecordEnterISR();\r
+}\r
+void LOS_TRACE_HWI_RESPONSE_OUT(UINT32 hwiNum)\r
+{\r
+ if (hwiNum == OS_TICK_INT_NUM_SYSTEM_VIEW) {\r
+ return;\r
+ }\r
+ SEGGER_SYSVIEW_RecordU32(ID_OFFSET + ID_LOS_HWI_RESPONSE_OUT, hwiNum);\r
+ SEGGER_SYSVIEW_RecordExitISR();\r
+}\r
+#if (ENABLE_HWI_TRACE == 1)\r
+void LOS_TRACE_HWI_CREATE(UINT32 hwiNum, HWI_PRIOR_T hwiPrio, HWI_MODE_T hwiMode, UINTPTR hwiHandler)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x4(ID_OFFSET + ID_LOS_HWI_CREATE, hwiNum, (UINT32)hwiPrio, (UINT32)hwiMode,\r
+ (UINT32)hwiHandler);\r
+}\r
+void LOS_TRACE_HWI_CREATE_NODE(UINT32 hwiNum, UINTPTR pDevId, UINT32 ret)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x2(ID_OFFSET + ID_LOS_HWI_CREATE_NODE, (UINT32)pDevId, ret);\r
+}\r
+void LOS_TRACE_HWI_DELETE(UINT32 hwiNum)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32(ID_OFFSET + ID_LOS_HWI_DELETE, hwiNum);\r
+}\r
+void LOS_TRACE_HWI_DELETE_NODE(UINT32 hwiNum, UINTPTR pDevId, UINT32 ret)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x3(ID_OFFSET + ID_LOS_HWI_DELETE_NODE, hwiNum, (UINT32)pDevId, ret);\r
+}\r
+void LOS_TRACE_HWI_TRIGGER(UINT32 hwiNum)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32(ID_OFFSET + ID_LOS_HWI_TRIGGER, hwiNum);\r
+}\r
+void LOS_TRACE_HWI_ENABLE(UINT32 hwiNum)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32(ID_OFFSET + ID_LOS_HWI_ENABLE, hwiNum);\r
+}\r
+void LOS_TRACE_HWI_DISABLE(UINT32 hwiNum)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32(ID_OFFSET + ID_LOS_HWI_DISABLE, hwiNum);\r
+}\r
+void LOS_TRACE_HWI_CLEAR(UINT32 hwiNum)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32(ID_OFFSET + ID_LOS_HWI_CLEAR, hwiNum);\r
+}\r
+void LOS_TRACE_HWI_SETPRI(UINT32 hwiNum, HWI_PRIOR_T priority)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x2(ID_OFFSET + ID_LOS_HWI_SETPRI, hwiNum, (UINT32)priority);\r
+}\r
+void LOS_TRACE_HWI_SETAFFINITY(UINT32 hwiNum, UINT32 cpuMask)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x2(ID_OFFSET + ID_LOS_HWI_SETAFFINITY, hwiNum, cpuMask);\r
+}\r
+void LOS_TRACE_HWI_SENDIPI(UINT32 hwiNum, UINT32 cpuMask)\r
+{\r
+ SEGGER_SYSVIEW_RecordU32x2(ID_OFFSET + ID_LOS_HWI_SENDIPI, hwiNum, cpuMask);\r
+}\r
+#endif\r
+/* ********************************************************************\r
+ *\r
+ * Public API structures\r
+ *\r
+ * *********************************************************************\r
+ */\r
+// Callbacks provided to SYSTEMVIEW by FreeRTOS\r
+const SEGGER_SYSVIEW_OS_API SYSVIEW_X_OS_TraceAPI = {\r
+ _cbGetTime,\r
+ _cbSendTaskList,\r
+};\r
+\r
+/* ************************** End of file *************************** */\r
--- /dev/null
+/* ********************************************************************\r
+* SEGGER Microcontroller GmbH & Co. KG *\r
+* The Embedded Experts *\r
+**********************************************************************\r
+* *\r
+* (c) 2015 - 2017 SEGGER Microcontroller GmbH & Co. KG *\r
+* *\r
+* www.segger.com Support: support@segger.com *\r
+* *\r
+**********************************************************************\r
+* *\r
+* SEGGER SystemView * Real-time application analysis *\r
+* *\r
+**********************************************************************\r
+* *\r
+* All rights reserved. *\r
+* *\r
+* SEGGER strongly recommends to not make any changes *\r
+* to or modify the source code of this software in order to stay *\r
+* compatible with the RTT protocol and J-Link. *\r
+* *\r
+* Redistribution and use in source and binary forms, with or *\r
+* without modification, are permitted provided that the following *\r
+* conditions are met: *\r
+* *\r
+* o Redistributions of source code must retain the above copyright *\r
+* notice, this list of conditions and the following disclaimer. *\r
+* *\r
+* o Redistributions in binary form must reproduce the above *\r
+* copyright notice, this list of conditions and the following *\r
+* disclaimer in the documentation and/or other materials provided *\r
+* with the distribution. *\r
+* *\r
+* o Neither the name of SEGGER Microcontroller GmbH & Co. KG *\r
+* nor the names of its contributors may be used to endorse or *\r
+* promote products derived from this software without specific *\r
+* prior written permission. *\r
+* *\r
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND *\r
+* CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, *\r
+* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF *\r
+* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE *\r
+* DISCLAIMED. IN NO EVENT SHALL SEGGER Microcontroller BE LIABLE FOR *\r
+* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR *\r
+* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT *\r
+* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; *\r
+* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *\r
+* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT *\r
+* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE *\r
+* USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH *\r
+* DAMAGE. *\r
+* *\r
+**********************************************************************\r
+* *\r
+* SystemView version: V2.52a *\r
+* *\r
+**********************************************************************\r
+-------------------------- END-OF-HEADER -----------------------------\r
+\r
+File : SEGGER_SYSVIEW_LiteOS.h\r
+Purpose : Interface between FreeRTOS and SystemView.\r
+Revision: $Rev: 7745 $\r
+\r
+Notes:\r
+ (1) Include this file at the end of FreeRTOSConfig.h\r
+*/\r
+\r
+#ifndef SYSVIEW_LITEOS_H\r
+#define SYSVIEW_LITEOS_H\r
+\r
+#include "SEGGER_SYSVIEW.h"\r
+#include "los_event.h"\r
+#include "los_mux.h"\r
+#include "los_queue.h"\r
+#include "los_sem.h"\r
+#include "los_task.h"\r
+#include "los_task_base.h"\r
+\r
+/**\r
+ * Configure the modules to be traced.\r
+ */\r
+#define ENABLE_TASK_TRACE 1\r
+#define ENABLE_QUEUE_TRACE 0\r
+#define ENABLE_EVENT_TRACE 0\r
+#define ENABLE_MUX_TRACE 0\r
+#define ENABLE_SEM_TRACE 0\r
+#define ENABLE_MEM_TRACE 0\r
+#define ENABLE_HWI_TRACE 0\r
+#define ENABLE_SWTMR_TRACE 0\r
+\r
+/*\r
+ * Several functions take an TaskHandle_t parameter that can optionally be NULL,\r
+ * where NULL is used to indicate that the handle of the currently executing\r
+ * task should be used in place of the parameter. This macro simply checks to\r
+ * see if the parameter is NULL and returns a pointer to the appropriate TCB.\r
+ */\r
+\r
+#define SYSVIEW_LITEOS_MAX_NOF_TASKS PRODUCT_TSK_MAX_SUPPORT_NUM\r
+#define traceMOVED_TASK_TO_READY_STATE(pstTaskCB) SEGGER_SYSVIEW_OnTaskStartReady((U32)pstTaskCB)\r
+#define traceREADDED_TASK_TO_READY_STATE(pxTCB)\r
+#define traceMOVED_TASK_TO_DELAYED_LIST(pstTaskCB) SEGGER_SYSVIEW_OnTaskStopReady((U32)pstTaskCB, (1u << 2))\r
+#define traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST(pstTaskCB) SEGGER_SYSVIEW_OnTaskStopReady((U32)pstTaskCB, (1u << 2))\r
+#define traceMOVED_TASK_TO_SUSPENDED_LIST(pstTaskCB) SEGGER_SYSVIEW_OnTaskStopReady((U32)pstTaskCB, ((3u << 3) | 3))\r
+#define traceISR_EXIT_TO_SCHEDULER() SEGGER_SYSVIEW_RecordExitISRToScheduler()\r
+#define traceISR_EXIT() SEGGER_SYSVIEW_RecordExitISR()\r
+#define traceISR_ENTER() SEGGER_SYSVIEW_RecordEnterISR()\r
+#if (portSTACK_GROWTH < 0)\r
+#define traceTASK_CREATE(pstTaskCB) \\r
+ if (pstTaskCB != NULL) { \\r
+ SEGGER_SYSVIEW_OnTaskCreate((U32)pstTaskCB); \\r
+ SYSVIEW_AddTask((U32)pstTaskCB, (pstTaskCB->taskName), pstTaskCB->priority, \\r
+ (U32)(pstTaskCB->topOfStack - pstTaskCB->stackSize), ((U32)pstTaskCB->stackSize)); \\r
+ }\r
+#else\r
+#define traceTASK_CREATE(pstTaskCB) \\r
+ if (pstTaskCB != NULL) { \\r
+ SEGGER_SYSVIEW_OnTaskCreate((U32)pstTaskCB); \\r
+ SYSVIEW_AddTask((U32)pstTaskCB, (pstTaskCB->taskName), pstTaskCB->priority, \\r
+ (U32)(pstTaskCB->topOfStack + pstTaskCB->stackSize), (U32)(pstTaskCB->stackSize)); \\r
+ }\r
+#endif\r
+\r
+/* ********************************************************************\r
+ *\r
+ * Defines, fixed\r
+ *\r
+ * *********************************************************************\r
+ */\r
+#define ID_OFFSET (32u)\r
+\r
+#define ID_LOS_TASK_SIGNAL (1u)\r
+#define ID_LOS_TASK_DELETE (2u)\r
+#define ID_LOS_TASK_RESUME (3u)\r
+#define ID_LOS_TASK_PRIOSET (4u)\r
+\r
+#define ID_LOS_TASK_SWITCH (5u)\r
+#define ID_LOS_TASK_SUSPEND (6u)\r
+\r
+#define ID_LOS_QUEUECREATE (20u)\r
+#define ID_LOS_QUEUEDELETE (21u)\r
+#define ID_LOS_QUEUEREAD (22u)\r
+#define ID_LOS_QUEUEWRITE (23u)\r
+#define ID_LOS_QUEUERW (24u)\r
+\r
+#define ID_LOS_EVENTINIT (30u)\r
+#define ID_LOS_EVENTDESTROY (31u)\r
+#define ID_LOS_EVENTREAD (32u)\r
+#define ID_LOS_EVENTWRITE (33u)\r
+#define ID_LOS_EVENTCLEAR (34u)\r
+#define ID_LOS_CON_READ (35u)\r
+#define ID_LOS_CON_WRITE (36u)\r
+\r
+#define ID_LOS_MUXCREATE (40u)\r
+#define ID_LOS_MUXDELETE (41u)\r
+#define ID_LOS_MUXPEND (42u)\r
+#define ID_LOS_MUXPOST (43u)\r
+\r
+#define ID_LOS_SEMCREATE (50u)\r
+#define ID_LOS_SEMDELETE (51u)\r
+#define ID_LOS_SEMPEND (52u)\r
+#define ID_LOS_SEMPOST (53u)\r
+\r
+#define ID_LOS_MEMINIT (60u)\r
+#define ID_LOS_MEMDEINIT (61u)\r
+#define ID_LOS_MEMALLOC (62u)\r
+#define ID_LOS_MEMFREE (63u)\r
+#define ID_LOS_MEMREALLOC (64u)\r
+#define ID_LOS_MEMALLOCALIGN (65u)\r
+\r
+#define ID_LOS_SWTMR_CREATE (70u)\r
+#define ID_LOS_SWTMR_START (71u)\r
+#define ID_LOS_SWTMR_STOP (72u)\r
+#define ID_LOS_SWTMR_EXPIRED (73u)\r
+#define ID_LOS_SWTMR_DELETE (74u)\r
+\r
+#define ID_LOS_HWI_CREATE (80u)\r
+#define ID_LOS_HWI_DELETE (81u)\r
+#define ID_LOS_HWI_CREATE_NODE (82u)\r
+#define ID_LOS_HWI_DELETE_NODE (83u)\r
+#define ID_LOS_HWI_TRIGGER (84u)\r
+#define ID_LOS_HWI_ENABLE (85u)\r
+#define ID_LOS_HWI_DISABLE (86u)\r
+#define ID_LOS_HWI_CLEAR (87u)\r
+#define ID_LOS_HWI_SETPRI (88u)\r
+#define ID_LOS_HWI_HWI_RESPONSE_IN (89u)\r
+#define ID_LOS_HWI_RESPONSE_OUT (90u)\r
+#define ID_LOS_HWI_SETAFFINITY (91u)\r
+#define ID_LOS_HWI_SENDIPI (92u)\r
+\r
+/* ********************************************************************\r
+ *\r
+ * API functions\r
+ *\r
+ * *********************************************************************\r
+ */\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+void SYSVIEW_AddTask(U32 xHandle, const char *pcTaskName, unsigned uxCurrentPriority, U32 pxStack,\r
+ unsigned uStackHighWaterMark);\r
+void SYSVIEW_UpdateTask(U32 xHandle, const char *pcTaskName, unsigned uxCurrentPriority, U32 pxStack,\r
+ unsigned uStackHighWaterMark);\r
+void SYSVIEW_DeleteTask(U32 xHandle);\r
+void SYSVIEW_SendTaskInfo(U32 TaskID, const char *sName, unsigned Prio, U32 StackBase, unsigned StackSize);\r
+void SYSVIEW_RecordU32x4(unsigned Id, U32 Para0, U32 Para1, U32 Para2, U32 Para3);\r
+void SYSVIEW_RecordU32x5(unsigned Id, U32 Para0, U32 Para1, U32 Para2, U32 Para3, U32 Para4);\r
+\r
+/**\r
+ * queue trace.\r
+ */\r
+#if (ENABLE_QUEUE_TRACE == 1)\r
+void LOS_TRACE_QUEUE_CREATE(UINT32 queueId, UINT16 len, UINT16 msgSize, UINTPTR queue, UINT8 queueMemType);\r
+void LOS_TRACE_QUEUE_DELETE(UINT32 queueId, UINT8 queueState, UINT16 readWriteableCnt);\r
+void LOS_TRACE_QUEUE_RW(UINT32 queueId, UINT16 queueSize, UINT32 bufferSize, UINT32 operateType, UINT16 readableCnt,\r
+ UINT16 writeableCnt, UINT32 timeout);\r
+#else\r
+#define LOS_TRACE_QUEUE_CREATE(...)\r
+#define LOS_TRACE_QUEUE_DELETE(...)\r
+#define LOS_TRACE_QUEUE_RW(...)\r
+#endif\r
+\r
+/**\r
+ * event trace.\r
+ */\r
+#if (ENABLE_EVENT_TRACE == 1)\r
+void LOS_TRACE_EVENT_CREATE(UINTPTR eventCB);\r
+void LOS_TRACE_EVENT_READ(UINTPTR eventCB, UINT32 uwEventID, UINT32 eventMask, UINT32 mode, UINT32 timeout);\r
+void LOS_TRACE_EVENT_WRITE(UINTPTR eventCB, UINT32 uwEventID, UINT32 events);\r
+void LOS_TRACE_EVENT_CLEAR(UINTPTR eventCB, UINT32 uwEventID, UINT32 events);\r
+void LOS_TRACE_EVENT_DELETE(UINTPTR eventCB, UINT32 ret);\r
+void LOS_TRACE_EVENT_COND_READ(UINTPTR eventCB, UINT32 uwEventID);\r
+void LOS_TRACE_EVENT_COND_WRITE(UINTPTR eventCB, UINT32 uwEventID);\r
+#else\r
+#define LOS_TRACE_EVENT_CREATE(...)\r
+#define LOS_TRACE_EVENT_READ(...)\r
+#define LOS_TRACE_EVENT_WRITE(...)\r
+#define LOS_TRACE_EVENT_CLEAR(...)\r
+#define LOS_TRACE_EVENT_DELETE(...)\r
+#define LOS_TRACE_EVENT_COND_READ(...)\r
+#define LOS_TRACE_EVENT_COND_WRITE(...)\r
+#endif\r
+/**\r
+ * mutex trace.\r
+ */\r
+#if (ENABLE_MUX_TRACE == 1)\r
+void LOS_TRACE_MUX_CREATE(UINT32 muxId);\r
+void LOS_TRACE_MUX_POST(UINT32 muxHandle, UINT16 muxCount, UINT32 taskId);\r
+void LOS_TRACE_MUX_PEND(UINT32 muxHandle, UINT16 muxCount, UINT32 taskId, UINT32 timeout);\r
+void LOS_TRACE_MUX_DELETE(UINT32 muxHandle, UINT8 muxStat, UINT16 muxCount, UINT32 taskId);\r
+#else\r
+#define LOS_TRACE_MUX_CREATE(...)\r
+#define LOS_TRACE_MUX_POST(...)\r
+#define LOS_TRACE_MUX_PEND(...)\r
+#define LOS_TRACE_MUX_DELETE(...)\r
+#endif\r
+/**\r
+ * semphore trace.\r
+ */\r
+#if (ENABLE_SEM_TRACE == 1)\r
+void LOS_TRACE_SEM_CREATE(UINT32 semId, UINT8 type, UINT16 count);\r
+void LOS_TRACE_SEM_DELETE(UINT32 semHandle, UINT32 ret);\r
+void LOS_TRACE_SEM_PEND(UINT32 semHandle, UINT16 semCount, UINT32 timeout);\r
+void LOS_TRACE_SEM_POST(UINT32 semHandle, UINT8 semType, UINT16 semCount);\r
+#else\r
+#define LOS_TRACE_SEM_CREATE(...)\r
+#define LOS_TRACE_SEM_DELETE(...)\r
+#define LOS_TRACE_SEM_PEND(...)\r
+#define LOS_TRACE_SEM_POST(...)\r
+#endif\r
+\r
+/**\r
+ * memory alloc&free trace.\r
+ */\r
+#if (ENABLE_MEM_TRACE == 1)\r
+void LOS_TRACE_MEM_INFO_REQ(VOID *pool);\r
+void LOS_TRACE_MEM_ALLOC(VOID *pool, UINTPTR ptr, UINT32 size);\r
+void LOS_TRACE_MEM_FREE(VOID *pool, UINTPTR ptr);\r
+void LOS_TRACE_MEM_REALLOC(VOID *pool, UINTPTR ptr, UINT32 size);\r
+void LOS_TRACE_MEM_ALLOC_ALIGN(VOID *pool, UINTPTR ptr, UINT32 size, UINT32 boundary);\r
+#else\r
+#define LOS_TRACE_MEM_INFO_REQ(...)\r
+#define LOS_TRACE_MEM_ALLOC(...)\r
+#define LOS_TRACE_MEM_FREE(...)\r
+#define LOS_TRACE_MEM_REALLOC(...)\r
+#define LOS_TRACE_MEM_ALLOC_ALIGN(...)\r
+#endif\r
+/**\r
+ * task trace.\r
+ */\r
+#if (ENABLE_TASK_TRACE == 1)\r
+#ifdef LOSCFG_KERNEL_SMP\r
+void LOS_TRACE_TASK_SIGNAL(UINT32 taskId, UINT32 mpSignal);\r
+#endif\r
+// void LOS_TRACE_TASK_DELAY(UINT32 tick);\r
+void LOS_TRACE_TASK_RESUME(UINT32 taskId, UINT16 taskStatus, UINT16 priority);\r
+void LOS_TRACE_TASK_DELETE(UINT32 taskId, UINT16 taskStatus, UINT32 usrStack);\r
+void LOS_TRACE_TASK_PRIOSET(UINT32 taskId, UINT16 taskStatus, UINT16 priority, UINT16 taskPrio);\r
+// sched trace\r
+void LOS_TRACE_TASK_SWITCH(UINT32 taskId, UINT16 runPriority, UINT16 curTaskStatus, UINT16 newPriority,\r
+ UINT16 newTaskStatus);\r
+#ifndef LOSCFG_SCHED_LATENCY\r
+void LOS_TRACE_TASK_SIGNAL(UINT32 taskId, UINT32 schedFlag);\r
+#endif\r
+void LOS_TRACE_TASK_SUSPEND(UINT32 taskId, UINT16 taskStatus, UINT32 currTaskId);\r
+void LOS_TRACE_TASK_SWITCHED_IN(void);\r
+void LOS_TRACE_MOVED_TASK_TO_READY_STATE(const LosTaskCB *pstTaskCB);\r
+void LOS_TRACE_MOVED_TASK_TO_DELAYED_LIST(const LosTaskCB *pstTaskCB);\r
+void LOS_TRACE_MOVED_TASK_TO_SUSPENDED_LIST(const LosTaskCB *pstTaskCB);\r
+void LOS_TRACE_ISR_EXIT_TO_SCHEDULER(void);\r
+void LOS_TRACE_ISR_ENTER(U32 hwiIndex);\r
+void LOS_TRACE_ISR_EXIT(U32 hwiIndex);\r
+#else\r
+#define LOS_TRACE_TASK_SIGNAL(...)\r
+#define LOS_TRACE_TASK_RESUME(...)\r
+#define LOS_TRACE_TASK_DELETE(...)\r
+#define LOS_TRACE_TASK_PRIOSET(...)\r
+#define LOS_TRACE_TASK_SWITCH(...)\r
+#define LOS_TRACE_TASK_SUSPEND(...)\r
+#endif\r
+/**\r
+ * swtmr trace.\r
+ */\r
+#if (ENABLE_SWTMR_TRACE == 1)\r
+void LOS_TRACE_SWTMR_EXPIRED(UINT16 timerId);\r
+void LOS_TRACE_SWTMR_CREATE(UINT16 timerId);\r
+void LOS_TRACE_SWTMR_START(UINT16 timerId, UINT8 mode, UINT8 overrun, UINT32 interval, UINT32 expiry);\r
+void LOS_TRACE_SWTMR_STOP(UINT16 timerId);\r
+void LOS_TRACE_SWTMR_DELETE(UINT16 timerId);\r
+#else\r
+#define LOS_TRACE_SWTMR_EXPIRED(...)\r
+#define LOS_TRACE_SWTMR_CREATE(...)\r
+#define LOS_TRACE_SWTMR_START(...)\r
+#define LOS_TRACE_SWTMR_STOP(...)\r
+#define LOS_TRACE_SWTMR_DELETE(...)\r
+#endif\r
+\r
+/**\r
+ * hwi trace.\r
+ */\r
+void LOS_TRACE_HWI_RESPONSE_IN(UINT32 hwiNum);\r
+void LOS_TRACE_HWI_RESPONSE_OUT(UINT32 hwiNum);\r
+#if (ENABLE_HWI_TRACE == 1)\r
+void LOS_TRACE_HWI_CREATE(UINT32 hwiNum, HWI_PRIOR_T hwiPrio, HWI_MODE_T hwiMode, UINTPTR hwiHandler);\r
+void LOS_TRACE_HWI_CREATE_NODE(UINT32 hwiNum, UINTPTR pDevId, UINT32 ret);\r
+void LOS_TRACE_HWI_DELETE(UINT32 hwiNum);\r
+void LOS_TRACE_HWI_DELETE_NODE(UINT32 hwiNum, UINTPTR pDevId, UINT32 ret);\r
+void LOS_TRACE_HWI_TRIGGER(UINT32 hwiNum);\r
+void LOS_TRACE_HWI_ENABLE(UINT32 hwiNum);\r
+void LOS_TRACE_HWI_DISABLE(UINT32 hwiNum);\r
+void LOS_TRACE_HWI_CLEAR(UINT32 hwiNum);\r
+void LOS_TRACE_HWI_SETPRI(UINT32 hwiNum, HWI_PRIOR_T priority);\r
+void LOS_TRACE_HWI_SETAFFINITY(UINT32 hwiNum, UINT32 cpuMask);\r
+void LOS_TRACE_HWI_SENDIPI(UINT32 hwiNum, UINT32 cpuMask);\r
+#else\r
+#define LOS_TRACE_HWI_CREATE(...)\r
+#define LOS_TRACE_HWI_CREATE_NODE(...)\r
+#define LOS_TRACE_HWI_DELETE(...)\r
+#define LOS_TRACE_HWI_DELETE_NODE(...)\r
+#define LOS_TRACE_HWI_TRIGGER(...)\r
+#define LOS_TRACE_HWI_ENABLE(...)\r
+#define LOS_TRACE_HWI_DISABLE(...)\r
+#define LOS_TRACE_HWI_CLEAR(...)\r
+#define LOS_TRACE_HWI_SETPRI(...)\r
+#define LOS_TRACE_HWI_SETAFFINITY(...)\r
+#define LOS_TRACE_HWI_SENDIPI(...)\r
+#endif\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* SYSVIEW_LITEOS_H */\r
+\r
+/* ************************** End of file *************************** */\r
--- /dev/null
+将SYSVIEW_LiteOS.txt放置在PC端SYSTEMVIEW工具的Description文件夹下。
\ No newline at end of file
--- /dev/null
+34 LOS_TaskDelete taskId = %u, taskName = %s.\r
+36 OsSchedPrioModify taskId = %u, priority = %u.\r
+52 OsQueueCreateInternal queueId = %u, len = %u, queue = %u, queueMemType = %u.\r
+53 LOS_QueueDelete queueId = %u, queueState = %u, readWriteableCnt = %u.\r
+56 OsQueueOperate queueId = %u,, operateType = %u, readableCnt = %u, writeableCnt = %u, timeout = %u.\r
+62 LOS_EventInit %s\r
+63 LOS_EventDestroy ret = %u, %s.\r
+64 LOS_EventRead uwEventID = %u, eventMask = %u, %s.\r
+65 OsEventWrite uwEventID = %u, events = %u.\r
+66 LOS_EventClear uwEventID = %u, events = %u.\r
+67 EventCondRead uwEventID = %u\r
+68 LOS_EventCondWrite uwEventID = %u \r
+72 LOS_MuxCreate muxId = %u, %s. \r
+73 LOS_MuxDelete muxHandle = %u, muxStat = %u, muxCount = %u, taskId = %u.\r
+74 LOS_MuxPend muxHandle = %u, muxCount = %u, taskId = %u, timeout = %u.\r
+75 LOS_MuxPost muxHandle = %u, muxCount = %u, taskId = %u. \r
+82 OsSemCreate semId = %u, type = %u, count = %u.\r
+83 LOS_SemDelete semHandle = %u, ret = %u, %s.\r
+84 LOS_SemPend semHandle = %u, semCount = %u, timeout = %u.\r
+85 LOS_SemPost semHandle = %u, semType = %u, semCount = %u. \r
+92 LOS_MemPoolInit pool = %x.\r
+94 LOS_MemAlloc pool = %x, ptr = %x, size = %u.\r
+95 LOS_MemFree pool = %x, ptr = %x.\r
+96 LOS_MemRealloc pool = %x, ptr = %x, size = %u.\r
+97 LOS_MemAllocAlign pool = %x, ptr = %x, size = %u, boundary = %u. \r
+102 LOS_SwtmrCreate timerId = %u.\r
+103 LOS_SwtmrStart timerId = %u, mode = %u, overrun = %u, interval = %u, expiry = %u.\r
+104 LOS_SwtmrStop timerId = %u.\r
+105 OsSwtmrScan timerId = %u. \r
+106 OsSwtmrDeleteOption timerId = %u. \r
+112 LOS_HwiCreate hwiNum = %u, hwiPrio = %u, hwiMode = %u, hwiHandler = %u.\r
+113 LOS_HwiDelete hwiNum = %u \r
+114 LOS_HwiCreate pDevId = %u, ret = %u.\r
+115 LOS_HwiDelete hwiNum = %u, pDevId = %u, ret = %u.\r
+116 LOS_HwiTrigger hwiNum = %u. \r
+117 LOS_HwiEnable hwiNum = %u.\r
+118 LOS_HwiDisable hwiNum = %u.\r
+119 LOS_HwiClear hwiNum = %u. \r
+120 LOS_HwiSetPriority hwiNum = %u, priority = %u.\r
+121 OsIntHandle hwiNum = %u.\r
+122 OsIntHandle hwiNum = %u.\r
+123 LOS_HwiSetAffinity hwiNum = %u, cpuMask = %u.\r
+124 LOS_HwiSendIpi hwiNum = %u, cpuMask = %u.\r
SliceStruct curSlice_;
SliceStruct prevSlice_;
-
+ uint16_t targetSliceIdFromJS_ = 0;
uint16_t defaultSliceId_ = gSliceInvalid;
uint16_t curSlicePriority_ = gSliceDefaultPriority;
SliceTransition sliceTransition_;
void ResumeSlice(const uint16_t priority = gSliceDefaultPriority);
void StartSlice(const uint16_t sliceId, const uint16_t priority);
-
void StopSlice();
void PostChangeSlice(const uint16_t targetSliceId, TransitionType type, const uint16_t priority);
*/
#include "Ability.h"
+
#include "graphic_service.h"
#include "abilityms_slite_client.h"
#include "common/input_device_manager.h"
nextSlice->OnStart();
nextSlice->OnResume();
+
}
ListsNode<Ability::ProxyStruct>* Ability::Find(const uint16_t sliceId)
void Ability::ChangeSlice(const uint16_t targetSliceId, TransitionType type, const uint16_t priority)
{
- if (GetCurSliceId() == targetSliceId) {
- return;
- }
if (osal_atomic_read(&transitionCount_) <= 0) {
osal_atomic_inc(&transitionCount_);
GraphicService::GetInstance()->PostGraphicEvent(std::bind(&Ability::PostChangeSlice, this, targetSliceId,
// slice页面跳转,先onstop,再onstart.在一个线程同步执行绘制,不会出现闪屏现象
#ifdef JS_ENABLE
ElementName *elementName = OHOS::AbilityMsClient::GetInstance().GetTopAbility();
- if (strcmp(elementName->bundleName, "com.huawei.launcher") != 0) {
+ if (elementName != nullptr && strcmp(elementName->bundleName, "com.huawei.launcher") != 0) {
OHOS::AbilityMsClient::GetInstance().ForceStop(elementName->bundleName);
- }
+ targetSliceIdFromJS_ = targetSliceId;
+ osal_atomic_dec(&transitionCount_);
+ return;
+ }
#endif
StartSlice(targetSliceId, priority);
void Ability::ResumeSlice(const uint16_t priority)
{
uint16_t targetSliceId = gSliceInvalid;
-
- if (allSlices_.empty()) {
+ if (targetSliceIdFromJS_ != 0) {
+ targetSliceId = targetSliceIdFromJS_;
+ targetSliceIdFromJS_ = 0;
+ } else if (allSlices_.empty()) {
targetSliceId = defaultSliceId_;
} else {
targetSliceId = GetCurSliceId();
callback.start_service_cb(server_id, handle, status);\r
}\r
}\r
+ g_uuid_list.pop_front();\r
wrapper_gatts_service_start();\r
}\r
}\r
bt_uuid_t &uuid = g_uuid_list.front();\r
// 服务异步添加,需要保证当前服务start后,再添加下一个服务\r
(void)gatts_add_service(gatts_server_id, &uuid, true);\r
- g_uuid_list.pop_front();\r
} else {\r
g_svr_handle_list.clear();\r
}\r
*/
#include "DialVideoView.h"
-#ifdef SUPPORT_AT_OHOSFWK
-#include "ui_screennotify.h"
-#endif
namespace OHOS {
static constexpr int16_t JPEG_HEIGHT_DIVISOR = 2;
static constexpr int16_t BUFFER_QUEUE_SIZE = 2;
static constexpr int16_t STRIDE_ALIGNMENT_VALUE = 128;
-#ifdef SUPPORT_AT_OHOSFWK
-static MediaVideoPlay *g_videoPlay = nullptr;
-static void ScreenStatusNotify(ScreenStatus status)
-{
- if (g_videoPlay == nullptr) {
- return;
- }
-
- if (status == SCREEN_STATUS_OFF && g_videoPlay->isPlayed_) {
- g_videoPlay->PauseVideoPlay();
- } else if (status == SCREEN_STATUS_ON) {
- if (g_videoPlay->isPause_) {
- g_videoPlay->ResumeVideoPlay();
- } else if (g_videoPlay->isExited_) {
- g_videoPlay->StartVideoPlay();
- }
- }
-}
-#endif
-
static inline int32_t MediaByteAlign(int16_t value, int16_t align)
{
return (((value) + (align) - 1) & (~((align) - 1)));
DialVideoView::~DialVideoView()
{
-#ifdef SUPPORT_AT_OHOSFWK
- g_videoPlay = nullptr;
- deregisterNotifyScreenStatus(ScreenStatusNotify);
-#endif
if (videoPlayer_ != nullptr) {
delete videoPlayer_;
}
videoPlayer_ = new MediaVideoPlay(surface, fd, offset_, true);
videoPlayer_->SetSyncExitMode(true);
-#ifdef SUPPORT_AT_OHOSFWK
- g_videoPlay = videoPlayer_;
- registerNotifyScreenStatus(ScreenStatusNotify);
-#endif
return true;
}
#include "DialBinParser.h"
#include "ModelDialDataFactory.h"
#include "common/low_power_manager.h"
+#include "common/image_cache_manager.h"
+#ifdef SUPPORT_AT_OHOSFWK
+#include "ui_screennotify.h"
+#endif
namespace OHOS {
+static DialVideoView* g_video = nullptr;
+
+#ifdef SUPPORT_AT_OHOSFWK
+static void ScreenStatusNotify(ScreenStatus status)
+{
+ if (g_video == nullptr) {
+ return;
+ }
+ if (status == SCREEN_STATUS_OFF && g_video->IsPlayed()) {
+ g_video->PausePlay();
+ } else if (status == SCREEN_STATUS_ON) {
+ if (g_video->IsPaused()) {
+ g_video->ResumePlay();
+ } else if (!g_video->IsPlayed()) {
+ g_video->StartPlay();
+ }
+ }
+}
+#endif
+
DialViewGroup::DialViewGroup(void)
{
SetTouchable(true);
DialViewGroup::~DialViewGroup(void)
{
+ if (video_ != nullptr) {
+#ifdef SUPPORT_AT_OHOSFWK
+ deregisterNotifyScreenStatus(ScreenStatusNotify);
+#endif
+ g_video = nullptr;
+ }
if (kaleidoscope_ != nullptr) {
kaleidoscope_->ClearFocus();
kaleidoscope_ = nullptr;
void DialViewGroup::ClearDial()
{
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(filePath_);
ListNode<DialDataType>* passiveNode = passiveUpdateTypes_.Head();
while (passiveNode != passiveUpdateTypes_.End()) {
DialDataType type = passiveNode->data_;
return;
}
DialBinParser::GetInstance()->UpdateDial(filePath_, fp_, this);
- if (video_ != nullptr) {
- video_->StartPlay();
- }
-
- if (kaleidoscope_ != nullptr) {
- kaleidoscope_->RequestFocus();
- kaleidoscope_->StartRotateAnimator();
- }
resPreloaded_ = true;
}
}
return;
}
video_ = reinterpret_cast<DialVideoView*>(view);
+ g_video = video_;
+#ifdef SUPPORT_AT_OHOSFWK
+ registerNotifyScreenStatus(ScreenStatusNotify);
+#endif
}
}
if (isActive) {
if (video_->IsPaused()) {
video_->ResumePlay();
- } else if (video_->IsStopped()) {
+ } else if (!video_->IsPlayed()) {
video_->StartPlay();
}
+ g_video = video_;
} else {
if (video_->IsPaused() || video_->IsPlayed()) {
video_->StopPlay();
}
ClearCache();
+ g_video = nullptr;
}
}
if (video_ == nullptr) {
return;
}
- if (!isCovered) {
+ if (isCovered) {
+ g_video = nullptr;
+ } else {
if (video_->IsPaused()) {
video_->ResumePlay();
- } else if (video_->IsStopped()) {
+ } else if (!video_->IsPlayed()) {
video_->StartPlay();
}
+ g_video = video_;
}
}
if (video_ != nullptr) {
if (video_->IsPaused()) {
video_->ResumePlay();
- } else if (video_->IsStopped()) {
+ } else if (!video_->IsPlayed()) {
video_->StartPlay();
}
+ g_video = video_;
} else if (kaleidoscope_ != nullptr) {
kaleidoscope_->RequestFocus();
kaleidoscope_->StartRotateAnimator();
if (!video_->IsStopped()) {
video_->StopPlay();
}
+ g_video = nullptr;
} else if (kaleidoscope_ != nullptr) {
kaleidoscope_->StopRotateAnimator();
kaleidoscope_->ClearFocus();
}
break;
case HFP_SCO_STATE_CONNECTED:
- CopyBdAddr(bdAddr);
- ScoConnectPro();
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "[ScoStateChanged] SCO connected!");
break;
static const char *GetFeatureName(Feature *feature_);
static void OnInitialize(Feature *feature_, Service *parent, Identity id);
static void OnStop(Feature *feature_, Identity id);
-static BOOL OnMessage(Feature *feature_, Request **req);
+static BOOL OnMessage(Feature *feature_, Request *req);
static int32 SubscribeTopic(IUnknown *broadcastApi, const Topic topic, const Subscriber* subscriber);
static int32 UnsubscribeTopic(IUnknown *broadcastApi, const Topic topic, const Subscriber* subscriber);
(void)identity;
}
-static BOOL OnMessage(Feature *feature, Request **req)
+static BOOL OnMessage(Feature *feature, Request *req)
{
- Request *r = (*req);
WEARABLE_LOGI(WEARABLE_LOG_MODULE_BROADCASE_SERVICE, "BroadcastFeature req=0x%p, msgId=%u, len=%u, data=0x%p",
- r, r->msgId, r->len, r->data);
- HandleTopicMessage((BroadcastFeature *)feature, *req);
+ req, req->msgId, req->len, req->data);
+ HandleTopicMessage((BroadcastFeature *)feature, req);
return TRUE;
}
${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_cmd.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/notify/alarm_notification.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/notify/makephone_notification.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/notification_manager_customer.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/vendor_app/baidu/baidu_app.cpp
)
else()
${CMAKE_CURRENT_SOURCE_DIR}/src/msg_center_cmd.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/notify/alarm_notification.cpp
${CMAKE_CURRENT_SOURCE_DIR}/src/notify/makephone_notification.cpp
- ${CMAKE_CURRENT_SOURCE_DIR}/src/notify/notification_manager_customer.cpp
)
endif()
MSGCENTER_TYPE_ID_VECTOR_NAVI_REQ_DESTROY_PAGE,\r
MSGCENTER_TYPE_ID_VECTOR_NAVI_BT_DISCONNECTED,\r
MSGCENTER_TYPE_ID_VECTOR_NAVI_BT_CONNECTED,\r
+ MSGCENTER_TYPE_ID_VECTOR_NAVI_REC_FIRST_BATCH,\r
+ MSGCENTER_TYPE_ID_VECTOR_NAVI_REQ_DESTROY_FROM_WATCH,\r
+ MSGCENTER_TYPE_ID_VECTOR_NAVI_REC_DESTROY_FROM_WATCH\r
} msg_center_vector_navi_type_id_t;\r
\r
typedef enum msg_center_alipay_type_id {\r
"req_regeocode_search",\r
"rec_regeocode_search",\r
"req_destroy_page",\r
+ "null",\r
+ "null",\r
+ "null",\r
+ "req_destroy_from_watch",\r
+ "rec_destroy_from_watch",\r
};\r
\r
static inline const char* vector_navi_get_str(uint8_t type)\r
#ifndef ALARM_NOTIFICATION_H\r
#define ALARM_NOTIFICATION_H\r
\r
-constexpr char* ALARM_IMAGE_DELETE = "alarm_delete";\r
-constexpr char* ALARM_IMAGE_CLOCK = "alarm_clock";\r
-constexpr char* ALARM_VIEW_CLOSE = "alarm_close";\r
-constexpr char* ALARM_VIEW_DELAY = "alarm_delay";\r
-constexpr char* ALARM_VIEW_POPUP = "alarm_popup";\r
+static constexpr const char* ALARM_IMAGE_DELETE = "alarm_delete";\r
+static constexpr const char* ALARM_IMAGE_CLOCK = "alarm_clock";\r
+static constexpr const char* ALARM_VIEW_CLOSE = "alarm_close";\r
+static constexpr const char* ALARM_VIEW_DELAY = "alarm_delay";\r
+static constexpr const char* ALARM_VIEW_POPUP = "alarm_popup";\r
\r
enum class AlarmTimerType {\r
NOTIFY_ALARM_CLOSE = 0,\r
#ifndef NOTIFICATION_MANAGER_H
#define NOTIFICATION_MANAGER_H
#include <functional>
+#include <vector>
#include "common/task.h"
#include "common/screen.h"
namespace OHOS {
using NewNotify = std::function<UIViewGroup* ()>;
using RefreshNotifyContent = std::function<void()>;
-
+typedef void (*FreeNotifyfunc)();
class NotificationManager : public Task {
public:
static NotificationManager* GetInstance()
void SetVolumeScreenStatus(bool status);
bool GetWatchCallStatus();
void SetWatchCallStatus(bool status);
-
+ void RegisterNotifyCleanupFunction(FreeNotifyfunc);
void Callback() override;
UIViewGroup* screenContainer_ = nullptr;
bool hasNewNotifyNeedShow_ = false;
bool hasNotifyNeedRefresh_ = false;
bool hasNewNotifyNeedStop_ = false;
+ std::vector<FreeNotifyfunc> notifyCleanupFunctions_;
uint16_t notifyPri = NOTIFY_PRIORITY_DEFAULT;
uint16_t notifyId = -1;
errcode_t msg_center_vector_navi_req_regeocode_search(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
errcode_t msg_center_vector_navi_rec_regeocode_search(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
errcode_t msg_center_vector_navi_req_destroy_page(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_vector_navi_rec_first_batch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_vector_navi_req_destroy_from_watch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+errcode_t msg_center_vector_navi_rec_destroy_from_watch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len);\r
+\r
+bool is_vector_navi_long_distance(uint8_t type);\r
\r
#ifdef __cplusplus\r
#if __cplusplus\r
*/\r
uint8_t duer_msg_center_send_map_info(uint8_t duer_type, void *usr_data, uint16_t usr_len);\r
\r
+/**\r
+ * 接收APP下发的缓存第一次批量请求\r
+ */\r
+uint8_t duer_msg_center_map_to_title(void *data, uint16_t len);\r
+\r
#ifdef __cplusplus\r
#if __cplusplus\r
}\r
{ MSGCENTER_CMD_VECTOR_NAVI, MSGCENTER_TYPE_ID_VECTOR_NAVI_REC_GEOCODE_SEARCH, msg_center_vector_navi_rec_geocode_search},
{ MSGCENTER_CMD_VECTOR_NAVI, MSGCENTER_TYPE_ID_VECTOR_NAVI_REQ_REGEOCODE_SEARCH, msg_center_vector_navi_req_regeocode_search},
{ MSGCENTER_CMD_VECTOR_NAVI, MSGCENTER_TYPE_ID_VECTOR_NAVI_REC_REGEOCODE_SEARCH, msg_center_vector_navi_rec_regeocode_search},
- /* µØÍ¼Ë½ÓÐÐÒé */
+ /* 地图私有协议 */
{ MSGCENTER_CMD_VECTOR_NAVI, MSGCENTER_TYPE_ID_VECTOR_NAVI_REQ_DESTROY_PAGE, msg_center_vector_navi_req_destroy_page},
- { MSGCENTER_CMD_VECTOR_NAVI, MSGCENTER_TYPE_ID_VECTOR_NAVI_BT_DISCONNECTED, NULL},
- { MSGCENTER_CMD_VECTOR_NAVI, MSGCENTER_TYPE_ID_VECTOR_NAVI_BT_CONNECTED, NULL},
+ { MSGCENTER_CMD_VECTOR_NAVI, MSGCENTER_TYPE_ID_VECTOR_NAVI_BT_DISCONNECTED, NULL},
+ { MSGCENTER_CMD_VECTOR_NAVI, MSGCENTER_TYPE_ID_VECTOR_NAVI_BT_CONNECTED, NULL},
+ { MSGCENTER_CMD_VECTOR_NAVI, MSGCENTER_TYPE_ID_VECTOR_NAVI_REC_FIRST_BATCH, msg_center_vector_navi_rec_first_batch},
+ { MSGCENTER_CMD_VECTOR_NAVI, MSGCENTER_TYPE_ID_VECTOR_NAVI_REQ_DESTROY_FROM_WATCH, msg_center_vector_navi_req_destroy_from_watch},
+ { MSGCENTER_CMD_VECTOR_NAVI, MSGCENTER_TYPE_ID_VECTOR_NAVI_REC_DESTROY_FROM_WATCH, msg_center_vector_navi_rec_destroy_from_watch},
#endif
#ifdef SUPPORT_ALIPAY_SEC
{ MSGCENTER_CMD_ALIPAY, MSGCENTER_TYPE_ID_ALIPAY_NETWORK_STATUS, msg_center_alipay_network_status},
case MSGCENTER_CMD_NAVIGATION:
return "cn.navigate";
case MSGCENTER_CMD_VECTOR_NAVI:
- return "com.baidu.baiduMap";
+ return "com.baidu.BaiduMap";
default:
WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER,"msg_center_get_bundle_name: wrong cmd_id[%d]", cmd_id);
break;
#include "components/ui_label.h"\r
\r
namespace OHOS {\r
-constexpr char* RING_AGAIN = "响铃将在十分钟后再次响起";\r
+static constexpr const char* RING_AGAIN = "响铃将在十分钟后再次响起";\r
constexpr int32_t NOTIFY_THREE_SECONDS = 3000;\r
constexpr int32_t NOTIFY_ONE_SECOND = 1000;\r
constexpr int32_t NOTIFY_THIRTY_SECONDS = 30000;\r
g_closeView->SetOnDragListener(listener);\r
g_closeView->SetDraggable(true);\r
g_closeView->SetTouchable(true);\r
+ NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreeAlarmCloseView);\r
return g_closeView;\r
}\r
\r
g_ringView->SetOnDragListener(listener);\r
g_ringView->SetDraggable(true);\r
g_ringView->SetTouchable(true);\r
+ NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreeAlarmRingView);\r
return g_ringView;\r
}\r
\r
UIView::OnDragListener *listener = static_cast<UIView::OnDragListener*>(AlarmViewEventListener::GetInstance());\r
g_alarmView->SetOnDragListener(listener);\r
StartAlarmTimer(AlarmTimerType::NOTIFY_ALARM_RING, NOTOFY_NO_OPERATE_TIME);\r
+ NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreeAlarmView);\r
return g_alarmView;\r
}\r
void FreeAlarmView(void)\r
g_phoneView->Add(g_comingTimes);\r
g_phoneView->SetDraggable(true);\r
g_phoneView->SetTouchable(true);\r
+ NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreePhoneCallView);\r
return g_phoneView;\r
}\r
\r
g_imageHorns->SetOnClickListener(clickListener);\r
StartCallTimer(CallTimerType::NOTIFY_PHONE_CURTIME_DISPLAY, NOTIFY_THIRTY_SECONDS);\r
NotificationManager::GetInstance()->SetVolumeScreenStatus(false);\r
-\r
+ NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreeMultiplePhoneCallView);\r
return g_multiPhoneView;\r
}\r
\r
StartCallTimer(CallTimerType::NOTIFY_PHONE_CALLING_DISPLAY, NOTIFY_ONE_SECOND);\r
StartCallTimer(CallTimerType::NOTIFY_PHONE_CURTIME_DISPLAY, NOTIFY_THIRTY_SECONDS);\r
NotificationManager::GetInstance()->SetVolumeScreenStatus(false);\r
+ NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreeCallingView);\r
return g_callingView;\r
}\r
\r
UIView::OnClickListener *clickListener = static_cast<UIView::OnClickListener *>\\r
(OHOS::CallViewEventListener::GetInstance());\r
g_imageDissgreeNew->SetOnClickListener(clickListener);\r
+ NotificationManager::GetInstance()->RegisterNotifyCleanupFunction(FreeWaitingHintsView);\r
return g_waitingHintsView;\r
}\r
\r
+++ /dev/null
-/*
- * Copyright (c) CompanyNameMagicTag.
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "notification_manager.h"
-
-namespace OHOS {
-
-/* 只有在新增Topic时,需要添加对应的Free操作 */
-void NotificationManager::FreeNotifyViews()
-{
- FreeAlarmView();
- FreeAlarmCloseView();
- FreeAlarmRingView();
- FreePhoneCallView();
- FreeCallingView();
- FreeMultiplePhoneCallView();
- FreeWaitingHintsView();
-}
-}
#define TTS_MEDIA_PARAM_OFFSET 2\r
#define TASK_PRIORITY_PCM_STREAM (osPriority_t)(40)\r
#define PCM_STREAM_MSG_STACK_SIZE 0xC00\r
+#define ROUTE_TRANS_MAX_SIZE (60 * 1024) /* 60K大小的导航路线规划,距离大概是15KM */\r
\r
osMessageQueueId_t g_pcm_stream_msg_queue_id = nullptr;\r
\r
} else if (msg.msg_id == MSGCENTER_TYPE_ID_XIAODU_END_RECORD) {\r
res = msg_center_xiaodu_send_end_record(MSGCENTER_CMD_XIAODU, MSGCENTER_TYPE_ID_XIAODU_END_RECORD, msg.data,\r
msg.len);\r
+ free(msg.data);\r
if (res != ERRCODE_SUCC) {\r
WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "send pcm stream failed");\r
return ERRCODE_FAIL;\r
\r
WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "file_len = %d.\r\n", file_len);\r
/* send to JSI */\r
- BaidumapSendMsgToJS(file_content, type);\r
- free(file_content);\r
- file_content = nullptr;\r
+ if (file_len <= ROUTE_TRANS_MAX_SIZE) {\r
+ BaidumapSendMsgToJS(file_content, type);\r
+ free(file_content);\r
+ file_content = nullptr;\r
+ } else {\r
+ BaidumapFailSendMsgToJS("long distance", type);\r
+ }\r
+\r
}\r
\r
errcode_t msg_center_vector_navi_pull_up(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
}\r
}\r
\r
+bool is_vector_navi_long_distance(uint8_t type)\r
+{\r
+ if (type == MSGCENTER_TYPE_ID_VECTOR_NAVI_REC_ROUTE_RIDING_SEARCH ||\r
+ type == MSGCENTER_TYPE_ID_VECTOR_NAVI_REC_ROUTE_WALKING_SEARCH ||\r
+ type == MSGCENTER_TYPE_ID_VECTOR_NAVI_REC_ROUTE_TRANSIT_SEARCH) {\r
+ return true;\r
+ } else {\r
+ return false;\r
+ }\r
+}\r
+\r
static bool has_two_callback(uint8_t type)\r
{\r
if (type == MSGCENTER_TYPE_ID_VECTOR_NAVI_REC_GEOCODE_SEARCH ||\r
return msg_center_vector_navi_req_common_proc(cmd_id, type, usr_data, usr_len);\r
}\r
\r
+errcode_t msg_center_vector_navi_rec_first_batch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ uint8_t tl_len = msg_center_get_tlv_tl_len(usr_data);\r
+ uint16_t payload_len = usr_len - tl_len;\r
+ uint8_t *tlv_payload = (uint8_t *)msg_center_get_tlv_payload(usr_data);\r
+ uint8_t ack = 1;\r
+ errcode_t ret = ERRCODE_SUCC;\r
+ uint8_t res;\r
+\r
+ /* ack */\r
+ ret = msg_center_send_data(cmd_id, type, &ack, sizeof(ack));\r
+ if (ret != ERRCODE_SUCC) {\r
+ return ERRCODE_FAIL;\r
+ }\r
+\r
+ /* BD09坐标系json */\r
+ char *json = (char *)malloc(payload_len + 1);\r
+ if (json == nullptr) {\r
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_MSG_CENTER, "rec_first_batch_json: malloc failed.\r\n");\r
+ return ERRCODE_FAIL;\r
+ }\r
+\r
+ (void)memcpy_s(json, payload_len, tlv_payload, payload_len);\r
+ json[payload_len] = '\0';\r
+ WEARABLE_LOGI(WEARABLE_LOG_MODULE_MSG_CENTER, "rec_first_batch_json: %s\r\n", json);\r
+\r
+ duer_msg_center_map_to_title(json, payload_len);\r
+ free(json);\r
+ json = NULL;\r
+\r
+ return ERRCODE_SUCC;\r
+}\r
+\r
+errcode_t msg_center_vector_navi_req_destroy_from_watch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ return msg_center_vector_navi_req_common_proc(cmd_id, type, usr_data, usr_len);\r
+}\r
+\r
+errcode_t msg_center_vector_navi_rec_destroy_from_watch(uint8_t cmd_id, uint8_t type, void *usr_data, uint16_t usr_len)\r
+{\r
+ return msg_center_vector_navi_rec_common_proc(cmd_id, type, usr_data, usr_len);\r
+}\r
+\r
#ifdef __cplusplus\r
}\r
#endif\r
\r
#ifdef CFG_DRIVERS_NANDFLASH\r
wstp_print("\r\nnandflash format,wait a moment!\r\n");\r
- struct nand_driver_struct* driver = get_nand_flash();\r
- erase_all(driver);\r
+ nandflash_yaffs_format();\r
ret = ERRCODE_SUCC;\r
#endif\r
\r
#ifdef CFG_DRIVERS_NANDFLASH\r
char *ptr = (char *)data;\r
uint32_t block = strtoul(ptr, NULL, 10);\r
- wstp_print("block = %d \r\n", block);\r
struct nand_driver_struct *freertos_nandflash_driver = get_nand_flash();\r
+ wstp_print("block = %d total_block = %d\r\n", block, freertos_nandflash_driver->total_block);\r
if (block >= freertos_nandflash_driver->total_block) {\r
- wstp_print("exceed max block = %d \r\n", block);\r
- return ERRCODE_FAIL;\r
+ erase_all(freertos_nandflash_driver);\r
+ wstp_print("erase all block\r\n");\r
+ return ERRCODE_SUCC;\r
}\r
freertos_nandflash_driver->erase_block(block);\r
#endif\r
uint8_t status;
for (uint32_t i = 0; i < nand_test_blocks * driver->pages_per_block; i++) {
ret = driver->read_page(i, rbuf, driver->bytes_per_page, rbuf + driver->bytes_per_page,
- driver->bytes_per_oob, &status);
+ driver->bytes_per_oob, &status, TRANS_DEFAULT);
if (ret != MC_SUCCESS) {
PRINT("nand aging test read failed %d \r\n", ret);
continue;
}
ret = driver->read_page(i, rbuf, driver->bytes_per_page, rbuf + driver->bytes_per_page,
- driver->bytes_per_oob, &status);
+ driver->bytes_per_oob, &status, TRANS_DEFAULT);
if (ret != MC_SUCCESS) {
PRINT("nand aging test read failed %d \r\n", ret);
continue;
${ROOT_DIR}/application/wearable/ohos_deps
${ROOT_DIR}/application/wearable/nativeapp/nativeui/uiservice/include
${ROOT_DIR}/open_source/openharmony/third_party/cJSON
+ ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/kits
+ ${ROOT_DIR}/middleware/services/gui/uikit/utils/interfaces/innerkits
)
set(PRIVATE_DEFINES
#include "gt_bundle_manager_service.h"
#include "ui_service.h"
#include "sign_mode.h"
+#include "NativeAbility.h"
+#include "ability_manager.h"
#define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0]))
#define OHOSFWK_MAX_ARGC 8
return ERRCODE_SUCC;
}
+static uint32_t OhosfwkATCmdAmChangeNativeSlice(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
+{
+ unused(strCommonCmd);
+ uint8_t argv[OHOSFWK_MAX_ARGC][OHOSFWK_MAX_ARGV_LEN] = { 0 };
+ uint32_t argc = 0;
+ int ret = ConvertCmdToParam(para, paraLen, argv, &argc);
+ if (ret != OHOSFWK_SUCCESS) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OHOSFWK ATCMD Convert Command Failed\n");
+ return ERRCODE_FAIL;
+ }
+ if (argc != 1) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OHOSFWK ATCMD Set Parameter Failed\n");
+ return ERRCODE_FAIL;
+ }
+ char *stringAppViewId = (char *)argv[0];
+ uint16_t AppViewId = static_cast<uint16_t>(std::stoi(stringAppViewId));
+ OHOS::NativeAbility::GetInstance().ChangeSlice(AppViewId);
+ return ERRCODE_SUCC;
+}
+
+static uint32_t OhosfwkATCmdAmStartJsApp(uint8_t *para, uint32_t paraLen, char *strCommonCmd)
+{
+ unused(strCommonCmd);
+ uint8_t argv[OHOSFWK_MAX_ARGC][OHOSFWK_MAX_ARGV_LEN] = { 0 };
+ uint32_t argc = 0;
+
+ int ret = ConvertCmdToParam(para, paraLen, argv, &argc);
+ if (ret != OHOSFWK_SUCCESS) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OHOSFWK ATCMD Convert Command Failed\n");
+ return ERRCODE_FAIL;
+ }
+
+ if (argc != 1) {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "OHOSFWK ATCMD Set Parameter Failed\n");
+ return ERRCODE_FAIL;
+ }
+ Want *want = new Want();
+ memset_s(want, sizeof(Want), 0, sizeof(Want));
+
+ ElementName startElement = {};
+ startElement.abilityName = (char *)"default";
+ startElement.bundleName = (char *)argv[0];
+ startElement.deviceId = nullptr;
+ SetWantElement(want, startElement);
+ StartAbility(want);
+ delete want;
+ return ERRCODE_SUCC;
+}
+
static const at_cmd_table_t g_ohosfwk_cmd[] = {
{ (char *)"AT^OHOSFWK_AM_EXIT_JSAPP", OhosfwkATCmdAmExitJsApp, (char *)"00 00 00 00" },
{ (char *)"AT^OHOSFWK_BM_INSTALL", OhosfwkATCmdBmInstall, (char *)"00 00 00 01" },
{ (char *)"AT^OHOSFWK_BM_SET", OhosfwkATCmdBmSet, (char *)"00 00 00 02" },
{ (char *)"AT^OHOSFWK_BM_UNINSTALL", OhosfwkATCmdBmUninstall, (char *)"00 00 00 03" },
+ { (char *)"AT^OHOSFWK_AM_CHANGENATIVESLICE", OhosfwkATCmdAmChangeNativeSlice, (char *)"00 00 00 04" },
+ { (char *)"AT^OHOSFWK_AM_START_JS_APP", OhosfwkATCmdAmStartJsApp, (char *)"00 00 00 05" },
};
at_cmd_table_t *get_ohosfwk_cmd_table(uint32_t *cmd_count)
# @brief cmake file
# Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved.
#===============================================================================
+add_subdirectory_if_exist(emmc)
add_subdirectory_if_exist(nandflash)
add_subdirectory_if_exist(boot_ulp)
set(COMPONENT_NAME "flash_boot_brandy")
--- /dev/null
+#===============================================================================
+# @brief cmake file
+# Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved.
+#===============================================================================
+set(COMPONENT_NAME "boot_emmc")
+
+set(SOURCES
+ ${CMAKE_CURRENT_SOURCE_DIR}/hal_mmc_common.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/drv_mmc_adapter.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mmc_block.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mmcsd_core.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/mmc.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/sd.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/sdio.c
+)
+
+set(PUBLIC_HEADER
+ ${CMAKE_CURRENT_SOURCE_DIR}/
+)
+
+set(PRIVATE_HEADER
+)
+
+set(PRIVATE_DEFINES
+)
+
+set(PUBLIC_DEFINES
+)
+
+# use this when you want to add ccflags like -include xxx
+set(COMPONENT_PUBLIC_CCFLAGS
+)
+
+set(COMPONENT_CCFLAGS
+ -Wno-incompatible-function-pointer-types
+ -Wno-incompatible-pointer-types
+ -Wno-implicit-function-declaration
+ -Wno-int-conversion
+)
+
+set(WHOLE_LINK
+ true
+)
+
+set(MAIN_COMPONENT
+ false
+)
+
+build_component()
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2018-2020. All rights reserved.\r
+ * Description: MMC DRIVER ADAPTER.\r
+ * Author:\r
+ * Create: 2020-04\r
+ */\r
+\r
+#include "mshc_reg.h"\r
+#include "hal_mmc_common.h"\r
+#include "mmcsd_core.h"\r
+#include "mmc.h"\r
+#include "oal_interface.h"\r
+#include "chip_core_irq.h"\r
+#include "debug_print.h"\r
+#include "mmc_block.h"\r
+#include "panic.h"\r
+#include "pinctrl_porting.h"\r
+#include "chip_io.h"\r
+#include "drv_mmc_adapter.h"\r
+\r
+#define ADMA2_16BIT_LEN_MAX_VAL 65536UL\r
+#define ADMA2_FLAG_VALID_BIT_AND_TRAN_DATA_STAT 0x21\r
+#define STOP_CMD_RETRY_TIMES 500\r
+#define TRY_TIMES 3\r
+#define DCACHE_LINE_ALIGN 32\r
+#define MPU_DTCM_ADDR_BASE 0x20000000\r
+#define MPU_DTCM_LEN 0x00040000\r
+#define EMMC_PINMUX_NUM 10\r
+#define EMMC_PAD_PINMUX_NUM 9\r
+#define EMMC_BASE_ADDR 0x52062000\r
+#define EMMC_STAB_MAX_LEN 1024\r
+\r
+#define hi_mmc_judge_buf_in_dtcm(addr) ((MPU_DTCM_ADDR_BASE <= (uint32_t)(addr)) && \\r
+ ((uint32_t)(addr) <= MPU_DTCM_ADDR_BASE + MPU_DTCM_LEN))\r
+\r
+struct hi_mmc_drv *g_mmc_ptr[MAX_MMC_NUM] = { 0 };\r
+static uint32_t g_mmc_int_status = 0;\r
+volatile int g_mmc_init_process = 1;\r
+static mmc_err_info_type_t g_mmc_err_info = { 0 };\r
+struct rt_mmcsd_host* g_mmc = NULL;\r
+char g_adma_buf[128]__attribute__((__aligned__(64))) = { 0 };\r
+\r
+static void hi_mmc_request(struct rt_mmcsd_host *mmc, struct rt_mmcsd_req *req);\r
+static void hi_mmc_set_iocfg(struct rt_mmcsd_host *mmc, struct rt_mmcsd_io_cfg *io_cfg);\r
+static void hi_mmc_enable_sdio_irq(struct rt_mmcsd_host *mmc, rt_int32_t enable);\r
+static void hi_send_cmd(struct hi_mmc_drv *mmc_drv, struct rt_mmcsd_cmd *cmd, const struct rt_mmcsd_data *data);\r
+static void hi_mmc_set_power(struct rt_mmcsd_host *mmc, uint8_t mode);\r
+static void hi_mmc_set_bus_mode(const struct rt_mmcsd_host *mmc, int mode);\r
+static void hi_mmc_poll_handler_all(struct hi_mmc_drv *mmc_drv);\r
+\r
+uintptr_t mmc_align(uintptr_t addr, uint32_t boundary)\r
+{\r
+ return (addr + boundary - 1) & ~((uintptr_t)(boundary - 1));\r
+}\r
+\r
+void hi_mmc_set_clock(struct rt_mmcsd_host *mmc, unsigned int clocknum)\r
+{\r
+ if (mmc == NULL) {\r
+ return;\r
+ }\r
+ struct hi_mmc_drv *mmc_drv = mmc->private_data;\r
+\r
+ if (clocknum >= mmc_drv->freq_max) {\r
+ clocknum = mmc_drv->freq_max;\r
+ }\r
+ hal_mmc_set_clock(mmc_drv, clocknum);\r
+ // when the clock freq greater 16mhz, for performance, don't wait the int status register.\r
+ if (clocknum >= 16000000) { // 16000000 means clock freq 16MHz\r
+ g_mmc_init_process = 0;\r
+ LOG_E("MODIFY THE CLOKNUM=%d", clocknum);\r
+ }\r
+}\r
+\r
+static void hi_mmc_set_tsf_irqs(struct hi_mmc_drv *mmc)\r
+{\r
+ unsigned int pio_irqs = MSHC_INT_DATA_AVAIL | MSHC_INT_SPACE_AVAIL;\r
+ unsigned int dma_irqs = MSHC_INT_DMA_END | MSHC_INT_ADMA_ERROR;\r
+\r
+ if ((mmc->flags & MMC_FLAG_REQ_USE_DMA) != 0) {\r
+ mmc->irq_enable = (mmc->irq_enable & ~pio_irqs) | dma_irqs;\r
+ } else {\r
+ mmc->irq_enable = (mmc->irq_enable & ~dma_irqs) | pio_irqs;\r
+ }\r
+ hal_mmc_enable_plug_irq(mmc, mmc->irq_enable);\r
+}\r
+\r
+static void hi_mmc_adma_set_desc_line(const struct hi_mmc_drv *mmc_drv, const char *desc,\r
+ unsigned long addr, uint32_t len, unsigned cmd)\r
+{\r
+ unsigned short* cmdlen = (unsigned short *)desc;\r
+\r
+ cmdlen[0] = (unsigned short)(cmd);\r
+ cmdlen[1] = (unsigned short)(len);\r
+\r
+ if ((mmc_drv->flags & MMC_FLAG_USE_ADMA_64BIT) != 0) {\r
+ unsigned long *dataddr = (unsigned long*)(desc + ADMA_EVERY_ITEM_LEN);\r
+ dataddr[0] = (addr);\r
+ } else {\r
+ unsigned int *dataddr = (unsigned int*)(desc + ADMA_EVERY_ITEM_LEN);\r
+ dataddr[0] = (addr);\r
+ }\r
+}\r
+\r
+static void hi_mmc_adma_set_end(char *desc)\r
+{\r
+ unsigned short *d = (unsigned short *)desc;\r
+ d[0] |= ADMA2_TRANS_END;\r
+}\r
+\r
+static int hi_mmc_adma_set_desc_table(struct hi_mmc_drv *mmc_drv, struct rt_mmcsd_data *data)\r
+{\r
+ char *adma_desc = NULL;\r
+ unsigned long addr;\r
+ uint32_t len;\r
+\r
+ adma_desc = mmc_drv->adma_desc;\r
+ (void)memset_s(mmc_drv->adma_desc, mmc_align(mmc_drv->adma_desc_sz, CACHE_ALIGNED_SIZE),\r
+ 0, mmc_align(mmc_drv->adma_desc_sz, CACHE_ALIGNED_SIZE));\r
+ addr = (uintptr_t)data->buf;\r
+ len = data->blks * data->blksize;\r
+ LOG_I("DMA addr:%x, len:%d dma_malloc_len=%d", addr, len, mmc_align(mmc_drv->adma_desc_sz, CACHE_ALIGNED_SIZE));\r
+\r
+ do {\r
+ if (len > ADMA2_16BIT_LEN_MAX_VAL) {\r
+ hi_mmc_adma_set_desc_line(mmc_drv, adma_desc, addr, ADMA2_16BIT_LEN_MAX_VAL,\r
+ ADMA2_FLAG_VALID_BIT_AND_TRAN_DATA_STAT);\r
+ len -= ADMA2_16BIT_LEN_MAX_VAL;\r
+ addr += ADMA2_16BIT_LEN_MAX_VAL;\r
+ } else {\r
+ hi_mmc_adma_set_desc_line(mmc_drv, adma_desc, addr, len, ADMA2_FLAG_VALID_BIT_AND_TRAN_DATA_STAT);\r
+ len = 0;\r
+ }\r
+ adma_desc += mmc_drv->adma_desc_line_sz;\r
+ } while (len != 0);\r
+\r
+ if ((unsigned int)(adma_desc - mmc_drv->adma_desc) > mmc_drv->adma_desc_sz) {\r
+ LOG_E("check dma wrong! adma_desc:%d, desc:%d, sz:%d",\r
+ adma_desc, mmc_drv->adma_desc, mmc_drv->adma_desc_sz);\r
+ return -1;\r
+ }\r
+ /* Mark the last descriptor as the terminating descriptor */\r
+ if (adma_desc != mmc_drv->adma_desc) {\r
+ adma_desc -= mmc_drv->adma_desc_line_sz;\r
+ hi_mmc_adma_set_end(adma_desc);\r
+ }\r
+ return 0;\r
+}\r
+\r
+struct rt_mmcsd_host* hi_mmc_get_host(uint32_t id)\r
+{\r
+ return g_mmc_ptr[id]->host;\r
+}\r
+\r
+static void hi_mmc_non_os_req(void)\r
+{\r
+ uint32_t times = NON_OS_WAIT_SUM_TIMES;\r
+ while (g_mmc_int_status == 0) {\r
+ uapi_tcxo_delay_ms(NON_OS_WAIT_INT_PER_MSEC);\r
+ times--;\r
+ if (times == 0) {\r
+ LOG_I("non-os mode the req timeout failed");\r
+ break;\r
+ }\r
+ }\r
+ g_mmc_int_status = 0;\r
+}\r
+\r
+void hal_mmc_reset(struct hi_mmc_drv *mmc_drv)\r
+{\r
+ if (mmc_drv == NULL) {\r
+ return;\r
+ }\r
+ hal_mmc_clr_reg(mmc_drv, MSHC_RESET_ALL);\r
+}\r
+\r
+void hi_mmc_set_power(struct rt_mmcsd_host *mmc, uint8_t mode)\r
+{\r
+ if ((mmc == NULL) || (mmc->private_data == NULL)) { return; }\r
+ struct hi_mmc_drv *mmc_drv = mmc->private_data;\r
+ unsigned int pwr = MSHC_POWER_330;\r
+\r
+ LOG_D("host->pwr = 0x%x, vdd value =%d, version=%d", mmc_drv->pwr, mmc->valid_ocr, mmc_drv->version);\r
+\r
+ if (mode == POWER_OFF) {\r
+ mmc_writew(mmc_drv, 0, MSHC_NOR_SIGNAL_ENABLE);\r
+ mmc_writew(mmc_drv, 0, MSHC_ERR_SIGNAL_ENABLE);\r
+ hal_mmc_reset(mmc_drv);\r
+ } else {\r
+ if (mmc_drv->version >= MSHC_SPEC_300) {\r
+ hal_mmc_set_preset_val(mmc_drv, false);\r
+ }\r
+\r
+ if (mmc_drv->pwr == MSHC_POWER_330) {\r
+ return;\r
+ }\r
+\r
+ mmc_drv->pwr = pwr;\r
+\r
+ mmc_writeb(mmc_drv, 0, MSHC_POWER_CONTROL);\r
+ mmc_writeb(mmc_drv, (uint8_t)pwr, MSHC_POWER_CONTROL);\r
+ pwr |= MSHC_POWER_ON;\r
+ mmc_writeb(mmc_drv, (uint8_t)pwr, MSHC_POWER_CONTROL);\r
+ uapi_tcxo_delay_ms(NON_OS_WAIT_INT_PER_MSEC);\r
+ }\r
+}\r
+\r
+void hi_mmc_set_bus_mode(const struct rt_mmcsd_host *mmc, int mode)\r
+{\r
+ UNUSED(mmc);\r
+ UNUSED(mode);\r
+}\r
+\r
+void hi_mmc_set_bus_width(struct rt_mmcsd_host *mmc, int width)\r
+{\r
+ if (mmc == NULL) {\r
+ return;\r
+ }\r
+ unsigned char ctrl_val;\r
+ struct hi_mmc_drv *mmc_drv = mmc->private_data;\r
+\r
+ ctrl_val = mmc_readb(mmc_drv, MSHC_HOST_CONTROL);\r
+ if (width == BUS_WIDTH_8) {\r
+ ctrl_val &= ~MSHC_CTRL_4BITBUS;\r
+ if (mmc_drv->version >= MSHC_SPEC_300) {\r
+ ctrl_val |= MSHC_CTRL_8BITBUS;\r
+ }\r
+ } else {\r
+ if (mmc_drv->version >= MSHC_SPEC_300) {\r
+ ctrl_val &= ~MSHC_CTRL_8BITBUS;\r
+ }\r
+ if (width == BUS_WIDTH_4) {\r
+ ctrl_val |= MSHC_CTRL_4BITBUS;\r
+ } else {\r
+ ctrl_val &= ~MSHC_CTRL_4BITBUS;\r
+ }\r
+ }\r
+ mmc_writeb(mmc_drv, ctrl_val, MSHC_HOST_CONTROL);\r
+}\r
+\r
+static void hi_mmc_set_voltage(const struct rt_mmcsd_host *mmc, uint16_t vdd)\r
+{\r
+ UNUSED(mmc);\r
+ UNUSED(vdd);\r
+}\r
+\r
+void hi_mmc_set_timing(struct rt_mmcsd_host *mmc, int timing)\r
+{\r
+ hal_mmc_set_timing(mmc->private_data, timing);\r
+}\r
+\r
+void hi_mmc_set_iocfg(struct rt_mmcsd_host *mmc, struct rt_mmcsd_io_cfg *io_cfg)\r
+{\r
+ LOG_D("hisi emmc powr_mode=%d clock=%d, bus_mode=%d, bus_width=%d, vdd=%d",\r
+ io_cfg->power_mode, io_cfg->clock, io_cfg->bus_mode, io_cfg->bus_width, io_cfg->vdd);\r
+ hi_mmc_set_power(mmc, io_cfg->power_mode);\r
+ hi_mmc_set_clock(mmc, io_cfg->clock);\r
+ hi_mmc_set_bus_mode(mmc, io_cfg->bus_mode);\r
+ hi_mmc_set_bus_width(mmc, io_cfg->bus_width);\r
+ hi_mmc_set_voltage(mmc, io_cfg->vdd);\r
+}\r
+\r
+void hi_mmc_enable_sdio_irq(struct rt_mmcsd_host *mmc, rt_int32_t enable)\r
+{\r
+ UNUSED(mmc);\r
+ UNUSED(enable);\r
+}\r
+\r
+static void hi_mmc_prepare_data(struct hi_mmc_drv *mmc_drv)\r
+{\r
+ unsigned char ctrl;\r
+ struct rt_mmcsd_data *data = mmc_drv->data;\r
+ int retval = 0;\r
+\r
+ if (data == NULL) {\r
+ return;\r
+ }\r
+ LOG_D("data blocksz = %d, blocks = %d, max_request_size = %d",\r
+ data->blksize, data->blks, mmc_drv->host->max_dma_segs);\r
+ mmc_assert(((data->blksize * data->blks) < (mmc_drv->host->max_dma_segs)));\r
+ mmc_assert(data->blksize <= mmc_drv->host->max_blk_size);\r
+ mmc_assert(data->blks < MMC_HOST_MAX_BLKS);\r
+ /* set timeout value , use default value. */\r
+ mmc_writeb(mmc_drv, MSHC_DEFINE_TIMEOUT, MSHC_TIMEOUT_CONTROL);\r
+\r
+ mmc_drv->data->bytes_xfered = 0;\r
+ // just only consider the ADMA2, default is ADMA2\r
+ ctrl = mmc_readb(mmc_drv, MSHC_HOST_CONTROL);\r
+ ctrl &= ~MSHC_CTRL_DMA_MASK;\r
+ if ((mmc_drv->flags & MMC_FLAG_REQ_USE_DMA) != 0) {\r
+ if ((mmc_drv->flags & MMC_FLAG_USE_ADMA) != 0) {\r
+ /* ADMA config */\r
+ retval = hi_mmc_adma_set_desc_table(mmc_drv, data);\r
+ if (retval != 0) {\r
+ mmc_drv->flags &= ~MMC_FLAG_REQ_USE_DMA;\r
+ } else {\r
+ mmc_writel(mmc_drv, 0, MSHC_DMA_ADDRESS);\r
+ hal_mmc_adma_config(mmc_drv);\r
+ }\r
+ ctrl |= ((mmc_drv->flags & MMC_FLAG_USE_ADMA_64BIT) != 0 ? MSHC_CTRL_ADMA64 : MSHC_CTRL_ADMA32);\r
+ }\r
+ }\r
+\r
+ mmc_writeb(mmc_drv, ctrl, MSHC_HOST_CONTROL);\r
+ hi_mmc_set_tsf_irqs(mmc_drv);\r
+ mmc_writew(mmc_drv, MSHC_MAKE_BLKSZ(SDMA_BUF_BOUNDARY_512K, data->blksize), MSHC_BLOCK_SIZE);\r
+ mmc_writew(mmc_drv, (unsigned short)data->blks, MSHC_BLOCK_COUNT);\r
+}\r
+\r
+static void hi_mmc_set_tsf_mode(struct hi_mmc_drv *mmc_drv, const struct rt_mmcsd_cmd *cmd)\r
+{\r
+ uint16_t mode;\r
+ struct rt_mmcsd_data *data = mmc_drv->data;\r
+ struct rt_mmcsd_card *card = mmc_drv->host->card;\r
+ if (data == NULL) {\r
+ mode = mmc_readw(mmc_drv, MSHC_TRANSFER_MODE);\r
+ mmc_writew(mmc_drv, mode & ~(MSHC_TRNS_AUTO_CMD12 |\r
+ MSHC_TRNS_AUTO_CMD23), MSHC_TRANSFER_MODE);\r
+ return;\r
+ }\r
+ mode = MSHC_TRNS_BLK_CNT_EN;\r
+ if (cmd->cmd_code == WRITE_MULTIPLE_BLOCK ||\r
+ cmd->cmd_code == READ_MULTIPLE_BLOCK || data->blks > 1) {\r
+ mode |= MSHC_TRNS_MULTI;\r
+ // delete sd, just consider emmc\r
+ if ((card->card_type == CARD_TYPE_MMC) && (data->flags & DATA_CMD_AUTO_STOP)) {\r
+ if ((is_mmc_cmd23_support(card)) == 0) {\r
+ mode |= MSHC_TRNS_AUTO_CMD12;\r
+ } else {\r
+ mode |= MSHC_TRNS_AUTO_CMD23;\r
+ }\r
+ }\r
+ }\r
+\r
+ if ((data->flags & DATA_DIR_READ) != 0) {\r
+ mode |= MSHC_TRNS_READ;\r
+ }\r
+ if ((mmc_drv->flags & MMC_FLAG_REQ_USE_DMA) != 0) {\r
+ mode |= MSHC_TRNS_DMA;\r
+ }\r
+ mmc_writew(mmc_drv, mode, MSHC_TRANSFER_MODE);\r
+}\r
+\r
+static void hi_mmc_bottom_finish(struct hi_mmc_drv *mmc_drv)\r
+{\r
+ if (mmc_drv == NULL) {\r
+ return;\r
+ }\r
+ struct rt_mmcsd_req *mrq = NULL;\r
+\r
+ mmc_assert(mmc_drv);\r
+ if (mmc_drv->req == NULL) {\r
+ return;\r
+ }\r
+ mrq = mmc_drv->req;\r
+ mmc_assert(mrq);\r
+\r
+ if ((mmc_drv->flags & MMC_FLAG_DEVICE_DEAD) == 0 && ((mrq->cmd != NULL && mrq->cmd->err != 0) ||\r
+ (mrq->data != NULL && mrq->data->err != 0))) {\r
+ g_mmc_err_info.mmc_cmd_err = mrq->cmd->err;\r
+ g_mmc_err_info.mmc_cmd_data_err = mrq->data->err;\r
+ hal_mmc_clr_reg(mmc_drv, MSHC_RESET_CMD);\r
+ hal_mmc_clr_reg(mmc_drv, MSHC_RESET_DATA);\r
+ hi_mmc_err_recovery();\r
+ }\r
+ mmc_drv->req = NULL;\r
+ mmc_drv->cmd = NULL;\r
+ mmc_drv->data = NULL;\r
+\r
+ if ((mmc_drv->flags & MMC_FLAG_NON_OS_HANDLE) != 0) {\r
+ if ((mmc_drv->flags & MMC_FLAG_NON_INT_HANDLE) == 0) {\r
+ g_mmc_int_status = 1;\r
+ }\r
+ }\r
+}\r
+\r
+static void hi_mmc_make_cmd_flags(const struct rt_mmcsd_cmd *cmd, unsigned int *flags)\r
+{\r
+ switch (resp_type(cmd)) {\r
+ case RESP_NONE:\r
+ break;\r
+ case RESP_R1:\r
+ case RESP_R5:\r
+ case RESP_R6:\r
+ case RESP_R7:\r
+ *flags |= (MSHC_CMD_RESP_SHORT | MSHC_CMD_CRC | MSHC_CMD_INDEX);\r
+ break;\r
+ case RESP_R1B:\r
+ *flags |= (MSHC_CMD_RESP_SHORT_BUSY | MSHC_CMD_CRC | MSHC_CMD_INDEX);\r
+ break;\r
+ case RESP_R2:\r
+ *flags |= (MSHC_CMD_RESP_LONG | MSHC_CMD_CRC);\r
+ break;\r
+ case RESP_R3:\r
+ case RESP_R4:\r
+ *flags |= MSHC_CMD_RESP_SHORT;\r
+ break;\r
+ default:\r
+ LOG_E("ERROR: %s, unknown cmd type %x", __func__, resp_type(cmd));\r
+ return;\r
+ }\r
+}\r
+\r
+static void hi_mmc_set_cmd_type(uint32_t code, unsigned int *flags)\r
+{\r
+ if ((code == STOP_TRANSMISSION) || (code == SD_IO_RW_DIRECT)) {\r
+ *flags |= MSHC_CMD_ABORTCMD;\r
+ }\r
+}\r
+\r
+void hi_send_cmd(struct hi_mmc_drv *mmc_drv,\r
+ struct rt_mmcsd_cmd *cmd, const struct rt_mmcsd_data *data)\r
+{\r
+ unsigned int flags = 0;\r
+ unsigned int mask;\r
+ unsigned long timeout_val = NON_OS_WAIT_SUM_TIMES; // the longest time 5s\r
+\r
+ LOG_D(">> Exec CMD%3d, Arg:%#x", cmd->cmd_code, cmd->arg);\r
+\r
+ mask = MSHC_CMD_INHIBIT;\r
+ if ((data != NULL) || (resp_type(cmd) == RESP_R1B)) { mask |= MSHC_DATA_INHIBIT; }\r
+\r
+ if (data != NULL && data->stop != NULL) { mask &= ~MSHC_DATA_INHIBIT; }\r
+ /* wait host ready */\r
+ while ((mmc_readl(mmc_drv, MSHC_PRESENT_STATE) & mask) != 0) {\r
+ if (timeout_val == 0) {\r
+ LOG_E("exec cmd %d timeout!", cmd->cmd_code);\r
+ hi_mmc_dumpregs(mmc_drv);\r
+ cmd->err = -EIO;\r
+ hi_mmc_bottom_finish(mmc_drv);\r
+ return;\r
+ }\r
+ timeout_val--;\r
+ uapi_tcxo_delay_us((uint64_t)WAIT_RSP_PER_USEC);\r
+ }\r
+\r
+ mmc_drv->cmd = cmd;\r
+ hi_mmc_prepare_data(mmc_drv);\r
+ mmc_writel(mmc_drv, cmd->arg, MSHC_ARGUMENT);\r
+ hi_mmc_set_tsf_mode(mmc_drv, cmd);\r
+ hi_mmc_make_cmd_flags(cmd, &flags);\r
+ /* CMD19 is special in that the Data Present Select should be set */\r
+ if (data != NULL || cmd->cmd_code == SEND_TUNING_BLOCK ||\r
+ cmd->cmd_code == SEND_TUNING_BLOCK_HS200) {\r
+ flags |= MSHC_CMD_DATA;\r
+ }\r
+ hi_mmc_set_cmd_type(cmd->cmd_code, &flags);\r
+ mmc_writew(mmc_drv, MSHC_MAKE_CMD(cmd->cmd_code, flags), MSHC_COMMAND);\r
+#ifdef SDIO_SLAVE_TEST_SUIT\r
+ uapi_tcxo_delay_us(100); // wait 100us for sdio loop test.\r
+#endif\r
+}\r
+\r
+static bool hi_mmc_check_data_aligned(struct rt_mmcsd_req *req)\r
+{\r
+ uint32_t *buf = (uint32_t *)req->data->buf;\r
+\r
+ if (req->data == NULL) {\r
+ return true;\r
+ }\r
+ if ((uint32_t)buf % EMMC_DMA_ALIGN != 0) {\r
+ req->data->err = -ENODMAALIGN;\r
+ LOG_E("check data dma aligned err buf=%d!", (uint32_t)req->data->buf);\r
+ return false;\r
+ }\r
+ if (hi_mmc_judge_buf_in_dtcm(req->data->buf)) {\r
+ return true;\r
+ }\r
+ if (non_os_is_dcache_enabled() && ((uint32_t)buf % DCACHE_LINE_ALIGN != 0)) {\r
+ req->data->err = ENOCACHEALIGN;\r
+ LOG_E("check data cacheline aligned err buf=%d!", (uint32_t)req->data->buf);\r
+ return false;\r
+ }\r
+ return true;\r
+}\r
+\r
+static void hi_mmc_refresh_dcache_by_addr_in_write(struct rt_mmcsd_req *req)\r
+{\r
+ UNUSED(req);\r
+}\r
+\r
+static void hi_mmc_refresh_dcache_by_addr_in_read(struct rt_mmcsd_req *req)\r
+{\r
+ UNUSED(req);\r
+}\r
+\r
+void hi_mmc_request(struct rt_mmcsd_host *mmc, struct rt_mmcsd_req *req)\r
+{\r
+ struct hi_mmc_drv *mmc_drv = NULL;\r
+ int present;\r
+ uint32_t timeout = MMC_CMD_DATA_REQ_TIMEOUT;\r
+ uint32_t ret = 0;\r
+\r
+ if (mmc == NULL || req == NULL) {\r
+ panic(0, __LINE__);\r
+ return ; //lint !e527 unreachable code\r
+ }\r
+ mmc_drv = mmc->private_data;\r
+ if (mmc_drv == NULL) {\r
+ panic(0, __LINE__);\r
+ return ; //lint !e527 unreachable code\r
+ }\r
+ hal_mmc_set_card_clk(mmc_drv, true);\r
+\r
+ mmc_drv->req = req;\r
+ mmc_drv->data = req->data;\r
+ present = SDHCI_PLUG_STATE(mmc_drv);\r
+ if (!hi_mmc_check_data_aligned(req)) { return; }\r
+ hi_mmc_refresh_dcache_by_addr_in_write(req);\r
+ if (present == 0 && (mmc_drv->flags & MMC_FLAG_NO_DETECT_INSERT) == 0) {\r
+ req->cmd->err = -EIO;\r
+ LOG_E("card is not present!");\r
+ panic(0, __LINE__);\r
+ return ; //lint !e527 unreachable code\r
+ } else {\r
+ hi_send_cmd(mmc_drv, req->cmd, req->data);\r
+ }\r
+\r
+ if (req->data == NULL) { timeout = MMC_CMD_REQ_TIMEOUT; }\r
+ g_mmc_err_info.mmc_cmd_code = (uint8_t)req->cmd->cmd_code;\r
+\r
+ if ((mmc_drv->flags & MMC_FLAG_NON_INT_HANDLE) != 0) {\r
+ hi_mmc_poll_handler_all(mmc_drv);\r
+ } else {\r
+ hi_mmc_non_os_req();\r
+ }\r
+\r
+ hi_mmc_refresh_dcache_by_addr_in_read(req);\r
+ hal_mmc_set_card_clk(mmc_drv, false);\r
+ UNUSED(ret);\r
+}\r
+\r
+static rt_int32_t hi_mmc_get_card_status(struct rt_mmcsd_host *mmc)\r
+{\r
+ UNUSED(mmc);\r
+ return 0;\r
+}\r
+\r
+static const struct rt_mmcsd_host_ops g_hi_ops = {\r
+ .request = hi_mmc_request,\r
+ .set_iocfg = hi_mmc_set_iocfg,\r
+ .get_card_status = hi_mmc_get_card_status,\r
+ .enable_sdio_irq = hi_mmc_enable_sdio_irq,\r
+};\r
+\r
+static void hi_mmc_get_resp_r2(struct hi_mmc_drv *mmc_drv, struct rt_mmcsd_cmd *cmd)\r
+{\r
+ int i;\r
+ for (i = 0; i < 4; i++) { // R2 len 32*4 bytes\r
+ cmd->resp[i] = mmc_readl(mmc_drv, (uint32_t)(MSHC_RESPONSE + (3 - i) * 4)) << 8; // 3 4 8\r
+ if (i != 3) { // 3\r
+ // exclude bit135~bit128 with 3, 4, 24 and 0xff to get useful resp\r
+ cmd->resp[i] |= (mmc_readl(mmc_drv, (uint32_t)(MSHC_RESPONSE + (3 - i) * 4 - 4)) >> 24) & 0xFF;\r
+ }\r
+ LOG_I("Resp %#x %#x %#x %#x", cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]); // Resp 0 1 2 3\r
+ }\r
+}\r
+\r
+/*\r
+ * Interrupt handling\r
+ */\r
+static void hi_mmc_finish_cmd(struct hi_mmc_drv *mmc_drv)\r
+{\r
+ struct rt_mmcsd_cmd *cmd = mmc_drv->cmd;\r
+ int32_t ret;\r
+ mmc_assert(mmc_drv->cmd);\r
+ if (cmd == NULL) {\r
+ return;\r
+ }\r
+ if ((cmd->flags & RESP_MASK) != 0) {\r
+ if (resp_type(cmd) == RESP_R2) {\r
+ hi_mmc_get_resp_r2(mmc_drv, cmd);\r
+ } else {\r
+ mmc_drv->cmd->resp[0] = mmc_readl(mmc_drv, MSHC_RESPONSE);\r
+ LOG_I("Resp = %#x", mmc_drv->cmd->resp[0]);\r
+ }\r
+ }\r
+ ret = memcpy_s(g_mmc_err_info.mmc_cmd_resp, sizeof(g_mmc_err_info.mmc_cmd_resp),\r
+ mmc_drv->cmd->resp, sizeof(g_mmc_err_info.mmc_cmd_resp));\r
+ if (ret != 0) { return; }\r
+ if (mmc_drv->data == NULL || cmd->cmd_code == STOP_TRANSMISSION) {\r
+ hi_mmc_bottom_finish(mmc_drv);\r
+ }\r
+}\r
+\r
+static void hi_mmc_cmd_irq(struct hi_mmc_drv *mmc_drv, uint32_t intmask, const unsigned int *mask)\r
+{\r
+ UNUSED(mask);\r
+\r
+ mmc_assert(intmask);\r
+\r
+ if (mmc_drv->cmd == NULL) { return; }\r
+ if ((intmask & MSHC_ERR_INT_MASK) != 0) {\r
+ mmc_drv->cmd->err = (int)(intmask & MSHC_ERR_INT_MASK);\r
+ } else {\r
+ mmc_drv->cmd->err = 0;\r
+ }\r
+\r
+ if (mmc_drv->data == NULL && mmc_drv->cmd->err != 0) {\r
+ hi_mmc_bottom_finish(mmc_drv);\r
+ return;\r
+ }\r
+\r
+ if (resp_type(mmc_drv->cmd) == RESP_R1B) {\r
+ return;\r
+ }\r
+ if ((intmask & MSHC_INT_RESPONSE) != 0) {\r
+ hi_mmc_finish_cmd(mmc_drv);\r
+ }\r
+}\r
+\r
+void hi_mmc_set_interrup_status(bool en)\r
+{\r
+ struct rt_mmcsd_host *mmc = NULL;\r
+ struct hi_mmc_drv *mmc_drv;\r
+ mmc = hi_mmc_get_host(SDIO_EMMC_ID);\r
+ if (mmc == NULL) {\r
+ panic(0, __LINE__);\r
+ return; //lint !e527 unreachable code\r
+ }\r
+ mmc_drv = mmc->private_data;\r
+\r
+ bool cur_int_status = (mmc_drv->flags & MMC_FLAG_NON_INT_HANDLE) != 0 ? false : true;\r
+ if (cur_int_status != en) {\r
+ if (en) {\r
+ mmc_drv->flags &= ~MMC_FLAG_NON_OS_HANDLE;\r
+ mmc_drv->flags &= ~MMC_FLAG_NON_INT_HANDLE;\r
+ int_enable_irq((int)mmc_drv->irq_num);\r
+ } else {\r
+ mmc_drv->flags |= MMC_FLAG_NON_OS_HANDLE;\r
+ mmc_drv->flags |= MMC_FLAG_NON_INT_HANDLE;\r
+ int_disable_irq((int)mmc_drv->irq_num);\r
+ }\r
+ }\r
+}\r
+\r
+static void hi_mmc_finish_data(struct hi_mmc_drv *mmc_drv)\r
+{\r
+ struct rt_mmcsd_data *data = NULL;\r
+\r
+ mmc_assert(mmc_drv->data);\r
+\r
+ data = mmc_drv->data;\r
+\r
+ if (data->err == 0) {\r
+ data->bytes_xfered = data->blks * data->blksize;\r
+ } else {\r
+ data->bytes_xfered = 0;\r
+ }\r
+\r
+ if (DATA_CMD_STOP_ENABLE(data) != 0) {\r
+ if (data->err != 0) {\r
+ hal_mmc_clr_reg(mmc_drv, MSHC_RESET_CMD);\r
+ hal_mmc_clr_reg(mmc_drv, MSHC_RESET_DATA);\r
+ }\r
+ hi_send_cmd(mmc_drv, data->stop, NULL);\r
+ } else {\r
+ hi_mmc_bottom_finish(mmc_drv);\r
+ }\r
+}\r
+\r
+static void hi_mmc_get_dat_irq_err(uint32_t intmask, int *err)\r
+{\r
+ if ((intmask & MSHC_ERR_INT_MASK) != 0) {\r
+ *err = (int)(intmask & MSHC_ERR_INT_MASK);\r
+ } else {\r
+ *err = 0;\r
+ }\r
+}\r
+\r
+static void hi_mmc_data_irq(struct hi_mmc_drv *mmc_drv, uint32_t intmask)\r
+{\r
+ unsigned int command;\r
+\r
+ mmc_assert(intmask);\r
+\r
+ if (mmc_drv->data == NULL || (mmc_drv->cmd != NULL && mmc_drv->cmd->cmd_code == STOP_TRANSMISSION)) {\r
+ if (mmc_drv->cmd != NULL && (mmc_drv->cmd->flags & RESP_R1B) != 0) {\r
+ if ((intmask & MSHC_INT_DATA_TIMEOUT) != 0) {\r
+ mmc_drv->cmd->err = -ETIMEDOUT;\r
+ hi_mmc_bottom_finish(mmc_drv);\r
+ return;\r
+ }\r
+ if ((intmask & MSHC_INT_DATA_END) != 0) {\r
+ hi_mmc_finish_cmd(mmc_drv);\r
+ return;\r
+ }\r
+ }\r
+ }\r
+ if (mmc_drv->data == NULL) {\r
+ return;\r
+ }\r
+ hi_mmc_get_dat_irq_err(intmask, &(mmc_drv->data->err));\r
+ if ((mmc_drv->data->err) != 0) {\r
+ command = MSHC_GET_CMD(mmc_readw(mmc_drv, MSHC_COMMAND));\r
+ if (command != SEND_TUNING_BLOCK && command != SEND_TUNING_BLOCK_HS200) {\r
+ LOG_E("err = 0x%x, cmd = %d, interrupt = 0x%x", mmc_drv->data->err, command, intmask);\r
+ hi_mmc_dumpregs(mmc_drv);\r
+ }\r
+ hi_mmc_finish_data(mmc_drv);\r
+ } else {\r
+ if ((intmask & MSHC_INT_DATA_END) != 0) {\r
+ hi_mmc_finish_data(mmc_drv);\r
+ }\r
+ }\r
+}\r
+\r
+void hi_mmc_poll_handler_all(struct hi_mmc_drv *mmc_drv)\r
+{\r
+ uint16_t int_nor_mask = 0;\r
+ uint16_t int_err_mask = 0;\r
+ unsigned int intmask;\r
+ uint32_t times = NON_OS_WAIT_SUM_TIMES;\r
+\r
+ while ((mmc_readl(mmc_drv, MSHC_PRESENT_STATE) & MSHC_CMD_INHIBIT) != 0) {\r
+ if (times == 0) {\r
+ LOG_D("exec cmd %d timeout!", mmc_drv->cmd->cmd_code);\r
+ hi_mmc_dumpregs(mmc_drv);\r
+ mmc_drv->cmd->err = -EIO;\r
+ g_mmc_err_info.mmc_present_stat = mmc_readl(mmc_drv, MSHC_PRESENT_STATE);\r
+ g_mmc_err_info.mmc_cmd_err = mmc_drv->cmd->err;\r
+ return;\r
+ }\r
+ times--;\r
+ uapi_tcxo_delay_us((uint64_t)WAIT_RSP_PER_USEC);\r
+ }\r
+\r
+ // in initial, clock freq is 400k, need more time to wait int status.\r
+ if (g_mmc_init_process == 1) { uapi_tcxo_delay_ms(1ULL); }\r
+\r
+ times = NON_OS_WAIT_SUM_TIMES;\r
+ while (times != 0) {\r
+ int_nor_mask = mmc_readw(mmc_drv, MSHC_NOR_INT_STATUS);\r
+ int_err_mask = mmc_readw(mmc_drv, MSHC_ERR_INT_STATUS);\r
+ if (int_err_mask != 0) { g_mmc_err_info.mmc_err_int_stat = int_err_mask; }\r
+ mmc_writew(mmc_drv, int_nor_mask, MSHC_NOR_INT_STATUS);\r
+ mmc_writew(mmc_drv, int_err_mask, MSHC_ERR_INT_STATUS);\r
+ intmask = (int_nor_mask | ((uint32_t)int_err_mask << MSHC_ERR_INT_OFFSET));\r
+\r
+ LOG_D("poll status %#x", intmask);\r
+ if ((intmask & MSHC_INT_CMD_MASK) != 0) {\r
+ hi_mmc_cmd_irq(mmc_drv, (intmask & MSHC_INT_CMD_MASK), &intmask);\r
+ if (mmc_drv->data == NULL) { break; }\r
+ }\r
+\r
+ if ((intmask & MSHC_INT_DATA_MASK) != 0) {\r
+ hi_mmc_data_irq(mmc_drv, (intmask & MSHC_INT_DATA_MASK));\r
+ LOG_I("data poll status %#x", intmask);\r
+ break;\r
+ }\r
+ if ((intmask & MSHC_INT_BUS_POWER) != 0) { PRINT("host%d:card is consuming too much power!", mmc_drv->id); }\r
+ intmask &= ~(CART_PLUG_STATE | MSHC_INT_CMD_MASK | MSHC_INT_DATA_MASK |\r
+ MSHC_INT_ERROR | MSHC_INT_BUS_POWER | MSHC_INT_CARD_INT);\r
+ if (intmask != 0) { mmc_drv->err_int_count++; }\r
+\r
+ uapi_tcxo_delay_us((uint64_t)WAIT_RSP_PER_USEC);\r
+ times--;\r
+ }\r
+ if (times == 0) {\r
+ hi_mmc_err_recovery();\r
+ LOG_E("timeout, need check");\r
+ }\r
+}\r
+\r
+static void hi_mmc_irq(struct hi_mmc_drv *mmc_drv)\r
+{\r
+ uint16_t int_nor_mask = 0;\r
+ uint16_t int_err_mask = 0;\r
+ unsigned int intmask;\r
+\r
+ while ((int_nor_mask = mmc_readw(mmc_drv, MSHC_NOR_INT_STATUS)) != 0) {\r
+ int_err_mask = mmc_readw(mmc_drv, MSHC_ERR_INT_STATUS);\r
+\r
+ mmc_writew(mmc_drv, int_nor_mask, MSHC_NOR_INT_STATUS);\r
+ mmc_writew(mmc_drv, int_err_mask, MSHC_ERR_INT_STATUS);\r
+\r
+ intmask = int_nor_mask;\r
+ intmask |= ((uint32_t)int_err_mask << MSHC_ERR_INT_OFFSET);\r
+ LOG_I("OS IRQ %#x", intmask);\r
+ if ((intmask & MSHC_INT_CMD_MASK) != 0) {\r
+ hi_mmc_cmd_irq(mmc_drv, (intmask & MSHC_INT_CMD_MASK), &intmask);\r
+ }\r
+\r
+ if ((intmask & MSHC_INT_DATA_MASK) != 0) {\r
+ hi_mmc_data_irq(mmc_drv, (intmask & MSHC_INT_DATA_MASK));\r
+ }\r
+ if ((intmask & MSHC_INT_BUS_POWER) != 0) {\r
+ LOG_E("host%d:card is consuming too much power!", mmc_drv->id);\r
+ }\r
+ intmask &= ~(CART_PLUG_STATE | MSHC_INT_CMD_MASK | MSHC_INT_DATA_MASK |\r
+ MSHC_INT_ERROR | MSHC_INT_BUS_POWER | MSHC_INT_CARD_INT);\r
+ if (intmask != 0) {\r
+ mmc_drv->err_int_count++;\r
+ }\r
+ }\r
+}\r
+\r
+static uint32_t mmc_erase_param_align(struct rt_mmcsd_card *card, uint32_t *start, uint32_t *end, uint32_t nums)\r
+{\r
+ uint32_t from_new = *start;\r
+ uint32_t nr_new = nums;\r
+ uint32_t rem;\r
+ LOG_I("erase form %#x to %#x, nr is %d, size is %d", *start, *end, nums, card->erase_size);\r
+ rem = from_new % card->erase_size;\r
+ if (rem != 0) {\r
+ rem = card->erase_size - rem;\r
+ from_new += rem;\r
+ if (nr_new > rem) {\r
+ nr_new -= rem;\r
+ } else {\r
+ return 0;\r
+ }\r
+ }\r
+\r
+ rem = nr_new % card->erase_size;\r
+ if (rem != 0) {\r
+ nr_new -= rem;\r
+ }\r
+ if (nr_new == 0) {\r
+ return 0;\r
+ }\r
+ *end = from_new + nr_new;\r
+ *start = from_new;\r
+ return nr_new;\r
+}\r
+\r
+static int hi_mmc_send_erase_cmd(struct rt_mmcsd_card *card, struct rt_mmcsd_cmd *cmd, uint32_t arg, uint32_t cmd_code)\r
+{\r
+ int err;\r
+ (void)memset_s(cmd, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));\r
+ cmd->cmd_code = cmd_code;\r
+ cmd->arg = arg;\r
+ cmd->flags = RESP_R1 | CMD_AC;\r
+ err = mmcsd_send_cmd(card->host, cmd, MMC_ERASE_CMD_RETRIES_TIMES);\r
+ if (err != 0) {\r
+ LOG_E("erase cmd_code=%d req failed ret=%d", cmd_code, err);\r
+ err = -EIO;\r
+ }\r
+ return err;\r
+}\r
+\r
+static int hi_mmc_do_erase(struct rt_mmcsd_card *card, uint32_t start, uint32_t end, uint32_t type)\r
+{\r
+ struct rt_mmcsd_cmd cmd = { 0 };\r
+ uint32_t busy_timeout = MMC_ERASE_MAX_TIME_MS;\r
+ uint64_t timeout;\r
+ int err;\r
+\r
+ if (type == MMC_ERASE_TYPE_ERASE) { // erase type is group erase\r
+ if (end - start + 1 < card->erase_size) {\r
+ err = EOPNOTSUPP;\r
+ goto out;\r
+ }\r
+ }\r
+\r
+ err = hi_mmc_send_erase_cmd(card, &cmd, start, ERASE_GROUP_START);\r
+ if (err != 0) {\r
+ goto out; /*lint !e801*/\r
+ }\r
+ err = hi_mmc_send_erase_cmd(card, &cmd, end, ERASE_GROUP_END);\r
+ if (err != 0) {\r
+ goto out; /*lint !e801*/\r
+ }\r
+ err = hi_mmc_send_erase_cmd(card, &cmd, type, ERASE);\r
+ if (err != 0) {\r
+ goto out; /*lint !e801*/\r
+ }\r
+\r
+ timeout = uapi_tcxo_get_ms() + busy_timeout;\r
+ do {\r
+ (void)memset_s(&cmd, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));\r
+ cmd.cmd_code = SEND_STATUS;\r
+ cmd.arg = card->rca << MMC_RCA_OFFSET_VAL;\r
+ cmd.flags = RESP_R1 | CMD_AC;\r
+ err = mmcsd_send_cmd(card->host, &cmd, MMC_ERASE_CMD_RETRIES_TIMES);\r
+ if (err != 0 || (cmd.resp[0] & R1_RSP_ERASE_STATE_ALL_ERR) != 0) {\r
+ LOG_E("erase: err = %d ,status = 0x%x", err, cmd.resp[0]);\r
+ err = -EIO;\r
+ goto out; /*lint !e801*/\r
+ }\r
+ if (uapi_tcxo_get_ms() >= timeout) {\r
+ err = -EIO;\r
+ goto out; /*lint !e801*/\r
+ }\r
+ } while ((cmd.resp[0] & R1_READY_FOR_DATA) == 0 || (R1_CURRENT_STATE(cmd.resp[0]) == R1_STATE_PRG));\r
+ return 0;\r
+out:\r
+ LOG_E("do erase error ret=%d", err);\r
+ return err;\r
+}\r
+\r
+int mmc_erase_arae(struct rt_mmcsd_card *card, const struct rt_mmcsd_req *req)\r
+{\r
+ uint32_t start = (uint32_t)req->erase->start_addr;\r
+ uint32_t end = (uint32_t)(req->erase->start_addr + req->erase->len);\r
+ uint32_t nums = (uint32_t)req->erase->len;\r
+ uint32_t type = (uint32_t)req->erase->type;\r
+ if ((card->csd.card_cmd_class & CCC_ERASE) == 0) {\r
+ LOG_E("cmd_class=%x is not support CCC_ERASE", card->csd.card_cmd_class);\r
+ return -EOPNOTSUPP;\r
+ }\r
+ if (card->erase_size == 0) {\r
+ LOG_E("erase_size=%x error", card->erase_size);\r
+ return -EOPNOTSUPP;\r
+ }\r
+ if (type == MMC_ERASE_TYPE_ERASE) {\r
+ nums = mmc_erase_param_align(card, &start, &end, nums);\r
+ if (nums == 0) {\r
+ LOG_E("nums=%x 0 err", nums);\r
+ return -EINVAL;\r
+ }\r
+ }\r
+ if (end <= start) {\r
+ LOG_E("end lower than start", end, start);\r
+ return -EINVAL;\r
+ }\r
+ return hi_mmc_do_erase(card, start, end, type);\r
+}\r
+\r
+static void hi_mmc_irq_mmc0(void)\r
+{\r
+ hi_mmc_irq(g_mmc_ptr[SDIO_EMMC_ID]);\r
+}\r
+\r
+static void hi_mmc_irq_mmc1(void)\r
+{\r
+ hi_mmc_irq(g_mmc_ptr[SDIO_HOST_ID]);\r
+}\r
+\r
+static HWI_PROC_FUNC hi_mmc_get_int_func(uint32_t irq_num)\r
+{\r
+ if (irq_num == EMMC_IRQn) {\r
+ return hi_mmc_irq_mmc0;\r
+ } else {\r
+ return hi_mmc_irq_mmc1;\r
+ }\r
+}\r
+\r
+int hi_mmc_card_busy(struct rt_mmcsd_host *mmc)\r
+{\r
+ struct hi_mmc_drv *mmc_drv = (struct hi_mmc_drv *)mmc->private_data;\r
+ uint32_t present_state;\r
+\r
+ // Check whether DAT[0] is 0\r
+ present_state = mmc_readl(mmc_drv, MSHC_PRESENT_STATE);\r
+\r
+ return !(present_state & MSHC_DATA_0_LVL_MASK);\r
+}\r
+\r
+void hi_mmc_set_drv_bus_width_features(struct hi_mmc_drv *mmc_drv)\r
+{\r
+ if ((mmc_drv->host->flags & MMCSD_BUSWIDTH_1) != 0) {\r
+ mmc_drv->bus_width = MMCSD_BUS_WIDTH_1;\r
+ } else if ((mmc_drv->host->flags & MMCSD_BUSWIDTH_8) != 0) {\r
+ mmc_drv->bus_width = MMCSD_BUS_WIDTH_8;\r
+ } else { // default bus width is 4bit\r
+ mmc_drv->bus_width = MMCSD_BUS_WIDTH_4;\r
+ }\r
+}\r
+\r
+void hi_mmc_set_drv_features(struct hi_mmc_drv *mmc_drv, uint8_t id)\r
+{\r
+ mmc_drv->id = id;\r
+ g_mmc_ptr[id] = mmc_drv;\r
+ switch (id) {\r
+ case SDIO_EMMC_ID:\r
+ mmc_drv->hw_base_addr = SDIO_EMMC_BASE_ADDR;\r
+ mmc_drv->irq_num = EMMC_IRQn;\r
+ mmc_drv->type = MMC_TYPE_MMC;\r
+ mmc_drv->freq_max = CONFIG_MMC0_CCLK_MAX;\r
+ mmc_drv->freq_min = CONFIG_MMC0_CCLK_MIN;\r
+ mmc_drv->flags |= MMC_FLAG_AUTO_CMD23;\r
+ break;\r
+#if (WITH_SDIO_HOST == YES)\r
+ case SDIO_HOST_ID:\r
+ mmc_drv->hw_base_addr = SDIO_HOST_BASE_ADDR;\r
+ mmc_drv->irq_num = SDIO_HOST_IRQn;\r
+ mmc_drv->type = MMC_TYPE_SDIO;\r
+ mmc_drv->freq_max = CONFIG_MMC1_CCLK_MAX;\r
+ mmc_drv->freq_min = CONFIG_MMC1_CCLK_MIN;\r
+ break;\r
+#endif\r
+ default:\r
+ break;\r
+ }\r
+\r
+ mmc_drv->phy_driver_cap = mmc_drv->host->driver_cap;\r
+ hi_mmc_set_drv_bus_width_features(mmc_drv);\r
+ hal_mmc_deassert_status(mmc_drv); // power on and dereset\r
+ mmc_drv->version = (mmc_readw(mmc_drv, MSHC_HOST_VERSION) & MSHC_SPEC_VER_MASK);\r
+ // in 1135, the eMMC and SDIO are unpluggable cards, chip is not supportted.\r
+ mmc_drv->flags |= (MMC_FLAG_USE_ADMA | MMC_FLAG_REQ_USE_DMA | MMC_FLAG_NO_DETECT_INSERT);\r
+ mmc_drv->adma_max_desc = MMC_ADMA_MAX_DESC;\r
+ mmc_drv->adma_desc_line_sz = MMC_AMDA_32BIT_DESC_LINE_SIZE;\r
+ mmc_drv->adma_desc_sz = mmc_drv->adma_max_desc * mmc_drv->adma_desc_line_sz;\r
+ mmc_drv->adma_desc = (void *)g_adma_buf;\r
+\r
+ if ((mmc_drv->host->flags & MMCSD_NON_OS_ENABLE) != 0) {\r
+ mmc_drv->flags |= (MMC_FLAG_NON_OS_HANDLE | MMC_FLAG_NON_INT_HANDLE);\r
+ }\r
+\r
+ if (id == SDIO_EMMC_ID) {\r
+ hal_mmc_set_emmc_ctrl(mmc_drv, (uint32_t)MSHC_EMMC_CTRL, (uint32_t)MSHC_CARD_IS_EMMC_START,\r
+ (uint32_t)MSHC_CARD_IS_EMMC_BITS, (uint32_t)MSHC_CARD_IS_EMMC);\r
+ // set MBIU_CTRL_R 8burst\r
+ uint32_t pvendor_spc_area = mmc_reg32_getbits(mmc_drv, SD_BUS_PVSA1, SD_BUS_PVSA1_POS, SD_BUS_PVSA1_LEN);\r
+ // Offset: P_VENDOR_SPECIFIC_AREA[11:0] + 0x10\r
+ mmc_reg32_setbits(mmc_drv, pvendor_spc_area + 0x10, SD_BUS_MBURST_POS, SD_BUS_MBURST_LEN, SD_BUS_MBURST_VAL);\r
+ }\r
+}\r
+\r
+void hi_mmc_set_host_features(struct rt_mmcsd_host *mmc)\r
+{\r
+ struct hi_mmc_drv *mmc_drv = mmc->private_data;\r
+\r
+ mmc_drv->irq_enable = MSHC_INT_BUS_POWER | MSHC_INT_DATA_END_ERR | MSHC_INT_DATA_CRC | MSHC_INT_DATA_TIMEOUT |\r
+ MSHC_INT_INDEX | MSHC_INT_END_BIT | MSHC_INT_CRC | MSHC_INT_TIMEOUT | MSHC_INT_DATA_END |\r
+ MSHC_INT_RESPONSE | MSHC_INT_AUTO_CMD_ERR;\r
+ mmc_drv->pwr = 0;\r
+ hal_mmc_enable_plug_irq(mmc_drv, mmc_drv->irq_enable);\r
+\r
+ mmc->freq_max = mmc_drv->freq_max;\r
+ mmc->freq_min = mmc_drv->freq_min;\r
+// In the standard, the value is calculated based on the CAPABILITIES1_R field.\r
+// in Hi1135 apply the fixed value.\r
+ mmc->valid_ocr = VDD_29_30 | VDD_30_31 | VDD_32_33 | VDD_33_34 | VDD_165_195;\r
+ mmc->max_blk_size = MAX_BLOCK_SIZE;\r
+ mmc->max_blk_count = MAX_BLOCK_COUNT;\r
+ mmc->max_seg_size = MAX_SEG_SIZE;\r
+ mmc->max_dma_segs = mmc_drv->adma_max_desc * mmc->max_seg_size;\r
+ if (mmc_drv->bus_width == MMCSD_BUS_WIDTH_4) {\r
+ mmc->flags |= MMCSD_BUSWIDTH_4;\r
+ } else if (mmc_drv->bus_width == MMCSD_BUS_WIDTH_8) {\r
+ mmc->flags |= MMCSD_BUSWIDTH_8;\r
+ } else {\r
+ mmc->flags |= MMCSD_BUSWIDTH_1;\r
+ }\r
+ mmc->ops = &g_hi_ops;\r
+}\r
+\r
+int hi_mmc_set_int_info(struct rt_mmcsd_host *mmc, struct hi_mmc_drv *mmc_drv)\r
+{\r
+ HWI_PROC_FUNC irq_func;\r
+ int ret;\r
+ irq_func = (HWI_PROC_FUNC)hi_mmc_get_int_func(mmc_drv->irq_num);\r
+ ret = (int)oal_int_create(mmc_drv->irq_num, irq_prio(mmc_drv->irq_num), (HWI_PROC_FUNC)irq_func, 0);\r
+ if (ret != 0) {\r
+ LOG_E("set irq for mmmc host err %d", ret);\r
+ ret = -EACCES;\r
+ return ret;\r
+ }\r
+ if ((mmc_drv->flags & MMC_FLAG_NON_INT_HANDLE) != 0) {\r
+ ret = (int)oal_int_delete(mmc_drv->irq_num);\r
+ }\r
+ if (ret != 0) {\r
+ LOG_E("unset irq for mmmc host err %d", ret);\r
+ ret = -EACCES;\r
+ return ret;\r
+ }\r
+\r
+ return ret;\r
+}\r
+\r
+#define PHASE_SCALE 16\r
+#define NOT_FOUND (-1)\r
+#define MAX_TUNING_NUM 1\r
+#define SAMP_PHASE_DEF 7\r
+\r
+#define SAMP_PHASE_ENDPOINT 15 // Soc only support 16 phase\r
+\r
+/* Tuning Block Pattern UHS-I */\r
+static const uint8_t g_tuning_blk_4bit[] = {\r
+ 0xFF, 0x0F, 0xFF, 0x00, 0xFF, 0xCC, 0xC3, 0xCC,\r
+ 0xC3, 0x3C, 0xCC, 0xFF, 0xFE, 0xFF, 0xFE, 0xEF,\r
+ 0xFF, 0xDF, 0xFF, 0xDD, 0xFF, 0xFB, 0xFF, 0xFB,\r
+ 0xBF, 0xFF, 0x7F, 0xFF, 0x77, 0xF7, 0xBD, 0xEF,\r
+ 0xFF, 0xF0, 0xFF, 0xF0, 0x0F, 0xFC, 0xCC, 0x3C,\r
+ 0xCC, 0x33, 0xCC, 0xCF, 0xFF, 0xEF, 0xFF, 0xEE,\r
+ 0xFF, 0xFD, 0xFF, 0xFD, 0xDF, 0xFF, 0xBF, 0xFF,\r
+ 0xBB, 0xFF, 0xF7, 0xFF, 0xF7, 0x7f, 0x7B, 0xDE,\r
+};\r
+\r
+/* Tuning block pattern for 8 bit mode for HS200 */\r
+static const uint8_t g_tuning_blk_8bit[] = {\r
+ 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00, 0x00,\r
+ 0xFF, 0xFF, 0xCC, 0xCC, 0xCC, 0x33, 0xCC, 0xCC,\r
+ 0xCC, 0x33, 0x33, 0xCC, 0xCC, 0xCC, 0xFF, 0xFF,\r
+ 0xFF, 0xEE, 0xFF, 0xFF, 0xFF, 0xEE, 0xEE, 0xFF,\r
+ 0xFF, 0xFF, 0xDD, 0xFF, 0xFF, 0xFF, 0xDD, 0xDD,\r
+ 0xFF, 0xFF, 0xFF, 0xBB, 0xFF, 0xFF, 0xFF, 0xBB,\r
+ 0xBB, 0xFF, 0xFF, 0xFF, 0x77, 0xFF, 0xFF, 0xFF,\r
+ 0x77, 0x77, 0xFF, 0x77, 0xBB, 0xDD, 0xEE, 0xFF,\r
+ 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0x00,\r
+ 0x00, 0xFF, 0xFF, 0xCC, 0xCC, 0xCC, 0x33, 0xCC,\r
+ 0xCC, 0xCC, 0x33, 0x33, 0xCC, 0xCC, 0xCC, 0xFF,\r
+ 0xFF, 0xFF, 0xEE, 0xFF, 0xFF, 0xFF, 0xEE, 0xEE,\r
+ 0xFF, 0xFF, 0xFF, 0xDD, 0xFF, 0xFF, 0xFF, 0xDD,\r
+ 0xDD, 0xFF, 0xFF, 0xFF, 0xBB, 0xFF, 0xFF, 0xFF,\r
+ 0xBB, 0xBB, 0xFF, 0xFF, 0xFF, 0x77, 0xFF, 0xFF,\r
+ 0xFF, 0x77, 0x77, 0xFF, 0x77, 0xBB, 0xDD, 0xEE,\r
+};\r
+\r
+struct tuning_blk_info {\r
+ uint8_t *blk;\r
+ unsigned int blk_size;\r
+};\r
+\r
+static void hi_mmc_tune_out(struct hi_mmc_drv *mmc_drv, uint32_t start,\r
+ uint32_t top, uint32_t bottom, uint32_t end)\r
+{\r
+ int phase;\r
+ unsigned short val;\r
+\r
+ if (top == (uint32_t)NOT_FOUND) {\r
+ top = start;\r
+ }\r
+\r
+ if (bottom == (uint32_t)NOT_FOUND) {\r
+ bottom = end;\r
+ }\r
+ if (bottom < top) {\r
+ phase = (top + bottom) >> 1;\r
+ phase = phase - (PHASE_SCALE >> 1);\r
+ phase = (phase < 0) ? (PHASE_SCALE + phase) : phase;\r
+ } else {\r
+ phase = (uint32_t)((top + bottom) >> 1);\r
+ }\r
+ hal_mmc_set_sample_phase(mmc_drv, (uint32_t)phase);\r
+\r
+ val = mmc_readw(mmc_drv, MSHC_HOST_CONTROL2);\r
+ val |= MSHC_CTRL_TUNED_CLK;\r
+ mmc_writew(mmc_drv, val, MSHC_HOST_CONTROL2);\r
+ hal_mmc_enable_plug_irq(mmc_drv, mmc_drv->irq_enable);\r
+ LOG_I("tuning valid phase shift [%d, %d] Final Phase %d", top, bottom, phase);\r
+}\r
+\r
+static void mmc_tuning_config(struct rt_mmcsd_req *tuning_mrq, struct rt_mmcsd_cmd *tuning_cmd,\r
+ struct rt_mmcsd_data *tuning_data, struct tuning_blk_info *tuning_info, struct rt_mmcsd_host *mmc)\r
+{\r
+ struct hi_mmc_drv *mmc_drv = mmc->private_data;\r
+\r
+ if (mmc->io_cfg.bus_width == MMCSD_BUS_WIDTH_8) {\r
+ tuning_info->blk = (uint8_t *)g_tuning_blk_8bit;\r
+ tuning_info->blk_size = sizeof(g_tuning_blk_8bit);\r
+ } else if (mmc->io_cfg.bus_width == MMCSD_BUS_WIDTH_4) {\r
+ tuning_info->blk = (uint8_t *)g_tuning_blk_4bit;\r
+ tuning_info->blk_size = sizeof(g_tuning_blk_4bit);\r
+ } else {\r
+ LOG_E("MMC tuning config error");\r
+ return;\r
+ }\r
+\r
+ tuning_mrq->cmd = tuning_cmd;\r
+ tuning_mrq->data = tuning_data;\r
+ tuning_cmd->arg = 0;\r
+ tuning_cmd->retries = 0;\r
+ tuning_cmd->flags = RESP_R1 | CMD_ADTC;\r
+ tuning_cmd->err = 0;\r
+ tuning_data->err = 0;\r
+ tuning_mrq->data->blksize = tuning_info->blk_size;\r
+ tuning_mrq->data->blks = 1;\r
+ tuning_mrq->data->flags = DATA_DIR_READ;\r
+\r
+ mmc_drv->req = tuning_mrq;\r
+ mmc_drv->cmd = tuning_cmd;\r
+ mmc_drv->data = tuning_data;\r
+}\r
+\r
+static int mmc_send_tuning(struct rt_mmcsd_host *mmc, uint32_t opcode, int32_t *cmd_error)\r
+{\r
+ struct rt_mmcsd_req tuning_mrq = {0};\r
+ struct rt_mmcsd_cmd tuning_cmd = {0};\r
+ struct rt_mmcsd_data tuning_data = {0};\r
+ struct tuning_blk_info tuning_info = {NULL, 0};\r
+ struct hi_mmc_drv *mmc_drv = mmc->private_data;\r
+ void *data_buf = NULL;\r
+ int err = 0;\r
+\r
+ mmc_tuning_config(&tuning_mrq, &tuning_cmd, &tuning_data, &tuning_info, mmc);\r
+ data_buf = (void *)irmalloc(mmc_align(tuning_info.blk_size, CACHE_ALIGNED_SIZE));\r
+ if (data_buf == NULL) {\r
+ return -ENOMEM;\r
+ }\r
+ (void)memset_s(data_buf, tuning_info.blk_size, 0, tuning_info.blk_size);\r
+ tuning_cmd.cmd_code = opcode;\r
+ tuning_mrq.data->buf = (rt_uint32_t *)data_buf;\r
+ hal_mmc_set_card_clk(mmc_drv, true);\r
+\r
+ hi_send_cmd(mmc_drv, &tuning_cmd, &tuning_data);\r
+\r
+ if ((mmc_drv->flags & MMC_FLAG_NON_INT_HANDLE) != 0) {\r
+ hi_mmc_poll_handler_all(mmc_drv);\r
+ } else {\r
+ hi_mmc_non_os_req();\r
+ }\r
+\r
+ hal_mmc_set_card_clk(mmc_drv, false);\r
+ if (cmd_error != NULL) {\r
+ *cmd_error = tuning_cmd.err;\r
+ err = tuning_cmd.err;\r
+ goto out; /*lint !e801*/\r
+ }\r
+ if (tuning_cmd.err != 0) {\r
+ err = tuning_cmd.err;\r
+ goto out; /*lint !e801*/\r
+ }\r
+\r
+ if (tuning_data.err != 0) {\r
+ err = tuning_data.err;\r
+ goto out; /*lint !e801*/\r
+ }\r
+ if (memcmp(tuning_info.blk, data_buf, tuning_info.blk_size) != 0) {\r
+ err = -EIO;\r
+ }\r
+out:\r
+ irfree(data_buf);\r
+ return err;\r
+}\r
+\r
+int hi_mmc_exec_tuning(struct rt_mmcsd_host *mmc, uint32_t opcode)\r
+{\r
+ uint32_t hindex, val;\r
+ uint32_t error = 0;\r
+ uint32_t found = 0;\r
+ uint32_t startPoint = 0;\r
+ uint32_t endPoint = SAMP_PHASE_ENDPOINT;\r
+ uint32_t prevError = (uint32_t)NOT_FOUND;\r
+ uint32_t raisePoint = (uint32_t)NOT_FOUND;\r
+ uint32_t fallPoint = (uint32_t)NOT_FOUND;\r
+ struct hi_mmc_drv *drv = mmc->private_data;\r
+\r
+ LOG_I("MMC_ExeTuning");\r
+\r
+ val = mmc_readl(drv, MSHC_AUTO_TUNING_CTRL);\r
+ val |= MSHC_SW_TUNING_EN;\r
+ mmc_writel(drv, val, MSHC_AUTO_TUNING_CTRL);\r
+\r
+ val = drv->irq_enable | MSHC_INT_DATA_AVAIL;\r
+ hal_mmc_enable_plug_irq(drv, val);\r
+\r
+ for (hindex = startPoint; hindex <= endPoint; hindex++) {\r
+ hal_mmc_set_sample_phase(drv, hindex);\r
+ if (mmc_send_tuning(drv->host, opcode, NULL) == 0) {\r
+ found = 1; /* found a valid phase */\r
+ } else {\r
+ error = 1;\r
+ }\r
+\r
+ if (hindex > startPoint) {\r
+ if (error != 0 && prevError == 0) {\r
+ fallPoint = hindex - 1;\r
+ }\r
+ if (error == 0 && prevError != 0) {\r
+ raisePoint = hindex;\r
+ }\r
+ }\r
+\r
+ if ((raisePoint != (uint32_t)NOT_FOUND) &&\r
+ (fallPoint != (uint32_t)NOT_FOUND)) {\r
+ break;\r
+ }\r
+ prevError = error;\r
+ error = 0;\r
+ }\r
+\r
+ if (found == 0) {\r
+ LOG_E("no valid phase shift! use default");\r
+ hal_mmc_set_sample_phase(drv, (uint32_t)SAMP_PHASE_DEF);\r
+ } else {\r
+ LOG_I("Tuning finished!!");\r
+ hi_mmc_tune_out(drv, startPoint, raisePoint, fallPoint, endPoint);\r
+ }\r
+ return 0;\r
+}\r
+\r
+void mmc_set_sdiom_clk_mode(int clk_type)\r
+{\r
+ hal_mmc_set_sdiom_clk_mode(g_mmc_ptr, clk_type);\r
+}\r
+\r
+void mmc_set_driver_capability(struct rt_mmcsd_host* mmc, uint32_t cap)\r
+{\r
+ mmc->driver_cap = cap;\r
+}\r
+\r
+bool mmc_detect_bus_error(struct rt_mmcsd_host* host)\r
+{\r
+ if ((host == NULL) || (host->private_data == NULL)) { return false; }\r
+ struct hi_mmc_drv *mmc_drv = host->private_data;\r
+ uint32_t cur_pstate = mmc_readl(mmc_drv, MSHC_PRESENT_STATE);\r
+ if ((g_mmc_err_info.mmc_err_int_stat != 0) || (g_mmc_err_info.mmc_present_stat & MSHC_CMD_INHIBIT) != 0 ||\r
+ (cur_pstate & MSHC_CMD_INHIBIT) != 0) {\r
+ return true;\r
+ }\r
+ return false;\r
+}\r
+\r
+int hi_mmc_send_stop_cmd(struct rt_mmcsd_host *mmc, uint32_t *status)\r
+{\r
+ int err = 0;\r
+ struct rt_mmcsd_card *card = mmc->card;\r
+ struct rt_mmcsd_cmd cmd = { 0 };\r
+\r
+ memset_s(&cmd, sizeof(cmd), 0, sizeof(cmd));\r
+ cmd.cmd_code = STOP_TRANSMISSION;\r
+ cmd.arg = 0;\r
+ cmd.flags = RESP_R1B | CMD_AC;\r
+\r
+ err = mmcsd_send_cmd(card->host, &cmd, TRY_TIMES);\r
+ // if the status of emmc device is ok, it will not response to the cmd12.\r
+ if (err != 0) { LOG_E("cmd12 err %x \n", err); }\r
+ err = mmc_send_status(card, ((rt_uint32_t *)status));\r
+ if (err != 0) { LOG_E("cmd13 after cmd12 err %x \n", err); }\r
+ return err;\r
+}\r
+\r
+void hi_mmc_set_magic_to_aon_area(void)\r
+{\r
+#if ((defined EMMC_ABNORMAL_SAVE_TO_AON_AREA) && (EMMC_ABNORMAL_SAVE_TO_AON_AREA == YES))\r
+ uint8_t *ptr = (uint8_t*)(uintptr_t)EMMC_ERROR_INFO;\r
+ *ptr = EMMC_NORMAL_MAGIC_VAL;\r
+#else // Add different items as required.\r
+#endif\r
+}\r
+\r
+// sum 8 byte: 1 magic + 1 cmd_code + 2 err_int_stat + 4 present_stat\r
+void hi_mmc_set_err_to_aon_area(void)\r
+{\r
+#if ((defined EMMC_ABNORMAL_SAVE_TO_AON_AREA) && (EMMC_ABNORMAL_SAVE_TO_AON_AREA == YES))\r
+ uint8_t *ptr = (uint8_t*)(uintptr_t)EMMC_ERROR_INFO;\r
+ int32_t ret = 0;\r
+ *ptr = EMMC_ERROR_MAGIC_VAL;\r
+ ptr++;\r
+ ret = memcpy_s((void *)ptr, sizeof(g_mmc_err_info.mmc_cmd_code), &(g_mmc_err_info.mmc_cmd_code),\r
+ sizeof(g_mmc_err_info.mmc_cmd_code));\r
+ ptr += sizeof(g_mmc_err_info.mmc_cmd_code);\r
+ ret = memcpy_s((void *)ptr, sizeof(g_mmc_err_info.mmc_err_int_stat), &(g_mmc_err_info.mmc_err_int_stat),\r
+ sizeof(g_mmc_err_info.mmc_err_int_stat));\r
+ ptr += sizeof(g_mmc_err_info.mmc_err_int_stat);\r
+ ret = memcpy_s((void *)ptr, sizeof(g_mmc_err_info.mmc_present_stat), &(g_mmc_err_info.mmc_present_stat),\r
+ sizeof(g_mmc_err_info.mmc_present_stat));\r
+#else // Add different items as required.\r
+#endif\r
+}\r
+\r
+mmc_err_info_type_t *hi_mmc_get_err_from_aon_area(void)\r
+{\r
+#if ((defined EMMC_ABNORMAL_SAVE_TO_AON_AREA) && (EMMC_ABNORMAL_SAVE_TO_AON_AREA == YES))\r
+ mmc_err_info_type_t *ptr = (mmc_err_info_type_t *)(uintptr_t)EMMC_ERROR_INFO;\r
+ return ptr;\r
+#else // Add different items as required.\r
+ return &g_mmc_err_info;\r
+#endif\r
+}\r
+\r
+void hi_mmc_reset_cmd_data(struct rt_mmcsd_host* host)\r
+{\r
+ if ((host == NULL) || (host->private_data == NULL)) { return; }\r
+ struct hi_mmc_drv *mmc_drv = host->private_data;\r
+ hal_mmc_clr_reg(mmc_drv, MSHC_RESET_CMD);\r
+ hal_mmc_clr_reg(mmc_drv, MSHC_RESET_DATA);\r
+}\r
+\r
+\r
+void init_emmc_pinmux(void)\r
+{\r
+ int n;\r
+\r
+ for (n = 0; n < EMMC_PINMUX_NUM; n++) {\r
+ writew(S_HGPIO + S_HGPIO6_OFFSET + n * 0x4, FUNC_EMMC);\r
+ }\r
+\r
+ for (n = 0; n < EMMC_PAD_PINMUX_NUM; n++) {\r
+ writew(S_HGPIO_PAD + S_HGPIO6_PAD_OFFSET + n * 0x4, IE_PINMUX_EN);\r
+ }\r
+\r
+ // 配置EMMC时钟源为32M\r
+ writew(SDIOM_CR_REG, SDIOM_CR_CTRL_XO_32M_CLK_EN);\r
+}\r
+\r
+int ssb_emmc_init(void)\r
+{\r
+ g_mmc = (struct rt_mmcsd_host *)irmalloc(sizeof(struct rt_mmcsd_host));\r
+ if (g_mmc == NULL) {\r
+ LOG_E("malloc failed, check\r\n");\r
+ return -1; // -1 system error\r
+ }\r
+ memset_s(g_mmc, sizeof(struct rt_mmcsd_host), 0, sizeof(struct rt_mmcsd_host));\r
+ g_mmc->id = 0; // 0 -- MMC0\r
+ g_mmc->flags |= MMCSD_NON_OS_ENABLE;\r
+ g_mmc->flags |= MMCSD_BUSWIDTH_8;\r
+ writew(EMMC_BASE_ADDR + 0x508, 0);\r
+ init_emmc_pinmux();\r
+ int ret = hi_mmc_init(g_mmc);\r
+ PRINT("emmc init ret=%d\r\n", ret);\r
+ PRINT("emmc msg:blksize=%d,card capacity=%dKB,earse size=%d\n", g_mmc->card->card_blksize,\r
+ g_mmc->card->card_capacity, g_mmc->card->erase_size);\r
+ return ret;\r
+}\r
+\r
+struct rt_mmcsd_host* get_ssb_emmc(void)\r
+{\r
+ return g_mmc;\r
+}\r
+\r
+int32_t ssb_emmc_read(const char *buffer, uint32_t start_sector, uint32_t nsectors)\r
+{\r
+ return hi_mmc_read(buffer, start_sector, nsectors);\r
+}\r
+\r
+int32_t ssb_emmc_write(const char *buffer, uint32_t start_sector, uint32_t nsectors)\r
+{\r
+ return hi_mmc_write(buffer, start_sector, nsectors);\r
+}\r
+\r
+int32_t ssb_emmc_erase(uint32_t start_sector, uint32_t nsectors)\r
+{\r
+ return hi_mmc_erase(start_sector, nsectors, ERASE_TYPE_ERASE_GROUP);\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2018-2020. All rights reserved.\r
+ * Description: DRV MMC DRIVER HEADER FILE\r
+ * Author:\r
+ * Create: 2020-04\r
+ */\r
+#ifndef DRV_MMC_ADAPTER_H\r
+#define DRV_MMC_ADAPTER_H\r
+\r
+#include "mmcsd_host.h"\r
+#include "mmcsd_card.h"\r
+#include "hal_mmc_common.h"\r
+/*\r
+ * Card Command Classes (CCC)\r
+ */\r
+#define CCC_BASIC (1 << 0)\r
+#define CCC_BLOCK_READ (1 << 2)\r
+#define CCC_BLOCK_WRITE (1 << 4)\r
+#define CCC_ERASE (1 << 5)\r
+#define CCC_WRITE_PROT (1 << 6)\r
+#define CCC_LOCK_CARD (1 << 7)\r
+#define CCC_APP_SPEC (1 << 8)\r
+#define CCC_IO_MODE (1 << 9)\r
+#define CCC_SWITCH (1 << 10)\r
+#define MMC_CMD_DATA_REQ_TIMEOUT (1000 * 10) // 30s\r
+#define MMC_CMD_REQ_TIMEOUT (1000 * 3) // 3s\r
+#define MMC_TUNINT_REQ_TIMEOUT (1000 / 5) // 200ms\r
+\r
+#define is_sd_cmd23_support(card) ((card)->scr.cmds & SD_SCR_CMD23_SUPPORT)\r
+#define is_mmc_cmd23_support(card) \\r
+ (((card)->csd.card_cmd_class & CCC_BLOCK_READ) || ((card)->csd.card_cmd_class & CCC_BLOCK_WRITE))\r
+#define CART_PLUG_STATE (MSHC_INT_CARD_INSERT | MSHC_INT_CARD_REMOVE)\r
+#define CONFIG_ERASE_MAX_SECTOR 0x100000 // 512M\r
+#define ADMA2_TRANS_END 0x2\r
+#define NON_OS_WAIT_INT_PER_MSEC 1\r
+#define WAIT_RSP_PER_USEC 1\r
+#define NON_OS_WAIT_SUM_TIMES 1000000\r
+#define MMC_ERASE_CMD_RETRIES_TIMES 5\r
+#define MMC_ERASE_MAX_TIME_MS 6000\r
+#define ADMA_EVERY_ITEM_LEN 4\r
+#define MMC_HOST_MAX_BLKS 65535\r
+#define MMC_RCA_OFFSET_VAL 16\r
+#define EMMC_DMA_ALIGN 4\r
+\r
+#ifndef LOSCFG_LIB_LIBC\r
+#define ENODMAALIGN 1\r
+#define ENOCACHEALIGN 2\r
+#define EPARAMERR 3\r
+#define EIO 5\r
+#define ENOMEM 12\r
+#define EACCES 13\r
+#define EBUSY 16\r
+#define ETIME 62\r
+#define EOPNOTSUPP 95 /* Operation not supported on socket */\r
+\r
+#endif\r
+\r
+#define DATA_CMD_AUTO_STOP (0x1 << 6) // for struct rt_mmcsd_data.flags\r
+\r
+typedef enum {\r
+ MMC_ERASE_TYPE_ERASE = 0x0,\r
+ MMC_ERASE_TYPE_TRIM = 0x1,\r
+ MMC_ERASE_TYPE_DISCARD = 0x3,\r
+ MMC_ERASE_TYPE_MAX\r
+} mmc_erase_type_t;\r
+\r
+typedef struct {\r
+ uint8_t magic;\r
+ uint8_t mmc_cmd_code;\r
+ uint16_t mmc_err_int_stat;\r
+ uint32_t mmc_present_stat;\r
+ int32_t mmc_cmd_err;\r
+ int32_t mmc_cmd_data_err;\r
+ uint32_t mmc_cmd_resp[4];\r
+} mmc_err_info_type_t;\r
+\r
+typedef enum {\r
+ EMMC_NORMAL_MAGIC_VAL = 0xAC,\r
+ EMMC_ERROR_MAGIC_VAL = 0xDE,\r
+} mmc_err_flag_t;\r
+\r
+int test_emmc_init(void);\r
+struct rt_mmcsd_host* get_ssb_emmc(void);\r
+int32_t ssb_emmc_read(const char *buffer, uint32_t start_sector, uint32_t nsectors);\r
+int32_t ssb_emmc_write(const char *buffer, uint32_t start_sector, uint32_t nsectors);\r
+int32_t ssb_emmc_erase(uint32_t start_sector, uint32_t nsectors);\r
+\r
+struct rt_mmcsd_host *hi_mmc_get_host(uint32_t id);\r
+\r
+int hi_mmc_exec_tuning(struct rt_mmcsd_host *mmc, uint32_t opcode);\r
+\r
+void hi_mmc_set_timing(struct rt_mmcsd_host *mmc, int timing);\r
+\r
+uint32_t hi_mmc_write(const void *buffer, uint32_t pos, uint32_t size);\r
+\r
+uint32_t hi_mmc_read(void *buffer, uint32_t pos, uint32_t size);\r
+\r
+uint32_t hi_mmc_pio_write(const void *buffer, uint32_t pos, uint32_t size);\r
+\r
+uint32_t hi_mmc_pio_read(void *buffer, uint32_t pos, uint32_t size);\r
+\r
+int hi_mmc_card_busy(struct rt_mmcsd_host *mmc);\r
+\r
+void hi_mmc_handle_non_os_xfer(struct rt_mmcsd_host *mmc, struct rt_mmcsd_req *req);\r
+\r
+void hi_mmc_set_clock(struct rt_mmcsd_host *mmc, unsigned int clocknum);\r
+\r
+void hi_mmc_set_os_interrupt(struct rt_mmcsd_host *mmc, bool en);\r
+\r
+void hi_mmc_set_interrup_status(bool en);\r
+\r
+void mmc_set_bus_width(void);\r
+\r
+void hi_mmc_set_bus_width(struct rt_mmcsd_host *mmc, int width);\r
+\r
+int mmc_switch(struct rt_mmcsd_card *card, rt_uint8_t set, rt_uint8_t index, rt_uint8_t value);\r
+\r
+void mmc_set_sdiom_clk_mode(int clk_type);\r
+\r
+void hi_mmc_set_drv_features(struct hi_mmc_drv *mmc_drv, uint8_t id);\r
+\r
+int hi_mmc_set_int_info(struct rt_mmcsd_host *mmc, struct hi_mmc_drv *mmc_drv);\r
+\r
+void hi_mmc_set_host_features(struct rt_mmcsd_host *mmc);\r
+\r
+void hi_mmc_set_drv_bus_width_features(struct hi_mmc_drv *mmc_drv);\r
+\r
+void mmc_set_driver_capability(struct rt_mmcsd_host* mmc, uint32_t cap);\r
+\r
+bool mmc_detect_bus_error(struct rt_mmcsd_host* host);\r
+\r
+void hi_mmc_set_err_to_aon_area(void);\r
+\r
+void hi_mmc_reset_cmd_data(struct rt_mmcsd_host* host);\r
+\r
+uint32_t hi_mmc_get_present_state(struct rt_mmcsd_host *host);\r
+\r
+int hi_mmc_send_stop_cmd(struct rt_mmcsd_host *mmc, uint32_t *status);\r
+\r
+mmc_err_info_type_t *hi_mmc_get_err_from_aon_area(void);\r
+\r
+void hi_mmc_set_magic_to_aon_area(void);\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2018-2020. All rights reserved.\r
+ * Description: HAL MMC DRIVER.\r
+ * Author:\r
+ * Create: 2020-04\r
+ */\r
+#include "hal_mmc_common.h"\r
+#include "mshc_reg.h"\r
+#include "tcxo.h"\r
+#include "hal_pmu_peripheral_application.h"\r
+#include "non_os.h"\r
+#include "clocks_core.h"\r
+#include "platform_core.h"\r
+\r
+#define SDIOM_SRC_CLK_LOW_FREQ_VAL 32000000 // 32MHz\r
+#define SDIOM_SRC_CLK_FREQ_LEVEL_50M_VAL 50000000 // 50MHz\r
+#define SDIOM_SRC_CLK_FREQ_LEVEL_64M_VAL 64000000 // 64MHz\r
+#define SDIOM_SRC_CLK_HIGH_FREQ_VAL 196000000 // 196MHz\r
+#define SDIOM_WITH_SET_TM_AND_FIRST_FREQ_DIV 1\r
+#define SDIOM_WITHOUT_SET_TM_AND_SECOND_FREQ_DIV 2\r
+\r
+hal_sdiom_clk_mode_t g_sdiom_clk_cfg[HAL_SDIOM_CLK_MODE_MAX_NUM] = {\r
+ { 0, 50000000, SD_HOST_CCLK_REG, 4 }, // sdio host clk 50MHz, emmc clk 50MHz 50000000\r
+ { 1, 50000000, EMMC_CCLK_DIV_REG, 6 }, // sdio host clk 50MHz, emmc clk 32MHz 50000000\r
+ { 0, 50000000, SD_HOST_CCLK_REG, 6 }, // sdio host clk 32MHz, emmc clk 50Mhz 50000000\r
+ { 1, 32000000, EMMC_CCLK_DIV_REG, 1 }, // sdio host clk 50MHz, emmc clk 32MHz 50000000\r
+};\r
+\r
+#if (SUPPORT_HI_EMMC_PHY == YES)\r
+static void hi_mmc_set_phy_ioctl(struct hi_mmc_drv *mmc_drv)\r
+{\r
+ mmc_writel(mmc_drv, PHY_IOCTL_PUPD_VAL, MSHC_PHY_IOCTL_PUPD);\r
+ mmc_writel(mmc_drv, PHY_IOCTL_IOE_VAL, MSHC_PHY_IOCTL_IOE);\r
+}\r
+\r
+void hi_mmc_set_phy_driver_capability(struct hi_mmc_drv *mmc_drv, uint32_t val)\r
+{\r
+ uint32_t ronsel = 0;\r
+ uint32_t ronsel2 = 0;\r
+ if (val & PHY_IOCTL_RONSEL_BIT0) { ronsel = PHY_IOCTL_RONSEL_BIT0_VAL_1; }\r
+ if (val & PHY_IOCTL_RONSEL_BIT1) { ronsel |= PHY_IOCTL_RONSEL_BIT1_VAL_1; }\r
+ if (val & PHY_IOCTL_RONSEL_BIT2) { ronsel2 = PHY_IOCTL_RONSEL_BIT2_VAL_1; }\r
+\r
+ mmc_writel(mmc_drv, ronsel, MSHC_PHY_IOCTL_RONSEL_1_0);\r
+ mmc_writel(mmc_drv, ronsel2, MSHC_PHY_IOCTL_OD_RONSEL_2);\r
+}\r
+\r
+static void hi_mmc_set_phy_invert_phase(struct hi_mmc_drv *mmc_drv)\r
+{\r
+ mmc_writel(mmc_drv, PHY_INV_CLK, DLY_CTL1);\r
+}\r
+\r
+static void hi_mmc_set_phy_delay_by_measurement(struct hi_mmc_drv *mmc_drv)\r
+{\r
+ uint32_t val;\r
+ mmc_writel(mmc_drv, PHYINITCTRL_DISABLE, PHYINITCTRL);\r
+ mmc_writel(mmc_drv, PHY_SET_DLY_MEAS_EN, PHYCTRL2);\r
+ mmc_writel(mmc_drv, PHYINITCTRL_ENABLE, PHYINITCTRL);\r
+ while (mmc_readl(mmc_drv, PHYINITCTRL) & PHY_INIT_EN_MASK) {}\r
+ val = mmc_reg32_getbits(mmc_drv, DLY_CTL, PHY_DLY_CODE_R_POS, PHY_DLY_CODE_R_LEN);\r
+ // set the 1/4 T delay (meas val) to DLY_CLT1.dly1_code and DLY_CTL1.dly3.code\r
+ mmc_reg32_setbits(mmc_drv, DLY_CTL1, PHY_DLAY1_CODE_POS, PHY_DLAY1_CODE_LEN, val / 4); // 4\r
+ mmc_reg32_setbits(mmc_drv, DLY_CTL1, PHY_DLAY3_CODE_POS, PHY_DLAY3_CODE_LEN, val / 4); // 4\r
+ mmc_writel(mmc_drv, PHY_SET_DLY_MEAS_DIS, PHYCTRL2);\r
+}\r
+#endif\r
+\r
+uint32_t hal_mmc_get_cap1(struct hi_mmc_drv *mmc_drv)\r
+{\r
+ return mmc_readl(mmc_drv, MSHC_CAPABILITIES_1);\r
+}\r
+\r
+uint32_t hal_mmc_get_cap2(struct hi_mmc_drv *mmc_drv)\r
+{\r
+ return mmc_readl(mmc_drv, MSHC_CAPABILITIES_2);\r
+}\r
+\r
+void hal_mmc_enable_plug_irq(struct hi_mmc_drv* mmc_drv, uint32_t irq)\r
+{\r
+ mmc_writew(mmc_drv, irq & MSHC_NOR_INT_MASK, MSHC_NOR_INT_ENABLE);\r
+ mmc_writew(mmc_drv, (irq & MSHC_ERR_INT_MASK) >> MSHC_ERR_INT_OFFSET, MSHC_ERR_INT_ENABLE);\r
+\r
+ mmc_writew(mmc_drv, irq & MSHC_NOR_INT_MASK, MSHC_NOR_SIGNAL_ENABLE);\r
+ mmc_writew(mmc_drv, (irq & MSHC_ERR_INT_MASK) >> MSHC_ERR_INT_OFFSET, MSHC_ERR_SIGNAL_ENABLE);\r
+}\r
+\r
+void hal_mmc_set_sample_phase(struct hi_mmc_drv *mmc_drv, uint32_t phase)\r
+{\r
+ uint32_t fields;\r
+ fields = mmc_readl(mmc_drv, MSHC_AUTO_TUNING_STATUS);\r
+ fields &= ~MSHC_CENTER_PH_CODE_MASK;\r
+ fields |= (uint32_t)phase;\r
+ mmc_writel(mmc_drv, fields, MSHC_AUTO_TUNING_STATUS);\r
+}\r
+\r
+static void hi_mmc_set_sdio_clk_in_cs(uint32_t fields, uint8_t div_num)\r
+{\r
+ uint16_t value;\r
+\r
+ value = readw(fields);\r
+ value &= ~SDIO_EMMC_ORI_LOAD_DIV_EN;\r
+ writew(fields, value);\r
+ value &= SDIO_EMMC_DIV_NUM_MASK;\r
+ value |= (div_num << SDIO_EMMC_DIV_NUM_POST_SHIFT);\r
+ writew(fields, value);\r
+ value |= SDIO_EMMC_ORI_LOAD_DIV_EN;\r
+ writew(fields, value);\r
+ value |= SDIO_EMMC_ORI_DIV_EN;\r
+ writew(fields, value);\r
+ value |= SDIO_EMMC_CCLK_EN;\r
+ writew(fields, value);\r
+}\r
+\r
+#if (USE_SDIOM_CLK_CONFIG_WAY == SDIOM_WITH_SET_TM_AND_FIRST_FREQ_DIV)\r
+static void hal_mmc_adapte_clock(unsigned int cfg_clock, unsigned int *div_num,\r
+ unsigned int *tm_div_num, unsigned int *clock)\r
+{\r
+ if (cfg_clock >= MMC_FREQ_100M) {\r
+ *div_num = MMC_100M_DIV_NUM;\r
+ *tm_div_num = MMC_SRC_200M_TM_DIV_NUM;\r
+ *clock = MMC_FREQ_100M;\r
+ } else if (cfg_clock >= MMC_FREQ_50M) {\r
+ *div_num = MMC_50M_DIV_NUM;\r
+ *tm_div_num = MMC_SRC_200M_TM_DIV_NUM;\r
+ *clock = MMC_FREQ_50M;\r
+ } else if (cfg_clock >= MMC_FREQ_32M) {\r
+ *div_num = MMC_32M_DIV_NUM;\r
+ *tm_div_num = MMC_SRC_32M_TM_DIV_NUM;\r
+ *clock = MMC_FREQ_32M;\r
+ } else if (cfg_clock >= MMC_FREQ_16M) {\r
+ *div_num = MMC_16M_DIV_NUM;\r
+ *tm_div_num = MMC_SRC_32M_TM_DIV_NUM;\r
+ *clock = MMC_FREQ_16M;\r
+ } else if (cfg_clock >= MMC_FREQ_400K) {\r
+ *div_num = MMC_400K_DIV_NUM;\r
+ *tm_div_num = MMC_SRC_32M_TM_DIV_NUM;\r
+ *clock = MMC_FREQ_400K;\r
+ } else if (cfg_clock >= MMC_FREQ_100K) {\r
+ *div_num = MMC_100K_DIV_NUM;\r
+ *tm_div_num = MMC_SRC_32M_TM_DIV_NUM;\r
+ *clock = MMC_FREQ_100K;\r
+ } else {\r
+ *div_num = MMC_32M_DIV_NUM;\r
+ *tm_div_num = MMC_SRC_32M_TM_DIV_NUM;\r
+ *clock = 0;\r
+ }\r
+}\r
+\r
+unsigned int hi_mmc_set_clock_with_way1(struct hi_mmc_drv *mmc_drv, unsigned int cfg_clock)\r
+{\r
+ unsigned int div_num = 0;\r
+ unsigned int tm_div_num = 0;\r
+ unsigned int real_clock;\r
+ unsigned int clk_div[MAX_MMC_NUM] = {EMMC_CCLK_DIV_REG, SD_HOST_CCLK_REG};\r
+ unsigned int sdio_tm_div = SDIO_TM_DIV_REG;\r
+ unsigned int sdio_emmc_reg;\r
+ system_sdio_freq_t sdiom_clk = CLOCKS_SDIO_FREQ_32M;\r
+ uint16_t value;\r
+ non_os_enter_critical();\r
+ hal_mmc_adapte_clock(cfg_clock, &div_num, &tm_div_num, &real_clock);\r
+ if (cfg_clock > MMC_FREQ_32M) { sdiom_clk = CLOCKS_SDIO_FREQ_H; } // high freq is 193.3MHz in suxun chip.\r
+ sdio_emmc_reg = clk_div[mmc_drv->id]; // 0--emmc, 1--sdio host\r
+ value = readw(sdio_emmc_reg);\r
+ value &= ~SDIO_EMMC_CCLK_EN;\r
+ value &= ~SDIO_EMMC_ORI_DIV_EN;\r
+ writew(sdio_emmc_reg, value);\r
+ value = readw(sdio_tm_div);\r
+ value &= ~SDIO_TM_DIV_EN;\r
+ writew(sdio_tm_div, value);\r
+ // Sets the eMMC source clock.\r
+ clocks_set_sdio_freq(sdiom_clk);\r
+ // Sets emmc or sdio host frequency divider number.\r
+ hi_mmc_set_sdio_clk_in_cs(sdio_emmc_reg, (uint8_t)div_num);\r
+ // Sets sdio host and emmc TMCLK(about 1MHz).\r
+ value = readw(sdio_tm_div);\r
+ value &= ~SDIO_TM_DIV_LOAD_EN;\r
+ writew(sdio_tm_div, value);\r
+ value &= ~SDIO_TM_DIV_MASK;\r
+ value |= (uint16_t)(tm_div_num << SDIO_TM_DIV_NUM_POST_SHIFT);\r
+ writew(sdio_tm_div, value);\r
+ value |= SDIO_TM_DIV_LOAD_EN;\r
+ writew(sdio_tm_div, value);\r
+ value |= SDIO_TM_DIV_EN;\r
+ writew(sdio_tm_div, value);\r
+ non_os_exit_critical();\r
+ PRINT("Clock cfg:%#x div:%#x %#x real_clock %d\n", cfg_clock, div_num, sdio_tm_div, real_clock);\r
+ return real_clock;\r
+}\r
+\r
+#elif (USE_SDIOM_CLK_CONFIG_WAY == SDIOM_WITHOUT_SET_TM_AND_SECOND_FREQ_DIV)\r
+static void hi_mmc_set_sd_bus_clk_div(uint32_t div_reg, uint32_t freq_div)\r
+{\r
+ uint16_t value;\r
+ value = readw(div_reg);\r
+ value &= ~SD_BUS_LOAD_DIV_EN;\r
+ writew(div_reg, value);\r
+ value &= ~SD_BUS_DIV_NUM_MASK;\r
+ value |= (uint16_t)(freq_div << SD_BUS_DIV_NUM_POST_SHIFT);\r
+ writew(div_reg, value);\r
+ value |= SD_BUS_LOAD_DIV_EN;\r
+ writew(div_reg, value);\r
+}\r
+\r
+static void hi_mmc_set_second_level_clk_div(uint32_t div_reg, uint32_t freq_div)\r
+{\r
+ uint16_t value;\r
+ value = readw(div_reg);\r
+ value &= ~SDIO_EMMC_CCLK_EN;\r
+ value &= ~SDIO_EMMC_ORI_DIV_EN;\r
+ writew(div_reg, value);\r
+ if (div_reg == EMMC_DIV_REG) {\r
+ value &= ~EMMC_DIV_NUM_MASK;\r
+ value |= (uint16_t)(freq_div << SDIO_EMMC_DIV_NUM_POST_SHIFT);\r
+ } else {\r
+ value &= ~SDIO_DIV_NUM_MASK;\r
+ value |= (uint16_t)(freq_div << SDIO_DIV_NUM_POST_SHIFT);\r
+ }\r
+ writew(div_reg, value);\r
+ value |= EMMC_CCLK_LOAD_DIV_EN;\r
+ writew(div_reg, value);\r
+ value |= EMMC_EMMC_CCLK_EN;\r
+ writew(div_reg, value);\r
+}\r
+\r
+static void hi_mmc_set_first_level_clk_div(uint32_t div_reg, uint32_t freq_div)\r
+{\r
+ uint16_t value;\r
+ value = readw(div_reg);\r
+ value &= ~SDIO_EMMC_CCLK_EN;\r
+ value &= ~SDIO_EMMC_ORI_DIV_EN;\r
+ writew(div_reg, value);\r
+ value &= ~SDIO_EMMC_DIV_NUM_MASK;\r
+ value |= (uint16_t)(freq_div << SDIO_EMMC_DIV_NUM_POST_SHIFT);\r
+ writew(div_reg, value);\r
+ value |= EMMC_CCLK_LOAD_DIV_EN;\r
+ writew(div_reg, value);\r
+ value |= EMMC_EMMC_CCLK_EN;\r
+ writew(div_reg, value);\r
+ value |= BIT(14); // 14\r
+ writew(div_reg, value);\r
+}\r
+\r
+static void hi_mmc_set_sdiom_src_clk(uint32_t cfg_clock, uint32_t *freq_div, uint32_t *clk_level)\r
+{\r
+ system_sdio_freq_t sdiom_freq_level;\r
+ if (cfg_clock <= SDIOM_SRC_CLK_LOW_FREQ_VAL) {\r
+ sdiom_freq_level = CLOCKS_SDIO_FREQ_32M;\r
+ *clk_level = SDIOM_SRC_CLK_LOW_FREQ_VAL;\r
+ *freq_div = SDIOM_SRC_CLK_LOW_FREQ_VAL / cfg_clock;\r
+ if (SDIOM_SRC_CLK_LOW_FREQ_VAL % cfg_clock != 0) { *freq_div += 1; }\r
+ } else if (cfg_clock == SDIOM_SRC_CLK_FREQ_LEVEL_50M_VAL) {\r
+ sdiom_freq_level = CLOCKS_SDIO_FREQ_50M;\r
+ *clk_level = SDIOM_SRC_CLK_FREQ_LEVEL_50M_VAL;\r
+ *freq_div = 1;\r
+ } else if (cfg_clock == SDIOM_SRC_CLK_FREQ_LEVEL_64M_VAL) {\r
+ sdiom_freq_level = CLOCKS_SDIO_FREQ_64M;\r
+ *clk_level = SDIOM_SRC_CLK_FREQ_LEVEL_64M_VAL;\r
+ *freq_div = 1;\r
+ } else if (cfg_clock <= SDIOM_SRC_CLK_HIGH_FREQ_VAL) {\r
+ sdiom_freq_level = CLOCKS_SDIO_FREQ_H;\r
+ *clk_level = SDIOM_SRC_CLK_HIGH_FREQ_VAL;\r
+ *freq_div = SDIOM_SRC_CLK_HIGH_FREQ_VAL / cfg_clock;\r
+ if (SDIOM_SRC_CLK_HIGH_FREQ_VAL % cfg_clock != 0) { *freq_div += 1; }\r
+ } else {\r
+ sdiom_freq_level = CLOCKS_SDIO_FREQ_32M;\r
+ *clk_level = SDIOM_SRC_CLK_FREQ_LEVEL_64M_VAL;\r
+ *freq_div = 1;\r
+ }\r
+}\r
+\r
+unsigned int hi_mmc_set_clock_with_way2(struct hi_mmc_drv *mmc_drv, unsigned int cfg_clock)\r
+{\r
+ uint32_t clock_level;\r
+ uint32_t first_freq_div = 0;\r
+ uint32_t freq_div = 0;\r
+ uint32_t second_freq_div = 0;\r
+ uint32_t sec_freq_div = 1; // Reserved for future expansion\r
+\r
+ if (mmc_drv == NULL || mmc_drv->id >= MAX_MMC_NUM) {\r
+ return 0;\r
+ }\r
+\r
+ hi_mmc_set_sdiom_src_clk(cfg_clock, &freq_div, &clock_level);\r
+\r
+ if (mmc_drv->id == SDIO_EMMC_ID) {\r
+ first_freq_div = EMMC_CCLK_DIV_REG;\r
+ second_freq_div = EMMC_DIV_REG;\r
+ } else {\r
+ first_freq_div = SD_HOST_CCLK_REG;\r
+ second_freq_div = SDIO_DIV_REG;\r
+ }\r
+ hi_mmc_set_first_level_clk_div(first_freq_div, freq_div);\r
+ hi_mmc_set_second_level_clk_div(second_freq_div, sec_freq_div);\r
+ return (clock_level / freq_div);\r
+}\r
+\r
+bool hi_mmc_set_clock_switch(uint32_t fisrt_div, uint32_t second_div, uint32_t sd_bus_div)\r
+{\r
+ hi_mmc_set_first_level_clk_div(EMMC_CCLK_DIV_REG, fisrt_div); // 198M 4div 49M\r
+ hi_mmc_set_second_level_clk_div(EMMC_DIV_REG, second_div); // 1div 49M\r
+ hi_mmc_set_sd_bus_clk_div(SDIO_DIV_REG, sd_bus_div); // sdbus 1div, 196M\r
+ return true;\r
+}\r
+#endif\r
+\r
+static unsigned int hal_mmc_set_soc_clock(struct hi_mmc_drv *mmc_drv, unsigned int cfg_clock)\r
+{\r
+ UNUSED(mmc_drv);\r
+ UNUSED(cfg_clock);\r
+#if (USE_SDIOM_CLK_CONFIG_WAY == SDIOM_WITH_SET_TM_AND_FIRST_FREQ_DIV)\r
+ return hi_mmc_set_clock_with_way1(mmc_drv, cfg_clock);\r
+#elif (USE_SDIOM_CLK_CONFIG_WAY == SDIOM_WITHOUT_SET_TM_AND_SECOND_FREQ_DIV)\r
+ return hi_mmc_set_clock_with_way2(mmc_drv, cfg_clock);\r
+#else\r
+ return 0; // for the further extending\r
+#endif\r
+} /*lint +e550 +e574*/\r
+\r
+void hal_mmc_set_card_clk(struct hi_mmc_drv *mmc_drv, bool en)\r
+{\r
+ uint16_t clk;\r
+ non_os_enter_critical();\r
+ clk = mmc_readw(mmc_drv, MSHC_CLOCK_CONTROL);\r
+ if (en) {\r
+ clk |= MSHC_CLOCK_CARD_EN;\r
+ } else {\r
+ clk &= ~MSHC_CLOCK_CARD_EN;\r
+ }\r
+ mmc_writew(mmc_drv, clk, MSHC_CLOCK_CONTROL);\r
+ non_os_exit_critical();\r
+}\r
+\r
+void hal_mmc_set_clock(struct hi_mmc_drv *mmc_drv, unsigned int clocknum)\r
+{\r
+ unsigned short clk;\r
+ unsigned long timeout_val;\r
+ unsigned int ret;\r
+\r
+ non_os_enter_critical();\r
+ // turn off clk2card_on\r
+ clk = mmc_readw(mmc_drv, MSHC_CLOCK_CONTROL);\r
+ clk &= ~(MSHC_CLOCK_CARD_EN);\r
+ mmc_writew(mmc_drv, clk, MSHC_CLOCK_CONTROL);\r
+\r
+ // turn off card_clk_en\r
+ clk &= ~(MSHC_CLOCK_INT_EN | MSHC_CLOCK_PLL_EN);\r
+ mmc_writew(mmc_drv, clk, MSHC_CLOCK_CONTROL);\r
+\r
+ if (clocknum == 0) {\r
+ non_os_exit_critical();\r
+ return;\r
+ }\r
+ if (clocknum >= mmc_drv->freq_max) {\r
+ clocknum = mmc_drv->freq_max;\r
+ }\r
+\r
+ ret = hal_mmc_set_soc_clock(mmc_drv, clocknum);\r
+ if (!ret) {\r
+ LOG_E("Set clock fail!\n");\r
+ non_os_exit_critical();\r
+ return;\r
+ }\r
+ mmc_drv->clock = ret;\r
+ // turn on card_clk_en\r
+ clk |= MSHC_CLOCK_INT_EN | MSHC_CLOCK_PLL_EN;\r
+ mmc_writew(mmc_drv, clk, MSHC_CLOCK_CONTROL);\r
+\r
+ timeout_val = 20; // max wait clock stable 20ms\r
+ while (timeout_val) {\r
+ clk = mmc_readw(mmc_drv, MSHC_CLOCK_CONTROL);\r
+ if (clk & (unsigned short)MSHC_CLOCK_INT_STABLE) { break; }\r
+ if (timeout_val == 1) {\r
+ LOG_E("Internal clock never stabilized.\n");\r
+ non_os_exit_critical();\r
+ return;\r
+ }\r
+ timeout_val--;\r
+ uapi_tcxo_delay_ms((uint64_t)1);\r
+ }\r
+\r
+ // turn on clk2card_on\r
+ clk |= MSHC_CLOCK_CARD_EN;\r
+ mmc_writew(mmc_drv, clk, MSHC_CLOCK_CONTROL);\r
+ non_os_exit_critical();\r
+}\r
+\r
+void hal_mmc_clr_reg(struct hi_mmc_drv *mmc_drv, unsigned int mask)\r
+{\r
+ unsigned long timeout_val;\r
+\r
+ mmc_writeb(mmc_drv, (uint8_t)mask, MSHC_SOFTWARE_RESET);\r
+ if (mask & MSHC_RESET_ALL) {\r
+ mmc_drv->clock = 0;\r
+ }\r
+\r
+ timeout_val = 100; // timeout 100ms\r
+\r
+ /* hw clears the bit when it's done */\r
+ while (mmc_readb(mmc_drv, MSHC_SOFTWARE_RESET) & mask) {\r
+ if (timeout_val == 0) {\r
+ LOG_E("host%d: Reset 0x%x never completed.\n",\r
+ mmc_drv->id, (int)mask);\r
+ hi_mmc_dumpregs(mmc_drv);\r
+ return;\r
+ }\r
+ timeout_val--;\r
+ uapi_tcxo_delay_ms((uint64_t)1);\r
+ }\r
+\r
+ if (mask & MSHC_RESET_ALL) { mmc_drv->preset_enabled = false; }\r
+}\r
+\r
+void hal_mmc_deassert_status(struct hi_mmc_drv *mmc_drv)\r
+{\r
+ unsigned int value;\r
+ non_os_enter_critical();\r
+ pmu_sdio_glb_common_reset(true);\r
+ if (mmc_drv->id == SDIO_EMMC_ID) {\r
+ hal_pmu_mcpu_perip_reset(HAL_PMU_MCPU_PERIP_EMMC, HAL_PMU_PERIP_REQUEST_RESET);\r
+ hal_pmu_mcpu_perip_reset(HAL_PMU_MCPU_PERIP_EMMC, HAL_PMU_PERIP_REQUEST_DERESET);\r
+ } else {\r
+ hal_pmu_mcpu_perip_reset(HAL_PMU_MCPU_PERIP_SDIO_HOST, HAL_PMU_PERIP_REQUEST_RESET);\r
+ hal_pmu_mcpu_perip_reset(HAL_PMU_MCPU_PERIP_SDIO_HOST, HAL_PMU_PERIP_REQUEST_DERESET);\r
+ }\r
+ non_os_exit_critical();\r
+ // open the clk of card:\r
+ value = mmc_readl(mmc_drv, MSHC_CLK_CTRL);\r
+ value |= MSHC_CLK_CTRL_INT_CLK;\r
+ mmc_writel(mmc_drv, value, MSHC_CLK_CTRL);\r
+\r
+ /* clock config with 400khz */\r
+ (void)hal_mmc_set_clock(mmc_drv, MMC_FREQ_400K);\r
+#if (SUPPORT_HI_EMMC_PHY == YES)\r
+ if (mmc_drv->id == SDIO_EMMC_ID) {\r
+ hi_mmc_set_phy_ioctl(mmc_drv); // config emmc PHY mode\r
+ hi_mmc_set_phy_driver_capability(mmc_drv, mmc_drv->phy_driver_cap);\r
+ hi_mmc_set_phy_invert_phase(mmc_drv);\r
+ hi_mmc_set_phy_delay_by_measurement(mmc_drv);\r
+ }\r
+#endif\r
+}\r
+\r
+static void hal_mmc_set_uhs_signal(struct hi_mmc_drv *mmc_drv, enum mmc_bus_timing timing)\r
+{\r
+ unsigned short ctrl_2;\r
+\r
+ ctrl_2 = mmc_readw(mmc_drv, MSHC_HOST_CONTROL2);\r
+\r
+ /* Select Bus Speed Mode for host */\r
+ ctrl_2 &= ~MSHC_CTRL_UHS_MASK;\r
+ if ((timing == TIMING_UHS_SDR104) || (timing == TIMING_MMC_HS200)) {\r
+ ctrl_2 |= MSHC_CTRL_UHS_SDR104;\r
+ } else if (timing == TIMING_UHS_SDR12) {\r
+ ctrl_2 |= MSHC_CTRL_UHS_SDR12;\r
+ } else if ((timing == TIMING_UHS_SDR25) || (timing == TIMING_MMC_HS)) {\r
+ ctrl_2 |= MSHC_CTRL_UHS_SDR25;\r
+ } else if (timing == TIMING_UHS_SDR50) {\r
+ ctrl_2 |= MSHC_CTRL_UHS_SDR50;\r
+ } else if ((timing == TIMING_UHS_DDR50) || (timing == TIMING_UHS_DDR52)) {\r
+ ctrl_2 |= MSHC_CTRL_UHS_DDR50;\r
+ } else if (timing == TIMING_MMC_HS400) {\r
+ ctrl_2 |= MSHC_CTRL_HS400;\r
+ }\r
+ ctrl_2 |= MSHC_CTRL_VDD_180;\r
+ mmc_writew(mmc_drv, ctrl_2, MSHC_HOST_CONTROL2);\r
+}\r
+\r
+void hal_mmc_set_preset_val(struct hi_mmc_drv *mmc_drv, bool en)\r
+{\r
+ unsigned short ctrl_val = 0;\r
+ if (mmc_drv->version < MSHC_SPEC_300) { return; }\r
+\r
+ if (mmc_drv->preset_enabled != (uint32_t)en) {\r
+ ctrl_val = mmc_readw(mmc_drv, MSHC_HOST_CONTROL2);\r
+ if (en) {\r
+ ctrl_val |= MSHC_CTRL_PRESET_VAL_ENABLE;\r
+ } else {\r
+ ctrl_val &= ~MSHC_CTRL_PRESET_VAL_ENABLE;\r
+ }\r
+\r
+ mmc_writew(mmc_drv, ctrl_val, MSHC_HOST_CONTROL2);\r
+ mmc_drv->preset_enabled = en;\r
+ }\r
+}\r
+\r
+void hal_mmc_set_timing(struct hi_mmc_drv *mmc_drv, int timing)\r
+{\r
+ unsigned short clockval = 0;\r
+ unsigned short ctrl_2 = 0;\r
+ uint8_t ctrl;\r
+\r
+ ctrl = mmc_readb(mmc_drv, MSHC_HOST_CONTROL);\r
+\r
+ if (timing >= TIMING_MMC_HS) {\r
+ ctrl |= MSHC_CTRL_HISPD;\r
+ }\r
+ if (mmc_drv->version < MSHC_SPEC_300) {\r
+ mmc_writeb(mmc_drv, ctrl, MSHC_HOST_CONTROL);\r
+ return;\r
+ }\r
+ if (!mmc_drv->preset_enabled) {\r
+ mmc_writeb(mmc_drv, ctrl, MSHC_HOST_CONTROL);\r
+ ctrl_2 = mmc_readw(mmc_drv, MSHC_HOST_CONTROL2);\r
+ ctrl_2 &= ~MSHC_CTRL_DRV_TYPE_MASK;\r
+\r
+ mmc_writew(mmc_drv, ctrl_2, MSHC_HOST_CONTROL2);\r
+ } else {\r
+ clockval = mmc_readw(mmc_drv, MSHC_CLOCK_CONTROL);\r
+ clockval &= ~MSHC_CLOCK_CARD_EN;\r
+ mmc_writew(mmc_drv, clockval, MSHC_CLOCK_CONTROL);\r
+\r
+ mmc_writeb(mmc_drv, ctrl, MSHC_HOST_CONTROL);\r
+ hal_mmc_set_clock(mmc_drv, mmc_drv->clock);\r
+ }\r
+ clockval = mmc_readw(mmc_drv, MSHC_CLOCK_CONTROL);\r
+ clockval &= ~MSHC_CLOCK_CARD_EN;\r
+ mmc_writew(mmc_drv, clockval, MSHC_CLOCK_CONTROL);\r
+\r
+ hal_mmc_set_uhs_signal(mmc_drv, (enum mmc_bus_timing)timing);\r
+ mmc_drv->timing = (uint32_t)timing;\r
+ if (mmc_drv->preset_enabled) {\r
+ hal_mmc_set_preset_val(mmc_drv, true);\r
+ }\r
+ hal_mmc_set_clock(mmc_drv, mmc_drv->clock);\r
+}\r
+\r
+void hal_mmc_adma_config(struct hi_mmc_drv *mmc_drv)\r
+{\r
+ mmc_writel(mmc_drv, (uintptr_t)mmc_drv->adma_desc, MSHC_ADMA_ADDRESS_LOW);\r
+}\r
+\r
+void hal_mmc_set_sdiom_clk_mode(struct hi_mmc_drv** drv, int mode)\r
+{\r
+ int id = g_sdiom_clk_cfg[mode].id;\r
+ uint32_t clock = g_sdiom_clk_cfg[mode].clock;\r
+ uint32_t fields = g_sdiom_clk_cfg[mode].amend_div_reg;\r
+ uint32_t div_num = g_sdiom_clk_cfg[mode].amend_div_num;\r
+ non_os_enter_critical();\r
+ hal_mmc_set_clock(drv[id], clock);\r
+ hi_mmc_set_sdio_clk_in_cs(fields, (uint8_t)div_num);\r
+ non_os_exit_critical();\r
+}\r
+\r
+void hal_mmc_set_emmc_ctrl(struct hi_mmc_drv *mmc_drv, uint32_t offset, uint32_t pos, uint32_t bits, uint32_t val)\r
+{\r
+ reg_setbits(mmc_drv->hw_base_addr, offset, pos, bits, val);\r
+}\r
+\r
+void hal_mmc_set_clk_en(hal_mmc_bus_num_t mmc_bus, bool en)\r
+{\r
+ if (mmc_bus >= MAX_MMC_NUM) { return; }\r
+\r
+ uint32_t clk_reg[MAX_MMC_NUM] = { EMMC_CCLK_DIV_REG, SD_HOST_CCLK_REG };\r
+ uint32_t reg_addr = clk_reg[mmc_bus];\r
+ non_os_enter_critical();\r
+ if (en) {\r
+ reg16_setbit((void *)((uintptr_t)reg_addr), SDIO_EMMC_CCLK_EN_POS);\r
+ } else {\r
+ reg16_clrbit((void *)((uintptr_t)reg_addr), SDIO_EMMC_CCLK_EN_POS);\r
+ }\r
+ non_os_exit_critical();\r
+}\r
+\r
+void hi_mmc_dumpregs(struct hi_mmc_drv *mmc_drv)\r
+{\r
+ LOG_E(": =========== DUMP (host%d) REGISTER===========\n", mmc_drv->id);\r
+\r
+ LOG_E(": Sys addr[00]: 0x%08x | Version[FE]: 0x%04x\n", mmc_readl(mmc_drv, MSHC_DMA_ADDRESS),\r
+ mmc_readw(mmc_drv, MSHC_HOST_VERSION));\r
+ LOG_E(": Blk size[04]: 0x%04x | Blk cnt[06]: 0x%04x\n", mmc_readw(mmc_drv, MSHC_BLOCK_SIZE),\r
+ mmc_readw(mmc_drv, MSHC_BLOCK_COUNT));\r
+ LOG_E(": Argument[08]: 0x%08x | Trn mode[0C]: 0x%04x\n", mmc_readl(mmc_drv, MSHC_ARGUMENT),\r
+ mmc_readw(mmc_drv, MSHC_TRANSFER_MODE));\r
+ LOG_E(": Present[24]: 0x%08x | Host ctl[28]: 0x%02x\n", mmc_readl(mmc_drv, MSHC_PRESENT_STATE),\r
+ mmc_readb(mmc_drv, MSHC_HOST_CONTROL));\r
+ LOG_E(": Power[29]: 0x%02x | Blk gap[2A]: 0x%02x\n", mmc_readb(mmc_drv, MSHC_POWER_CONTROL),\r
+ mmc_readb(mmc_drv, MSHC_BLOCK_GAP_CONTROL));\r
+ LOG_E(": Wake-up[2B]: 0x%02x | Clock[2C]: 0x%04x\n", mmc_readb(mmc_drv, MSHC_WAKE_UP_CONTROL),\r
+ mmc_readw(mmc_drv, MSHC_CLOCK_CONTROL));\r
+ LOG_E(": Timeout[2E]: 0x%08x | Int stat[30]: 0x%08x\n", mmc_readb(mmc_drv, MSHC_TIMEOUT_CONTROL),\r
+ ((mmc_readw(mmc_drv, MSHC_ERR_INT_STATUS) << MSHC_ERR_INT_OFFSET) |\r
+ mmc_readw(mmc_drv, MSHC_NOR_INT_STATUS)));\r
+ LOG_E(": Int enab[34]: 0x%08x | Sig enab[38]: 0x%08x\n",\r
+ ((mmc_readw(mmc_drv, MSHC_ERR_INT_ENABLE) << MSHC_ERR_INT_OFFSET) |\r
+ mmc_readw(mmc_drv, MSHC_NOR_INT_ENABLE)),\r
+ ((mmc_readw(mmc_drv, MSHC_ERR_SIGNAL_ENABLE) << MSHC_ERR_INT_OFFSET) |\r
+ mmc_readw(mmc_drv, MSHC_NOR_SIGNAL_ENABLE)));\r
+ LOG_E(": ACMD err[3C]: 0x%04x | Slot int[FC]: 0x%04x\n", mmc_readw(mmc_drv, MSHC_AUTO_CMD_ERR),\r
+ mmc_readw(mmc_drv, MSHC_SLOT_INT_STATUS));\r
+ LOG_E(": Caps_1[40]: 0x%08x | Caps_2][44]: 0x%08x\n", mmc_readl(mmc_drv, MSHC_CAPABILITIES_1),\r
+ mmc_readl(mmc_drv, MSHC_CAPABILITIES_2));\r
+ LOG_E(": Cmd[0E]: 0x%04x | Max curr[48]: 0x%08x | opcode = %d\n",\r
+ mmc_readw(mmc_drv, MSHC_COMMAND), mmc_readl(mmc_drv, MSHC_MAX_CURRENT),\r
+ (mmc_readw(mmc_drv, MSHC_COMMAND) >> 8) & 0x3f); // 8 0x3f for get opcode what is bit13--bit8\r
+ LOG_E(": Resp:0x%08x 0x%08x 0x%08x 0x%08x\n",\r
+ mmc_readl(mmc_drv, MSHC_RESPONSE), mmc_readl(mmc_drv, MSHC_RESPONSE + 0x4),\r
+ mmc_readl(mmc_drv, MSHC_RESPONSE + 0x8), mmc_readl(mmc_drv, MSHC_RESPONSE + 0xC));\r
+ LOG_E(": Host ctl2[3E]: 0x%04x\n", mmc_readw(mmc_drv, MSHC_HOST_CONTROL2));\r
+ LOG_E(": Emmc ctrl[52C]: 0x%04x\n", mmc_readw(mmc_drv, MSHC_EMMC_CTRL));\r
+ if (mmc_drv->flags & MMC_FLAG_USE_ADMA) {\r
+ LOG_E(": ADMA Err[54]: 0x%02x | ADMA Ptr[58]: 0x%08x\n", mmc_readb(mmc_drv, MSHC_ADMA_ERROR),\r
+ mmc_readl(mmc_drv, MSHC_ADMA_ADDRESS_LOW));\r
+ }\r
+ LOG_E(": ===========================================\n");\r
+}\r
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2018-2020. All rights reserved.\r
+ * Description: HAL MMC COMMON DRIVER HEADER FILE\r
+ * Author:\r
+ * Create: 2020-04\r
+ */\r
+#ifndef HAL_MMC_COMMON_H\r
+#define HAL_MMC_COMMON_H\r
+\r
+#include "mmcsd_host.h"\r
+#include "chip_io.h"\r
+#include "platform_core.h"\r
+\r
+#define MMC_ADMA_MAX_DESC 8\r
+#define MMC_AMDA_32BIT_DESC_LINE_SIZE 8\r
+#define CACHE_ALIGNED_SIZE 64\r
+#define MAX_BLOCK_SIZE 512\r
+#define MAX_BLOCK_COUNT 4096\r
+#define MAX_SEG_SIZE 65536\r
+#define OFF_CLK2CARD_ON_DELAY 25\r
+#define SDIO_REG_CCCR_IO_ABORT 0x06 /* function abort/card reset */\r
+\r
+#define CONFIG_MMC0_CCLK_MIN 400000 // 400KHz\r
+#define CONFIG_MMC1_CCLK_MIN 100000 // 100KHz\r
+\r
+// sdio host & mmc base addr\r
+#define SDIO_HOST_BASE_ADDR 0x52061000 // SDIO HOST base address\r
+#define SDIO_EMMC_BASE_ADDR 0x52062000 // SDIO EMMC base address\r
+\r
+// clock config\r
+#define M_CTL_RB_BASE_ADDR 0x52000000\r
+\r
+#define SDIO_32M_CLKDIV_NUM_MASK 0x7F\r
+#define SDIO_32M_CLKDIV_NUM_SHIFT 2\r
+#define SDIO_32M_DIV_EN BIT(1)\r
+#define SDIO_32M_CLKSEL BIT(0)\r
+\r
+#define SDIO_CLKDIV_NUM_MASK 0xF\r
+#define SDIO_CLKDIV_NUM_POST_SHIFT 6\r
+#define SDIO_CLKDIV_NUM_PRE_SHIFT 1\r
+#define SDIO_CLKDIV_SEL_SOC BIT(10)\r
+#define SDIO_CLKDIV_POST_ENABLE BIT(5)\r
+#define SDIO_CLKDIV_PRE_ENABLE BIT(0)\r
+#define SDIO_CLKDIV_NUM_MAX 4\r
+\r
+// emmc/sdio host clock crg in suxun CS\r
+#define GLB_CLKEN_REG (M_CTL_RB_BASE_ADDR + 0x0548)\r
+#if CHIP == TARGET_CHIP_SUSONG\r
+#define SDIOM_CR_CLK_REG (M_CTL_RB_BASE_ADDR + 0x0568)\r
+#else\r
+#define SDIOM_CR_CLK_REG (M_CTL_RB_BASE_ADDR + 0x0564)\r
+#endif\r
+#define EMMC_CCLK_DIV_REG (M_CTL_RB_BASE_ADDR + 0x0100)\r
+#define EMMC_DIV_REG (M_CTL_RB_BASE_ADDR + 0x0120)\r
+#define SDIO_DIV_REG (M_CTL_RB_BASE_ADDR + 0x0124)\r
+#define SD_HOST_CCLK_REG (M_CTL_RB_BASE_ADDR + 0x0110)\r
+#define SDIO_CRG_HOST_100M_REG (M_CTL_RB_BASE_ADDR + 0x120)\r
+#define SDIO_TM_DIV_REG (M_CTL_RB_BASE_ADDR + 0x0124)\r
+#define SDIO_CRG_EMMC_32M_REG (M_CTL_RB_BASE_ADDR + 0x128)\r
+#define SDIO_CRG_HOST_32M_REG (M_CTL_RB_BASE_ADDR + 0x124)\r
+#define SDIO_CRG_EMMC_100M_REG (M_CTL_RB_BASE_ADDR + 0x12C)\r
+\r
+#define SDIO_EMMC_CCLK_EN BIT(0)\r
+#define SDIO_EMMC_CCLK_EN_POS 0\r
+#define SDIO_EMMC_ORI_DIV_EN BIT(1)\r
+#define SDIO_EMMC_ORI_LOAD_DIV_EN BIT(2)\r
+#define SDIO_DIV_NUM_MASK 0xF8 // bit3---bit7\r
+#define EMMC_DIV_NUM_MASK 0x70 // bit4---bit6\r
+#define SDIO_DIV_NUM_POST_SHIFT 3\r
+#define EMMC_CCLK_DIV_NUM_MASK 0x70\r
+#define EMMC_CCLK_LOAD_DIV_EN BIT(1)\r
+#define EMMC_EMMC_CCLK_EN BIT(0)\r
+#define SDIO_EMMC_DIV_NUM_POST_SHIFT 4\r
+#define SDIO_TM_DIV_EN BIT(0)\r
+#define SDIO_TM_DIV_LOAD_EN BIT(1)\r
+#define SDIO_TM_DIV_MASK 0x1FF0\r
+#define SDIO_TM_DIV_NUM_POST_SHIFT 4\r
+#define GLB_CLKEN_SDIOM_EN BIT(4)\r
+#define SDIOM_CR_EN BIT(0)\r
+#define SDIOM_CR_CLK_SEL_32M 0x2\r
+#define SDIOM_CR_CLK_SEL_400M 0x4\r
+#define SDIOM_CR_CLK_SEL_POST_SHIFT 1\r
+#define SDIOM_CR_CLK_MASK 0xF\r
+\r
+#define SDIO_LGC_EN_CS BIT(1)\r
+#define SDIO_CRG_EN_CS BIT(0)\r
+#define SDIO_HOST_RESET_EMMC_CS BIT(0)\r
+#define SDIO_HOST_RESET_SDIO_CS BIT(1)\r
+\r
+#define SD_BUS_LOAD_DIV_EN BIT(8)\r
+#define SD_BUS_DIV_NUM_MASK 0xF8 // bit3---bit7\r
+#define SD_BUS_DIV_NUM_POST_SHIFT 3\r
+#define SD_EMMC_CCLK_DIV_4 4\r
+#define SD_BUS_DIV_1 1\r
+#define SD_BUS_DIV_2 2\r
+#define SD_BUS_PVSA1 0xE8\r
+#define SD_BUS_PVSA1_POS 0\r
+#define SD_BUS_PVSA1_LEN 12\r
+#define SD_BUS_MBURST_POS 0\r
+#define SD_BUS_MBURST_LEN 4\r
+#define SD_BUS_MBURST_VAL 8\r
+\r
+#define MMC_100M_DIV_NUM 2 // clock source is 193.3MHz\r
+#define MMC_50M_DIV_NUM 4 // clock source is 193.3MHz\r
+\r
+// When the clock is less than 32 MHz, the clock source is TCXO(32MHz).\r
+#define MMC_32M_DIV_NUM 1\r
+#define MMC_16M_DIV_NUM 2\r
+#define MMC_400K_DIV_NUM 80\r
+#define MMC_100K_DIV_NUM 320\r
+#define MMC_SRC_32M_TM_DIV_NUM 32\r
+#define MMC_SRC_200M_TM_DIV_NUM 200\r
+#define MMC_FREQ_100K 100000\r
+#define MMC_FREQ_400K 400000\r
+#define MMC_FREQ_16M 16000000 // For FPGA Only\r
+#define MMC_FREQ_32M 32000000\r
+#define MMC_FREQ_50M 50000000\r
+#define MMC_FREQ_100M 100000000\r
+\r
+// reset config\r
+#define MCPU_SOFT_RST (M_CTL_RB_BASE_ADDR + 0x0054)\r
+#define SOFT_RST_MCU2DIS_H2H_N BIT(7)\r
+#define SOFT_RST_MDMA_H2X_N BIT(6)\r
+#define SOFT_RST_MEM_SUB_BUS_N BIT(5)\r
+#define SOFT_RST_MDIAG_N BIT(4)\r
+#define SOFT_RST_SEC_N BIT(3)\r
+#define SOFT_RST_AUX_ADC_N BIT(2)\r
+#define SOFT_RST_SDIO_BUS_N BIT(1)\r
+#define SOFT_RST_IR_N BIT(0)\r
+\r
+#define SDIO_CRG_SOFT_RST (M_CTL_RB_BASE_ADDR + 0x0104)\r
+#define SOFT_RST_DEVICE_SD_N BIT(7)\r
+#define SOFT_RST_DEVICE_BUS_N BIT(6)\r
+#define SOFT_RST_HOST_M_B_TM_N BIT(5)\r
+#define SOFT_RST_HOST_H_N BIT(4)\r
+#define SOFT_RST_HOST_TX_RX_N BIT(3)\r
+#define SOFT_RST_EMMC_M_B_TM_N BIT(2)\r
+#define SOFT_RST_EMMC_H_N BIT(1)\r
+#define SOFT_RST_EMMC_TX_RX_N BIT(0)\r
+\r
+#define PMU_EMMC_POWER_ON 0xFFFF\r
+\r
+#define SDHCI_PLUG_STATE(h) (mmc_readl(h, MSHC_PRESENT_STATE) & MSHC_CARD_PRESENT)\r
+\r
+// sdio slave reg\r
+#define HISDIO_REG_FUNC1_FIFO 0x00 /* Read Write FIFO */\r
+#define HISDIO_REG_FUNC1_INT_STATUS 0x08 /* interrupt mask and clear reg */\r
+#define HISDIO_REG_FUNC1_INT_ENABLE 0x09 /* interrupt */\r
+#define HISDIO_REG_FUNC1_XFER_COUNT 0x0c /* notify number of bytes to be read */\r
+#define HISDIO_REG_FUNC1_WRITE_MSG 0x24 /* write msg to device */\r
+#define HISDIO_REG_FUNC1_MSG_FROM_DEV 0x28 /* notify Host that device has got the msg */\r
+#define HISDIO_REG_FUNC1_MSG_HIGH_FROM_DEV 0x2b /* Host receive the msg ack */\r
+/* sdio extend function, add 64B register for hcc */\r
+#define HISDIO_FUNC1_EXTEND_REG_BASE 0x3c\r
+#define HISDIO_FUNC1_EXTEND_REG_LEN 64\r
+#define HISDIO_FUNC1_INT_DREADY (1 << 0) /* data ready interrupt */\r
+#define HISDIO_FUNC1_INT_RERROR (1 << 1) /* data read error interrupt */\r
+#define HISDIO_FUNC1_INT_MFARM (1 << 2) /* ARM Msg interrupt */\r
+#define HISDIO_FUNC1_INT_ACK (1 << 3) /* ACK interrupt */\r
+#define HISDIO_FUNC1_INT_MASK (HISDIO_FUNC1_INT_DREADY | HISDIO_FUNC1_INT_RERROR | HISDIO_FUNC1_INT_MFARM)\r
+#define HAL_SDIOM_CLK_MODE_MAX_NUM 4\r
+\r
+#define BRANDY_INTERRUPT_SDIO 76\r
+#define BRANDY_INTERRUPT_EMMC 78\r
+\r
+#define S_HGPIO 0x52065800\r
+#define S_HGPIO_PAD 0x5700d000\r
+\r
+#define S_HGPIO0_OFFSET 0\r
+#define S_HGPIO0_PAD_OFFSET 0x200\r
+\r
+#define S_HGPIO6_OFFSET 0x18\r
+#define S_HGPIO6_PAD_OFFSET 0x218\r
+#define FUNC_SDIO 0x01\r
+#define FUNC_EMMC 0x02\r
+#ifdef PRE_FPGA\r
+#define IE_PINMUX_EN 0x02\r
+#else\r
+#define IE_PINMUX_EN 0xC7\r
+#endif\r
+\r
+#define COM_CTL_RB_BASE 0x55000000\r
+#define SDIOM_CR_REG (COM_CTL_RB_BASE + 0x0628)\r
+#define SDIOM_CR_CTRL_CH_ENABLE BIT(0)\r
+#define SDIOM_CR_CTRL_DIV_EN BIT(4)\r
+\r
+#define SDIOM_CR_CTRL_DIV_OFFSET 5\r
+#define SDIOM_CR_CTRL_MIN_DIV 2\r
+\r
+#define SDIOM_CR_CTRL_CLK_RESOURCE_RC 0\r
+#define SDIOM_CR_CTRL_CLK_RESOURCE_XO 1\r
+#define SDIOM_CR_CTRL_CLK_RESOURCE_XO_DLL2 2\r
+#define SDIOM_CR_CTRL_CLK_RESOURCE_PLL 3\r
+\r
+#define SDIOM_CR_CTRL_CLK_RESOURCE_PLL_EN (SDIOM_CR_CTRL_CH_ENABLE | (SDIOM_CR_CTRL_CLK_RESOURCE_PLL << 1))\r
+#define SDIOM_CR_CTRL_XO_32M_CLK_EN (SDIOM_CR_CTRL_CH_ENABLE | (SDIOM_CR_CTRL_CLK_RESOURCE_XO << 1))\r
+\r
+typedef enum {\r
+ SDIO_EMMC_ID,\r
+ SDIO_HOST_ID,\r
+ MAX_MMC_NUM\r
+} hal_mmc_bus_num_t;\r
+\r
+typedef struct {\r
+ int id;\r
+ uint32_t clock;\r
+ uint32_t amend_div_reg; // Registers that need to be adjusted\r
+ uint32_t amend_div_num; // The frequency division coefficient of one side needs to be adjusted.\r
+} hal_sdiom_clk_mode_t;\r
+\r
+enum dma_data_direction {\r
+ DMA_BIDIRECTIONAL = 0,\r
+ DMA_TO_DEVICE = 1,\r
+ DMA_FROM_DEVICE = 2,\r
+ DMA_NONE = 3,\r
+};\r
+\r
+enum hi_mmc_power_mode {\r
+ POWER_OFF = 0,\r
+ POWER_UP,\r
+ POWER_ON,\r
+};\r
+\r
+enum mmc_chip_select {\r
+ CS_DONTCARE = 0,\r
+ CS_HIGH,\r
+ CS_LOW,\r
+};\r
+\r
+enum hi_mmc_bus_width {\r
+ BUS_WIDTH_1 = 0,\r
+ BUS_WIDTH_4 = 2,\r
+ BUS_WIDTH_8 = 3,\r
+};\r
+\r
+enum hi_mmc_bus_mode {\r
+ MMC_BUSMODE_OPENDRAIN,\r
+ MMC_BUSMODE_PUSHPULL,\r
+};\r
+\r
+enum mmc_bus_timing {\r
+ TIMING_MMC_DS = 0,\r
+ TIMING_MMC_HS,\r
+ TIMING_SD_HS,\r
+ TIMING_UHS_SDR12,\r
+ TIMING_UHS_SDR25,\r
+ TIMING_UHS_SDR50,\r
+ TIMING_UHS_SDR104,\r
+ TIMING_UHS_DDR50,\r
+ TIMING_UHS_DDR52,\r
+ TIMING_MMC_HS200, /* for emmc */\r
+ TIMING_MMC_HS400, /* for emmc */\r
+};\r
+\r
+struct hi_mmc_drv {\r
+ struct rt_mmcsd_host *host;\r
+ struct rt_mmcsd_req *req;\r
+ struct rt_mmcsd_cmd *cmd;\r
+ struct rt_mmcsd_data *data;\r
+\r
+ uint8_t id;\r
+ uint32_t hw_base_addr;\r
+ uint32_t msc_clock;\r
+ uint32_t irq_num;\r
+ uint32_t irq_enable;\r
+ uint32_t version;\r
+ uint32_t freq_min;\r
+ uint32_t freq_max;\r
+ uint32_t freq_default;\r
+ uint32_t preset_enabled;\r
+ uint32_t timing;\r
+ uint32_t flags;\r
+#define MMC_FLAG_USE_SDMA (1 << 0)\r
+#define MMC_FLAG_USE_ADMA (1 << 1)\r
+#define MMC_FLAG_REQ_USE_DMA (1 << 2)\r
+#define MMC_FLAG_DEVICE_DEAD (1 << 3)\r
+#define MMC_FLAG_SDR50_NEEDS_TUNING (1 << 4) //\r
+#define MMC_FLAG_NEEDS_RETUNING (1 << 5) //\r
+#define MMC_FLAG_AUTO_CMD12 (1 << 6) //\r
+#define MMC_FLAG_AUTO_CMD23 (1 << 7)\r
+#define MMC_FLAG_PV_ENABLED (1 << 8) //\r
+#define MMC_FLAG_SDIO_IRQ_ENABLED (1 << 9)\r
+#define MMC_FLAG_SDR104_NEEDS_TUNING (1 << 10) //\r
+#define MMC_FLAG_USING_RETUNING_TIMER (1 << 11)\r
+#define MMC_FLAG_USE_ADMA_64BIT (1 << 12)\r
+#define MMC_FLAG_NON_INT_HANDLE (1 << 13)\r
+#define MMC_FLAG_NON_OS_HANDLE (1 << 14)\r
+#define MMC_FLAG_OS_EVENT_INIT (1 << 15)\r
+#define MMC_FLAG_NO_DETECT_INSERT (1 << 16)\r
+ uint32_t type;\r
+#define MMC_TYPE_MMC (1 << 0)\r
+#define MMC_TYPE_SDIO (1 << 1)\r
+#define MMC_TYPE_SD (1 << 2)\r
+\r
+ uint32_t pwr;\r
+ char *adma_desc;\r
+ uint32_t adma_desc_sz;\r
+ uint32_t adma_desc_line_sz;\r
+ uint32_t align_buf_sz;\r
+ uint32_t align_bytes;\r
+ uint32_t adma_max_desc;\r
+ unsigned long adma_addr;\r
+ unsigned long align_addr;\r
+ uint16_t vdd;\r
+// MMCSD_BUSMODE_OPENDRAIN 1;MMCSD_BUSMODE_PUSHPULL 2\r
+ uint8_t bus_mode; /* command output mode */\r
+// MMCSD_CS_IGNORE 0;MMCSD_CS_HIGH 1;MMCSD_CS_LOW 2\r
+ uint8_t chip_select; /* SPI chip select */\r
+// MMC_POWER_OFF 0;MMC_POWER_UP 1;MMC_POWER_ON 2\r
+ uint8_t power_mode; /* power supply mode */\r
+// MMCSD_BUS_WIDTH_1 0;MMCSD_BUS_WIDTH_4 2;MMCSD_BUS_WIDTH_8 3\r
+ uint8_t bus_width; /* data bus width */\r
+ unsigned int cmdat;\r
+ uint32_t clock;\r
+ uint32_t phy_driver_cap; /* phy mode driver capability */\r
+ uint8_t *_dma_buffer;\r
+ int sdio_clk; /* clock for sdio */\r
+ uint32_t current_status;\r
+\r
+ struct scatterlist *dma_sg;\r
+ unsigned int dma_sg_num;\r
+ unsigned int *dma_vaddr;\r
+\r
+ // mmc_event hi_mmc_event;\r
+#define HISI_WAIT_REQUEST_DONE (1 << 0)\r
+#define HISI_WAIT_ACCIDENT (1 << 1)\r
+ uint32_t err_int_count;\r
+};\r
+\r
+typedef void (* HWI_PROC_FUNC)(void);\r
+\r
+static inline void mmc_writel(struct hi_mmc_drv *host, unsigned int val, uint32_t regs)\r
+{\r
+ writel(host->hw_base_addr + regs, val);\r
+}\r
+\r
+static inline void mmc_writew(struct hi_mmc_drv *host, unsigned short val, uint32_t regs)\r
+{\r
+ writew(host->hw_base_addr + regs, val);\r
+}\r
+\r
+static inline void mmc_writeb(struct hi_mmc_drv *host, unsigned char val, uint32_t regs)\r
+{\r
+ writeb(host->hw_base_addr + regs, val);\r
+}\r
+\r
+static inline void mmc_reg32_setbits(struct hi_mmc_drv *host, uint32_t regs, uint32_t p, uint32_t b, uint32_t val)\r
+{\r
+ reg32_setbits(host->hw_base_addr + regs, p, b, val);\r
+}\r
+\r
+static inline unsigned int mmc_reg32_getbits(struct hi_mmc_drv *host, uint32_t regs, uint32_t p, uint32_t b)\r
+{\r
+ return reg32_getbits(host->hw_base_addr + regs, p, b);\r
+}\r
+\r
+static inline unsigned int mmc_readl(struct hi_mmc_drv *host, uint32_t regs)\r
+{\r
+ return readl(host->hw_base_addr + regs);\r
+}\r
+\r
+static inline unsigned short mmc_readw(struct hi_mmc_drv *host, uint32_t regs)\r
+{\r
+ return readw(host->hw_base_addr + regs);\r
+}\r
+\r
+static inline unsigned char mmc_readb(struct hi_mmc_drv *host, uint32_t regs)\r
+{\r
+ return readb(host->hw_base_addr + regs);\r
+}\r
+\r
+void hal_mmc_set_emmc_ctrl(struct hi_mmc_drv *mmc_drv, uint32_t offset, uint32_t pos, uint32_t bits, uint32_t val);\r
+\r
+uint32_t hal_mmc_get_cap1(struct hi_mmc_drv *mmc_drv);\r
+\r
+uint32_t hal_mmc_get_cap2(struct hi_mmc_drv *mmc_drv);\r
+\r
+void hal_mmc_reset(struct hi_mmc_drv *mmc_drv);\r
+\r
+void hi_mmc_dumpregs(struct hi_mmc_drv *host);\r
+\r
+void hal_mmc_set_power(struct hi_mmc_drv *mmc_drv, uint8_t power_mode);\r
+\r
+void hal_mmc_set_bus_mode(struct hi_mmc_drv *mmc_drv, uint8_t bus_mode);\r
+\r
+void hal_mmc_set_bus_width(struct hi_mmc_drv *mmc_drv, uint8_t bus_width);\r
+\r
+void hal_mmc_set_chip_set(struct hi_mmc_drv *mmc_drv, uint8_t chip_sel);\r
+\r
+void hal_mmc_set_voltage(struct hi_mmc_drv *mmc_drv, uint16_t vdd);\r
+\r
+void hi_mmc_enable_plug_irq(struct hi_mmc_drv* mmc_drv, uint32_t irq);\r
+\r
+void hi_mmc_set_sample_phase(struct hi_mmc_drv *mmc_drv, uint32_t phase);\r
+\r
+void hal_mmc_set_clock(struct hi_mmc_drv *mmc_drv, unsigned int clocknum);\r
+\r
+void hal_mmc_enable_plug_irq(struct hi_mmc_drv* mmc_drv, uint32_t irq);\r
+\r
+void hal_mmc_set_sample_phase(struct hi_mmc_drv *mmc_drv, uint32_t phase);\r
+\r
+void hal_mmc_deassert_status(struct hi_mmc_drv *mmc_drv);\r
+\r
+void hal_mmc_clr_reg(struct hi_mmc_drv *mmc_drv, unsigned int mask);\r
+\r
+void hal_mmc_set_timing(struct hi_mmc_drv *mmc_drv, int timing);\r
+\r
+void hal_mmc_set_preset_val(struct hi_mmc_drv *mmc_drv, bool en);\r
+\r
+void hal_mmc_adma_config(struct hi_mmc_drv *mmc_drv);\r
+\r
+void hal_mmc_set_card_clk(struct hi_mmc_drv *mmc_drv, bool en);\r
+\r
+unsigned int hi_mmc_set_clock_in_fgpa(struct hi_mmc_drv *mmc_drv, unsigned int cfg_clock);\r
+\r
+void hal_mmc_set_sdiom_clk_mode(struct hi_mmc_drv** drv, int mode);\r
+\r
+void hal_mmc_set_clk_en(hal_mmc_bus_num_t mmc_bus, bool en);\r
+\r
+#if (SUPPORT_HI_EMMC_PHY == YES)\r
+void hi_mmc_set_phy_driver_capability(struct hi_mmc_drv *mmc_drv, uint32_t val);\r
+#endif\r
+\r
+bool hi_mmc_set_clock_switch(uint32_t fisrt_div, uint32_t second_div, uint32_t sd_bus_div);\r
+\r
+#endif\r
--- /dev/null
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
+ * Description: APP PMU DRIVER HEADER FILE
+ * Author:
+ * Create: 2020-01-13
+ */
+#ifndef HAL_PMU_PERIPHERAL_APPLICATION_H
+#define HAL_PMU_PERIPHERAL_APPLICATION_H
+#include "hal_pmu_peripheral.h"
+#include "chip_io.h"
+/** @defgroup connectivity_drivers_hal_pmu_peripheral_app PMU Peripheral
+ * @ingroup connectivity_drivers_hal
+ * @{
+ */
+typedef struct {
+ uint16_t m_top0_l;
+ uint16_t m_top0_h;
+ uint16_t m_top1_l;
+ uint16_t m_top1_h;
+ uint16_t m_top2_l;
+ uint16_t m_top2_h;
+ uint16_t m_top3_l;
+ uint16_t m_top3_h;
+ uint16_t m_top4_l;
+ uint16_t m_top4_h;
+ uint16_t m_top5_l;
+ uint16_t m_top5_h;
+ uint16_t m_clocken0;
+ uint16_t m_clocken1;
+ uint16_t m_clocken2;
+ uint16_t m_glb_clocken;
+ uint16_t m_perp_ls_cr;
+} hal_pmu_m_clocks_state_t;
+
+/**
+ * @brief Get mcpu peripheral work status.
+ * @param perip The peripheral to config
+ * @return HAL_PMU_PERIP_STATUS The peripheral work status.
+ */
+hal_pmu_perip_status_type_t hal_pmu_mcpu_perip_get_status(hal_pmu_mcpu_perips_type_t perip);
+
+/**
+ * @brief Reset mcpu peripheral.
+ * @param perip The peripheral to config
+ * @param request The request to operate pheripheral
+ */
+void hal_pmu_mcpu_perip_reset(hal_pmu_mcpu_perips_type_t perip, hal_pmu_perip_request_type_t request);
+
+/**
+ * @brief Config mcpu peripheral.
+ * @param perip The peripheral to config
+ * @param request The request to operate pheripheral
+ */
+void hal_pmu_mcpu_perip_config(hal_pmu_mcpu_perips_type_t perip, hal_pmu_perip_request_type_t request);
+
+/**
+ * @brief Get mcpu alwasy on peripheral work status.
+ * @param perip The peripheral to config
+ * @return HAL_PMU_PERIP_STATUS The peripheral work status.
+ */
+hal_pmu_perip_status_type_t hal_pmu_maon_perip_get_status(hal_pmu_maon_perips_type_t perip);
+
+/**
+ * @brief Config mcpu alwasy on peripheral.
+ * @param perip The peripheral to config
+ * @param request The request to operate pheripheral
+ */
+void hal_pmu_maon_perip_config(hal_pmu_maon_perips_type_t perip, hal_pmu_perip_request_type_t request);
+
+/**
+ * @brief Get mem sub peripheral work status.
+ * @param perip The peripheral to config
+ * @return HAL_PMU_PERIP_STATUS The peripheral work status.
+ */
+hal_pmu_perip_status_type_t hal_pmu_mem_perip_get_status(hal_pmu_mem_perips_type_t perip);
+
+/**
+ * @brief Config mem sub peripheral.
+ * @param perip The peripheral to config
+ * @param request The request to operate pheripheral
+ */
+void hal_pmu_mem_perip_config(hal_pmu_mem_perips_type_t perip, hal_pmu_perip_request_type_t request);
+
+/**
+ * @brief Get dsp cpu always on gpio peripheral work status.
+ * @return HAL_PMU_PERIP_STATUS The peripheral work status.
+ */
+hal_pmu_perip_status_type_t hal_pmu_daon_perip_get_status(void);
+
+/**
+ * @brief Config dsp cpu alwyas on gpio peripheral.
+ * @param request The request to operate pheripheral
+ */
+void hal_pmu_daon_perip_config(hal_pmu_perip_request_type_t request);
+
+/**
+ * @brief Config m gpio clock.
+ * @param on open/close
+ */
+void hal_pmu_mgpio_low_power_config(switch_type_t on);
+
+/**
+ * @brief Get peripheral clcok state in abnormal.
+ */
+void hal_pmu_get_perip_state(void);
+
+/**
+ * @}
+ */
+#endif
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2018-2020. All rights reserved.\r
+ * Description: LITEOS ADAPTER HEADER FILE\r
+ * Author:\r
+ * Create: 2020-04\r
+ */\r
+#ifndef LITEOS_ADAPTER_H\r
+#define LITEOS_ADAPTER_H\r
+\r
+#include "irmalloc.h"\r
+#include "securec.h"\r
+#include "chip_io.h"\r
+#include "rt_sys_header.h"\r
+#include "debug_print.h"\r
+\r
+#ifdef TEST_SUIT\r
+#define SDIO_WAIT_RESPONSE_TIME 1000\r
+#else\r
+#define SDIO_WAIT_RESPONSE_TIME 100\r
+#endif\r
+#define RT_NULL NULL\r
+#define rt_tick_get() (uint32_t)uapi_systick_get_count()\r
+#define mmcsd_delay_ms(ms) uapi_tcxo_delay_ms(ms)\r
+#define RT_TICK_PER_SECOND 1000\r
+#define MMC_RT_LOG_ERR\r
+\r
+#ifdef MMC_OPEN_ALL_LOG\r
+#define MMC_RT_LOG_ERR\r
+#define MMC_RT_LOG_INFO\r
+#define MMC_RT_LOG_WARNING\r
+#define MMC_RT_LOG_DEBUG\r
+#endif\r
+#ifdef MMC_RT_LOG_ERR\r
+#define LOG_E(fmt, arg...) do { \\r
+ PRINT("rt-mmc:%s:%d: ", __FUNCTION__, __LINE__); \\r
+ PRINT(fmt, ##arg); \\r
+ PRINT("\r\n"); \\r
+} while (0)\r
+#else\r
+#define LOG_E(fmt, arg...) do { } while (0)\r
+#endif\r
+#ifdef MMC_RT_LOG_INFO\r
+#define LOG_I(fmt, arg...) do { \\r
+ PRINT("rt-mmc:%s:%d: ", __FUNCTION__, __LINE__); \\r
+ PRINT(fmt, ##arg); \\r
+ PRINT("\r\n"); \\r
+} while (0)\r
+#else\r
+#define LOG_I(fmt, arg...) do { } while (0)\r
+#endif\r
+#ifdef MMC_RT_LOG_WARNING\r
+#define LOG_W(fmt, arg...) do { \\r
+ PRINT("rt-mmc:%s:%d: ", __FUNCTION__, __LINE__); \\r
+ PRINT(fmt, ##arg); \\r
+ PRINT("\r\n"); \\r
+} while (0)\r
+#else\r
+#define LOG_W(fmt, arg...) do { } while (0)\r
+#endif\r
+#ifdef MMC_RT_LOG_DEBUG\r
+#define LOG_D(fmt, arg...) do { \\r
+ PRINT("rt-mmc:%s:%d: ", __FUNCTION__, __LINE__); \\r
+ PRINT(fmt, ##arg); \\r
+ PRINT("\r\n"); \\r
+} while (0)\r
+#else\r
+#define LOG_D(fmt, arg...) do { } while (0)\r
+#endif\r
+\r
+#define memalign(boundary, size) irmalloc(size)\r
+#define mmc_assert(cond) do { \\r
+ if (!(cond)) \\r
+ panic(1, __LINE__); \\r
+ } while (0)\r
+#define RT_ASSERT(cond) if (!(cond)) \\r
+ panic(1, __LINE__)\r
+#define rt_malloc(size) irmalloc(size)\r
+#define rt_calloc(n, size) irzalloc((n) * (size))\r
+#define rt_set_errno(error) panic(1, __LINE__)\r
+#define rt_free(rmem) irfree(rmem)\r
+// Encapsulation liteos function\r
+typedef uint32_t mmc_sem;\r
+#define MMC_SEM_WAIT_FOREVER 0xFFFFFFFF\r
+#define mmc_sem_create(sem_id) LOS_SemCreate(1, sem_id)\r
+#define mmc_sem_post(sem_id) LOS_SemPost(sem_id)\r
+#define mmc_sem_pend(sem_id, timeout) LOS_SemPend(sem_id, timeout)\r
+#define mmc_sem_delete(sem_id) LOS_SemDelete(sem_id)\r
+/* define mutex lock */\r
+typedef uint32_t mmc_mutex;\r
+#define MMC_MUTEX_WAIT_FOREVER 0xFFFFFFFF\r
+#define mmc_mutex_init(mutex) LOS_MuxCreate(mutex)\r
+#define mmc_mutex_lock(mutex, timeout) LOS_MuxPend(mutex, timeout)\r
+#define mmc_mutex_unlock(mutex) LOS_MuxPost(mutex)\r
+#define mmc_mutex_delete(mutex) LOS_MuxDelete(mutex)\r
+\r
+/* define create thread */\r
+typedef unsigned int mmc_thread;\r
+#define mmc_thread_delete(id) { LOS_TaskDelete(id); }\r
+#endif
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2015-06-15 hichard first version
+ */
+
+#include "mmcsd_core.h"
+#include "drv_mmc_adapter.h"
+#include "mshc_reg.h"
+#include "mmc.h"
+
+#define DBG_TAG "SDIO"
+#ifdef RT_SDIO_DEBUG
+#define DBG_LVL DBG_LOG
+#else
+#define DBG_LVL DBG_INFO
+#endif /* RT_SDIO_DEBUG */
+#define EXT_CSD_LEN 512
+
+static const uint32_t tran_unit[] = {
+ 10000, 100000, 1000000, 10000000,
+ 0, 0, 0, 0
+};
+
+static const uint8_t tran_value[] = {
+ 0, 10, 12, 13, 15, 20, 25, 30,
+ 35, 40, 45, 50, 55, 60, 70, 80,
+};
+
+static const uint32_t tacc_uint[] = {
+ 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000,
+};
+
+static const uint8_t tacc_value[] = {
+ 0, 10, 12, 13, 15, 20, 25, 30,
+ 35, 40, 45, 50, 55, 60, 70, 80,
+};
+
+rt_inline uint32_t GET_BITS(uint32_t *resp, uint32_t start, uint32_t size)
+{
+ const int32_t __size = size;
+ const uint32_t __mask = (__size < 32 ? 1 << __size : 0) - 1; // 32
+ const int32_t __off = 3 - ((start) / 32); // 32 3
+ const int32_t __shft = (start) & 31; // 31
+ uint32_t __res;
+
+ __res = resp[__off] >> __shft;
+ if (__size + __shft > 32) { // 32
+ __res |= resp[__off-1] << ((32 - __shft) % 32); // 32
+ }
+
+ return __res & __mask;
+}
+
+/*
+ * Given a 128-bit response, decode to our card CSD structure.
+ */
+static int32_t mmcsd_parse_csd(struct rt_mmcsd_card *card)
+{
+ uint32_t a, b;
+ struct rt_mmcsd_csd *csd = &card->csd;
+ uint32_t *resp = card->resp_csd;
+
+ /*
+ * We only understand CSD structure v1.1 and v1.2.
+ * v1.2 has extra information in bits 15, 11 and 10.
+ * We also support eMMC v4.4 & v4.41.
+ */
+ csd->csd_structure = GET_BITS(resp, 126, 2); // 126 2
+ if (csd->csd_structure == 0) {
+ LOG_E("unrecognised CSD structure version %d!", csd->csd_structure);
+ return -RT_ERROR;
+ }
+ csd->spec_vers = GET_BITS(resp, 122, 4); // 122 4
+ csd->taac = GET_BITS(resp, 112, 8); // 112 8
+ csd->nsac = GET_BITS(resp, 104, 8); // 104 8
+ csd->tran_speed = GET_BITS(resp, 96, 8); // 96 8
+ csd->card_cmd_class = GET_BITS(resp, 84, 12); // 84 12
+ csd->rd_blk_len = GET_BITS(resp, 80, 4); // 80 4
+ csd->rd_blk_part = GET_BITS(resp, 79, 1); // 79 1
+ csd->wr_blk_misalign = GET_BITS(resp, 78, 1); // 78 1
+ csd->rd_blk_misalign = GET_BITS(resp, 77, 1); // 77 1
+ csd->dsr_imp = GET_BITS(resp, 76, 1); // 76 1
+ csd->c_size = GET_BITS(resp, 62, 12); // 62 12
+ csd->c_size_mult = GET_BITS(resp, 47, 3); // 47 3
+ csd->r2w_factor = GET_BITS(resp, 26, 3); // 26 3
+ csd->wr_blk_len = GET_BITS(resp, 22, 4); // 22 4
+ csd->wr_blk_partial = GET_BITS(resp, 21, 1); // 21 1
+ csd->csd_crc = GET_BITS(resp, 1, 7); // 1 7
+
+ card->card_blksize = 1 << csd->rd_blk_len;
+ card->tacc_clks = csd->nsac * 100; // 100
+ card->tacc_ns = (tacc_uint[csd->taac&0x07] * tacc_value[(csd->taac&0x78)>>3] + 9) / 10; // 3 9 10
+ card->max_data_rate = tran_unit[csd->tran_speed&0x07] * tran_value[(csd->tran_speed&0x78)>>3]; // 3
+ if (csd->wr_blk_len >= 9) { // 9
+ a = GET_BITS(resp, 42, 5); // 42 5
+ b = GET_BITS(resp, 37, 5); // 37 5
+ card->erase_size = (a + 1) * (b + 1);
+ card->erase_size <<= csd->wr_blk_len - 9; // 9
+ }
+ return 0;
+}
+
+/*
+ * Read extended CSD.
+ */
+static int mmc_get_ext_csd(struct rt_mmcsd_card *card, uint8_t **new_ext_csd)
+{
+ void *ext_csd;
+ struct rt_mmcsd_req req;
+ struct rt_mmcsd_cmd cmd;
+ struct rt_mmcsd_data data;
+
+ *new_ext_csd = RT_NULL;
+
+ if (GET_BITS(card->resp_cid, 122, 4) < 4) { // 122 4
+ return 0;
+ }
+
+ /*
+ * As the ext_csd is so large and mostly unused, we don't store the
+ * raw block in mmc_card.
+ */
+ ext_csd = irmalloc(EXT_CSD_LEN);
+ if (!ext_csd) {
+ LOG_E("alloc memory failed when get ext csd!");
+ return -RT_ENOMEM;
+ }
+ (void)memset_s(ext_csd, EXT_CSD_LEN, 0, EXT_CSD_LEN);
+ (void)memset_s(&req, sizeof(struct rt_mmcsd_req), 0, sizeof(struct rt_mmcsd_req));
+ (void)memset_s(&cmd, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));
+ (void)memset_s(&data, sizeof(struct rt_mmcsd_data), 0, sizeof(struct rt_mmcsd_data));
+
+ req.cmd = &cmd;
+ req.data = &data;
+
+ cmd.cmd_code = SEND_EXT_CSD;
+ cmd.arg = 0;
+
+ /* NOTE HACK: the RESP_SPI_R1 is always correct here, but we
+ * rely on callers to never use this with "native" calls for reading
+ * CSD or CID. Native versions of those commands use the R2 type,
+ * not R1 plus a data block.
+ */
+ cmd.flags = RESP_SPI_R1 | RESP_R1 | CMD_ADTC;
+
+ data.blksize = 512; // 512
+ data.blks = 1;
+ data.flags = DATA_DIR_READ;
+ data.buf = ext_csd;
+
+ /*
+ * Some cards require longer data read timeout than indicated in CSD.
+ * Address this by setting the read timeout to a "reasonably high"
+ * value. For the cards tested, 300ms has proven enough. If necessary,
+ * this value can be increased if other problematic cards require this.
+ */
+ data.timeout_ns = 300000000; // 300000000
+ data.timeout_clks = 0;
+
+ mmcsd_send_request(card->host, &req);
+ if (cmd.err) {
+ return cmd.err;
+ }
+
+ if (data.err) {
+ return data.err;
+ }
+
+ *new_ext_csd = ext_csd;
+ (void)memcpy_s((void *)card->ext_csd_val, EXT_CSD_LEN, ext_csd, EXT_CSD_LEN);
+ return 0;
+}
+
+/*
+ * Decode extended CSD.
+ */
+static int mmc_parse_ext_csd(struct rt_mmcsd_card *card, uint8_t *ext_csd)
+{
+ rt_uint64_t card_capacity = 0;
+ int retval = 0;
+ if (card == RT_NULL || ext_csd == RT_NULL) {
+ LOG_E("emmc parse ext csd fail, invaild args");
+ return -1;
+ }
+ struct rt_mmcsd_ext_csd *ext_csd_reg = RT_NULL;
+
+ ext_csd_reg = &(card->ext_csd);
+
+ ext_csd_reg->raw_ext_csd_structure = ext_csd[EXT_CSD_STRUCTURE];
+ if (card->csd.csd_structure == 3) { // 3
+ if (ext_csd_reg->raw_ext_csd_structure > 2) { // 2
+ LOG_E("unrecognised EXT_CSD structure ersion %d", ext_csd_reg->raw_ext_csd_structure);
+ retval = -EINVAL;
+ return retval;
+ }
+ }
+ ext_csd_reg->rev = ext_csd[EXT_CSD_REV];
+ ext_csd_reg->raw_sectors[0] = ext_csd[EXT_CSD_SEC_CNT + 0]; // 0
+ ext_csd_reg->raw_sectors[1] = ext_csd[EXT_CSD_SEC_CNT + 1]; // 1
+ ext_csd_reg->raw_sectors[2] = ext_csd[EXT_CSD_SEC_CNT + 2]; // 2
+ ext_csd_reg->raw_sectors[3] = ext_csd[EXT_CSD_SEC_CNT + 3]; // 3
+ if (ext_csd_reg->rev >= 2) { // 2
+ ext_csd_reg->sectors = (ext_csd[EXT_CSD_SEC_CNT + 0] << 0) |
+ (ext_csd[EXT_CSD_SEC_CNT + 1] << 8) | /* 8 */
+ (ext_csd[EXT_CSD_SEC_CNT + 2] << 16) | /* 2 16 */
+ (ext_csd[EXT_CSD_SEC_CNT + 3] << 24); /* 3 24 */
+ }
+
+ ext_csd_reg->strobe_support = ext_csd[EXT_CSD_STROBE_SUPPORT];
+ ext_csd_reg->raw_card_type = ext_csd[EXT_CSD_CARD_TYPE];
+ switch (ext_csd[EXT_CSD_CARD_TYPE] & EXT_CSD_CARD_TYPE_MASK) {
+ case EXT_CSD_CARD_TYPE_ALL_1_8V:
+ case EXT_CSD_CARD_TYPE_1_8V_HS200:
+ ext_csd_reg->hs_max_dtr = EXT_CSD_CARD_MAX_RATE_200;
+ ext_csd_reg->card_type = EXT_CSD_CARD_TYPE_HS200_1_8V;
+ break;
+ case EXT_CSD_CARD_TYPE_DDR_52 | EXT_CSD_CARD_TYPE_HS_52 | EXT_CSD_CARD_TYPE_HS_26:
+ ext_csd_reg->hs_max_dtr = EXT_CSD_CARD_MAX_RATE_52;
+ ext_csd_reg->card_type = EXT_CSD_CARD_TYPE_DDR_52;
+ break;
+ case EXT_CSD_CARD_TYPE_DDR_1_8V | EXT_CSD_CARD_TYPE_HS_52 | EXT_CSD_CARD_TYPE_HS_26:
+ ext_csd_reg->hs_max_dtr = EXT_CSD_CARD_MAX_RATE_52;
+ ext_csd_reg->card_type = EXT_CSD_CARD_TYPE_DDR_1_8V;
+ break;
+ case EXT_CSD_CARD_TYPE_HS_52 | EXT_CSD_CARD_TYPE_HS_26:
+ ext_csd_reg->hs_max_dtr = EXT_CSD_CARD_MAX_RATE_52;
+ break;
+ default:
+ LOG_E("card type:%#x, need to parse the type", ext_csd[EXT_CSD_CARD_TYPE]);
+ break;
+ }
+
+ ext_csd_reg->raw_s_a_timeout = ext_csd[EXT_CSD_S_A_TIMEOUT];
+ ext_csd_reg->raw_erase_timeout_mult = ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT];
+ ext_csd_reg->raw_hc_erase_grp_size = ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
+ if (ext_csd_reg->rev >= 3) { // 3
+ uint8_t shift = ext_csd[EXT_CSD_S_A_TIMEOUT];
+ ext_csd_reg->part_config = ext_csd[EXT_CSD_PART_CONFIG];
+ ext_csd_reg->part_time_ms = 10 * ext_csd[EXT_CSD_PART_SWITCH_TIME]; // 10
+ if (shift > 0 && shift <= 0x17) {
+ ext_csd_reg->sa_timeout_ns = 1 << ext_csd[EXT_CSD_S_A_TIMEOUT];
+ }
+
+ ext_csd_reg->erase_group_def = ext_csd[EXT_CSD_ERASE_GROUP_DEF];
+ ext_csd_reg->hc_erase_timeout = 300 * ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT]; // 300
+ ext_csd_reg->hc_erase_size = ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] << 10; // 10
+ ext_csd_reg->rel_sectors = ext_csd[EXT_CSD_REL_WR_SEC_C];
+ ext_csd_reg->boot_size = ext_csd[EXT_CSD_BOOT_MULT] << 17; // 17
+ }
+
+ ext_csd_reg->raw_hc_erase_gap_size = ext_csd[EXT_CSD_PARTITION_ATTRIBUTE];
+ ext_csd_reg->raw_sec_trim_mult = ext_csd[EXT_CSD_SEC_TRIM_MULT];
+ ext_csd_reg->raw_sec_erase_mult = ext_csd[EXT_CSD_SEC_ERASE_MULT];
+ ext_csd_reg->raw_sec_feature_support = ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT];
+ ext_csd_reg->raw_trim_mult = ext_csd[EXT_CSD_TRIM_MULT];
+ if (ext_csd_reg->rev >= 4) { // 4
+ if ((ext_csd[EXT_CSD_PARTITION_SUPPORT] & 0x2) && (ext_csd[EXT_CSD_PARTITION_ATTRIBUTE] & 0x1)) {
+ uint8_t hc_erase_grp_sz = ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE];
+ uint8_t hc_wp_grp_sz = ext_csd[EXT_CSD_HC_WP_GRP_SIZE];
+ ext_csd_reg->enhanced_area_en = 1;
+
+ // 139 24 138 16 137 8 136
+ ext_csd_reg->enhanced_area_offset = ((rt_uint64_t)ext_csd[139] << 24) +
+ ((rt_uint64_t)ext_csd[138] << 16) + ((rt_uint64_t)ext_csd[137] << 8) + (rt_uint64_t)ext_csd[136];
+ ext_csd_reg->enhanced_area_offset <<= 9; // device is block device 9
+ // 142 16 141 8 140
+ ext_csd_reg->enhanced_area_size = (ext_csd[142] << 16) + (ext_csd[141] << 8) + ext_csd[140];
+ ext_csd_reg->enhanced_area_size *= (uint32_t)(hc_erase_grp_sz * hc_wp_grp_sz);
+ ext_csd_reg->enhanced_area_size <<= 9; // 9
+ } else {
+ ext_csd_reg->enhanced_area_offset = (uint64_t)(-EINVAL);/*lint !e570*/
+ ext_csd_reg->enhanced_area_size = (uint32_t)(-EINVAL);/*lint !e570*/
+ }
+ ext_csd_reg->sec_trim_mult = ext_csd[EXT_CSD_SEC_TRIM_MULT];
+ ext_csd_reg->sec_erase_mult = ext_csd[EXT_CSD_SEC_ERASE_MULT];
+ ext_csd_reg->sec_feature_support = ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT];
+ ext_csd_reg->trim_timeout = 300 * ext_csd[EXT_CSD_TRIM_MULT]; // 300
+ }
+
+ if (ext_csd_reg->rev >= 5) { // 5
+ /* whether the eMMC card supports HPI */
+ if (ext_csd[EXT_CSD_HPI_FEATURES] & 0x1) {
+ ext_csd_reg->hpi = 1;
+ if (ext_csd[EXT_CSD_HPI_FEATURES] & 0x2) {
+ ext_csd_reg->hpi_cmd = STOP_TRANSMISSION;
+ } else {
+ ext_csd_reg->hpi_cmd = SEND_STATUS;
+ }
+ /*
+ ** Indicate the maximum timeout to close
+ ** a command interrupted by HPI
+ **/
+ ext_csd_reg->out_of_int_time = ext_csd[EXT_CSD_OUT_OF_INTERRUPT_TIME] * 10; // 10
+ }
+ ext_csd_reg->rel_param = ext_csd[EXT_CSD_WR_REL_PARAM];
+ }
+
+ card->hs_max_data_rate = ext_csd_reg->hs_max_dtr;
+ card_capacity = *((uint32_t *)&ext_csd[EXT_CSD_SEC_CNT]);
+ card_capacity *= card->card_blksize;
+ card_capacity >>= 10; /* unit:KB 10 */
+ card->card_capacity = card_capacity;
+ LOG_D("emmc card capacity %d KB. card_type=%d", card->card_capacity, ext_csd_reg->card_type);
+ return retval;
+}
+
+int32_t mmc_send_status(struct rt_mmcsd_card *card, uint32_t *status)
+{
+ int32_t err;
+ struct rt_mmcsd_cmd cmd = {0};
+
+ cmd.cmd_code = SEND_STATUS;
+ cmd.arg = card->rca << 16; // 16
+ cmd.flags = RESP_R1 | CMD_AC;
+ err = mmcsd_send_cmd(card->host, &cmd, 5); // 5
+ if (err) {
+ LOG_E("cmd13 requesting status failed ret=%d", err);
+ }
+ if (status != NULL) {
+ *status = cmd.resp[0];
+ }
+ return err;
+}
+
+/**
+ * mmc_switch - modify EXT_CSD register
+ * @card: the MMC card associated with the data transfer
+ * @set: cmd set values
+ * @fields: EXT_CSD register index
+ * @value: value to program into EXT_CSD register
+ *
+ * Modifies the EXT_CSD register for selected card.
+ */
+int mmc_switch(struct rt_mmcsd_card *card, uint8_t set, uint8_t fields, uint8_t value)
+{
+ int err;
+ struct rt_mmcsd_host *host = card->host;
+ struct rt_mmcsd_cmd cmd = {0};
+
+ cmd.cmd_code = SWITCH;
+ cmd.arg = (MMC_SWITCH_MODE_WRITE_BYTE << 24) | (fields << 16) | (value << 8) | set; // 24 16 8
+ cmd.flags = RESP_SPI_R1 | RESP_R1 | CMD_AC;
+
+ err = mmcsd_send_cmd(host, &cmd, 3); // 3
+ if (err) {
+ return err;
+ }
+ return 0;
+}
+
+static int mmc_compare_ext_csds(struct rt_mmcsd_card *card, uint8_t *ext_csd, uint32_t bus_width)
+{
+ uint8_t *bw_ext_csd;
+ int err;
+
+ if (bus_width == MMCSD_BUS_WIDTH_1) {
+ return 0;
+ }
+ err = mmc_get_ext_csd(card, &bw_ext_csd);
+ if (err || bw_ext_csd == RT_NULL) {
+ err = -RT_ERROR;
+ goto out;
+ }
+
+ /* only compare read only fields */
+ err = !((ext_csd[EXT_CSD_PARTITION_SUPPORT] == bw_ext_csd[EXT_CSD_PARTITION_SUPPORT]) &&
+ (ext_csd[EXT_CSD_ERASED_MEM_CONT] == bw_ext_csd[EXT_CSD_ERASED_MEM_CONT]) &&
+ (ext_csd[EXT_CSD_REV] == bw_ext_csd[EXT_CSD_REV]) &&
+ (ext_csd[EXT_CSD_STRUCTURE] == bw_ext_csd[EXT_CSD_STRUCTURE]) &&
+ (ext_csd[EXT_CSD_CARD_TYPE] == bw_ext_csd[EXT_CSD_CARD_TYPE]) &&
+ (ext_csd[EXT_CSD_S_A_TIMEOUT] == bw_ext_csd[EXT_CSD_S_A_TIMEOUT]) &&
+ (ext_csd[EXT_CSD_HC_WP_GRP_SIZE] == bw_ext_csd[EXT_CSD_HC_WP_GRP_SIZE]) &&
+ (ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT] == bw_ext_csd[EXT_CSD_ERASE_TIMEOUT_MULT]) &&
+ (ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE] == bw_ext_csd[EXT_CSD_HC_ERASE_GRP_SIZE]) &&
+ (ext_csd[EXT_CSD_SEC_TRIM_MULT] == bw_ext_csd[EXT_CSD_SEC_TRIM_MULT]) &&
+ (ext_csd[EXT_CSD_SEC_ERASE_MULT] == bw_ext_csd[EXT_CSD_SEC_ERASE_MULT]) &&
+ (ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT] == bw_ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]) &&
+ (ext_csd[EXT_CSD_TRIM_MULT] == bw_ext_csd[EXT_CSD_TRIM_MULT]) &&
+ (ext_csd[EXT_CSD_SEC_CNT + 0] == bw_ext_csd[EXT_CSD_SEC_CNT + 0]) &&
+ (ext_csd[EXT_CSD_SEC_CNT + 1] == bw_ext_csd[EXT_CSD_SEC_CNT + 1]) &&
+ (ext_csd[EXT_CSD_SEC_CNT + 2] == bw_ext_csd[EXT_CSD_SEC_CNT + 2]) && /* 2 */
+ (ext_csd[EXT_CSD_SEC_CNT + 3] == bw_ext_csd[EXT_CSD_SEC_CNT + 3]) && /* 3 */
+ (ext_csd[EXT_CSD_PWR_CL_52_195] == bw_ext_csd[EXT_CSD_PWR_CL_52_195]) &&
+ (ext_csd[EXT_CSD_PWR_CL_26_195] == bw_ext_csd[EXT_CSD_PWR_CL_26_195]) &&
+ (ext_csd[EXT_CSD_PWR_CL_52_360] == bw_ext_csd[EXT_CSD_PWR_CL_52_360]) &&
+ (ext_csd[EXT_CSD_PWR_CL_26_360] == bw_ext_csd[EXT_CSD_PWR_CL_26_360]) &&
+ (ext_csd[EXT_CSD_PWR_CL_200_195] == bw_ext_csd[EXT_CSD_PWR_CL_200_195]) &&
+ (ext_csd[EXT_CSD_PWR_CL_200_360] == bw_ext_csd[EXT_CSD_PWR_CL_200_360]) &&
+ (ext_csd[EXT_CSD_PWR_CL_DDR_52_195] == bw_ext_csd[EXT_CSD_PWR_CL_DDR_52_195]) &&
+ (ext_csd[EXT_CSD_PWR_CL_DDR_52_360] == bw_ext_csd[EXT_CSD_PWR_CL_DDR_52_360]) &&
+ (ext_csd[EXT_CSD_PWR_CL_DDR_200_360] == bw_ext_csd[EXT_CSD_PWR_CL_DDR_200_360]));
+
+ if (err) {
+ err = -RT_ERROR;
+ }
+
+out:
+ irfree(bw_ext_csd);
+ return err;
+}
+
+/*
+ * Select the bus width amoung 4-bit and 8-bit(SDR).
+ * If the bus width is changed successfully, return the selected width value.
+ * Zero is returned instead of error value if the wide width is not supported.
+ */
+static int mmc_select_bus_width(struct rt_mmcsd_card *card, uint8_t *ext_csd)
+{
+ uint32_t ext_csd_bits[] = {
+ EXT_CSD_BUS_WIDTH_8,
+ EXT_CSD_BUS_WIDTH_4,
+ EXT_CSD_BUS_WIDTH_1
+ };
+ uint32_t bus_widths[] = {
+ MMCSD_BUS_WIDTH_8,
+ MMCSD_BUS_WIDTH_4,
+ MMCSD_BUS_WIDTH_1
+ };
+ struct rt_mmcsd_host *host = card->host;
+ unsigned idx, bus_width = 0;
+ int err = 0;
+
+ if (GET_BITS(card->resp_cid, 122, 4) < 4) { // 122 4
+ return 0;
+ }
+
+ /*
+ * Unlike SD, MMC cards dont have a configuration register to notify
+ * supported bus width. So bus test command should be run to identify
+ * the supported bus width or compare the ext csd values of current
+ * bus width and ext csd values of 1 bit mode read earlier.
+ */
+ for (idx = 0; idx < sizeof(bus_widths) / sizeof(uint32_t); idx++) {
+ /*
+ * Host is capable of 8bit transfer, then switch
+ * the device to work in 8bit transfer mode. If the
+ * mmc switch command returns error then switch to
+ * 4bit transfer mode. On success set the corresponding
+ * bus width on the host.
+ */
+ err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, ext_csd_bits[idx]);
+ if (err) {
+ continue;
+ }
+
+ bus_width = bus_widths[idx];
+ mmcsd_set_bus_width(host, bus_width);
+ uapi_tcxo_delay_ms(20); // delay 20ms
+ err = mmc_compare_ext_csds(card, ext_csd, bus_width);
+ if (!err) {
+ err = bus_width;
+ break;
+ } else {
+ switch (ext_csd_bits[idx]) {
+ case 0:
+ LOG_E("switch to bus width 1 bit failed!");
+ break;
+ case 1:
+ LOG_E("switch to bus width 4 bit failed!");
+ break;
+ case 2: // 2
+ LOG_E("switch to bus width 8 bit failed!");
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ return err;
+}
+rt_err_t mmc_send_op_cond(struct rt_mmcsd_host *host, uint32_t ocr, uint32_t *rocr)
+{
+ struct rt_mmcsd_cmd cmd;
+ uint32_t i;
+ rt_err_t err = RT_EOK;
+
+ (void)memset_s(&cmd, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));
+ cmd.cmd_code = SEND_OP_COND;
+ cmd.arg = controller_is_spi(host) ? 0 : ocr;
+ cmd.flags = RESP_SPI_R1 | RESP_R3 | CMD_BCR;
+
+ for (i = 100; i; i--) { // 100
+ err = mmcsd_send_cmd(host, &cmd, 3); // 3 times
+ if (err) {
+ break;
+ }
+
+ /* if we're just probing, do a single pass */
+ if (ocr == 0) {
+ break;
+ }
+
+ /* otherwise wait until reset completes */
+ if (controller_is_spi(host)) {
+ if (!(cmd.resp[0] & R1_SPI_IDLE)) {
+ break;
+ }
+ } else {
+ if (cmd.resp[0] & CARD_BUSY) {
+ break;
+ }
+ }
+
+ err = -RT_ETIMEOUT;
+ uapi_tcxo_delay_ms(10); // delay 10ms
+ }
+
+ if (rocr && !controller_is_spi(host)) {
+ *rocr = cmd.resp[0];
+ }
+ return err;
+}
+
+static rt_err_t mmc_set_card_addr(struct rt_mmcsd_host *host, uint32_t rca)
+{
+ rt_err_t err;
+ struct rt_mmcsd_cmd cmd;
+
+ (void)memset_s(&cmd, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));
+ cmd.cmd_code = SET_RELATIVE_ADDR;
+ cmd.arg = rca << 16; // 16
+ cmd.flags = RESP_R1 | CMD_AC;
+
+ err = mmcsd_send_cmd(host, &cmd, 3); // 3 times
+ if (err) {
+ return err;
+ }
+ return 0;
+}
+
+static void mmc_set_erase_size(struct rt_mmcsd_card *cur_card)
+{
+ if (cur_card->ext_csd.erase_group_def & 1) {
+ cur_card->erase_size = cur_card->ext_csd.hc_erase_size;
+ }
+}
+
+static int32_t mmc_switch_status(struct rt_mmcsd_card *card)
+{
+ int32_t err = 0;
+ uint32_t status = R1_RSP_UNEXP;
+
+ err = mmc_send_status(card, &status);
+ if (err) {
+ return err;
+ }
+
+ if (status & R1_RSP_UNEXP) {
+ LOG_E("unexpected status %#x after switch", status);
+ }
+ if (status & R1_RSP_BIT7_SWITCH_ERROR) {
+ LOG_E("switch status failed");
+ return -EBADMSG;
+ }
+ return 0;
+}
+
+static int mmc_select_hs200(struct rt_mmcsd_card *card, uint8_t *ext_csd)
+{
+ int err = 0;
+ struct rt_mmcsd_host *host = card->host;
+
+ mmcsd_select_voltage(host, 0);
+ err = mmc_select_bus_width(card, ext_csd);
+ if (err >= 0) {
+ err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS200);
+ if (err) {
+ LOG_E("set hs timing failed ret=%d", err);
+ return err;
+ }
+ hi_mmc_set_timing(host, TIMING_MMC_HS200);
+ err = mmc_switch_status(card);
+ } else {
+ LOG_E("hs200 select bus width failed ret=%d", err);
+ }
+ return err;
+}
+
+static int mmc_select_highspeed(struct rt_mmcsd_card *card, uint8_t *ext_csd)
+{
+ int err = 0;
+ struct rt_mmcsd_host *host = card->host;
+
+ err = mmc_select_bus_width(card, ext_csd);
+ if (err >= 0) {
+ err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS);
+ if (err) {
+ LOG_E("set highspeed timing failed ret=%d", err);
+ return err;
+ }
+ hi_mmc_set_timing(host, TIMING_MMC_HS);
+ err = mmc_switch_status(card);
+ } else {
+ LOG_E("high speed select bus width failed ret=%d", err);
+ }
+ return err;
+}
+
+static void mmc_set_speed_flag(struct rt_mmcsd_host *host)
+{
+ struct rt_mmcsd_card *card = host->card;
+ host->flags &= ~MMCSD_SUP_HS200;
+ host->flags &= ~MMCSD_SUP_HS400;
+ host->flags &= ~MMCSD_SUP_HIGHSPEED;
+
+ if (card->ext_csd.card_type == EXT_CSD_CARD_TYPE_HS200_1_8V) {
+ host->flags |= MMCSD_SUP_HS200;
+ } else if (card->ext_csd.card_type == EXT_CSD_CARD_TYPE_DDR_1_8V) {
+ host->flags |= MMCSD_SUP_HIGHSPEED;
+ }
+ LOG_I("card_type = %x flags = %x", card->ext_csd.card_type, host->flags);
+}
+
+static int32_t mmcsd_mmc_init_card(struct rt_mmcsd_host *host, uint32_t ocr)
+{
+ int32_t err;
+ uint32_t resp[4]; // 4
+ uint32_t rocr = 0;
+ uint32_t max_data_rate;
+ uint8_t *ext_csd = RT_NULL;
+ struct rt_mmcsd_card *card = RT_NULL;
+
+ mmcsd_go_idle(host);
+ /* The extra bit indicates that we support high capacity */
+ err = mmc_send_op_cond(host, ocr | (1 << 30), &rocr); // 30
+ if (err) {
+ goto err;
+ }
+
+ if (controller_is_spi(host)) {
+ err = mmcsd_spi_use_crc(host, 1);
+ if (err) {
+ goto err1;
+ }
+ }
+
+ if (controller_is_spi(host)) {
+ err = mmcsd_get_cid(host, resp);
+ } else {
+ err = mmcsd_all_get_cid(host, resp);
+ }
+
+ if (err) {
+ goto err;
+ }
+
+ card = irmalloc(sizeof(struct rt_mmcsd_card));
+ if (!card) {
+ LOG_E("malloc card failed!");
+ err = -RT_ENOMEM;
+ goto err;
+ }
+ (void)memset_s(card, sizeof(struct rt_mmcsd_card), 0, sizeof(struct rt_mmcsd_card));
+
+ host->card = card;
+ card->card_type = CARD_TYPE_MMC;
+ card->host = host;
+ card->rca = 1;
+ (void)memcpy_s(card->resp_cid, sizeof(card->resp_cid), resp, sizeof(card->resp_cid));
+
+ /*
+ * For native busses: get card RCA and quit open drain mode.
+ */
+ if (!controller_is_spi(host)) {
+ err = mmc_set_card_addr(host, card->rca);
+ if (err) {
+ goto err1;
+ }
+
+ mmcsd_set_bus_mode(host, MMCSD_BUSMODE_PUSHPULL);
+ }
+
+ err = mmcsd_get_csd(card, card->resp_csd);
+ if (err) {
+ goto err1;
+ }
+
+ err = mmcsd_parse_csd(card);
+ if (err) {
+ goto err1;
+ }
+
+ if (!controller_is_spi(host)) {
+ err = mmcsd_select_card(card);
+ if (err) {
+ goto err1;
+ }
+ }
+
+ /*
+ * Fetch and process extended CSD.
+ */
+
+ err = mmc_get_ext_csd(card, &ext_csd);
+ if (err) {
+ goto err1;
+ }
+
+ err = mmc_parse_ext_csd(card, ext_csd);
+ if (err) {
+ goto err1;
+ }
+
+ mmc_set_erase_size(card);
+ if (card->ext_csd.part_config & EXT_CSD_PART_CONFIG_ACC_MASK) {
+ card->ext_csd.part_config &= ~EXT_CSD_PART_CONFIG_ACC_MASK;
+ err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONFIG, card->ext_csd.part_config);
+ if (err && err != -EBADMSG) {
+ goto err1;
+ }
+ }
+ mmc_set_speed_flag(host);
+ if (host->flags & MMCSD_SUP_HS200) {
+ err = mmc_select_hs200(card, ext_csd);
+ } else if (host->flags & MMCSD_SUP_HIGHSPEED) {
+ err = mmc_select_highspeed(card, ext_csd);
+ }
+ if (err) {
+ goto err1;
+ }
+
+ /* If doing byte addressing, check if required to do sector
+ * addressing. Handle the case of <2GB cards needing sector
+ * addressing. See section 8.1 JEDEC Standard JED84-A441;
+ * ocr register has bit 30 set for sector addressing.
+ */
+ if (!(card->flags & CARD_FLAG_SDHC) && (rocr & (1<<30))) {
+ card->flags |= CARD_FLAG_SDHC;
+ }
+
+ /* set bus speed */
+ max_data_rate = host->freq_max;
+
+ if (max_data_rate > card->hs_max_data_rate) {
+ max_data_rate = card->hs_max_data_rate;
+ }
+ LOG_I("flags=%x mdr=%d hsmdr=%d cmdr=%d", host->flags, max_data_rate, card->hs_max_data_rate, card->max_data_rate);
+ mmcsd_set_clock(host, max_data_rate);
+ if (host->flags & MMCSD_SUP_HS200) {
+ err = hi_mmc_exec_tuning(card->host, SEND_TUNING_BLOCK_HS200);
+ if (err) {
+ LOG_W("tuning execution failed\n");
+ goto err1;
+ }
+ /* switch bus width */
+ mmc_select_bus_width(card, ext_csd);
+ } else {
+ /* switch bus width */
+ mmc_select_bus_width(card, ext_csd);
+ }
+ host->card = card;
+ LOG_I("emmc init finish success clock=%d\n", max_data_rate);
+ irfree(ext_csd);
+ return 0;
+
+err1:
+ irfree(card);
+err:
+
+ return err;
+}
+
+/*
+ * Starting point for mmc card init.
+ */
+int32_t init_mmc(struct rt_mmcsd_host *host, uint32_t ocr)
+{
+ int32_t err;
+ uint32_t current_ocr;
+ /*
+ * We need to get OCR a different way for SPI.
+ */
+
+ if (controller_is_spi(host)) {
+ err = mmcsd_spi_read_ocr(host, 0, &ocr);
+ if (err) {
+ goto err;
+ }
+ }
+
+ current_ocr = mmcsd_select_voltage(host, ocr);
+ if (!current_ocr) {
+ err = -RT_ERROR;
+ goto err;
+ }
+
+ /*
+ * Detect and init the card.
+ */
+ err = mmcsd_mmc_init_card(host, current_ocr);
+ if (err) {
+ goto err;
+ }
+
+ mmcsd_host_unlock(host);
+
+ err = rt_mmcsd_blk_probe(host->card);
+ if (err) {
+ goto remove_card;
+ }
+
+ mmcsd_host_lock(host);
+ return 0;
+
+remove_card:
+ mmcsd_host_lock(host);
+ rt_mmcsd_blk_remove(host->card);
+ irfree(host->card);
+ host->card = RT_NULL;
+
+err:
+ LOG_E("init MMC card failed!");
+ return err;
+}
+
+int32_t deinit_mmc_free_mem(struct rt_mmcsd_host *host)
+{
+ if (host == RT_NULL || host->card == RT_NULL) {
+ return -RT_EINVAL;
+ }
+ irfree(host->card);
+ host->card = RT_NULL;
+ return 0;
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2015-06-15 hichard first version
+ */
+
+#ifndef __MMC_H__
+#define __MMC_H__
+
+#include "mmcsd_host.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * EXT_CSD fields
+ */
+
+#define EXT_CSD_FLUSH_CACHE 32 /* W */
+#define EXT_CSD_CACHE_CTRL 33 /* R/W */
+#define EXT_CSD_POWER_OFF_NOTIFICATION 34 /* R/W */
+#define EXT_CSD_PACKED_FAILURE_INDEX 35 /* RO */
+#define EXT_CSD_PACKED_CMD_STATUS 36 /* RO */
+#define EXT_CSD_EXP_EVENTS_STATUS 54 /* RO, 2 bytes */
+#define EXT_CSD_EXP_EVENTS_CTRL 56 /* R/W, 2 bytes */
+#define EXT_CSD_DATA_SECTOR_SIZE 61 /* R */
+#define EXT_CSD_GP_SIZE_MULT 143 /* R/W */
+#define EXT_CSD_PARTITION_ATTRIBUTE 156 /* R/W */
+#define EXT_CSD_PARTITION_SUPPORT 160 /* RO */
+#define EXT_CSD_HPI_MGMT 161 /* R/W */
+#define EXT_CSD_RST_N_FUNCTION 162 /* R/W */
+#define EXT_CSD_BKOPS_EN 163 /* R/W */
+#define EXT_CSD_BKOPS_START 164 /* W */
+#define EXT_CSD_SANITIZE_START 165 /* W */
+#define EXT_CSD_WR_REL_PARAM 166 /* RO */
+#define EXT_CSD_RPMB_MULT 168 /* RO */
+#define EXT_CSD_BOOT_WP 173 /* R/W */
+#define EXT_CSD_ERASE_GROUP_DEF 175 /* R/W */
+#define EXT_CSD_PART_CONFIG 179 /* R/W */
+#define EXT_CSD_ERASED_MEM_CONT 181 /* RO */
+#define EXT_CSD_BUS_WIDTH 183 /* R/W */
+#define EXT_CSD_STROBE_SUPPORT 184 /* RO */
+#define EXT_CSD_HS_TIMING 185 /* R/W */
+#define EXT_CSD_POWER_CLASS 187 /* R/W */
+#define EXT_CSD_REV 192 /* RO */
+#define EXT_CSD_STRUCTURE 194 /* RO */
+#define EXT_CSD_CARD_TYPE 196 /* RO */
+#define EXT_CSD_OUT_OF_INTERRUPT_TIME 198 /* RO */
+#define EXT_CSD_PART_SWITCH_TIME 199 /* RO */
+#define EXT_CSD_PWR_CL_52_195 200 /* RO */
+#define EXT_CSD_PWR_CL_26_195 201 /* RO */
+#define EXT_CSD_PWR_CL_52_360 202 /* RO */
+#define EXT_CSD_PWR_CL_26_360 203 /* RO */
+#define EXT_CSD_SEC_CNT 212 /* RO, 4 bytes */
+#define EXT_CSD_S_A_TIMEOUT 217 /* RO */
+#define EXT_CSD_REL_WR_SEC_C 222 /* RO */
+#define EXT_CSD_HC_WP_GRP_SIZE 221 /* RO */
+#define EXT_CSD_ERASE_TIMEOUT_MULT 223 /* RO */
+#define EXT_CSD_HC_ERASE_GRP_SIZE 224 /* RO */
+#define EXT_CSD_BOOT_MULT 226 /* RO */
+#define EXT_CSD_SEC_TRIM_MULT 229 /* RO */
+#define EXT_CSD_SEC_ERASE_MULT 230 /* RO */
+#define EXT_CSD_SEC_FEATURE_SUPPORT 231 /* RO */
+#define EXT_CSD_TRIM_MULT 232 /* RO */
+#define EXT_CSD_PWR_CL_200_195 236 /* RO */
+#define EXT_CSD_PWR_CL_200_360 237 /* RO */
+#define EXT_CSD_PWR_CL_DDR_52_195 238 /* RO */
+#define EXT_CSD_PWR_CL_DDR_52_360 239 /* RO */
+#define EXT_CSD_BKOPS_STATUS 246 /* RO */
+#define EXT_CSD_POWER_OFF_LONG_TIME 247 /* RO */
+#define EXT_CSD_GENERIC_CMD6_TIME 248 /* RO */
+#define EXT_CSD_CACHE_SIZE 249 /* RO, 4 bytes */
+#define EXT_CSD_PWR_CL_DDR_200_360 253 /* RO */
+#define EXT_CSD_TAG_UNIT_SIZE 498 /* RO */
+#define EXT_CSD_DATA_TAG_SUPPORT 499 /* RO */
+#define EXT_CSD_MAX_PACKED_WRITES 500 /* RO */
+#define EXT_CSD_MAX_PACKED_READS 501 /* RO */
+#define EXT_CSD_BKOPS_SUPPORT 502 /* RO */
+#define EXT_CSD_HPI_FEATURES 503 /* RO */
+
+/*
+ * EXT_CSD field definitions
+ */
+
+#define EXT_CSD_WR_REL_PARAM_EN (1<<2)
+
+#define EXT_CSD_BOOT_WP_B_PWR_WP_DIS (0x40)
+#define EXT_CSD_BOOT_WP_B_PERM_WP_DIS (0x10)
+#define EXT_CSD_BOOT_WP_B_PERM_WP_EN (0x04)
+#define EXT_CSD_BOOT_WP_B_PWR_WP_EN (0x01)
+
+#define EXT_CSD_PART_CONFIG_ACC_MASK (0x7)
+#define EXT_CSD_PART_CONFIG_ACC_BOOT0 (0x1)
+#define EXT_CSD_PART_CONFIG_ACC_RPMB (0x3)
+#define EXT_CSD_PART_CONFIG_ACC_GP0 (0x4)
+
+#define EXT_CSD_PART_SUPPORT_PART_EN (0x1)
+
+#define EXT_CSD_CMD_SET_NORMAL (1<<0)
+#define EXT_CSD_CMD_SET_SECURE (1<<1)
+#define EXT_CSD_CMD_SET_CPSECURE (1<<2)
+
+#define EXT_CSD_CARD_TYPE_HS_26 (1<<0) /* Card can run at 26MHz */
+#define EXT_CSD_CARD_TYPE_HS_52 (1<<1) /* Card can run at 52MHz */
+#define EXT_CSD_CARD_TYPE_HS (EXT_CSD_CARD_TYPE_HS_26 | \
+ EXT_CSD_CARD_TYPE_HS_52)
+#define EXT_CSD_CARD_TYPE_DDR_1_8V (1<<2) /* Card can run at 52MHz */
+ /* DDR mode @1.8V or 3V I/O */
+#define EXT_CSD_CARD_TYPE_DDR_1_2V (1<<3) /* Card can run at 52MHz */
+ /* DDR mode @1.2V I/O */
+#define EXT_CSD_CARD_TYPE_DDR_52 (EXT_CSD_CARD_TYPE_DDR_1_8V \
+ | EXT_CSD_CARD_TYPE_DDR_1_2V)
+#define EXT_CSD_CARD_TYPE_HS200_1_8V (1<<4) /* Card can run at 200MHz */
+#define EXT_CSD_CARD_TYPE_HS200_1_2V (1<<5) /* Card can run at 200MHz */
+ /* SDR mode @1.2V I/O */
+#define EXT_CSD_CARD_TYPE_HS200 (EXT_CSD_CARD_TYPE_HS200_1_8V | \
+ EXT_CSD_CARD_TYPE_HS200_1_2V)
+#define EXT_CSD_CARD_TYPE_HS400_1_8V (1<<6) /* Card can run at 200MHz DDR, 1.8V */
+#define EXT_CSD_CARD_TYPE_HS400_1_2V (1<<7) /* Card can run at 200MHz DDR, 1.2V */
+#define EXT_CSD_CARD_TYPE_HS400 (EXT_CSD_CARD_TYPE_HS400_1_8V | \
+ EXT_CSD_CARD_TYPE_HS400_1_2V)
+#define EXT_CSD_CARD_TYPE_ALL_1_8V (EXT_CSD_CARD_TYPE_HS_26 | \
+ EXT_CSD_CARD_TYPE_HS_52 | EXT_CSD_CARD_TYPE_DDR_1_8V | \
+ EXT_CSD_CARD_TYPE_HS200_1_8V | EXT_CSD_CARD_TYPE_HS400_1_8V)
+#define EXT_CSD_CARD_TYPE_1_8V_HS200 (EXT_CSD_CARD_TYPE_HS_26 | \
+ EXT_CSD_CARD_TYPE_HS_52 | EXT_CSD_CARD_TYPE_DDR_1_8V | \
+ EXT_CSD_CARD_TYPE_HS200_1_8V)
+#define EXT_CSD_CARD_TYPE_MASK (0xFF) /* CSD[196] Mask with JESDC84-B51 */
+#define EXT_CSD_CARD_MAX_RATE_200 200000000
+#define EXT_CSD_CARD_MAX_RATE_52 52000000
+
+#define EXT_CSD_BUS_WIDTH_1 0 /* Card is in 1 bit mode */
+#define EXT_CSD_BUS_WIDTH_4 1 /* Card is in 4 bit mode */
+#define EXT_CSD_BUS_WIDTH_8 2 /* Card is in 8 bit mode */
+#define EXT_CSD_DDR_BUS_WIDTH_4 5 /* Card is in 4 bit DDR mode */
+#define EXT_CSD_DDR_BUS_WIDTH_8 6 /* Card is in 8 bit DDR mode */
+
+#define EXT_CSD_TIMING_BC 0 /* Backwards compatility */
+#define EXT_CSD_TIMING_HS 1 /* High speed */
+#define EXT_CSD_TIMING_HS200 2 /* HS200 */
+#define EXT_CSD_TIMING_HS400 3 /* HS400 */
+
+#define EXT_CSD_SEC_ER_EN BIT(0)
+#define EXT_CSD_SEC_BD_BLK_EN BIT(2)
+#define EXT_CSD_SEC_GB_CL_EN BIT(4)
+#define EXT_CSD_SEC_SANITIZE BIT(6) /* v4.5 only */
+
+#define EXT_CSD_RST_N_EN_MASK 0x3
+#define EXT_CSD_RST_N_ENABLED 1 /* RST_n is enabled on card */
+
+#define EXT_CSD_NO_POWER_NOTIFICATION 0
+#define EXT_CSD_POWER_ON 1
+#define EXT_CSD_POWER_OFF_SHORT 2
+#define EXT_CSD_POWER_OFF_LONG 3
+
+#define EXT_CSD_PWR_CL_8BIT_MASK 0xF0 /* 8 bit PWR CLS */
+#define EXT_CSD_PWR_CL_4BIT_MASK 0x0F /* 8 bit PWR CLS */
+#define EXT_CSD_PWR_CL_8BIT_SHIFT 4
+#define EXT_CSD_PWR_CL_4BIT_SHIFT 0
+
+#define EXT_CSD_PACKED_EVENT_EN BIT(3)
+
+/*
+ * EXCEPTION_EVENT_STATUS field
+ */
+#define EXT_CSD_URGENT_BKOPS BIT(0)
+#define EXT_CSD_DYNCAP_NEEDED BIT(1)
+#define EXT_CSD_SYSPOOL_EXHAUSTED BIT(2)
+#define EXT_CSD_PACKED_FAILURE BIT(3)
+
+#define EXT_CSD_PACKED_GENERIC_ERROR BIT(0)
+#define EXT_CSD_PACKED_INDEXED_ERROR BIT(1)
+
+/*
+ * BKOPS status level
+ */
+#define EXT_CSD_BKOPS_LEVEL_2 0x2
+/*
+ * MMC_SWITCH access modes
+ */
+#define MMC_SWITCH_MODE_CMD_SET 0x00 /* Change the command set */
+#define MMC_SWITCH_MODE_SET_BITS 0x01 /* Set bits which are 1 in value */
+#define MMC_SWITCH_MODE_CLEAR_BITS 0x02 /* Clear bits which are 1 in value */
+#define MMC_SWITCH_MODE_WRITE_BYTE 0x03 /* Set target to value */
+
+#define R1_RSP_BIT7_SWITCH_ERROR (1 << 7)
+#define R1_RSP_STATUS(x) ((x) & 0xFFFFE000)
+#define R1_RSP_UNEXP (0xFDFFA000UL)
+#define R1_RSP_ERASE_STATE_ALL_ERR (0xFDF92000)
+#define R1_STATE_IDLE 0
+#define R1_STATE_READY 1
+#define R1_STATE_IDENT 2
+#define R1_STATE_STBY 3
+#define R1_STATE_TRAN 4
+#define R1_STATE_DATA 5
+#define R1_STATE_RCV 6
+#define R1_STATE_PRG 7
+#define R1_STATE_DIS 8
+
+#define CSD_SPEC_VER_0 0
+#define CSD_SPEC_VER_1 1
+#define CSD_SPEC_VER_2 2
+#define CSD_SPEC_VER_3 3
+#define CSD_SPEC_VER_4 4
+
+/*
+ * extern function
+ */
+rt_err_t mmc_send_op_cond(struct rt_mmcsd_host *host, rt_uint32_t ocr, rt_uint32_t *rocr);
+rt_int32_t init_mmc(struct rt_mmcsd_host *host, rt_uint32_t ocr);
+rt_int32_t mmc_send_status(struct rt_mmcsd_card *card, rt_uint32_t *status);
+rt_int32_t deinit_mmc_free_mem(struct rt_mmcsd_host *host);
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) Huawei Technologies Co., Ltd. 2018-2020. All rights reserved.
+ * Description: MMC BLOCK INTERFACE
+ * Author:
+ * Create: 2021-06
+ */
+#include "drv_mmc_adapter.h"
+#include "mmc.h"
+#include "mmcsd_card.h"
+#include "mmcsd_core.h"
+#include "mmcsd_host.h"
+#include "mmc_block.h"
+
+#define SECTOR_SIZE 512
+#define PIO_SECTOR_SIZE 512
+#define MMC_RW_RETRY_COUNTS 3
+#define VENDOR_CMD 60
+#define DATA_TRANSFER_TIMEOUT 300000000 // 300ms
+#define MMC_DMA_ALIGN_SIZE 64
+#define MMC_CURRENT_STATE_TRAN 0x4
+#define MMC_RETRY_TIMES 500
+#define MMC_RETRY_DELAY 1
+#define PADING_LEN 196
+#define MAC_KEY_LEN 32
+#define DATA_LEN 256
+#define RAND_LEN 16
+#define WRITE_CNT_LEN 4
+#define RESULT_LEN 2
+#define HMAC_AUTH_DATA_LEN 284
+#define SET_RELIABLE_WRITE 0x80000000UL
+#define OFFSET_8 8
+#define OFFSET_16 16
+#define OFFSET_24 24
+#define AUTH_KEY_REQ 0x1
+#define WRITE_COUNTER_READ_REQ 0x2
+#define AUTH_DATA_WRITE_REQ 0x3
+#define AUTH_DATA_READ_REQ 0x4
+#define RESULT_READ_REQ 0x5
+#define AUTH_DEVICE_CONFIG_WRITE_REQ 0x6
+#define AUTH_DEVICE_CONFIG_READ_REQ 0x7
+#define AUTH_KEY_REPLY 0x0100
+#define WRITE_COUNTER_READ_REPLY 0x0200
+#define AUTH_DATA_WRITE_REPLY 0x0300
+#define AUTH_DATA_READ_REPLY 0x0400
+#define AUTH_DEVICE_CONFIG_WRITE_RESP 0x0600
+#define AUTH_DEVICE_CONFIG_READ_RESP 0x0700
+
+typedef struct {
+ uint8_t padding[PADING_LEN];
+ uint8_t mac_key[MAC_KEY_LEN];
+ uint8_t data[DATA_LEN];
+ uint8_t rand[RAND_LEN];
+ uint32_t write_cnt;
+ uint16_t address;
+ uint16_t block_cnt;
+ uint16_t op_result;
+ uint16_t req_resp;
+}rpmb_data_t;
+
+typedef struct {
+ uint32_t sector;
+ uint8_t rw_flag;
+ uint32_t blks;
+ uint8_t reliable_flag;
+} ioctl_data_t;
+
+typedef enum {
+ MMC_READ = 0,
+ MMC_WRITE = 1,
+} mmc_rw_flag_t;
+
+int g_req_flag = 0;
+rpmb_data_t g_rpmb_data __attribute__((__aligned__(64))) = { 0 };
+
+static int mmcsd_req_block(struct rt_mmcsd_card *card, uint32_t sector, void *buf, uint32_t blks, mmc_rw_flag_t rw_flag)
+{
+ struct rt_mmcsd_cmd cmd, stop;
+ struct rt_mmcsd_data data;
+ struct rt_mmcsd_req req;
+ struct rt_mmcsd_host *host = card->host;
+ uint32_t r_cmd, w_cmd;
+
+ memset_s(&req, sizeof(struct rt_mmcsd_req), 0, sizeof(struct rt_mmcsd_req));
+ memset_s(&cmd, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));
+ memset_s(&stop, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));
+ memset_s(&data, sizeof(struct rt_mmcsd_data), 0, sizeof(struct rt_mmcsd_data));
+ req.cmd = &cmd;
+ req.data = &data;
+
+ if (g_req_flag == 1) {
+ req.cmd->err = -EBUSY;
+ return -1;
+ }
+ g_req_flag = 1; // Avoid reentrant
+ mmcsd_host_lock(host);
+ cmd.arg = sector;
+ cmd.flags = RESP_SPI_R1 | RESP_R1 | CMD_ADTC;
+ data.blksize = SECTOR_SIZE;
+ data.blks = blks;
+
+ if (blks > 1) {
+ req.stop = &stop;
+ stop.cmd_code = STOP_TRANSMISSION;
+ stop.flags = RESP_SPI_R1B | RESP_R1B | CMD_AC;
+ data.flags |= DATA_CMD_AUTO_STOP;
+ r_cmd = READ_MULTIPLE_BLOCK;
+ w_cmd = WRITE_MULTIPLE_BLOCK;
+ } else {
+ req.stop = NULL;
+ r_cmd = READ_SINGLE_BLOCK;
+ w_cmd = WRITE_BLOCK;
+ }
+ if (rw_flag == MMC_READ) {
+ cmd.cmd_code = r_cmd;
+ data.flags |= DATA_DIR_READ;
+ } else {
+ cmd.cmd_code = w_cmd;
+ data.flags |= DATA_DIR_WRITE;
+ }
+ mmcsd_set_data_timeout(&data, card);
+ data.buf = buf;
+ mmcsd_send_request(host, &req);
+
+ mmcsd_host_unlock(host);
+ g_req_flag = 0; // Avoid reentrant
+ if ((cmd.err != 0) || (data.err != 0) || (stop.err != 0)) { return -1; }
+ return 0;
+}
+
+static uint32_t mmc_dma_rw(const void *buf, uint32_t pos, uint32_t size, mmc_rw_flag_t rw_flag)
+{
+ int32_t err = 0;
+ uint32_t offset = 0;
+ uint32_t req_size = 0;
+ uint32_t remain_size = size;
+ if (buf == NULL) {
+ return 0;
+ }
+ void *wr_ptr = (void *)buf;
+ struct rt_mmcsd_host *mmc = NULL;
+ uint8_t retries = MMC_RW_RETRY_COUNTS;
+
+ if ((uint32_t)buf % EMMC_DMA_ALIGN) { return 0; }
+ mmc = hi_mmc_get_host(SDIO_EMMC_ID);
+ if (mmc == NULL) {
+ panic(1, __LINE__);
+ return 0; //lint !e527 unreachable code
+ }
+ do {
+ while (remain_size != 0) {
+ req_size = (remain_size > mmc->max_dma_segs) ? mmc->max_dma_segs : remain_size;
+ if (rw_flag == MMC_READ) {
+ err = mmcsd_req_block(mmc->card, pos + offset, wr_ptr, req_size, MMC_READ);
+ } else {
+ err = mmcsd_req_block(mmc->card, pos + offset, wr_ptr, req_size, MMC_WRITE);
+ }
+ if (err != 0) { break; }
+ offset += req_size;
+ wr_ptr = (void *)((uint8_t *)wr_ptr + (req_size << 9)); // 9
+ remain_size -= req_size;
+ }
+ if (err != 0) {
+ retries--;
+ } else {
+ break;
+ }
+ LOG_E("mmc_rw:start:%d,len:%d,rw_flag=%d,retries=%d,err_ret=%d", pos, size, rw_flag, retries, err);
+ } while (retries != 0);
+
+ if (err != 0) {
+ return 0;
+ }
+ return size - remain_size;
+}
+
+uint32_t hi_mmc_read(void *buffer, uint32_t pos, uint32_t size)
+{
+ uint32_t ret;
+ ret = mmc_dma_rw(buffer, pos, size, MMC_READ);
+ return ret;
+}
+
+uint32_t hi_mmc_write(const void *buffer, uint32_t pos, uint32_t size)
+{
+ uint32_t ret;
+ ret = mmc_dma_rw(buffer, pos, size, MMC_WRITE);
+ return ret;
+}
+
+uint32_t hi_mmc_pio_read(void *buffer, uint32_t pos, uint32_t size)
+{
+ uint32_t ret;
+ ret = mmc_dma_rw(buffer, pos, size, MMC_READ);
+ return ret;
+}
+
+uint32_t hi_mmc_pio_write(const void *buffer, uint32_t pos, uint32_t size)
+{
+ uint32_t ret;
+ ret = mmc_dma_rw(buffer, pos, size, MMC_WRITE);
+ return ret;
+}
+
+int hi_mmc_erase(uint32_t start_sector, uint32_t nsectors, uint32_t type)
+{
+ struct rt_mmcsd_req req = {0};
+ struct rt_mmcsd_erase erase = {0};
+ uint32_t tmp_start = start_sector;
+ uint32_t tmp_len = nsectors;
+ int ret = 0;
+ struct rt_mmcsd_host *mmc = NULL;
+ struct rt_mmcsd_card *card = NULL;
+ mmc = hi_mmc_get_host(SDIO_EMMC_ID);
+ if (mmc == NULL || mmc->card == NULL) {
+ panic(1, __LINE__);
+ return 0; //lint !e527 unreachable code
+ }
+ mmcsd_host_lock(mmc);
+ card = mmc->card;
+ req.erase = &erase;
+ erase.type = type;
+ do {
+ erase.start_addr = 0;
+ erase.len = 0;
+ if (tmp_len > CONFIG_ERASE_MAX_SECTOR) {
+ erase.start_addr = tmp_start;
+ erase.len = CONFIG_ERASE_MAX_SECTOR;
+ } else {
+ erase.start_addr = tmp_start;
+ erase.len = tmp_len;
+ }
+ LOG_I("erase: sec str:%d, sec len:%d type %d", erase.start_addr, erase.len, type);
+ ret = mmc_erase_arae(card, &req);
+ if (ret != 0) {
+ LOG_I("erase err ret=%d addr_len=%d type:%d", ret, erase.len, type);
+ break;
+ }
+ tmp_len -= erase.len;
+ tmp_start += erase.len;
+ } while (tmp_len != 0);
+ mmcsd_host_unlock(mmc);
+ if (tmp_len == 0) {
+ ret = 0;
+ }
+ return ret;
+}
+
+int hi_mmc_init(struct rt_mmcsd_host *mmc)
+{
+ struct hi_mmc_drv *mmc_drv = NULL;
+ int ret = 0;
+
+ if (mmc == NULL) {
+ ret = -EINVAL;
+ goto err; /*lint !e801*/
+ }
+ mmc_drv = irmalloc(sizeof(struct hi_mmc_drv));
+ if (mmc_drv == NULL) {
+ ret = -EINVAL;
+ goto err; /*lint !e801*/
+ }
+
+ memset_s(mmc_drv, sizeof(struct hi_mmc_drv), 0, sizeof(struct hi_mmc_drv));
+ mmc->private_data = mmc_drv;
+ mmc_drv->host = mmc;
+ hi_mmc_set_magic_to_aon_area();
+ hi_mmc_set_drv_features(mmc_drv, mmc->id);
+ hi_mmc_set_host_features(mmc);
+ ret = hi_mmc_set_int_info(mmc, mmc_drv);
+ if (ret != 0) {
+ goto err; /*lint !e801*/
+ }
+
+ ret = hi_mmc_detect(mmc);
+ if (ret != 0) {
+ goto err; /*lint !e801*/
+ }
+ LOG_I("mmc version=%d drv_flags=%x host_flags=%x cap1=%x, cap2=%x\n",
+ mmc_drv->version, mmc_drv->flags, mmc->flags,
+ hal_mmc_get_cap1(mmc_drv), hal_mmc_get_cap2(mmc_drv));
+ return 0;
+err:
+ if (mmc_drv != NULL) {
+ irfree(mmc_drv);
+ mmc_drv = NULL;
+ }
+ if (mmc != NULL) {
+ LOG_E("MMC %d err while initialize ret=%d\n", mmc->id, ret);
+ irfree(mmc);
+ }
+ UNUSED(mmc_drv);
+ return ret;
+}
+
+int hi_mmc_get_cardstatus(void)
+{
+ int err;
+ uint32_t status = 0;
+ struct rt_mmcsd_host *mmc = hi_mmc_get_host(SDIO_EMMC_ID);
+ if (mmc == NULL || mmc->card == NULL) {
+ LOG_E("get mmc error for getcardstate");
+ return -1;
+ }
+ err = mmc_send_status(mmc->card, &status);
+ status = R1_CURRENT_STATE((unsigned int)status);
+ if (err != 0) {
+ LOG_E("get mmc status err=%d, status=%d", err, status);
+ return -1;
+ }
+ return (int)status;
+}
+
+int hi_mmc_set_ext_csd_partition_config(PART_CONFIG_AREA area)
+{
+ int ret;
+ uint32_t status;
+ struct rt_mmcsd_host *mmc = hi_mmc_get_host(SDIO_EMMC_ID);
+ if (mmc == NULL || mmc->card == NULL) {
+ return -EPARAMERR;
+ }
+ if (area < PART_CONFIG_AREA_DEFAULT || area > PART_CONFIG_AREA_RPMB) {
+ return EPARAMERR;
+ }
+ struct rt_mmcsd_card *card = mmc->card;
+ LOG_I("set ext csd partition config %x\n", card->ext_csd.part_config);
+ card->ext_csd.part_config &= ~EXT_CSD_PART_CONFIG_ACC_MASK;
+ card->ext_csd.part_config |= (uint8_t)area;
+ ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONFIG, card->ext_csd.part_config);
+ if (ret != 0) {
+ LOG_E("mmc set ext_csd partition config error, err=%d", ret);
+ return ret;
+ }
+ do {
+ ret = mmc_send_status(card, (uint32_t *)&status);
+ if (ret != 0) {
+ return ret;
+ }
+ } while (((status & R1_READY_FOR_DATA) == 0) || (hi_mmc_card_busy(card->host) != 0));
+ return ret;
+}
+
+int hi_mmc_sleep_awake(emmc_sleep_mode_e_type sleep_enable)
+{
+ int err = 0;
+ struct rt_mmcsd_host *mmc = hi_mmc_get_host(SDIO_EMMC_ID);
+ if (mmc == NULL || mmc->card == NULL) {
+ return -EPARAMERR;
+ }
+ if ((sleep_enable != EMMC_SLEEP_DISABLE) && (sleep_enable != EMMC_SLEEP_ENABLE)) {
+ return EPARAMERR;
+ }
+ struct rt_mmcsd_card *card = mmc->card;
+ struct rt_mmcsd_cmd cmd = {0};
+ uint32_t status;
+ if (sleep_enable != EMMC_SLEEP_DISABLE) {
+ err = mmcsd_deselect_cards(card);
+ LOG_I("cmd7 from tran to standby status %x \n", err);
+ }
+ memset_s(&cmd, sizeof(cmd), 0, sizeof(cmd));
+ cmd.cmd_code = SLEEP_AWAKE;
+ cmd.arg = (card->rca << 16) | ((uint32_t)sleep_enable << 15); // 16 15
+ cmd.flags = RESP_SPI_R1B | RESP_R1B | CMD_AC;
+ err = mmcsd_send_cmd(card->host, &cmd, 3); // 3
+ if (err != 0) {
+ return err;
+ }
+ if (sleep_enable == EMMC_SLEEP_ENABLE) {
+ return err;
+ }
+ if (sleep_enable == EMMC_SLEEP_DISABLE) {
+ err = mmcsd_select_card(card);
+ LOG_E("cmd7 from standby to trans status %x \n", err);
+ }
+ do {
+ err = mmc_send_status(card, &status);
+ if (err != 0) {
+ return err;
+ }
+ } while (((status & R1_READY_FOR_DATA) == 0) || (hi_mmc_card_busy(card->host) != 0));
+ LOG_I("cmd5 status %x \n", status);
+ return err;
+}
+
+int sdio_read_fifo_block(struct rt_sdio_function *func, void *dst, uint32_t addr, uint32_t size)
+{
+ if (func == NULL || dst == NULL) {
+ return -EPARAMERR;
+ }
+ return sdio_io_rw_extended_block(func, 0, addr, 0, (unsigned char *)dst, size);
+}
+
+int sdio_write_fifo_block(struct rt_sdio_function *func, uint32_t addr, void *src, uint32_t size)
+{
+ if (func == NULL || src == NULL) {
+ return -EPARAMERR;
+ }
+ return sdio_io_rw_extended_block(func, 1, addr, 0, (unsigned char *)src, size);
+}
+
+int hi_sdio_io_rw_direct(struct rt_mmcsd_card *card, int writeflag, uint32_t fn,
+ uint32_t addr, uint8_t in, uint8_t *out)
+{
+ UNUSED(in);
+ if (card == NULL || out == NULL) {
+ return -EPARAMERR;
+ }
+ return sdio_io_rw_direct(card, writeflag, fn, addr, out, 0);
+}
+
+void sdio_writeb(struct rt_sdio_function *func, uint8_t byte, uint32_t addr, int *err)
+{
+ if (func == NULL) {
+ *err = -EPARAMERR;
+ return;
+ }
+ int ret = sdio_io_rw_direct(func->card, 1, func->num, addr, &byte, 0);
+ if (err != NULL) {
+ *err = ret;
+ }
+}
+
+uint8_t sdio_readb(struct rt_sdio_function *func, uint32_t addr, int *err)
+{
+ uint8_t val = 0;
+ if (func == NULL) {
+ *err = -EPARAMERR;
+ return 0xFF;
+ }
+ int ret = sdio_io_rw_direct(func->card, 0, func->num, addr, &val, 0);
+ *err = ret;
+
+ if (ret != 0) {
+ return 0xFF;
+ } else {
+ return val;
+ }
+}
+
+int sdio_writesb(struct rt_sdio_function *func, uint32_t addr, void *src, uint32_t size)
+{
+ if (func == NULL || src == NULL) {
+ return -EPARAMERR;
+ }
+ return sdio_io_rw_extended_block(func, 1, addr, 0, (uint8_t *)src, size);
+}
+
+int sdio_readsb(struct rt_sdio_function *func, void *dst, uint32_t addr, uint32_t size)
+{
+ if (func == NULL || dst == NULL) {
+ return -EPARAMERR;
+ }
+ return sdio_io_rw_extended_block(func, 0, addr, 0, (uint8_t *)dst, size);
+}
+
+int sdio_memcpy_fromio(struct rt_sdio_function *func, void *dst, uint32_t addr, uint32_t size)
+{
+ if (func == NULL || dst == NULL) {
+ return -EPARAMERR;
+ }
+ return sdio_io_rw_extended_block(func, 0, addr, 1, (uint8_t *)dst, size);
+}
+
+void sdio_writew(struct rt_sdio_function *func, uint16_t byte, uint32_t addr, int *err)
+{
+ if (func == NULL) {
+ *err = -EPARAMERR;
+ return;
+ }
+ int ret = sdio_io_rw_extended_block(func, 1, addr, 1, (uint8_t *)&byte, 2); // 2 means 2byte
+ if (err != NULL) {
+ *err = ret;
+ }
+}
+
+uint16_t sdio_readw(struct rt_sdio_function *func, uint32_t addr, int *err)
+{
+ uint16_t val = 0;
+ if (func == NULL) {
+ *err = -EPARAMERR;
+ return 0xFFFF;
+ }
+ int ret = sdio_io_rw_extended_block(func, 0, addr, 1, (uint8_t *)&val, 2); // 2 means 2byte
+ if (err != NULL) {
+ *err = ret;
+ }
+
+ if (ret != 0) {
+ return 0xFFFF;
+ } else {
+ return val;
+ }
+}
+
+void sdio_writel(struct rt_sdio_function *func, uint32_t byte, uint32_t addr, int *err)
+{
+ if (func == NULL) {
+ *err = -EPARAMERR;
+ return;
+ }
+ int ret = sdio_io_rw_extended_block(func, 1, addr, 1, (uint8_t *)&byte, 4); // 4 means 4byte
+ if (err != NULL) {
+ *err = ret;
+ }
+}
+
+uint32_t sdio_readl(struct rt_sdio_function *func, uint32_t addr, int *err)
+{
+ uint32_t val = 0;
+ if (func == NULL) {
+ *err = -EPARAMERR;
+ return 0xFFFFFFFF;
+ }
+ int ret = sdio_io_rw_extended_block(func, 0, addr, 1, (uint8_t *)&val, 4); // 4 means 4byte
+ if (err != NULL) {
+ *err = ret;
+ }
+
+ if (ret != 0) {
+ return 0xFFFFFFFF;
+ } else {
+ return val;
+ }
+}
+
+int sdio_reset(struct rt_mmcsd_card *card)
+{
+ int error;
+ uint8_t out = 0;
+ if (card == NULL) {
+ return -EPARAMERR;
+ }
+ error = sdio_io_rw_direct(card, 0, 0, SDIO_REG_CCCR_IO_ABORT, &out, 0);
+ if (error != 0) {
+ out = 0x08;
+ } else {
+ out |= 0x08;
+ }
+ error = sdio_io_rw_direct(card, 1, 0, SDIO_REG_CCCR_IO_ABORT, &out, 0);
+ return error;
+}
+
+void hi_mmc_set_sdiom_clk_mode(sdiom_clk_cfg_e_type clk_type)
+{
+ if (clk_type < SDIO_HOST_HIGH_50MHZ_EMMC_HIGH_50MHZ || clk_type >= SDIOM_CLK_MODE_MAX_NUM) {
+ return;
+ }
+ mmc_set_sdiom_clk_mode((int)clk_type);
+}
+
+int32_t hi_mmc_switch_cmd(struct rt_mmcsd_card *card, uint32_t cmd_arg_val)
+{
+ int32_t err;
+ if (card == NULL || card->host == NULL) {
+ return -EPARAMERR;
+ }
+ struct rt_mmcsd_host *host = card->host;
+ struct rt_mmcsd_cmd cmd = { 0 };
+ uint32_t val, status;
+ uint32_t i = 0;
+
+ cmd.cmd_code = SWITCH;
+ cmd.arg = cmd_arg_val;
+ cmd.flags = RESP_R1 | CMD_AC;
+
+ err = mmcsd_send_cmd(host, &cmd, 1);
+ if (err != 0) {
+ return err;
+ } else {
+ for (i = 0; i < MMC_RETRY_TIMES; i++) {
+ err = mmc_send_status(card, ((uint32_t *)&val));
+ status = R1_CURRENT_STATE(val);
+ if ((err == 0) && (status == MMC_CURRENT_STATE_TRAN)) {
+ break;
+ } else {
+ LOG_E("get mmc status err=%d, status=%d", err, status);
+ uapi_tcxo_delay_ms(MMC_RETRY_DELAY);
+ }
+ }
+ }
+ if (i == MMC_RETRY_TIMES) {
+ return -1;
+ }
+ return 0;
+}
+
+int32_t hi_mmc_get_ext_csd(struct rt_mmcsd_card *card, void *ext_csd)
+{
+ struct rt_mmcsd_req req;
+ struct rt_mmcsd_cmd cmd;
+ struct rt_mmcsd_data data;
+ if (card == NULL || card->host == NULL || ext_csd == NULL) {
+ return -EPARAMERR;
+ }
+ memset_s(&req, sizeof(struct rt_mmcsd_req), 0, sizeof(struct rt_mmcsd_req));
+ memset_s(&cmd, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));
+ memset_s(&data, sizeof(struct rt_mmcsd_data), 0, sizeof(struct rt_mmcsd_data));
+
+ req.cmd = &cmd;
+ req.data = &data;
+ cmd.cmd_code = SEND_EXT_CSD;
+ cmd.arg = 0;
+ cmd.flags = RESP_SPI_R1 | RESP_R1 | CMD_ADTC;
+ data.blksize = SECTOR_SIZE;
+ data.blks = 1;
+ data.flags = DATA_DIR_READ;
+ data.buf = (uint32_t *)ext_csd;
+ data.timeout_ns = DATA_TRANSFER_TIMEOUT;
+ data.timeout_clks = 0;
+
+ mmcsd_send_request(card->host, &req);
+ if (cmd.err != 0) {
+ return cmd.err;
+ }
+ if (data.err != 0) {
+ return data.err;
+ }
+ return 0;
+}
+
+int32_t hi_mmc_gen_cmd(struct rt_mmcsd_card *card, uint32_t cmd_arg_val, uint32_t *data_buf)
+{
+ struct rt_mmcsd_req req;
+ struct rt_mmcsd_cmd cmd;
+ struct rt_mmcsd_data data;
+ if (card == NULL || card->host == NULL || data_buf == NULL) {
+ return -EPARAMERR;
+ }
+ memset_s(&req, sizeof(struct rt_mmcsd_req), 0, sizeof(struct rt_mmcsd_req));
+ memset_s(&cmd, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));
+ memset_s(&data, sizeof(struct rt_mmcsd_data), 0, sizeof(struct rt_mmcsd_data));
+
+ req.cmd = &cmd;
+ req.data = &data;
+ cmd.cmd_code = GEN_CMD;
+ cmd.arg = cmd_arg_val;
+ cmd.flags = RESP_R1 | CMD_ADTC;
+ data.blksize = SECTOR_SIZE;
+ data.blks = 1;
+ if ((cmd_arg_val & 0x1) != 0) {
+ data.flags = DATA_DIR_READ;
+ } else {
+ data.flags = DATA_DIR_WRITE;
+ }
+ data.buf = (uint32_t *)data_buf;
+ data.timeout_ns = DATA_TRANSFER_TIMEOUT;
+ data.timeout_clks = 0;
+
+ mmcsd_send_request(card->host, &req);
+ if (cmd.err != 0) {
+ return cmd.err;
+ }
+ if (data.err != 0) {
+ return data.err;
+ }
+ return 0;
+}
+
+int32_t hi_mmc_vendor_cmd(struct rt_mmcsd_card *card, uint32_t cmd_arg_val)
+{
+ int32_t err;
+ if (card == NULL || card->host == NULL) {
+ return -EPARAMERR;
+ }
+ struct rt_mmcsd_host *host = card->host;
+ struct rt_mmcsd_cmd cmd = { 0 };
+
+ cmd.cmd_code = VENDOR_CMD;
+ cmd.arg = cmd_arg_val;
+ cmd.flags = RESP_R1 | CMD_ADTC;
+
+ err = mmcsd_send_cmd(host, &cmd, 1);
+ if (err != 0) {
+ return err;
+ }
+ return 0;
+}
+
+uint32_t* hi_mmc_get_cid(struct rt_mmcsd_card *card)
+{
+ if (card == NULL) {
+ return NULL;
+ }
+ return (uint32_t*)(card->resp_cid);
+}
+
+void hi_mmc_set_driver_capability(struct rt_mmcsd_host* host, emmc_phy_driver_capability_e_type cap)
+{
+ if (host == NULL) {
+ return;
+ }
+ mmc_set_driver_capability(host, (uint32_t)cap);
+}
+
+int32_t hi_mmc_set_block_count(struct rt_mmcsd_card *card, uint32_t blk_cnt, uint8_t reliable_write_flag)
+{
+ int32_t err;
+ struct rt_mmcsd_cmd cmd = { 0 };
+
+ cmd.cmd_code = SET_BLOCK_COUNT;
+ if (reliable_write_flag == 1) {
+ cmd.arg = blk_cnt | SET_RELIABLE_WRITE;
+ } else {
+ cmd.arg = blk_cnt;
+ }
+ cmd.flags = RESP_R1 | CMD_AC;
+ err = mmcsd_send_cmd(card->host, &cmd, 3); // retry 3 times
+ if (err) {
+ LOG_E("cmd23 status err=%d, resp=%x", err, cmd.resp[0]);
+ }
+ return err;
+}
+
+int32_t hi_mmc_rpmb_ioctl(struct rt_mmcsd_card *card, rpmb_data_t *rpmb_data, ioctl_data_t io_data)
+{
+ struct rt_mmcsd_cmd cmd, stop;
+ struct rt_mmcsd_data data;
+ struct rt_mmcsd_req req;
+ struct rt_mmcsd_host *host = card->host;
+ int32_t err;
+ uint32_t status;
+
+ memset_s(&req, sizeof(struct rt_mmcsd_req), 0, sizeof(struct rt_mmcsd_req));
+ memset_s(&cmd, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));
+ memset_s(&stop, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));
+ memset_s(&data, sizeof(struct rt_mmcsd_data), 0, sizeof(struct rt_mmcsd_data));
+ req.cmd = &cmd;
+ req.data = &data;
+
+ mmcsd_host_lock(host);
+ cmd.arg = io_data.sector;
+ cmd.flags = RESP_R1 | CMD_ADTC;
+ data.blksize = SECTOR_SIZE;
+ data.blks = io_data.blks;
+
+ if (io_data.rw_flag == MMC_READ) {
+ cmd.cmd_code = READ_MULTIPLE_BLOCK;
+ data.flags |= DATA_DIR_READ;
+ } else {
+ cmd.cmd_code = WRITE_MULTIPLE_BLOCK;
+ data.flags |= DATA_DIR_WRITE;
+ }
+ mmcsd_set_data_timeout(&data, card);
+ data.buf = (uint32_t *)rpmb_data;
+ if (io_data.reliable_flag == 1) {
+ hi_mmc_set_block_count(card, 1, 1);
+ } else {
+ hi_mmc_set_block_count(card, 1, 0);
+ }
+ mmcsd_send_request(host, &req);
+ mmcsd_host_unlock(host);
+ if ((cmd.err != 0) || (data.err != 0) || (stop.err != 0)) {
+ LOG_E("cmd.err=%x, data.err=%x, stop.err=%x\r\n", cmd.err, data.err, stop.err);
+ return -1;
+ }
+
+ do {
+ err = mmc_send_status(card, (uint32_t *)&status);
+ if (err) {
+ return err;
+ }
+ } while (((status & R1_READY_FOR_DATA) == 0) || (hi_mmc_card_busy(card->host) != 0));
+
+ return 0;
+}
+
+int32_t hi_mmc_write_rpmb(struct rt_mmcsd_card *card, uint32_t sector, uint32_t blks,
+ rpmb_data_t *rpmb_data, uint8_t reliable_flag)
+{
+ int32_t err = 0;
+ ioctl_data_t io_data;
+ io_data.sector = sector;
+ io_data.rw_flag = MMC_WRITE;
+ io_data.blks = blks;
+ io_data.reliable_flag = reliable_flag;
+ err = hi_mmc_rpmb_ioctl(card, rpmb_data, io_data);
+ return err;
+}
+
+int32_t hi_mmc_read_rpmb(struct rt_mmcsd_card *card, uint32_t sector, uint32_t blks, rpmb_data_t *rpmb_data)
+{
+ int32_t err = 0;
+ ioctl_data_t io_data;
+ io_data.sector = sector;
+ io_data.rw_flag = MMC_READ;
+ io_data.blks = blks;
+ io_data.reliable_flag = 0;
+ err = hi_mmc_rpmb_ioctl(card, rpmb_data, io_data);
+ return err;
+}
+
+int32_t hi_mmc_rpmb_get_write_counter(struct rt_mmcsd_card *card, uint32_t *counter, uint32_t *result)
+{
+ int err = 0;
+ memset_s(&g_rpmb_data, sizeof(rpmb_data_t), 0, sizeof(rpmb_data_t));
+ g_rpmb_data.req_resp = (WRITE_COUNTER_READ_REQ << OFFSET_8);
+
+ err = hi_mmc_write_rpmb(card, 0, 1, &g_rpmb_data, 0);
+ if (err != 0) {
+ LOG_E("mmc write rpmb error, err=%d", err);
+ return err;
+ }
+
+ err = hi_mmc_read_rpmb(card, 0, 1, &g_rpmb_data);
+ if (err != 0) {
+ LOG_E("mmc read rpmb error, err=%d", err);
+ return err;
+ }
+
+ *counter = (g_rpmb_data.write_cnt & 0x000000FF) << OFFSET_24;
+ *counter |= (g_rpmb_data.write_cnt & 0x0000FF00) << OFFSET_8;
+ *counter |= (g_rpmb_data.write_cnt & 0x00FF0000) >> OFFSET_8;
+ *counter |= (g_rpmb_data.write_cnt & 0xFF000000) >> OFFSET_24;
+ *result = (((g_rpmb_data.op_result & 0xff) << OFFSET_8) | ((g_rpmb_data.op_result & 0xff00) >> OFFSET_8));
+ LOG_I("mmc rpmb request=%d, writecounter=%x, result=%d",
+ g_rpmb_data.req_resp, g_rpmb_data.write_cnt, g_rpmb_data.op_result);
+
+ return err;
+}
+
+int32_t hi_mmc_rpmb_set_key(struct rt_mmcsd_card *card, uint8_t *key, uint32_t *result)
+{
+ int err = 0;
+ memset_s(&g_rpmb_data, sizeof(rpmb_data_t), 0, sizeof(rpmb_data_t));
+
+ for (uint8_t i = 0; i < MAC_KEY_LEN; i++) {
+ g_rpmb_data.mac_key[i] = ((char *)key)[i];
+ }
+
+ g_rpmb_data.req_resp = (AUTH_KEY_REQ << OFFSET_8);
+
+ err = hi_mmc_write_rpmb(card, 0, 1, &g_rpmb_data, 1);
+ if (err != 0) {
+ LOG_E("mmc write rpmb error, err=%d", err);
+ return err;
+ }
+
+ memset_s(&g_rpmb_data, sizeof(rpmb_data_t), 0, sizeof(rpmb_data_t));
+ g_rpmb_data.req_resp = (RESULT_READ_REQ << OFFSET_8);
+ err = hi_mmc_write_rpmb(card, 0, 1, &g_rpmb_data, 0);
+ if (err != 0) {
+ LOG_E("mmc write rpmb error, err=%d", err);
+ return err;
+ }
+ err = hi_mmc_read_rpmb(card, 0, 1, &g_rpmb_data);
+ if (err != 0) {
+ LOG_E("mmc read rpmb error, err=%d", err);
+ return err;
+ }
+
+ *result = (((g_rpmb_data.op_result & 0xff) << OFFSET_8) | ((g_rpmb_data.op_result & 0xff00) >> OFFSET_8));
+ LOG_I("mmc rpmb request=%d, result=%d", g_rpmb_data.req_resp, g_rpmb_data.op_result);
+
+ return err;
+}
+
+int32_t hi_mmc_rpmb_cmp_key(uint8_t *key)
+{
+ UNUSED(key);
+ uint8_t auth_data[HMAC_AUTH_DATA_LEN] = { 0 };
+ int32_t err = 0;
+ uint8_t hmac[MAC_KEY_LEN] = { 0 };
+ uint8_t *tmp_data = (uint8_t *)g_rpmb_data.data;
+
+ err = memcpy_s(auth_data, HMAC_AUTH_DATA_LEN, tmp_data, HMAC_AUTH_DATA_LEN);
+ if (err != 0) {
+ LOG_E("hi_mmc_rpmb_cmp_key memcpy error, err=%d", err);
+ return -1;
+ }
+#ifdef MEDTLS_MD
+ err = mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA256),
+ key, MAC_KEY_LEN, auth_data, HMAC_AUTH_DATA_LEN, hmac);
+#endif
+ if (err != 0) {
+ LOG_E("mbedtls hmac error, err=%d", err);
+ return -1;
+ }
+ err = memcmp(g_rpmb_data.mac_key, hmac, MAC_KEY_LEN);
+ if (err != 0) {
+ LOG_E("rpmb key check error, err=%d", err);
+ return -1;
+ }
+ return 0;
+}
+
+void hi_mmc_err_recovery(void)
+{
+ struct rt_mmcsd_host *mmc = hi_mmc_get_host(SDIO_EMMC_ID);
+ int32_t non_recovery_flag = 0;
+ int32_t ret = 0;
+ uint32_t status, val, i;
+ if (mmc == NULL || mmc->card == NULL) {
+ LOG_E("get mmc error for getcardstate");
+ return ;
+ }
+ g_req_flag = 0;
+ // 1. make sure the data has been transfered completed.
+ for (i = 0; i < MMC_RETRY_TIMES; i++) {
+ ret = mmc_send_status(mmc->card, ((uint32_t *)&val));
+ status = R1_CURRENT_STATE(val);
+ if ((ret == 0) && (status == MMC_CURRENT_STATE_TRAN)) {
+ return;
+ } else {
+ uapi_tcxo_delay_ms(MMC_RETRY_DELAY);
+ }
+ }
+ LOG_E("wait to transfer the data, get mmc status err=%d, status=%d", ret, status);
+ // 2. make the host to reset CMD and DATA
+ if (mmc_detect_bus_error(mmc)) {
+ hi_mmc_reset_cmd_data(mmc); // reset the data and cmd line;
+ }
+ // 3. make the device to revovery to normal(CMD12)
+ for (i = 0; i < MMC_RETRY_TIMES; i++) {
+ ret = hi_mmc_send_stop_cmd(mmc, &status); // send cmd12 to stop the transmission
+ if ((ret == 0) && (R1_CURRENT_STATE(status) == MMC_CURRENT_STATE_TRAN)) {
+ LOG_E("recovery send cmd12 err=%d, status=%d", ret, status);
+ break;
+ }
+ uapi_tcxo_delay_ms(MMC_RETRY_DELAY);
+ }
+ LOG_E("wait to send cmd12, get mmc status err=%d, status=%d", ret, status);
+ if (i == MMC_RETRY_TIMES) { non_recovery_flag = 1; }
+ // 4. at last, judge host if it is ok, if not, record the flag to shareram.
+ if (non_recovery_flag == 1) { // emmc cannot recovery, need re-initial the device
+ hi_mmc_set_err_to_aon_area();
+ }
+}
+
+mmc_err_info_type_t* hi_mmc_get_emmc_failed_info(void)
+{
+ return hi_mmc_get_err_from_aon_area();
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2018-2020. All rights reserved.\r
+ * Description: MMC BLOCK HEADER FILE\r
+ * Author:\r
+ * Create: 2020-04\r
+ */\r
+#ifndef MMC_BLOCK_H\r
+#define MMC_BLOCK_H\r
+#include "drv_mmc_adapter.h"\r
+\r
+typedef enum {\r
+ PART_CONFIG_AREA_DEFAULT = 0x0,\r
+ PART_CONFIG_AREA_BOOT1 = 0x1,\r
+ PART_CONFIG_AREA_BOOT2 = 0x2,\r
+ PART_CONFIG_AREA_RPMB = 0x3,\r
+} PART_CONFIG_AREA;\r
+\r
+typedef enum {\r
+ SDIO_HOST_HIGH_50MHZ_EMMC_HIGH_50MHZ,\r
+ SDIO_HOST_HIGH_50MHZ_EMMC_LOW_32MHZ,\r
+ SDIO_HOST_LOW_32MHZ_EMMC_HIGH_50MHZ,\r
+ SDIO_HOST_LOW_32MHZ_EMMC_LOW_32MHZ, // closed pll\r
+ SDIOM_CLK_MODE_MAX_NUM = HAL_SDIOM_CLK_MODE_MAX_NUM\r
+} sdiom_clk_cfg_e_type;\r
+\r
+typedef enum {\r
+ EMMC_PHY_IOCTL_DRIVER_CAPABILITY_0,\r
+ EMMC_PHY_IOCTL_DRIVER_CAPABILITY_1,\r
+ EMMC_PHY_IOCTL_DRIVER_CAPABILITY_2,\r
+ EMMC_PHY_IOCTL_DRIVER_CAPABILITY_3,\r
+ EMMC_PHY_IOCTL_DRIVER_CAPABILITY_4,\r
+ EMMC_PHY_IOCTL_DRIVER_CAPABILITY_5,\r
+ EMMC_PHY_IOCTL_DRIVER_CAPABILITY_6,\r
+ EMMC_PHY_IOCTL_DRIVER_CAPABILITY_7,\r
+} emmc_phy_driver_capability_e_type;\r
+\r
+typedef enum {\r
+ EMMC_SLEEP_DISABLE = 0,\r
+ EMMC_SLEEP_ENABLE = 1,\r
+} emmc_sleep_mode_e_type;\r
+\r
+int hi_mmc_init(struct rt_mmcsd_host *mmc);\r
+\r
+int hi_mmc_deinit(struct rt_mmcsd_host *mmc);\r
+\r
+int hi_mmc_get_cardstatus(void);\r
+\r
+int hi_mmc_erase(uint32_t start_sector, uint32_t nsectors, uint32_t type);\r
+\r
+int mmc_erase_arae(struct rt_mmcsd_card *card, const struct rt_mmcsd_req *req);\r
+\r
+int hi_mmc_set_ext_csd_partition_config(PART_CONFIG_AREA area);\r
+\r
+int hi_mmc_sleep_awake(emmc_sleep_mode_e_type sleep_enable);\r
+\r
+int sdio_read_fifo_block(struct rt_sdio_function *func, void *dst, uint32_t addr, uint32_t size);\r
+\r
+int sdio_write_fifo_block(struct rt_sdio_function *func, uint32_t addr, void *src, uint32_t size);\r
+\r
+int hi_sdio_io_rw_direct(struct rt_mmcsd_card *card, int writeflag, uint32_t fn,\r
+ uint32_t addr, uint8_t in, uint8_t *out);\r
+\r
+void sdio_writeb(struct rt_sdio_function *func, uint8_t byte, uint32_t addr, int *err);\r
+\r
+uint8_t sdio_readb(struct rt_sdio_function *func, uint32_t addr, int *err);\r
+\r
+int sdio_writesb(struct rt_sdio_function *func, uint32_t addr, void *src, uint32_t size);\r
+\r
+int sdio_readsb(struct rt_sdio_function *func, void *dst, uint32_t addr, uint32_t size);\r
+\r
+int sdio_memcpy_fromio(struct rt_sdio_function *func, void *dst, uint32_t addr, uint32_t size);\r
+\r
+void sdio_writew(struct rt_sdio_function *func, uint16_t byte, uint32_t addr, int *err);\r
+\r
+uint16_t sdio_readw(struct rt_sdio_function *func, uint32_t addr, int *err);\r
+\r
+void sdio_writel(struct rt_sdio_function *func, uint32_t byte, uint32_t addr, int *err);\r
+\r
+uint32_t sdio_readl(struct rt_sdio_function *func, uint32_t addr, int *err);\r
+\r
+int sdio_reset(struct rt_mmcsd_card *card);\r
+\r
+void hi_mmc_set_sdiom_clk_mode(sdiom_clk_cfg_e_type clk_type);\r
+\r
+int32_t hi_mmc_switch_cmd(struct rt_mmcsd_card *card, uint32_t cmd_arg_val);\r
+\r
+int32_t hi_mmc_get_ext_csd(struct rt_mmcsd_card *card, void *ext_csd);\r
+\r
+int32_t hi_mmc_vendor_cmd(struct rt_mmcsd_card *card, uint32_t cmd_arg_val);\r
+\r
+int32_t hi_mmc_gen_cmd(struct rt_mmcsd_card *card, uint32_t cmd_arg_val, uint32_t *data_buf);\r
+\r
+uint32_t* hi_mmc_get_cid(struct rt_mmcsd_card *card);\r
+\r
+void hi_mmc_set_driver_capability(struct rt_mmcsd_host* host, emmc_phy_driver_capability_e_type cap);\r
+\r
+int32_t hi_mmc_rpmb_get_write_counter(struct rt_mmcsd_card *card, uint32_t *counter, uint32_t *result);\r
+\r
+int32_t hi_mmc_rpmb_set_key(struct rt_mmcsd_card *card, uint8_t *key, uint32_t *result);\r
+\r
+int32_t hi_mmc_rpmb_cmp_key(uint8_t *key);\r
+\r
+void hi_mmc_err_recovery(void);\r
+\r
+mmc_err_info_type_t* hi_mmc_get_emmc_failed_info(void);\r
+#endif\r
--- /dev/null
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier : Apache-2.0
+ *
+ * Change Logs :
+ * Date Author Notes
+ * 2011-07-25 weety first version
+ */
+
+#ifndef __MMCSD_CARD_H__
+#define __MMCSD_CARD_H__
+
+#include "mmcsd_host.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define SD_SCR_BUS_WIDTH_1 (1 << 0)
+#define SD_SCR_BUS_WIDTH_4 (1 << 2)
+#define EXT_CSD_LEN_BY_4BYTES 128
+
+struct rt_mmcsd_cid {
+ uint8_t mid; /* ManufacturerID */
+ uint8_t prv; /* Product Revision */
+ uint16_t oid; /* OEM/Application ID */
+ uint32_t psn; /* Product Serial Number */
+ uint8_t pnm[5]; /* Product Name */
+ uint8_t reserved1; /* reserved */
+ uint16_t mdt; /* Manufacturing Date */
+ uint8_t crc; /* CID CRC */
+ uint8_t reserved2; /* not used, always 1 */
+};
+
+struct rt_mmcsd_csd {
+ uint8_t csd_structure; /* CSD register version */
+ uint8_t spec_vers;
+ uint8_t taac;
+ uint8_t nsac;
+ uint8_t tran_speed; /* max data transfer rate */
+ uint16_t card_cmd_class; /* card command classes */
+ uint8_t rd_blk_len; /* max read data block length */
+ uint8_t rd_blk_part;
+ uint8_t wr_blk_misalign;
+ uint8_t rd_blk_misalign;
+ uint8_t dsr_imp; /* DSR implemented */
+ uint8_t c_size_mult; /* CSD 1.0 , device size multiplier */
+ uint32_t c_size; /* device size */
+ uint8_t r2w_factor;
+ uint8_t wr_blk_len; /* max wtire data block length */
+ uint8_t wr_blk_partial;
+ uint8_t csd_crc;
+};
+
+struct rt_sd_scr {
+ uint8_t sd_version;
+ uint8_t sd_bus_widths;
+};
+
+struct rt_sdio_cccr {
+ uint8_t sdio_version;
+ uint8_t sd_version;
+ uint8_t direct_cmd : 1, /* Card Supports Direct Commands during data transfer
+ only SD mode, not used for SPI mode */
+ multi_block : 1, /* Card Supports Multi-Block */
+ read_wait : 1, /* Card Supports Read Wait
+ only SD mode, not used for SPI mode */
+ suspend_resume : 1, /* Card supports Suspend/Resume
+ only SD mode, not used for SPI mode */
+ s4mi : 1, /* generate interrupts during a 4-bit
+ multi-block data transfer */
+ e4mi : 1, /* Enable the multi-block IRQ during
+ 4-bit transfer for the SDIO card */
+ low_speed : 1, /* Card is a Low-Speed card */
+ low_speed_4 : 1; /* 4-bit support for Low-Speed cards */
+
+ uint8_t bus_width : 1, /* Support SDIO bus width, 1 : 4bit, 0 : 1bit */
+ cd_disable : 1, /* Connect[0]/Disconnect[1] the 10K-90K ohm pull-up
+ resistor on CD/DAT[3] (pin 1) of the card */
+ power_ctrl : 1, /* Support Master Power Control */
+ high_speed : 1; /* Support High-Speed */
+};
+
+struct rt_sdio_cis {
+ uint16_t manufacturer;
+ uint16_t product;
+ uint16_t func0_blk_size;
+ uint32_t max_tran_speed;
+};
+
+/*
+ * SDIO function CIS tuple (unknown to the core)
+ */
+struct rt_sdio_function_tuple {
+ struct rt_sdio_function_tuple *next;
+ uint8_t code;
+ uint8_t size;
+ uint8_t *data;
+};
+
+struct rt_sdio_function;
+typedef void (rt_sdio_irq_handler_t)(struct rt_sdio_function *);
+
+/*
+ * SDIO function devices
+ */
+struct rt_sdio_function {
+ struct rt_mmcsd_card *card; /* the card this device belongs to */
+ rt_sdio_irq_handler_t *irq_handler; /* IRQ callback */
+ uint8_t num; /* function number */
+
+ uint8_t func_code; /* Standard SDIO Function interface code */
+ uint16_t manufacturer; /* manufacturer id */
+ uint16_t product; /* product id */
+
+ uint32_t max_blk_size; /* maximum block size */
+ uint32_t cur_blk_size; /* current block size */
+
+ uint32_t enable_timeout_val; /* max enable timeout in msec */
+
+ struct rt_sdio_function_tuple *tuples;
+
+ void *priv;
+};
+
+#define SDIO_MAX_FUNCTIONS 7
+
+struct rt_mmcsd_ext_csd {
+ uint8_t rev;
+ uint8_t erase_group_def;
+ uint8_t sec_feature_support;
+ uint8_t rel_sectors;
+ uint8_t rel_param;
+ uint8_t part_config;
+ uint8_t cache_ctrl;
+ uint8_t rst_n_function;
+ uint32_t part_time_ms; /* ms */
+ uint32_t sa_timeout_ns; /* 100ns */
+ uint32_t generic_cmd6_time_ms; /* 10ms */
+ uint32_t power_off_longtime_ms; /* ms */
+ uint32_t hs_max_dtr;
+ uint32_t sectors;
+ uint32_t card_type;
+ uint32_t hc_erase_size; /* In sectors */
+ uint32_t hc_erase_timeout; /* In milliseconds */
+ uint32_t sec_trim_mult; /* Secure trim multiplier */
+ uint32_t sec_erase_mult; /* Secure erase multiplier */
+ uint32_t trim_timeout; /* In milliseconds */
+ bool enhanced_area_en; /* enable bit */
+ uint64_t enhanced_area_offset; /* Units : Byte */
+ uint32_t enhanced_area_size; /* Units : KB */
+ uint32_t cache_size; /* Units : KB */
+ bool hpi_en; /* HPI enablebit */
+ bool hpi; /* HPI support bit */
+ uint32_t hpi_cmd; /* cmd used as HPI */
+ uint32_t data_sector_size; /* 512 bytes or 4KB */
+ uint32_t data_tag_unit_size; /* DATA TAG UNIT size */
+ uint32_t boot_ro_lock; /* ro lock support */
+ uint32_t boot_size;
+ uint8_t raw_partition_support; /* 160 */
+ uint8_t raw_erased_mem_count; /* 181 */
+ uint8_t strobe_support; /* 184 */
+ uint8_t raw_ext_csd_structure; /* 194 */
+ uint8_t raw_card_type; /* 196 */
+ uint8_t out_of_int_time; /* 198 */
+ uint8_t raw_s_a_timeout; /* 217 */
+ uint8_t raw_hc_erase_gap_size; /* 221 */
+ uint8_t raw_erase_timeout_mult; /* 223 */
+ uint8_t raw_hc_erase_grp_size; /* 224 */
+ uint8_t raw_sec_trim_mult; /* 229 */
+ uint8_t raw_sec_erase_mult; /* 230 */
+ uint8_t raw_sec_feature_support; /* 231 */
+ uint8_t raw_trim_mult; /* 232 */
+ uint8_t raw_sectors[4]; /* 212 - 4 bytes */
+};
+
+
+struct rt_mmcsd_card {
+ struct rt_mmcsd_host *host;
+ uint32_t rca; /* card addr */
+ uint32_t resp_cid[4]; /* card CID register */
+ uint32_t resp_csd[4]; /* card CSD register */
+ uint32_t resp_scr[2]; /* card SCR register */
+
+ uint16_t tacc_clks; /* data access time by ns */
+ uint32_t tacc_ns; /* data access time by clk cycles */
+ uint32_t max_data_rate; /* max data transfer rate */
+ uint32_t card_capacity; /* card capacity, unit : KB */
+ uint32_t card_blksize; /* card block size */
+ uint32_t erase_size; /* erase size in sectors */
+ uint16_t card_type;
+#define CARD_TYPE_MMC 0 /* MMC card */
+#define CARD_TYPE_SD 1 /* SD card */
+#define CARD_TYPE_SDIO 2 /* SDIO card */
+#define CARD_TYPE_SDIO_COMBO 3 /* SD combo (IO+mem) card */
+
+ uint16_t flags;
+#define CARD_FLAG_HIGHSPEED (1 << 0) /* SDIO bus speed 50MHz */
+#define CARD_FLAG_SDHC (1 << 1) /* SDHC card */
+#define CARD_FLAG_SDXC (1 << 2) /* SDXC card */
+
+ struct rt_sd_scr scr;
+ struct rt_mmcsd_csd csd;
+ uint32_t hs_max_data_rate; /* max data transfer rate in high speed mode */
+ struct rt_mmcsd_ext_csd ext_csd;
+ uint32_t ext_csd_val[EXT_CSD_LEN_BY_4BYTES];
+ uint8_t sdio_function_num; /* totol number of SDIO functions */
+ struct rt_sdio_cccr cccr; /* common card info */
+ struct rt_sdio_cis cis; /* common tuple info */
+ struct rt_sdio_function *sdio_function[SDIO_MAX_FUNCTIONS + 1]; /* SDIO functions (devices) */
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2011-07-25 weety first version
+ */
+
+#ifndef __CMD_H__
+#define __CMD_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ /* class 1 */
+#define GO_IDLE_STATE 0 /* bc */
+#define SEND_OP_COND 1 /* bcr [31:0] OCR R3 */
+#define ALL_SEND_CID 2 /* bcr R2 */
+#define SET_RELATIVE_ADDR 3 /* ac [31:16] RCA R1 */
+#define SET_DSR 4 /* bc [31:16] RCA */
+#define SLEEP_AWAKE 5 /* bc [31:16] RCA sleep/awake stuff bits R1 */
+#define SWITCH 6 /* ac [31:0] See below R1b */
+#define SELECT_CARD 7 /* ac [31:16] RCA R1 */
+#define SEND_EXT_CSD 8 /* adtc R1 */
+#define SEND_CSD 9 /* ac [31:16] RCA R2 */
+#define SEND_CID 10 /* ac [31:16] RCA R2 */
+#define READ_DAT_UNTIL_STOP 11 /* adtc [31:0] dadr R1 */
+#define STOP_TRANSMISSION 12 /* ac R1b */
+#define SEND_STATUS 13 /* ac [31:16] RCA R1 */
+#define GO_INACTIVE_STATE 15 /* ac [31:16] RCA */
+#define SPI_READ_OCR 58 /* spi spi_R3 */
+#define SPI_CRC_ON_OFF 59 /* spi [0:0] flag spi_R1 */
+
+ /* class 2 */
+#define SET_BLOCKLEN 16 /* ac [31:0] block len R1 */
+#define READ_SINGLE_BLOCK 17 /* adtc [31:0] data addr R1 */
+#define READ_MULTIPLE_BLOCK 18 /* adtc [31:0] data addr R1 */
+#define SEND_TUNING_BLOCK 19 /* adtc R1 */
+#define SEND_TUNING_BLOCK_HS200 21 /* adtc R1 */
+ /* class 3 */
+#define WRITE_DAT_UNTIL_STOP 20 /* adtc [31:0] data addr R1 */
+
+ /* class 4 */
+#define SET_BLOCK_COUNT 23 /* adtc [31:0] data addr R1 */
+#define WRITE_BLOCK 24 /* adtc [31:0] data addr R1 */
+#define WRITE_MULTIPLE_BLOCK 25 /* adtc R1 */
+#define PROGRAM_CID 26 /* adtc R1 */
+#define PROGRAM_CSD 27 /* adtc R1 */
+
+ /* class 6 */
+#define SET_WRITE_PROT 28 /* ac [31:0] data addr R1b */
+#define CLR_WRITE_PROT 29 /* ac [31:0] data addr R1b */
+#define SEND_WRITE_PROT 30 /* adtc [31:0] wpdata addr R1 */
+
+ /* class 5 */
+#define ERASE_GROUP_START 35 /* ac [31:0] data addr R1 */
+#define ERASE_GROUP_END 36 /* ac [31:0] data addr R1 */
+#define ERASE 38 /* ac R1b */
+
+ /* class 9 */
+#define FAST_IO 39 /* ac <Complex> R4 */
+#define GO_IRQ_STATE 40 /* bcr R5 */
+
+ /* class 7 */
+#define LOCK_UNLOCK 42 /* adtc R1b */
+
+ /* class 8 */
+#define APP_CMD 55 /* ac [31:16] RCA R1 */
+#define GEN_CMD 56 /* adtc [0] RD/WR R1 */
+
+
+/* SD commands type argument response */
+ /* class 0 */
+/* This is basically the same command as for MMC with some quirks. */
+#define SD_SEND_RELATIVE_ADDR 3 /* bcr R6 */
+#define SD_SEND_IF_COND 8 /* bcr [11:0] See below R7 */
+
+ /* class 10 */
+#define SD_SWITCH 6 /* adtc [31:0] See below R1 */
+
+ /* Application commands */
+#define SD_APP_SET_BUS_WIDTH 6 /* ac [1:0] bus width R1 */
+#define SD_APP_SEND_NUM_WR_BLKS 22 /* adtc R1 */
+#define SD_APP_OP_COND 41 /* bcr [31:0] OCR R3 */
+#define SD_APP_SEND_SCR 51 /* adtc R1 */
+
+#define SCR_SPEC_VER_0 0 /* Implements system specification 1.0 - 1.01 */
+#define SCR_SPEC_VER_1 1 /* Implements system specification 1.10 */
+#define SCR_SPEC_VER_2 2 /* Implements system specification 2.00 */
+
+
+/* SDIO commands type argument response */
+#define SD_IO_SEND_OP_COND 5 /* bcr [23:0] OCR R4 */
+#define SD_IO_RW_DIRECT 52 /* ac [31:0] See below R5 */
+#define SD_IO_RW_EXTENDED 53 /* adtc [31:0] See below R5 */
+
+
+/* CMD52 arguments */
+#define SDIO_ARG_CMD52_READ (0<<31)
+#define SDIO_ARG_CMD52_WRITE (1u<<31)
+#define SDIO_ARG_CMD52_FUNC_SHIFT 28
+#define SDIO_ARG_CMD52_FUNC_MASK 0x7
+#define SDIO_ARG_CMD52_RAW_FLAG (1u<<27)
+#define SDIO_ARG_CMD52_REG_SHIFT 9
+#define SDIO_ARG_CMD52_REG_MASK 0x1ffff
+#define SDIO_ARG_CMD52_DATA_SHIFT 0
+#define SDIO_ARG_CMD52_DATA_MASK 0xff
+#define SDIO_R5_DATA(resp) ((resp)[0] & 0xff)
+
+/* CMD53 arguments */
+#define SDIO_ARG_CMD53_READ (0<<31)
+#define SDIO_ARG_CMD53_WRITE (1u<<31)
+#define SDIO_ARG_CMD53_FUNC_SHIFT 28
+#define SDIO_ARG_CMD53_FUNC_MASK 0x7
+#define SDIO_ARG_CMD53_BLOCK_MODE (1u<<27)
+#define SDIO_ARG_CMD53_INCREMENT (1u<<26)
+#define SDIO_ARG_CMD53_REG_SHIFT 9
+#define SDIO_ARG_CMD53_REG_MASK 0x1ffff
+#define SDIO_ARG_CMD53_LENGTH_SHIFT 0
+#define SDIO_ARG_CMD53_LENGTH_MASK 0x1ff
+#define SDIO_ARG_CMD53_LENGTH_MAX 511
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2011-07-25 weety first version
+ */
+
+#include "mmcsd_core.h"
+#include "hal_mmc_common.h"
+#include "mmc.h"
+
+#define DBG_TAG "SDIO"
+#ifdef RT_SDIO_DEBUG
+#define DBG_LVL DBG_LOG
+#else
+#define DBG_LVL DBG_INFO
+#endif /* RT_SDIO_DEBUG */
+
+#ifndef RT_MMCSD_STACK_SIZE
+#define RT_MMCSD_STACK_SIZE 1024
+#endif
+#ifndef RT_MMCSD_THREAD_PREORITY
+#if (RT_THREAD_PRIORITY_MAX == 32)
+#define RT_MMCSD_THREAD_PREORITY 0x16
+#else
+#define RT_MMCSD_THREAD_PREORITY 0x40
+#endif
+#endif
+#define EMMC_PINMUX_NUM 10
+#define DELAY_10MS 10
+#define TIME_1000 1000
+
+const uint8_t __lowest_bit_bitmap[] = {
+ 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 00 */
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 10 */
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 20 */
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 30 */
+ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 40 */
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 50 */
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 60 */
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 70 */
+ 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 80 */
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 90 */
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* A0 */
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* B0 */
+ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* C0 */
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* D0 */
+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* E0 */
+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 /* F0 */
+};
+
+/**
+ * This function finds the first bit set (beginning with the least significant bit)
+ * in value and return the index of that bit.
+ *
+ * Bits are numbered starting at 1 (the least significant bit). A return value of
+ * zero from any of these functions means that the argument was zero.
+ *
+ * @return return the index of the first bit set. If value is 0, then this function
+ * shall return 0.
+ */
+static int __rt_ffs(int value)
+{
+ if (value == 0) { return 0; }
+
+ if (value & 0xff) {
+ return __lowest_bit_bitmap[value & 0xff] + 1;
+ }
+
+ if (value & 0xff00) {
+ return __lowest_bit_bitmap[(value & 0xff00) >> 8] + 9; // 8 9
+ }
+
+ if (value & 0xff0000) {
+ return __lowest_bit_bitmap[(value & 0xff0000) >> 16] + 17; // 16 17
+ }
+
+ return __lowest_bit_bitmap[(value & 0xff000000) >> 24] + 25; // 24 25
+}
+
+int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card)
+{
+ UNUSED(card);
+ return 0;
+}
+
+void rt_mmcsd_blk_remove(struct rt_mmcsd_card *card)
+{
+ UNUSED(card);
+}
+
+void mmcsd_host_lock(struct rt_mmcsd_host *host)
+{
+ if (host->flags & MMCSD_NO_USE_MUTEX) {
+ return;
+ }
+ non_os_enter_critical();
+}
+
+void mmcsd_host_unlock(struct rt_mmcsd_host *host)
+{
+ if (host->flags & MMCSD_NO_USE_MUTEX) {
+ return;
+ }
+ non_os_exit_critical();
+}
+
+void mmcsd_req_complete(struct rt_mmcsd_host *host)
+{
+ UNUSED(host);
+}
+
+void mmcsd_send_request(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req)
+{
+ do {
+ req->cmd->retries--;
+ req->cmd->err = 0;
+ req->cmd->mrq = req;
+ if (req->data) {
+ req->cmd->data = req->data;
+ req->data->err = 0;
+ req->data->mrq = req;
+ if (req->stop) {
+ req->data->stop = req->stop;
+ req->stop->err = 0;
+ req->stop->mrq = req;
+ }
+ }
+ host->ops->request(host, req);
+ } while (req->cmd->err && (req->cmd->retries > 0));
+}
+
+int32_t mmcsd_send_cmd(struct rt_mmcsd_host *host, struct rt_mmcsd_cmd *cmd, int retries)
+{
+ struct rt_mmcsd_req req;
+
+ (void)memset_s(&req, sizeof(struct rt_mmcsd_req), 0, sizeof(struct rt_mmcsd_req));
+ (void)memset_s(cmd->resp, sizeof(cmd->resp), 0, sizeof(cmd->resp));
+ cmd->retries = retries;
+
+ req.cmd = cmd;
+ cmd->data = RT_NULL;
+
+ mmcsd_send_request(host, &req);
+ return cmd->err;
+}
+
+int32_t mmcsd_go_idle(struct rt_mmcsd_host *host)
+{
+ int32_t err;
+ struct rt_mmcsd_cmd cmd;
+
+ if (!controller_is_spi(host)) {
+ mmcsd_set_chip_select(host, MMCSD_CS_HIGH);
+ uapi_tcxo_delay_ms(1);
+ }
+
+ (void)memset_s(&cmd, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));
+
+ cmd.cmd_code = GO_IDLE_STATE;
+ cmd.arg = 0;
+ cmd.flags = RESP_SPI_R1 | RESP_NONE | CMD_BC;
+
+ err = mmcsd_send_cmd(host, &cmd, 0);
+ uapi_tcxo_delay_ms(1);
+ if (!controller_is_spi(host)) {
+ mmcsd_set_chip_select(host, MMCSD_CS_IGNORE);
+ uapi_tcxo_delay_ms(1);
+ }
+
+ return err;
+}
+
+int32_t mmcsd_spi_read_ocr(struct rt_mmcsd_host *host, int32_t high_capacity, uint32_t *ocr)
+{
+ struct rt_mmcsd_cmd cmd;
+ int32_t err;
+
+ (void)memset_s(&cmd, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));
+ cmd.cmd_code = SPI_READ_OCR;
+ cmd.arg = high_capacity ? (1 << 30) : 0; // 30 bits
+ cmd.flags = RESP_SPI_R3;
+
+ err = mmcsd_send_cmd(host, &cmd, 0);
+ *ocr = cmd.resp[1];
+ return err;
+}
+
+int32_t mmcsd_all_get_cid(struct rt_mmcsd_host *host, uint32_t *cid)
+{
+ int32_t err;
+ struct rt_mmcsd_cmd cmd;
+
+ (void)memset_s(&cmd, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));
+ cmd.cmd_code = ALL_SEND_CID;
+ cmd.arg = 0;
+ cmd.flags = RESP_R2 | CMD_BCR;
+ err = mmcsd_send_cmd(host, &cmd, 3); // 3 times
+ if (err) {
+ return err;
+ }
+
+ (void)memcpy_s(cid, sizeof(uint32_t) * 4, cmd.resp, sizeof(uint32_t) * 4); // 4 Bytes
+ return 0;
+}
+
+int32_t mmcsd_get_cid(struct rt_mmcsd_host *host, uint32_t *cid)
+{
+ int32_t err, i;
+ struct rt_mmcsd_req req;
+ struct rt_mmcsd_cmd cmd;
+ struct rt_mmcsd_data data;
+ uint32_t *buf = RT_NULL;
+
+ if (!controller_is_spi(host)) {
+ if (!host->card) {
+ return -RT_ERROR;
+ }
+ (void)memset_s(&cmd, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));
+
+ cmd.cmd_code = SEND_CID;
+ cmd.arg = host->card->rca << 16; // 16 Bits
+ cmd.flags = RESP_R2 | CMD_AC;
+ err = mmcsd_send_cmd(host, &cmd, 3); // 3 times
+ if (err) {
+ return err;
+ }
+
+ (void)memcpy_s(cid, sizeof(uint32_t) * 4, cmd.resp, sizeof(uint32_t) * 4); // 4 Bytes
+ return 0;
+ }
+
+ buf = (uint32_t *)irmalloc(16); // 16
+ if (!buf) {
+ LOG_E("allocate memory failed!");
+ return -RT_ENOMEM;
+ }
+
+ (void)memset_s(&req, sizeof(struct rt_mmcsd_req), 0, sizeof(struct rt_mmcsd_req));
+ (void)memset_s(&cmd, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));
+ (void)memset_s(&data, sizeof(struct rt_mmcsd_data), 0, sizeof(struct rt_mmcsd_data));
+
+ req.cmd = &cmd;
+ req.data = &data;
+
+ cmd.cmd_code = SEND_CID;
+ cmd.arg = 0;
+
+ /* NOTE HACK: the RESP_SPI_R1 is always correct here, but we
+ * rely on callers to never use this with "native" calls for reading
+ * CSD or CID. Native versions of those commands use the R2 type,
+ * not R1 plus a data block.
+ */
+ cmd.flags = RESP_SPI_R1 | RESP_R1 | CMD_ADTC;
+
+ data.blksize = 16; // 16
+ data.blks = 1;
+ data.flags = DATA_DIR_READ;
+ data.buf = buf;
+ /*
+ * The spec states that CSR and CID accesses have a timeout
+ * of 64 clock cycles.
+ */
+ data.timeout_ns = 0;
+ data.timeout_clks = 64; // 64
+
+ mmcsd_send_request(host, &req);
+
+ if (cmd.err || data.err) {
+ irfree(buf);
+ return -RT_ERROR;
+ }
+
+ for (i = 0;i < 4; i++) { // 4 times
+ cid[i] = buf[i];
+ }
+ irfree(buf);
+
+ return 0;
+}
+
+int32_t mmcsd_get_csd(struct rt_mmcsd_card *card, uint32_t *csd)
+{
+ int32_t err, i;
+ struct rt_mmcsd_req req;
+ struct rt_mmcsd_cmd cmd;
+ struct rt_mmcsd_data data;
+ uint32_t *buf = RT_NULL;
+
+ if (!controller_is_spi(card->host)) {
+ (void)memset_s(&cmd, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));
+
+ cmd.cmd_code = SEND_CSD;
+ cmd.arg = card->rca << 16; // 16 bits
+ cmd.flags = RESP_R2 | CMD_AC;
+ err = mmcsd_send_cmd(card->host, &cmd, 3); // 3 times
+ if (err) {
+ return err;
+ }
+ (void)memcpy_s(csd, sizeof(uint32_t) * 4, cmd.resp, sizeof(uint32_t) * 4); // 4 Bytes
+ return 0;
+ }
+
+ buf = (uint32_t*)irmalloc(16); // 16 Bytes
+ if (!buf) {
+ LOG_E("allocate memory failed!");
+ return -RT_ENOMEM;
+ }
+
+ (void)memset_s(&req, sizeof(struct rt_mmcsd_req), 0, sizeof(struct rt_mmcsd_req));
+ (void)memset_s(&cmd, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));
+ (void)memset_s(&data, sizeof(struct rt_mmcsd_data), 0, sizeof(struct rt_mmcsd_data));
+
+ req.cmd = &cmd;
+ req.data = &data;
+
+ cmd.cmd_code = SEND_CSD;
+ cmd.arg = 0;
+
+ /* NOTE HACK: the RESP_SPI_R1 is always correct here, but we
+ * rely on callers to never use this with "native" calls for reading
+ * CSD or CID. Native versions of those commands use the R2 type,
+ * not R1 plus a data block.
+ */
+ cmd.flags = RESP_SPI_R1 | RESP_R1 | CMD_ADTC;
+
+ data.blksize = 16; // blksize 16
+ data.blks = 1;
+ data.flags = DATA_DIR_READ;
+ data.buf = buf;
+
+ /*
+ * The spec states that CSR and CID accesses have a timeout
+ * of 64 clock cycles.
+ */
+ data.timeout_ns = 0;
+ data.timeout_clks = 64; // to clk 64
+
+ mmcsd_send_request(card->host, &req);
+
+ if (cmd.err || data.err) {
+ irfree(buf);
+ return -RT_ERROR;
+ }
+
+ for (i = 0;i < 4; i++) { // 4 times
+ csd[i] = buf[i];
+ }
+ irfree(buf);
+ return 0;
+}
+
+static int32_t _mmcsd_select_card(struct rt_mmcsd_host *host, struct rt_mmcsd_card *card)
+{
+ int32_t err;
+ struct rt_mmcsd_cmd cmd;
+
+ (void)memset_s(&cmd, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));
+
+ cmd.cmd_code = SELECT_CARD;
+
+ if (card) {
+ cmd.arg = card->rca << 16; // 16 bits
+ cmd.flags = RESP_R1 | CMD_AC;
+ } else {
+ cmd.arg = 0;
+ cmd.flags = RESP_NONE | CMD_AC;
+ }
+
+ err = mmcsd_send_cmd(host, &cmd, 3); // 3 times
+ if (err) {
+ return err;
+ }
+ return 0;
+}
+
+int32_t mmcsd_select_card(struct rt_mmcsd_card *card)
+{
+ return _mmcsd_select_card(card->host, card);
+}
+
+int32_t mmcsd_deselect_cards(struct rt_mmcsd_card *card)
+{
+ return _mmcsd_select_card(card->host, RT_NULL);
+}
+
+int32_t mmcsd_spi_use_crc(struct rt_mmcsd_host *host, int32_t use_crc)
+{
+ struct rt_mmcsd_cmd cmd;
+ int32_t err;
+
+ (void)memset_s(&cmd, sizeof(struct rt_mmcsd_cmd), 0, sizeof(struct rt_mmcsd_cmd));
+
+ cmd.cmd_code = SPI_CRC_ON_OFF;
+ cmd.flags = RESP_SPI_R1;
+ cmd.arg = use_crc;
+
+ err = mmcsd_send_cmd(host, &cmd, 0);
+ if (!err) {
+ host->spi_use_crc = use_crc;
+ }
+ return err;
+}
+
+rt_inline void mmcsd_set_iocfg(struct rt_mmcsd_host *host)
+{
+ struct rt_mmcsd_io_cfg *io_cfg = &host->io_cfg;
+
+ mmcsd_dbg("clock %uHz busmode %u powermode %u cs %u Vdd %u ""width %u \n",
+ io_cfg->clock, io_cfg->bus_mode,
+ io_cfg->power_mode, io_cfg->chip_select, io_cfg->vdd,
+ io_cfg->bus_width);
+
+ host->ops->set_iocfg(host, io_cfg);
+}
+
+/*
+ * Control chip select pin on a host.
+ */
+void mmcsd_set_chip_select(struct rt_mmcsd_host *host, int32_t mode)
+{
+ host->io_cfg.chip_select = mode;
+ mmcsd_set_iocfg(host);
+}
+
+/*
+ * Sets the host clock to the highest possible frequency that
+ * is below "hz".
+ */
+void mmcsd_set_clock(struct rt_mmcsd_host *host, uint32_t clk)
+{
+ if (clk < host->freq_min) {
+ LOG_W("clock too low!");
+ }
+
+ host->io_cfg.clock = clk;
+ mmcsd_set_iocfg(host);
+}
+
+/*
+ * Change the bus mode (open drain/push-pull) of a host.
+ */
+void mmcsd_set_bus_mode(struct rt_mmcsd_host *host, uint32_t mode)
+{
+ host->io_cfg.bus_mode = mode;
+ mmcsd_set_iocfg(host);
+}
+
+/*
+ * Change data bus width of a host.
+ */
+void mmcsd_set_bus_width(struct rt_mmcsd_host *host, uint32_t width)
+{
+ host->io_cfg.bus_width = width;
+ mmcsd_set_iocfg(host);
+}
+
+void mmcsd_set_data_timeout(struct rt_mmcsd_data *data,
+ const struct rt_mmcsd_card *card)
+{
+ uint32_t mult;
+
+ if (card->card_type == CARD_TYPE_SDIO) {
+ data->timeout_ns = 1000000000; /* SDIO card 1s, 1000000000ns */
+ data->timeout_clks = 0;
+ return;
+ }
+
+ // SD cards use a 100 multiplier rather than 10
+ mult = (card->card_type == CARD_TYPE_SD) ? 100 : 10;
+
+ /*
+ * Scale up the multiplier (and therefore the timeout) by
+ * the r2w factor for writes.
+ */
+ if (data->flags & DATA_DIR_WRITE) {
+ mult <<= card->csd.r2w_factor;
+ }
+
+ data->timeout_ns = card->tacc_ns * mult;
+ data->timeout_clks = card->tacc_clks * mult;
+
+ /*
+ * SD cards also have an upper limit on the timeout.
+ */
+ if (card->card_type == CARD_TYPE_SD) {
+ uint32_t timeout_us, limit_us;
+
+ timeout_us = data->timeout_ns / TIME_1000;
+ timeout_us += data->timeout_clks * TIME_1000 /
+ (card->host->io_cfg.clock / TIME_1000);
+
+ if (data->flags & DATA_DIR_WRITE)
+ /*
+ * The limit is really 250 ms, but that is
+ * insufficient for some crappy cards.
+ */
+ limit_us = 300000; // 300000
+ else
+ limit_us = 100000; // 100000
+
+ /*
+ * SDHC cards always use these fixed values.
+ */
+ if ((timeout_us > limit_us) || (card->flags & CARD_FLAG_SDHC)) {
+ data->timeout_ns = limit_us * TIME_1000; /* SDHC card fixed 250ms */
+ data->timeout_clks = 0;
+ }
+ }
+
+ if (controller_is_spi(card->host)) {
+ if (data->flags & DATA_DIR_WRITE) {
+ if (data->timeout_ns < 1000000000) { // 1000000000
+ data->timeout_ns = 1000000000; /* 1s, 1000000000ns */
+ }
+ } else {
+ if (data->timeout_ns < 100000000) { // 100000000
+ data->timeout_ns = 100000000; /* 100ms, 100000000ns */
+ }
+ }
+ }
+}
+
+/*
+ * Mask off any voltages we don't support and select
+ * the lowest voltage
+ */
+uint32_t mmcsd_select_voltage(struct rt_mmcsd_host *host, uint32_t ocr)
+{
+ int bit;
+ extern int __rt_ffs(int value);
+
+ ocr &= host->valid_ocr;
+
+ bit = __rt_ffs(ocr);
+ if (bit) {
+ bit -= 1;
+ ocr &= 3 << bit; // 3 bit
+ host->io_cfg.vdd = bit;
+ mmcsd_set_iocfg(host);
+ } else {
+ LOG_W("host doesn't support card's voltages!");
+ ocr = 0;
+ }
+
+ return ocr;
+}
+
+static void mmcsd_power_up(struct rt_mmcsd_host *host)
+{
+ int bit = __rt_fls(host->valid_ocr) - 1;
+
+ host->io_cfg.vdd = bit;
+ if (controller_is_spi(host)) {
+ host->io_cfg.chip_select = MMCSD_CS_HIGH;
+ host->io_cfg.bus_mode = MMCSD_BUSMODE_PUSHPULL;
+ } else {
+ host->io_cfg.chip_select = MMCSD_CS_IGNORE;
+ host->io_cfg.bus_mode = MMCSD_BUSMODE_OPENDRAIN;
+ }
+ host->io_cfg.power_mode = MMCSD_POWER_UP;
+ host->io_cfg.bus_width = MMCSD_BUS_WIDTH_1;
+ mmcsd_set_iocfg(host);
+
+ /*
+ * This delay should be sufficient to allow the power supply
+ * to reach the minimum voltage.
+ */
+ uapi_tcxo_delay_ms(DELAY_10MS);
+
+ host->io_cfg.clock = host->freq_min;
+ host->io_cfg.power_mode = MMCSD_POWER_ON;
+ mmcsd_set_iocfg(host);
+
+ /*
+ * This delay must be at least 74 clock sizes, or 1 ms, or the
+ * time required to reach a stable voltage.
+ */
+ uapi_tcxo_delay_ms(DELAY_10MS);
+}
+
+static void mmcsd_power_off(struct rt_mmcsd_host *host)
+{
+ host->io_cfg.clock = 0;
+ host->io_cfg.vdd = 0;
+ if (!controller_is_spi(host)) {
+ host->io_cfg.bus_mode = MMCSD_BUSMODE_OPENDRAIN;
+ host->io_cfg.chip_select = MMCSD_CS_IGNORE;
+ }
+ host->io_cfg.power_mode = MMCSD_POWER_OFF;
+ host->io_cfg.bus_width = MMCSD_BUS_WIDTH_1;
+ mmcsd_set_iocfg(host);
+}
+
+struct rt_mmcsd_host *mmcsd_alloc_host(void)
+{
+ struct rt_mmcsd_host *host;
+
+ host = irmalloc(sizeof(struct rt_mmcsd_host));
+ if (!host) {
+ PRINT("alloc host failed");
+ return RT_NULL;
+ }
+
+ (void)memset_s(host, sizeof(struct rt_mmcsd_host), 0, sizeof(struct rt_mmcsd_host));
+
+ host->max_seg_size = 65535; // seg size 65535
+ host->max_dma_segs = 1;
+ host->max_blk_size = 512; // blk_size 512
+ host->max_blk_count = 4096; // count 4096
+
+ hi_mmc_mutex_init(&host->bus_lock);
+ hi_mmc_sem_init(&host->sem_ack);
+ return host;
+}
+
+void mmcsd_free_host(struct rt_mmcsd_host *host)
+{
+ irfree(host);
+}
+
+
+// added by hisi for init, no hotpluge, no detect, just init.
+int hi_mmc_detect(struct rt_mmcsd_host *host)
+{
+ uint32_t ocr;
+ int32_t err;
+ int n;
+
+ if (host->card == RT_NULL) {
+ mmcsd_host_lock(host);
+ mmcsd_power_up(host);
+ // config mmc pinmux
+ for (n = 0; n < EMMC_PINMUX_NUM; n++) {
+ writew(S_HGPIO + S_HGPIO6_OFFSET + n * 0x4, FUNC_EMMC);
+ }
+ mmcsd_go_idle(host);
+ mmcsd_send_if_cond(host, host->valid_ocr);
+
+ err = sdio_io_send_op_cond(host, 0, &ocr);
+ if (!err) {
+ if (init_sdio(host, ocr)) {
+ mmcsd_power_off(host);
+ mmcsd_host_unlock(host);
+ return -1;
+ }
+ mmcsd_host_unlock(host);
+ return 0;
+ }
+
+ /*
+ * detect SD card
+ */
+ err = mmcsd_send_app_op_cond(host, 0, &ocr);
+ if (!err) {
+ if (init_sd(host, ocr)) {
+ mmcsd_power_off(host);
+ mmcsd_host_unlock(host);
+ return -1;
+ }
+ mmcsd_host_unlock(host);
+ return 0;
+ }
+
+ /*
+ * detect mmc card
+ */
+ err = mmc_send_op_cond(host, 0, &ocr);
+ if (!err) {
+ if (init_mmc(host, ocr)) {
+ mmcsd_power_off(host);
+ mmcsd_host_unlock(host);
+ return -1;
+ }
+ mmcsd_host_unlock(host);
+ return 0;
+ }
+
+ mmcsd_host_unlock(host);
+ } else {
+ /* card removed */
+ mmcsd_host_lock(host);
+ if (host->card->sdio_function_num == 0) {
+ irfree(host->card);
+ host->card = RT_NULL;
+ }
+ mmcsd_host_unlock(host);
+ return -1;
+ }
+ return -1;
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2011-07-25 weety first version
+ */
+
+#ifndef __CORE_H__
+#define __CORE_H__
+
+#include "mmcsd_host.h"
+#include "mmcsd_card.h"
+#include "mmcsd_cmd.h"
+#include "liteos_adapter.h"
+#ifdef __cplusplus
+extern "C" {
+#endif
+#define rt_memset(s, c, count) memset_s(s, count, c, count)
+#define rt_memcpy(dst, src, count) memcpy_s(dst, count, src, count)
+
+#ifdef MMC_OPEN_ALL_LOG
+#define mmcsd_dbg(fmt, ...) print_str(fmt, ##__VA_ARGS__)
+#else
+#define mmcsd_dbg(fmt, ...)
+#endif
+
+struct rt_mmcsd_data {
+ uint32_t blksize;
+ uint32_t blks;
+ uint32_t *buf;
+ int32_t err;
+ uint32_t flags;
+#define DATA_DIR_WRITE (1 << 0)
+#define DATA_DIR_READ (1 << 1)
+#define DATA_STREAM (1 << 2)
+#define DATA_CMD_STOP (0x1<<5)
+#define DATA_CMD_STOP_ENABLE(data) ((data)->flags & DATA_CMD_STOP)
+ unsigned int bytes_xfered;
+
+ struct rt_mmcsd_cmd *stop; /* stop command */
+ struct rt_mmcsd_req *mrq; /* associated request */
+
+ uint32_t timeout_ns;
+ uint32_t timeout_clks;
+};
+
+struct rt_mmcsd_cmd {
+ uint32_t cmd_code;
+ uint32_t arg;
+ uint32_t resp[4];
+ uint32_t flags;
+/* rsponse types
+ * bits:0~3
+ */
+#define RESP_MASK (0xF)
+#define RESP_NONE (0)
+#define RESP_R1 (1 << 0)
+#define RESP_R1B (2 << 0)
+#define RESP_R2 (3 << 0)
+#define RESP_R3 (4 << 0)
+#define RESP_R4 (5 << 0)
+#define RESP_R6 (6 << 0)
+#define RESP_R7 (7 << 0)
+#define RESP_R5 (8 << 0) /* SDIO command response type */
+/* command types
+ * bits:4~5
+ */
+#define CMD_MASK (3 << 4) /* command type */
+#define CMD_AC (0 << 4)
+#define CMD_ADTC (1 << 4)
+#define CMD_BC (2 << 4)
+#define CMD_BCR (3 << 4)
+
+#define resp_type(cmd) ((cmd)->flags & RESP_MASK)
+
+/* spi rsponse types
+ * bits:6~8
+ */
+#define RESP_SPI_MASK (0x7 << 6)
+#define RESP_SPI_R1 (1 << 6)
+#define RESP_SPI_R1B (2 << 6)
+#define RESP_SPI_R2 (3 << 6)
+#define RESP_SPI_R3 (4 << 6)
+#define RESP_SPI_R4 (5 << 6)
+#define RESP_SPI_R5 (6 << 6)
+#define RESP_SPI_R7 (7 << 6)
+
+#define spi_resp_type(cmd) ((cmd)->flags & RESP_SPI_MASK)
+/*
+ * These are the command types
+ */
+#define cmd_type(cmd) ((cmd)->flags & CMD_MASK)
+
+ int32_t retries; /* max number of retries */
+ int32_t err;
+
+ struct rt_mmcsd_data *data;
+ struct rt_mmcsd_req *mrq; /* associated request */
+};
+struct rt_mmcsd_erase {
+ uint32_t start_addr;
+ uint32_t len;
+ uint32_t type;
+#define ERASE_TYPE_ERASE_GROUP 0x0
+#define ERASE_TYPE_TRIM_SECTOR 0x1
+#define ERASE_TYPE_DISCARD_SECTOR 0x3
+};
+struct rt_mmcsd_req {
+ struct rt_mmcsd_data *data;
+ struct rt_mmcsd_cmd *cmd;
+ struct rt_mmcsd_cmd *stop;
+ struct rt_mmcsd_erase *erase;
+};
+
+/* the following is response bit */
+#define R1_OUT_OF_RANGE (1 << 31) /* er, c */
+#define R1_ADDRESS_ERROR (1 << 30) /* erx, c */
+#define R1_BLOCK_LEN_ERROR (1 << 29) /* er, c */
+#define R1_ERASE_SEQ_ERROR (1 << 28) /* er, c */
+#define R1_ERASE_PARAM (1 << 27) /* ex, c */
+#define R1_WP_VIOLATION (1 << 26) /* erx, c */
+#define R1_CARD_IS_LOCKED (1 << 25) /* sx, a */
+#define R1_LOCK_UNLOCK_FAILED (1 << 24) /* erx, c */
+#define R1_COM_CRC_ERROR (1 << 23) /* er, b */
+#define R1_ILLEGAL_COMMAND (1 << 22) /* er, b */
+#define R1_CARD_ECC_FAILED (1 << 21) /* ex, c */
+#define R1_CC_ERROR (1 << 20) /* erx, c */
+#define R1_ERROR (1 << 19) /* erx, c */
+#define R1_UNDERRUN (1 << 18) /* ex, c */
+#define R1_OVERRUN (1 << 17) /* ex, c */
+#define R1_CID_CSD_OVERWRITE (1 << 16) /* erx, c, CID/CSD overwrite */
+#define R1_WP_ERASE_SKIP (1 << 15) /* sx, c */
+#define R1_CARD_ECC_DISABLED (1 << 14) /* sx, a */
+#define R1_ERASE_RESET (1 << 13) /* sr, c */
+#define R1_STATUS(x) ((x) & 0xFFFFE000)
+#define R1_CURRENT_STATE(x) (((x) & 0x00001E00) >> 9) /* sx, b (4 bits) */
+#define R1_READY_FOR_DATA (1 << 8) /* sx, a */
+#define R1_APP_CMD (1 << 5) /* sr, c */
+#define R1_SWITCH_ERROR (1 << 7) /* sx, c */
+
+#define R1_SPI_IDLE (1 << 0)
+#define R1_SPI_ERASE_RESET (1 << 1)
+#define R1_SPI_ILLEGAL_COMMAND (1 << 2)
+#define R1_SPI_COM_CRC (1 << 3)
+#define R1_SPI_ERASE_SEQ (1 << 4)
+#define R1_SPI_ADDRESS (1 << 5)
+#define R1_SPI_PARAMETER (1 << 6)
+/* R1 bit 7 is always zero */
+#define R2_SPI_CARD_LOCKED (1 << 8)
+#define R2_SPI_WP_ERASE_SKIP (1 << 9) /* or lock/unlock fail */
+#define R2_SPI_LOCK_UNLOCK_FAIL R2_SPI_WP_ERASE_SKIP
+#define R2_SPI_ERROR (1 << 10)
+#define R2_SPI_CC_ERROR (1 << 11)
+#define R2_SPI_CARD_ECC_ERROR (1 << 12)
+#define R2_SPI_WP_VIOLATION (1 << 13)
+#define R2_SPI_ERASE_PARAM (1 << 14)
+#define R2_SPI_OUT_OF_RANGE (1 << 15) /* or CSD overwrite */
+#define R2_SPI_CSD_OVERWRITE R2_SPI_OUT_OF_RANGE
+
+#define CARD_BUSY 0x80000000 /* Card Power up status bit */
+
+/* R5 response bits */
+#define R5_COM_CRC_ERROR (1 << 15)
+#define R5_ILLEGAL_COMMAND (1 << 14)
+#define R5_ERROR (1 << 11)
+#define R5_FUNCTION_NUMBER (1 << 9)
+#define R5_OUT_OF_RANGE (1 << 8)
+#define R5_STATUS(x) ((x) & 0xCB00)
+#define R5_IO_CURRENT_STATE(x) (((x) & 0x3000) >> 12)
+
+/**
+ * fls - find last (most-significant) bit set
+ * @x: the word to search
+ *
+ * This is defined the same way as ffs
+ * Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32
+ */
+
+rt_inline uint32_t __rt_fls(uint32_t val)
+{
+ uint32_t bit = 32; // 32
+
+ if (!val) {
+ return 0;
+ }
+ if (!(val & 0xffff0000u)) {
+ val <<= 16; // 16
+ bit -= 16; // 16
+ }
+ if (!(val & 0xff000000u)) {
+ val <<= 8; // 8
+ bit -= 8; // 8
+ }
+ if (!(val & 0xf0000000u)) {
+ val <<= 4; // 4
+ bit -= 4; // 4
+ }
+ if (!(val & 0xc0000000u)) {
+ val <<= 2; // 2bootloader/flashboot/brandy/emmc/sd.c
+ bit -= 2; // 2
+ }
+ if (!(val & 0x80000000u)) {
+ bit -= 1;
+ }
+
+ return bit;
+}
+
+#define MMCSD_HOST_PLUGED 0
+#define MMCSD_HOST_UNPLUGED 1
+
+void hi_mmc_mutex_init(mmc_mutex *mux);
+void mmcsd_host_lock(struct rt_mmcsd_host *host);
+void mmcsd_host_unlock(struct rt_mmcsd_host *host);
+void hi_mmc_mutex_del(mmc_mutex mux);
+int hi_mmc_sem_init(mmc_sem *sem);
+int hi_mmc_sem_post(mmc_sem sem);
+int hi_mmc_sem_pend(mmc_sem sem, uint32_t timeout);
+int hi_mmc_sem_del(mmc_sem sem);
+int hi_mmc_detect(struct rt_mmcsd_host *host);
+
+void mmcsd_req_complete(struct rt_mmcsd_host *host);
+void mmcsd_send_request(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req);
+int32_t mmcsd_send_cmd(struct rt_mmcsd_host *host, struct rt_mmcsd_cmd *cmd, int retries);
+int32_t mmcsd_go_idle(struct rt_mmcsd_host *host);
+int32_t mmcsd_spi_read_ocr(struct rt_mmcsd_host *host, int32_t high_capacity, uint32_t *ocr);
+int32_t mmcsd_all_get_cid(struct rt_mmcsd_host *host, uint32_t *cid);
+int32_t mmcsd_get_cid(struct rt_mmcsd_host *host, uint32_t *cid);
+int32_t mmcsd_get_csd(struct rt_mmcsd_card *card, uint32_t *csd);
+int32_t mmcsd_select_card(struct rt_mmcsd_card *card);
+int32_t mmcsd_deselect_cards(struct rt_mmcsd_card *host);
+int32_t mmcsd_spi_use_crc(struct rt_mmcsd_host *host, int32_t use_crc);
+void mmcsd_set_chip_select(struct rt_mmcsd_host *host, int32_t mode);
+void mmcsd_set_clock(struct rt_mmcsd_host *host, uint32_t clk);
+void mmcsd_set_bus_mode(struct rt_mmcsd_host *host, uint32_t mode);
+void mmcsd_set_bus_width(struct rt_mmcsd_host *host, uint32_t width);
+void mmcsd_set_data_timeout(struct rt_mmcsd_data *data, const struct rt_mmcsd_card *card);
+uint32_t mmcsd_select_voltage(struct rt_mmcsd_host *host, uint32_t ocr);
+struct rt_mmcsd_host *mmcsd_alloc_host(void);
+void mmcsd_free_host(struct rt_mmcsd_host *host);
+
+int rt_mmcsd_blk_init(void);
+int32_t rt_mmcsd_blk_probe(struct rt_mmcsd_card *card);
+void rt_mmcsd_blk_remove(struct rt_mmcsd_card *card);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2011-07-25 weety first version
+ */
+
+#ifndef __HOST_H__
+#define __HOST_H__
+
+#include "liteos_adapter.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct rt_mmcsd_io_cfg {
+ uint32_t clock; /* clock rate */
+ uint16_t vdd;
+
+/* vdd stores the bit number of the selected voltage range from below. */
+
+ uint8_t bus_mode; /* command output mode */
+
+#define MMCSD_BUSMODE_OPENDRAIN 1
+#define MMCSD_BUSMODE_PUSHPULL 2
+
+ uint8_t chip_select; /* SPI chip select */
+
+#define MMCSD_CS_IGNORE 0
+#define MMCSD_CS_HIGH 1
+#define MMCSD_CS_LOW 2
+
+ uint8_t power_mode; /* power supply mode */
+
+#define MMCSD_POWER_OFF 0
+#define MMCSD_POWER_UP 1
+#define MMCSD_POWER_ON 2
+
+ uint8_t bus_width; /* data bus width */
+
+#define MMCSD_BUS_WIDTH_1 0
+#define MMCSD_BUS_WIDTH_4 2
+#define MMCSD_BUS_WIDTH_8 3
+};
+
+struct rt_mmcsd_host;
+struct rt_mmcsd_req;
+
+struct rt_mmcsd_host_ops {
+ void (*request)(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req);
+ void (*set_iocfg)(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg);
+ int32_t (*get_card_status)(struct rt_mmcsd_host *host);
+ void (*enable_sdio_irq)(struct rt_mmcsd_host *host, int32_t en);
+};
+
+struct rt_mmcsd_host {
+ struct rt_mmcsd_card *card;
+ const struct rt_mmcsd_host_ops *ops;
+ uint32_t freq_min;
+ uint32_t freq_max;
+ struct rt_mmcsd_io_cfg io_cfg;
+ uint32_t valid_ocr; /* current valid OCR */
+#define VDD_165_195 (1 << 7) /* VDD voltage 1.65 - 1.95 */
+#define VDD_20_21 (1 << 8) /* VDD voltage 2.0 ~ 2.1 */
+#define VDD_21_22 (1 << 9) /* VDD voltage 2.1 ~ 2.2 */
+#define VDD_22_23 (1 << 10) /* VDD voltage 2.2 ~ 2.3 */
+#define VDD_23_24 (1 << 11) /* VDD voltage 2.3 ~ 2.4 */
+#define VDD_24_25 (1 << 12) /* VDD voltage 2.4 ~ 2.5 */
+#define VDD_25_26 (1 << 13) /* VDD voltage 2.5 ~ 2.6 */
+#define VDD_26_27 (1 << 14) /* VDD voltage 2.6 ~ 2.7 */
+#define VDD_27_28 (1 << 15) /* VDD voltage 2.7 ~ 2.8 */
+#define VDD_28_29 (1 << 16) /* VDD voltage 2.8 ~ 2.9 */
+#define VDD_29_30 (1 << 17) /* VDD voltage 2.9 ~ 3.0 */
+#define VDD_30_31 (1 << 18) /* VDD voltage 3.0 ~ 3.1 */
+#define VDD_31_32 (1 << 19) /* VDD voltage 3.1 ~ 3.2 */
+#define VDD_32_33 (1 << 20) /* VDD voltage 3.2 ~ 3.3 */
+#define VDD_33_34 (1 << 21) /* VDD voltage 3.3 ~ 3.4 */
+#define VDD_34_35 (1 << 22) /* VDD voltage 3.4 ~ 3.5 */
+#define VDD_35_36 (1 << 23) /* VDD voltage 3.5 ~ 3.6 */
+ uint32_t flags; /* define device capabilities */
+#define MMCSD_BUSWIDTH_4 (1 << 0)
+#define MMCSD_BUSWIDTH_8 (1 << 1)
+#define MMCSD_MUTBLKWRITE (1 << 2)
+#define MMCSD_HOST_IS_SPI (1 << 3)
+#define controller_is_spi(host) ((host)->flags & MMCSD_HOST_IS_SPI)
+#define MMCSD_SUP_SDIO_IRQ (1 << 4) /* support signal pending SDIO IRQs */
+#define MMCSD_SUP_HIGHSPEED (1 << 5) /* support high speed */
+#define MMCSD_SUP_HS200 (1 << 6) /* support hs200 */
+#define MMCSD_SUP_HS400 (1 << 7) /* support hs400 */
+#define MMCSD_NON_OS_ENABLE (1 << 8) /* support non os enum */
+#define MMCSD_BUSWIDTH_1 (1 << 9) /* support 1 bit width */
+#define MMCSD_NO_USE_MUTEX (1 << 10) /* no use mutex */
+
+ uint32_t max_seg_size; /* maximum size of one dma segment */
+ uint32_t max_dma_segs; /* maximum number of dma segments in one request */
+ uint32_t max_blk_size; /* maximum block size */
+ uint32_t max_blk_count; /* maximum block count */
+
+ uint32_t spi_use_crc;
+ mmc_mutex bus_lock;
+ mmc_sem sem_ack;
+
+ uint32_t sdio_irq_num;
+ mmc_sem sdio_irq_sem;
+ mmc_thread sdio_irq_thread;
+ uint8_t id;
+ uint32_t driver_cap; /* phy mode driver capability */
+ void *private_data;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) @CompanyNameMagicTag 2018-2020. All rights reserved.
+ * Description: MSHC REG HEADER FILE
+ * Author: @CompanyNameTag
+ * Create: 2020-04
+ */
+
+#ifndef MSHC_REG_H
+#define MSHC_REG_H
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+/*
+ * Controller registers
+ */
+#define MSHC_DMA_ADDRESS 0x00
+#define MSHC_ARGUMENT2 MSHC_DMA_ADDRESS
+
+#define MSHC_BLOCK_SIZE 0x04
+#define SDMA_BUF_BOUNDARY_512K 7
+#define MSHC_MAKE_BLKSZ(dma, blksz) ((((dma) & 0x7) << 12) | ((blksz) & 0xFFF))
+
+#define MSHC_BLOCK_COUNT 0x06
+
+#define MSHC_ARGUMENT 0x08
+
+#define MSHC_TRANSFER_MODE 0x0C
+#define MSHC_TRNS_DMA 0x01
+#define MSHC_TRNS_BLK_CNT_EN 0x02
+#define MSHC_TRNS_AUTO_CMD12 0x04
+#define MSHC_TRNS_AUTO_CMD23 0x08
+#define MSHC_TRNS_READ 0x10
+#define MSHC_TRNS_MULTI 0x20
+
+#define MSHC_COMMAND 0x0E
+#define MSHC_CMD_RESP_MASK 0x03
+#define MSHC_CMD_CRC 0x08
+#define MSHC_CMD_INDEX 0x10
+#define MSHC_CMD_DATA 0x20
+#define MSHC_CMD_ABORTCMD 0xC0
+
+#define MSHC_CMD_RESP_NONE 0x00
+#define MSHC_CMD_RESP_LONG 0x01
+#define MSHC_CMD_RESP_SHORT 0x02
+#define MSHC_CMD_RESP_SHORT_BUSY 0x03
+
+#define MSHC_MAKE_CMD(c, f) ((((c) & 0xff) << 8) | ((f) & 0xff))
+#define MSHC_GET_CMD(c) (((c)>>8) & 0x3f)
+
+#define MSHC_RESPONSE 0x10
+
+#define MSHC_BUFFER 0x20
+#define MSHC_BUFFER_LEN 128
+
+#define MSHC_PRESENT_STATE 0x24
+#define MSHC_CMD_INHIBIT 0x00000001
+#define MSHC_DATA_INHIBIT 0x00000002
+#define MSHC_DOING_WRITE 0x00000100
+#define MSHC_DOING_READ 0x00000200
+#define MSHC_SPACE_AVAILABLE 0x00000400
+#define MSHC_DATA_AVAILABLE 0x00000800
+#define MSHC_CARD_PRESENT 0x00010000
+#define MSHC_WRITE_PROTECT 0x00080000
+#define MSHC_DATA_LVL_MASK 0x00F00000
+#define MSHC_DATA_LVL_SHIFT 20
+#define MSHC_DATA_0_LVL_MASK 0x00100000
+
+#define MSHC_HOST_CONTROL 0x28
+#define MSHC_CTRL_LED 0x01
+#define MSHC_CTRL_4BITBUS 0x02
+#define MSHC_CTRL_HISPD 0x04
+#define MSHC_CTRL_DMA_MASK 0x18
+#define MSHC_CTRL_SDMA 0x00
+#define MSHC_CTRL_ADMA1 0x08
+#define MSHC_CTRL_ADMA32 0x10
+#define MSHC_CTRL_ADMA64 0x18
+#define MSHC_CTRL_8BITBUS 0x20
+
+#define MSHC_POWER_CONTROL 0x29
+#define MSHC_POWER_ON 0x01
+#define MSHC_POWER_180 0x0A
+#define MSHC_POWER_300 0x0C
+#define MSHC_POWER_330 0x0E
+
+#define MSHC_BLOCK_GAP_CONTROL 0x2A
+
+#define MSHC_WAKE_UP_CONTROL 0x2B
+#define MSHC_WAKE_ON_INT 0x01
+#define MSHC_WAKE_ON_INSERT 0x02
+#define MSHC_WAKE_ON_REMOVE 0x04
+
+#define MSHC_CLOCK_CONTROL 0x2C
+#define MSHC_DIVIDER_SHIFT 8
+#define MSHC_DIVIDER_HI_SHIFT 6
+#define MSHC_DIV_MASK 0xFF
+#define MSHC_DIV_MASK_LEN 8
+#define MSHC_DIV_HI_MASK 0x300
+#define MSHC_PROG_CLOCK_MODE 0x0020
+#define MSHC_CLOCK_PLL_EN 0x0008
+#define MSHC_CLOCK_CARD_EN 0x0004
+#define MSHC_CLOCK_INT_STABLE 0x0002
+#define MSHC_CLOCK_INT_EN 0x0001
+
+#define MSHC_TIMEOUT_CONTROL 0x2E
+#define MSHC_DEFINE_TIMEOUT 0xE
+
+#define MSHC_SOFTWARE_RESET 0x2F
+#define MSHC_RESET_ALL 0x01
+#define MSHC_RESET_CMD 0x02
+#define MSHC_RESET_DATA 0x04
+
+#define MSHC_TOUT_CTRL 0x2e
+
+#define MSHC_PWR_CTRL 0x29
+#define MSHC_PWR_CTRL_VDD2 0x1
+
+#define MSHC_CLK_CTRL 0x2c
+#define MSHC_CLK_CTRL_PLL (1 << 3)
+#define MSHC_CLK_CTRL_CLK_EN (1 << 2)
+#define MSHC_CLK_CTRL_INT_CLK (1 << 0)
+
+#define MSHC_NOR_INT_STATUS 0x30
+#define MSHC_ERR_INT_STATUS 0x32
+#define MSHC_NOR_INT_ENABLE 0x34
+#define MSHC_ERR_INT_ENABLE 0x36
+#define MSHC_NOR_SIGNAL_ENABLE 0x38
+#define MSHC_ERR_SIGNAL_ENABLE 0x3A
+
+#define MSHC_NOR_INT_MASK 0x0000FFFF
+#define MSHC_ERR_INT_MASK 0xFFFF0000
+#define MSHC_ERR_INT_OFFSET 16
+
+#define MSHC_INT_RESPONSE 0x00000001
+#define MSHC_INT_DATA_END 0x00000002
+#define MSHC_INT_BLK_GAP 0x00000004
+#define MSHC_INT_DMA_END 0x00000008
+#define MSHC_INT_SPACE_AVAIL 0x00000010
+#define MSHC_INT_DATA_AVAIL 0x00000020
+#define MSHC_INT_CARD_INSERT 0x00000040
+#define MSHC_INT_CARD_REMOVE 0x00000080
+#define MSHC_INT_CARD_INT 0x00000100
+#define MSHC_INT_ERROR 0x00008000
+#define MSHC_INT_TIMEOUT 0x00010000
+#define MSHC_INT_CRC 0x00020000
+#define MSHC_INT_END_BIT 0x00040000
+#define MSHC_INT_INDEX 0x00080000
+#define MSHC_INT_DATA_TIMEOUT 0x00100000
+#define MSHC_INT_DATA_CRC 0x00200000
+#define MSHC_INT_DATA_END_ERR 0x00400000
+#define MSHC_INT_BUS_POWER 0x00800000
+#define MSHC_INT_AUTO_CMD_ERR 0x01000000
+#define MSHC_INT_ADMA_ERROR 0x02000000
+// do not set it to the HW register
+#define MSHC_INT_RESCAN_SW 0x80000000
+
+#define MSHC_INT_NORMAL_MASK 0x00007FFF
+#define MSHC_INT_ERROR_MASK 0xFFFF8000
+
+#define MSHC_INT_CMD_MASK (MSHC_INT_RESPONSE | MSHC_INT_TIMEOUT | \
+ MSHC_INT_CRC | MSHC_INT_END_BIT | MSHC_INT_INDEX | \
+ MSHC_INT_AUTO_CMD_ERR)
+
+#define MSHC_INT_DATA_MASK (MSHC_INT_DATA_END | MSHC_INT_DMA_END | \
+ MSHC_INT_DATA_AVAIL | MSHC_INT_SPACE_AVAIL | \
+ MSHC_INT_DATA_TIMEOUT | MSHC_INT_DATA_CRC | \
+ MSHC_INT_DATA_END_ERR | MSHC_INT_ADMA_ERROR | \
+ MSHC_INT_BLK_GAP)
+
+#define MSHC_INT_CMDQ_EN (0x1 << 14)
+#define MSHC_INT_ALL_MASK ((unsigned int)-1)
+
+#define MSHC_AUTO_CMD_HOSTCTRL2 0x3c
+#define MSHC_AUTO_CMD_ERR 0x3C
+#define MSHC_AUTO_CMD12_NOT_EXEC 0x0001
+#define MSHC_AUTO_CMD_TIMEOUT_ERR 0x0002
+#define MSHC_AUTO_CMD_CRC_ERR 0x0004
+#define MSHC_AUTO_CMD_ENDBIT_ERR 0x0008
+#define MSHC_AUTO_CMD_INDEX_ERR 0x0010
+#define MSHC_AUTO_CMD12_NOT_ISSUED 0x0080
+#define MSHC_AUTO_CMD_SEL 0x10000000
+
+#define MSHC_HOST_CONTROL2 0x3E
+#define MSHC_CTRL_UHS_MASK 0x0007
+#define MSHC_CTRL_UHS_SDR12 0x0000
+#define MSHC_CTRL_UHS_SDR25 0x0001
+#define MSHC_CTRL_UHS_SDR50 0x0002
+#define MSHC_CTRL_UHS_SDR104 0x0003
+#define MSHC_CTRL_UHS_DDR50 0x0004
+#define MSHC_CTRL_HS_SDR200 0x0005 /* reserved value in SDIO spec */
+#define MSHC_CTRL_HS400 0x0007
+#define MSHC_CTRL_VDD_180 0x0008
+#define MSHC_CTRL_DRV_TYPE_MASK 0x0030
+#define MSHC_CTRL_DRV_TYPE_B 0x0000
+#define MSHC_CTRL_DRV_TYPE_A 0x0010
+#define MSHC_CTRL_DRV_TYPE_C 0x0020
+#define MSHC_CTRL_DRV_TYPE_D 0x0030
+#define MSHC_CTRL_EXEC_TUNING 0x0040
+#define MSHC_CTRL_TUNED_CLK 0x0080
+#define MSHC_CTRL_ASYNC_INT_ENABL 0x4000
+#define MSHC_CTRL_PRESET_VAL_ENABLE 0x8000
+
+#define MSHC_CAPABILITIES_1 0x40
+#define MSHC_TIMEOUT_CLK_MASK 0x0000003F
+#define MSHC_TIMEOUT_CLK_SHIFT 0
+#define MSHC_TIMEOUT_CLK_UNIT 0x00000080
+#define MSHC_CLOCK_BASE_MASK 0x00003F00
+#define MSHC_CLOCK_V3_BASE_MASK 0x0000FF00
+#define MSHC_CLOCK_BASE_SHIFT 8
+#define MSHC_MAX_BLOCK_MASK 0x00030000
+#define MSHC_MAX_BLOCK_SHIFT 16
+#define MSHC_CAN_DO_8BIT 0x00040000
+#define MSHC_CAN_DO_ADMA2 0x00080000
+#define MSHC_CAN_DO_ADMA1 0x00100000
+#define MSHC_CAN_DO_HISPD 0x00200000
+#define MSHC_CAN_DO_SDMA 0x00400000
+#define MSHC_CAN_VDD_330 0x01000000
+#define MSHC_CAN_VDD_300 0x02000000
+#define MSHC_CAN_VDD_180 0x04000000
+#define MSHC_CAN_64BIT 0x10000000
+#define MSHC_CAN_ASYNC_INT 0x20000000
+
+#define MSHC_SUPPORT_SDR50 0x00000001
+#define MSHC_SUPPORT_SDR104 0x00000002
+#define MSHC_SUPPORT_DDR50 0x00000004
+#define MSHC_DRIVER_TYPE_A 0x00000010
+#define MSHC_DRIVER_TYPE_C 0x00000020
+#define MSHC_DRIVER_TYPE_D 0x00000040
+#define MSHC_RETUNING_TIMER_COUNT_MASK 0x00000F00
+#define MSHC_RETUNING_TIMER_COUNT_SHIFT 8
+#define MSHC_USE_SDR50_TUNING 0x00002000
+#define MSHC_RETUNING_MODE_MASK 0x0000C000
+#define MSHC_RETUNING_MODE_SHIFT 14
+#define MSHC_CLOCK_MUL_MASK 0x00FF0000
+#define MSHC_CLOCK_MUL_SHIFT 16
+#define MSHC_CAN_DO_ADMA3 0x8000000
+#define MSHC_SUPPORT_HS400 0x80000000
+
+#define MSHC_CAPABILITIES_2 0x44
+
+#define MSHC_MAX_CURRENT 0x48
+#define MSHC_MAX_CURRENT_LIMIT 0xFF
+#define MSHC_MAX_CURRENT_330_MASK 0x0000FF
+#define MSHC_MAX_CURRENT_330_SHIFT 0
+#define MSHC_MAX_CURRENT_300_MASK 0x00FF00
+#define MSHC_MAX_CURRENT_300_SHIFT 8
+#define MSHC_MAX_CURRENT_180_MASK 0xFF0000
+#define MSHC_MAX_CURRENT_180_SHIFT 16
+#define MSHC_MAX_CURRENT_MULTIPLIER 4
+
+/* 4C-4F reserved for more max current */
+#define MSHC_SET_ACMD12_ERROR 0x50
+#define MSHC_SET_INT_ERROR 0x52
+
+#define MSHC_ADMA_ERROR 0x54
+
+/* 55-57 reserved */
+#define MSHC_HI_SHIFT 32
+#define MSHC_ADMA_ADDRESS_LOW 0x58 /* addr[0:31] */
+#define MSHC_ADMA_ADDRESS_HIGH 0x5C /* addr[32:63] DO not support */
+
+/* 60-FB reserved */
+#define MSHC_PRESET_FOR_SDR12 0x66
+#define MSHC_PRESET_FOR_SDR25 0x68
+#define MSHC_PRESET_FOR_SDR50 0x6A
+#define MSHC_PRESET_FOR_SDR104 0x6C
+#define MSHC_PRESET_FOR_DDR50 0x6E
+#define MSHC_PRESET_FOR_HS400 0x74 /* Non-standard */
+#define MSHC_PRESET_DRV_MASK 0xC000
+#define MSHC_PRESET_DRV_SHIFT 14
+#define MSHC_PRESET_CLKGEN_SEL_MASK 0x400
+#define MSHC_PRESET_CLKGEN_SEL_SHIFT 10
+#define MSHC_PRESET_SDCLK_FREQ_MASK 0x3FF
+#define MSHC_PRESET_SDCLK_FREQ_SHIFT 0
+
+#define MSHC_SLOT_INT_STATUS 0xFC
+
+#define MSHC_HOST_VERSION 0xFE
+#define MSHC_VENDOR_VER_MASK 0xFF00
+#define MSHC_VENDOR_VER_SHIFT 8
+#define MSHC_SPEC_VER_MASK 0x00FF
+#define MSHC_SPEC_VER_SHIFT 0
+#define MSHC_SPEC_100 0
+#define MSHC_SPEC_200 1
+#define MSHC_SPEC_300 2
+#define MSHC_SPEC_400 3
+#define MSHC_SPEC_410 4
+#define MSHC_SPEC_420 5
+
+// The value is from the register value of 0xe8.
+#define MSHC_PVENDOR_ADDR_OFFSET 0x500
+#define MSHC_EMMC_CTRL (MSHC_PVENDOR_ADDR_OFFSET + 0x2c)
+#define MSHC_CARD_IS_EMMC_START 1
+#define MSHC_CARD_IS_EMMC_BITS 1
+#define MSHC_CARD_IS_EMMC 1
+#define MSHC_ENH_STROBE_EN_START 8
+#define MSHC_ENH_STROBE_EN_BITS 1
+#define MSHC_ENH_STROBE_EN 1
+
+#define MSHC_MSHC_CTRL (MSHC_PVENDOR_ADDR_OFFSET + 0x08)
+#define MSHC_CMD_CONFLIT_CHECK 0x01
+
+#define MSHC_AXI_MBIIU_CTRL (MSHC_PVENDOR_ADDR_OFFSET + 0x10)
+#define MSHC_GM_WR_OSRC_LMT_MASK (0x7 << 24)
+#define MSHC_GM_WR_OSRC_LMT_SEL(x) ((x) << 24)
+#define MSHC_GM_RD_OSRC_LMT_MASK (0x7 << 16)
+#define MSHC_GM_RD_OSRC_LMT_SEL(x) ((x) << 16)
+#define MSHC_UNDEFL_INCR_EN 0x1
+#define MSHC_GM_WR_OSRC_LMT_VAL ((7) << 24)
+#define MSHC_GM_RD_OSRC_LMT_VAL ((7) << 16)
+
+#define MSHC_AUTO_TUNING_CTRL (MSHC_PVENDOR_ADDR_OFFSET + 0x40)
+#define MSHC_SW_TUNING_EN 0x00000010
+#define MSHC_AUTO_TUNING_STATUS (MSHC_PVENDOR_ADDR_OFFSET + 0x44)
+
+#define MSHC_CENTER_PH_CODE_MASK 0x000000ff
+#define MSHC_PHASE_SEL_MASK 0xff
+#define MSHC_FOUND_EDGE (0x1 << 11)
+#define MSHC_EDGE_DETECT_EN (0x1 << 8)
+#define MSHC_DOUT_EN_F_EDGE (0x1 << 6)
+#define MSHC_DATA_DLY_EN (0x1 << 3)
+#define MSHC_CMD_DLY_EN (0x1 << 2)
+
+/*
+ * End of controller registers.
+ */
+#define REG_MISC_CTRL14 0x14
+#define SDIO0_PWRSW_CTRL_1V8 (0x1 << 8)
+#define SDIO0_PWRSW_EN (0x1 << 9)
+#define SDIO0_PWRSW_SEL_1V8 (0x1 << 10)
+
+#define ADMA2_END 0x2
+#define MSHC_PHY_ADDR_OFFSET 0x1000
+#define MSHC_PHY_IOCTL_PUPD (MSHC_PHY_ADDR_OFFSET + 0x260) // IO pul-up/pull-down
+#define MSHC_PHY_IOCTL_IOE (MSHC_PHY_ADDR_OFFSET + 0x26c) // IO direction
+#define PHY_IOCTL_PUPD_VAL 0x2FF03FF // cmd and dat[0:7] pull up, DS pull down, clock pull disable
+#define PHY_IOCTL_IOE_VAL 0x3FF06FF // cmd and dat[0:7] Input/Output enable, DS input enable, clk output enable
+#define MSHC_PHY_IOCTL_RONSEL_1_0 (MSHC_PHY_ADDR_OFFSET + 0x264) // IO driver capability bit 0--bit1
+#define MSHC_PHY_IOCTL_OD_RONSEL_2 (MSHC_PHY_ADDR_OFFSET + 0x268) // IO driver capability bit2
+#define PHY_IOCTL_RONSEL_BIT0 0x1
+#define PHY_IOCTL_RONSEL_BIT1 0x2
+#define PHY_IOCTL_RONSEL_BIT2 0x4
+#define PHY_IOCTL_RONSEL_BIT0_VAL_1 0x7FF // value bit0 is 1, bit0--bit10 means [10:0] = {CLK, CMD, DS, DAT7[7:0]}
+#define PHY_IOCTL_RONSEL_BIT1_VAL_1 0x7FF0000 // value bit1 is 1, bit16--bit26
+#define PHY_IOCTL_RONSEL_BIT2_VAL_1 0x7FF // value bit2 is 1, bit0--bit10
+
+// This register control the initialization of the PHY.
+// Please note that write to this register will be ignored if init_en is already at '1' state.
+#define PHYINITCTRL (MSHC_PHY_ADDR_OFFSET + 0x004)
+#define PHYCTRL2 (MSHC_PHY_ADDR_OFFSET + 0x248)
+#define DLY_CTL (MSHC_PHY_ADDR_OFFSET + 0x250)
+#define DLY_CTL1 (MSHC_PHY_ADDR_OFFSET + 0x254)
+
+#define PHY_INV_CLK 0x80000001 // Invert the TXCLK This register create 180 degree delay of TX clock.
+#define PHYINITCTRL_DISABLE 0x30c
+#define PHYINITCTRL_ENABLE 0x30d
+#define PHY_INIT_EN_MASK 0x1
+#define PHY_SET_DLY_MEAS_EN 0xC1674800
+#define PHY_SET_DLY_MEAS_DIS 0xC1670800
+#define PHY_DLAY1_CODE_POS 8
+#define PHY_DLAY1_CODE_LEN 10
+#define PHY_DLAY3_CODE_POS 21
+#define PHY_DLAY3_CODE_LEN 10
+#define PHY_DLY_CODE_R_POS 0
+#define PHY_DLY_CODE_R_LEN 11
+
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+#endif
--- /dev/null
+/*\r
+ * Copyright (c) Huawei Technologies Co., Ltd. 2018-2020. All rights reserved.\r
+ * Description: rt-thread system HEADER FILE\r
+ * Author:\r
+ * Create: 2021-06\r
+ */\r
+#ifndef RT_SYS_HEADER_H\r
+#define RT_SYS_HEADER_H\r
+\r
+#define RT_THREAD_PRIORITY_MAX 32\r
+#define rt_inline static inline\r
+/* RT-Thread error code definitions */\r
+#define RT_EOK 0 /**< There is no error */\r
+#define RT_ERROR 1 /**< A generic error happens */\r
+#define RT_ETIMEOUT 2 /**< Timed out */\r
+#define RT_EFULL 3 /**< The resource is full */\r
+#define RT_EEMPTY 4 /**< The resource is empty */\r
+#define RT_ENOMEM 5 /**< No memory */\r
+#define RT_ENOSYS 6 /**< No system */\r
+#define RT_EBUSY 7 /**< Busy */\r
+#define RT_EIO 8 /**< IO error */\r
+#define RT_EINTR 9 /**< Interrupted system call */\r
+#define RT_EINVAL 10 /**< Invalid argument */\r
+/**\r
+ * @brief initialize a list object\r
+ */\r
+#define RT_LIST_OBJECT_INIT(object) { &(object), &(object) }\r
+\r
+/* RT-Thread basic data type definitions */\r
+typedef signed char rt_int8_t; /**< 8bit integer type */\r
+typedef signed short rt_int16_t; /**< 16bit integer type */\r
+typedef signed int rt_int32_t; /**< 32bit integer type */\r
+typedef unsigned char rt_uint8_t; /**< 8bit unsigned integer type */\r
+typedef unsigned short rt_uint16_t; /**< 16bit unsigned integer type */\r
+typedef unsigned int rt_uint32_t; /**< 32bit unsigned integer type */\r
+typedef signed long long rt_int64_t; /**< 64bit integer type */\r
+typedef unsigned long long rt_uint64_t; /**< 64bit unsigned integer type */\r
+typedef int rt_bool_t; /**< boolean type */\r
+typedef long rt_base_t; /**< Nbit CPU related date type */\r
+typedef unsigned long rt_ubase_t; /**< Nbit unsigned CPU related data type */\r
+typedef rt_base_t rt_err_t; /**< Type for error number */\r
+typedef rt_uint32_t rt_time_t; /**< Type for time stamp */\r
+typedef rt_uint32_t rt_tick_t; /**< Type for tick count */\r
+typedef rt_base_t rt_flag_t; /**< Type for flags */\r
+typedef rt_ubase_t rt_size_t; /**< Type for size number */\r
+typedef rt_ubase_t rt_dev_t; /**< Type for device */\r
+typedef rt_base_t rt_off_t; /**< Type for offset */\r
+\r
+typedef struct rt_list_node rt_list_t; /**< Type for lists. */\r
+/**\r
+ * Double List structure\r
+ */\r
+struct rt_list_node {\r
+ struct rt_list_node *next; /**< point to next node. */\r
+ struct rt_list_node *prev; /**< point to prev node. */\r
+};\r
+/**\r
+ * @brief insert a node after a list\r
+ *\r
+ * @param l list to insert it\r
+ * @param n new node to be inserted\r
+ */\r
+rt_inline void rt_list_insert_after(rt_list_t *l, rt_list_t *n)\r
+{\r
+ l->next->prev = n;\r
+ n->next = l->next;\r
+\r
+ l->next = n;\r
+ n->prev = l;\r
+}\r
+/**\r
+ * @brief get the struct for this entry\r
+ * @param node the entry point\r
+ * @param type the type of structure\r
+ * @param member the name of list in structure\r
+ */\r
+#define rt_list_entry(node, type, member) \\r
+ rt_container_of(node, type, member)\r
+/**\r
+ * rt_container_of - return the member address of ptr, if the type of ptr is the\r
+ * struct type.\r
+ */\r
+#define rt_container_of(ptr, type, member) \\r
+ ((type *)((char *)(ptr) - (unsigned long)(&((type *)0)->member)))\r
+/**\r
+ * @brief tests whether a list is empty\r
+ * @param l the list to test.\r
+ */\r
+rt_inline int rt_list_isempty(const rt_list_t *l)\r
+{\r
+ return l->next == l;\r
+}\r
+/**\r
+ * @brief remove node from list.\r
+ * @param n the node to remove from the list.\r
+ */\r
+rt_inline void rt_list_remove(rt_list_t *n)\r
+{\r
+ n->next->prev = n->prev;\r
+ n->prev->next = n->next;\r
+\r
+ n->next = n->prev = n;\r
+}\r
+#endif
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2011-07-25 weety first version
+ */
+
+#include "mmcsd_core.h"
+#include "rt_sys_header.h"
+#include "sd.h"
+
+#define DBG_TAG "SDIO"
+#ifdef RT_SDIO_DEBUG
+#define DBG_LVL DBG_LOG
+#else
+#define DBG_LVL DBG_INFO
+#endif /* RT_SDIO_DEBUG */
+
+static const uint32_t tran_unit[] = {
+ 10000, 100000, 1000000, 10000000,
+ 0, 0, 0, 0
+};
+
+static const uint8_t tran_value[] = {
+ 0, 10, 12, 13, 15, 20, 25, 30,
+ 35, 40, 45, 50, 55, 60, 70, 80,
+};
+
+static const uint32_t tacc_uint[] = {
+ 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000,
+};
+
+static const uint8_t tacc_value[] = {
+ 0, 10, 12, 13, 15, 20, 25, 30,
+ 35, 40, 45, 50, 55, 60, 70, 80,
+};
+
+rt_inline uint32_t GET_BITS(uint32_t *resp, uint32_t start, uint32_t size)
+{
+ const int32_t __size = size;
+ const uint32_t __mask = (__size < 32 ? 1 << __size : 0) - 1; // 32
+ const int32_t __off = 3 - ((start) / 32); // 3 32
+ const int32_t __shft = (start) & 31; // 31
+ uint32_t __res;
+
+ __res = resp[__off] >> __shft;
+ if (__size + __shft > 32) { // 32
+ __res |= resp[__off-1] << ((32 - __shft) % 32); // 32
+ }
+
+ return __res & __mask;
+}
+
+static int32_t mmcsd_parse_csd(struct rt_mmcsd_card *card)
+{
+ struct rt_mmcsd_csd *csd = &card->csd;
+ uint32_t *resp = card->resp_csd;
+
+ csd->csd_structure = GET_BITS(resp, 126, 2); // 126 2
+
+ switch (csd->csd_structure) {
+ case 0:
+ csd->taac = GET_BITS(resp, 112, 8); // 112 8
+ csd->nsac = GET_BITS(resp, 104, 8); // 104 8
+ csd->tran_speed = GET_BITS(resp, 96, 8); // 96 8
+ csd->card_cmd_class = GET_BITS(resp, 84, 12); // 84 12
+ csd->rd_blk_len = GET_BITS(resp, 80, 4); // 80 4
+ csd->rd_blk_part = GET_BITS(resp, 79, 1); // 79 1
+ csd->wr_blk_misalign = GET_BITS(resp, 78, 1); // 78 1
+ csd->rd_blk_misalign = GET_BITS(resp, 77, 1); // 77 1
+ csd->dsr_imp = GET_BITS(resp, 76, 1); // 76 1
+ csd->c_size = GET_BITS(resp, 62, 12); // 62 12
+ csd->c_size_mult = GET_BITS(resp, 47, 3); // 47 3
+ csd->r2w_factor = GET_BITS(resp, 26, 3); // 26 3
+ csd->wr_blk_len = GET_BITS(resp, 22, 4); // 22 4
+ csd->wr_blk_partial = GET_BITS(resp, 21, 1); // 21 1
+ csd->csd_crc = GET_BITS(resp, 1, 7); // 1 7
+
+ card->card_blksize = 1 << csd->rd_blk_len;
+ card->card_capacity = (csd->c_size + 1) << (csd->c_size_mult + 2); // 2
+ card->card_capacity *= card->card_blksize;
+ card->card_capacity >>= 10; /* unit:10KB */
+ card->tacc_clks = csd->nsac * 100; // 100
+ card->tacc_ns = (tacc_uint[csd->taac&0x07] * tacc_value[(csd->taac&0x78)>>3] + 9) / 10; // 3 9 10
+ card->max_data_rate = tran_unit[csd->tran_speed&0x07] * tran_value[(csd->tran_speed&0x78)>>3]; // 3
+ break;
+ case 1:
+ card->flags |= CARD_FLAG_SDHC;
+
+ /* This field is fixed to 0Eh, which indicates 1 ms
+ The host should not use TAAC, NSAC, and R2W_FACTOR
+ to calculate timeout and should uses fixed timeout
+ values for read and write operations */
+ csd->taac = GET_BITS(resp, 112, 8); // 112 8
+ csd->nsac = GET_BITS(resp, 104, 8); // 104 8
+ csd->tran_speed = GET_BITS(resp, 96, 8); // 96 8
+ csd->card_cmd_class = GET_BITS(resp, 84, 12); // 84 12
+ csd->rd_blk_len = GET_BITS(resp, 80, 4); // 80 4
+ csd->rd_blk_part = GET_BITS(resp, 79, 1); // 79 1
+ csd->wr_blk_misalign = GET_BITS(resp, 78, 1); // 78 1
+ csd->rd_blk_misalign = GET_BITS(resp, 77, 1); // 77 1
+ csd->dsr_imp = GET_BITS(resp, 76, 1); // 76 1
+ csd->c_size = GET_BITS(resp, 48, 22); // 48 22
+
+ csd->r2w_factor = GET_BITS(resp, 26, 3); // 26 3
+ csd->wr_blk_len = GET_BITS(resp, 22, 4); // 22 4
+ csd->wr_blk_partial = GET_BITS(resp, 21, 1); // 21 1
+ csd->csd_crc = GET_BITS(resp, 1, 7); // 1 7
+
+ card->card_blksize = 512; // 512
+ card->card_capacity = (csd->c_size + 1) * 512; /* unit:512KB */
+ card->tacc_clks = 0;
+ card->tacc_ns = 0;
+ card->max_data_rate = tran_unit[csd->tran_speed&0x07] * tran_value[(csd->tran_speed&0x78)>>3]; // 3
+ break;
+ default:
+ LOG_E("unrecognised CSD structure version %d!", csd->csd_structure);
+
+ return -RT_ERROR;
+ }
+ LOG_I("SD card capacity %d KB.", card->card_capacity);
+
+ return 0;
+}
+
+static int32_t mmcsd_parse_scr(struct rt_mmcsd_card *card)
+{
+ struct rt_sd_scr *scr = &card->scr;
+ uint32_t resp[4];
+
+ resp[3] = card->resp_scr[1]; // 3 1
+ resp[2] = card->resp_scr[0]; // 2 0
+ scr->sd_version = GET_BITS(resp, 56, 4); // 56 4
+ scr->sd_bus_widths = GET_BITS(resp, 48, 4); // 48 4
+
+ return 0;
+}
+
+static int32_t mmcsd_switch(struct rt_mmcsd_card *card)
+{
+ int32_t err = 0;
+ struct rt_mmcsd_host *host = card->host;
+ struct rt_mmcsd_req req;
+ struct rt_mmcsd_cmd cmd;
+ struct rt_mmcsd_data data;
+ uint8_t *buf;
+
+ buf = (uint8_t*)rt_malloc(64); // 64
+ if (!buf) {
+ LOG_E("alloc memory failed!");
+ return -RT_ENOMEM;
+ }
+
+ if (card->card_type != CARD_TYPE_SD) {
+ goto err;
+ }
+
+ if (card->scr.sd_version < SCR_SPEC_VER_1) {
+ goto err;
+ }
+
+ rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
+
+ cmd.cmd_code = SD_SWITCH;
+ cmd.arg = 0x00FFFFF1;
+ cmd.flags = RESP_R1 | CMD_ADTC;
+
+ rt_memset(&data, 0, sizeof(struct rt_mmcsd_data));
+
+ mmcsd_set_data_timeout(&data, card);
+
+ data.blksize = 64; // 64
+ data.blks = 1;
+ data.flags = DATA_DIR_READ;
+ data.buf = (uint32_t *)buf;
+
+ rt_memset(&req, 0, sizeof(struct rt_mmcsd_req));
+
+ req.cmd = &cmd;
+ req.data = &data;
+
+ mmcsd_send_request(host, &req);
+
+ if (cmd.err || data.err) {
+ goto err1;
+ }
+
+ if (buf[13] & 0x02) { // 13
+ card->hs_max_data_rate = 50000000; // 50000000
+ }
+
+ rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
+
+ cmd.cmd_code = SD_SWITCH;
+ cmd.arg = 0x80FFFFF1;
+ cmd.flags = RESP_R1 | CMD_ADTC;
+
+ rt_memset(&data, 0, sizeof(struct rt_mmcsd_data));
+
+ mmcsd_set_data_timeout(&data, card);
+
+ data.blksize = 64; // 64
+ data.blks = 1;
+ data.flags = DATA_DIR_READ;
+ data.buf = (uint32_t *)buf;
+
+ rt_memset(&req, 0, sizeof(struct rt_mmcsd_req));
+
+ req.cmd = &cmd;
+ req.data = &data;
+
+ mmcsd_send_request(host, &req);
+
+ if (cmd.err || data.err) {
+ goto err1;
+ }
+
+ if ((buf[16] & 0xF) != 1) { // 16
+ LOG_I("switching card to high speed failed!");
+ goto err;
+ }
+
+ card->flags |= CARD_FLAG_HIGHSPEED;
+
+err:
+ rt_free(buf);
+ return 0;
+
+err1:
+ if (cmd.err) {
+ err = cmd.err;
+ }
+
+ if (data.err) {
+ err = data.err;
+ }
+
+ return err;
+}
+
+static rt_err_t mmcsd_app_cmd(struct rt_mmcsd_host *host, struct rt_mmcsd_card *card)
+{
+ rt_err_t err;
+ struct rt_mmcsd_cmd cmd = {0};
+
+ cmd.cmd_code = APP_CMD;
+
+ if (card) {
+ cmd.arg = card->rca << 16; // 16
+ cmd.flags = RESP_R1 | CMD_AC;
+ } else {
+ cmd.arg = 0;
+ cmd.flags = RESP_R1 | CMD_BCR;
+ }
+
+ err = mmcsd_send_cmd(host, &cmd, 0);
+ if (err) {
+ return err;
+ }
+
+ /* Check that card supported application commands */
+ if (!controller_is_spi(host) && !(cmd.resp[0] & R1_APP_CMD)) {
+ return -RT_ERROR;
+ }
+
+ return RT_EOK;
+}
+
+
+rt_err_t mmcsd_send_app_cmd(struct rt_mmcsd_host *host,
+ struct rt_mmcsd_card *card,
+ struct rt_mmcsd_cmd *cmd,
+ uint32_t retry)
+{
+ struct rt_mmcsd_req req;
+
+ uint32_t i;
+ rt_err_t err;
+
+ err = -RT_ERROR;
+
+ /*
+ * We have to resend MMC_APP_CMD for each attempt so
+ * we cannot use the retries field in mmc_command
+ */
+ for (i = 0;i <= retry; i++) {
+ rt_memset(&req, 0, sizeof(struct rt_mmcsd_req));
+
+ err = mmcsd_app_cmd(host, card);
+ if (err) {
+ /* no point in retrying; no APP commands allowed */
+ if (controller_is_spi(host)) {
+ if (cmd->resp[0] & R1_SPI_ILLEGAL_COMMAND) {
+ break;
+ }
+ }
+ continue;
+ }
+
+ rt_memset(&req, 0, sizeof(struct rt_mmcsd_req));
+ rt_memset(cmd->resp, 0, sizeof(cmd->resp));
+ req.cmd = cmd;
+ mmcsd_send_request(host, &req);
+
+ err = cmd->err;
+ if (!cmd->err) {
+ break;
+ }
+
+ /* no point in retrying illegal APP commands */
+ if (controller_is_spi(host)) {
+ if (cmd->resp[0] & R1_SPI_ILLEGAL_COMMAND) {
+ break;
+ }
+ }
+ }
+
+ return err;
+}
+
+rt_err_t mmcsd_app_set_bus_width(struct rt_mmcsd_card *card, int32_t width)
+{
+ rt_err_t err;
+ struct rt_mmcsd_cmd cmd;
+
+ rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
+ cmd.cmd_code = SD_APP_SET_BUS_WIDTH;
+ cmd.flags = RESP_R1 | CMD_AC;
+
+ switch (width) {
+ case MMCSD_BUS_WIDTH_1:
+ cmd.arg = MMCSD_BUS_WIDTH_1;
+ break;
+ case MMCSD_BUS_WIDTH_4:
+ cmd.arg = MMCSD_BUS_WIDTH_4;
+ break;
+ default:
+ return -RT_ERROR;
+ }
+
+ err = mmcsd_send_app_cmd(card->host, card, &cmd, 3); // 3 times
+ if (err) {
+ return err;
+ }
+
+ return RT_EOK;
+}
+
+rt_err_t mmcsd_send_app_op_cond(struct rt_mmcsd_host *host, uint32_t ocr, uint32_t *rocr)
+{
+ struct rt_mmcsd_cmd cmd;
+ uint32_t i;
+ rt_err_t err = RT_EOK;
+
+ rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
+
+ cmd.cmd_code = SD_APP_OP_COND;
+ if (controller_is_spi(host)) {
+ cmd.arg = ocr & (1 << 30); /* SPI only defines one bit 30 */
+ } else {
+ cmd.arg = ocr;
+ }
+ cmd.flags = RESP_SPI_R1 | RESP_R3 | CMD_BCR;
+
+ for (i = 100; i; i--) { // 100
+ err = mmcsd_send_app_cmd(host, RT_NULL, &cmd, 3); // 3
+ if (err) {
+ break;
+ }
+
+ /* if we're just probing, do a single pass */
+ if (ocr == 0) {
+ break;
+ }
+
+ /* otherwise wait until reset completes */
+ if (controller_is_spi(host)) {
+ if (!(cmd.resp[0] & R1_SPI_IDLE)) {
+ break;
+ }
+ } else {
+ if (cmd.resp[0] & CARD_BUSY) {
+ break;
+ }
+ }
+
+ err = -RT_ETIMEOUT;
+ mmcsd_delay_ms(10); // delay 10ms
+ }
+
+ if (rocr && !controller_is_spi(host)) {
+ *rocr = cmd.resp[0];
+ }
+
+ return err;
+}
+
+/*
+ * To support SD 2.0 cards, we must always invoke SD_SEND_IF_COND
+ * before SD_APP_OP_COND. This command will harmlessly fail for
+ * SD 1.0 cards.
+ */
+rt_err_t mmcsd_send_if_cond(struct rt_mmcsd_host *host, uint32_t ocr)
+{
+ struct rt_mmcsd_cmd cmd;
+ rt_err_t err;
+ uint8_t pattern;
+
+ cmd.cmd_code = SD_SEND_IF_COND;
+ cmd.arg = (((ocr & 0xFF8000) != 0) << 8) | 0xAA; // 8
+ cmd.flags = RESP_SPI_R7 | RESP_R7 | CMD_BCR;
+
+ err = mmcsd_send_cmd(host, &cmd, 0);
+ if (err) {
+ return err;
+ }
+
+ if (controller_is_spi(host)) {
+ pattern = cmd.resp[1] & 0xFF;
+ } else {
+ pattern = cmd.resp[0] & 0xFF;
+ }
+
+ if (pattern != 0xAA) {
+ return -RT_ERROR;
+ }
+ return RT_EOK;
+}
+
+rt_err_t mmcsd_get_card_addr(struct rt_mmcsd_host *host, uint32_t *rca)
+{
+ rt_err_t err;
+ struct rt_mmcsd_cmd cmd;
+
+ rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
+
+ cmd.cmd_code = SD_SEND_RELATIVE_ADDR;
+ cmd.arg = 0;
+ cmd.flags = RESP_R6 | CMD_BCR;
+
+ err = mmcsd_send_cmd(host, &cmd, 3); // 3
+ if (err) {
+ return err;
+ }
+ *rca = cmd.resp[0] >> 16; // 16
+
+ return RT_EOK;
+}
+
+#define be32_to_cpu(x) ((uint32_t)( \
+ (((uint32_t)(x) & (uint32_t)0x000000ffUL) << 24) | \
+ (((uint32_t)(x) & (uint32_t)0x0000ff00UL) << 8) | \
+ (((uint32_t)(x) & (uint32_t)0x00ff0000UL) >> 8) | \
+ (((uint32_t)(x) & (uint32_t)0xff000000UL) >> 24)))
+
+int32_t mmcsd_get_scr(struct rt_mmcsd_card *card, uint32_t *scr)
+{
+ int32_t err;
+ struct rt_mmcsd_req req;
+ struct rt_mmcsd_cmd cmd;
+ struct rt_mmcsd_data data;
+
+ err = mmcsd_app_cmd(card->host, card);
+ if (err) {
+ return err;
+ }
+
+ rt_memset(&req, 0, sizeof(struct rt_mmcsd_req));
+ rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
+ rt_memset(&data, 0, sizeof(struct rt_mmcsd_data));
+
+ req.cmd = &cmd;
+ req.data = &data;
+
+ cmd.cmd_code = SD_APP_SEND_SCR;
+ cmd.arg = 0;
+ cmd.flags = RESP_SPI_R1 | RESP_R1 | CMD_ADTC;
+
+ data.blksize = 8; // 8
+ data.blks = 1;
+ data.flags = DATA_DIR_READ;
+ data.buf = scr;
+
+ mmcsd_set_data_timeout(&data, card);
+ mmcsd_send_request(card->host, &req);
+ if (cmd.err) {
+ return cmd.err;
+ }
+ if (data.err) {
+ return data.err;
+ }
+
+ scr[0] = be32_to_cpu(scr[0]);
+ scr[1] = be32_to_cpu(scr[1]);
+
+ return 0;
+}
+
+
+static int32_t mmcsd_sd_init_card(struct rt_mmcsd_host *host, uint32_t ocr)
+{
+ struct rt_mmcsd_card *card;
+ int32_t err;
+ uint32_t resp[4]; // 4
+ uint32_t max_data_rate;
+
+ mmcsd_go_idle(host);
+
+ /*
+ * If SD_SEND_IF_COND indicates an SD 2.0
+ * compliant card and we should set bit 30
+ * of the ocr to indicate that we can handle
+ * block-addressed SDHC cards.
+ */
+ err = mmcsd_send_if_cond(host, ocr);
+ if (!err) {
+ ocr |= 1 << 30; // 30
+ }
+
+ err = mmcsd_send_app_op_cond(host, ocr, RT_NULL);
+ if (err) {
+ goto err;
+ }
+
+ if (controller_is_spi(host)) {
+ err = mmcsd_get_cid(host, resp);
+ } else {
+ err = mmcsd_all_get_cid(host, resp);
+ }
+ if (err) {
+ goto err;
+ }
+
+ card = rt_malloc(sizeof(struct rt_mmcsd_card));
+ if (!card) {
+ LOG_E("malloc card failed!");
+ err = -RT_ENOMEM;
+ goto err;
+ }
+ rt_memset(card, 0, sizeof(struct rt_mmcsd_card));
+
+ card->card_type = CARD_TYPE_SD;
+ card->host = host;
+ rt_memcpy(card->resp_cid, resp, sizeof(card->resp_cid));
+
+ /*
+ * For native busses: get card RCA and quit open drain mode.
+ */
+ if (!controller_is_spi(host)) {
+ err = mmcsd_get_card_addr(host, &card->rca);
+ if (err) {
+ goto err1;
+ }
+
+ mmcsd_set_bus_mode(host, MMCSD_BUSMODE_PUSHPULL);
+ }
+
+ err = mmcsd_get_csd(card, card->resp_csd);
+ if (err) { goto err1; }
+ err = mmcsd_parse_csd(card);
+ if (err) { goto err1; }
+
+ if (!controller_is_spi(host)) {
+ err = mmcsd_select_card(card);
+ if (err) { goto err1; }
+ }
+
+ err = mmcsd_get_scr(card, card->resp_scr);
+ if (err) { goto err1; }
+
+ mmcsd_parse_scr(card);
+ if (controller_is_spi(host)) {
+ err = mmcsd_spi_use_crc(host, 1);
+ if (err) { goto err1; }
+ }
+
+ /*
+ * change SD card to high-speed, only SD2.0 spec
+ */
+ err = mmcsd_switch(card);
+ if (err) { goto err1; }
+
+ /* set bus speed */
+ max_data_rate = (unsigned int)-1;
+
+ if (card->flags & CARD_FLAG_HIGHSPEED) {
+ if (max_data_rate > card->hs_max_data_rate) {
+ max_data_rate = card->hs_max_data_rate;
+ }
+ } else if (max_data_rate > card->max_data_rate) {
+ max_data_rate = card->max_data_rate;
+ }
+
+ mmcsd_set_clock(host, max_data_rate);
+
+ /* switch bus width */
+ if ((host->flags & MMCSD_BUSWIDTH_4) && (card->scr.sd_bus_widths & SD_SCR_BUS_WIDTH_4)) {
+ err = mmcsd_app_set_bus_width(card, MMCSD_BUS_WIDTH_4);
+ if (err) { goto err1; }
+ mmcsd_set_bus_width(host, MMCSD_BUS_WIDTH_4);
+ }
+
+ host->card = card;
+ return 0;
+
+err1:
+ rt_free(card);
+err:
+
+ return err;
+}
+
+/*
+ * Starting point for SD card init
+ */
+int32_t init_sd(struct rt_mmcsd_host *host, uint32_t ocr)
+{
+ int32_t err = 0;
+ uint32_t current_ocr;
+ /*
+ * We need to get OCR a different way for SPI
+ */
+ if (controller_is_spi(host)) {
+ mmcsd_go_idle(host);
+
+ err = mmcsd_spi_read_ocr(host, 0, &ocr);
+ if (err) { goto err; }
+ }
+
+ if (ocr & VDD_165_195) {
+ LOG_I(" SD card claims to support the " "incompletely defined 'low voltage range'. This " "will be ignored.");
+ ocr &= ~VDD_165_195;
+ }
+
+ current_ocr = mmcsd_select_voltage(host, ocr);
+ if (!current_ocr) {
+ err = -RT_ERROR;
+ goto err;
+ }
+
+ /*
+ * Detect and init the card
+ */
+ err = mmcsd_sd_init_card(host, current_ocr);
+ if (err) { goto err; }
+
+ mmcsd_host_unlock(host);
+ err = rt_mmcsd_blk_probe(host->card);
+ if (err) { goto remove_card; }
+ mmcsd_host_lock(host);
+
+ return 0;
+
+remove_card:
+ mmcsd_host_lock(host);
+ rt_mmcsd_blk_remove(host->card);
+ rt_free(host->card);
+ host->card = RT_NULL;
+err:
+
+ LOG_D("init SD card failed!");
+
+ return err;
+}
--- /dev/null
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2011-07-25 weety first version
+ */
+
+#ifndef __SD_H__
+#define __SD_H__
+
+#include "mmcsd_host.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+rt_err_t mmcsd_send_if_cond(struct rt_mmcsd_host *host, rt_uint32_t ocr);
+rt_err_t mmcsd_send_app_op_cond(struct rt_mmcsd_host *host, rt_uint32_t ocr, rt_uint32_t *rocr);
+
+rt_err_t mmcsd_get_card_addr(struct rt_mmcsd_host *host, rt_uint32_t *rca);
+rt_int32_t mmcsd_get_scr(struct rt_mmcsd_card *card, rt_uint32_t *scr);
+
+rt_int32_t init_sd(struct rt_mmcsd_host *host, rt_uint32_t ocr);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2012-01-13 weety first version
+ */
+
+#include "mmcsd_core.h"
+#include "liteos_adapter.h"
+#include "systick.h"
+#include "sd.h"
+#include "sdio.h"
+
+#define DBG_TAG "SDIO"
+#ifdef RT_SDIO_DEBUG
+#define DBG_LVL DBG_LOG
+#else
+#define DBG_LVL DBG_INFO
+#endif /* RT_SDIO_DEBUG */
+
+#ifndef RT_SDIO_STACK_SIZE
+#define RT_SDIO_STACK_SIZE 512
+#endif
+#ifndef RT_SDIO_THREAD_PRIORITY
+#define RT_SDIO_THREAD_PRIORITY 0x40
+#endif
+
+static rt_list_t sdio_cards = RT_LIST_OBJECT_INIT(sdio_cards);
+static rt_list_t sdio_drivers = RT_LIST_OBJECT_INIT(sdio_drivers);
+
+struct sdio_card {
+ struct rt_mmcsd_card *card;
+ rt_list_t list;
+};
+
+struct sdio_driver {
+ struct rt_sdio_driver *drv;
+ rt_list_t list;
+};
+
+#ifndef MIN
+#define MIN(a, b) (((a) < (b)) ? (a) : (b))
+#endif
+int32_t sdio_register_card(struct rt_mmcsd_card *card);
+
+static const uint8_t speed_value[16] = {
+ 0, 10, 12, 13, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 70, 80
+};
+
+static const uint32_t speed_unit[8] = {
+ 10000, 100000, 1000000, 10000000, 0, 0, 0, 0
+};
+
+rt_inline int32_t sdio_match_card(struct rt_mmcsd_card *card, const struct rt_sdio_device_id *id);
+void sdio_free_cis(struct rt_sdio_function *func);
+
+#define LOS_TASK_STATUS_DETACHED 0x0100 // add liteos type and function in mmc code
+
+int32_t sdio_io_send_op_cond(struct rt_mmcsd_host *host, uint32_t ocr, uint32_t *cmd5_resp)
+{
+ struct rt_mmcsd_cmd cmd;
+ int32_t i, err = 0;
+
+ RT_ASSERT(host != RT_NULL);
+
+ rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
+
+ cmd.cmd_code = SD_IO_SEND_OP_COND;
+ cmd.arg = ocr;
+ cmd.flags = RESP_SPI_R4 | RESP_R4 | CMD_BCR;
+
+ for (i = 100; i; i--) { // 100
+ err = mmcsd_send_cmd(host, &cmd, 0);
+ if (err)
+ break;
+
+ /* if we're just probing, do a single pass */
+ if (ocr == 0)
+ break;
+
+ /* otherwise wait until reset completes */
+ if (controller_is_spi(host)) {
+ /*
+ * Both R1_SPI_IDLE and MMC_CARD_BUSY indicate
+ * an initialized card under SPI, but some cards
+ * (Marvell's) only behave when looking at this
+ * one.
+ */
+ if (cmd.resp[1] & CARD_BUSY)
+ break;
+ } else {
+ if (cmd.resp[0] & CARD_BUSY)
+ break;
+ }
+
+ err = -RT_ETIMEOUT;
+ mmcsd_delay_ms(10); // 10
+ }
+
+ if (cmd5_resp) {
+ *cmd5_resp = cmd.resp[controller_is_spi(host) ? 1 : 0];
+ }
+ return err;
+}
+
+int32_t sdio_io_rw_direct(struct rt_mmcsd_card *card,
+ int32_t rw,
+ uint32_t fn,
+ uint32_t reg_addr,
+ uint8_t *pdata,
+ uint8_t raw)
+{
+ struct rt_mmcsd_cmd cmd;
+ int32_t err;
+
+ RT_ASSERT(card != RT_NULL);
+ RT_ASSERT(fn <= SDIO_MAX_FUNCTIONS);
+ RT_ASSERT(pdata != RT_NULL);
+
+ if (reg_addr & ~SDIO_ARG_CMD53_REG_MASK) { return -RT_ERROR; }
+
+ rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
+ cmd.cmd_code = SD_IO_RW_DIRECT;
+ cmd.arg = rw ? SDIO_ARG_CMD52_WRITE : SDIO_ARG_CMD52_READ;
+ cmd.arg |= fn << SDIO_ARG_CMD52_FUNC_SHIFT;
+ cmd.arg |= raw ? SDIO_ARG_CMD52_RAW_FLAG : 0x00000000;
+ cmd.arg |= reg_addr << SDIO_ARG_CMD52_REG_SHIFT;
+ cmd.arg |= *pdata;
+ cmd.flags = RESP_SPI_R5 | RESP_R5 | CMD_AC;
+
+ err = mmcsd_send_cmd(card->host, &cmd, 0);
+ if (err) { return err; }
+ if (!controller_is_spi(card->host)) {
+ if (cmd.resp[0] & R5_ERROR) { return -RT_EIO; }
+ if (cmd.resp[0] & R5_FUNCTION_NUMBER) { return -RT_ERROR; }
+ if (cmd.resp[0] & R5_OUT_OF_RANGE) { return -RT_ERROR; }
+ }
+
+ if (!rw || raw) {
+ if (controller_is_spi(card->host)) {
+ *pdata = (cmd.resp[0] >> 8) & 0xFF; // 8
+ } else {
+ *pdata = cmd.resp[0] & 0xFF;
+ }
+ }
+
+ return 0;
+}
+
+int32_t sdio_io_rw_extended(struct rt_mmcsd_card *card,
+ int32_t rw,
+ uint32_t fn,
+ uint32_t addr,
+ int32_t op_code,
+ uint8_t *buf,
+ uint32_t blocks,
+ uint32_t blksize)
+{
+ struct rt_mmcsd_req req;
+ struct rt_mmcsd_cmd cmd;
+ struct rt_mmcsd_data data;
+
+ RT_ASSERT(card != RT_NULL);
+ RT_ASSERT(fn <= SDIO_MAX_FUNCTIONS);
+ RT_ASSERT(blocks != 1 || blksize <= RT_SDIO_STACK_SIZE);
+ RT_ASSERT(blocks != 0);
+ RT_ASSERT(blksize != 0);
+
+ if (addr & ~SDIO_ARG_CMD53_REG_MASK) { return -RT_ERROR; }
+
+ rt_memset(&req, 0, sizeof(struct rt_mmcsd_req));
+ rt_memset(&cmd, 0, sizeof(struct rt_mmcsd_cmd));
+ rt_memset(&data, 0, sizeof(struct rt_mmcsd_data));
+
+ req.cmd = &cmd;
+ req.data = &data;
+
+ cmd.cmd_code = SD_IO_RW_EXTENDED;
+ cmd.arg = rw ? SDIO_ARG_CMD53_WRITE : SDIO_ARG_CMD53_READ;
+ cmd.arg |= fn << SDIO_ARG_CMD53_FUNC_SHIFT;
+ cmd.arg |= op_code ? SDIO_ARG_CMD53_INCREMENT : 0x00000000;
+ cmd.arg |= addr << SDIO_ARG_CMD53_REG_SHIFT;
+ if (blocks == 1 && blksize <= RT_SDIO_STACK_SIZE) {
+ cmd.arg |= (blksize == RT_SDIO_STACK_SIZE) ? 0 : blksize; /* 512 byte mode */
+ } else {
+ cmd.arg |= SDIO_ARG_CMD53_BLOCK_MODE | blocks; /* block mode */
+ }
+ cmd.flags = RESP_SPI_R5 | RESP_R5 | CMD_ADTC;
+
+ data.blksize = blksize;
+ data.blks = blocks;
+ data.flags = rw ? DATA_DIR_WRITE : DATA_DIR_READ;
+ data.buf = (uint32_t *)buf;
+
+ mmcsd_set_data_timeout(&data, card);
+
+ mmcsd_send_request(card->host, &req);
+
+ if (cmd.err) { return cmd.err; }
+ if (data.err) { return data.err; }
+
+ if (!controller_is_spi(card->host)) {
+ if (cmd.resp[0] & R5_ERROR) { return -RT_EIO; }
+ if (cmd.resp[0] & R5_FUNCTION_NUMBER) { return -RT_ERROR; }
+ if (cmd.resp[0] & R5_OUT_OF_RANGE) { return -RT_ERROR; }
+ }
+
+ return 0;
+}
+
+rt_inline uint32_t sdio_max_block_size(struct rt_sdio_function *func)
+{
+ uint32_t size = MIN(func->card->host->max_seg_size, func->card->host->max_blk_size);
+ size = MIN(size, func->max_blk_size);
+ return MIN(size, 512u); /* maximum size for byte mode 512 */
+}
+
+int32_t sdio_io_rw_extended_block(struct rt_sdio_function *func,
+ int32_t rw,
+ uint32_t addr,
+ int32_t op_code,
+ uint8_t *buf,
+ uint32_t len)
+{
+ int32_t ret;
+ uint32_t left_size;
+ uint32_t max_blks, blks;
+
+ left_size = len;
+
+ /* Do the bulk of the transfer using block mode (if supported). */
+ if (func->card->cccr.multi_block && (len > sdio_max_block_size(func))) {
+ max_blks = MIN(func->card->host->max_blk_count, func->card->host->max_seg_size / func->cur_blk_size);
+ max_blks = MIN(max_blks, 511u); // 511
+
+ while (left_size > func->cur_blk_size) {
+ blks = left_size / func->cur_blk_size;
+ if (blks > max_blks) {
+ blks = max_blks;
+ }
+ len = blks * func->cur_blk_size;
+
+ ret = sdio_io_rw_extended(func->card, rw, func->num, addr, op_code, buf, blks, func->cur_blk_size);
+ if (ret) { return ret; }
+ left_size -= len;
+ buf += len;
+ if (op_code) {
+ addr += len;
+ }
+ }
+ }
+
+ while (left_size > 0) {
+ len = MIN(left_size, sdio_max_block_size(func));
+ ret = sdio_io_rw_extended(func->card, rw, func->num, addr, op_code, buf, 1, len);
+ if (ret) { return ret; }
+ left_size -= len;
+ buf += len;
+ if (op_code) {
+ addr += len;
+ }
+ }
+ return 0;
+}
+
+uint8_t sdio_io_readb(struct rt_sdio_function *func, uint32_t reg, int32_t *err)
+{
+ uint8_t data = 0;
+ int32_t ret;
+
+ ret = sdio_io_rw_direct(func->card, 0, func->num, reg, &data, 0);
+ if (err) {
+ *err = ret;
+ }
+
+ return data;
+}
+
+int32_t sdio_io_writeb(struct rt_sdio_function *func, uint32_t reg, uint8_t data)
+{
+ return sdio_io_rw_direct(func->card, 1, func->num, reg, &data, 0);
+}
+
+rt_uint16_t sdio_io_readw(struct rt_sdio_function *func, uint32_t addr, int32_t *err)
+{
+ int32_t ret;
+ uint32_t dmabuf;
+
+ if (err) {
+ *err = 0;
+ }
+
+ ret = sdio_io_rw_extended_block(func, 0, addr, 1, (uint8_t *)&dmabuf, 2); // 2
+ if (ret) {
+ if (err) {
+ *err = ret;
+ }
+ }
+
+ return (rt_uint16_t)dmabuf;
+}
+
+int32_t sdio_io_writew(struct rt_sdio_function *func, rt_uint16_t data, uint32_t addr)
+{
+ uint32_t dmabuf = data;
+ return sdio_io_rw_extended_block(func, 1, addr, 1, (uint8_t *)&dmabuf, 2); // 2
+}
+
+uint32_t sdio_io_readl(struct rt_sdio_function *func, uint32_t addr, int32_t *err)
+{
+ int32_t ret;
+ uint32_t dmabuf;
+
+ if (err) {
+ *err = 0;
+ }
+
+ ret = sdio_io_rw_extended_block(func, 0, addr, 1, (uint8_t *)&dmabuf, 4); // 4
+ if (ret) {
+ if (err) {
+ *err = ret;
+ }
+ }
+
+ return dmabuf;
+}
+
+int32_t sdio_io_writel(struct rt_sdio_function *func, uint32_t data, uint32_t addr)
+{
+ uint32_t dmabuf = data;
+ return sdio_io_rw_extended_block(func, 1, addr, 1, (uint8_t *)&dmabuf, 4); // 4
+}
+
+int32_t sdio_io_read_multi_fifo_b(struct rt_sdio_function *func, uint32_t addr, uint8_t *buf, uint32_t len)
+{
+ return sdio_io_rw_extended_block(func, 0, addr, 0, buf, len);
+}
+
+int32_t sdio_io_write_multi_fifo_b(struct rt_sdio_function *func, uint32_t addr, uint8_t *buf, uint32_t len)
+{
+ return sdio_io_rw_extended_block(func, 1, addr, 0, buf, len);
+}
+
+int32_t sdio_io_read_multi_incr_b(struct rt_sdio_function *func, uint32_t addr, uint8_t *buf, uint32_t len)
+{
+ return sdio_io_rw_extended_block(func, 0, addr, 1, buf, len);
+}
+
+int32_t sdio_io_write_multi_incr_b(struct rt_sdio_function *func, uint32_t addr, uint8_t *buf, uint32_t len)
+{
+ return sdio_io_rw_extended_block(func, 1, addr, 1, buf, len);
+}
+
+static int32_t sdio_read_cccr(struct rt_mmcsd_card *card)
+{
+ int32_t ret;
+ int32_t cccr_version;
+ uint8_t data;
+
+ rt_memset(&card->cccr, 0, sizeof(struct rt_sdio_cccr));
+
+ data = sdio_io_readb(card->sdio_function[0], SDIO_REG_CCCR_CCCR_REV, &ret);
+ if (ret) { goto out; }
+
+ cccr_version = data & 0x0f;
+ if (cccr_version > SDIO_CCCR_REV_3_00) {
+ LOG_E("unrecognised CCCR structure version %d", cccr_version);
+ return -RT_ERROR;
+ }
+
+ card->cccr.sdio_version = (data & 0xf0) >> 4; // 4
+ data = sdio_io_readb(card->sdio_function[0], SDIO_REG_CCCR_CARD_CAPS, &ret);
+ if (ret) { goto out; }
+
+ if (data & SDIO_CCCR_CAP_SMB) {
+ card->cccr.multi_block = 1;
+ }
+ if (data & SDIO_CCCR_CAP_LSC) {
+ card->cccr.low_speed = 1;
+ }
+ if (data & SDIO_CCCR_CAP_4BLS) {
+ card->cccr.low_speed_4 = 1;
+ }
+ if (data & SDIO_CCCR_CAP_4BLS) {
+ card->cccr.bus_width = 1;
+ }
+
+ if (cccr_version >= SDIO_CCCR_REV_1_10) {
+ data = sdio_io_readb(card->sdio_function[0], SDIO_REG_CCCR_POWER_CTRL, &ret);
+ if (ret) { goto out; }
+ if (data & SDIO_POWER_SMPC) {
+ card->cccr.power_ctrl = 1;
+ }
+ }
+
+ if (cccr_version >= SDIO_CCCR_REV_1_20) {
+ data = sdio_io_readb(card->sdio_function[0], SDIO_REG_CCCR_SPEED, &ret);
+ if (ret) { goto out; }
+ if (data & SDIO_SPEED_SHS) {
+ card->cccr.high_speed = 1;
+ }
+ }
+
+out:
+ return ret;
+}
+
+static int32_t cistpl_funce_func0(struct rt_mmcsd_card *card, const uint8_t *buf, uint32_t size)
+{
+ if (size < 0x04 || buf[0] != 0) {
+ return -RT_ERROR;
+ }
+
+ /* TPLFE_FN0_BLK_SIZE */
+ card->cis.func0_blk_size = buf[1] | (buf[2] << 8); // 2 8
+
+ /* TPLFE_MAX_TRAN_SPEED */
+ card->cis.max_tran_speed = speed_value[(buf[3] >> 3) & 15] * speed_unit[buf[3] & 7]; // 3 15 7
+ return 0;
+}
+
+static int32_t cistpl_funce_func(struct rt_sdio_function *func, const uint8_t *buf, uint32_t size)
+{
+ uint32_t version;
+ uint32_t min_size;
+
+ version = func->card->cccr.sdio_version;
+ min_size = (version == SDIO_SDIO_REV_1_00) ? 28 : 42; // 28 42
+
+ if (size < min_size || buf[0] != 1) {
+ return -RT_ERROR;
+ }
+
+ /* TPLFE_MAX_BLK_SIZE */
+ func->max_blk_size = buf[12] | (buf[13] << 8); // 12 13 8
+
+ /* TPLFE_ENABLE_TIMEOUT_VAL, present in ver 1.1 and above */
+ if (version > SDIO_SDIO_REV_1_00) {
+ func->enable_timeout_val = (buf[28] | (buf[29] << 8)) * 10; // 28 29 8 10
+ } else {
+ func->enable_timeout_val = 1000; /* 1000ms */
+ }
+ return 0;
+}
+
+static int32_t sdio_read_cis(struct rt_sdio_function *func)
+{
+ int32_t ret;
+ struct rt_sdio_function_tuple *curr, **prev;
+ uint32_t i, cisptr = 0;
+ uint8_t data;
+ uint8_t tpl_code, tpl_link;
+
+ struct rt_mmcsd_card *card = func->card;
+ struct rt_sdio_function *func0 = card->sdio_function[0];
+
+ RT_ASSERT(func0 != RT_NULL);
+
+ for (i = 0; i < 3; i++) { // 3
+ data = sdio_io_readb(func0, SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_CIS + i, &ret);
+ if (ret) { return ret; }
+ cisptr |= data << (i * 8); // 8
+ }
+
+ prev = &func->tuples;
+
+ do {
+ tpl_code = sdio_io_readb(func0, cisptr++, &ret);
+ if (ret) { break; }
+
+ tpl_link = sdio_io_readb(func0, cisptr++, &ret);
+ if (ret) { break; }
+
+ if ((tpl_code == CISTPL_END) || (tpl_link == 0xff)) {
+ break;
+ }
+
+ if (tpl_code == CISTPL_NULL) { continue; }
+
+ curr = rt_malloc(sizeof(struct rt_sdio_function_tuple) + tpl_link);
+ if (!curr) { return -RT_ENOMEM; }
+ curr->data = (uint8_t *)curr + sizeof(struct rt_sdio_function_tuple);
+
+ for (i = 0; i < tpl_link; i++) {
+ curr->data[i] = sdio_io_readb(func0, cisptr + i, &ret);
+ if (ret) { break; }
+ }
+ if (ret) {
+ rt_free(curr);
+ break;
+ }
+
+ switch (tpl_code) {
+ case CISTPL_MANFID:
+ if (tpl_link < 4) { // 4
+ LOG_D("bad CISTPL_MANFID length");
+ break;
+ }
+ if (func->num != 0) {
+ func->manufacturer = curr->data[0];
+ func->manufacturer |= curr->data[1] << 8; // 8
+ func->product = curr->data[2]; // 2
+ func->product |= curr->data[3] << 8; // 8 3
+ } else {
+ card->cis.manufacturer = curr->data[0];
+ card->cis.manufacturer |= curr->data[1] << 8; // 8
+ card->cis.product = curr->data[2]; // 2
+ card->cis.product |= curr->data[3] << 8; // 3 8
+ }
+ break;
+ case CISTPL_FUNCE:
+ if (func->num != 0) {
+ ret = cistpl_funce_func(func, curr->data, tpl_link);
+ } else {
+ ret = cistpl_funce_func0(card, curr->data, tpl_link);
+ }
+
+ if (ret) {
+ LOG_D("bad CISTPL_FUNCE size %u "
+ "type %u", tpl_link, curr->data[0]);
+ }
+
+ break;
+ case CISTPL_VERS_1:
+ if (tpl_link < 2) { // 2
+ LOG_D("CISTPL_VERS_1 too short");
+ }
+ break;
+ default:
+ /* this tuple is unknown to the core */
+ curr->next = RT_NULL;
+ curr->code = tpl_code;
+ curr->size = tpl_link;
+ *prev = curr;
+ prev = &curr->next;
+ LOG_D("function %d, CIS tuple code %#x, length %d", func->num, tpl_code, tpl_link);
+ break;
+ }
+
+ cisptr += tpl_link;
+ } while (1);
+
+ /*
+ * Link in all unknown tuples found in the common CIS so that
+ * drivers don't have to go digging in two places.
+ */
+ if (func->num != 0) {
+ *prev = func0->tuples;
+ }
+
+ return ret;
+}
+
+
+void sdio_free_cis(struct rt_sdio_function *func)
+{
+ struct rt_sdio_function_tuple *tuple, *tmp;
+ struct rt_mmcsd_card *card = func->card;
+
+ tuple = func->tuples;
+
+ while (tuple && ((tuple != card->sdio_function[0]->tuples) || (!func->num))) {
+ tmp = tuple;
+ tuple = tuple->next;
+ rt_free(tmp);
+ }
+
+ func->tuples = RT_NULL;
+}
+
+static int32_t sdio_read_fbr(struct rt_sdio_function *func)
+{
+ int32_t ret;
+ uint8_t data;
+ struct rt_sdio_function *func0 = func->card->sdio_function[0];
+
+ data = sdio_io_readb(func0, SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_STD_FUNC_IF, &ret);
+ if (ret) { goto err; }
+
+ data &= 0x0f;
+ if (data == 0x0f) {
+ data = sdio_io_readb(func0, SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_STD_IF_EXT, &ret);
+ if (ret) { goto err; }
+ }
+
+ func->func_code = data;
+
+err:
+ return ret;
+}
+
+static int32_t sdio_initialize_function(struct rt_mmcsd_card *card, uint32_t func_num)
+{
+ int32_t ret;
+ struct rt_sdio_function *func;
+
+ RT_ASSERT(func_num <= SDIO_MAX_FUNCTIONS);
+
+ func = rt_malloc(sizeof(struct rt_sdio_function));
+ if (!func) {
+ LOG_E("malloc rt_sdio_function failed");
+ ret = -RT_ENOMEM;
+ goto err;
+ }
+ rt_memset(func, 0, sizeof(struct rt_sdio_function));
+
+ func->card = card;
+ func->num = func_num;
+
+ ret = sdio_read_fbr(func);
+ if (ret) { goto err1; }
+
+ ret = sdio_read_cis(func);
+ if (ret) { goto err1; }
+ /*
+ * product/manufacturer id is optional for function CIS, so
+ * copy it from the card structure as needed.
+ */
+ if (func->product == 0) {
+ func->manufacturer = card->cis.manufacturer;
+ func->product = card->cis.product;
+ }
+ card->sdio_function[func_num] = func;
+ return 0;
+
+err1:
+ sdio_free_cis(func);
+ rt_free(func);
+ card->sdio_function[func_num] = RT_NULL;
+
+err:
+ return ret;
+}
+
+static int32_t sdio_set_highspeed(struct rt_mmcsd_card *card)
+{
+ int32_t ret;
+ uint8_t speed;
+
+ if (!(card->host->flags & MMCSD_SUP_HIGHSPEED)) { return 0; }
+ if (!card->cccr.high_speed) { return 0; }
+
+ speed = sdio_io_readb(card->sdio_function[0], SDIO_REG_CCCR_SPEED, &ret);
+ if (ret) { return ret; }
+
+ speed |= SDIO_SPEED_EHS;
+ ret = sdio_io_writeb(card->sdio_function[0], SDIO_REG_CCCR_SPEED, speed);
+ if (ret) { return ret; }
+ card->flags |= CARD_FLAG_HIGHSPEED;
+ return 0;
+}
+
+static int32_t sdio_set_bus_wide(struct rt_mmcsd_card *card)
+{
+ int32_t ret;
+ uint8_t busif;
+
+ if (!(card->host->flags & MMCSD_BUSWIDTH_4)) { return 0; }
+ if (card->cccr.low_speed && !card->cccr.bus_width) { return 0; }
+
+ busif = sdio_io_readb(card->sdio_function[0], SDIO_REG_CCCR_BUS_IF, &ret);
+ if (ret) { return ret; }
+
+ busif |= SDIO_BUS_WIDTH_4BIT;
+ ret = sdio_io_writeb(card->sdio_function[0], SDIO_REG_CCCR_BUS_IF, busif);
+ if (ret) { return ret; }
+
+ mmcsd_set_bus_width(card->host, MMCSD_BUS_WIDTH_4);
+ return 0;
+}
+
+int32_t sdio_register_card(struct rt_mmcsd_card *card)
+{
+ struct sdio_card *sc;
+ struct sdio_driver *sd;
+ rt_list_t *l;
+
+ sc = rt_malloc(sizeof(struct sdio_card));
+ if (sc == RT_NULL) {
+ LOG_E("malloc sdio card failed");
+ return -RT_ENOMEM;
+ }
+
+ sc->card = card;
+ rt_list_insert_after(&sdio_cards, &sc->list);
+
+ if (rt_list_isempty(&sdio_drivers)) {
+ goto out;
+ }
+
+ for (l = (&sdio_drivers)->next; l != &sdio_drivers; l = l->next) {
+ sd = (struct sdio_driver *)rt_list_entry(l, struct sdio_driver, list);
+ if (sdio_match_card(card, sd->drv->id)) {
+ sd->drv->probe(card);
+ }
+ }
+
+out:
+ return 0;
+}
+
+static int32_t sdio_init_card(struct rt_mmcsd_host *host, uint32_t ocr)
+{
+ int32_t err = 0;
+ int32_t i, function_num;
+ uint32_t cmd5_resp;
+ struct rt_mmcsd_card *card;
+
+ err = sdio_io_send_op_cond(host, ocr, &cmd5_resp);
+ if (err) { goto err; }
+
+ if (controller_is_spi(host)) {
+ err = mmcsd_spi_use_crc(host, host->spi_use_crc);
+ if (err) { goto err; }
+ }
+
+ function_num = (cmd5_resp & 0x70000000) >> 28; // 28
+
+ card = rt_malloc(sizeof(struct rt_mmcsd_card));
+ if (!card) {
+ LOG_E("malloc card failed");
+ err = -RT_ENOMEM;
+ goto err;
+ }
+ rt_memset(card, 0, sizeof(struct rt_mmcsd_card));
+
+ card->card_type = CARD_TYPE_SDIO;
+ card->sdio_function_num = function_num;
+ card->host = host;
+ host->card = card;
+
+ card->sdio_function[0] = rt_malloc(sizeof(struct rt_sdio_function));
+ if (!card->sdio_function[0]) {
+ LOG_E("malloc sdio_func0 failed");
+ err = -RT_ENOMEM;
+ goto err1;
+ }
+ rt_memset(card->sdio_function[0], 0, sizeof(struct rt_sdio_function));
+ card->sdio_function[0]->card = card;
+ card->sdio_function[0]->num = 0;
+
+ if (!controller_is_spi(host)) {
+ err = mmcsd_get_card_addr(host, &card->rca);
+ if (err) { goto err2; }
+
+ mmcsd_set_bus_mode(host, MMCSD_BUSMODE_PUSHPULL);
+ }
+
+ if (!controller_is_spi(host)) {
+ err = mmcsd_select_card(card);
+ if (err) { goto err2; }
+ }
+
+ err = sdio_read_cccr(card);
+ if (err) { goto err2; }
+
+ err = sdio_read_cis(card->sdio_function[0]);
+ if (err) { goto err2; }
+
+ err = sdio_set_highspeed(card);
+ if (err) { goto err2; }
+
+ if (card->flags & CARD_FLAG_HIGHSPEED) {
+ mmcsd_set_clock(host, 50000000); // 50000000
+ } else {
+ mmcsd_set_clock(host, card->cis.max_tran_speed);
+ }
+
+ err = sdio_set_bus_wide(card);
+ if (err) { goto err2; }
+
+ for (i = 1; i < function_num + 1; i++) {
+ err = sdio_initialize_function(card, i);
+ if (err) { goto err3; }
+ }
+
+ return 0;
+
+err3:
+ if (host->card) {
+ for (i = 1; i < host->card->sdio_function_num + 1; i++) {
+ if (host->card->sdio_function[i]) {
+ sdio_free_cis(host->card->sdio_function[i]);
+ rt_free(host->card->sdio_function[i]);
+ host->card->sdio_function[i] = RT_NULL;
+ rt_free(host->card);
+ host->card = RT_NULL;
+ break;
+ }
+ }
+ }
+
+err2:
+ if (host->card && host->card->sdio_function[0]) {
+ sdio_free_cis(host->card->sdio_function[0]);
+ rt_free(host->card->sdio_function[0]);
+ host->card->sdio_function[0] = RT_NULL;
+ }
+
+err1:
+ if (host->card) {
+ rt_free(host->card);
+ }
+
+err:
+ LOG_E("error %d while initialising SDIO card", err);
+ return err;
+}
+
+int32_t init_sdio(struct rt_mmcsd_host *host, uint32_t ocr)
+{
+ int32_t err;
+ uint32_t current_ocr;
+
+ RT_ASSERT(host != RT_NULL);
+
+ if (ocr & 0x7F) {
+ LOG_W("Card ocr below the defined voltage rang.");
+ ocr &= ~0x7F;
+ }
+
+ if (ocr & VDD_165_195) {
+ LOG_W("Can't support the low voltage SDIO card.");
+ ocr &= ~VDD_165_195;
+ }
+
+ current_ocr = mmcsd_select_voltage(host, ocr);
+ if (!current_ocr) {
+ err = -RT_ERROR;
+ goto err;
+ }
+
+ err = sdio_init_card(host, current_ocr);
+ if (err) {
+ goto remove_card;
+ }
+ return 0;
+
+remove_card:
+ rt_free(host->card);
+ host->card = RT_NULL;
+
+err:
+ LOG_E("init SDIO card failed");
+ return err;
+}
+
+int32_t deinit_sdio_free_mem(struct rt_mmcsd_host *host)
+{
+ if (host == RT_NULL || host->card == RT_NULL) {
+ return -RT_EINVAL;
+ }
+ for (int i = 0; i < host->card->sdio_function_num + 1; i++) {
+ if (host->card->sdio_function[i]) {
+ sdio_free_cis(host->card->sdio_function[i]);
+ rt_free(host->card->sdio_function[i]);
+ host->card->sdio_function[i] = RT_NULL;
+ }
+ }
+ rt_free(host->card);
+ host->card = RT_NULL;
+ return 0;
+}
+
+static void sdio_irq_thread(void *param)
+{
+ int32_t i, ret;
+ uint8_t pending;
+ struct rt_mmcsd_card *card;
+ struct rt_mmcsd_host *host = (struct rt_mmcsd_host *)param;
+ RT_ASSERT(host != RT_NULL);
+ card = host->card;
+ RT_ASSERT(card != RT_NULL);
+
+ while (1) {
+ if (hi_mmc_sem_pend(host->sdio_irq_sem, MMC_SEM_WAIT_FOREVER) == RT_EOK) {
+ mmcsd_host_lock(host);
+ pending = sdio_io_readb(host->card->sdio_function[0], SDIO_REG_CCCR_INT_PEND, &ret);
+ if (ret) {
+ mmcsd_dbg("error %d reading SDIO_REG_CCCR_INT_PEND\n", ret);
+ goto out;
+ }
+
+ for (i = 1; i <= 7; i++) { // 7
+ if (pending & (1 << i)) {
+ struct rt_sdio_function *func = card->sdio_function[i];
+ if (!func) {
+ mmcsd_dbg("pending IRQ for "
+ "non-existant function %d\n", func->num);
+ goto out;
+ } else if (func->irq_handler) {
+ func->irq_handler(func);
+ } else {
+ mmcsd_dbg("pending IRQ with no register handler\n");
+ goto out;
+ }
+ }
+ }
+
+ out:
+ mmcsd_host_unlock(host);
+ if (host->flags & MMCSD_SUP_SDIO_IRQ) {
+ host->ops->enable_sdio_irq(host, 1);
+ }
+ continue;
+ }
+ }
+}
+
+int32_t sdio_attach_irq(struct rt_sdio_function *func, rt_sdio_irq_handler_t *handler)
+{
+ int32_t ret;
+ uint8_t reg;
+ struct rt_sdio_function *func0;
+
+ RT_ASSERT(func != RT_NULL);
+ RT_ASSERT(func->card != RT_NULL);
+
+ func0 = func->card->sdio_function[0];
+
+ mmcsd_dbg("SDIO: enabling IRQ for function %d\n", func->num);
+
+ if (func->irq_handler) {
+ mmcsd_dbg("SDIO: IRQ for already in use.\n");
+ return -RT_EBUSY;
+ }
+
+ reg = sdio_io_readb(func0, SDIO_REG_CCCR_INT_EN, &ret);
+ if (ret) { return ret; }
+
+ reg |= 1 << func->num;
+ reg |= 1; /* Master interrupt enable */
+
+ ret = sdio_io_writeb(func0, SDIO_REG_CCCR_INT_EN, reg);
+ if (ret) { return ret; }
+
+ func->irq_handler = handler;
+ ret = sdio_irq_thread_create(func->card);
+ if (ret) {
+ func->irq_handler = RT_NULL;
+ }
+
+ return ret;
+}
+
+int32_t sdio_detach_irq(struct rt_sdio_function *func)
+{
+ int32_t ret;
+ uint8_t reg;
+ struct rt_sdio_function *func0;
+
+ RT_ASSERT(func != RT_NULL);
+ RT_ASSERT(func->card != RT_NULL);
+
+ func0 = func->card->sdio_function[0];
+
+ mmcsd_dbg("SDIO: disabling IRQ for function %d\n", func->num);
+
+ if (func->irq_handler) {
+ func->irq_handler = RT_NULL;
+ sdio_irq_thread_delete(func->card);
+ }
+
+ reg = sdio_io_readb(func0, SDIO_REG_CCCR_INT_EN, &ret);
+ if (ret) { return ret; }
+ reg &= ~(1 << func->num);
+ /* Disable master interrupt with the last function interrupt */
+ if (!(reg & 0xFE)) {
+ reg = 0;
+ }
+
+ ret = sdio_io_writeb(func0, SDIO_REG_CCCR_INT_EN, reg);
+ if (ret) { return ret; }
+
+ return 0;
+}
+
+void sdio_irq_wakeup(struct rt_mmcsd_host *host)
+{
+ if (host->flags & MMCSD_SUP_SDIO_IRQ) {
+ host->ops->enable_sdio_irq(host, 0);
+ }
+ if (host->sdio_irq_sem != 0) {
+ hi_mmc_sem_post(host->sdio_irq_sem);
+ }
+}
+
+int32_t sdio_enable_func(struct rt_sdio_function *func)
+{
+ int32_t ret;
+ uint8_t reg;
+ uint32_t timeout;
+ struct rt_sdio_function *func0;
+
+ RT_ASSERT(func != RT_NULL);
+ RT_ASSERT(func->card != RT_NULL);
+
+ func0 = func->card->sdio_function[0];
+
+ mmcsd_dbg("SDIO: enabling function %d\n", func->num);
+
+ reg = sdio_io_readb(func0, SDIO_REG_CCCR_IO_EN, &ret);
+ if (ret) { goto err; }
+ reg |= 1 << func->num;
+ ret = sdio_io_writeb(func0, SDIO_REG_CCCR_IO_EN, reg);
+ if (ret) { goto err; }
+
+ timeout = uapi_systick_get_count() + func->enable_timeout_val * RT_TICK_PER_SECOND / 1000; // 1000
+ while (1) {
+ reg = sdio_io_readb(func0, SDIO_REG_CCCR_IO_RDY, &ret);
+ if (ret) { goto err; }
+ if (reg & (1 << func->num)) { break; }
+ ret = -RT_ETIMEOUT;
+ if (uapi_systick_get_count() > timeout) { goto err; }
+ }
+
+ mmcsd_dbg("SDIO: enabled function successfull\n");
+ return 0;
+
+err:
+ mmcsd_dbg("SDIO: failed to enable function %d\n", func->num);
+ return ret;
+}
+
+int32_t sdio_disable_func(struct rt_sdio_function *func)
+{
+ int32_t ret;
+ uint8_t reg;
+ struct rt_sdio_function *func0;
+
+ RT_ASSERT(func != RT_NULL);
+ RT_ASSERT(func->card != RT_NULL);
+
+ func0 = func->card->sdio_function[0];
+ mmcsd_dbg("SDIO: disabling function %d\n", func->num);
+ reg = sdio_io_readb(func0, SDIO_REG_CCCR_IO_EN, &ret);
+ if (ret) { goto err; }
+
+ reg &= ~(1 << func->num);
+ ret = sdio_io_writeb(func0, SDIO_REG_CCCR_IO_EN, reg);
+ if (ret) { goto err; }
+ mmcsd_dbg("SDIO: disabled function successfull\n");
+ return 0;
+
+err:
+ mmcsd_dbg("SDIO: failed to disable function %d\n", func->num);
+ return -RT_EIO;
+}
+
+void sdio_set_drvdata(struct rt_sdio_function *func, void *data)
+{
+ func->priv = data;
+}
+
+void* sdio_get_drvdata(struct rt_sdio_function *func)
+{
+ return func->priv;
+}
+
+int32_t sdio_set_block_size(struct rt_sdio_function *func, uint32_t blksize)
+{
+ int32_t ret;
+ struct rt_sdio_function *func0 = func->card->sdio_function[0];
+
+ if (blksize > func->card->host->max_blk_size) {
+ return -RT_ERROR;
+ }
+
+ if (blksize == 0) {
+ blksize = MIN(func->max_blk_size, func->card->host->max_blk_size);
+ blksize = MIN(blksize, 512u); // 512
+ }
+
+ ret = sdio_io_writeb(func0, SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_BLKSIZE, blksize & 0xff);
+ if (ret) { return ret; }
+
+ ret = sdio_io_writeb(func0, SDIO_REG_FBR_BASE(func->num) + SDIO_REG_FBR_BLKSIZE + 1, (blksize >> 8) & 0xff); // 8
+ if (ret) { return ret; }
+
+ func->cur_blk_size = blksize;
+ return 0;
+}
+
+rt_inline int32_t sdio_match_card(struct rt_mmcsd_card *card, const struct rt_sdio_device_id *id)
+{
+ uint8_t num = 1;
+
+ if ((id->manufacturer != SDIO_ANY_MAN_ID) && (id->manufacturer != card->cis.manufacturer)) {
+ return 0;
+ }
+
+ while (num <= card->sdio_function_num) {
+ if ((id->product != SDIO_ANY_PROD_ID) && (id->product == card->sdio_function[num]->product)) {
+ return 1;
+ }
+ num++;
+ }
+
+ return 0;
+}
+
+static struct rt_mmcsd_card *sdio_match_driver(struct rt_sdio_device_id *id)
+{
+ rt_list_t *l;
+ struct sdio_card *sc;
+ struct rt_mmcsd_card *card;
+
+ for (l = (&sdio_cards)->next; l != &sdio_cards; l = l->next) {
+ sc = (struct sdio_card *)rt_list_entry(l, struct sdio_card, list);
+ card = sc->card;
+
+ if (sdio_match_card(card, id)) {
+ return card;
+ }
+ }
+
+ return RT_NULL;
+}
+
+int32_t sdio_register_driver(struct rt_sdio_driver *driver)
+{
+ struct sdio_driver *sd;
+ struct rt_mmcsd_card *card;
+
+ sd = rt_malloc(sizeof(struct sdio_driver));
+ if (sd == RT_NULL) {
+ LOG_E("malloc sdio driver failed");
+ return -RT_ENOMEM;
+ }
+
+ sd->drv = driver;
+ rt_list_insert_after(&sdio_drivers, &sd->list);
+
+ if (!rt_list_isempty(&sdio_cards)) {
+ card = sdio_match_driver(driver->id);
+ if (card != RT_NULL) {
+ return driver->probe(card);
+ }
+ }
+
+ return -RT_EEMPTY;
+}
+
+int32_t sdio_unregister_driver(struct rt_sdio_driver *driver)
+{
+ rt_list_t *l;
+ struct sdio_driver *sd = RT_NULL;
+ struct rt_mmcsd_card *card;
+
+ for (l = (&sdio_drivers)->next; l != &sdio_drivers; l = l->next) {
+ sd = (struct sdio_driver *)rt_list_entry(l, struct sdio_driver, list);
+ if (sd->drv != driver) {
+ sd = RT_NULL;
+ }
+ }
+
+ if (sd == RT_NULL) {
+ LOG_E("SDIO driver %s not register", driver->name);
+ return -RT_ERROR;
+ }
+
+ if (!rt_list_isempty(&sdio_cards)) {
+ card = sdio_match_driver(driver->id);
+ if (card != RT_NULL) {
+ driver->remove(card);
+ rt_list_remove(&sd->list);
+ rt_free(sd);
+ }
+ }
+
+ return 0;
+}
+
+void rt_sdio_init(void)
+{
+}
+
--- /dev/null
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2012-01-15 weety first version
+ */
+
+#ifndef __SDIO_H__
+#define __SDIO_H__
+
+#include "mmcsd_host.h"
+#include "mmcsd_card.h"
+#include "sdio_func_ids.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Card Common Control Registers (CCCR)
+ */
+
+#define SDIO_REG_CCCR_CCCR_REV 0x00
+
+#define SDIO_CCCR_REV_1_00 0 /* CCCR/FBR Version 1.00 */
+#define SDIO_CCCR_REV_1_10 1 /* CCCR/FBR Version 1.10 */
+#define SDIO_CCCR_REV_1_20 2 /* CCCR/FBR Version 1.20 */
+#define SDIO_CCCR_REV_3_00 3 /* CCCR/FBR Version 2.00 */
+
+#define SDIO_SDIO_REV_1_00 0 /* SDIO Spec Version 1.00 */
+#define SDIO_SDIO_REV_1_10 1 /* SDIO Spec Version 1.10 */
+#define SDIO_SDIO_REV_1_20 2 /* SDIO Spec Version 1.20 */
+#define SDIO_SDIO_REV_2_00 3 /* SDIO Spec Version 2.00 */
+
+#define SDIO_REG_CCCR_SD_REV 0x01
+
+#define SDIO_SD_REV_1_01 0 /* SD Physical Spec Version 1.01 */
+#define SDIO_SD_REV_1_10 1 /* SD Physical Spec Version 1.10 */
+#define SDIO_SD_REV_2_00 2 /* SD Physical Spec Version 2.00 */
+
+#define SDIO_REG_CCCR_IO_EN 0x02
+#define SDIO_REG_CCCR_IO_RDY 0x03
+
+#define SDIO_REG_CCCR_INT_EN 0x04 /* Function/Master Interrupt Enable */
+#define SDIO_REG_CCCR_INT_PEND 0x05 /* Function Interrupt Pending */
+
+#define SDIO_REG_CCCR_IO_ABORT 0x06 /* function abort/card reset */
+
+#define SDIO_REG_CCCR_BUS_IF 0x07 /* bus interface controls */
+
+#define SDIO_BUS_WIDTH_1BIT 0x00
+#define SDIO_BUS_WIDTH_4BIT 0x02
+#define SDIO_BUS_ECSI 0x20 /* Enable continuous SPI interrupt */
+#define SDIO_BUS_SCSI 0x40 /* Support continuous SPI interrupt */
+
+#define SDIO_BUS_ASYNC_INT 0x20
+
+#define SDIO_BUS_CD_DISABLE 0x80 /* disable pull-up on DAT3 (pin 1) */
+
+#define SDIO_REG_CCCR_CARD_CAPS 0x08
+
+#define SDIO_CCCR_CAP_SDC 0x01 /* can do CMD52 while data transfer */
+#define SDIO_CCCR_CAP_SMB 0x02 /* can do multi-block xfers (CMD53) */
+#define SDIO_CCCR_CAP_SRW 0x04 /* supports read-wait protocol */
+#define SDIO_CCCR_CAP_SBS 0x08 /* supports suspend/resume */
+#define SDIO_CCCR_CAP_S4MI 0x10 /* interrupt during 4-bit CMD53 */
+#define SDIO_CCCR_CAP_E4MI 0x20 /* enable ints during 4-bit CMD53 */
+#define SDIO_CCCR_CAP_LSC 0x40 /* low speed card */
+#define SDIO_CCCR_CAP_4BLS 0x80 /* 4 bit low speed card */
+
+#define SDIO_REG_CCCR_CIS_PTR 0x09 /* common CIS pointer (3 bytes) */
+
+/* Following 4 regs are valid only if SBS is set */
+#define SDIO_REG_CCCR_BUS_SUSPEND 0x0c
+#define SDIO_REG_CCCR_FUNC_SEL 0x0d
+#define SDIO_REG_CCCR_EXEC_FLAG 0x0e
+#define SDIO_REG_CCCR_READY_FLAG 0x0f
+
+#define SDIO_REG_CCCR_FN0_BLKSIZE 0x10 /* 2bytes, 0x10~0x11 */
+
+#define SDIO_REG_CCCR_POWER_CTRL 0x12
+
+#define SDIO_POWER_SMPC 0x01 /* Supports Master Power Control */
+#define SDIO_POWER_EMPC 0x02 /* Enable Master Power Control */
+
+#define SDIO_REG_CCCR_SPEED 0x13
+
+#define SDIO_SPEED_SHS 0x01 /* Supports High-Speed mode */
+#define SDIO_SPEED_EHS 0x02 /* Enable High-Speed mode */
+
+/*
+ * Function Basic Registers (FBR)
+ */
+
+#define SDIO_REG_FBR_BASE(f) ((f) * 0x100) /* base of function f's FBRs */
+
+#define SDIO_REG_FBR_STD_FUNC_IF 0x00
+
+#define SDIO_FBR_SUPPORTS_CSA 0x40 /* supports Code Storage Area */
+#define SDIO_FBR_ENABLE_CSA 0x80 /* enable Code Storage Area */
+
+#define SDIO_REG_FBR_STD_IF_EXT 0x01
+
+#define SDIO_REG_FBR_POWER 0x02
+
+#define SDIO_FBR_POWER_SPS 0x01 /* Supports Power Selection */
+#define SDIO_FBR_POWER_EPS 0x02 /* Enable (low) Power Selection */
+
+#define SDIO_REG_FBR_CIS 0x09 /* CIS pointer (3 bytes) */
+
+
+#define SDIO_REG_FBR_CSA 0x0C /* CSA pointer (3 bytes) */
+
+#define SDIO_REG_FBR_CSA_DATA 0x0F
+
+#define SDIO_REG_FBR_BLKSIZE 0x10 /* block size (2 bytes) */
+
+/* SDIO CIS Tuple code */
+#define CISTPL_NULL 0x00
+#define CISTPL_CHECKSUM 0x10
+#define CISTPL_VERS_1 0x15
+#define CISTPL_ALTSTR 0x16
+#define CISTPL_MANFID 0x20
+#define CISTPL_FUNCID 0x21
+#define CISTPL_FUNCE 0x22
+#define CISTPL_SDIO_STD 0x91
+#define CISTPL_SDIO_EXT 0x92
+#define CISTPL_END 0xff
+
+/* SDIO device id */
+#define SDIO_ANY_FUNC_ID 0xff
+#define SDIO_ANY_MAN_ID 0xffff
+#define SDIO_ANY_PROD_ID 0xffff
+
+struct rt_sdio_device_id {
+ rt_uint8_t func_code;
+ rt_uint16_t manufacturer;
+ rt_uint16_t product;
+};
+
+struct rt_sdio_driver {
+ char *name;
+ rt_int32_t (*probe)(struct rt_mmcsd_card *card);
+ rt_int32_t (*remove)(struct rt_mmcsd_card *card);
+ struct rt_sdio_device_id *id;
+};
+
+rt_int32_t sdio_io_send_op_cond(struct rt_mmcsd_host *host,
+ rt_uint32_t ocr,
+ rt_uint32_t *cmd5_resp);
+rt_int32_t sdio_io_rw_direct(struct rt_mmcsd_card *card,
+ rt_int32_t rw,
+ rt_uint32_t fn,
+ rt_uint32_t reg_addr,
+ rt_uint8_t *pdata,
+ rt_uint8_t raw);
+rt_int32_t sdio_io_rw_extended(struct rt_mmcsd_card *card,
+ rt_int32_t rw,
+ rt_uint32_t fn,
+ rt_uint32_t addr,
+ rt_int32_t op_code,
+ rt_uint8_t *buf,
+ rt_uint32_t blocks,
+ rt_uint32_t blksize);
+rt_int32_t sdio_io_rw_extended_block(struct rt_sdio_function *func,
+ rt_int32_t rw,
+ rt_uint32_t addr,
+ rt_int32_t op_code,
+ rt_uint8_t *buf,
+ rt_uint32_t len);
+rt_uint8_t sdio_io_readb(struct rt_sdio_function *func,
+ rt_uint32_t reg,
+ rt_int32_t *err);
+rt_int32_t sdio_io_writeb(struct rt_sdio_function *func,
+ rt_uint32_t reg,
+ rt_uint8_t data);
+rt_uint16_t sdio_io_readw(struct rt_sdio_function *func,
+ rt_uint32_t addr,
+ rt_int32_t *err);
+rt_int32_t sdio_io_writew(struct rt_sdio_function *func,
+ rt_uint16_t data,
+ rt_uint32_t addr);
+rt_uint32_t sdio_io_readl(struct rt_sdio_function *func,
+ rt_uint32_t addr,
+ rt_int32_t *err);
+rt_int32_t sdio_io_writel(struct rt_sdio_function *func,
+ rt_uint32_t data,
+ rt_uint32_t addr);
+rt_int32_t sdio_io_read_multi_fifo_b(struct rt_sdio_function *func,
+ rt_uint32_t addr,
+ rt_uint8_t *buf,
+ rt_uint32_t len);
+rt_int32_t sdio_io_write_multi_fifo_b(struct rt_sdio_function *func,
+ rt_uint32_t addr,
+ rt_uint8_t *buf,
+ rt_uint32_t len);
+rt_int32_t sdio_io_read_multi_incr_b(struct rt_sdio_function *func,
+ rt_uint32_t addr,
+ rt_uint8_t *buf,
+ rt_uint32_t len);
+rt_int32_t sdio_io_write_multi_incr_b(struct rt_sdio_function *func,
+ rt_uint32_t addr,
+ rt_uint8_t *buf,
+ rt_uint32_t len);
+rt_int32_t init_sdio(struct rt_mmcsd_host *host, rt_uint32_t ocr);
+rt_int32_t sdio_attach_irq(struct rt_sdio_function *func,
+ rt_sdio_irq_handler_t *handler);
+rt_int32_t sdio_detach_irq(struct rt_sdio_function *func);
+void sdio_irq_wakeup(struct rt_mmcsd_host *host);
+rt_int32_t sdio_enable_func(struct rt_sdio_function *func);
+rt_int32_t sdio_disable_func(struct rt_sdio_function *func);
+void sdio_set_drvdata(struct rt_sdio_function *func, void *data);
+void* sdio_get_drvdata(struct rt_sdio_function *func);
+rt_int32_t sdio_set_block_size(struct rt_sdio_function *func,
+ rt_uint32_t blksize);
+rt_int32_t sdio_register_driver(struct rt_sdio_driver *driver);
+rt_int32_t sdio_unregister_driver(struct rt_sdio_driver *driver);
+void rt_sdio_init(void);
+rt_int32_t deinit_sdio_free_mem(struct rt_mmcsd_host *host);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
--- /dev/null
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2012-02-26 weety first version
+ */
+
+#ifndef __SDIO_FUNC_IDS_H__
+#define __SDIO_FUNC_IDS_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Standard SDIO Function Interfaces */
+
+#define SDIO_FUNC_CODE_NONE 0x00 /* Not a SDIO standard interface */
+#define SDIO_FUNC_CODE_UART 0x01 /* SDIO Standard UART */
+#define SDIO_FUNC_CODE_BT_A 0x02 /* SDIO Type-A for Bluetooth standard interface */
+#define SDIO_FUNC_CODE_BT_B 0x03 /* SDIO Type-B for Bluetooth standard interface */
+#define SDIO_FUNC_CODE_GPS 0x04 /* SDIO GPS standard interface */
+#define SDIO_FUNC_CODE_CAMERA 0x05 /* SDIO Camera standard interface */
+#define SDIO_FUNC_CODE_PHS 0x06 /* SDIO PHS standard interface */
+#define SDIO_FUNC_CODE_WLAN 0x07 /* SDIO WLAN interface */
+#define SDIO_FUNC_CODE_ATA 0x08 /* Embedded SDIO-ATA standard interface */
+
+/* manufacturer id, product io */
+
+#define SDIO_MANUFACTURER_ID_MARVELL 0x02df
+#define SDIO_PRODUCT_ID_MARVELL_88W8686 0x9103
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- /dev/null
+/* ----------------------------------------------------------------------------
+ * Copyright (c) @CompanyNameMagicTag 2021-2021. All rights reserved.
+ * Description: Platform Config HeadFile
+ * Author: @CompanyNameTag
+ * Create: 2021-09-03
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ * 3. Neither the name of the copyright holder nor the names of its contributors may be used
+ * to endorse or promote products derived from this software without specific prior written
+ * permission.
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * --------------------------------------------------------------------------- */
+
+#ifndef _BRANDY_SOC_MMC_H
+#define _BRANDY_SOC_MMC_H
+
+#include <stdint.h>
+#include <stdbool.h>
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+#define EMMC_BOARD_DEBUG_ON 0
+
+#define GLB_CTL_M_RB_BASE 0x57000000
+#define M_CTL_RB_BASE 0x52000000
+#define COM_CTL_RB_BASE 0x55000000
+
+#ifndef BIT
+#define BIT(x) (1UL << (uint32_t)(x))
+#endif
+
+#define MAX_MMC_NUM 2
+
+#define BRANDY_INTERRUPT_SDIO 76
+#define BRANDY_INTERRUPT_EMMC 78
+
+#define S_HGPIO 0x52065800
+#define S_HGPIO_PAD 0x5700d000
+
+#define S_HGPIO0_OFFSET 0
+#define S_HGPIO0_PAD_OFFSET 0x200
+
+#define S_HGPIO6_OFFSET 0x18
+#define S_HGPIO6_PAD_OFFSET 0x218
+#define FUNC_SDIO 0x01
+#define FUNC_EMMC 0x02
+#ifdef PRE_FPGA
+#define IE_PINMUX_EN 0x02
+#else
+#define IE_PINMUX_EN 0xC7
+#endif
+
+#define BRANDY_SDIO_REG_BASE 0x52061000
+#define BRANDY_SDIO_REG_END 0x52061FFF
+
+#define BRANDY_EMMC_REG_BASE 0x52062000
+#define BRANDY_EMMC_REG_END 0x52063FFF
+// emmc external clk EMMC_CCLK_DIV
+#define BRANDY_EXTERNAL_EMMC_CCLK_DIV 0x52000100
+#define EMMC_TUNING_COARSE_MODE_BIT 0xD
+
+#define PERI_EMMC_CRG_RST_CTL (GLB_CTL_M_RB_BASE + 0xc8)
+#define SOFT_RST_GLB_SDIO_CRG_N BIT(0)
+#define SOFT_RST_GLB_SDIO_LGC_N BIT(1)
+#define SOFT_RST_GLB_SDIO_DERESET ((SOFT_RST_GLB_SDIO_CRG_N) | (SOFT_RST_GLB_SDIO_LGC_N))
+
+#define ARGUMENT (BRANDY_EMMC_REG_BASE + 0x8)
+#define CMD (BRANDY_EMMC_REG_BASE + 0xE)
+#define RESP01 (BRANDY_EMMC_REG_BASE + 0x10)
+#define RESP23 (BRANDY_EMMC_REG_BASE + 0x14)
+#define RESP45 (BRANDY_EMMC_REG_BASE + 0x18)
+#define RESP67 (BRANDY_EMMC_REG_BASE + 0x1C)
+#define PSTATE_REG (BRANDY_EMMC_REG_BASE + 0x24)
+#define HOST_CTRL1 (BRANDY_EMMC_REG_BASE + 0x28)
+#define HIGH_SPEED_EN_BIT 0x2
+#define EXT_DAT_XFER_BIT 0x5
+#define PWR_CTRL (BRANDY_EMMC_REG_BASE + 0x29)
+#define POWR_ON_1_8V 0xBF
+#define CLK_CTRL (BRANDY_EMMC_REG_BASE + 0x2C)
+#define TOUT_CTRL (BRANDY_EMMC_REG_BASE + 0x2E)
+#define SW_RST (BRANDY_EMMC_REG_BASE + 0x2F)
+#define SW_RST_ALL BIT(0)
+#define SW_RST_CMD BIT(1)
+#define SW_RST_DAT BIT(2)
+#define SW_RE_RST_ALL (SW_RST_ALL | SW_RST_CMD | SW_RST_DAT)
+#define NORMAL_INT_STAT (BRANDY_EMMC_REG_BASE + 0x30)
+#define ERROR_INT_STAT (BRANDY_EMMC_REG_BASE + 0x32)
+#define ALL_NORMAL_ERR_INT 0xffff
+#define NORMAL_INT_STAT_EN (BRANDY_EMMC_REG_BASE + 0x34)
+#define ERROR_INT_STAT_EN (BRANDY_EMMC_REG_BASE + 0x36)
+#define NORMAL_ERR_INT_EN 0x7EFF
+#define NORMAL_INT_SIGNAL_EN (BRANDY_EMMC_REG_BASE + 0x38)
+#define ERROR_INT_SIGNAL_EN (BRANDY_EMMC_REG_BASE + 0x3A)
+#define HOST_CTRL2 (BRANDY_EMMC_REG_BASE + 0x3E)
+#define SAMPLE_CLK_SEL_BIT 0x7
+#define SIGNALING_EN_BIT 0x3
+#define UHS_MODE_SEL_BIT 0x0
+#define UHS_MODE_SEL_LEN 0x3
+#define HS_SDR 0x1
+#define HS_DDR 0x4
+#define HS200 0x3
+#define HS400 0x7
+#define MBIIU_CTRL (BRANDY_EMMC_REG_BASE + DWC_MSHC_PTR_VENDOR1 + 0x10)
+#define AT_CTRL (BRANDY_EMMC_REG_BASE + DWC_MSHC_PTR_VENDOR1 + 0x40)
+#define AT_STAT (BRANDY_EMMC_REG_BASE + DWC_MSHC_PTR_VENDOR1 + 0x44)
+#define EMMC_CTRL (BRANDY_EMMC_REG_BASE + DWC_MSHC_PTR_VENDOR1 + 0x2C)
+#define LEN_3BIT 0x3
+#define LEN_8BIT 0x8
+
+#define CMD1_RESP_READY_BIT 0x80000000
+#define ERR_INT_BIT 0x8000
+#define RETRY_CNT1 1000
+#define RETRY_CNT2 10000
+#define CMD_COMPLETE 0x1
+#define XFER_COMPLETE 0x2
+#define CMD_XFER_COMPLETE (CMD_COMPLETE | XFER_COMPLETE)
+#define CMD_INHIBIT 0x1
+#define CMD_INHIBIT_DAT 0x2
+#define DAT_LINE_ACTIVE 0x4
+#define CMD_DATA_NOT_READY (CMD_INHIBIT | CMD_INHIBIT_DAT | DAT_LINE_ACTIVE)
+#define CMD_DATA_INHIBIT (CMD_INHIBIT | CMD_INHIBIT_DAT)
+#define CMD6_4BIT_WIDTH_ARGS 0x3b70100
+#define CMD6_8BIT_WIDTH_ARGS 0x3b70200
+#define CMD6_TIMING_HS_ARGS 0x3b90100
+#define CMD6_TIMING_HS200_ARGS 0x3b90200
+#define CMD6_TIMING_HS400_ARGS 0x3b90300
+#define CMD0_INDEX 0x10
+#define CMD1_INDEX 0x102
+#define CMD1_ARGS 0xC0FF8080
+#define CMD2_INDEX 0x209
+#define CMD3_INDEX 0x31a
+#define CMD3_ARGS 0x10000
+#define CMD9_INDEX 0x909
+#define CMD9_ARGS 0x10000
+#define CMD7_INDEX 0x71a
+#define CMD7_ARGS 0x10000
+#define CMD6_INDEX 0x61b
+
+#define EMMC_CCLK_DIV_REG (M_CTL_RB_BASE + 0x0100)
+#define EMMC_CCLK_ORI_DIV_NUM_MASK 0x0FF0
+#define EMMC_CCLK_ORI_DIV_NUM_2 0x20
+#define EMMC_TUNING_BM0_REG (M_CTL_RB_BASE + 0x104)
+#define EMMC_TUNING_BM1_REG (M_CTL_RB_BASE + 0x108)
+#define SD_HOST_CCLK_DIV_REG (M_CTL_RB_BASE + 0x0110)
+#define SDIO_HOST_CCLK_DIV_REG (M_CTL_RB_BASE + 0x014C)
+
+#define SDIO_HOST_CLKEN BIT(0)
+#define SDIO_CCLK_ORI_DIV_EN BIT(1)
+#define SDIO_CCLK_ORI_LOAD_DIV_EN BIT(2)
+#define SDIO_HOST_DIV_EN BIT(0)
+#define SDIO_HOST_DIV_SHFIT 1
+#define SDIO_HOST_DIV_MASK 0xE
+
+#define EMMC_DIV_REG (M_CTL_RB_BASE + 0x0120)
+#define SDIO_BUS_CGDIV_REG (M_CTL_RB_BASE + 0x0124)
+#define SD_BUS_CLKEN BIT(0)
+#define SD_BUS_DIV_EN BIT(1)
+#define SD_BUS_LOAD_DIV_EN BIT(8)
+#define SD_BUS_DIV_NUM_MASK 0xF8 // bit3---bit7
+#define SD_BUS_DIV_NUM_POST_SHIFT 3
+
+#define EMMC_TUNING_BM0_VAL (0x4210)
+#define EMMC_TUNING_BM1_VAL (0x707)
+#define EMMC_TUNING_COARSE_MODE BIT(13)
+
+#define DWC_MSHC_PTR_VENDOR1 0x500
+#define SDHCI_MSHC_CTRL (DWC_MSHC_PTR_VENDOR1 + 0x08)
+#define SDHCI_AXI_MBIIU_CTRL (DWC_MSHC_PTR_VENDOR1 + 0x10)
+
+#define SDHCI_AXI_MBIIU_BURST_INCR16_EN 8
+#define SDHCI_GM_WR_OSRC_LMT_MASK (0x7u << 24)
+#define SDHCI_GM_WR_OSRC_LMT_SEL(x) ((x) << 24)
+#define SDHCI_GM_RD_OSRC_LMT_MASK (0x7u << 16)
+#define SDHCI_GM_RD_OSRC_LMT_SEL(x) ((x) << 16)
+#define SDHCI_UNDEFL_INCR_EN 0x1
+#define SDHCI_GM_WR_OSRC_LMT_VAL (0x7u << 24)
+#define SDHCI_GM_RD_OSRC_LMT_VAL (0x7u << 16)
+
+#define COM_GP_REG0_ADDR (COM_CTL_RB_BASE + 0x10)
+#ifdef PRE_FPGA
+#define EMMC_SDIO_RAM_CONTROL_MASK 1
+#else
+#define EMMC_SDIO_RAM_CONTROL_MASK 8
+#endif
+#define EMMC_CARD_CLK_INV_SET BIT(14)
+
+#define GLB_CLKEN_REG (COM_CTL_RB_BASE + 0x0608)
+#define GLB_CLKEN_SDIOM BIT(4)
+#define GLB_CLKEN_DISABLE (0x7fee)
+#define GLB_CLKEN_ENABLE 0x7ffe
+
+#define SDIOM_CR_REG (COM_CTL_RB_BASE + 0x0628)
+#define SDIOM_CR_CTRL_CH_ENABLE BIT(0)
+#define SDIOM_CR_CTRL_DIV_EN BIT(4)
+
+#define SDIOM_CR_CTRL_DIV_OFFSET 5
+#define SDIOM_CR_CTRL_MIN_DIV 2
+
+#define SDIOM_CR_CTRL_CLK_RESOURCE_RC 0
+#define SDIOM_CR_CTRL_CLK_RESOURCE_XO 1
+#define SDIOM_CR_CTRL_CLK_RESOURCE_XO_DLL2 2
+#define SDIOM_CR_CTRL_CLK_RESOURCE_PLL 3
+
+#define SDIOM_CR_CTRL_CLK_RESOURCE_PLL_EN (SDIOM_CR_CTRL_CH_ENABLE | (SDIOM_CR_CTRL_CLK_RESOURCE_PLL << 1))
+#define SDIOM_CR_CTRL_XO_32M_CLK_EN (SDIOM_CR_CTRL_CH_ENABLE | (SDIOM_CR_CTRL_CLK_RESOURCE_XO << 1))
+
+#define MCU_GPIO3_BASE_ADDR (0x5701c000)
+
+#define EMMC_EMMC_CCLK_EN BIT(0)
+#define EMMC_CCLK_LOAD_DIV_EN BIT(1)
+
+#define SDIO_EMMC_CCLK_EN BIT(0)
+#define SDIO_EMMC_ORI_DIV_EN BIT(1)
+
+#define SDIO_DIV_NUM_MASK 0xF8 // bit3---bit7
+#define EMMC_DIV_NUM_MASK 0x70 // bit4---bit6
+
+#define SDIO_DIV_NUM_POST_SHIFT 3
+#define SDIO_EMMC_DIV_NUM_POST_SHIFT 4
+
+#define OFF_CLK2CARD_ON_DELAY 25
+
+#define CONFIG_MMC0_CCLK_MIN 400000 // 400KHz
+#define CONFIG_MMC1_CCLK_MIN 100000 // 100KHz
+
+#define CONFIG_MMC1_CCLK_MAX 32000000 // 32MHz
+#define SDIO_EMMC_DIV_NUM_MASK 0xFF0
+
+#define SDIOM_SRC_CLK_LOW_FREQ_VAL 32000000 // 32MHz
+#define SDIOM_SRC_CLK_FREQ_LVL_50M_VAL 52000000 // 52MHz
+#define SDIOM_SRC_CLK_FREQ_LVL_64M_VAL 64000000 // 64MHz
+#define SDIOM_SRC_CLK_FREQ_LVL_49M_VAL 49000000
+#define SDIOM_SRC_CLK_FREQ_LVL_98M_VAL 98000000 // 98MHz
+#define SDIOM_SRC_CLK_HIGH_FREQ_LVL_VAL 294000000 // 294MHz
+
+#define SDHCI_CMD_CONFLIT_CHECK 0x01
+
+#define DRV_PHASE_112P5_DEGREE 10 /* 112.5 degree */
+#define DRV_PHASE_258P75_DEGREE 23 /* 258.75 degree */
+#define DRV_PHASE_225_DEGREE 20 /* 225 degree */
+#define DRV_PHASE_180_DEGREE 16 /* 180 degree */
+
+#define SAMPLE_PHASE 4
+#define DEFAULT_PHASE 0x10
+
+#define MSHC_WAIT_INT_PER_MSEC 1
+
+#define CMU_CLOCKS_SDIO_RST_DEVICE_SD_BIT 0
+
+#define CMU_CLOCK_SOFT_RST6_REG (GLB_CTL_M_RB_BASE + 0xC8)
+#define CMU_CLOCK_SOFT_RST_GLB_SDIO_CRG_BIT 0
+#define CMU_CLOCK_SOFT_RST_GLB_SDIO_LGC_BIT 1
+
+#define CMU_CLOCKS_SDIO_CRG_SOFT_RST_REG (M_CTL_RB_BASE + 0x128)
+#define CMU_CLOCKS_SDIO_RST_DEVICE_SD_BIT 0
+
+#define brandy_reg32(register) (*(volatile uint32_t*)(uintptr_t)(register))
+#define brandy_reg16(register) (*(volatile uint16_t*)(uintptr_t)(register))
+#define brandy_reg8(register) (*(volatile uint8_t*)(uintptr_t)(register))
+
+#define brandy_reg32_clrbit(register, pos) (brandy_reg32(register) &= ~((uint32_t)((1U) << (uint32_t)(pos))))
+#define brandy_reg16_clrbit(register, pos) (brandy_reg16(register) &= ~((uint16_t)((1U) << (uint16_t)(pos))))
+#define brandy_reg8_clrbit(register, pos) (brandy_reg8(register) &= ~((uint8_t)((1U) << (pos))))
+
+#define brandy_reg32_setbit(register, pos) (brandy_reg32(register) |= ((uint32_t)((1U) << (uint32_t)(pos))))
+#define brandy_reg16_setbit(register, pos) (brandy_reg16(register) |= ((uint16_t)((1U) << (uint16_t)(pos))))
+#define brandy_reg8_setbit(register, pos) (brandy_reg8(register) |= ((uint8_t)((1U) << (pos))))
+
+#define brandy_reg16_setbits(r, p, b, v) (brandy_reg16(r) = (brandy_reg16(r) & \
+ (uint16_t)(~((((uint32_t)1 << (uint16_t)(b)) - 1) << (uint16_t)(p)))) \
+ | (uint16_t)((uint32_t)((uint16_t)(v) & \
+ (((uint32_t)1 << (uint16_t)(b)) - 1)) << (uint16_t)(p)))
+
+#define PMU_TOP_PERIPHERALS_MTOP0_L_REG (M_CTL_RB_BASE + 0x150)
+#define PMU_MTOP0_MDMA_RST 2
+#define PMU_MTOP0_SMDMA_RST 1
+#define PMU_MTOP0_TIMER_RST 0
+#define PMU_TOP_PERIPHERALS_MTOP0_H_REG (M_CTL_RB_BASE + 0x154)
+#define PMU_MTOP0_MDMA_STS_OFFSET 2
+#define PMU_MTOP0_SMDMA_STS_OFFSET 1
+#define PMU_MTOP0_MTIMER_STS_OFFSET 0
+
+/* I2C0/1/2/3 peripheral clock gating. */
+#define PMU_TOP_PERIPHERALS_MTOP1_L_REG (M_CTL_RB_BASE + 0x158)
+#define PMU_MTOP1_I2C3_RST 3
+#define PMU_MTOP1_I2C2_RST 2
+#define PMU_MTOP1_I2C1_RST 1
+#define PMU_MTOP1_I2C0_RST 0
+#define PMU_TOP_PERIPHERALS_MTOP1_H_REG (M_CTL_RB_BASE + 0x15C)
+#define PMU_MTOP1_I2C3_STS_OFFSET 3
+#define PMU_MTOP1_I2C2_STS_OFFSET 2
+#define PMU_MTOP1_I2C1_STS_OFFSET 1
+#define PMU_MTOP1_I2C0_STS_OFFSET 0
+
+/* SPI0_M, SPI1_MS, SPI2_MS and QSPI2_1CS peripheral clock gating. */
+#define PMU_TOP_PERIPHERALS_MTOP2_L_REG (M_CTL_RB_BASE + 0x160)
+#define PMU_MTOP2_QSPI2_1CS_RST 3
+#define PMU_MTOP2_SPI2_RST 2
+#define PMU_MTOP2_SPI1_RST 1
+#define PMU_MTOP2_SPI0_RST 0
+#define PMU_TOP_PERIPHERALS_MTOP2_H_REG (M_CTL_RB_BASE + 0x164)
+#define PMU_MTOP2_QSPI2_1CS_STS_OFFSET 3
+#define PMU_MTOP2_SPI2_STS_OFFSET 2
+#define PMU_MTOP2_SPI1_STS_OFFSET 1
+#define PMU_MTOP2_SPI0_STS_OFFSET 0
+
+/* UART_H0, UART_H1 and UART_L0 peripheral clock gating. */
+#define PMU_TOP_PERIPHERALS_MTOP3_L_REG (M_CTL_RB_BASE + 0x168)
+#define PMU_MTOP3_UART_L0_RST 2
+#define PMU_MTOP3_UART_H1_RST 1
+#define PMU_MTOP3_UART_H0_RST 0
+#define PMU_TOP_PERIPHERALS_MTOP3_H_REG (M_CTL_RB_BASE + 0x16C)
+#define PMU_MTOP3_UART_L0_STS_OFFSET 2
+#define PMU_MTOP3_UART_H1_STS_OFFSET 1
+#define PMU_MTOP3_UART_H0_STS_OFFSET 0
+
+/* EMMC and SDIO_HOST peripheral clock gating. */
+#define PMU_TOP_PERIPHERALS_MTOP4_L_REG (M_CTL_RB_BASE + 0x170)
+#define PMU_MTOP4_SDIO_HOST_RST 1
+#define PMU_MTOP4_EMMC_RST 0
+#define PMU_TOP_PERIPHERALS_MTOP4_H_REG (M_CTL_RB_BASE + 0x174)
+#define PMU_MTOP4_SDIO_HOST_STS_OFFSET 1
+#define PMU_MTOP4_EMMC_STS_OFFSET 0
+
+/* I2C4 5 6 and spi3 peripheral clock gating. */
+#define PMU_TOP_PERIPHERALS_MTOP5_L_REG (M_CTL_RB_BASE + 0x178)
+#define PMU_MTOP4_I2C_BUS_4_RST 0
+#define PMU_MTOP4_I2C_BUS_5_RST 1
+#define PMU_MTOP4_I2C_BUS_6_RST 2
+#define PMU_MTOP4_SPI_M3_RST 3
+
+#define CMU_CLOCKS_MSUB_NORMAL_REG (M_CTL_RB_BASE + 0x3e0)
+
+#define MSUB_CFG_REFRESH_REG (M_CTL_RB_BASE + 0x3F0)
+#define MSUB_CFG_REFRESH_BIT 0
+
+#define CMU_CLOCKS_COM_CR_CH_EN_BIT 0
+#define CMU_CLOCKS_COM_CR_CLK_SEL_BIT 1
+#define CMU_CLOCKS_COM_CR_CLK_SEL_LEN 3
+#define CMU_CLOCKS_COM_CR_CLK_DIV_EN_BIT 4
+#define CMU_CLOCKS_COM_CR_CLK_DIV_NUM_BIT 5
+#define CMU_CLOCKS_COM_CR_CLK_DIV_NUM_LEN 4
+#define CMU_CLOCKS_COM_CR_CH_SEL_STS_BIT 12
+#define CMU_CLOCKS_COM_CR_CH_SEL_STS_LEN 2
+
+#define CMU_CLOCKS_COM_BUS_CR_REG (GLB_CTL_M_RB_BASE + 0x8C)
+#define CMU_CLOCKS_MCU_CORE_CR_CH0_REG (M_CTL_RB_BASE + 0x550)
+#define CMU_CLOCKS_MCU_CORE_CR_CH1_REG (M_CTL_RB_BASE + 0x554)
+#define CMU_CLOCKS_MCU_PERP_LS_CR_REG (M_CTL_RB_BASE + 0x558)
+#define CMU_CLOCKS_MCU_PERP_HS_CR_REG (M_CTL_RB_BASE + 0x55C)
+#define CMU_CLOCKS_SDIOM_CR_REG (M_CTL_RB_BASE + 0x564)
+#define CMU_CLOCKS_MEM_BUS_CR_REG (M_CTL_RB_BASE + 0x568)
+#define CMU_CLOCKS_XIP_OPI_CR_REG (M_CTL_RB_BASE + 0x56C)
+#define CMU_CLOCKS_XIP_QSPI_CR_REG (M_CTL_RB_BASE + 0x570)
+#define CMU_CLOCKS_GPU_CR_REG (M_CTL_RB_BASE + 0x574)
+#define CMU_CLOCKS_RGB_CR_REG (M_CTL_RB_BASE + 0x578)
+#define CMU_CLOCKS_HIFI_CR_REG (M_CTL_RB_BASE + 0x57C)
+#define CMU_CLOCKS_CODEC_CR_REG (M_CTL_RB_BASE + 0x580)
+#define CMU_CLOCKS_PAD_CLK_OUT0_CR_REG (M_CTL_RB_BASE + 0x584)
+#define CMU_CLOCKS_PAD_CLK_OUT1_CR_REG (M_CTL_RB_BASE + 0x588)
+#define CMU_CLOCKS_PAD_CLK_OUT2_CR_REG (M_CTL_RB_BASE + 0x58C)
+
+#define EMMC_CAPCITY_SIZE (4ULL * GB) /* emmc capcity size, unit: bytes */
+#define RESERVED_BOOT_SECTOR 2048 /* reserved sector number for boot */
+#define SECTOR_NUM_PER_CLUSTER 8 /* cluster size, unit: sector */
+#define GB (1024ULL * 1024ULL * 1024ULL)
+
+/** reg32 bit pos types */
+typedef enum {
+ BRANDY_POS_0,
+ BRANDY_POS_1,
+ BRANDY_POS_2,
+ BRANDY_POS_3,
+ BRANDY_POS_4,
+ BRANDY_POS_5,
+ BRANDY_POS_6,
+ BRANDY_POS_7,
+ BRANDY_POS_8,
+ BRANDY_POS_9,
+ BRANDY_POS_10,
+ BRANDY_POS_11,
+ BRANDY_POS_12,
+ BRANDY_POS_13,
+ BRANDY_POS_14,
+ BRANDY_POS_15
+} BRANDY_REG16_POS;
+
+/** PMU_LPM wakeup types */
+typedef enum {
+ BRANDY_TURN_OFF,
+ BRANDY_TURN_ON
+} brandy_switch_type_t;
+
+/**
+ * @brief Describe pheriphral request behavior.
+ */
+typedef enum {
+ HAL_PMU_PERIP_REQUEST_RESET = 0, // !< Request reset the peripheral, make it in initial status, can't running.
+ HAL_PMU_PERIP_REQUEST_DERESET = 1, // !< Request dereset the peripheral, make it can run.
+ HAL_PMU_PERIP_REQUEST_ENTER_LOW_POWER = 2, // !< Request the peripheral enter low power mode.
+ HAL_PMU_PERIP_REQUEST_EXIT_LOW_POWER = 3, // !< Request the peripheral exit low power mode.
+} hal_pmu_perip_request_type_t;
+
+typedef enum {
+ HAL_SOFT_RST6_SDIO_CRG,
+ HAL_SOFT_RST6_SDIO_LGC,
+} hal_glb_sdio_soft_rst_type_t;
+
+typedef enum {
+ BRANDY_CLOCKS_SDIO_FREQ_32M, // sdio:32M
+ BRANDY_CLOCKS_SDIO_FREQ_50M, // rc clock, real value 49.512MHz
+ BRANDY_CLOCKS_SDIO_FREQ_64M, // sdio:64M
+ BRANDY_CLOCKS_SDIO_FREQ_H, // 193.3M
+ BRANDY_CLOCKS_SDIO_FREQ_MAX,
+} brandy_system_sdio_freq_t;
+
+/**
+ * @brief Describe mcpu pheriphrals.
+ */
+typedef enum {
+ HAL_PMU_MCPU_PERIP_TIMER = 0, // !< The mcpu peripheral timer, can not enter low power mode.
+ HAL_PMU_MCPU_PERIP_SMDMA = 1, // !< The smcpu peripheral dma
+ HAL_PMU_MCPU_PERIP_MDMA = 2, // !< The mcpu peripheral dma
+ HAL_PMU_MCPU_PERIP_I2C_BUS_0 = 3, // !< The mcpu peripheral I2C BUS0
+ HAL_PMU_MCPU_PERIP_I2C_BUS_1 = 4, // !< The mcpu peripheral I2C BUS1
+ HAL_PMU_MCPU_PERIP_I2C_BUS_2 = 5, // !< The mcpu peripheral I2C BUS2
+ HAL_PMU_MCPU_PERIP_I2C_BUS_3 = 6, // !< The mcpu peripheral I2C BUS3
+ HAL_PMU_MCPU_PERIP_SPI_MST = 7, // !< The mcpu peripheral SPI BUS0
+ HAL_PMU_MCPU_PERIP_SPI_MS_0 = 8, // !< The mcpu peripheral SPI BUS1
+ HAL_PMU_MCPU_PERIP_SPI_MS_1 = 9, // !< The mcpu peripheral SPI BUS2
+ HAL_PMU_MCPU_PERIP_QSPI2_1CS = 10, // !< The mcpu peripheral QSPI BUS2
+ HAL_PMU_MCPU_PERIP_UART_H0 = 11, // !< The mcpu peripheral UARTH0
+ HAL_PMU_MCPU_PERIP_UART_H1 = 12, // !< The mcpu peripheral UARTH1
+ HAL_PMU_MCPU_PERIP_UART_L0 = 13, // !< The mcpu peripheral UARTL0
+ HAL_PMU_MCPU_PERIP_EMMC = 14, // !< The mcpu peripheral EMMC
+ HAL_PMU_MCPU_PERIP_SDIO_HOST = 15, // !< The mcpu peripheral SDIO HOST
+ HAL_PMU_MCPU_PERIP_I2C_BUS_4 = 16, // !< The mcpu peripheral I2C BUS4
+ HAL_PMU_MCPU_PERIP_I2C_BUS_5 = 17, // !< The mcpu peripheral I2C BUS5
+ HAL_PMU_MCPU_PERIP_I2C_BUS_6 = 18, // !< The mcpu peripheral I2C BUS6
+ HAL_PMU_MCPU_PERIP_SPI_M3 = 19, // !< The mcpu peripheral SPI BUS3
+ HAL_PMU_MCPU_PERIP_MAX,
+} hal_pmu_mcpu_perips_type_t;
+
+int emmc_drv_context_init(void);
+void init_emmc_pinmux(void);
+
+void sdio_drv_context_init(void);
+void init_sdio_pinmux(void);
+void mmc_set_internal_clk(uint16_t clk_level);
+void mmc_set_first_init_flag(bool flag);
+bool mmc_get_first_init_flag(void);
+void mmc_set_sleep_init_flag(bool flag);
+bool mmc_get_sleep_init_flag(void);
+#ifdef __cplusplus
+#if __cplusplus
+}
+#endif /* __cplusplus */
+#endif /* __cplusplus */
+
+#endif /* _BRANDY_MMC_H */
+
#include "nandflash_config.h"
#endif
+#ifdef CFG_DRIVERS_MMC
+#include "drv_mmc_adapter.h"
+#endif
+
#define CFG_PMU_PROTECT_WDT_RESET 1
#define FLASH_INIT_DATA 0xff
uapi_pin_set_mode(QSPI0_D3, (pin_mode_t)HAL_PIO_FUNC_QSPI0);
}
-#ifdef SW_RTT_DEBUG
-extern uint32_t __rtt_bss_end;
-extern uint32_t __rtt_bss_start;
-#endif
-
#if CFG_PMU_PROTECT_WDT_RESET == 1
void software_delay_us(uint32_t delay)
{
}
#endif
-void main(void)
+static void chip_init(bool rom_codeloadered)
{
- errno_t ret = 0;
- uint32_t manufacture_id = 0;
- uint8_t unique_id = 0;
- bool rom_codeloadered = is_rom_codeloadered();
-#ifdef SW_RTT_DEBUG
- uint32_t size = (uint32_t)(&__rtt_bss_end) - (uint32_t)(&__rtt_bss_start);
- ret = memset_s((void *)((uint32_t)(&__rtt_bss_start)), size, 0, size);
- if (ret != EOK) {
- PRINT("rtt bss memset fail."NEWLINE);
- }
-#endif
int_setup();
uapi_pin_init();
uapi_tcxo_init();
hw_init();
uapi_ulp_systick_self_verification();
show_reboot_info();
-
otp_init();
irmalloc_init_default();
+}
+
+static void flash_init(void)
+{
+ uint32_t manufacture_id = 0;
+ uint8_t unique_id = 0;
+
ssb_hold_flash_pin();
uapi_flash_init(0);
ssb_try_read_flash_id(&manufacture_id);
uapi_flash_config_cmd_at_xip_mode(0, unique_id);
ssb_enable_qe_mode_if_need(manufacture_id);
ssb_resume_flash_pin();
- while (uapi_uart_has_pending_transmissions(SW_DEBUG_UART_BUS)) { }
-#ifdef PRE_ASIC
- pmu_init();
- clocks_system_init();
-#endif
-#ifdef SW_UART_DEBUG
- sw_debug_uart_reset_baund();
-#endif
-#ifdef CFG_DRIVERS_NANDFLASH
- nandflash_qspi_init();
-#endif
- if ((flash_is_empty() || (rom_codeloadered == true)) && ssb_save_sign_in_flash()) {
- PRINT("flash is empty, save image into flash" NEWLINE);
- ret = ssb_save_image_in_flash();
- if (ret == false) {
- PRINT("save ssb into flash err" NEWLINE);
- uapi_tcxo_delay_ms((uint64_t)TCXO_REBOOT_DELAY);
- cpu_utils_set_system_status_by_cause(REBOOT_CAUSE_BT_SSB_EXCEPTION_REBOOT);
- // This will reset the aliased regions, you will go to ROM
- hal_reboot_chip();
- }
- }
+}
+
+static void xip_and_save_ssb(void)
+{
xip_init();
bootloader_configuration_init();
create_ssb_to_application_table(hal_reboot_get_reset_reason());
#endif
set_ssb_to_application_image_vaild(true, true);
uapi_partition_init();
+}
+
+static void fs_init(void)
+{
+#ifdef CFG_DRIVERS_NANDFLASH
+ nandflash_qspi_init();
+#endif
+#ifdef CFG_DRIVERS_MMC
+ ssb_emmc_init();
+#endif
+}
+
+#ifdef SW_RTT_DEBUG
+extern uint32_t __rtt_bss_end;
+extern uint32_t __rtt_bss_start;
+#endif
+
+void main(void)
+{
+ errno_t ret = 0;
+ bool rom_codeloadered = is_rom_codeloadered();
+#ifdef SW_RTT_DEBUG
+ uint32_t size = (uint32_t)(&__rtt_bss_end) - (uint32_t)(&__rtt_bss_start);
+ ret = memset_s((void *)((uint32_t)(&__rtt_bss_start)), size, 0, size);
+ if (ret != EOK) {
+ PRINT("rtt bss memset fail."NEWLINE);
+ }
+#endif
+
+ chip_init(rom_codeloadered);
+ flash_init();
+
+ while (uapi_uart_has_pending_transmissions(SW_DEBUG_UART_BUS)) { }
+#ifdef PRE_ASIC
+ pmu_init();
+ clocks_system_init();
+#endif
+#ifdef SW_UART_DEBUG
+ sw_debug_uart_reset_baund();
+#endif
+
+ if (flash_is_empty() || (rom_codeloadered == true)) {
+ PRINT("flash is empty, save image into flash" NEWLINE);
+ if (ssb_save_sign_in_flash()) {
+ ssb_save_image_in_flash();
+ }
+ }
+ fs_init();
+
+ xip_and_save_ssb();
+
if (non_os_is_driver_initialised(DRIVER_INIT_OTP) == true) { otp_deinit(); }
ssb_enter_app();
PRINT("No jump, reset now" NEWLINE);
'base_target_name': 'brandy-native-js',
'defines': ['-:SW_UART_DEBUG'],
},
+ #auto-ota-server
+ 'brandy-auto-ota-ser': {
+ 'base_target_name': 'brandy-native-js',
+ 'defines': ['SUPPORT_AUTO_OTA_SERVER', 'CONFIG_DFX_SUPPORT_DIAG_UP_MACHINE=1'],
+ },
+ #auto-ota-client
+ 'brandy-auto-ota-cli': {
+ 'base_target_name': 'brandy-native-js',
+ 'defines': ['SUPPORT_AUTO_OTA_SERVER', 'SUPPORT_AUTO_OTA', 'CONFIG_DFX_SUPPORT_DIAG_UP_MACHINE=1'],
+ 'ram_component': ['auto_ota']
+ },
#native-xts: liteos + uikit + nandflash + mipi + psram + audio 典型合封UIKIT版本
'brandy-xts': {
'board': 'evb',
"LIBCODELOADER_SSB", "LIBJLINK_LOAD", "LIBLIB_UTILS", "LIBBUILD_VERSION",
"NO_TIMEOUT", "CONFIG_UART_BAUD_RATE_DIV_8", 'SW_UART_DEBUG', 'LARGE_BUFFER'],
'ram_component': ['arch_port', 'hal_l2ram', 'sec_boot', 'libboundscheck',
- 'dfx_exception', 'error_code', 'psram', 'osal', 'cmn_header', 'boot_ulp', 'boot_nandflash'],
+ 'dfx_exception', 'error_code', 'psram', 'osal', 'cmn_header', 'boot_ulp', 'boot_nandflash', 'boot_emmc'],
'ram_component_set': ['pinctrl'],
'target': 'ssb',
}
--- /dev/null
+本文档为生成emmc文件镜像的使用指导\r
+\r
+1.如果想要生成文件镜像,需要在对应target中添加配置:'fs_image': True\r
+2.当前目录适配的是emmc的FAT文件镜像。\r
+3.生成emmc的FAT文件镜像前,请打开mkfatimgtool.py脚本进行相关配置,详细见脚本说明\r
+4.将要烧录的资源文件放到fs目录中,可以有子目录,此目录对应A核系统挂载第一分区的目录,默认为system目录。\r
+5.因为生成FAT镜像的工具是windows平台的工具,生成过程需要在windows平台上进行。\r
+6.执行脚本是python脚本,所以需要预先安装python3软件,建议python3.7及以上的版本。\r
+7.执行python mkfatimgtool.py即可在当前目录生成FAT镜像,即file.bin文件。
\ No newline at end of file
--- /dev/null
+this is test1 file
\ No newline at end of file
--- /dev/null
+#!/usr/local/bin/python3.7\r
+# -*- coding: utf-8 -*-\r
+\r
+import os\r
+import sys\r
+import time\r
+import struct\r
+import shutil\r
+\r
+"""\r
+介绍:\r
+ 本脚本主要实现调用mkyaffs2image工具生成文件镜像\r
+ 请注意使用本脚本时支持的python版本,本脚本只支持python3版本。\r
+ 请根据实际情况配置对应信息,主要是nandflash的信息,以及分区信息\r
+\r
+"""\r
+\r
+cur_dir = os.getcwd()\r
+image_tool_path = os.getcwd()\r
+\r
+# 配置生成文件镜像工具路径\r
+mkfatimgtool = os.path.join(image_tool_path, 'mkfatimg.exe')\r
+image_name = "file"\r
+\r
+# 配置emmc信息\r
+cfg_sector_size = 512\r
+\r
+# 配置分区信息,请根据实际情况进行配置,添加格式为[分区路径, 分区大小]\r
+# 分区大小需要根据按照百分系统分配好后的sector数进行计算,大小=sector(对应区域扇区数) * cfg_sector_size(单扇区字节数) / 1024(KB单位换算)\r
+# 分区大小必须指定,按照当前系统默认emmc总容量4GB, 第一分区system大小为11%,换算分区大小为461260\r
+partition_list = [\r
+ [os.path.join(cur_dir, 'fs'), "461260"],\r
+]\r
+\r
+if __name__ == "__main__":\r
+ image_file = os.path.join(cur_dir, "%s.bin" %image_name)\r
+ tmp_file = os.path.join(cur_dir, "%s_tmp.bin" %image_name)\r
+ sector_size = " 4096"\r
+ ret = 0\r
+\r
+ if sys.platform == 'win32':\r
+ if os.path.exists(image_file):\r
+ os.remove(image_file)\r
+\r
+ for partition in partition_list:\r
+ command = mkfatimgtool + " " + partition[0] + " " + image_file + " " + partition[1] + sector_size\r
+ print(command)\r
+ ret = os.system(command)\r
+ else:\r
+ print("sys platform err!not windows system!\n")\r
+\r
+ if ret == 0:\r
+ print("make fat image file success!")\r
+ else:\r
+ print("make fat image file fail!")\r
'efuse_v120': ['efuse', 'hal_efuse_v120', 'efuse_porting'],
'efuse_v100': ['efuse', 'hal_efuse_v100', 'efuse_porting'],
'efuse_v130': ['efuse', 'hal_efuse_v130', 'efuse_port'],
- 'ohos_set' : ['bootstrap', 'samgr', 'ams', 'bms', 'bms_sign_mode', 'ace', 'ace_adapt', 'permission', 'appverify', 'jerryscript','js_player', 'js_audio_capturer', 'baidumapcomponent', 'i18n',
+ 'ohos_set' : ['bootstrap', 'samgr', 'ams', 'bms', 'bms_sign_mode', 'ace', 'ace_adapt', 'permission', 'appverify', 'jerryscript','js_player', 'js_audio_capturer', 'baidumapcomponent', 'brightness', 'i18n',
'resmgr', 'syspara', 'utils_kv_store', 'native_file', 'storage_jsapi', 'brightness'],
'wearable_set' : ['nativeabilityfwk', 'nativelauncher', 'ai_voice_service', 'ai_voice_engine_hal', 'ai_voice_audio_stream_wrapper', 'ohos_deps',
'broadcast', 'msg_center', 'msg_center_adapt', 'ohos_startup'],
return
if env.get("fs_image"):
- fs_image_path = os.path.join(root_path, 'build', 'config', 'target_config', env.get('chip'), 'mk_fs_image')
- fs_script_path = os.path.join(fs_image_path, 'mkyaffs2tool.py')
- output_path = env.get_output_path()
- print(output_path)
- errcode = exec_shell([self.python_path, fs_script_path, output_path], None, True)
- if errcode != 0:
- print("creat fs image error!")
- self.print_build_result(target, errcode)
+ defines = env.get("defines")
+ if "CFG_DRIVERS_NANDFLASH" in defines:
+ print("fs img nandflash mode")
+ fs_image_path = os.path.join(root_path, 'build', 'config', 'target_config', env.get('chip'), 'mk_fs_image')
+ fs_script_path = os.path.join(fs_image_path, 'mkyaffs2tool.py')
+ errcode = exec_shell([self.python_path, fs_script_path], None, True)
+ if errcode != 0:
+ print("creat fs image error!")
+ self.print_build_result(target, errcode)
+ sys.exit(1)
+ print("nandflash yaffs image generate success!")
+ elif "CFG_DRIVERS_MMC" in defines:
+ print("fs img emmc mode")
+ fs_image_path = os.path.join(root_path, 'build', 'config', 'target_config', env.get('chip'), 'mk_emmc_image',)
+ else:
+ print("not cfg emmc or nandflash, cfg error!!!\n")
sys.exit(1)
- print("fs image success!")
+
+ # copy file.bin from make dir to application dir
+ file_path = os.path.join(fs_image_path, 'file.bin')
+ outfile_path = os.path.join(env.get_output_path(), 'file.bin')
+ if os.path.exists(file_path):
+ shutil.copyfile(file_path, outfile_path)
+ print("copy file.bin to application dir over!\n")
if env.get('packet'):
self.pack_fwpkg(env.get('chip'), target)
SORT(*platform/testsuite/test_update*.a:*.o*) (.text .text* .rodata .rodata* .srodata .srodata*)
SORT(*platform/testsuite/test_dhry*.a:*.o*) (.text .text* .rodata .rodata* .srodata .srodata*)
#endif
+ SORT(*systemview.a:*.o*) (.text .text* .rodata .rodata* .srodata .srodata*)
. = ALIGN(8);
__init_array_start = .;
KEEP(*(.ctors .init_array*))
SORT(*test/common/testsuite*.a:*.o*) (.data .data*)
SORT(*test/platform/testsuite*.a:*.o*) (.data .data*)
#endif
+ SORT(*systemview.a:*.o*) (.data .data*)
*(.data)
*(.data*)
*(.got)
SORT(*test/common/testsuite*.a:*.o*) (.bss .bss* .sbss .sbss* COMMON)
SORT(*test/platform/testsuite*.a:*.o*) (.bss .bss* .sbss .sbss* COMMON)
#endif
+ SORT(*systemview.a:*.o*) (.bss .bss* .sbss .sbss* COMMON)
*(.bss)
*(.bss*)
*(.sbss)
\r
#define ULP_CALIBRATION_INTERVAL 900000\r
#define VERIFICATIN_TIME 0xFFFFFFFFFFFFFFFFUL\r
+#define SELFHEAL_TIME 500UL\r
#define CALENDAR_BASE_ADDR ULP_RAM_CALENDAR\r
uintptr_t g_calendar_base_addr = (uintptr_t)CALENDAR_BASE_ADDR;\r
\r
void uapi_calendar_calibration_enable(void)\r
{\r
calendar_set_alarm(VERIFICATIN_TIME);\r
+}\r
+\r
+void uapi_self_heal_timer_enable(void)\r
+{\r
+ calendar_set_alarm(SELFHEAL_TIME);\r
}
\ No newline at end of file
* @brief Calendar clock calibration enable.\r
*/\r
void uapi_calendar_calibration_enable(void);\r
+\r
+/**\r
+ * @brief Calendar Self Heal enable.\r
+ */\r
+void uapi_self_heal_timer_enable(void);\r
/**\r
* @}\r
*/\r
#define IPC_SHIFT_BIT 28
#define IPC_COMMPUTE_TIME_COEF 4
+#define IPC_CONTINUOUS_FAIL_MAX 200
+#define IPC_REG_INT_EN 0x52000020
+#define IPC_REG_INT 0x52000024
+#define IPC_REG_INT_STS 0x52000028
+#define IPC_REG_INT_CLR 0x5200002c
+#define IPC_REG_CLR_STS 0x52000030
+#define IPC_REG_INT_SET 0x52000034
+static volatile uint32_t g_ipc_to_bcore_continuous_fail_nums = 0;
static uint32_t g_ipc_ssend_default_timeout = 0;
static volatile ipc_send_info g_ipc_sinfo[CORES_MAX_NUMBER_PHYSICAL];
static void ipc_timer_callback(void);
static void ipc_start_timer(void);
+
+static inline void ipc_reg_info_debug(void)
+{
+ PRINT("ipc reg info:int en:%x,int:%x,int sts:%x.\r\n", readw(IPC_REG_INT_EN), readw(IPC_REG_INT),
+ readw(IPC_REG_INT_STS));
+ PRINT("int clr:%x,clr sts:%x,int set:%x.\r\n", readw(IPC_REG_INT_CLR), readw(IPC_REG_CLR_STS),
+ readw(IPC_REG_INT_SET));
+}
+
+static inline void ipc_to_bcore_timeout_proc(cores_t dst)
+{
+ if (dst == CORES_BT_CORE) {
+ g_ipc_to_bcore_continuous_fail_nums++;
+ if (g_ipc_to_bcore_continuous_fail_nums > IPC_CONTINUOUS_FAIL_MAX) {
+ panic(PANIC_BT_STS_ABNORMAL, __LINE__);
+ }
+ }
+}
+
+static inline void ipc_to_bcore_clr_fail_num(cores_t dst)
+{
+ if (dst == CORES_BT_CORE) {
+ g_ipc_to_bcore_continuous_fail_nums = 0;
+ }
+}
+
#ifdef IPC_DATA_SEND_TEST
static bool test_ipc_receive_data_callback(ipc_action_t message, const volatile ipc_payload *payload_p,
cores_t src, uint32_t id)
if (non_os_is_driver_initialised(DRIVER_INIT_IPC) == true) {
return;
}
-
+ ipc_reg_info_debug();
#if CORE == MASTER_BY_ALL
memset_s((void *)IPC_MAILBOX_REGION_START, IPC_MAILBOX_REGION_LENGTH, 0, IPC_MAILBOX_REGION_LENGTH);
#endif
curr_tick = uapi_systick_get_count();
if (curr_tick >= timeout_tick) {
/* timeout */
-
+ ipc_to_bcore_timeout_proc(dst);
break;
}
}
if (ret_val != IPC_STATUS_OK) {
/* fail process */
g_ipc_sinfo[dst].loop_cnt = j;
+ ipc_reg_info_debug();
ipc_spin_send_fail_process(dst, ret_val, action);
} else {
+ ipc_to_bcore_clr_fail_num(dst);
g_ipc_sinfo[dst].send_data_called = 0;
}
UNUSED(failed_flag);
hci_writeb(sc, SDHCI_AXI_MBIIU_CTRL, val);
inited = true;
}
- // After the tuning phase value is configured, the tuning clk function is automatically enabled.
- uint32_t phase = dpal_readl(AT_STAT);
- dpal_writel(phase, AT_STAT);
- // The fixed clock is less than or equal to 52 MHz, and the tuning clock is not used.
- if (clock <= SDIOM_SRC_CLK_FREQ_LVL_50M_VAL) {
- brandy_reg16_clrbit(HOST_CTRL2, SAMPLE_CLK_SEL_BIT);
+
+#ifdef CFG_SDIO_EMMC_COEXIST
+ if (sc->num == 0) {
+#endif
+ // After the tuning phase value is configured, the tuning clk function is automatically enabled.
+ uint32_t phase = dpal_readl(AT_STAT);
+ dpal_writel(phase, AT_STAT);
+ // The fixed clock is less than or equal to 52 MHz, and the tuning clock is not used.
+ if (clock <= SDIOM_SRC_CLK_FREQ_LVL_50M_VAL) {
+ brandy_reg16_clrbit(HOST_CTRL2, SAMPLE_CLK_SEL_BIT);
+ }
+#ifdef CFG_SDIO_EMMC_COEXIST
}
+#endif
return clock;
}
#define EMMC_PART_MODE 0666
#define EMMC_MSLEEP_20 20
#define EMMC_ACCESS_OFFSET 20
-#define FF_VOLUME_NAME_STRS "/system/", "/user/", "/update/", "/music/"
+#define EMMC_SECTOR_TO_KB 2
+#define FF_VOLUME_NAME_STRS "/user/", "/system/", "/update/", "/music/"
uint32_t g_volume_percent[FF_VOLUMES_NUM] = { 11, 11, 8, 70 };
static const char * const g_volume_names[FF_VOLUMES_NUM] = { FF_VOLUME_NAME_STRS };
for (index = 0; index < FF_VOLUMES_NUM; ++index) {
part_count_sector = (size_t)((total_sector_num * g_volume_percent[index]) / EMMC_NUM100);
-
+ dpal_log_warn("mmc_partition[%d]:sector size=%d capacity=%dKB\n",
+ index, part_count_sector, part_count_sector / EMMC_SECTOR_TO_KB);
ret = add_mmc_partition(&emmc, part_start_sector, part_count_sector);
if (ret != 0) {
return -EIO;
#include "nandflash_config.h"\r
#include "hal_nandflash.h"\r
#include "nandflash.h"\r
+#include "pinctrl_porting.h"\r
+#include "gpio.h"\r
#include "pm.h"\r
\r
#define OFFSET 0\r
return OFFSET;\r
}\r
\r
+uint32_t read_buffer_single_line_width_32(qspi_data_type_def *qspi_data);\r
+\r
+void cs_pulldown(void) {\r
+ if (SER_SELECT == 1) {\r
+ uapi_pin_set_mode(S_HGPIO11, (pin_mode_t)HAL_PIO_FUNC_GPIO);\r
+ uapi_gpio_set_dir(S_HGPIO11, GPIO_DIRECTION_OUTPUT);\r
+ uapi_gpio_set_val(S_HGPIO11, GPIO_LEVEL_LOW);\r
+ } else {\r
+ uapi_pin_set_mode(S_HGPIO12, (pin_mode_t)HAL_PIO_FUNC_GPIO);\r
+ uapi_gpio_set_dir(S_HGPIO12, GPIO_DIRECTION_OUTPUT);\r
+ uapi_gpio_set_val(S_HGPIO12, GPIO_LEVEL_LOW);\r
+ }\r
+}\r
+\r
+void cs_pullup(void) {\r
+ if (SER_SELECT == 1) {\r
+ uapi_pin_set_mode(S_HGPIO11, (pin_mode_t)HAL_PIO_FUNC_QSPI2);\r
+ } else {\r
+ uapi_pin_set_mode(S_HGPIO12, (pin_mode_t)HAL_PIO_FUNC_QSPI2);\r
+ }\r
+}\r
+\r
uint16_t read_id(qspi_data_type_def *qspi_data)\r
{\r
while (is_nandflash_working) {\r
return;\r
}\r
\r
-uint32_t read_buffer(qspi_data_type_def *qspi_data, uint8_t *data, uint32_t data_len, uint8_t *oob, uint32_t oob_len)\r
+void debug_read_buffer(void) {\r
+ if (readw(0x57000010) == 0x5a)\r
+ {\r
+ for (uint32_t i = 0; i < DEFALUT_BUFLENGTH; i++)\r
+ {\r
+ PRINT("nand_read_buf index:%d , VALUE:%d] \r\n", i, nand_read_buf[i]);\r
+ }\r
+ writew(0x57000010, 0);\r
+ }\r
+}\r
+\r
+uint32_t read_buffer(qspi_data_type_def *qspi_data, uint8_t *data, uint32_t data_len, uint8_t *oob, uint32_t oob_len, enum nandflash_trans_type type)\r
{\r
while (is_nandflash_working) {\r
uapi_tcxo_delay_us(HAL_NAND_WAIT_3US);\r
is_nandflash_working = true;\r
errno_t err_code;\r
uint32_t result;\r
- if (get_trans_type() == TRANS_BY_DMA_QUAD) {\r
+ memset_s(nand_read_buf, DEFALUT_BUFLENGTH, 0, DEFALUT_BUFLENGTH);\r
+ if (type == TRANS_DEFAULT) {\r
+ if (get_trans_type() == TRANS_BY_DMA_QUAD) {\r
+ result = read_buffer_by_dma_width32_quad(qspi_data);\r
+ } else {\r
+ result = read_buffer_single_line_width_32(qspi_data);\r
+ }\r
+ } else if (type == TRANS_BY_DMA_QUAD) {\r
result = read_buffer_by_dma_width32_quad(qspi_data);\r
- } else {\r
+ } else if (type == TRANS_BY_CPU_SINGLE_LINE) {\r
result = read_buffer_single_line_width_32(qspi_data);\r
}\r
\r
+ debug_read_buffer();\r
if ((data != NULL) && (data_len > 0)) {\r
err_code = memcpy_s(data, data_len, nand_read_buf, data_len);\r
if (err_code != EOK) {\r
\r
static void dma_send_done_callback(hal_dma_interrupt_t int_type)\r
{\r
+ cs_pullup();\r
switch (int_type) {\r
case HAL_DMA_INTERRUPT_TFR:\r
g_dma_send_done = true;\r
dma_channel_t channel =\r
dma_send_data(qspi_data->data_size / HAL_NAND_BYTE_ALIGN, (uint8_t *)send_buffer, HAL_DMA_TRANSFER_WIDTH_32);\r
nand_qspi_enable();\r
+ cs_pulldown();\r
writel(SER, 0x0);\r
nand_qspi_write_data(ins);\r
nand_qspi_write_data(0);\r
writel(SER, SER_SELECT);\r
if (osal_sem_down_timeout((osal_semaphore *)&dma_send_sem, DMA_TRANSFER_TIMEOUT_MS) != OSAL_SUCCESS) {\r
PRINT("program_load_by_dma fail \r\n");\r
+ cs_pullup();\r
ret = MC_FAILURE;\r
}\r
uapi_pm_remove_sleep_veto(PM_ID_DMA);\r
\r
uint32_t write_by_cpu_single_line(qspi_data_type_def *qspi_data)\r
{\r
+ PRINT("write_by_cpu_single_line !!!\r\n");\r
qspi_busy_wait();\r
uint16_t address = SWAP_U16(qspi_data->address);\r
uint8_t *addr = (uint8_t *)&address;\r
nand_qspi_disable();\r
ctrl0.d.spi_frf = SPI_STD_SPI_FRF;\r
ctrl0.d.dfs_32 = DFR_32_FRAME_08BITS;\r
- ctrl0.d.tmod = SPI_EEPROM_TMOD;\r
+ ctrl0.d.tmod = SPI_TX_ONLY_TMOD;\r
nand_qspi_ctlr0_cfg(ctrl0.d32);\r
nand_qspi_ctlr1_cfg(0);\r
nand_qspi_enable();\r
static_time_before = uapi_tcxo_get_us();\r
}\r
unsigned int irq_sts = osal_irq_lock();\r
+ cs_pulldown();\r
writel(SER, 0x0);\r
nand_qspi_write_data(ins);\r
nand_qspi_write_data(0); // addr is 0\r
nand_qspi_write_data(qspi_data->data_ptr[i]);\r
}\r
}\r
+ cs_pullup();\r
osal_irq_restore(irq_sts);\r
if (SUPPORT_STATISTIC == 1) {\r
static_time_after = uapi_tcxo_get_us();\r
uint8_t mc_flash_get_offset(void);\r
uint16_t read_id(qspi_data_type_def *qspi_data);\r
uint32_t read_cell_array(qspi_data_type_def *qspi_data);\r
-uint32_t read_buffer(qspi_data_type_def *qspi_data, uint8_t *data, uint32_t data_len, uint8_t *oob, uint32_t oob_len);\r
+uint32_t read_buffer(qspi_data_type_def *qspi_data, uint8_t *data, uint32_t data_len, uint8_t *oob, uint32_t oob_len, enum nandflash_trans_type type);\r
uint8_t read_sr(qspi_data_type_def *qspi_data, uint8_t address);\r
uint32_t write_sr(qspi_data_type_def *qspi_data, uint8_t addr, uint8_t data);\r
void write_cmd(uint8_t command);\r
dma_channel_t dma_send_data(uint32_t trans_num, uint8_t *data_ptr, uint8_t width);\r
dma_channel_t dma_recv_data(uint32_t trans_num, uint8_t *data_ptr, uint8_t width);\r
uint32_t read_buffer_single_line_width_8(qspi_data_type_def *qspi_data);\r
-uint32_t read_buffer_single_line_width_32(qspi_data_type_def *qspi_data);\r
+uint32_t read_bPffer_single_line_width_32(qspi_data_type_def *qspi_data);\r
uint32_t read_buffer_by_dma(qspi_data_type_def *qspi_data);\r
uint32_t program_load_by_dma_width_32(qspi_data_type_def *qspi_data);\r
uint32_t read_buffer_by_dma_width32(qspi_data_type_def *qspi_data);\r
void test_nand_flash_read_8(struct nand_driver_struct *test_nand_flash_driver, uint32_t nand_page);\r
void test_nand_flash_write_width8(struct nand_driver_struct *test_nand_flash_driver, uint32_t nand_page);\r
void nandflash_yaffs_sync(void);\r
+void nandflash_yaffs_format(void);\r
#endif /* End of #ifndef MC_NAND_CONFIG_H */\r
typedef enum nandflash_trans_type {\r
TRANS_BY_DMA_QUAD,\r
TRANS_BY_CPU_SINGLE_LINE,\r
+ TRANS_DEFAULT\r
} nandflash_trans_type_t;\r
\r
typedef enum nandflash_trans_speed {\r
SPEED_HIGH = 8,\r
SPEED_MID = 12,\r
- SPEED_SLOW = 14,\r
+ SPEED_SLOW = 16,\r
} nandflash_speed_type_t;\r
\r
struct nand_driver_struct {\r
uint32_t (*nand_flash_init)(void);\r
uint16_t (*check_id)(void);\r
uint32_t (*read_page)(uint32_t nand_page, uint8_t *data, uint32_t data_len,\r
- uint8_t *oob, uint32_t oob_len, uint8_t *status_reg);\r
+ uint8_t *oob, uint32_t oob_len, uint8_t *status_reg, enum nandflash_trans_type type);\r
uint32_t (*write_page)(uint32_t nand_page, uint8_t *data, uint32_t data_len, uint8_t *oob, uint32_t oob_len);\r
uint32_t (*erase_block)(uint32_t block_no);\r
uint32_t (*mark_bad_block)(uint32_t block_no);\r
void mc_flash_write_cmd(uint8_t cmd);\r
void mc_flash_busy_wait(void);\r
uint32_t mc_flash_read_page(uint32_t nand_page, uint8_t *data, uint32_t data_len,\r
- uint8_t *oob, uint32_t oob_len, uint8_t *status_reg);\r
+ uint8_t *oob, uint32_t oob_len, uint8_t *status_reg, enum nandflash_trans_type type); \r
uint32_t mc_flash_write_page(uint32_t nand_page, uint8_t *data, uint32_t data_len, uint8_t *oob, uint32_t oob_len);\r
uint32_t mc_flash_erase_block(uint32_t block_no);\r
uint32_t mc_flash_mark_bad_block(uint32_t block_no);\r
}\r
\r
uint32_t mc_flash_read_page(uint32_t nand_page, uint8_t *data, uint32_t data_len,\r
- uint8_t *oob, uint32_t oob_len, uint8_t *status_reg)\r
+ uint8_t *oob, uint32_t oob_len, uint8_t *status_reg, enum nandflash_trans_type type)\r
{\r
uapi_watchdog_kick();\r
NFPRINT("mc_flash_read_page nand_page = %d\r\n", nand_page);\r
qspi_data_type_def qspi_read_buffer = {0};\r
qspi_read_buffer.instruction = 0x03;\r
qspi_read_buffer.data_size = get_nand_flash()->bytes_per_page + get_nand_flash()->bytes_per_oob;\r
- read_buffer(&qspi_read_buffer, data, data_len, oob, oob_len);\r
+ read_buffer(&qspi_read_buffer, data, data_len, oob, oob_len, type);\r
mc_flash_read_sr(CMD_FLASH_SR3_ADDR, status_reg);\r
NFPRINT("mc_flash_read_page success status = %x\r\n", *status_reg);\r
return MC_SUCCESS;\r
#define ERASE_ALL_TIMES 10\r
#define NAND_PAGE_MAX_SIZE 0x100\r
\r
+extern uint8_t nand_read_buf[DEFALUT_BUFLENGTH] __attribute__((aligned(4)));\r
uint8_t buffer_verify[DEFALUT_BUFLENGTH] __attribute__((aligned(4)));\r
uint8_t buffer_oob_verify[128] __attribute__((aligned(4))); // 128 is one max oob size\r
int has_nandflash_init = 0;\r
}\r
}\r
\r
+void nandflash_yaffs_format(void)\r
+{\r
+ for (uint8_t index = 0; index < YF_VOLUMES_NUM; index++) {\r
+ int32_t ret = yaffs_format(g_volume_names[index], 1, 1, 1);\r
+ PRINT("[%s] yaffs_format ret = %d", g_volume_names[index], ret);\r
+ }\r
+}\r
+\r
void erase_all(struct nand_driver_struct *driver)\r
{\r
uint32_t ret;\r
uint8_t status;\r
- uint32_t *read_buf = (uint32_t *)&buffer_verify[0];\r
- uint32_t *read_buf_oob = (uint32_t *)&buffer_oob_verify[0];\r
for (uint32_t j = 0; j < 1; j++) {\r
for (uint32_t i = 0; i < driver->total_block; i++) {\r
ret = driver->erase_block(i);\r
}\r
}\r
\r
-\r
+#include "chip_io.h"\r
void test_nand_flash_read_8(struct nand_driver_struct *test_nand_flash_driver, uint32_t nand_page)\r
{\r
- uint8_t status;\r
- for (uint32_t i = 0; i < test_nand_flash_driver->bytes_per_page; i++) {\r
- buffer_verify[i] = 0x0;\r
- }\r
- for (uint8_t i = 0; i < test_nand_flash_driver->bytes_per_oob; i++) {\r
- buffer_oob_verify[i] = 0x0;\r
+\r
+ struct mtd_info *mtd;\r
+ mtd = get_mtd("nand");\r
+ if (mtd == NULL)\r
+ {\r
+ nand_register(mtd);\r
}\r
\r
- PRINT("nandflash [READ][PAGE:%d]\r\n", nand_page);\r
+ memset_s(buffer_verify, DEFALUT_BUFLENGTH, 0, DEFALUT_BUFLENGTH);\r
\r
- test_nand_flash_driver->read_page(nand_page, buffer_verify, test_nand_flash_driver->bytes_per_page,\r
- buffer_oob_verify, test_nand_flash_driver->bytes_per_oob, &status);\r
+ PRINT("nandflash [READ][PAGE:%d]\r\n", nand_page);\r
+ uint32_t retlen;\r
+ writew(0x57000010, 0x5a);\r
+ os_nand_read_oob(mtd, mtd->writesize * nand_page, mtd->writesize + mtd->oobsize, &retlen, (const char *)buffer_verify);\r
+ writew(0x57000010, 0x0);\r
for (uint32_t i = 0; i < test_nand_flash_driver->bytes_per_page; i++) {\r
PRINT("[READ DATA INDEX:%d , VALUE:%d] \r\n", i, buffer_verify[i]);\r
}\r
\r
void test_nand_flash_write_width8(struct nand_driver_struct *test_nand_flash_driver, uint32_t nand_page)\r
{\r
+ struct mtd_info *mtd;\r
+ mtd = get_mtd("nand");\r
+ if (mtd == NULL)\r
+ {\r
+ nand_register(mtd);\r
+ }\r
+ \r
+\r
int j = 0;\r
for (uint32_t i = 0; i < test_nand_flash_driver->bytes_per_page; i++) {\r
buffer_verify[i] = i;\r
buffer_oob_verify[1] = 0xff;\r
PRINT("nandflash [READ][PAGE:%d]\r\n", nand_page);\r
PRINT("[WRITE][WRITE][WRITE][WRITE][WRITE][WRITE][WRITE][WRITE]\r\n");\r
- test_nand_flash_driver->write_page(nand_page, buffer_verify, test_nand_flash_driver->bytes_per_page,\r
- buffer_oob_verify, test_nand_flash_driver->bytes_per_oob);\r
+ uint32_t retlen;\r
+ os_nand_write_oob(mtd, mtd->writesize * nand_page, mtd->writesize + mtd->oobsize, &retlen, (const char *)buffer_verify);\r
}\r
\r
void nandflash_qspi_init(void)\r
static qspi_data_type_def g_qspi_data = {0};\r
\r
static uint32_t mc_ds35x1g_read_page(\r
- uint32_t nand_page, uint8_t *data, uint32_t data_len, uint8_t *oob, uint32_t oob_len, const uint32_t *ecc_result)\r
+ uint32_t nand_page, uint8_t *data, uint32_t data_len, uint8_t *oob, uint32_t oob_len, const uint32_t *ecc_result, enum nandflash_trans_type type)\r
{\r
unused(ecc_result);\r
uint32_t ret;\r
uint8_t status_reg;\r
- ret = mc_flash_read_page(nand_page, data, data_len, oob, oob_len, &status_reg);\r
+ ret = mc_flash_read_page(nand_page, data, data_len, oob, oob_len, &status_reg, type);\r
if (get_nand_flash()->enable_ecc == true) {\r
if (DS35X1G_GET_ECC_STATUS(status_reg) >= DS35X1G_ECC_ERROR) {\r
return MC_FAILURE;\r
static qspi_data_type_def g_qspi_data = {0};\r
\r
static uint32_t mc_tc58cyg_read_page(\r
- uint32_t nand_page, uint8_t *data, uint32_t data_len, uint8_t *oob, uint32_t oob_len, const uint32_t *ecc_result)\r
+ uint32_t nand_page, uint8_t *data, uint32_t data_len, uint8_t *oob, uint32_t oob_len, const uint32_t *ecc_result, enum nandflash_trans_type type)\r
{\r
unused(ecc_result);\r
uint32_t ret;\r
uint8_t status_reg;\r
- ret = mc_flash_read_page(nand_page, data, data_len, oob, oob_len, &status_reg);\r
+ ret = mc_flash_read_page(nand_page, data, data_len, oob, oob_len, &status_reg,type);\r
if (ret != MC_SUCCESS) {\r
return MC_FAILURE;\r
}\r
#endif\r
#include "nandflash_config.h"\r
#include "nandflash_to_os.h"\r
+#include "soc_osal.h"\r
+#include "soc_errno.h"\r
+#include "pinctrl_porting.h"\r
+#include "hal_gpio.h"\r
+#include "platform_core.h"\r
+#include "pinctrl.h"\r
\r
#define NAND_FLASH_TYLE 4\r
#define NAND_FLASH_FLAGS 0x400\r
-#define OS_DUMP_LEN 0x14\r
+#define OS_DUMP_LEN 200\r
#define SUCCESS 0\r
#define FAILURE 1\r
#define MAX_RETRYS 3\r
+extern uint8_t nand_read_buf[DEFALUT_BUFLENGTH] __attribute__((aligned(4)));\r
+bool test_overturn = false;\r
\r
-extern uint8_t buffer_verify[DEFALUT_BUFLENGTH];\r
+void test_nand_io_init(void)\r
+{\r
+ test_overturn = false; \r
+ uapi_pin_set_mode(S_AGPIO_R8, (pin_mode_t)HAL_PIO_FUNC_GPIO);\r
+ uapi_gpio_set_dir(S_AGPIO_R8, GPIO_DIRECTION_OUTPUT);\r
+ uapi_gpio_set_val(S_AGPIO_R8, GPIO_LEVEL_HIGH);\r
+}\r
\r
+void test_nand_io_overturn(void)\r
+{\r
+ if(test_overturn)\r
+ {\r
+ test_overturn = false;\r
+ uapi_gpio_set_dir(S_AGPIO_R8, GPIO_DIRECTION_OUTPUT);\r
+ uapi_gpio_set_val(S_AGPIO_R8, GPIO_LEVEL_LOW);\r
+ }\r
+ else\r
+ {\r
+ test_overturn = true; \r
+ uapi_gpio_set_dir(S_AGPIO_R8, GPIO_DIRECTION_OUTPUT);\r
+ uapi_gpio_set_val(S_AGPIO_R8, GPIO_LEVEL_HIGH);\r
+ }\r
+}\r
+\r
+extern uint8_t buffer_verify[DEFALUT_BUFLENGTH];\r
struct nand_driver_struct *nand_driver;\r
+#ifdef __LITEOS__\r
extern char *OsCurTaskNameGet(void);\r
+#endif\r
+osal_mutex file_system_mux;\r
+\r
+void nand_lock(void)\r
+{\r
+ if (get_trans_type() == TRANS_BY_CPU_SINGLE_LINE) {\r
+ return;\r
+ }\r
+ osal_mutex_lock(&(file_system_mux));\r
+}\r
+\r
+void nand_unlock(void)\r
+{\r
+ if (get_trans_type() == TRANS_BY_CPU_SINGLE_LINE) {\r
+ return;\r
+ }\r
+ osal_mutex_unlock(&(file_system_mux));\r
+}\r
\r
void nand_register(struct mtd_info *mtd)\r
{\r
+ test_nand_io_init();\r
+ ext_errno ret;\r
+ if (file_system_mux.mutex == NULL) {\r
+ ret = osal_mutex_init(&(file_system_mux));\r
+ if (ret != OSAL_SUCCESS)\r
+ {\r
+ return;\r
+ }\r
+ }\r
+\r
nand_driver = get_nand_flash();\r
mtd->size = nand_driver->pages_per_block * nand_driver->bytes_per_page * nand_driver->total_block;\r
mtd->erasesize = nand_driver->pages_per_block * nand_driver->bytes_per_page;\r
\r
int os_nand_erase(const struct mtd_info *mtd, const struct erase_info *instr)\r
{\r
+#ifdef __LITEOS__\r
+ NFPRINT("os_nand_erase %s \r\n",OsCurTaskNameGet());\r
+#endif\r
+ nand_lock();\r
uint32_t addr = (uint32_t)instr->addr;\r
uint32_t len = (uint32_t)instr->len;\r
NFPRINT("liteos_nand_erase addr=%u ,len=%u \r\n", addr, len);\r
NFPRINT("start block = %d\r\n", start_block);\r
NFPRINT("block_num = %d \r\n", block_num);\r
if ((addr & (mtd->erasesize - 1)) != 0) {\r
- NFPRINT("Unaligned erase address!\r\n");\r
+ PRINT("Unaligned erase address!\r\n");\r
+ nand_unlock();\r
return FAILURE;\r
}\r
if ((len + addr) > mtd->size) {\r
- NFPRINT("Out of range!\r\n");\r
+ PRINT("Out of range!\r\n");\r
+ nand_unlock();\r
return FAILURE;\r
}\r
if (len < mtd->erasesize) {\r
- NFPRINT("Erase size 0x%08x smaller than one erase block 0x%08x\r\n!", len, mtd->erasesize);\r
+ PRINT("Erase size 0x%08x smaller than one erase block 0x%08x\r\n!", len, mtd->erasesize);\r
+ nand_unlock();\r
return FAILURE;\r
}\r
for (uint32_t i = 0; i < block_num; i++) {\r
}\r
}\r
NFPRINT("liteos_nand_erase SUCCESS \r\n");\r
+ nand_unlock();\r
return SUCCESS;\r
}\r
\r
int os_nand_read_oob(struct mtd_info *mtd, size_t from, size_t len, size_t *retlen, char *buf)\r
{\r
+\r
+ nand_lock();\r
uint32_t *change = (uint32_t *)&from;\r
uint32_t addr_from = change[0];\r
*retlen = len;\r
NFPRINT("read oob addr_from=%x len=%d \r\n", addr_from, len);\r
if ((addr_from & (mtd->writesize - 1)) != 0) {\r
- NFPRINT("Attempt to read non page aligned data, addr_from %08x.\n",\r
+ PRINT("Attempt to read non page aligned data, addr_from %08x.\n",\r
(uint32_t)addr_from);\r
+ nand_unlock();\r
return FAILURE;\r
}\r
if ((len % (mtd->writesize + mtd->oobsize)) != 0) {\r
- NFPRINT("Attempt to read non aligned data, read length should "\r
+ PRINT("Attempt to read non aligned data, read length should "\r
"be aligned with (pagesize + oobsize), length:%d "\r
"pagesize:%d oobsize:%d\n",\r
(uint32_t)len, mtd->writesize, mtd->oobsize);\r
+ nand_unlock();\r
return FAILURE;\r
}\r
uint32_t len_data = len / (mtd->writesize + mtd->oobsize) * mtd->writesize;\r
NFPRINT("read oob len_data = %d , from_page = %d , currrent_page = %d\r\n", len_data, frompage, frompage + i);\r
ret = nand_driver->read_page(frompage + i, (uint8_t *)buf + i * (mtd->writesize + mtd->oobsize),\r
mtd->writesize, (uint8_t *)buf + i * (mtd->writesize + mtd->oobsize) +\r
- mtd->writesize, mtd->oobsize, &status);\r
+ mtd->writesize, mtd->oobsize, &status, TRANS_DEFAULT);\r
if (ret != MC_SUCCESS) {\r
- NFPRINT("NAND read to from %08x failed %d \r\n",\r
+ ret = nand_driver->read_page(frompage + i, (uint8_t *)buf + i * (mtd->writesize + mtd->oobsize),\r
+ mtd->writesize, (uint8_t *)buf + i * (mtd->writesize + mtd->oobsize) + mtd->writesize, mtd->oobsize, &status, TRANS_BY_CPU_SINGLE_LINE);\r
+ }\r
+ if (ret != MC_SUCCESS) {\r
+ PRINT("NAND read to from %08x failed %d \r\n",\r
(uint32_t)addr_from + i * mtd->writesize, ret);\r
+ nand_unlock();\r
return FAILURE;\r
}\r
len -= mtd->writesize + mtd->oobsize;\r
}\r
+ nand_unlock();\r
return SUCCESS;\r
}\r
\r
int os_nand_write_oob(struct mtd_info *mtd, size_t to, size_t len, size_t *retlen, const char *buf)\r
{\r
+#ifdef __LITEOS__\r
+ NFPRINT("os_nand_write_oob %s \r\n",OsCurTaskNameGet());\r
+#endif\r
+ nand_lock();\r
uint32_t *change = (uint32_t *)&to;\r
uint32_t from = change[0];\r
- *retlen = len;\r
if ((from & (mtd->writesize - 1)) != 0) {\r
NFPRINT("Attempt to read non page aligned data, to %08x.\n", (uint32_t)from);\r
+ nand_unlock();\r
return FAILURE;\r
}\r
if ((len % (mtd->writesize + mtd->oobsize)) != 0) {\r
"be aligned with (pagesize + oobsize), length:%d "\r
"pagesize:%d oobsize:%d\n",\r
(uint32_t)len, mtd->writesize, mtd->oobsize);\r
+ nand_unlock();\r
return FAILURE;\r
}\r
uint32_t len_data = len / (mtd->writesize + mtd->oobsize) * mtd->writesize;\r
for (uint32_t i = 0; i < len_data / mtd->writesize; i++) {\r
uint8_t status;\r
write_ret = nand_driver->write_page(frompage + i, (uint8_t *)buf + i * (mtd->writesize + mtd->oobsize),\r
- mtd->writesize, (uint8_t *)buf + i * (mtd->writesize + mtd->oobsize) +\r
- mtd->writesize, mtd->oobsize);\r
-\r
+ mtd->writesize, (uint8_t *)buf + i * (mtd->writesize + mtd->oobsize) + mtd->writesize, mtd->oobsize);\r
+ memset_s(buffer_verify, OS_DUMP_LEN, 0, OS_DUMP_LEN);\r
read_ret = nand_driver->read_page(frompage + i, (uint8_t *)buffer_verify, mtd->writesize,\r
(uint8_t *)buffer_verify + mtd->writesize, mtd->oobsize,\r
- &status);\r
- if (write_ret != MC_SUCCESS) {\r
- PRINT("NAND write to %08x failed %d \r\n",\r
- (uint32_t)from + i * mtd->writesize, write_ret);\r
+ &status, TRANS_BY_CPU_SINGLE_LINE);\r
+ if (write_ret != MC_SUCCESS)\r
+ {\r
+ PRINT("NAND write to %08x failed %d \r\n", (uint32_t)from + i * mtd->writesize, write_ret);\r
+ nand_unlock();\r
return FAILURE;\r
}\r
if (read_ret != MC_SUCCESS) {\r
- PRINT("NAND write read %08x failed %d \r\n",\r
- (uint32_t)from + i * mtd->writesize, read_ret);\r
+ PRINT("NAND write read %08x failed %d \r\n", (uint32_t)from + i * mtd->writesize, read_ret);\r
+ nand_unlock();\r
return FAILURE;\r
}\r
for (uint32_t t = 0; t < (mtd->writesize + mtd->oobsize); t++) {\r
if ((uint8_t)buffer_verify[t] != (uint8_t)(buf[i * (mtd->writesize + mtd->oobsize) + t])) {\r
#ifdef __LITEOS__\r
+ PRINT("PAGE = %d\r\n", frompage + i);\r
PRINT("origin-----------------------------------------, diff index = %d\r\n", t);\r
- OsDumpMemByte(OS_DUMP_LEN, (const char *)buf + i * (mtd->writesize + mtd->oobsize) + t);\r
- PRINT("after------------------------------------------, diff index = %d\r\n", t);\r
- OsDumpMemByte(OS_DUMP_LEN, buffer_verify + t);\r
+ OsDumpMemByte(OS_DUMP_LEN, (const char *)buf + i * (mtd->writesize + mtd->oobsize));\r
+ PRINT("after1--nand_read_buf---------------------------, diff index = %d\r\n", t);\r
+ OsDumpMemByte(200, nand_read_buf);\r
+ PRINT("after2------------------------------------------, diff index = %d\r\n", t);\r
+ OsDumpMemByte(OS_DUMP_LEN, buffer_verify);\r
+\r
#endif\r
PRINT("os_nand_write_oob check write fail, page = %d\r\n", frompage + i);\r
-\r
+ nand_unlock();\r
return FAILURE;\r
}\r
}\r
len -= mtd->writesize + mtd->oobsize;\r
+ *retlen = *retlen + mtd->writesize + mtd->oobsize;\r
}\r
+ nand_unlock();\r
return SUCCESS;\r
}\r
\r
int os_nand_block_isbad(const struct mtd_info *mtd, size_t ofs)\r
{\r
+ nand_lock();\r
uint32_t *change = (uint32_t *)&ofs;\r
uint32_t addr = change[0];\r
NFPRINT("check is bad addr = %x\r\n", addr);\r
if ((addr & (mtd->erasesize - 1)) != 0) {\r
NFPRINT("Unaligned checkbad address!\n");\r
+ nand_unlock();\r
return FAILURE;\r
}\r
- uint8_t ret = (uint8_t)nand_driver->check_bad_block(addr / mtd->erasesize);\r
+ int ret = (uint8_t)nand_driver->check_bad_block(addr / mtd->erasesize);\r
NFPRINT("liteos_nand_block_isbad ret = %d \r\n", ret);\r
+ nand_unlock();\r
return ret;\r
}\r
\r
int os_nand_block_markbad(const struct mtd_info *mtd, size_t ofs)\r
{\r
+ nand_lock();\r
uint32_t *change = (uint32_t *)&ofs;\r
uint32_t addr = change[0];\r
NFPRINT("mark bad addr = %x \r\n", addr);\r
if ((addr & (mtd->erasesize - 1)) != 0) {\r
NFPRINT("Unaligned markbad address!\n");\r
+ nand_unlock();\r
return FAILURE;\r
}\r
PRINT("mark bad block %d \r\n", addr / mtd->erasesize);\r
- return (int)nand_driver->mark_bad_block(addr / mtd->erasesize);\r
+ int ret = (int)nand_driver->mark_bad_block(addr / mtd->erasesize);\r
+ nand_unlock();\r
+ return ret;\r
}\r
\r
int os_nand_read(const struct mtd_info *mtd, size_t from, size_t len, const size_t *retlen, const char *buf)\r
#define NAND_ID_DATA_SIZE 0x2\r
\r
static uint32_t mc_w25n01g_read_page(uint32_t nand_page, uint8_t *data, uint32_t data_len,\r
- uint8_t *oob, uint32_t oob_len, const uint32_t *ecc_result)\r
+ uint8_t *oob, uint32_t oob_len, const uint32_t *ecc_result, enum nandflash_trans_type type)\r
{\r
unused(ecc_result);\r
uint32_t ret;\r
uint8_t status_reg;\r
- ret = mc_flash_read_page(nand_page, data, data_len, oob, oob_len, &status_reg);\r
+ ret = mc_flash_read_page(nand_page, data, data_len, oob, oob_len, &status_reg, type);\r
if (get_nand_flash()->enable_ecc == true) {\r
if (W25N01G_GET_ECC_STATUS(status_reg) >= W25N01G_ECC_ERROR) {\r
return MC_FAILURE;\r
ret = tsdd->touch_api->touch_get_tpinfo((uint8_t *)(&touch_info), sizeof(input_event_info));\r
if (ret != EXT_ERR_SUCCESS) {\r
tp_err("get touch info fail! ret=0x%x", ret);\r
+ return ret;\r
}\r
\r
report_or_enqueue_event(&touch_info, tsdd);\r
g_gigadevice_gd25wq64_enter_qspi_mode_cmd, NULL, &g_gigadevice_gd25le64_config },\r
{ FLASH_MANUFACTURER_GIGADEVICE_GD25LX128, FLASH_SIZE_16MB, 0x20, 0x0, WAIT_CYCLES_4, 0x05, 0x75, 0x7A,\r
g_gigadevice_gd25lq128_enter_qspi_mode_cmd, NULL, &g_gigadevice_gd25lx_config },\r
- { FLASH_MANUFACTURER_GIGADEVICE_GD25LQ256, FLASH_SIZE_32MB, 0x20, 0x0, WAIT_CYCLES_4, 0x05, 0x75, 0x7A,\r
+ { FLASH_MANUFACTURER_GIGADEVICE_GD25LQ256, FLASH_SIZE_32MB, 0x20, 0x0, WAIT_CYCLES_6, 0x05, 0x75, 0x7A,\r
g_gigadevice_gd25lq256_enter_qspi_mode_cmd, NULL, &g_gigadevice_gd25lq256_config },\r
{ FLASH_MANUFACTURER_DOSILICON_FM25M64, FLASH_SIZE_8MB, 0xA0, 0x00, WAIT_CYCLES_2, 0x35, 0x75, 0x7A,\r
g_dosilicon_fm25m64_enter_qspi_mode_cmd, NULL, &g_dosilicon_fm25m64_config },\r
<MSG STRUCTURE="diag_log_msg2" NAME="btsdk_connect_ex error ret: %x, %x @a2dp_service.c(813),ERROR" ID="0xd80c196a" />
<MSG STRUCTURE="diag_log_msg1" NAME="fail a2dp_src_disconnect_req error ret: %x @a2dp_service.c(836),ERROR" ID="0xd80c1a22" />
<MSG STRUCTURE="diag_log_msg0" NAME="memcpy fail @a2dp_service.c(852),ERROR" ID="0xd80c1aa2" />
- <MSG STRUCTURE="diag_log_msg3" NAME="stream_hdl: %08x stream_status:%u ret: %08x @a2dp_service.c(937),INFO" ID="0xd80c1d4d" />
- <MSG STRUCTURE="diag_log_msg2" NAME="suspend stream_hdl: %08x ret: %08x @a2dp_service.c(949),INFO" ID="0xd80c1dad" />
- <MSG STRUCTURE="diag_log_msg2" NAME="stop stream_hdl: %08x ret: %08x @a2dp_service.c(960),INFO" ID="0xd80c1e05" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="duplicate register callback @a2dp_service.c(870),INFO" ID="0xd80c1b35" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc error @a2dp_service.c(880),ERROR" ID="0xd80c1b82" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy fail @a2dp_service.c(885),ERROR" ID="0xd80c1baa" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="stream_hdl: %08x stream_status:%u ret: %08x @a2dp_service.c(952),INFO" ID="0xd80c1dc5" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="suspend stream_hdl: %08x ret: %08x @a2dp_service.c(964),INFO" ID="0xd80c1e25" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="stop stream_hdl: %08x ret: %08x @a2dp_service.c(975),INFO" ID="0xd80c1e7d" />
</MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg2" NAME="last_state: %d new_state: %d @a2dp_snk_service.c(69),INFO" ID="0xd80e022d" />
- <MSG STRUCTURE="diag_log_msg5" NAME="addr: ****%02x%02x%02x%02x conn_hdl: %x @a2dp_snk_service.c(92),INFO" ID="0xd80e02e5" />
- <MSG STRUCTURE="diag_log_msg1" NAME="disconnect_ret(int): %d @a2dp_snk_service.c(98),INFO" ID="0xd80e0315" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy fail @a2dp_snk_service.c(102),ERROR" ID="0xd80e0332" />
- <MSG STRUCTURE="diag_log_msg3" NAME="event: %x dev_hdl: %x conn_hdl: %x @a2dp_snk_service.c(121),INFO" ID="0xd80e03cd" />
- <MSG STRUCTURE="diag_log_msg3" NAME="rmt_hdl: %x seid: %x sc_len: %d sc: @a2dp_snk_service.c(132),INFO" ID="0xd80e0425" />
- <MSG STRUCTURE="diag_log_msg1" NAME="%x @a2dp_snk_service.c(134),INFO" ID="0xd80e0435" />
- <MSG STRUCTURE="diag_log_msg0" NAME=" @a2dp_snk_service.c(136),INFO" ID="0xd80e0445" />
- <MSG STRUCTURE="diag_log_msg5" NAME="streamMtu:%d, FrameSize: %d, numFrame: %d, stream_hdl: 0x%x, stream_state: %d @a2dp_snk_service.c(155),INFO" ID="0xd80e04dd" />
- <MSG STRUCTURE="diag_log_msg1" NAME="unexpected state %d @a2dp_snk_service.c(186),WARNING" ID="0xd80e05d3" />
- <MSG STRUCTURE="diag_log_msg3" NAME="stream_hdl: %x state: %d param_len: %d @a2dp_snk_service.c(194),INFO" ID="0xd80e0615" />
- <MSG STRUCTURE="diag_log_msg1" NAME="set active device ret: %x @a2dp_snk_service.c(204),INFO" ID="0xd80e0665" />
- <MSG STRUCTURE="diag_log_msg0" NAME="error: cap_len is bigger! @a2dp_snk_service.c(251),ERROR" ID="0xd80e07da" />
- <MSG STRUCTURE="diag_log_msg0" NAME="sbc report inf @a2dp_snk_service.c(253),INFO" ID="0xd80e07ed" />
- <MSG STRUCTURE="diag_log_msg2" NAME="codec_caps[%u]:%02x @a2dp_snk_service.c(255),INFO" ID="0xd80e07fd" />
- <MSG STRUCTURE="diag_log_msg0" NAME=" @a2dp_snk_service.c(257),INFO" ID="0xd80e080d" />
- <MSG STRUCTURE="diag_log_msg8" NAME="sbc sampleFreq: %02x chnlMode: %02x blockLen: %02x subBand: %02x allocMtd: %02x Bitpool: %02x %02x payload:%u @a2dp_snk_service.c(280),INFO" ID="0xd80e08c5" />
- <MSG STRUCTURE="diag_log_msg0" NAME="error: cap_len is bigger! @a2dp_snk_service.c(309),ERROR" ID="0xd80e09aa" />
- <MSG STRUCTURE="diag_log_msg0" NAME="aac report inf @a2dp_snk_service.c(311),INFO" ID="0xd80e09bd" />
- <MSG STRUCTURE="diag_log_msg2" NAME="codec_caps[%u]:%02x @a2dp_snk_service.c(313),INFO" ID="0xd80e09cd" />
- <MSG STRUCTURE="diag_log_msg0" NAME=" @a2dp_snk_service.c(315),INFO" ID="0xd80e09dd" />
- <MSG STRUCTURE="diag_log_msg6" NAME="aac sampleFreq: %02x bit_rate: %02x channels: %02x objectType: %02x rfa: %02x vbr: %02x @a2dp_snk_service.c(335),INFO" ID="0xd80e0a7d" />
- <MSG STRUCTURE="diag_log_msg1" NAME="code_c: %d @a2dp_snk_service.c(343),INFO" ID="0xd80e0abd" />
- <MSG STRUCTURE="diag_log_msg4" NAME="stream_hdl: %x, role: %x, event: %x, err: %x @a2dp_snk_service.c(366),INFO" ID="0xd80e0b75" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc errr @a2dp_snk_service.c(376),ERROR" ID="0xd80e0bc2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s errr @a2dp_snk_service.c(385),ERROR" ID="0xd80e0c0a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc errr @a2dp_snk_service.c(396),ERROR" ID="0xd80e0c62" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s errr @a2dp_snk_service.c(405),ERROR" ID="0xd80e0caa" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc errr @a2dp_snk_service.c(416),ERROR" ID="0xd80e0d02" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s errr @a2dp_snk_service.c(422),ERROR" ID="0xd80e0d32" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc errr @a2dp_snk_service.c(433),ERROR" ID="0xd80e0d8a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s errr @a2dp_snk_service.c(439),ERROR" ID="0xd80e0dba" />
- <MSG STRUCTURE="diag_log_msg4" NAME="conn_state:%d dev_hdl: %08x conn_hdl: %08x stream_hdl: %08x @a2dp_snk_service.c(470),INFO" ID="0xd80e0eb5" />
- <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_snk_set_stream_codec memcpy fail @a2dp_snk_service.c(514),ERROR" ID="0xd80e1012" />
- <MSG STRUCTURE="diag_log_msg7" NAME="sbc sF: %02x cM: %02x blockL: %02x sBand: %02x alcM: %02x BitP: %02x %02x @a2dp_snk_service.c(523),INFO" ID="0xd80e105d" />
- <MSG STRUCTURE="diag_log_msg6" NAME="aac sF: %02x bit_rate: %02x channel: %02x objType: %02x fa: %02x vbr: %02x @a2dp_snk_service.c(528),INFO" ID="0xd80e1085" />
- <MSG STRUCTURE="diag_log_msg3" NAME="is_reconfig: %d stream_hdl: %x ret %x @a2dp_snk_service.c(534),INFO" ID="0xd80e10b5" />
- <MSG STRUCTURE="diag_log_msg1" NAME="btsdk_disconnect error ret: %x @a2dp_snk_service.c(566),ERROR" ID="0xd80e11b2" />
- <MSG STRUCTURE="diag_log_msg3" NAME="filter try_report: %d now: %d reported: %d @a2dp_snk_service.c(593),INFO" ID="0xd80e128d" />
- <MSG STRUCTURE="diag_log_msg0" NAME="get addr error @a2dp_snk_service.c(600),INFO" ID="0xd80e12c5" />
- <MSG STRUCTURE="diag_log_msg0" NAME="get addr error @a2dp_snk_service.c(617),INFO" ID="0xd80e134d" />
- <MSG STRUCTURE="diag_log_msg0" NAME="get addr error @a2dp_snk_service.c(634),INFO" ID="0xd80e13d5" />
- <MSG STRUCTURE="diag_log_msg0" NAME="get addr error @a2dp_snk_service.c(651),ERROR" ID="0xd80e145a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc error @a2dp_snk_service.c(657),ERROR" ID="0xd80e148a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="fill codec error @a2dp_snk_service.c(664),ERROR" ID="0xd80e14c2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="error sbc sample_frequency %x @a2dp_snk_service.c(694),ERROR" ID="0xd80e15b2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="error aac sample_frequency %x @a2dp_snk_service.c(716),ERROR" ID="0xd80e1662" />
- <MSG STRUCTURE="diag_log_msg1" NAME="error codec_type %x @a2dp_snk_service.c(720),ERROR" ID="0xd80e1682" />
- <MSG STRUCTURE="diag_log_msg1" NAME="unhandled msg id %x @a2dp_snk_service.c(770),WARNING" ID="0xd80e1813" />
- <MSG STRUCTURE="diag_log_msg2" NAME="btsdk_connect_ex error ret: %x, %x @a2dp_snk_service.c(843),ERROR" ID="0xd80e1a5a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="a2dp snk disconnect error ret: %x @a2dp_snk_service.c(870),ERROR" ID="0xd80e1b32" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy fail @a2dp_snk_service.c(886),ERROR" ID="0xd80e1bb2" />
- <MSG STRUCTURE="diag_log_msg3" NAME="stream_hdl: %08x stream_status:%u ret: %08x @a2dp_snk_service.c(971),INFO" ID="0xd80e1e5d" />
- <MSG STRUCTURE="diag_log_msg2" NAME="suspend stream_hdl: %08x ret: %08x @a2dp_snk_service.c(982),INFO" ID="0xd80e1eb5" />
- <MSG STRUCTURE="diag_log_msg2" NAME="stop stream_hdl: %08x ret: %08x @a2dp_snk_service.c(993),INFO" ID="0xd80e1f0d" />
- <MSG STRUCTURE="diag_log_msg2" NAME="start accept stream_hdl: %08x ret: %08x @a2dp_snk_service.c(1004),INFO" ID="0xd80e1f65" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg2" NAME="last_state: %d new_state: %d @a2dp_snk_service.c(73),INFO" ID="0xd80e024d" />
+ <MSG STRUCTURE="diag_log_msg5" NAME="addr: ****%02x%02x%02x%02x conn_hdl: %x @a2dp_snk_service.c(96),INFO" ID="0xd80e0305" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="disconnect_ret(int): %d @a2dp_snk_service.c(102),INFO" ID="0xd80e0335" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy fail @a2dp_snk_service.c(106),ERROR" ID="0xd80e0352" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="event: %x dev_hdl: %x conn_hdl: %x @a2dp_snk_service.c(125),INFO" ID="0xd80e03ed" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="rmt_hdl: %x seid: %x sc_len: %d sc: @a2dp_snk_service.c(136),INFO" ID="0xd80e0445" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="%x @a2dp_snk_service.c(138),INFO" ID="0xd80e0455" />
+ <MSG STRUCTURE="diag_log_msg0" NAME=" @a2dp_snk_service.c(140),INFO" ID="0xd80e0465" />
+ <MSG STRUCTURE="diag_log_msg5" NAME="streamMtu:%d, FrameSize: %d, numFrame: %d, stream_hdl: 0x%x, stream_state: %d @a2dp_snk_service.c(159),INFO" ID="0xd80e04fd" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="unexpected state %d @a2dp_snk_service.c(190),WARNING" ID="0xd80e05f3" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="stream_hdl: %x state: %d param_len: %d @a2dp_snk_service.c(198),INFO" ID="0xd80e0635" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="set active device ret: %x @a2dp_snk_service.c(208),INFO" ID="0xd80e0685" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="error: cap_len is bigger! @a2dp_snk_service.c(255),ERROR" ID="0xd80e07fa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="sbc report inf @a2dp_snk_service.c(257),INFO" ID="0xd80e080d" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="codec_caps[%u]:%02x @a2dp_snk_service.c(259),INFO" ID="0xd80e081d" />
+ <MSG STRUCTURE="diag_log_msg0" NAME=" @a2dp_snk_service.c(261),INFO" ID="0xd80e082d" />
+ <MSG STRUCTURE="diag_log_msg8" NAME="sbc sampleFreq: %02x chnlMode: %02x blockLen: %02x subBand: %02x allocMtd: %02x Bitpool: %02x %02x payload:%u @a2dp_snk_service.c(284),INFO" ID="0xd80e08e5" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="error: cap_len is bigger! @a2dp_snk_service.c(313),ERROR" ID="0xd80e09ca" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="aac report inf @a2dp_snk_service.c(315),INFO" ID="0xd80e09dd" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="codec_caps[%u]:%02x @a2dp_snk_service.c(317),INFO" ID="0xd80e09ed" />
+ <MSG STRUCTURE="diag_log_msg0" NAME=" @a2dp_snk_service.c(319),INFO" ID="0xd80e09fd" />
+ <MSG STRUCTURE="diag_log_msg6" NAME="aac sampleFreq: %02x bit_rate: %02x channels: %02x objectType: %02x rfa: %02x vbr: %02x @a2dp_snk_service.c(339),INFO" ID="0xd80e0a9d" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="code_c: %d @a2dp_snk_service.c(347),INFO" ID="0xd80e0add" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="stream_hdl: %x, role: %x, event: %x, err: %x @a2dp_snk_service.c(370),INFO" ID="0xd80e0b95" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc errr @a2dp_snk_service.c(380),ERROR" ID="0xd80e0be2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s errr @a2dp_snk_service.c(389),ERROR" ID="0xd80e0c2a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc errr @a2dp_snk_service.c(400),ERROR" ID="0xd80e0c82" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s errr @a2dp_snk_service.c(409),ERROR" ID="0xd80e0cca" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc errr @a2dp_snk_service.c(420),ERROR" ID="0xd80e0d22" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s errr @a2dp_snk_service.c(426),ERROR" ID="0xd80e0d52" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc errr @a2dp_snk_service.c(437),ERROR" ID="0xd80e0daa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s errr @a2dp_snk_service.c(443),ERROR" ID="0xd80e0dda" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="conn_state:%d dev_hdl: %08x conn_hdl: %08x stream_hdl: %08x @a2dp_snk_service.c(474),INFO" ID="0xd80e0ed5" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_snk_set_stream_codec memcpy fail @a2dp_snk_service.c(518),ERROR" ID="0xd80e1032" />
+ <MSG STRUCTURE="diag_log_msg7" NAME="sbc sF: %02x cM: %02x blockL: %02x sBand: %02x alcM: %02x BitP: %02x %02x @a2dp_snk_service.c(527),INFO" ID="0xd80e107d" />
+ <MSG STRUCTURE="diag_log_msg6" NAME="aac sF: %02x bit_rate: %02x channel: %02x objType: %02x fa: %02x vbr: %02x @a2dp_snk_service.c(532),INFO" ID="0xd80e10a5" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="is_reconfig: %d stream_hdl: %x ret %x @a2dp_snk_service.c(538),INFO" ID="0xd80e10d5" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="btsdk_disconnect error ret: %x @a2dp_snk_service.c(570),ERROR" ID="0xd80e11d2" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="filter try_report: %d now: %d reported: %d @a2dp_snk_service.c(597),INFO" ID="0xd80e12ad" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="get addr error @a2dp_snk_service.c(604),INFO" ID="0xd80e12e5" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="get addr error @a2dp_snk_service.c(621),INFO" ID="0xd80e136d" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="get addr error @a2dp_snk_service.c(638),INFO" ID="0xd80e13f5" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="get addr error @a2dp_snk_service.c(655),ERROR" ID="0xd80e147a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc error @a2dp_snk_service.c(661),ERROR" ID="0xd80e14aa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="fill codec error @a2dp_snk_service.c(668),ERROR" ID="0xd80e14e2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="error sbc sample_frequency %x @a2dp_snk_service.c(698),ERROR" ID="0xd80e15d2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="error aac sample_frequency %x @a2dp_snk_service.c(720),ERROR" ID="0xd80e1682" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="error codec_type %x @a2dp_snk_service.c(724),ERROR" ID="0xd80e16a2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="unhandled msg id %x @a2dp_snk_service.c(774),WARNING" ID="0xd80e1833" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="btsdk_connect_ex error ret: %x, %x @a2dp_snk_service.c(847),ERROR" ID="0xd80e1a7a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="a2dp snk disconnect error ret: %x @a2dp_snk_service.c(874),ERROR" ID="0xd80e1b52" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy fail @a2dp_snk_service.c(890),ERROR" ID="0xd80e1bd2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="duplicate register callback @a2dp_snk_service.c(908),INFO" ID="0xd80e1c65" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc error @a2dp_snk_service.c(918),ERROR" ID="0xd80e1cb2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy fail @a2dp_snk_service.c(923),ERROR" ID="0xd80e1cda" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="stream_hdl: %08x stream_status:%u ret: %08x @a2dp_snk_service.c(990),INFO" ID="0xd80e1ef5" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="suspend stream_hdl: %08x ret: %08x @a2dp_snk_service.c(1001),INFO" ID="0xd80e1f4d" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="stop stream_hdl: %08x ret: %08x @a2dp_snk_service.c(1012),INFO" ID="0xd80e1fa5" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="start accept stream_hdl: %08x ret: %08x @a2dp_snk_service.c(1023),INFO" ID="0xd80e1ffd" />
</MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg1" NAME="ams starts %s", result ? "successfully" : "unsuccessfully @ability_mgr_service.cpp(56),INFO" ID="0xe01801c5" />
- <MSG STRUCTURE="diag_log_msg3" NAME="AbilityMgrService::ServiceInitialize serviceId = %d, featureId = %d, queueId = %d @ability_mgr_service.cpp(85),DBG" ID="0xe01802ae" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[AMS] handle msg: START_ABILITY @ability_mgr_service.cpp(98),INFO" ID="0xe0180315" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg1" NAME="ams starts %s", result ? "successfully" : "unsuccessfully @ability_mgr_service.cpp(57),INFO" ID="0xe01801cd" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="AbilityMgrService::ServiceInitialize serviceId = %d, featureId = %d, queueId = %d @ability_mgr_service.cpp(86),DBG" ID="0xe01802b6" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[AMS] handle msg: START_ABILITY @ability_mgr_service.cpp(99),INFO" ID="0xe018031d" />
</MSG_LOG>
\ No newline at end of file
<MSG STRUCTURE="diag_log_msg0" NAME="OnBackgroundDone clean launcher record data @ability_service.cpp(492),INFO" ID="0xe01e0f65" />
<MSG STRUCTURE="diag_log_msg0" NAME="Js app exit, but has no js app. @ability_service.cpp(499),WARNING" ID="0xe01e0f9b" />
<MSG STRUCTURE="diag_log_msg1" NAME="OnDestroyDone [%u] @ability_service.cpp(504),INFO" ID="0xe01e0fc5" />
- <MSG STRUCTURE="diag_log_msg0" NAME="AbilityService::SchedulerLifecycleDone state: STATE_ACTIVE @ability_service.cpp(613),INFO" ID="0xe01e132d" />
- <MSG STRUCTURE="diag_log_msg0" NAME="AbilityService::SchedulerLifecycleDone state: STATE_BACKGROUND @ability_service.cpp(618),INFO" ID="0xe01e1355" />
- <MSG STRUCTURE="diag_log_msg0" NAME="AbilityService::SchedulerLifecycleDone state: STATE_UNINITIALIZED @ability_service.cpp(623),INFO" ID="0xe01e137d" />
- <MSG STRUCTURE="diag_log_msg0" NAME="AbilityService::SendGraphicTEEventToJsAbility topRecord is not js!! @ability_service.cpp(664),ERROR" ID="0xe01e14c2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="AbilityService::SchedulerLifecycleDone state: STATE_ACTIVE @ability_service.cpp(615),INFO" ID="0xe01e133d" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="AbilityService::SchedulerLifecycleDone state: STATE_BACKGROUND @ability_service.cpp(620),INFO" ID="0xe01e1365" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="AbilityService::SchedulerLifecycleDone state: STATE_UNINITIALIZED @ability_service.cpp(625),INFO" ID="0xe01e138d" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="AbilityService::SendGraphicTEEventToJsAbility topRecord is not js!! @ability_service.cpp(666),ERROR" ID="0xe01e14d2" />
</MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="create style_name failed. @app_style.cpp(29),ERROR" ID="0xe10a00ea" />
- <MSG STRUCTURE="diag_log_msg0" NAME="style_name set string value error @app_style.cpp(33),ERROR" ID="0xe10a010a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="transform prop value must be set. @app_style.cpp(169),ERROR" ID="0xe10a054a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="None style to parse. @app_style.cpp(187),ERROR" ID="0xe10a05da" />
- <MSG STRUCTURE="diag_log_msg0" NAME="None style to parse. @app_style.cpp(193),ERROR" ID="0xe10a060a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc space error @app_style.cpp(265),ERROR" ID="0xe10a084a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="convert style name to char failed, will be dropped @app_style.cpp(295),ERROR" ID="0xe10a093a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="style name length is 0 or max, will be dropped @app_style.cpp(300),ERROR" ID="0xe10a0962" />
- <MSG STRUCTURE="diag_log_msg0" NAME="create style error @app_style.cpp(308),ERROR" ID="0xe10a09a2" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="create style_name failed. @app_style.cpp(29),ERROR" ID="0xe11000ea" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="style_name set string value error @app_style.cpp(33),ERROR" ID="0xe110010a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="transform prop value must be set. @app_style.cpp(169),ERROR" ID="0xe110054a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="None style to parse. @app_style.cpp(187),ERROR" ID="0xe11005da" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="None style to parse. @app_style.cpp(193),ERROR" ID="0xe110060a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc space error @app_style.cpp(265),ERROR" ID="0xe110084a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="convert style name to char failed, will be dropped @app_style.cpp(295),ERROR" ID="0xe110093a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="style name length is 0 or max, will be dropped @app_style.cpp(300),ERROR" ID="0xe1100962" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="create style error @app_style.cpp(308),ERROR" ID="0xe11009a2" />
</MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="create style item string failed. @app_style_item.cpp(58),ERROR" ID="0xe10c01d2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="app_style set string value error @app_style_item.cpp(62),ERROR" ID="0xe10c01f2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="style item transform num to string fail @app_style_item.cpp(77),ERROR" ID="0xe10c026a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="convert style prop name to char failed, will be dropped @app_style_item.cpp(90),ERROR" ID="0xe10c02d2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="style prop name length is 0, will be dropped @app_style_item.cpp(95),ERROR" ID="0xe10c02fa" />
- <MSG STRUCTURE="diag_log_msg0" NAME="new styleItem error @app_style_item.cpp(114),ERROR" ID="0xe10c0392" />
- <MSG STRUCTURE="diag_log_msg0" NAME="convert style value to char failed, will be dropped @app_style_item.cpp(135),ERROR" ID="0xe10c043a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="new styleItem error @app_style_item.cpp(161),ERROR" ID="0xe10c050a" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="create style item string failed. @app_style_item.cpp(58),ERROR" ID="0xe11201d2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="app_style set string value error @app_style_item.cpp(62),ERROR" ID="0xe11201f2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="style item transform num to string fail @app_style_item.cpp(77),ERROR" ID="0xe112026a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="convert style prop name to char failed, will be dropped @app_style_item.cpp(90),ERROR" ID="0xe11202d2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="style prop name length is 0, will be dropped @app_style_item.cpp(95),ERROR" ID="0xe11202fa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="new styleItem error @app_style_item.cpp(114),ERROR" ID="0xe1120392" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="convert style value to char failed, will be dropped @app_style_item.cpp(135),ERROR" ID="0xe112043a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="new styleItem error @app_style_item.cpp(161),ERROR" ID="0xe112050a" />
</MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="malloc flags data buffer failed @app_style_manager.cpp(62),ERROR" ID="0xe11001f2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="convert id value to char failed, will be dropped @app_style_manager.cpp(227),ERROR" ID="0xe110071a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="not supported yet @app_style_manager.cpp(243),WARNING" ID="0xe110079b" />
- <MSG STRUCTURE="diag_log_msg0" NAME="invalid prop count @app_style_manager.cpp(283),ERROR" ID="0xe11008da" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="malloc flags data buffer failed @app_style_manager.cpp(62),ERROR" ID="0xe11601f2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="convert id value to char failed, will be dropped @app_style_manager.cpp(227),ERROR" ID="0xe116071a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="not supported yet @app_style_manager.cpp(243),WARNING" ID="0xe116079b" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="invalid prop count @app_style_manager.cpp(283),ERROR" ID="0xe11608da" />
</MSG_LOG>
\ No newline at end of file
<MSG STRUCTURE="diag_log_msg0" NAME="GrallocInitialize failed. @display_vau.c(70),ERROR" ID="0xcb1e0232" />
<MSG STRUCTURE="diag_log_msg0" NAME="Unsupported Format! @display_vau.c(116),ERROR" ID="0xcb1e03a2" />
<MSG STRUCTURE="diag_log_msg0" NAME="unsupported color format @display_vau.c(125),ERROR" ID="0xcb1e03ea" />
- <MSG STRUCTURE="diag_log_msg1" NAME="blend type %d is not supported yet, use BLEND_SRCOVER instead @display_vau.c(152),WARNING" ID="0xcb1e04c3" />
- <MSG STRUCTURE="diag_log_msg0" NAME="AllocMem failed. @display_vau.c(165),ERROR" ID="0xcb1e052a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="DispMalloc failed due to handle limit. @display_vau.c(172),ERROR" ID="0xcb1e0562" />
- <MSG STRUCTURE="diag_log_msg0" NAME="uapi_vau_wait_for_done failed. @display_vau.c(207),ERROR" ID="0xcb1e067a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Convert2VauSurface failed @display_vau.c(250),ERROR" ID="0xcb1e07d2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="uapi_vau_render failure, ret = 0x%x! @display_vau.c(277),ERROR" ID="0xcb1e08aa" />
- <MSG STRUCTURE="diag_log_msg0" NAME="uapi_vau_parse_cmp_header failed @display_vau.c(299),ERROR" ID="0xcb1e095a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="unsupported color format @display_vau.c(317),ERROR" ID="0xcb1e09ea" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Blend type of each image must be same when blitting them together. @display_vau.c(374),ERROR" ID="0xcb1e0bb2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="ConvertVGUImg2VauSurface failed @display_vau.c(378),ERROR" ID="0xcb1e0bd2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="uapi_vau_compose failure, ret = 0x%x! @display_vau.c(424),ERROR" ID="0xcb1e0d42" />
- <MSG STRUCTURE="diag_log_msg14" NAME="src[%d] w:%u h:%u str:%u fmt:%d cmp:%d rect:[%d,%d,%u,%u] outRect:[%d,%d,%u,%u] @display_vau.c(431),ERROR" ID="0xcb1e0d7a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="DispMalloc for dstSurface failed! @display_vau.c(488),ERROR" ID="0xcb1e0f42" />
- <MSG STRUCTURE="diag_log_msg0" NAME="1st render error!!!! @display_vau.c(503),ERROR" ID="0xcb1e0fba" />
- <MSG STRUCTURE="diag_log_msg0" NAME="2nd render error!!!! @display_vau.c(526),ERROR" ID="0xcb1e1072" />
- <MSG STRUCTURE="diag_log_msg0" NAME="invalid cmd num: 0. @display_vau.c(540),ERROR" ID="0xcb1e10e2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="VGUPathAppendData with invalid path. @display_vau.c(545),ERROR" ID="0xcb1e110a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="invalid cmd num: 0. @display_vau.c(561),ERROR" ID="0xcb1e118a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="VGUPathAppendData with invalid path. @display_vau.c(566),ERROR" ID="0xcb1e11b2" />
- <MSG STRUCTURE="diag_log_msg2" NAME="%s: %d memcpy_s failed @display_vau.c(575),ERROR" ID="0xcb1e11fa" />
- <MSG STRUCTURE="diag_log_msg2" NAME="%s: %d memcpy_s for cmd failed. @display_vau.c(585),ERROR" ID="0xcb1e124a" />
- <MSG STRUCTURE="diag_log_msg2" NAME="%s: %d memcpy_s failed @display_vau.c(595),ERROR" ID="0xcb1e129a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="Invalid gradient type: %d @display_vau.c(664),ERROR" ID="0xcb1e14c2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Invalid VGUFillRule. @display_vau.c(682),ERROR" ID="0xcb1e1552" />
- <MSG STRUCTURE="diag_log_msg0" NAME="HandlePaintStyle failed. @display_vau.c(687),ERROR" ID="0xcb1e157a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Invalid Cap Style! @display_vau.c(707),ERROR" ID="0xcb1e161a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Invalid Join Style! @display_vau.c(728),ERROR" ID="0xcb1e16c2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="HandlePaintStyle failed. @display_vau.c(742),ERROR" ID="0xcb1e1732" />
- <MSG STRUCTURE="diag_log_msg1" NAME="uapi_vau_render failure, ret = 0x%x! @display_vau.c(925),ERROR" ID="0xcb1e1cea" />
- <MSG STRUCTURE="diag_log_msg1" NAME="uapi_vau_render failure, ret = 0x%x! @display_vau.c(995),ERROR" ID="0xcb1e1f1a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="RenderPath with invalid path. @display_vau.c(1127),ERROR" ID="0xcb1e233a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="One of fill and stroke in path attr should be set! @display_vau.c(1132),ERROR" ID="0xcb1e2362" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%d] DispMalloc for tmpTarget1 failed @display_vau.c(1164),ERROR" ID="0xcb1e2462" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%d] DispMalloc for tmpTarget2 failed @display_vau.c(1172),ERROR" ID="0xcb1e24a2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%d] RenderPathInternal failed @display_vau.c(1178),ERROR" ID="0xcb1e24d2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%d] RenderPatternInternal failed @display_vau.c(1183),ERROR" ID="0xcb1e24fa" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%d] BlendToSurface failed @display_vau.c(1188),ERROR" ID="0xcb1e2522" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%d] BlendToSurface failed @display_vau.c(1193),ERROR" ID="0xcb1e254a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%d] RenderPathInternal failed @display_vau.c(1218),ERROR" ID="0xcb1e2612" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%d] BlendImgToSurface failed @display_vau.c(1222),ERROR" ID="0xcb1e2632" />
- <MSG STRUCTURE="diag_log_msg1" NAME="uapi_vau_submit failure, ret = 0x%x! @display_vau.c(1269),ERROR" ID="0xcb1e27aa" />
- <MSG STRUCTURE="diag_log_msg0" NAME="gFuncs is null @display_vau.c(1281),ERROR" ID="0xcb1e280a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memset_s gFuncs failed @display_vau.c(1287),ERROR" ID="0xcb1e283a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="VGU initializes successfully @display_vau.c(1306),INFO" ID="0xcb1e28d5" />
- <MSG STRUCTURE="diag_log_msg0" NAME="VGU uninitializes successfully @display_vau.c(1315),INFO" ID="0xcb1e291d" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="blend type %d is not supported yet, use BLEND_SRCOVER instead @display_vau.c(156),WARNING" ID="0xcb1e04e3" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="AllocMem failed. @display_vau.c(169),ERROR" ID="0xcb1e054a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="DispMalloc failed due to handle limit. @display_vau.c(176),ERROR" ID="0xcb1e0582" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="uapi_vau_wait_for_done failed. @display_vau.c(211),ERROR" ID="0xcb1e069a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Convert2VauSurface failed @display_vau.c(254),ERROR" ID="0xcb1e07f2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="uapi_vau_render failure, ret = 0x%x! @display_vau.c(281),ERROR" ID="0xcb1e08ca" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="uapi_vau_parse_cmp_header failed @display_vau.c(303),ERROR" ID="0xcb1e097a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="unsupported color format @display_vau.c(321),ERROR" ID="0xcb1e0a0a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Blend type of each image must be same when blitting them together. @display_vau.c(378),ERROR" ID="0xcb1e0bd2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="ConvertVGUImg2VauSurface failed @display_vau.c(382),ERROR" ID="0xcb1e0bf2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="uapi_vau_compose failure, ret = 0x%x! @display_vau.c(428),ERROR" ID="0xcb1e0d62" />
+ <MSG STRUCTURE="diag_log_msg14" NAME="src[%d] w:%u h:%u str:%u fmt:%d cmp:%d rect:[%d,%d,%u,%u] outRect:[%d,%d,%u,%u] @display_vau.c(435),ERROR" ID="0xcb1e0d9a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="DispMalloc for dstSurface failed! @display_vau.c(492),ERROR" ID="0xcb1e0f62" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="1st render error!!!! @display_vau.c(507),ERROR" ID="0xcb1e0fda" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="2nd render error!!!! @display_vau.c(530),ERROR" ID="0xcb1e1092" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="invalid cmd num: 0. @display_vau.c(544),ERROR" ID="0xcb1e1102" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="VGUPathAppendData with invalid path. @display_vau.c(549),ERROR" ID="0xcb1e112a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="invalid cmd num: 0. @display_vau.c(565),ERROR" ID="0xcb1e11aa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="VGUPathAppendData with invalid path. @display_vau.c(570),ERROR" ID="0xcb1e11d2" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="%s: %d memcpy_s failed @display_vau.c(579),ERROR" ID="0xcb1e121a" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="%s: %d memcpy_s for cmd failed. @display_vau.c(589),ERROR" ID="0xcb1e126a" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="%s: %d memcpy_s failed @display_vau.c(599),ERROR" ID="0xcb1e12ba" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="Invalid gradient type: %d @display_vau.c(668),ERROR" ID="0xcb1e14e2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Invalid VGUFillRule. @display_vau.c(686),ERROR" ID="0xcb1e1572" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="HandlePaintStyle failed. @display_vau.c(691),ERROR" ID="0xcb1e159a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Invalid Cap Style! @display_vau.c(711),ERROR" ID="0xcb1e163a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Invalid Join Style! @display_vau.c(732),ERROR" ID="0xcb1e16e2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="HandlePaintStyle failed. @display_vau.c(746),ERROR" ID="0xcb1e1752" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="uapi_vau_render failure, ret = 0x%x! @display_vau.c(929),ERROR" ID="0xcb1e1d0a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="uapi_vau_render failure, ret = 0x%x! @display_vau.c(999),ERROR" ID="0xcb1e1f3a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="RenderPath with invalid path. @display_vau.c(1131),ERROR" ID="0xcb1e235a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="One of fill and stroke in path attr should be set! @display_vau.c(1136),ERROR" ID="0xcb1e2382" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%d] DispMalloc for tmpTarget1 failed @display_vau.c(1168),ERROR" ID="0xcb1e2482" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%d] DispMalloc for tmpTarget2 failed @display_vau.c(1176),ERROR" ID="0xcb1e24c2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%d] RenderPathInternal failed @display_vau.c(1182),ERROR" ID="0xcb1e24f2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%d] RenderPatternInternal failed @display_vau.c(1187),ERROR" ID="0xcb1e251a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%d] BlendToSurface failed @display_vau.c(1192),ERROR" ID="0xcb1e2542" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%d] BlendToSurface failed @display_vau.c(1197),ERROR" ID="0xcb1e256a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%d] RenderPathInternal failed @display_vau.c(1222),ERROR" ID="0xcb1e2632" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%d] BlendImgToSurface failed @display_vau.c(1226),ERROR" ID="0xcb1e2652" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="uapi_vau_submit failure, ret = 0x%x! @display_vau.c(1273),ERROR" ID="0xcb1e27ca" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="gFuncs is null @display_vau.c(1285),ERROR" ID="0xcb1e282a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memset_s gFuncs failed @display_vau.c(1291),ERROR" ID="0xcb1e285a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="VGU initializes successfully @display_vau.c(1310),INFO" ID="0xcb1e28f5" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="VGU uninitializes successfully @display_vau.c(1319),INFO" ID="0xcb1e293d" />
</MSG_LOG>
\ No newline at end of file
<MSG STRUCTURE="diag_log_msg0" NAME="multiImgInfo.info is nullptr @image_cache_manager.cpp(115),ERROR" ID="0xcb1c039a" />
<MSG STRUCTURE="diag_log_msg0" NAME="UIMalloc for node failed! @image_cache_manager.cpp(155),ERROR" ID="0xcb1c04da" />
<MSG STRUCTURE="diag_log_msg0" NAME="ImageCacheMalloc for img data failed! @image_cache_manager.cpp(163),ERROR" ID="0xcb1c051a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="CreateImageNode failed! @image_cache_manager.cpp(228),ERROR" ID="0xcb1c0722" />
- <MSG STRUCTURE="diag_log_msg0" NAME="fread info header failed! @image_cache_manager.cpp(236),ERROR" ID="0xcb1c0762" />
- <MSG STRUCTURE="diag_log_msg0" NAME="LoadAllImgInfo failed! @image_cache_manager.cpp(262),ERROR" ID="0xcb1c0832" />
- <MSG STRUCTURE="diag_log_msg0" NAME="LoadSingleImgInfo failed! node is nullptr or imgIndex is invalid. @image_cache_manager.cpp(270),ERROR" ID="0xcb1c0872" />
- <MSG STRUCTURE="diag_log_msg0" NAME="CreateImageNode failed! @image_cache_manager.cpp(292),ERROR" ID="0xcb1c0922" />
- <MSG STRUCTURE="diag_log_msg0" NAME="LoadSingleImgInfo failed! @image_cache_manager.cpp(320),ERROR" ID="0xcb1c0a02" />
- <MSG STRUCTURE="diag_log_msg1" NAME="LoadAllInMultiRes failed! Open file failed: %s @image_cache_manager.cpp(331),ERROR" ID="0xcb1c0a5a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="fread bin header failed! @image_cache_manager.cpp(343),ERROR" ID="0xcb1c0aba" />
- <MSG STRUCTURE="diag_log_msg0" NAME="LoadAllImgInfo failed! @image_cache_manager.cpp(362),ERROR" ID="0xcb1c0b52" />
- <MSG STRUCTURE="diag_log_msg1" NAME="LoadAllInMultiRes failed! file: %s @image_cache_manager.cpp(377),ERROR" ID="0xcb1c0bca" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Res file is already loaded. @image_cache_manager.cpp(385),WARNING" ID="0xcb1c0c0b" />
- <MSG STRUCTURE="diag_log_msg0" NAME="CreateImageNode failed! @image_cache_manager.cpp(403),ERROR" ID="0xcb1c0c9a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy info header failed! @image_cache_manager.cpp(407),ERROR" ID="0xcb1c0cba" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy img data failed! @image_cache_manager.cpp(412),ERROR" ID="0xcb1c0ce2" />
- <MSG STRUCTURE="diag_log_msg2" NAME="LoadOneInMultiRes failed! resId: 0x%x, file: %s @image_cache_manager.cpp(499),ERROR" ID="0xcb1c0f9a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="CreateImageNode failed! @image_cache_manager.cpp(513),ERROR" ID="0xcb1c100a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="Res file is not loaded: %s @image_cache_manager.cpp(570),ERROR" ID="0xcb1c11d2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Res file is not loaded. @image_cache_manager.cpp(598),ERROR" ID="0xcb1c12b2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="Res file is not loaded: %s @image_cache_manager.cpp(625),ERROR" ID="0xcb1c138a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Res file is not loaded. @image_cache_manager.cpp(640),ERROR" ID="0xcb1c1402" />
- <MSG STRUCTURE="diag_log_msg0" NAME="CreateImageNode failed! @image_cache_manager.cpp(687),ERROR" ID="0xcb1c157a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="CreateImageNode failed! @image_cache_manager.cpp(230),ERROR" ID="0xcb1c0732" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="fread info header failed! @image_cache_manager.cpp(244),ERROR" ID="0xcb1c07a2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="LoadAllImgInfo failed! @image_cache_manager.cpp(270),ERROR" ID="0xcb1c0872" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="LoadSingleImgInfo failed! node is nullptr or imgIndex is invalid. @image_cache_manager.cpp(278),ERROR" ID="0xcb1c08b2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="CreateImageNode failed! @image_cache_manager.cpp(300),ERROR" ID="0xcb1c0962" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="LoadSingleImgInfo failed! @image_cache_manager.cpp(328),ERROR" ID="0xcb1c0a42" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="LoadAllInMultiRes failed! Open file failed: %s @image_cache_manager.cpp(339),ERROR" ID="0xcb1c0a9a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="fread bin header failed! @image_cache_manager.cpp(351),ERROR" ID="0xcb1c0afa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="LoadAllImgInfo failed! @image_cache_manager.cpp(370),ERROR" ID="0xcb1c0b92" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="LoadAllInMultiRes failed! file: %s @image_cache_manager.cpp(385),ERROR" ID="0xcb1c0c0a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Res file is already loaded. @image_cache_manager.cpp(393),WARNING" ID="0xcb1c0c4b" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="CreateImageNode failed! @image_cache_manager.cpp(411),ERROR" ID="0xcb1c0cda" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy info header failed! @image_cache_manager.cpp(415),ERROR" ID="0xcb1c0cfa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy img data failed! @image_cache_manager.cpp(420),ERROR" ID="0xcb1c0d22" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="LoadOneInMultiRes failed! resId: 0x%x, file: %s @image_cache_manager.cpp(507),ERROR" ID="0xcb1c0fda" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="CreateImageNode failed! @image_cache_manager.cpp(521),ERROR" ID="0xcb1c104a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="Res file is not loaded: %s @image_cache_manager.cpp(578),ERROR" ID="0xcb1c1212" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Res file is not loaded. @image_cache_manager.cpp(606),ERROR" ID="0xcb1c12f2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="Res file is not loaded: %s @image_cache_manager.cpp(633),ERROR" ID="0xcb1c13ca" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Res file is not loaded. @image_cache_manager.cpp(648),ERROR" ID="0xcb1c1442" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="CreateImageNode failed! @image_cache_manager.cpp(695),ERROR" ID="0xcb1c15ba" />
</MSG_LOG>
\ No newline at end of file
<MSG STRUCTURE="diag_log_msg0" NAME="js number value is out of range. @js_fwk_common.cpp(208),DBG" ID="0xe0640686" />
<MSG STRUCTURE="diag_log_msg0" NAME="js number value is out of range. @js_fwk_common.cpp(212),DBG" ID="0xe06406a6" />
<MSG STRUCTURE="diag_log_msg0" NAME="cstr is nullptr. @js_fwk_common.cpp(226),ERROR" ID="0xe0640712" />
- <MSG STRUCTURE="diag_log_msg0" NAME="secLength is too long. @js_fwk_common.cpp(409),ERROR" ID="0xe0640cca" />
- <MSG STRUCTURE="diag_log_msg0" NAME="append path error @js_fwk_common.cpp(433),ERROR" ID="0xe0640d8a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="error happen when append path @js_fwk_common.cpp(443),ERROR" ID="0xe0640dda" />
- <MSG STRUCTURE="diag_log_msg0" NAME="input path or fileName is invalid @js_fwk_common.cpp(460),ERROR" ID="0xe0640e62" />
- <MSG STRUCTURE="diag_log_msg0" NAME="input path or fileName is too long @js_fwk_common.cpp(467),ERROR" ID="0xe0640e9a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="malloc buffer for path failed, needed length[%u] @js_fwk_common.cpp(475),ERROR" ID="0xe0640eda" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc dirPath memory heap failed. @js_fwk_common.cpp(519),ERROR" ID="0xe064103a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="file doesn't exit or it's empty, [%s] @js_fwk_common.cpp(596),ERROR" ID="0xe06412a2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="realpath handle failed, [%s] @js_fwk_common.cpp(613),ERROR" ID="0xe064132a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="file name too long. @js_fwk_common.cpp(631),ERROR" ID="0xe06413ba" />
- <MSG STRUCTURE="diag_log_msg0" NAME="splice trace data failed. @js_fwk_common.cpp(639),ERROR" ID="0xe06413fa" />
- <MSG STRUCTURE="diag_log_msg1" NAME="open file[%s] failed for reading. @js_fwk_common.cpp(655),ERROR" ID="0xe064147a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="open file[fd: %d] failed for reading @js_fwk_common.cpp(687),ERROR" ID="0xe064157a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="open file[path: %s] failed for reading @js_fwk_common.cpp(688),ERROR" ID="0xe0641582" />
- <MSG STRUCTURE="diag_log_msg1" NAME="malloc buffer for file content failed, file length[%d] @js_fwk_common.cpp(694),ERROR" ID="0xe06415b2" />
- <MSG STRUCTURE="diag_log_msg3" NAME="read fail, count(%d), length(%u), path(%s) @js_fwk_common.cpp(703),ERROR" ID="0xe06415fa" />
- <MSG STRUCTURE="diag_log_msg0" NAME="error index.js file path after locate @js_fwk_common.cpp(732),ERROR" ID="0xe06416e2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="empty index.js file path after locate @js_fwk_common.cpp(737),ERROR" ID="0xe064170a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="malloc buffer for file path calculating from url, file length[%d] @js_fwk_common.cpp(807),ERROR" ID="0xe064193a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="append path error when calculating from url @js_fwk_common.cpp(811),ERROR" ID="0xe064195a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="watcher is undefined when inserting a watcher. @js_fwk_common.cpp(847),ERROR" ID="0xe0641a7a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc memory watcher failed. @js_fwk_common.cpp(854),ERROR" ID="0xe0641ab2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="No component binds element. @js_fwk_common.cpp(945),ERROR" ID="0xe0641d8a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="malloc buffer for path failed, needed length[%u] @js_fwk_common.cpp(1177),ERROR" ID="0xe06424ca" />
- <MSG STRUCTURE="diag_log_msg1" NAME="use strcpy_s secure function errro(%d) @js_fwk_common.cpp(1184),ERROR" ID="0xe0642502" />
- <MSG STRUCTURE="diag_log_msg0" NAME="get imagePath failed! @js_fwk_common.cpp(1221),ERROR" ID="0xe064262a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="malloc buffer for path failed, needed length[%u] @js_fwk_common.cpp(1250),ERROR" ID="0xe0642712" />
- <MSG STRUCTURE="diag_log_msg0" NAME="strcat_s failed! @js_fwk_common.cpp(1257),ERROR" ID="0xe064274a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="the image suffix error, please check! @js_fwk_common.cpp(1263),ERROR" ID="0xe064277a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Failed to parse image src cause by empty source. @js_fwk_common.cpp(1277),ERROR" ID="0xe06427ea" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Failed to parse image src cause by empty source. @js_fwk_common.cpp(1281),ERROR" ID="0xe064280a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Relative path is not allowed in image src. @js_fwk_common.cpp(1288),ERROR" ID="0xe0642842" />
- <MSG STRUCTURE="diag_log_msg0" NAME="the fontFamily is too long @js_fwk_common.cpp(1340),ERROR" ID="0xe06429e2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc string failed @js_fwk_common.cpp(1346),ERROR" ID="0xe0642a12" />
- <MSG STRUCTURE="diag_log_msg0" NAME="copy fontFamily failed @js_fwk_common.cpp(1350),ERROR" ID="0xe0642a32" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="secLength is too long. @js_fwk_common.cpp(419),ERROR" ID="0xe0640d1a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="append path error @js_fwk_common.cpp(443),ERROR" ID="0xe0640dda" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="error happen when append path @js_fwk_common.cpp(453),ERROR" ID="0xe0640e2a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="input path or fileName is invalid @js_fwk_common.cpp(470),ERROR" ID="0xe0640eb2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="input path or fileName is too long @js_fwk_common.cpp(477),ERROR" ID="0xe0640eea" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="malloc buffer for path failed, needed length[%u] @js_fwk_common.cpp(485),ERROR" ID="0xe0640f2a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc dirPath memory heap failed. @js_fwk_common.cpp(529),ERROR" ID="0xe064108a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="file doesn't exit or it's empty, [%s] @js_fwk_common.cpp(606),ERROR" ID="0xe06412f2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="realpath handle failed, [%s] @js_fwk_common.cpp(623),ERROR" ID="0xe064137a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="file name too long. @js_fwk_common.cpp(641),ERROR" ID="0xe064140a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="splice trace data failed. @js_fwk_common.cpp(649),ERROR" ID="0xe064144a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="open file[%s] failed for reading. @js_fwk_common.cpp(665),ERROR" ID="0xe06414ca" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="open file[fd: %d] failed for reading @js_fwk_common.cpp(697),ERROR" ID="0xe06415ca" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="open file[path: %s] failed for reading @js_fwk_common.cpp(698),ERROR" ID="0xe06415d2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="malloc buffer for file content failed, file length[%d] @js_fwk_common.cpp(704),ERROR" ID="0xe0641602" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="read fail, count(%d), length(%u), path(%s) @js_fwk_common.cpp(713),ERROR" ID="0xe064164a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="error index.js file path after locate @js_fwk_common.cpp(742),ERROR" ID="0xe0641732" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="empty index.js file path after locate @js_fwk_common.cpp(747),ERROR" ID="0xe064175a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="malloc buffer for file path calculating from url, file length[%d] @js_fwk_common.cpp(817),ERROR" ID="0xe064198a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="append path error when calculating from url @js_fwk_common.cpp(821),ERROR" ID="0xe06419aa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="watcher is undefined when inserting a watcher. @js_fwk_common.cpp(857),ERROR" ID="0xe0641aca" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc memory watcher failed. @js_fwk_common.cpp(864),ERROR" ID="0xe0641b02" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="No component binds element. @js_fwk_common.cpp(955),ERROR" ID="0xe0641dda" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="malloc buffer for path failed, needed length[%u] @js_fwk_common.cpp(1187),ERROR" ID="0xe064251a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="use strcpy_s secure function errro(%d) @js_fwk_common.cpp(1194),ERROR" ID="0xe0642552" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="get imagePath failed! @js_fwk_common.cpp(1231),ERROR" ID="0xe064267a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="malloc buffer for path failed, needed length[%u] @js_fwk_common.cpp(1260),ERROR" ID="0xe0642762" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="strcat_s failed! @js_fwk_common.cpp(1267),ERROR" ID="0xe064279a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="the image suffix error, please check! @js_fwk_common.cpp(1273),ERROR" ID="0xe06427ca" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Failed to parse image src cause by empty source. @js_fwk_common.cpp(1287),ERROR" ID="0xe064283a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Failed to parse image src cause by empty source. @js_fwk_common.cpp(1291),ERROR" ID="0xe064285a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Relative path is not allowed in image src. @js_fwk_common.cpp(1298),ERROR" ID="0xe0642892" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="the fontFamily is too long @js_fwk_common.cpp(1347),ERROR" ID="0xe0642a1a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc string failed @js_fwk_common.cpp(1353),ERROR" ID="0xe0642a4a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="copy fontFamily failed @js_fwk_common.cpp(1357),ERROR" ID="0xe0642a6a" />
</MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="undefined state -> init state @js_page_state.cpp(29),INFO" ID="0xe10400ed" />
- <MSG STRUCTURE="diag_log_msg1" NAME="current state(%d) is invalid when changing undefined state to init state. @js_page_state.cpp(41),ERROR" ID="0xe104014a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="init state -> ready state @js_page_state.cpp(49),INFO" ID="0xe104018d" />
- <MSG STRUCTURE="diag_log_msg1" NAME="current state(%d) is invalid when changing init state to ready state. @js_page_state.cpp(60),ERROR" ID="0xe10401e2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="current state(%d) -> show state @js_page_state.cpp(68),INFO" ID="0xe1040225" />
- <MSG STRUCTURE="diag_log_msg1" NAME="current state(%d) is invalid when changing ready state to show state. @js_page_state.cpp(77),ERROR" ID="0xe104026a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="current state(%d) -> background state @js_page_state.cpp(85),INFO" ID="0xe10402ad" />
- <MSG STRUCTURE="diag_log_msg1" NAME="current state(%d) is invalid when changing show state to background state. @js_page_state.cpp(93),ERROR" ID="0xe10402ea" />
- <MSG STRUCTURE="diag_log_msg1" NAME="current state(%d) -> destroy state @js_page_state.cpp(102),INFO" ID="0xe1040335" />
- <MSG STRUCTURE="diag_log_msg1" NAME="current state(%d) is invalid when changing show state to destroy state. @js_page_state.cpp(111),ERROR" ID="0xe104037a" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="undefined state -> init state @js_page_state.cpp(29),INFO" ID="0xe10a00ed" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="current state(%d) is invalid when changing undefined state to init state. @js_page_state.cpp(41),ERROR" ID="0xe10a014a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="init state -> ready state @js_page_state.cpp(49),INFO" ID="0xe10a018d" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="current state(%d) is invalid when changing init state to ready state. @js_page_state.cpp(60),ERROR" ID="0xe10a01e2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="current state(%d) -> show state @js_page_state.cpp(68),INFO" ID="0xe10a0225" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="current state(%d) is invalid when changing ready state to show state. @js_page_state.cpp(77),ERROR" ID="0xe10a026a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="current state(%d) -> background state @js_page_state.cpp(85),INFO" ID="0xe10a02ad" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="current state(%d) is invalid when changing show state to background state. @js_page_state.cpp(93),ERROR" ID="0xe10a02ea" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="current state(%d) -> destroy state @js_page_state.cpp(102),INFO" ID="0xe10a0335" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="current state(%d) is invalid when changing show state to destroy state. @js_page_state.cpp(111),ERROR" ID="0xe10a037a" />
</MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg1" NAME="error input state:%d @js_page_state_machine.cpp(83),ERROR" ID="0xe106029a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc path memory heap failed. @js_page_state_machine.cpp(116),ERROR" ID="0xe10603a2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="delete $page property failed from global object. @js_page_state_machine.cpp(148),ERROR" ID="0xe10604a2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="statemachine init failed as this app's root path is invalid. @js_page_state_machine.cpp(160),ERROR" ID="0xe1060502" />
- <MSG STRUCTURE="diag_log_msg0" NAME="statemachine init failed as object is invalid. @js_page_state_machine.cpp(177),ERROR" ID="0xe106058a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="statemachine init failed as uri is invalid. @js_page_state_machine.cpp(186),ERROR" ID="0xe10605d2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="statemachine init failed as uri is invalid. @js_page_state_machine.cpp(194),ERROR" ID="0xe1060612" />
- <MSG STRUCTURE="diag_log_msg0" NAME="statemachine init failed as uri is empty. @js_page_state_machine.cpp(201),ERROR" ID="0xe106064a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="statemachine init failed as generating js file's path failed. @js_page_state_machine.cpp(211),ERROR" ID="0xe106069a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="statemachine init failed as js file isn't existed. @js_page_state_machine.cpp(220),ERROR" ID="0xe10606e2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="error input state:%d @js_page_state_machine.cpp(278),ERROR" ID="0xe10608b2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="relocat page JS file failed @js_page_state_machine.cpp(295),ERROR" ID="0xe106093a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Eval JS file failed @js_page_state_machine.cpp(301),ERROR" ID="0xe106096a" />
- <MSG STRUCTURE="diag_log_msg2" NAME="JS Heap allocBytes[%d], peakAllocBytes[%d] @js_page_state_machine.cpp(333),DBG" ID="0xe1060a6e" />
- <MSG STRUCTURE="diag_log_msg0" NAME="StateMachine::ShowPage @js_page_state_machine.cpp(365),INFO" ID="0xe1060b6d" />
- <MSG STRUCTURE="diag_log_msg0" NAME="showpage: the whole application already in background, do not operate rootview @js_page_state_machine.cpp(367),WARNING" ID="0xe1060b7b" />
- <MSG STRUCTURE="diag_log_msg0" NAME="hidepage: the whole application already in background, do not operate rootview @js_page_state_machine.cpp(382),WARNING" ID="0xe1060bf3" />
- <MSG STRUCTURE="diag_log_msg0" NAME="input parameter is invalid when invoking page life cycle callback. @js_page_state_machine.cpp(399),ERROR" ID="0xe1060c7a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="delete $page property failed from global object. @js_page_state_machine.cpp(424),ERROR" ID="0xe1060d42" />
- <MSG STRUCTURE="diag_log_msg0" NAME="delete $root property failed from global object. @js_page_state_machine.cpp(433),ERROR" ID="0xe1060d8a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%d] components leaked! @js_page_state_machine.cpp(475),ERROR" ID="0xe1060eda" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg1" NAME="error input state:%d @js_page_state_machine.cpp(83),ERROR" ID="0xe10c029a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc path memory heap failed. @js_page_state_machine.cpp(116),ERROR" ID="0xe10c03a2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="delete $page property failed from global object. @js_page_state_machine.cpp(148),ERROR" ID="0xe10c04a2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="statemachine init failed as this app's root path is invalid. @js_page_state_machine.cpp(160),ERROR" ID="0xe10c0502" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="statemachine init failed as object is invalid. @js_page_state_machine.cpp(177),ERROR" ID="0xe10c058a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="statemachine init failed as uri is invalid. @js_page_state_machine.cpp(186),ERROR" ID="0xe10c05d2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="statemachine init failed as uri is invalid. @js_page_state_machine.cpp(194),ERROR" ID="0xe10c0612" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="statemachine init failed as uri is empty. @js_page_state_machine.cpp(201),ERROR" ID="0xe10c064a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="statemachine init failed as generating js file's path failed. @js_page_state_machine.cpp(211),ERROR" ID="0xe10c069a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="statemachine init failed as js file isn't existed. @js_page_state_machine.cpp(220),ERROR" ID="0xe10c06e2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="error input state:%d @js_page_state_machine.cpp(278),ERROR" ID="0xe10c08b2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="relocat page JS file failed @js_page_state_machine.cpp(295),ERROR" ID="0xe10c093a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Eval JS file failed @js_page_state_machine.cpp(301),ERROR" ID="0xe10c096a" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="JS Heap allocBytes[%d], peakAllocBytes[%d] @js_page_state_machine.cpp(333),DBG" ID="0xe10c0a6e" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="StateMachine::ShowPage @js_page_state_machine.cpp(365),INFO" ID="0xe10c0b6d" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="showpage: the whole application already in background, do not operate rootview @js_page_state_machine.cpp(367),WARNING" ID="0xe10c0b7b" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="hidepage: the whole application already in background, do not operate rootview @js_page_state_machine.cpp(382),WARNING" ID="0xe10c0bf3" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="input parameter is invalid when invoking page life cycle callback. @js_page_state_machine.cpp(399),ERROR" ID="0xe10c0c7a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="delete $page property failed from global object. @js_page_state_machine.cpp(424),ERROR" ID="0xe10c0d42" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="delete $root property failed from global object. @js_page_state_machine.cpp(433),ERROR" ID="0xe10c0d8a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%d] components leaked! @js_page_state_machine.cpp(475),ERROR" ID="0xe10c0eda" />
</MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="replace async failed with null input parameter @js_router.cpp(31),ERROR" ID="0xe10800fa" />
- <MSG STRUCTURE="diag_log_msg0" NAME="router is replacing, can not handle the new request @js_router.cpp(43),ERROR" ID="0xe108015a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc state machine memory heap failed. @js_router.cpp(48),ERROR" ID="0xe1080182" />
- <MSG STRUCTURE="diag_log_msg0" NAME="dispatch replacing request failed @js_router.cpp(64),ERROR" ID="0xe1080202" />
- <MSG STRUCTURE="diag_log_msg0" NAME="replace sync failed, new sm should be prepared @js_router.cpp(78),ERROR" ID="0xe1080272" />
- <MSG STRUCTURE="diag_log_msg0" NAME="the whole application is in background, move to HIDE state directly @js_router.cpp(94),DBG" ID="0xe10802f6" />
- <MSG STRUCTURE="diag_log_msg0" NAME="no SM when performing show @js_router.cpp(110),ERROR" ID="0xe1080372" />
- <MSG STRUCTURE="diag_log_msg0" NAME="no SM when performing background @js_router.cpp(122),ERROR" ID="0xe10803d2" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="replace async failed with null input parameter @js_router.cpp(31),ERROR" ID="0xe10e00fa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="router is replacing, can not handle the new request @js_router.cpp(43),ERROR" ID="0xe10e015a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc state machine memory heap failed. @js_router.cpp(48),ERROR" ID="0xe10e0182" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="dispatch replacing request failed @js_router.cpp(64),ERROR" ID="0xe10e0202" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="replace sync failed, new sm should be prepared @js_router.cpp(78),ERROR" ID="0xe10e0272" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="the whole application is in background, move to HIDE state directly @js_router.cpp(94),DBG" ID="0xe10e02f6" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="no SM when performing show @js_router.cpp(110),ERROR" ID="0xe10e0372" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="no SM when performing background @js_router.cpp(122),ERROR" ID="0xe10e03d2" />
</MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg1" NAME="unsupported BlendMode: %u. @lite_m_gfx_engine.cpp(77),ERROR" ID="0xcb0e026a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="unsupported color format: %d @lite_m_gfx_engine.cpp(121),ERROR" ID="0xcb0e03ca" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Convert2VGUCap failed! Invalid Capstyle! @lite_m_gfx_engine.cpp(134),ERROR" ID="0xcb0e0432" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Convert2VGUBuffer failed. @lite_m_gfx_engine.cpp(163),ERROR" ID="0xcb0e051a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Fill operation failed. @lite_m_gfx_engine.cpp(190),ERROR" ID="0xcb0e05f2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="font weight %u was not support @lite_m_gfx_engine.cpp(306),ERROR" ID="0xcb0e0992" />
- <MSG STRUCTURE="diag_log_msg0" NAME="VGUPathAppendData failed. @lite_m_gfx_engine.cpp(343),ERROR" ID="0xcb0e0aba" />
- <MSG STRUCTURE="diag_log_msg0" NAME="VGUPathSetData failed. @lite_m_gfx_engine.cpp(353),ERROR" ID="0xcb0e0b0a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Convert2VGUBuffer failed. @lite_m_gfx_engine.cpp(380),ERROR" ID="0xcb0e0be2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="RenderPath failed. @lite_m_gfx_engine.cpp(388),ERROR" ID="0xcb0e0c22" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Convert2VGUBuffer failed. @lite_m_gfx_engine.cpp(409),ERROR" ID="0xcb0e0cca" />
- <MSG STRUCTURE="diag_log_msg0" NAME="RenderPath failed. @lite_m_gfx_engine.cpp(417),ERROR" ID="0xcb0e0d0a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Convert2VGUBuffer failed. @lite_m_gfx_engine.cpp(433),ERROR" ID="0xcb0e0d8a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="RenderPath failed. @lite_m_gfx_engine.cpp(456),ERROR" ID="0xcb0e0e42" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Convert2VGUBuffer failed. @lite_m_gfx_engine.cpp(471),ERROR" ID="0xcb0e0eba" />
- <MSG STRUCTURE="diag_log_msg0" NAME="RenderPath failed. @lite_m_gfx_engine.cpp(480),ERROR" ID="0xcb0e0f02" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Convert2VGUBuffer failed. @lite_m_gfx_engine.cpp(584),ERROR" ID="0xcb0e1242" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Convert2VGUBuffer failed. @lite_m_gfx_engine.cpp(611),ERROR" ID="0xcb0e131a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="RenderBlur failed! @lite_m_gfx_engine.cpp(624),ERROR" ID="0xcb0e1382" />
- <MSG STRUCTURE="diag_log_msg0" NAME="RenderBlit failed! @lite_m_gfx_engine.cpp(680),ERROR" ID="0xcb0e1542" />
- <MSG STRUCTURE="diag_log_msg0" NAME="DrawTransform failed. Software can only process uncompressed data. @lite_m_gfx_engine.cpp(713),ERROR" ID="0xcb0e164a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="vguFuncs_ is null! @lite_m_gfx_engine.cpp(764),ERROR" ID="0xcb0e17e2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="InitVgu or RenderClearRect is null! @lite_m_gfx_engine.cpp(768),ERROR" ID="0xcb0e1802" />
- <MSG STRUCTURE="diag_log_msg0" NAME="VGUPathInit, VGUPathAppendData, VGUPathClear or RenderPath is nullptr! @lite_m_gfx_engine.cpp(775),ERROR" ID="0xcb0e183a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="VGUPathInit, VGUPathAppendData, VGUPathClear or RenderPath is nullptr! @lite_m_gfx_engine.cpp(781),ERROR" ID="0xcb0e186a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="InitVgu failed! @lite_m_gfx_engine.cpp(786),ERROR" ID="0xcb0e1892" />
- <MSG STRUCTURE="diag_log_msg0" NAME="vguFuncs_ is null! @lite_m_gfx_engine.cpp(797),INFO" ID="0xcb0e18ed" />
- <MSG STRUCTURE="diag_log_msg0" NAME="DeinitVgu failed! @lite_m_gfx_engine.cpp(802),ERROR" ID="0xcb0e1912" />
- <MSG STRUCTURE="diag_log_msg0" NAME="AllocBuffer failed. @lite_m_gfx_engine.cpp(820),ERROR" ID="0xcb0e19a2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="unsupported PixelFormat: %d @lite_m_gfx_engine.cpp(847),ERROR" ID="0xcb0e1a7a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="bufferInfo_ is not inited. @lite_m_gfx_engine.cpp(963),ERROR" ID="0xcb0e1e1a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="set value: %d @lite_m_gfx_engine.cpp(1007),DBG" ID="0xcb0e1f7e" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg1" NAME="unsupported BlendMode: %u. @lite_m_gfx_engine.cpp(84),ERROR" ID="0xcb0e02a2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="unsupported color format: %d @lite_m_gfx_engine.cpp(128),ERROR" ID="0xcb0e0402" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Convert2VGUCap failed! Invalid Capstyle! @lite_m_gfx_engine.cpp(141),ERROR" ID="0xcb0e046a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Convert2VGUBuffer failed. @lite_m_gfx_engine.cpp(172),ERROR" ID="0xcb0e0562" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Fill operation failed. @lite_m_gfx_engine.cpp(203),ERROR" ID="0xcb0e065a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="font weight %u was not support @lite_m_gfx_engine.cpp(325),ERROR" ID="0xcb0e0a2a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="VGUPathAppendData failed. @lite_m_gfx_engine.cpp(366),ERROR" ID="0xcb0e0b72" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="VGUPathSetData failed. @lite_m_gfx_engine.cpp(377),ERROR" ID="0xcb0e0bca" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Convert2VGUBuffer failed. @lite_m_gfx_engine.cpp(404),ERROR" ID="0xcb0e0ca2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="RenderPath failed. @lite_m_gfx_engine.cpp(415),ERROR" ID="0xcb0e0cfa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Convert2VGUBuffer failed. @lite_m_gfx_engine.cpp(436),ERROR" ID="0xcb0e0da2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="RenderPath failed. @lite_m_gfx_engine.cpp(447),ERROR" ID="0xcb0e0dfa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Convert2VGUBuffer failed. @lite_m_gfx_engine.cpp(463),ERROR" ID="0xcb0e0e7a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="RenderPath failed. @lite_m_gfx_engine.cpp(489),ERROR" ID="0xcb0e0f4a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Convert2VGUBuffer failed. @lite_m_gfx_engine.cpp(504),ERROR" ID="0xcb0e0fc2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="RenderPath failed. @lite_m_gfx_engine.cpp(516),ERROR" ID="0xcb0e1022" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Convert2VGUBuffer failed. @lite_m_gfx_engine.cpp(626),ERROR" ID="0xcb0e1392" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Convert2VGUBuffer failed. @lite_m_gfx_engine.cpp(653),ERROR" ID="0xcb0e146a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="RenderBlur failed! @lite_m_gfx_engine.cpp(669),ERROR" ID="0xcb0e14ea" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="RenderBlit failed! @lite_m_gfx_engine.cpp(728),ERROR" ID="0xcb0e16c2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="DrawTransform failed. Software can only process uncompressed data. @lite_m_gfx_engine.cpp(763),ERROR" ID="0xcb0e17da" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="vguFuncs_ is null! @lite_m_gfx_engine.cpp(818),ERROR" ID="0xcb0e1992" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="InitVgu or RenderClearRect is null! @lite_m_gfx_engine.cpp(822),ERROR" ID="0xcb0e19b2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="VGUPathInit, VGUPathAppendData, VGUPathClear or RenderPath is nullptr! @lite_m_gfx_engine.cpp(829),ERROR" ID="0xcb0e19ea" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="VGUPathInit, VGUPathAppendData, VGUPathClear or RenderPath is nullptr! @lite_m_gfx_engine.cpp(835),ERROR" ID="0xcb0e1a1a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="InitVgu failed! @lite_m_gfx_engine.cpp(840),ERROR" ID="0xcb0e1a42" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="vguFuncs_ is null! @lite_m_gfx_engine.cpp(851),INFO" ID="0xcb0e1a9d" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="DeinitVgu failed! @lite_m_gfx_engine.cpp(856),ERROR" ID="0xcb0e1ac2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="AllocBuffer failed. @lite_m_gfx_engine.cpp(875),ERROR" ID="0xcb0e1b5a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="unsupported PixelFormat: %d @lite_m_gfx_engine.cpp(902),ERROR" ID="0xcb0e1c32" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="bufferInfo_ is not inited. @lite_m_gfx_engine.cpp(1021),ERROR" ID="0xcb0e1fea" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="set value: %d @lite_m_gfx_engine.cpp(1066),DBG" ID="0xcb0e2156" />
</MSG_LOG>
\ No newline at end of file
<MSG STRUCTURE="diag_log_msg0" NAME="[btsrv][ERROR] ble gap conn addr memcpy fail. @local_device_manager.c(446),ERROR" ID="0xd8080df2" />
<MSG STRUCTURE="diag_log_msg0" NAME="adv id is not active, please set param first. @local_device_manager.c(467),ERROR" ID="0xd8080e9a" />
<MSG STRUCTURE="diag_log_msg0" NAME="ble enable err,B core may be not calibration end and not notify A Core @local_device_manager.c(491),ERROR" ID="0xd8080f5a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="bt init err ret = %08x @local_device_manager.c(522),ERROR" ID="0xd8081052" />
- <MSG STRUCTURE="diag_log_msg1" NAME="unhandled msg id %x @local_device_manager.c(620),WARNING" ID="0xd8081363" />
- <MSG STRUCTURE="diag_log_msg0" NAME="inquiry complete @local_device_manager.c(628),INFO" ID="0xd80813a5" />
- <MSG STRUCTURE="diag_log_msg1" NAME="dev_hdl:0x%08x @local_device_manager.c(635),INFO" ID="0xd80813dd" />
- <MSG STRUCTURE="diag_log_msg1" NAME="dev_hdl:0x%08x @local_device_manager.c(649),INFO" ID="0xd808144d" />
- <MSG STRUCTURE="diag_log_msg0" NAME="btsrv_connection_request_ind_callback: memecpy error @local_device_manager.c(663),ERROR" ID="0xd80814ba" />
- <MSG STRUCTURE="diag_log_msg4" NAME="addr:****%02x%02x%02x%02x @local_device_manager.c(668),INFO" ID="0xd80814e5" />
- <MSG STRUCTURE="diag_log_msg1" NAME="dev_hdl:0x%08x @local_device_manager.c(678),INFO" ID="0xd8081535" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s errr @local_device_manager.c(693),ERROR" ID="0xd80815aa" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc errr @local_device_manager.c(707),ERROR" ID="0xd808161a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s errr @local_device_manager.c(713),ERROR" ID="0xd808164a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc errr @local_device_manager.c(742),ERROR" ID="0xd8081732" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s errr @local_device_manager.c(748),ERROR" ID="0xd8081762" />
- <MSG STRUCTURE="diag_log_msg8" NAME="conn_hdl: %08x event: %04x role: %x result: %x dev_hdl: %x svc_hdl: %x svc_class: %x duration: %d @local_device_manager.c(762),INFO" ID="0xd80817d5" />
- <MSG STRUCTURE="diag_log_msg2" NAME="received_bytes: %d sent_bytes: %d @local_device_manager.c(765),INFO" ID="0xd80817ed" />
- <MSG STRUCTURE="diag_log_msg1" NAME="unhandled service class 0x%x @local_device_manager.c(791),WARNING" ID="0xd80818bb" />
- <MSG STRUCTURE="diag_log_msg2" NAME="dev_hdl: %08x num_value: %06d @local_device_manager.c(814),INFO" ID="0xd8081975" />
- <MSG STRUCTURE="diag_log_msg1" NAME="dev_hdl: 0x%08x @local_device_manager.c(821),INFO" ID="0xd80819ad" />
- <MSG STRUCTURE="diag_log_msg1" NAME="dev_hdl: 0x%08x @local_device_manager.c(828),INFO" ID="0xd80819e5" />
- <MSG STRUCTURE="diag_log_msg2" NAME="dev_hdl: %08x num_value: %06d @local_device_manager.c(834),INFO" ID="0xd8081a15" />
- <MSG STRUCTURE="diag_log_msg2" NAME="dev_hdl: %08x reason: %x @local_device_manager.c(848),INFO" ID="0xd8081a85" />
- <MSG STRUCTURE="diag_log_msg1" NAME="white_list_size:%d @local_device_manager.c(854),INFO" ID="0xd8081ab5" />
- <MSG STRUCTURE="diag_log_msg1" NAME="transmit_power_level:%d @local_device_manager.c(859),INFO" ID="0xd8081add" />
- <MSG STRUCTURE="diag_log_msg2" NAME="register err id: %x ret: %x @local_device_manager.c(890),ERROR" ID="0xd8081bd2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="bt enable err,B core may be not calibration end and not notify A Core @local_device_manager.c(925),ERROR" ID="0xd8081cea" />
- <MSG STRUCTURE="diag_log_msg1" NAME="bt_init err ret = %08x @local_device_manager.c(954),ERROR" ID="0xd8081dd2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="buff is't long enough, need length:%d. @local_device_manager.c(1062),ERROR" ID="0xd8082132" />
- <MSG STRUCTURE="diag_log_msg0" NAME="get local name memcpy fail. @local_device_manager.c(1066),ERROR" ID="0xd8082152" />
- <MSG STRUCTURE="diag_log_msg2" NAME="name: %s, length: %d @local_device_manager.c(1075),INFO" ID="0xd808219d" />
- <MSG STRUCTURE="diag_log_msg0" NAME="failed: bt not enabled @local_device_manager.c(1090),INFO" ID="0xd8082215" />
- <MSG STRUCTURE="diag_log_msg1" NAME="local name null or length not match, len: %d @local_device_manager.c(1094),INFO" ID="0xd8082235" />
- <MSG STRUCTURE="diag_log_msg1" NAME="returns error ret: %x @local_device_manager.c(1100),WARNING" ID="0xd8082263" />
- <MSG STRUCTURE="diag_log_msg3" NAME="set result name: "%s" name_len: %d get_re: %x @local_device_manager.c(1106),INFO" ID="0xd8082295" />
- <MSG STRUCTURE="diag_log_msg0" NAME="gap_remove_all_pairs fail @local_device_manager.c(1166),ERROR" ID="0xd8082472" />
- <MSG STRUCTURE="diag_log_msg0" NAME="gap ble remove all pairs fail @local_device_manager.c(1172),ERROR" ID="0xd80824a2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="diable_bt_ret(errcode_t): %x @local_device_manager.c(1179),INFO" ID="0xd80824dd" />
- <MSG STRUCTURE="diag_log_msg1" NAME="disable_ble_ret(errcode_t): %x @local_device_manager.c(1184),INFO" ID="0xd8082505" />
- <MSG STRUCTURE="diag_log_msg0" NAME="set discovery data pointer is null. @local_device_manager.c(1215),ERROR" ID="0xd80825fa" />
- <MSG STRUCTURE="diag_log_msg1" NAME="adv_id(%d) advertising, please stop first. @local_device_manager.c(1233),ERROR" ID="0xd808268a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="adv data alloc faild, length:%d @local_device_manager.c(1246),ERROR" ID="0xd80826f2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[Error] gap_ble_set_adv_data adv data memcpy_s fail @local_device_manager.c(1250),ERROR" ID="0xd8082712" />
- <MSG STRUCTURE="diag_log_msg1" NAME="scan rsp data alloc faild, length:%d @local_device_manager.c(1259),ERROR" ID="0xd808275a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[Error] gap_ble_set_adv_data scan rsp data memcpy_s fail @local_device_manager.c(1263),ERROR" ID="0xd808277a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="adv_id(%d) advertising, please stop first. @local_device_manager.c(1302),ERROR" ID="0xd80828b2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[Error] gap ble set adv param memcpy_s fail @local_device_manager.c(1314),ERROR" ID="0xd8082912" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[Error] gap ble set adv param memcpy_s fail @local_device_manager.c(1328),ERROR" ID="0xd8082982" />
- <MSG STRUCTURE="diag_log_msg0" NAME="ble gap set sec param error param NULL @local_device_manager.c(1350),ERROR" ID="0xd8082a32" />
- <MSG STRUCTURE="diag_log_msg0" NAME="ble gap set sec param error param NULL @local_device_manager.c(1355),ERROR" ID="0xd8082a5a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="bt has page scanning enabled. @local_device_manager.c(1379),ERROR" ID="0xd8082b1a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="bt has an ACL connection. @local_device_manager.c(1385),ERROR" ID="0xd8082b4a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[CTKD] please set ble secure connection enable,current_sc=%d. @local_device_manager.c(1402),ERROR" ID="0xd8082bd2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[Error] gap set adv data memcpy_s fail @local_device_manager.c(1425),ERROR" ID="0xd8082c8a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[Error] gap set scan rsp data memcpy_s fail @local_device_manager.c(1432),ERROR" ID="0xd8082cc2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[Error] btsrv_gap_set_adv_param memcpy_s fail @local_device_manager.c(1451),ERROR" ID="0xd8082d5a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[Error] gap set adv param memcpy_s fail @local_device_manager.c(1456),ERROR" ID="0xd8082d82" />
- <MSG STRUCTURE="diag_log_msg0" NAME="ble gap ext adv rpt memcpy fail @local_device_manager.c(1476),ERROR" ID="0xd8082e22" />
- <MSG STRUCTURE="diag_log_msg0" NAME="ble gap ext adv rpt memcpy fail @local_device_manager.c(1491),ERROR" ID="0xd8082e9a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="ble gap adv set terminated cbk param error @local_device_manager.c(1503),ERROR" ID="0xd8082efa" />
- <MSG STRUCTURE="diag_log_msg0" NAME="ble enable cbk param error @local_device_manager.c(1514),ERROR" ID="0xd8082f52" />
- <MSG STRUCTURE="diag_log_msg0" NAME="ble read remote rssi cbk param error @local_device_manager.c(1525),ERROR" ID="0xd8082faa" />
- <MSG STRUCTURE="diag_log_msg0" NAME="ble conn param update cbk param error @local_device_manager.c(1541),ERROR" ID="0xd808302a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="ble gap conn param malloc fail @local_device_manager.c(1555),ERROR" ID="0xd808309a" />
- <MSG STRUCTURE="diag_log_msg3" NAME="ble conn param update cbk interval:%x, latency:%x, timeout:%x @local_device_manager.c(1562),INFO" ID="0xd80830d5" />
- <MSG STRUCTURE="diag_log_msg0" NAME="adv id is not active, please set param first. @local_device_manager.c(1596),ERROR" ID="0xd80831e2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="adv id(%d) is discoverying, please stop first. @local_device_manager.c(1600),ERROR" ID="0xd8083202" />
- <MSG STRUCTURE="diag_log_msg0" NAME="adv param alloc fail @local_device_manager.c(1609),ERROR" ID="0xd808324a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="adv id is not active, please set param first. @local_device_manager.c(1642),ERROR" ID="0xd8083352" />
- <MSG STRUCTURE="diag_log_msg2" NAME="no advertising in progress or advertising for adv_id(%d). No advertising for adv_id(%d). @local_device_manager.c(1648),ERROR" ID="0xd8083382" />
- <MSG STRUCTURE="diag_log_msg0" NAME="mc sdk ble stop adv atb failed @local_device_manager.c(1654),ERROR" ID="0xd80833b2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="scanning in process, please stop first. @local_device_manager.c(1688),ERROR" ID="0xd80834c2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="scanning already stopped. @local_device_manager.c(1720),ERROR" ID="0xd80835c2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="ble stop extern scan ret: %#x @local_device_manager.c(1724),INFO" ID="0xd80835e5" />
- <MSG STRUCTURE="diag_log_msg0" NAME="ble set phy node == NULL @local_device_manager.c(1749),ERROR" ID="0xd80836aa" />
- <MSG STRUCTURE="diag_log_msg0" NAME="ble set phy memcpy fail @local_device_manager.c(1755),ERROR" ID="0xd80836da" />
- <MSG STRUCTURE="diag_log_msg5" NAME="ble general set phy hdl:%x all:%x rx:%x tx:%x op:%x. @local_device_manager.c(1761),INFO" ID="0xd808370d" />
- <MSG STRUCTURE="diag_log_msg1" NAME="ble set phy ret: %#x @local_device_manager.c(1764),ERROR" ID="0xd8083722" />
- <MSG STRUCTURE="diag_log_msg0" NAME="ble set data length node == NULL @local_device_manager.c(1786),ERROR" ID="0xd80837d2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="ble set data length memcpy fail @local_device_manager.c(1792),ERROR" ID="0xd8083802" />
- <MSG STRUCTURE="diag_log_msg3" NAME="ble general set len hdl:%x maxoct:%x maxtime:%x @local_device_manager.c(1798),INFO" ID="0xd8083835" />
- <MSG STRUCTURE="diag_log_msg1" NAME="ble set len ret: %#x @local_device_manager.c(1801),ERROR" ID="0xd808384a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="bts sert log type levle:%x @local_device_manager.c(1819),INFO" ID="0xd80838dd" />
- <MSG STRUCTURE="diag_log_msg1" NAME="g_bts_feature_bitmap bt_auto_reconnect_closed:%d. @local_device_manager.c(1840),ERROR" ID="0xd8083982" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="bt init err ret = %08x @local_device_manager.c(523),ERROR" ID="0xd808105a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="unhandled msg id %x @local_device_manager.c(621),WARNING" ID="0xd808136b" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="inquiry complete @local_device_manager.c(629),INFO" ID="0xd80813ad" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="dev_hdl:0x%08x @local_device_manager.c(636),INFO" ID="0xd80813e5" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="dev_hdl:0x%08x @local_device_manager.c(650),INFO" ID="0xd8081455" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="btsrv_connection_request_ind_callback: memecpy error @local_device_manager.c(664),ERROR" ID="0xd80814c2" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="addr:****%02x%02x%02x%02x @local_device_manager.c(669),INFO" ID="0xd80814ed" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="dev_hdl:0x%08x @local_device_manager.c(679),INFO" ID="0xd808153d" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s errr @local_device_manager.c(694),ERROR" ID="0xd80815b2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc errr @local_device_manager.c(708),ERROR" ID="0xd8081622" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s errr @local_device_manager.c(714),ERROR" ID="0xd8081652" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc errr @local_device_manager.c(743),ERROR" ID="0xd808173a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s errr @local_device_manager.c(749),ERROR" ID="0xd808176a" />
+ <MSG STRUCTURE="diag_log_msg8" NAME="conn_hdl: %08x event: %04x role: %x result: %x dev_hdl: %x svc_hdl: %x svc_class: %x duration: %d @local_device_manager.c(763),INFO" ID="0xd80817dd" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="received_bytes: %d sent_bytes: %d @local_device_manager.c(766),INFO" ID="0xd80817f5" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="unhandled service class 0x%x @local_device_manager.c(792),WARNING" ID="0xd80818c3" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="dev_hdl: %08x num_value: %06d @local_device_manager.c(815),INFO" ID="0xd808197d" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="dev_hdl: 0x%08x @local_device_manager.c(822),INFO" ID="0xd80819b5" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="dev_hdl: 0x%08x @local_device_manager.c(829),INFO" ID="0xd80819ed" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="dev_hdl: %08x num_value: %06d @local_device_manager.c(835),INFO" ID="0xd8081a1d" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="dev_hdl: %08x reason: %x @local_device_manager.c(849),INFO" ID="0xd8081a8d" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="white_list_size:%d @local_device_manager.c(855),INFO" ID="0xd8081abd" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="transmit_power_level:%d @local_device_manager.c(860),INFO" ID="0xd8081ae5" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="register err id: %x ret: %x @local_device_manager.c(891),ERROR" ID="0xd8081bda" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="bt enable err,B core may be not calibration end and not notify A Core @local_device_manager.c(926),ERROR" ID="0xd8081cf2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="bt_init err ret = %08x @local_device_manager.c(956),ERROR" ID="0xd8081de2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="buff is't long enough, need length:%d. @local_device_manager.c(1064),ERROR" ID="0xd8082142" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="get local name memcpy fail. @local_device_manager.c(1068),ERROR" ID="0xd8082162" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="name: %s, length: %d @local_device_manager.c(1077),INFO" ID="0xd80821ad" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="failed: bt not enabled @local_device_manager.c(1092),INFO" ID="0xd8082225" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="local name null or length not match, len: %d @local_device_manager.c(1096),INFO" ID="0xd8082245" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="returns error ret: %x @local_device_manager.c(1102),WARNING" ID="0xd8082273" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="set result name: "%s" name_len: %d get_re: %x @local_device_manager.c(1108),INFO" ID="0xd80822a5" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="gap_remove_all_pairs fail @local_device_manager.c(1168),ERROR" ID="0xd8082482" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="gap ble remove all pairs fail @local_device_manager.c(1174),ERROR" ID="0xd80824b2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="diable_bt_ret(errcode_t): %x @local_device_manager.c(1181),INFO" ID="0xd80824ed" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="disable_ble_ret(errcode_t): %x @local_device_manager.c(1186),INFO" ID="0xd8082515" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="set discovery data pointer is null. @local_device_manager.c(1217),ERROR" ID="0xd808260a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="adv_id(%d) advertising, please stop first. @local_device_manager.c(1235),ERROR" ID="0xd808269a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="adv data alloc faild, length:%d @local_device_manager.c(1248),ERROR" ID="0xd8082702" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[Error] gap_ble_set_adv_data adv data memcpy_s fail @local_device_manager.c(1252),ERROR" ID="0xd8082722" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="scan rsp data alloc faild, length:%d @local_device_manager.c(1261),ERROR" ID="0xd808276a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[Error] gap_ble_set_adv_data scan rsp data memcpy_s fail @local_device_manager.c(1265),ERROR" ID="0xd808278a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="adv_id(%d) advertising, please stop first. @local_device_manager.c(1304),ERROR" ID="0xd80828c2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[Error] gap ble set adv param memcpy_s fail @local_device_manager.c(1316),ERROR" ID="0xd8082922" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[Error] gap ble set adv param memcpy_s fail @local_device_manager.c(1330),ERROR" ID="0xd8082992" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="ble gap set sec param error param NULL @local_device_manager.c(1352),ERROR" ID="0xd8082a42" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="ble gap set sec param error param NULL @local_device_manager.c(1357),ERROR" ID="0xd8082a6a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="bt has page scanning enabled. @local_device_manager.c(1381),ERROR" ID="0xd8082b2a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="bt has an ACL connection. @local_device_manager.c(1387),ERROR" ID="0xd8082b5a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[CTKD] please set ble secure connection enable,current_sc=%d. @local_device_manager.c(1404),ERROR" ID="0xd8082be2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[Error] gap set adv data memcpy_s fail @local_device_manager.c(1427),ERROR" ID="0xd8082c9a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[Error] gap set scan rsp data memcpy_s fail @local_device_manager.c(1434),ERROR" ID="0xd8082cd2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[Error] btsrv_gap_set_adv_param memcpy_s fail @local_device_manager.c(1453),ERROR" ID="0xd8082d6a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[Error] gap set adv param memcpy_s fail @local_device_manager.c(1458),ERROR" ID="0xd8082d92" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="ble gap ext adv rpt memcpy fail @local_device_manager.c(1478),ERROR" ID="0xd8082e32" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="ble gap ext adv rpt memcpy fail @local_device_manager.c(1493),ERROR" ID="0xd8082eaa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="ble gap adv set terminated cbk param error @local_device_manager.c(1505),ERROR" ID="0xd8082f0a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="ble enable cbk param error @local_device_manager.c(1516),ERROR" ID="0xd8082f62" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="ble read remote rssi cbk param error @local_device_manager.c(1527),ERROR" ID="0xd8082fba" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="ble conn param update cbk param error @local_device_manager.c(1543),ERROR" ID="0xd808303a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="ble gap conn param malloc fail @local_device_manager.c(1557),ERROR" ID="0xd80830aa" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="ble conn param update cbk interval:%x, latency:%x, timeout:%x @local_device_manager.c(1564),INFO" ID="0xd80830e5" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="adv id is not active, please set param first. @local_device_manager.c(1598),ERROR" ID="0xd80831f2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="adv id(%d) is discoverying, please stop first. @local_device_manager.c(1602),ERROR" ID="0xd8083212" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="adv param alloc fail @local_device_manager.c(1611),ERROR" ID="0xd808325a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="adv id is not active, please set param first. @local_device_manager.c(1644),ERROR" ID="0xd8083362" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="no advertising in progress or advertising for adv_id(%d). No advertising for adv_id(%d). @local_device_manager.c(1650),ERROR" ID="0xd8083392" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="mc sdk ble stop adv atb failed @local_device_manager.c(1656),ERROR" ID="0xd80833c2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="scanning in process, please stop first. @local_device_manager.c(1690),ERROR" ID="0xd80834d2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="scanning already stopped. @local_device_manager.c(1722),ERROR" ID="0xd80835d2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="ble stop extern scan ret: %#x @local_device_manager.c(1726),INFO" ID="0xd80835f5" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="ble set phy node == NULL @local_device_manager.c(1751),ERROR" ID="0xd80836ba" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="ble set phy memcpy fail @local_device_manager.c(1757),ERROR" ID="0xd80836ea" />
+ <MSG STRUCTURE="diag_log_msg5" NAME="ble general set phy hdl:%x all:%x rx:%x tx:%x op:%x. @local_device_manager.c(1763),INFO" ID="0xd808371d" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="ble set phy ret: %#x @local_device_manager.c(1766),ERROR" ID="0xd8083732" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="ble set data length node == NULL @local_device_manager.c(1788),ERROR" ID="0xd80837e2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="ble set data length memcpy fail @local_device_manager.c(1794),ERROR" ID="0xd8083812" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="ble general set len hdl:%x maxoct:%x maxtime:%x @local_device_manager.c(1800),INFO" ID="0xd8083845" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="ble set len ret: %#x @local_device_manager.c(1803),ERROR" ID="0xd808385a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="bts sert log type levle:%x @local_device_manager.c(1821),INFO" ID="0xd80838ed" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="g_bts_feature_bitmap bt_auto_reconnect_closed:%d. @local_device_manager.c(1842),ERROR" ID="0xd8083992" />
</MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="set svg faild, path len is 0 @map_svg_parser.cpp(54),ERROR" ID="0xcb4601b2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Invalid file path. @map_svg_parser.cpp(67),ERROR" ID="0xcb46021a" />
- <MSG STRUCTURE="diag_log_msg2" NAME="File(%s) can not open. errno: %d @map_svg_parser.cpp(73),ERROR" ID="0xcb46024a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="read map header faild @map_svg_parser.cpp(78),ERROR" ID="0xcb460272" />
- <MSG STRUCTURE="diag_log_msg0" NAME="parser map success @map_svg_parser.cpp(97),DBG" ID="0xcb46030e" />
- <MSG STRUCTURE="diag_log_msg0" NAME="parser map failed @map_svg_parser.cpp(104),DBG" ID="0xcb460346" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s map header faild @map_svg_parser.cpp(113),ERROR" ID="0xcb46038a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="The remaining data is insufficient. The read ends. @map_svg_parser.cpp(118),WARNING" ID="0xcb4603b3" />
- <MSG STRUCTURE="diag_log_msg0" NAME="parser map success @map_svg_parser.cpp(153),DBG" ID="0xcb4604ce" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(160),ERROR" ID="0xcb460502" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc map node array faild! @map_svg_parser.cpp(167),ERROR" ID="0xcb46053a" />
- <MSG STRUCTURE="diag_log_msg2" NAME="read map node array faild, readLen:%d, realReadLen:%d @map_svg_parser.cpp(174),ERROR" ID="0xcb460572" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(187),ERROR" ID="0xcb4605da" />
- <MSG STRUCTURE="diag_log_msg0" NAME="read map node faild.The data length is less than the read length! @map_svg_parser.cpp(193),ERROR" ID="0xcb46060a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc map node array faild! @map_svg_parser.cpp(198),ERROR" ID="0xcb460632" />
- <MSG STRUCTURE="diag_log_msg1" NAME="memcpy_s map node array faild, nodeLen: 0x%x @map_svg_parser.cpp(205),ERROR" ID="0xcb46066a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(215),ERROR" ID="0xcb4606ba" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc path style array faild! @map_svg_parser.cpp(222),ERROR" ID="0xcb4606f2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s path style array faild @map_svg_parser.cpp(229),ERROR" ID="0xcb46072a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(242),ERROR" ID="0xcb460792" />
- <MSG STRUCTURE="diag_log_msg0" NAME="read path style faild.The data length is less than the read length! @map_svg_parser.cpp(248),ERROR" ID="0xcb4607c2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc path style array faild! @map_svg_parser.cpp(254),ERROR" ID="0xcb4607f2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s path style array faild @map_svg_parser.cpp(261),ERROR" ID="0xcb46082a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Alloc buffer for buffer failed. @map_svg_parser.cpp(275),ERROR" ID="0xcb46089a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Alloc buffer for buffer failed. @map_svg_parser.cpp(284),ERROR" ID="0xcb4608e2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(295),ERROR" ID="0xcb46093a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(302),ERROR" ID="0xcb460972" />
- <MSG STRUCTURE="diag_log_msg0" NAME="read map path array faild @map_svg_parser.cpp(311),ERROR" ID="0xcb4609ba" />
- <MSG STRUCTURE="diag_log_msg0" NAME="alloc path faild @map_svg_parser.cpp(318),ERROR" ID="0xcb4609f2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="read path cmd faild @map_svg_parser.cpp(324),ERROR" ID="0xcb460a22" />
- <MSG STRUCTURE="diag_log_msg0" NAME="read path data faild @map_svg_parser.cpp(330),ERROR" ID="0xcb460a52" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(341),ERROR" ID="0xcb460aaa" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(348),ERROR" ID="0xcb460ae2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s map path array faild @map_svg_parser.cpp(356),ERROR" ID="0xcb460b22" />
- <MSG STRUCTURE="diag_log_msg0" NAME="alloc path faild @map_svg_parser.cpp(366),ERROR" ID="0xcb460b72" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s path cmd faild @map_svg_parser.cpp(371),ERROR" ID="0xcb460b9a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s path data faild @map_svg_parser.cpp(378),ERROR" ID="0xcb460bd2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(413),ERROR" ID="0xcb460cea" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(420),ERROR" ID="0xcb460d22" />
- <MSG STRUCTURE="diag_log_msg0" NAME="read map text array faild @map_svg_parser.cpp(429),ERROR" ID="0xcb460d6a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path cmd faild @map_svg_parser.cpp(436),ERROR" ID="0xcb460da2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="read text faild @map_svg_parser.cpp(443),ERROR" ID="0xcb460dda" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc text offset faild @map_svg_parser.cpp(451),ERROR" ID="0xcb460e1a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="read text offset faild @map_svg_parser.cpp(457),ERROR" ID="0xcb460e4a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(468),ERROR" ID="0xcb460ea2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(475),ERROR" ID="0xcb460eda" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s map text array faild @map_svg_parser.cpp(483),ERROR" ID="0xcb460f1a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path cmd faild @map_svg_parser.cpp(492),ERROR" ID="0xcb460f62" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s text faild @map_svg_parser.cpp(497),ERROR" ID="0xcb460f8a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc text offset faild @map_svg_parser.cpp(507),ERROR" ID="0xcb460fda" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s text offset faild @map_svg_parser.cpp(512),ERROR" ID="0xcb461002" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(546),ERROR" ID="0xcb461112" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(553),ERROR" ID="0xcb46114a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="read map image array faild @map_svg_parser.cpp(558),ERROR" ID="0xcb461172" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(566),ERROR" ID="0xcb4611b2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(595),ERROR" ID="0xcb46129a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(602),ERROR" ID="0xcb4612d2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s map text array faild @map_svg_parser.cpp(607),ERROR" ID="0xcb4612fa" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(615),ERROR" ID="0xcb46133a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(647),ERROR" ID="0xcb46143a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(654),ERROR" ID="0xcb461472" />
- <MSG STRUCTURE="diag_log_msg0" NAME="read map road array faild @map_svg_parser.cpp(659),ERROR" ID="0xcb46149a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(669),ERROR" ID="0xcb4614ea" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(676),ERROR" ID="0xcb461522" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s map text array faild @map_svg_parser.cpp(681),ERROR" ID="0xcb46154a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(700),ERROR" ID="0xcb4615e2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(707),ERROR" ID="0xcb46161a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="read map poi array faild @map_svg_parser.cpp(712),ERROR" ID="0xcb461642" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(722),ERROR" ID="0xcb461692" />
- <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(729),ERROR" ID="0xcb4616ca" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s map text array faild @map_svg_parser.cpp(734),ERROR" ID="0xcb4616f2" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="set svg faild, path len is 0 @map_svg_parser.cpp(54),ERROR" ID="0xcb4801b2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Invalid file path. @map_svg_parser.cpp(67),ERROR" ID="0xcb48021a" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="File(%s) can not open. errno: %d @map_svg_parser.cpp(73),ERROR" ID="0xcb48024a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="read map header faild @map_svg_parser.cpp(78),ERROR" ID="0xcb480272" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="parser map success @map_svg_parser.cpp(97),DBG" ID="0xcb48030e" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="parser map failed @map_svg_parser.cpp(104),DBG" ID="0xcb480346" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s map header faild @map_svg_parser.cpp(113),ERROR" ID="0xcb48038a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="The remaining data is insufficient. The read ends. @map_svg_parser.cpp(118),WARNING" ID="0xcb4803b3" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="parser map success @map_svg_parser.cpp(153),DBG" ID="0xcb4804ce" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(160),ERROR" ID="0xcb480502" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc map node array faild! @map_svg_parser.cpp(167),ERROR" ID="0xcb48053a" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="read map node array faild, readLen:%d, realReadLen:%d @map_svg_parser.cpp(174),ERROR" ID="0xcb480572" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(187),ERROR" ID="0xcb4805da" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="read map node faild.The data length is less than the read length! @map_svg_parser.cpp(193),ERROR" ID="0xcb48060a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc map node array faild! @map_svg_parser.cpp(198),ERROR" ID="0xcb480632" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="memcpy_s map node array faild, nodeLen: 0x%x @map_svg_parser.cpp(205),ERROR" ID="0xcb48066a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(215),ERROR" ID="0xcb4806ba" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc path style array faild! @map_svg_parser.cpp(222),ERROR" ID="0xcb4806f2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s path style array faild @map_svg_parser.cpp(229),ERROR" ID="0xcb48072a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(242),ERROR" ID="0xcb480792" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="read path style faild.The data length is less than the read length! @map_svg_parser.cpp(248),ERROR" ID="0xcb4807c2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc path style array faild! @map_svg_parser.cpp(254),ERROR" ID="0xcb4807f2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s path style array faild @map_svg_parser.cpp(261),ERROR" ID="0xcb48082a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Alloc buffer for buffer failed. @map_svg_parser.cpp(275),ERROR" ID="0xcb48089a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Alloc buffer for buffer failed. @map_svg_parser.cpp(284),ERROR" ID="0xcb4808e2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(295),ERROR" ID="0xcb48093a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(302),ERROR" ID="0xcb480972" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="read map path array faild @map_svg_parser.cpp(311),ERROR" ID="0xcb4809ba" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="alloc path faild @map_svg_parser.cpp(318),ERROR" ID="0xcb4809f2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="read path cmd faild @map_svg_parser.cpp(324),ERROR" ID="0xcb480a22" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="read path data faild @map_svg_parser.cpp(330),ERROR" ID="0xcb480a52" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(341),ERROR" ID="0xcb480aaa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(348),ERROR" ID="0xcb480ae2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s map path array faild @map_svg_parser.cpp(356),ERROR" ID="0xcb480b22" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="alloc path faild @map_svg_parser.cpp(366),ERROR" ID="0xcb480b72" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s path cmd faild @map_svg_parser.cpp(371),ERROR" ID="0xcb480b9a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s path data faild @map_svg_parser.cpp(378),ERROR" ID="0xcb480bd2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(413),ERROR" ID="0xcb480cea" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(420),ERROR" ID="0xcb480d22" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="read map text array faild @map_svg_parser.cpp(429),ERROR" ID="0xcb480d6a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path cmd faild @map_svg_parser.cpp(436),ERROR" ID="0xcb480da2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="read text faild @map_svg_parser.cpp(443),ERROR" ID="0xcb480dda" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc text offset faild @map_svg_parser.cpp(451),ERROR" ID="0xcb480e1a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="read text offset faild @map_svg_parser.cpp(457),ERROR" ID="0xcb480e4a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(468),ERROR" ID="0xcb480ea2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(475),ERROR" ID="0xcb480eda" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s map text array faild @map_svg_parser.cpp(483),ERROR" ID="0xcb480f1a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path cmd faild @map_svg_parser.cpp(492),ERROR" ID="0xcb480f62" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s text faild @map_svg_parser.cpp(497),ERROR" ID="0xcb480f8a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc text offset faild @map_svg_parser.cpp(507),ERROR" ID="0xcb480fda" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s text offset faild @map_svg_parser.cpp(512),ERROR" ID="0xcb481002" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(546),ERROR" ID="0xcb481112" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(553),ERROR" ID="0xcb48114a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="read map image array faild @map_svg_parser.cpp(558),ERROR" ID="0xcb481172" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(566),ERROR" ID="0xcb4811b2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(595),ERROR" ID="0xcb48129a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(602),ERROR" ID="0xcb4812d2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s map text array faild @map_svg_parser.cpp(607),ERROR" ID="0xcb4812fa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(615),ERROR" ID="0xcb48133a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(647),ERROR" ID="0xcb48143a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(654),ERROR" ID="0xcb481472" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="read map road array faild @map_svg_parser.cpp(659),ERROR" ID="0xcb48149a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(669),ERROR" ID="0xcb4814ea" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(676),ERROR" ID="0xcb481522" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s map text array faild @map_svg_parser.cpp(681),ERROR" ID="0xcb48154a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(700),ERROR" ID="0xcb4815e2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(707),ERROR" ID="0xcb48161a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="read map poi array faild @map_svg_parser.cpp(712),ERROR" ID="0xcb481642" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[%s] param error! @map_svg_parser.cpp(722),ERROR" ID="0xcb481692" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="malloc map path array faild! @map_svg_parser.cpp(729),ERROR" ID="0xcb4816ca" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s map text array faild @map_svg_parser.cpp(734),ERROR" ID="0xcb4816f2" />
</MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg1" NAME="ACELite version: %s @platform_adapter.cpp(34),DBG" ID="0xe1140116" />
- <MSG STRUCTURE="diag_log_msg1" NAME="ACELite commit: %s @platform_adapter.cpp(35),DBG" ID="0xe114011e" />
- <MSG STRUCTURE="diag_log_msg1" NAME="ACELite build stamp: %s @platform_adapter.cpp(36),DBG" ID="0xe1140126" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg1" NAME="ACELite version: %s @platform_adapter.cpp(34),DBG" ID="0xe11a0116" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="ACELite commit: %s @platform_adapter.cpp(35),DBG" ID="0xe11a011e" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="ACELite build stamp: %s @platform_adapter.cpp(36),DBG" ID="0xe11a0126" />
</MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s fail. @stack_av_if.c(62),ERROR" ID="0xd8dc01f2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s fail. @stack_av_if.c(118),ERROR" ID="0xd8dc03b2" />
- <MSG STRUCTURE="diag_log_msg2" NAME=" a2dp rpt stream state %x src %x @stack_av_if.c(163),INFO" ID="0xd8dc051d" />
- <MSG STRUCTURE="diag_log_msg1" NAME=" a2dp rpt stream config src %x @stack_av_if.c(179),INFO" ID="0xd8dc059d" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s fail. @stack_av_if.c(67),ERROR" ID="0xd8dc021a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s fail. @stack_av_if.c(123),ERROR" ID="0xd8dc03da" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memcpy_s fail. @stack_av_if.c(142),ERROR" ID="0xd8dc0472" />
+ <MSG STRUCTURE="diag_log_msg2" NAME=" a2dp rpt stream state %x src %x @stack_av_if.c(189),INFO" ID="0xd8dc05ed" />
+ <MSG STRUCTURE="diag_log_msg1" NAME=" a2dp rpt stream config src %x @stack_av_if.c(205),INFO" ID="0xd8dc066d" />
</MSG_LOG>
\ No newline at end of file
--- /dev/null
+<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="add failed, view is nullptr @ui_coverflow_view2.cpp(53),ERROR" ID="0xcb4001aa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="add failed, the view type is not support, only suppot UITransformGroup. @ui_coverflow_view2.cpp(58),ERROR" ID="0xcb4001d2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="insert failed, view is nullptr @ui_coverflow_view2.cpp(76),ERROR" ID="0xcb400262" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="add failed, the view type is not support, only suppot UITransformGroup. @ui_coverflow_view2.cpp(81),ERROR" ID="0xcb40028a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="remove failed, view is nullptr @ui_coverflow_view2.cpp(99),ERROR" ID="0xcb40031a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="remove failed, view parent is nullptr @ui_coverflow_view2.cpp(104),ERROR" ID="0xcb400342" />
+ </MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="A maximum of 20 records can be added. @ui_icosahedron_view.cpp(108),ERROR" ID="0xcb420362" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="A maximum of 20 records can be added. @ui_icosahedron_view.cpp(108),ERROR" ID="0xcb440362" />
</MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="pois_ malloc fail @ui_map_view.cpp(82),ERROR" ID="0xcb440292" />
- <MSG STRUCTURE="diag_log_msg0" NAME="roads_ malloc fail @ui_map_view.cpp(133),ERROR" ID="0xcb44042a" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="pois_ malloc fail @ui_map_view.cpp(79),ERROR" ID="0xcb46027a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="roads_ malloc fail @ui_map_view.cpp(130),ERROR" ID="0xcb460412" />
</MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="RollerItemInfo is nullptr! @ui_roller_view.cpp(180),ERROR" ID="0xcb4005a2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Already add an item with the same name. Remove it before adding this. @ui_roller_view.cpp(223),ERROR" ID="0xcb4006fa" />
- <MSG STRUCTURE="diag_log_msg0" NAME="name is empty! @ui_roller_view.cpp(264),ERROR" ID="0xcb400842" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Should remove an item in DISPLAY mode @ui_roller_view.cpp(269),ERROR" ID="0xcb40086a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="RollerItemInfo is null! @ui_roller_view.cpp(450),ERROR" ID="0xcb400e12" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Cannot set align item when mode is about to change. @ui_roller_view.cpp(503),ERROR" ID="0xcb400fba" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Should SetCurrentItem in DISPLAY mode. @ui_roller_view.cpp(507),ERROR" ID="0xcb400fda" />
- <MSG STRUCTURE="diag_log_msg1" NAME="Cannot find an item with name: %s @ui_roller_view.cpp(522),ERROR" ID="0xcb401052" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Cannot set mode when AlignAnim is running @ui_roller_view.cpp(617),ERROR" ID="0xcb40134a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="mode is already set. @ui_roller_view.cpp(622),ERROR" ID="0xcb401372" />
- <MSG STRUCTURE="diag_log_msg0" NAME="Cannot Set mode during transition or cannot set TRANSITION mode. @ui_roller_view.cpp(627),ERROR" ID="0xcb40139a" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="RollerItemInfo is nullptr! @ui_roller_view.cpp(180),ERROR" ID="0xcb4205a2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Already add an item with the same name. Remove it before adding this. @ui_roller_view.cpp(224),ERROR" ID="0xcb420702" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="name is empty! @ui_roller_view.cpp(267),ERROR" ID="0xcb42085a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Should remove an item in DISPLAY mode @ui_roller_view.cpp(272),ERROR" ID="0xcb420882" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="RollerItemInfo is null! @ui_roller_view.cpp(453),ERROR" ID="0xcb420e2a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Cannot set align item when mode is about to change. @ui_roller_view.cpp(506),ERROR" ID="0xcb420fd2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Should SetCurrentItem in DISPLAY mode. @ui_roller_view.cpp(510),ERROR" ID="0xcb420ff2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="Cannot find an item with name: %s @ui_roller_view.cpp(525),ERROR" ID="0xcb42106a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Cannot set mode when AlignAnim is running @ui_roller_view.cpp(620),ERROR" ID="0xcb421362" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="mode is already set. @ui_roller_view.cpp(625),ERROR" ID="0xcb42138a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="Cannot Set mode during transition or cannot set TRANSITION mode. @ui_roller_view.cpp(630),ERROR" ID="0xcb4213b2" />
</MSG_LOG>
\ No newline at end of file
--- /dev/null
+<MSG_LOG><MSG STRUCTURE="diag_log_msg1" NAME="Failed to create the child control. The control of this [%d] cannot be copied. @ui_transform_group.cpp(35),WARNING" ID="0xcb54011b" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="add failed, the view type %d is not support @ui_transform_group.cpp(49),ERROR" ID="0xcb54018a" />
+ </MSG_LOG>
\ No newline at end of file
<MSG STRUCTURE="diag_log_msg2" NAME="Controller|[%d]:0x%02x @bt_transparent_bypass.c(24),INFO" ID="0x8de400c5" />
<MSG STRUCTURE="diag_log_msg1" NAME="BypassMode = 0x%x @bt_transparent_bypass.c(35),INFO" ID="0x8de4011d" />
<MSG STRUCTURE="diag_log_msg4" NAME="[BLE_TEST] private test mode, chmap---0x%x:0x%x:0x%x,0x%x @llc_ch_asses.c(237),INFO" ID="0x8834076d" />
- <MSG STRUCTURE="diag_log_msg2" NAME="btsdk_is_device_connected hdl:0x%x status:%d @sdk_gap_conn_management.c(608),INFO" ID="0x8b821305" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="btsdk_is_device_connected hdl:0x%x status:%d @sdk_gap_conn_management.c(613),INFO" ID="0x8b82132d" />
<MSG STRUCTURE="diag_log_msg2" NAME="[GAP] inquiry result cbk i:%d eir[i]:%d @gap_hlp_br.c(116),ERROR" ID="0x8b8a03a2" />
<MSG STRUCTURE="diag_log_msg0" NAME="[GAP][LOGN_STACK_GAP_DIS_REGISTER] RegisterDIService success. @gap_hlp_br.c(1534),INFO" ID="0x8b8a2ff5" />
<MSG STRUCTURE="diag_log_msg0" NAME="[GAP][LOGN_STACK_GAP_DIS_REGISTER] RegisterDIService failed. @gap_hlp_br.c(1538),WARNING" ID="0x8b8a3013" />
<MSG STRUCTURE="diag_log_msg2" NAME="[LLCP]llc_llcp_priv_uhd_req_pdu_send:param->tx_phys%d,param->tx_uhd_capability%d @llc_uhd_llcp.c(675),INFO" ID="0x894e151d" />
<MSG STRUCTURE="diag_log_msg3" NAME="llc_llcp_priv_uhd_up_ind_pdu_send:tx_phys%d,tx_uhd_capability%d, tx_polar%d @llc_uhd_llcp.c(713),INFO" ID="0x894e164d" />
<MSG STRUCTURE="diag_log_msg1" NAME="[LLC]uhd_up_ind:pdu.instant %d @llc_uhd_llcp.c(727),INFO" ID="0x894e16bd" />
- <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: start @bt_ahi_av.c(52),ERROR" ID="0x8c9e01a2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: suspend @bt_ahi_av.c(68),ERROR" ID="0x8c9e0222" />
- <MSG STRUCTURE="diag_log_msg4" NAME="a2dp_audio: set audio param stream_hdl 0x%x shmid 0x%x enable %d result 0x%x @bt_ahi_av.c(106),ERROR" ID="0x8c9e0352" />
- <MSG STRUCTURE="diag_log_msg1" NAME="a2dp_audio: send stream qos flag %d @bt_ahi_av.c(118),ERROR" ID="0x8c9e03b2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: first frame @bt_ahi_av.c(162),ERROR" ID="0x8c9e0512" />
- <MSG STRUCTURE="diag_log_msg1" NAME="a2dp_audio: send stream packet too much %d @bt_ahi_av.c(198),ERROR" ID="0x8c9e0632" />
- <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: alloc buffer fail @bt_ahi_av.c(216),ERROR" ID="0x8c9e06c2" />
- <MSG STRUCTURE="diag_log_msg3" NAME="a2dp_audio: send stream error 0x%x enable %d sta %d @bt_ahi_av.c(229),ERROR" ID="0x8c9e072a" />
- <MSG STRUCTURE="diag_log_msg3" NAME="a2dp_audio: send stream seq %d enable %d sta %d @bt_ahi_av.c(238),ERROR" ID="0x8c9e0772" />
- <MSG STRUCTURE="diag_log_msg2" NAME="a2dp_audio: acquire stream error 0x%x shmid 0x%x @bt_ahi_av.c(249),ERROR" ID="0x8c9e07ca" />
- <MSG STRUCTURE="diag_log_msg4" NAME="a2dp_audio: acquire frame empty cnt %d eos %d size %d pkt_len %d @bt_ahi_av.c(260),ERROR" ID="0x8c9e0822" />
- <MSG STRUCTURE="diag_log_msg2" NAME="a2dp_audio: play state enable %d sta %d @bt_ahi_av.c(265),ERROR" ID="0x8c9e084a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="a2dp_audio: release stream error 0x%x @bt_ahi_av.c(273),ERROR" ID="0x8c9e088a" />
- <MSG STRUCTURE="diag_log_msg2" NAME="a2dp_audio: no stream. enable %d sta %d @bt_ahi_av.c(284),ERROR" ID="0x8c9e08e2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: a2dp service audio task handler @bt_ahi_av.c(294),INFO" ID="0x8c9e0935" />
- <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: start accept @bt_ahi_av.c(324),ERROR" ID="0x8c9e0a22" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: start @bt_ahi_av.c(57),ERROR" ID="0x8c9e01ca" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: suspend @bt_ahi_av.c(73),ERROR" ID="0x8c9e024a" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="a2dp_audio: set audio param stream_hdl 0x%x shmid 0x%x enable %d result 0x%x @bt_ahi_av.c(111),ERROR" ID="0x8c9e037a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="a2dp_audio: send stream qos flag %d @bt_ahi_av.c(123),ERROR" ID="0x8c9e03da" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: first frame @bt_ahi_av.c(167),ERROR" ID="0x8c9e053a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="a2dp_audio: send stream packet too much %d @bt_ahi_av.c(203),ERROR" ID="0x8c9e065a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: alloc buffer fail @bt_ahi_av.c(221),ERROR" ID="0x8c9e06ea" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="a2dp_audio: send stream error 0x%x enable %d sta %d @bt_ahi_av.c(234),ERROR" ID="0x8c9e0752" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="a2dp_audio: send stream seq %d enable %d sta %d @bt_ahi_av.c(243),ERROR" ID="0x8c9e079a" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="a2dp_audio: acquire stream error 0x%x shmid 0x%x @bt_ahi_av.c(254),ERROR" ID="0x8c9e07f2" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="a2dp_audio: acquire frame empty cnt %d eos %d size %d pkt_len %d @bt_ahi_av.c(265),ERROR" ID="0x8c9e084a" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="a2dp_audio: play state enable %d sta %d @bt_ahi_av.c(270),ERROR" ID="0x8c9e0872" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="a2dp_audio: release stream error 0x%x @bt_ahi_av.c(278),ERROR" ID="0x8c9e08b2" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="a2dp_audio: no stream. enable %d sta %d @bt_ahi_av.c(289),ERROR" ID="0x8c9e090a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: a2dp service audio task handler @bt_ahi_av.c(299),INFO" ID="0x8c9e095d" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: start accept @bt_ahi_av.c(329),ERROR" ID="0x8c9e0a4a" />
<MSG STRUCTURE="diag_log_msg1" NAME="[INFO][HOP]scst_hop_chk_en=%x @ld_acl_hop.c(138),INFO" ID="0x88c80455" />
<MSG STRUCTURE="diag_log_msg3" NAME="[INFO][HOP]scst_hop_chk_en=%x, nb_good_ch_thr=%d, bw=%d @ld_acl_hop.c(160),INFO" ID="0x88c80505" />
<MSG STRUCTURE="diag_log_msg4" NAME="[INFO][HOP]hop_check hop_info_buf[%d]=%d, hop_out=%d, diff=%d @ld_acl_hop.c(329),INFO" ID="0x88c80a4d" />
<MSG STRUCTURE="diag_log_msg5" NAME="[L2CAP]SDU Reassemble memcpy_s Error, ret=%u, dest=%p, destSize=%u, src=%p, srcSize=%u @l2cap_ert.c(193),ERROR" ID="0x8adc060a" />
<MSG STRUCTURE="diag_log_msg5" NAME="[L2CAP]SDU Reassemble memcpy_s Error, ret=%u, dest=%p, destSize=%u, src=%p, srcSize=%u @l2cap_ert.c(209),ERROR" ID="0x8adc068a" />
<MSG STRUCTURE="diag_log_msg4" NAME="ap => bt ipc error, get cpu trace ret=%d, bt pc=0x%x, lr=0x%x, sp=0x%x, @ipc.c(417),ERROR" ID="0xa02a0d0a" />
- <MSG STRUCTURE="diag_log_msg4" NAME="ipc error core %d => %d action=%d, called=0x%X @ipc.c(707),ERROR" ID="0xa02a161a" />
- <MSG STRUCTURE="diag_log_msg4" NAME="ipc error, core=%d current pc=0x%x, lr=0x%x, sp=0x%x @ipc.c(709),ERROR" ID="0xa02a162a" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="ipc error core %d => %d action=%d, called=0x%X @ipc.c(708),ERROR" ID="0xa02a1622" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="ipc error, core=%d current pc=0x%x, lr=0x%x, sp=0x%x @ipc.c(710),ERROR" ID="0xa02a1632" />
<MSG STRUCTURE="diag_log_msg2" NAME="[ERROR]bt_ssi_read_reg BT_CFG_FAIL[0x%x]=0x%x ... @reg_access_ram.c(146),ERROR" ID="0x8a4c0492" />
<MSG STRUCTURE="diag_log_msg1" NAME="[ERR]error_handler:NULL PTR: err_id = 0x%x @bt_priv_ram.c(351),ERROR" ID="0x88da0afa" />
<MSG STRUCTURE="diag_log_msg2" NAME="[ERR]error_handler:ERR PARAM: err_id = 0x%x , err_code = 0x%x @bt_priv_ram.c(357),ERROR" ID="0x88da0b2a" />
<MSG STRUCTURE="diag_log_msg1" NAME="[WARNING][LD]ld_acl_sniff_trans:acl end for already set end:%d @ld_acl_sniff.c(1298),WARNING" ID="0x89fe2893" />
<MSG STRUCTURE="diag_log_msg4" NAME="[WARNING][LD]ld_acl_sniff_trans:acl sched fail extab_prio=%d, acl_ts=0x%x, last_sync=0x%x, lsto=%d @ld_acl_sniff.c(1330),WARNING" ID="0x89fe2993" />
<MSG STRUCTURE="diag_log_msg2" NAME="[WARNING][LD]ld_sniff_anchor_point_check:clock 0x%x, sniff_ts:0x%x @ld_acl_sniff.c(1570),WARNING" ID="0x89fe3113" />
- <MSG STRUCTURE="diag_log_msg3" NAME="a2dp_audio: rpt stream state stream_hdl %p state %d src %d @sdk_av.c(813),WARNING" ID="0x8b86196b" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="a2dp_audio: rpt stream state stream_hdl %p state %d src %d @sdk_av.c(813),ERROR" ID="0x8b86196a" />
<MSG STRUCTURE="diag_log_msg4" NAME="[INFO][LLC]llc_le_set_adv_rand_add:conhdl=0x%x, rand_addr=0x%x:0x%x:*:*:*0x%x @llc.c(219),INFO" ID="0x883006dd" />
<MSG STRUCTURE="diag_log_msg4" NAME="[INFO][LLC]llc_set_adv_param:interval min=0x%x, max=0x%x, channel map=%d, filter policy=%d @llc.c(285),INFO" ID="0x883008ed" />
<MSG STRUCTURE="diag_log_msg2" NAME="[INFO][LLM]llc_set_adv_en:conhd=0x%x, adv_en=%d @llc.c(456),INFO" ID="0x88300e45" />
<MSG STRUCTURE="diag_log_msg0" NAME="[AVDTP][GET_SEP_FAIL] Can not get sep info @patch_bth.c(156),WARNING" ID="0x8d5404e3" />
<MSG STRUCTURE="diag_log_msg0" NAME="[STACK][RECV_RING_STOP] @patch_bth.c(244),INFO" ID="0x8d5407a5" />
<MSG STRUCTURE="diag_log_msg3" NAME="[ATT_GATT] att error rsp opcode:0x%x handle:%d error:0x%x @patch_bth.c(324),ERROR" ID="0x8d540a22" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[SMP]PAIRING_REQ_RECV @patch_bth.c(501),ERROR" ID="0x8d540faa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[SMP]PAIRING_REQ_RECV @patch_bth.c(503),ERROR" ID="0x8d540fba" />
<MSG STRUCTURE="diag_log_msg1" NAME="ble add ble white list fail: %d @bt_mpc_adpt_gap.c(52),ERROR" ID="0x8dd401a2" />
<MSG STRUCTURE="diag_log_msg1" NAME="ble add ble white list params err! len = %d @bt_mpc_adpt_gap.c(56),ERROR" ID="0x8dd401c2" />
<MSG STRUCTURE="diag_log_msg1" NAME="ble remove all ble white list fail: %d @bt_mpc_adpt_gap.c(71),ERROR" ID="0x8dd4023a" />
<MSG STRUCTURE="diag_log_msg1" NAME="spp srv register ret=0x%x @bt_ahi_spp.c(38),INFO" ID="0x8c9e0135" />
<MSG STRUCTURE="diag_log_msg0" NAME="memory copy failed @bt_ahi_spp.c(58),ERROR" ID="0x8c9e01d2" />
<MSG STRUCTURE="diag_log_msg1" NAME="spp srv unregister ret=0x%x @bt_ahi_spp.c(63),INFO" ID="0x8c9e01fd" />
- <MSG STRUCTURE="diag_log_msg2" NAME="spp read stream ret=0x%x len=%d @bt_ahi_spp.c(112),WARNING" ID="0x8c9e0383" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="spp read stream ret=0x%x len=%d @bt_ahi_spp.c(112),INFO" ID="0x8c9e0385" />
<MSG STRUCTURE="diag_log_msg0" NAME="memory copy failed @bt_ahi_spp.c(140),ERROR" ID="0x8c9e0462" />
<MSG STRUCTURE="diag_log_msg0" NAME="memory copy failed @bt_ahi_spp.c(148),ERROR" ID="0x8c9e04a2" />
- <MSG STRUCTURE="diag_log_msg2" NAME="spp write stream ret=0x%x bytes_written=%d @bt_ahi_spp.c(151),WARNING" ID="0x8c9e04bb" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="spp write stream ret=0x%x bytes_written=%d @bt_ahi_spp.c(151),INFO" ID="0x8c9e04bd" />
<MSG STRUCTURE="diag_log_msg1" NAME="[ERROR][RXDC]bt_rf_calc_dc_before_vga_delta vga_gain=%d, OUT OF RANGE! @bt_mdmrfabb_alg.c(167),ERROR" ID="0x893a053a" />
<MSG STRUCTURE="diag_log_msg3" NAME="[DYN RXDC] vga_gain=%d, dyn_dc_offset=%dmV, dco_before_vga*128=%d @bt_mdmrfabb_alg.c(173),WARNING" ID="0x893a056b" />
<MSG STRUCTURE="diag_log_msg0" NAME="[INFO][LLM]llm_util_check_adv_report_list: adv address in white list @llm_util.c(235),INFO" ID="0x8844075d" />
<MSG STRUCTURE="diag_log_msg3" NAME="[pscan stop]tx_time_total:%d, rx_time_total:%d, bt_statis_clock:%d @ld_pscan.c(923),WARNING" ID="0x88ba1cdb" />
<MSG STRUCTURE="diag_log_msg4" NAME="[WARNING]ts = 0x%x, asap_setting = %d, asap_limit = 0x%x, prio = %d @ld_pscan.c(1047),WARNING" ID="0x88ba20bb" />
<MSG STRUCTURE="diag_log_msg4" NAME="[WARNING]link_id = %d, step = %d, new_end_ts = 0x%x, rem_slots = %d @ld_pscan.c(1049),WARNING" ID="0x88ba20cb" />
- <MSG STRUCTURE="diag_log_msg4" NAME="[BLE ACL] conhdl=%d, status:0x%04x, length:%d, rxflush|rxdone|cie:%08x @patch_lld_pdu.c(44),INFO" ID="0x8a540165" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[BLE ACL] ccm 0x%x @patch_lld_pdu.c(45),INFO" ID="0x8a54016d" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="[BLE ACL] conhdl=%d, status:0x%04x, length:%d, rxflush|rxdone|cie:%08x @patch_lld_pdu.c(45),INFO" ID="0x8a54016d" />
<MSG STRUCTURE="diag_log_msg2" NAME="audio_debug ipc_send dsp begin,sequence_number = 0x%x,length = 0x%x. @a2dp_hlp_ram.c(93),INFO" ID="0x8ba002ed" />
<MSG STRUCTURE="diag_log_msg1" NAME="audio_debug ready to go =======ipc_send dsp end===ret = %d. @a2dp_hlp_ram.c(100),INFO" ID="0x8ba00325" />
<MSG STRUCTURE="diag_log_msg0" NAME="[ERROR]audio_debug ipc2dsp_msg_str fail @a2dp_hlp_ram.c(102),WARNING" ID="0x8ba00333" />
<MSG STRUCTURE="diag_log_msg1" NAME="GdkTimer Stop TimerId:%d @gdk_cmsis.c(111),DBG" ID="0x8cb0037e" />
<MSG STRUCTURE="diag_log_msg0" NAME="gdk os malloc size 0 @gdk_cmsis.c(152),ERROR" ID="0x8cb004c2" />
<MSG STRUCTURE="diag_log_msg1" NAME="gdk os malloc FAIL size:%d @gdk_cmsis.c(159),ERROR" ID="0x8cb004fa" />
- <MSG STRUCTURE="diag_log_msg0" NAME="ld_acl_sniff_evt_start_cbk start @ld_acl_sniff_ram.c(41),WARNING" ID="0x8a0a014b" />
- <MSG STRUCTURE="diag_log_msg4" NAME="[diff_sched_prog illegal] diff_sched_prog=%d timestamp=%d, rx_win_size=%d, last_sync=%d @ld_acl_sniff_ram.c(102),WARNING" ID="0x8a0a0333" />
- <MSG STRUCTURE="diag_log_msg2" NAME="[ERROR]ld_acl_sniff_evt_start_cbk:cs_idx = %d, att_nb = %d @ld_acl_sniff_ram.c(152),ERROR" ID="0x8a0a04c2" />
- <MSG STRUCTURE="diag_log_msg4" NAME="ld_acl_sniff_evt_start_cbk clock(0x%x)prog_clock(0x%x)last_sync_ts(0x%x)link_id(%d) @ld_acl_sniff_ram.c(184),INFO" ID="0x8a0a05c5" />
- <MSG STRUCTURE="diag_log_msg4" NAME="ld_acl_sniff_evt_start_cbk new_clk_off(0x%x)new_bit_off(%d)rx_win_size(%d)sched_att(%d) @ld_acl_sniff_ram.c(186),INFO" ID="0x8a0a05d5" />
- <MSG STRUCTURE="diag_log_msg4" NAME="ld_acl_sniff_evt_start_cbk last_anchr_rxstat(0x%x)last_anchor_rxch(%d)last_anchr_rxssi(%d)et_prio(%d) @ld_acl_sniff_ram.c(190),INFO" ID="0x8a0a05f5" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="[diff_sched_prog illegal] diff_sched_prog=%d timestamp=%d, rx_win_size=%d, last_sync=%d @ld_acl_sniff_ram.c(101),WARNING" ID="0x8a0a032b" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="[ERROR]ld_acl_sniff_evt_start_cbk:cs_idx = %d, att_nb = %d @ld_acl_sniff_ram.c(151),ERROR" ID="0x8a0a04ba" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="ld_acl_sniff_evt_start_cbk clock(0x%x)prog_clock(0x%x)last_sync_ts(0x%x)link_id(%d) @ld_acl_sniff_ram.c(183),INFO" ID="0x8a0a05bd" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="ld_acl_sniff_evt_start_cbk new_clk_off(0x%x)new_bit_off(%d)rx_win_size(%d)sched_att(%d) @ld_acl_sniff_ram.c(185),INFO" ID="0x8a0a05cd" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="ld_acl_sniff_evt_start_cbk last_anchr_rxstat(0x%x)last_anchor_rxch(%d)last_anchr_rxssi(%d)et_prio(%d) @ld_acl_sniff_ram.c(189),INFO" ID="0x8a0a05ed" />
<MSG STRUCTURE="diag_log_msg2" NAME="add_empty_descptr_in_front, even_counter=%d, buf_idx=%d @lld_iso_pdu.c(93),INFO" ID="0x885e02ed" />
<MSG STRUCTURE="diag_log_msg0" NAME="tx_desc_list empty @lld_iso_pdu.c(97),INFO" ID="0x885e030d" />
<MSG STRUCTURE="diag_log_msg0" NAME="[ICO] lld_pdu_ico_tx_prog, NULL @lld_iso_pdu.c(131),INFO" ID="0x885e041d" />
<MSG STRUCTURE="diag_log_msg0" NAME="memory alloc failed @sdk_spp.c(188),ERROR" ID="0x8b6c05e2" />
<MSG STRUCTURE="diag_log_msg1" NAME="memcpy failed len=%d @sdk_spp.c(197),ERROR" ID="0x8b6c062a" />
<MSG STRUCTURE="diag_log_msg2" NAME="spp rcv data hdl=0x%x len=%d @sdk_spp.c(203),INFO" ID="0x8b6c065d" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memory alloc failed @sdk_spp.c(255),ERROR" ID="0x8b6c07fa" />
- <MSG STRUCTURE="diag_log_msg2" NAME="[sdk][spp]send_app_event: hdl=0x%x ev=0x%x @sdk_spp.c(261),INFO" ID="0x8b6c082d" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memory alloc failed @sdk_spp.c(257),ERROR" ID="0x8b6c080a" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="[sdk][spp]send_app_event: hdl=0x%x ev=0x%x cnt=%d @sdk_spp.c(264),ERROR" ID="0x8b6c0842" />
<MSG STRUCTURE="diag_log_msg0" NAME="bam queue init queue is null! @bt_queue.c(31),ERROR" ID="0x8c9000fa" />
<MSG STRUCTURE="diag_log_msg0" NAME="bam item data malloc wrong pkt_len @bt_queue.c(69),ERROR" ID="0x8c90022a" />
<MSG STRUCTURE="diag_log_msg0" NAME="bam item data malloc new_item malloc fail @bt_queue.c(77),ERROR" ID="0x8c90026a" />
<MSG STRUCTURE="diag_log_msg3" NAME="stack gap browse rmt service result = 0x%x, svc_count = %d, svc_hdl[0] = 0x%x @bt_ahi_gap.c(365),INFO" ID="0x8c9e0b6d" />
<MSG STRUCTURE="diag_log_msg3" NAME="hfp enable sco:scohdl=0x%x inid=0x%x outid=0x%x @bt_ahi_gap.c(386),INFO" ID="0x8c9e0c15" />
<MSG STRUCTURE="diag_log_msg1" NAME="hfp disable sco:scohdl=0x%x @bt_ahi_gap.c(390),INFO" ID="0x8c9e0c35" />
- <MSG STRUCTURE="diag_log_msg3" NAME="result = 0x%x, handle = 0x%x, service_class = %02x @bt_ahi_gap.c(423),INFO" ID="0x8c9e0d3d" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="result = 0x%x, handle = 0x%x, service_class = %02x @bt_ahi_gap.c(423),ERROR" ID="0x8c9e0d3a" />
<MSG STRUCTURE="diag_log_msg1" NAME="stack gap init, res = 0x%x @bt_ahi_gap.c(435),INFO" ID="0x8c9e0d9d" />
<MSG STRUCTURE="diag_log_msg3" NAME="set bt tx power, hdl=0x%x, power=%d, ret=0x%x @bt_ahi_gap.c(448),INFO" ID="0x8c9e0e05" />
<MSG STRUCTURE="diag_log_msg3" NAME="br gap read rssi, hdl=0x%x, rssi=%d, ret=0x%x @bt_ahi_gap.c(456),INFO" ID="0x8c9e0e45" />
<MSG STRUCTURE="diag_log_msg3" NAME="a2dp_audio: send audio data enable = %x seq %d len %d. @packet_dl.c(39),ERROR" ID="0x8c28013a" />
<MSG STRUCTURE="diag_log_msg4" NAME="a2dp_audio: adp get buffer ret = %x seq %d len %d size %d. @packet_dl.c(47),ERROR" ID="0x8c28017a" />
<MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: Memory cpy fail! @packet_dl.c(51),ERROR" ID="0x8c28019a" />
- <MSG STRUCTURE="diag_log_msg4" NAME="a2dp_audio: adp put buffer ret = %x seq %d len %d size %d. @packet_dl.c(61),ERROR" ID="0x8c2801ea" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[DADP][BT->AUDIO] Memory is not enough! @packet_dl.c(103),WARNING" ID="0x8c28033b" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[DADP][BT->AUDIO]ipc send audio data fail @packet_dl.c(128),WARNING" ID="0x8c280403" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[DADP][BT->AUDIO]ipc send audio data fail @packet_dl.c(160),WARNING" ID="0x8c280503" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[DADP][SetActiveConnectHandle]HANDLE=0x%x @packet_dl.c(310),INFO" ID="0x8c2809b5" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[DADP]get_mobile_connection_handle fail, can't find link @packet_dl.c(333),INFO" ID="0x8c280a6d" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[DADP]HANDLE=0x%x @packet_dl.c(337),INFO" ID="0x8c280a8d" />
- <MSG STRUCTURE="diag_log_msg3" NAME="[DADP][get_active_device_handle] REMOTE_ADDR=%02x:%02x:**:**:**:%02x @packet_dl.c(380),INFO" ID="0x8c280be5" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="a2dp_audio: adp put buffer ret = %x seq %d len %d size %d. @packet_dl.c(62),ERROR" ID="0x8c2801f2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[DADP][BT->AUDIO] Memory is not enough! @packet_dl.c(105),WARNING" ID="0x8c28034b" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[DADP][BT->AUDIO]ipc send audio data fail @packet_dl.c(130),WARNING" ID="0x8c280413" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[DADP][BT->AUDIO]ipc send audio data fail @packet_dl.c(162),WARNING" ID="0x8c280513" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[DADP][SetActiveConnectHandle]HANDLE=0x%x @packet_dl.c(312),INFO" ID="0x8c2809c5" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[DADP]get_mobile_connection_handle fail, can't find link @packet_dl.c(335),INFO" ID="0x8c280a7d" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[DADP]HANDLE=0x%x @packet_dl.c(339),INFO" ID="0x8c280a9d" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="[DADP][get_active_device_handle] REMOTE_ADDR=%02x:%02x:**:**:**:%02x @packet_dl.c(382),INFO" ID="0x8c280bf5" />
<MSG STRUCTURE="diag_log_msg0" NAME="[ERROR][param]ke_msg_alloc:msg = NULL @ke_msg.c(73),ERROR" ID="0x891a024a" />
<MSG STRUCTURE="diag_log_msg0" NAME="[ERROR]the MSG is not in heap @ke_msg.c(183),ERROR" ID="0x891a05ba" />
<MSG STRUCTURE="diag_log_msg2" NAME="[TIMRE_ADD][STACK_TIMER] TIMER=0x%x, TIME=%u @fsm.c(720),INFO" ID="0x8b581685" />
<MSG STRUCTURE="diag_log_msg0" NAME="[ERROR]p_data is null @bt_tran_task.c(125),ERROR" ID="0x8c9403ea" />
<MSG STRUCTURE="diag_log_msg3" NAME="BT_TRAN:route data:TID&SOF&SID&CID, LEN = 0x%04X%04X, %d @bt_tran_task.c(155),ERROR" ID="0x8c9404da" />
<MSG STRUCTURE="diag_log_msg0" NAME="Error route_id! @bt_tran_task.c(167),ERROR" ID="0x8c94053a" />
- <MSG STRUCTURE="diag_log_msg3" NAME="BT_TRAN:route data:TID&SOF&SID&CID, LEN = 0x%04X%04X, %d @bt_tran_task.c(187),ERROR" ID="0x8c9405da" />
- <MSG STRUCTURE="diag_log_msg3" NAME="BT_TRAN:data:TID&SOF&SID&CID:0x%04X%04X,LEN:%d @bt_tran_task.c(190),ERROR" ID="0x8c9405f2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="INVALID DATA! @bt_tran_task.c(226),ERROR" ID="0x8c940712" />
- <MSG STRUCTURE="diag_log_msg2" NAME="BT_TRAN: TXMCU:ipc send data fail, ret=%d opcode=0x%x @bt_tran_task.c(255),ERROR" ID="0x8c9407fa" />
- <MSG STRUCTURE="diag_log_msg0" NAME="UNKNOW CORE! @bt_tran_task.c(264),ERROR" ID="0x8c940842" />
- <MSG STRUCTURE="diag_log_msg1" NAME="bt tran task framek free property allow_free= %d @bt_tran_task.c(304),INFO" ID="0x8c940985" />
- <MSG STRUCTURE="diag_log_msg1" NAME="pst_property->en_id = 0x%x @bt_tran_task.c(322),INFO" ID="0x8c940a15" />
- <MSG STRUCTURE="diag_log_msg1" NAME="BT_TRAN: data ERROR data_len:%d @bt_tran_task.c(395),WARNING" ID="0x8c940c5b" />
- <MSG STRUCTURE="diag_log_msg2" NAME="BT_TRAN: data ERROR data:0x%08x, 0x%08x @bt_tran_task.c(399),WARNING" ID="0x8c940c7b" />
- <MSG STRUCTURE="diag_log_msg4" NAME="rec mcu error data,tid:0x%x,sof:0x%x,len:0x%04x,opcode:0x%04x @bt_tran_task.c(408),ERROR" ID="0x8c940cc2" />
- <MSG STRUCTURE="diag_log_msg2" NAME="rec data malloc fail opcode:0x%04x,length:(0x%04x) @bt_tran_task.c(426),ERROR" ID="0x8c940d52" />
- <MSG STRUCTURE="diag_log_msg2" NAME="rec data memcpy fail opcode:0x%04x,length:(0x%04x) @bt_tran_task.c(432),ERROR" ID="0x8c940d82" />
- <MSG STRUCTURE="diag_log_msg4" NAME="rec mcu write property fail,tid:0x%x,sof:0x%x,len:0x%04x,opcode:0x%04x @bt_tran_task.c(442),ERROR" ID="0x8c940dd2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="ipc data data len err = %d @bt_tran_task.c(479),ERROR" ID="0x8c940efa" />
- <MSG STRUCTURE="diag_log_msg1" NAME="ipc data data len err = %d @bt_tran_task.c(489),ERROR" ID="0x8c940f4a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="ipc data from M7 error = %d @bt_tran_task.c(493),ERROR" ID="0x8c940f6a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="ipc data from unknow core @bt_tran_task.c(505),ERROR" ID="0x8c940fca" />
- <MSG STRUCTURE="diag_log_msg1" NAME="bt tran task handler osMessageQueueGet fail ret:(%x) @bt_tran_task.c(531),ERROR" ID="0x8c94109a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="bt tran task framek write property en_id = 0x%x @bt_tran_task.c(555),INFO" ID="0x8c94115d" />
- <MSG STRUCTURE="diag_log_msg2" NAME="write Property fail id:0x%x, ret:0x%x @bt_tran_task.c(563),ERROR" ID="0x8c94119a" />
- <MSG STRUCTURE="diag_log_msg2" NAME="bt tran task framek write property fail en_id:%d,ret:%x @bt_tran_task.c(572),ERROR" ID="0x8c9411e2" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="BT_TRAN:route data:TID&SOF&SID&CID=0x%04X%04X,LEN=%d,CNT=%d @bt_tran_task.c(210),ERROR" ID="0x8c940692" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="BT_TRAN:data:TID&SOF&SID&CID:0x%04X%04X,LEN:%d @bt_tran_task.c(213),ERROR" ID="0x8c9406aa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="INVALID DATA! @bt_tran_task.c(249),ERROR" ID="0x8c9407ca" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="BT_TRAN: TXMCU:ipc send data fail, ret=%d opcode=0x%x @bt_tran_task.c(278),ERROR" ID="0x8c9408b2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="UNKNOW CORE! @bt_tran_task.c(287),ERROR" ID="0x8c9408fa" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="bt tran task framek free property allow_free= %d @bt_tran_task.c(327),INFO" ID="0x8c940a3d" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="pst_property->en_id = 0x%x @bt_tran_task.c(345),INFO" ID="0x8c940acd" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="BT_TRAN: data ERROR data_len:%d @bt_tran_task.c(418),WARNING" ID="0x8c940d13" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="BT_TRAN: data ERROR data:0x%08x, 0x%08x @bt_tran_task.c(422),WARNING" ID="0x8c940d33" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="rec mcu error data,tid:0x%x,sof:0x%x,len:0x%04x,opcode:0x%04x @bt_tran_task.c(431),ERROR" ID="0x8c940d7a" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="rec data malloc fail opcode:0x%04x,length:(0x%04x) @bt_tran_task.c(449),ERROR" ID="0x8c940e0a" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="rec data memcpy fail opcode:0x%04x,length:(0x%04x) @bt_tran_task.c(455),ERROR" ID="0x8c940e3a" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="rec mcu write property fail,tid:0x%x,sof:0x%x,len:0x%04x,opcode:0x%04x @bt_tran_task.c(465),ERROR" ID="0x8c940e8a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="ipc data data len err = %d @bt_tran_task.c(502),ERROR" ID="0x8c940fb2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="ipc data data len err = %d @bt_tran_task.c(512),ERROR" ID="0x8c941002" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="ipc data from M7 error = %d @bt_tran_task.c(516),ERROR" ID="0x8c941022" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="ipc data from unknow core @bt_tran_task.c(528),ERROR" ID="0x8c941082" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="bt tran task handler osMessageQueueGet fail ret:(%x) @bt_tran_task.c(554),ERROR" ID="0x8c941152" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="bt tran task framek write property en_id = 0x%x @bt_tran_task.c(578),INFO" ID="0x8c941215" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="write Property fail id:0x%x, ret:0x%x @bt_tran_task.c(586),ERROR" ID="0x8c941252" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="bt tran task framek write property fail en_id:%d,ret:%x @bt_tran_task.c(595),ERROR" ID="0x8c94129a" />
<MSG STRUCTURE="diag_log_msg3" NAME="[lc_sc_lmp_msg_conflict_check] policy=%d, state=%d, current_state=%d @lc_sc.c(763),INFO" ID="0x887c17dd" />
<MSG STRUCTURE="diag_log_msg1" NAME="lc_sc_hci_command_reject no found opcode in tab, opcode=%d @lc_sc.c(1226),ERROR" ID="0x887c2652" />
<MSG STRUCTURE="diag_log_msg1" NAME="[INFO][LC_SC]:in role switch or enc state, to save message id=%d @lc_sc.c(1374),INFO" ID="0x887c2af5" />
-<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: start @bt_ahi_av.c(52),ERROR" ID="0x8c9e01a2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: suspend @bt_ahi_av.c(68),ERROR" ID="0x8c9e0222" />
- <MSG STRUCTURE="diag_log_msg4" NAME="a2dp_audio: set audio param stream_hdl 0x%x shmid 0x%x enable %d result 0x%x @bt_ahi_av.c(106),ERROR" ID="0x8c9e0352" />
- <MSG STRUCTURE="diag_log_msg1" NAME="a2dp_audio: send stream qos flag %d @bt_ahi_av.c(118),ERROR" ID="0x8c9e03b2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: first frame @bt_ahi_av.c(162),ERROR" ID="0x8c9e0512" />
- <MSG STRUCTURE="diag_log_msg1" NAME="a2dp_audio: send stream packet too much %d @bt_ahi_av.c(198),ERROR" ID="0x8c9e0632" />
- <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: alloc buffer fail @bt_ahi_av.c(216),ERROR" ID="0x8c9e06c2" />
- <MSG STRUCTURE="diag_log_msg3" NAME="a2dp_audio: send stream error 0x%x enable %d sta %d @bt_ahi_av.c(229),ERROR" ID="0x8c9e072a" />
- <MSG STRUCTURE="diag_log_msg3" NAME="a2dp_audio: send stream seq %d enable %d sta %d @bt_ahi_av.c(238),ERROR" ID="0x8c9e0772" />
- <MSG STRUCTURE="diag_log_msg2" NAME="a2dp_audio: acquire stream error 0x%x shmid 0x%x @bt_ahi_av.c(249),ERROR" ID="0x8c9e07ca" />
- <MSG STRUCTURE="diag_log_msg4" NAME="a2dp_audio: acquire frame empty cnt %d eos %d size %d pkt_len %d @bt_ahi_av.c(260),ERROR" ID="0x8c9e0822" />
- <MSG STRUCTURE="diag_log_msg2" NAME="a2dp_audio: play state enable %d sta %d @bt_ahi_av.c(265),ERROR" ID="0x8c9e084a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="a2dp_audio: release stream error 0x%x @bt_ahi_av.c(273),ERROR" ID="0x8c9e088a" />
- <MSG STRUCTURE="diag_log_msg2" NAME="a2dp_audio: no stream. enable %d sta %d @bt_ahi_av.c(284),ERROR" ID="0x8c9e08e2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: a2dp service audio task handler @bt_ahi_av.c(294),INFO" ID="0x8c9e0935" />
- <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: start accept @bt_ahi_av.c(324),ERROR" ID="0x8c9e0a22" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: start @bt_ahi_av.c(57),ERROR" ID="0x8c9e01ca" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: suspend @bt_ahi_av.c(73),ERROR" ID="0x8c9e024a" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="a2dp_audio: set audio param stream_hdl 0x%x shmid 0x%x enable %d result 0x%x @bt_ahi_av.c(111),ERROR" ID="0x8c9e037a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="a2dp_audio: send stream qos flag %d @bt_ahi_av.c(123),ERROR" ID="0x8c9e03da" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: first frame @bt_ahi_av.c(167),ERROR" ID="0x8c9e053a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="a2dp_audio: send stream packet too much %d @bt_ahi_av.c(203),ERROR" ID="0x8c9e065a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: alloc buffer fail @bt_ahi_av.c(221),ERROR" ID="0x8c9e06ea" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="a2dp_audio: send stream error 0x%x enable %d sta %d @bt_ahi_av.c(234),ERROR" ID="0x8c9e0752" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="a2dp_audio: send stream seq %d enable %d sta %d @bt_ahi_av.c(243),ERROR" ID="0x8c9e079a" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="a2dp_audio: acquire stream error 0x%x shmid 0x%x @bt_ahi_av.c(254),ERROR" ID="0x8c9e07f2" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="a2dp_audio: acquire frame empty cnt %d eos %d size %d pkt_len %d @bt_ahi_av.c(265),ERROR" ID="0x8c9e084a" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="a2dp_audio: play state enable %d sta %d @bt_ahi_av.c(270),ERROR" ID="0x8c9e0872" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="a2dp_audio: release stream error 0x%x @bt_ahi_av.c(278),ERROR" ID="0x8c9e08b2" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="a2dp_audio: no stream. enable %d sta %d @bt_ahi_av.c(289),ERROR" ID="0x8c9e090a" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: a2dp service audio task handler @bt_ahi_av.c(299),INFO" ID="0x8c9e095d" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: start accept @bt_ahi_av.c(329),ERROR" ID="0x8c9e0a4a" />
</MSG_LOG>
\ No newline at end of file
<MSG STRUCTURE="diag_log_msg3" NAME="stack gap browse rmt service result = 0x%x, svc_count = %d, svc_hdl[0] = 0x%x @bt_ahi_gap.c(365),INFO" ID="0x8c9e0b6d" />
<MSG STRUCTURE="diag_log_msg3" NAME="hfp enable sco:scohdl=0x%x inid=0x%x outid=0x%x @bt_ahi_gap.c(386),INFO" ID="0x8c9e0c15" />
<MSG STRUCTURE="diag_log_msg1" NAME="hfp disable sco:scohdl=0x%x @bt_ahi_gap.c(390),INFO" ID="0x8c9e0c35" />
- <MSG STRUCTURE="diag_log_msg3" NAME="result = 0x%x, handle = 0x%x, service_class = %02x @bt_ahi_gap.c(423),INFO" ID="0x8c9e0d3d" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="result = 0x%x, handle = 0x%x, service_class = %02x @bt_ahi_gap.c(423),ERROR" ID="0x8c9e0d3a" />
<MSG STRUCTURE="diag_log_msg1" NAME="stack gap init, res = 0x%x @bt_ahi_gap.c(435),INFO" ID="0x8c9e0d9d" />
<MSG STRUCTURE="diag_log_msg3" NAME="set bt tx power, hdl=0x%x, power=%d, ret=0x%x @bt_ahi_gap.c(448),INFO" ID="0x8c9e0e05" />
<MSG STRUCTURE="diag_log_msg3" NAME="br gap read rssi, hdl=0x%x, rssi=%d, ret=0x%x @bt_ahi_gap.c(456),INFO" ID="0x8c9e0e45" />
<MSG STRUCTURE="diag_log_msg1" NAME="spp srv register ret=0x%x @bt_ahi_spp.c(38),INFO" ID="0x8c9e0135" />
<MSG STRUCTURE="diag_log_msg0" NAME="memory copy failed @bt_ahi_spp.c(58),ERROR" ID="0x8c9e01d2" />
<MSG STRUCTURE="diag_log_msg1" NAME="spp srv unregister ret=0x%x @bt_ahi_spp.c(63),INFO" ID="0x8c9e01fd" />
- <MSG STRUCTURE="diag_log_msg2" NAME="spp read stream ret=0x%x len=%d @bt_ahi_spp.c(112),WARNING" ID="0x8c9e0383" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="spp read stream ret=0x%x len=%d @bt_ahi_spp.c(112),INFO" ID="0x8c9e0385" />
<MSG STRUCTURE="diag_log_msg0" NAME="memory copy failed @bt_ahi_spp.c(140),ERROR" ID="0x8c9e0462" />
<MSG STRUCTURE="diag_log_msg0" NAME="memory copy failed @bt_ahi_spp.c(148),ERROR" ID="0x8c9e04a2" />
- <MSG STRUCTURE="diag_log_msg2" NAME="spp write stream ret=0x%x bytes_written=%d @bt_ahi_spp.c(151),WARNING" ID="0x8c9e04bb" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="spp write stream ret=0x%x bytes_written=%d @bt_ahi_spp.c(151),INFO" ID="0x8c9e04bd" />
</MSG_LOG>
\ No newline at end of file
<MSG STRUCTURE="diag_log_msg0" NAME="[ERROR]p_data is null @bt_tran_task.c(125),ERROR" ID="0x8c9403ea" />
<MSG STRUCTURE="diag_log_msg3" NAME="BT_TRAN:route data:TID&SOF&SID&CID, LEN = 0x%04X%04X, %d @bt_tran_task.c(155),ERROR" ID="0x8c9404da" />
<MSG STRUCTURE="diag_log_msg0" NAME="Error route_id! @bt_tran_task.c(167),ERROR" ID="0x8c94053a" />
- <MSG STRUCTURE="diag_log_msg3" NAME="BT_TRAN:route data:TID&SOF&SID&CID, LEN = 0x%04X%04X, %d @bt_tran_task.c(187),ERROR" ID="0x8c9405da" />
- <MSG STRUCTURE="diag_log_msg3" NAME="BT_TRAN:data:TID&SOF&SID&CID:0x%04X%04X,LEN:%d @bt_tran_task.c(190),ERROR" ID="0x8c9405f2" />
- <MSG STRUCTURE="diag_log_msg0" NAME="INVALID DATA! @bt_tran_task.c(226),ERROR" ID="0x8c940712" />
- <MSG STRUCTURE="diag_log_msg2" NAME="BT_TRAN: TXMCU:ipc send data fail, ret=%d opcode=0x%x @bt_tran_task.c(255),ERROR" ID="0x8c9407fa" />
- <MSG STRUCTURE="diag_log_msg0" NAME="UNKNOW CORE! @bt_tran_task.c(264),ERROR" ID="0x8c940842" />
- <MSG STRUCTURE="diag_log_msg1" NAME="bt tran task framek free property allow_free= %d @bt_tran_task.c(304),INFO" ID="0x8c940985" />
- <MSG STRUCTURE="diag_log_msg1" NAME="pst_property->en_id = 0x%x @bt_tran_task.c(322),INFO" ID="0x8c940a15" />
- <MSG STRUCTURE="diag_log_msg1" NAME="BT_TRAN: data ERROR data_len:%d @bt_tran_task.c(395),WARNING" ID="0x8c940c5b" />
- <MSG STRUCTURE="diag_log_msg2" NAME="BT_TRAN: data ERROR data:0x%08x, 0x%08x @bt_tran_task.c(399),WARNING" ID="0x8c940c7b" />
- <MSG STRUCTURE="diag_log_msg4" NAME="rec mcu error data,tid:0x%x,sof:0x%x,len:0x%04x,opcode:0x%04x @bt_tran_task.c(408),ERROR" ID="0x8c940cc2" />
- <MSG STRUCTURE="diag_log_msg2" NAME="rec data malloc fail opcode:0x%04x,length:(0x%04x) @bt_tran_task.c(426),ERROR" ID="0x8c940d52" />
- <MSG STRUCTURE="diag_log_msg2" NAME="rec data memcpy fail opcode:0x%04x,length:(0x%04x) @bt_tran_task.c(432),ERROR" ID="0x8c940d82" />
- <MSG STRUCTURE="diag_log_msg4" NAME="rec mcu write property fail,tid:0x%x,sof:0x%x,len:0x%04x,opcode:0x%04x @bt_tran_task.c(442),ERROR" ID="0x8c940dd2" />
- <MSG STRUCTURE="diag_log_msg1" NAME="ipc data data len err = %d @bt_tran_task.c(479),ERROR" ID="0x8c940efa" />
- <MSG STRUCTURE="diag_log_msg1" NAME="ipc data data len err = %d @bt_tran_task.c(489),ERROR" ID="0x8c940f4a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="ipc data from M7 error = %d @bt_tran_task.c(493),ERROR" ID="0x8c940f6a" />
- <MSG STRUCTURE="diag_log_msg0" NAME="ipc data from unknow core @bt_tran_task.c(505),ERROR" ID="0x8c940fca" />
- <MSG STRUCTURE="diag_log_msg1" NAME="bt tran task handler osMessageQueueGet fail ret:(%x) @bt_tran_task.c(531),ERROR" ID="0x8c94109a" />
- <MSG STRUCTURE="diag_log_msg1" NAME="bt tran task framek write property en_id = 0x%x @bt_tran_task.c(555),INFO" ID="0x8c94115d" />
- <MSG STRUCTURE="diag_log_msg2" NAME="write Property fail id:0x%x, ret:0x%x @bt_tran_task.c(563),ERROR" ID="0x8c94119a" />
- <MSG STRUCTURE="diag_log_msg2" NAME="bt tran task framek write property fail en_id:%d,ret:%x @bt_tran_task.c(572),ERROR" ID="0x8c9411e2" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="BT_TRAN:route data:TID&SOF&SID&CID=0x%04X%04X,LEN=%d,CNT=%d @bt_tran_task.c(210),ERROR" ID="0x8c940692" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="BT_TRAN:data:TID&SOF&SID&CID:0x%04X%04X,LEN:%d @bt_tran_task.c(213),ERROR" ID="0x8c9406aa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="INVALID DATA! @bt_tran_task.c(249),ERROR" ID="0x8c9407ca" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="BT_TRAN: TXMCU:ipc send data fail, ret=%d opcode=0x%x @bt_tran_task.c(278),ERROR" ID="0x8c9408b2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="UNKNOW CORE! @bt_tran_task.c(287),ERROR" ID="0x8c9408fa" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="bt tran task framek free property allow_free= %d @bt_tran_task.c(327),INFO" ID="0x8c940a3d" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="pst_property->en_id = 0x%x @bt_tran_task.c(345),INFO" ID="0x8c940acd" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="BT_TRAN: data ERROR data_len:%d @bt_tran_task.c(418),WARNING" ID="0x8c940d13" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="BT_TRAN: data ERROR data:0x%08x, 0x%08x @bt_tran_task.c(422),WARNING" ID="0x8c940d33" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="rec mcu error data,tid:0x%x,sof:0x%x,len:0x%04x,opcode:0x%04x @bt_tran_task.c(431),ERROR" ID="0x8c940d7a" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="rec data malloc fail opcode:0x%04x,length:(0x%04x) @bt_tran_task.c(449),ERROR" ID="0x8c940e0a" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="rec data memcpy fail opcode:0x%04x,length:(0x%04x) @bt_tran_task.c(455),ERROR" ID="0x8c940e3a" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="rec mcu write property fail,tid:0x%x,sof:0x%x,len:0x%04x,opcode:0x%04x @bt_tran_task.c(465),ERROR" ID="0x8c940e8a" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="ipc data data len err = %d @bt_tran_task.c(502),ERROR" ID="0x8c940fb2" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="ipc data data len err = %d @bt_tran_task.c(512),ERROR" ID="0x8c941002" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="ipc data from M7 error = %d @bt_tran_task.c(516),ERROR" ID="0x8c941022" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="ipc data from unknow core @bt_tran_task.c(528),ERROR" ID="0x8c941082" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="bt tran task handler osMessageQueueGet fail ret:(%x) @bt_tran_task.c(554),ERROR" ID="0x8c941152" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="bt tran task framek write property en_id = 0x%x @bt_tran_task.c(578),INFO" ID="0x8c941215" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="write Property fail id:0x%x, ret:0x%x @bt_tran_task.c(586),ERROR" ID="0x8c941252" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="bt tran task framek write property fail en_id:%d,ret:%x @bt_tran_task.c(595),ERROR" ID="0x8c94129a" />
</MSG_LOG>
\ No newline at end of file
<MSG_LOG><MSG STRUCTURE="diag_log_msg4" NAME="ap => bt ipc error, get cpu trace ret=%d, bt pc=0x%x, lr=0x%x, sp=0x%x, @ipc.c(417),ERROR" ID="0xa02a0d0a" />
- <MSG STRUCTURE="diag_log_msg4" NAME="ipc error core %d => %d action=%d, called=0x%X @ipc.c(707),ERROR" ID="0xa02a161a" />
- <MSG STRUCTURE="diag_log_msg4" NAME="ipc error, core=%d current pc=0x%x, lr=0x%x, sp=0x%x @ipc.c(709),ERROR" ID="0xa02a162a" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="ipc error core %d => %d action=%d, called=0x%X @ipc.c(708),ERROR" ID="0xa02a1622" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="ipc error, core=%d current pc=0x%x, lr=0x%x, sp=0x%x @ipc.c(710),ERROR" ID="0xa02a1632" />
</MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg0" NAME="ld_acl_sniff_evt_start_cbk start @ld_acl_sniff_ram.c(41),WARNING" ID="0x8a0a014b" />
- <MSG STRUCTURE="diag_log_msg4" NAME="[diff_sched_prog illegal] diff_sched_prog=%d timestamp=%d, rx_win_size=%d, last_sync=%d @ld_acl_sniff_ram.c(102),WARNING" ID="0x8a0a0333" />
- <MSG STRUCTURE="diag_log_msg2" NAME="[ERROR]ld_acl_sniff_evt_start_cbk:cs_idx = %d, att_nb = %d @ld_acl_sniff_ram.c(152),ERROR" ID="0x8a0a04c2" />
- <MSG STRUCTURE="diag_log_msg4" NAME="ld_acl_sniff_evt_start_cbk clock(0x%x)prog_clock(0x%x)last_sync_ts(0x%x)link_id(%d) @ld_acl_sniff_ram.c(184),INFO" ID="0x8a0a05c5" />
- <MSG STRUCTURE="diag_log_msg4" NAME="ld_acl_sniff_evt_start_cbk new_clk_off(0x%x)new_bit_off(%d)rx_win_size(%d)sched_att(%d) @ld_acl_sniff_ram.c(186),INFO" ID="0x8a0a05d5" />
- <MSG STRUCTURE="diag_log_msg4" NAME="ld_acl_sniff_evt_start_cbk last_anchr_rxstat(0x%x)last_anchor_rxch(%d)last_anchr_rxssi(%d)et_prio(%d) @ld_acl_sniff_ram.c(190),INFO" ID="0x8a0a05f5" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg4" NAME="[diff_sched_prog illegal] diff_sched_prog=%d timestamp=%d, rx_win_size=%d, last_sync=%d @ld_acl_sniff_ram.c(101),WARNING" ID="0x8a0a032b" />
+ <MSG STRUCTURE="diag_log_msg2" NAME="[ERROR]ld_acl_sniff_evt_start_cbk:cs_idx = %d, att_nb = %d @ld_acl_sniff_ram.c(151),ERROR" ID="0x8a0a04ba" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="ld_acl_sniff_evt_start_cbk clock(0x%x)prog_clock(0x%x)last_sync_ts(0x%x)link_id(%d) @ld_acl_sniff_ram.c(183),INFO" ID="0x8a0a05bd" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="ld_acl_sniff_evt_start_cbk new_clk_off(0x%x)new_bit_off(%d)rx_win_size(%d)sched_att(%d) @ld_acl_sniff_ram.c(185),INFO" ID="0x8a0a05cd" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="ld_acl_sniff_evt_start_cbk last_anchr_rxstat(0x%x)last_anchor_rxch(%d)last_anchr_rxssi(%d)et_prio(%d) @ld_acl_sniff_ram.c(189),INFO" ID="0x8a0a05ed" />
</MSG_LOG>
\ No newline at end of file
<MSG_LOG><MSG STRUCTURE="diag_log_msg3" NAME="a2dp_audio: send audio data enable = %x seq %d len %d. @packet_dl.c(39),ERROR" ID="0x8c28013a" />
<MSG STRUCTURE="diag_log_msg4" NAME="a2dp_audio: adp get buffer ret = %x seq %d len %d size %d. @packet_dl.c(47),ERROR" ID="0x8c28017a" />
<MSG STRUCTURE="diag_log_msg0" NAME="a2dp_audio: Memory cpy fail! @packet_dl.c(51),ERROR" ID="0x8c28019a" />
- <MSG STRUCTURE="diag_log_msg4" NAME="a2dp_audio: adp put buffer ret = %x seq %d len %d size %d. @packet_dl.c(61),ERROR" ID="0x8c2801ea" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[DADP][BT->AUDIO] Memory is not enough! @packet_dl.c(103),WARNING" ID="0x8c28033b" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[DADP][BT->AUDIO]ipc send audio data fail @packet_dl.c(128),WARNING" ID="0x8c280403" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[DADP][BT->AUDIO]ipc send audio data fail @packet_dl.c(160),WARNING" ID="0x8c280503" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[DADP][SetActiveConnectHandle]HANDLE=0x%x @packet_dl.c(310),INFO" ID="0x8c2809b5" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[DADP]get_mobile_connection_handle fail, can't find link @packet_dl.c(333),INFO" ID="0x8c280a6d" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[DADP]HANDLE=0x%x @packet_dl.c(337),INFO" ID="0x8c280a8d" />
- <MSG STRUCTURE="diag_log_msg3" NAME="[DADP][get_active_device_handle] REMOTE_ADDR=%02x:%02x:**:**:**:%02x @packet_dl.c(380),INFO" ID="0x8c280be5" />
+ <MSG STRUCTURE="diag_log_msg4" NAME="a2dp_audio: adp put buffer ret = %x seq %d len %d size %d. @packet_dl.c(62),ERROR" ID="0x8c2801f2" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[DADP][BT->AUDIO] Memory is not enough! @packet_dl.c(105),WARNING" ID="0x8c28034b" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[DADP][BT->AUDIO]ipc send audio data fail @packet_dl.c(130),WARNING" ID="0x8c280413" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[DADP][BT->AUDIO]ipc send audio data fail @packet_dl.c(162),WARNING" ID="0x8c280513" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[DADP][SetActiveConnectHandle]HANDLE=0x%x @packet_dl.c(312),INFO" ID="0x8c2809c5" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[DADP]get_mobile_connection_handle fail, can't find link @packet_dl.c(335),INFO" ID="0x8c280a7d" />
+ <MSG STRUCTURE="diag_log_msg1" NAME="[DADP]HANDLE=0x%x @packet_dl.c(339),INFO" ID="0x8c280a9d" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="[DADP][get_active_device_handle] REMOTE_ADDR=%02x:%02x:**:**:**:%02x @packet_dl.c(382),INFO" ID="0x8c280bf5" />
</MSG_LOG>
\ No newline at end of file
<MSG STRUCTURE="diag_log_msg0" NAME="[AVDTP][GET_SEP_FAIL] Can not get sep info @patch_bth.c(156),WARNING" ID="0x8d5404e3" />
<MSG STRUCTURE="diag_log_msg0" NAME="[STACK][RECV_RING_STOP] @patch_bth.c(244),INFO" ID="0x8d5407a5" />
<MSG STRUCTURE="diag_log_msg3" NAME="[ATT_GATT] att error rsp opcode:0x%x handle:%d error:0x%x @patch_bth.c(324),ERROR" ID="0x8d540a22" />
- <MSG STRUCTURE="diag_log_msg0" NAME="[SMP]PAIRING_REQ_RECV @patch_bth.c(501),ERROR" ID="0x8d540faa" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="[SMP]PAIRING_REQ_RECV @patch_bth.c(503),ERROR" ID="0x8d540fba" />
</MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg4" NAME="[BLE ACL] conhdl=%d, status:0x%04x, length:%d, rxflush|rxdone|cie:%08x @patch_lld_pdu.c(44),INFO" ID="0x8a540165" />
- <MSG STRUCTURE="diag_log_msg1" NAME="[BLE ACL] ccm 0x%x @patch_lld_pdu.c(45),INFO" ID="0x8a54016d" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg4" NAME="[BLE ACL] conhdl=%d, status:0x%04x, length:%d, rxflush|rxdone|cie:%08x @patch_lld_pdu.c(45),INFO" ID="0x8a54016d" />
</MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg3" NAME="a2dp_audio: rpt stream state stream_hdl %p state %d src %d @sdk_av.c(813),WARNING" ID="0x8b86196b" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg3" NAME="a2dp_audio: rpt stream state stream_hdl %p state %d src %d @sdk_av.c(813),ERROR" ID="0x8b86196a" />
</MSG_LOG>
\ No newline at end of file
-<MSG_LOG><MSG STRUCTURE="diag_log_msg2" NAME="btsdk_is_device_connected hdl:0x%x status:%d @sdk_gap_conn_management.c(608),INFO" ID="0x8b821305" />
+<MSG_LOG><MSG STRUCTURE="diag_log_msg2" NAME="btsdk_is_device_connected hdl:0x%x status:%d @sdk_gap_conn_management.c(613),INFO" ID="0x8b82132d" />
</MSG_LOG>
\ No newline at end of file
<MSG STRUCTURE="diag_log_msg0" NAME="memory alloc failed @sdk_spp.c(188),ERROR" ID="0x8b6c05e2" />
<MSG STRUCTURE="diag_log_msg1" NAME="memcpy failed len=%d @sdk_spp.c(197),ERROR" ID="0x8b6c062a" />
<MSG STRUCTURE="diag_log_msg2" NAME="spp rcv data hdl=0x%x len=%d @sdk_spp.c(203),INFO" ID="0x8b6c065d" />
- <MSG STRUCTURE="diag_log_msg0" NAME="memory alloc failed @sdk_spp.c(255),ERROR" ID="0x8b6c07fa" />
- <MSG STRUCTURE="diag_log_msg2" NAME="[sdk][spp]send_app_event: hdl=0x%x ev=0x%x @sdk_spp.c(261),INFO" ID="0x8b6c082d" />
+ <MSG STRUCTURE="diag_log_msg0" NAME="memory alloc failed @sdk_spp.c(257),ERROR" ID="0x8b6c080a" />
+ <MSG STRUCTURE="diag_log_msg3" NAME="[sdk][spp]send_app_event: hdl=0x%x ev=0x%x cnt=%d @sdk_spp.c(264),ERROR" ID="0x8b6c0842" />
</MSG_LOG>
\ No newline at end of file
#include "los_percpu_pri.h"
#include "los_hwi.h"
#include "los_spinlock_pri.h"
+#ifdef LOSCFG_SYSTEM_VIEW
+#include "SEGGER_SYSVIEW_LiteOS.h"
+#endif
#ifdef __cplusplus
extern "C" {
if (OsPriQueueIsEmpty(runTask->priority)) {
return LOS_ERRNO_TSK_YIELD_NOT_ENOUGH_TASK;
}
-
+#ifdef LOSCFG_SYSTEM_VIEW
+ traceMOVED_TASK_TO_READY_STATE(runTask);
+#endif
runTask->taskStatus |= OS_TASK_STATUS_READY;
OsPriQueueEnqueue(&runTask->pendList, runTask->priority, PRI_QUEUE_TAIL);
#endif
*taskId = taskCB->taskId;
-
+#ifdef LOSCFG_SYSTEM_VIEW
+ traceTASK_CREATE(taskCB);
+#endif
return LOS_OK;
LOS_ERREND_REWIND_TCB:
if (!OsPreemptable()) {
return LOS_ERRNO_TSK_DELAY_IN_LOCK;
}
-
+#ifdef LOSCFG_SYSTEM_VIEW
+ traceMOVED_TASK_TO_DELAYED_LIST(runTask);
+#endif
if (tick == 0) {
return LOS_TaskYield();
} else {
{
LOS_ASSERT(LOS_SpinHeld(&g_taskSpin));
+#ifdef LOSCFG_SYSTEM_VIEW
+ traceMOVED_TASK_TO_OVERFLOW_DELAYED_LIST(runTask);
+#endif
runTask->taskStatus |= OS_TASK_STATUS_PEND;
LOS_ListTailInsert(list, &runTask->pendList);
if (timeout != LOS_WAIT_FOREVER) {
}
if (!(resumedTask->taskStatus & (OS_TASK_STATUS_SUSPEND))) {
+#ifdef LOSCFG_SYSTEM_VIEW
+ traceMOVED_TASK_TO_READY_STATE(resumedTask);
+#endif
resumedTask->taskStatus |= OS_TASK_STATUS_READY;
OsPriQueueEnqueue(&resumedTask->pendList, resumedTask->priority, PRI_QUEUE_TAIL);
}
#include "los_perf.h"
+#ifdef LOSCFG_SYSTEM_VIEW
+#include "SEGGER_SYSVIEW_LiteOS.h"
+#endif
+
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
g_traceEventHook(TYPE, _inner[1], _n > 2 ? &_inner[2] : NULL, _n - 2); \
} \
} while (0)
+#elif defined(LOSCFG_SYSTEM_VIEW)
+#define LOS_TRACE(TYPE, ...) LOS_TRACE_##TYPE(__VA_ARGS__)
#else
#define LOS_TRACE(TYPE, ...) LOS_PERF(TYPE)
#endif
${ROOT_DIR}/drivers/chips/${CHIP}/include/
${ROOT_DIR}/middleware/utils/common_headers/
${ROOT_DIR}/include
+ ${ROOT_DIR}/application/wearable/SystemView/Src/SEGGER
+ ${ROOT_DIR}/application/wearable/SystemView/Src/Config
+ ${ROOT_DIR}/application/wearable/SystemView/Src/Sample/LiteOS
+
)
list(APPEND LOCAL_SRCS_y ${USER_SRC_TEMP})
LOSCFG_CC_STACKPROTECTOR_STRONG=y
# LOSCFG_CC_STACKPROTECTOR_ALL is not set
# end of Stack Smashing Protector (SSP) Compiler Feature
+
+#
+# SystemView Feature Switch
+#
+# LOSCFG_SYSTEM_VIEW is not set
if (ret != ERRCODE_SUCC) {
return ret;
}
-#ifdef USER_VERSION
diag_highest_level_proc(DIAG_LOG_LEVEL_WARN);
+#ifdef USER_VERSION
mon_log_output_ctrl_init();
mon_log_output_enable(true);
#endif
UI_KALEIDOSCOPE_VIEW_CPP,
KALEIDOSCOPE_UTILS_CPP,
UI_COVERFLOW_VIEW_CPP,
+ UI_COVERFLOW_VIEW2_CPP,
UI_ROLLER_VIEW_CPP,
UI_ICOSAHEDRON_VIEW_CPP,
UI_MAP_VIEW_CPP,
UI_PINYIN_CANDIDATE_CPP,
HEXAGONSTRANSITION_CPP,
BACKTOHEXAGONSTRANSITION_CPP,
+ UI_TRANSFORM_GROUP_CPP,
+ TURN_PAGE_VIEW_CPP,
+ TURN_PAGE_EFFECT_CPP,
+ NATIVEREGISTERMANAGER_CPP,
+ DFX_FRAME_TRACE_CPP,
FILE_ID_MAX = 1024,
} log_file_list_enum_gui_t;
#endif
JSI_CPP,
APP_MODULE_CPP,
DEVICE_MODULE_CPP,
+ VIBRATOR_MODULE_CPP,
+ BATTERY_MODULE_CPP,
+ SENSOR_MODULE_CPP,
DFX_MODULE_CPP,
DIALOG_MODULE_CPP,
LOCALE_MODULE_CPP,
para->no = om_log->header.sn;\r
para->buf = sdt_buf + sizeof(om_log_header_t);\r
para->buf_size = (uint16_t)(sdt_buf_size - sizeof(om_log_header_t) - sizeof(uint8_t));\r
- para->level = (uint8_t)log_level_trans(sdt_level);\r
+ para->level = DIAG_LOG_LEVEL_ERROR;\r
}\r
\r
static void zdiag_adapt_sdt_om_status_parse(uint8_t *sdt_buf, uint16_t sdt_buf_size, diag_msg_para_t *para)\r
para->no = om_status->header.sn;\r
para->buf = om_status->data;\r
para->buf_size = om_status->data_len;\r
- para->level = DIAG_LOG_LEVEL_INFO;\r
+ para->level = DIAG_LOG_LEVEL_ERROR;\r
}\r
\r
static void zdiag_adapt_sdt_om_ota_parse(uint8_t *sdt_buf, uint16_t sdt_buf_size, diag_msg_para_t *para)\r
para->no = om_ota->header.sn;\r
para->buf = sdt_buf + sizeof(om_ota_header_t);\r
para->buf_size = (uint16_t)(sdt_buf_size - sizeof(om_ota_header_t) - sizeof(uint8_t));\r
- para->level = DIAG_LOG_LEVEL_INFO;\r
+ para->level = DIAG_LOG_LEVEL_ERROR;\r
}\r
\r
static void zdiag_adapt_sdt_om_last_parse(uint8_t *sdt_buf, uint16_t sdt_buf_size, diag_msg_para_t *para)\r
para->no = om_last->msg_header.sn;\r
para->buf = sdt_buf + sizeof(om_msg_header_stru_t);\r
para->buf_size = (uint16_t)(sdt_buf_size - sizeof(om_msg_header_stru_t) - sizeof(uint8_t));\r
- para->level = DIAG_LOG_LEVEL_INFO;\r
+ para->level = DIAG_LOG_LEVEL_ERROR;\r
}\r
\r
static void zdiag_adapt_sdt_msg_report(uint8_t *sdt_buf, uint16_t sdt_buf_size)\r
void diag_auto_log_report_enable(void)\r
{\r
uint32_t level[] = {\r
-#ifndef USER_VERSION\r
- DIAG_LOG_LEVEL_DBG,\r
-#endif\r
- DIAG_LOG_LEVEL_INFO,\r
DIAG_LOG_LEVEL_WARN,\r
DIAG_LOG_LEVEL_ERROR,\r
};\r
#include <stdbool.h>
#include "hal_reboot.h"
#include "chip_io.h"
+#include "sys/stat.h"
+#include "fcntl.h"
+#include "unistd.h"
#define STATUS_ADDRESS 0x5702C1E8
#define VBUS_INSERT_POS 4
return true;
}
return false;
+}
+
+static int32_t mkdir_all_path(const char *path)
+{
+ int path_len = (int)strlen(path);
+ if (path_len <= 0) {
+ return -1;
+ }
+
+ char *str_path = (char *)malloc((uint32_t)path_len + 1);
+ if (str_path == NULL) {
+ return -1;
+ }
+ (void)memset_s(str_path, (uint32_t)path_len + 1, 0, (uint32_t)path_len + 1);
+ if (strcpy_s(str_path, (uint32_t)path_len + 1, path) != 0) {
+ free(str_path);
+ return -1;
+ }
+
+ for (int i = 0; i < path_len; i++) {
+ if (i > 0 && str_path[i] == '/') {
+ str_path[i] = '\0';
+ if (access(str_path, 0) == 0) {
+ str_path[i] = '/';
+ continue;
+ }
+ if (mkdir(str_path, S_IREAD | S_IWRITE) != 0) {
+ free(str_path);
+ return -1;
+ }
+ str_path[i] = '/';
+ }
+ }
+ free(str_path);
+ return 0;
+}
+
+int32_t write_fileinfo(const char *path, uint32_t offset, const uint8_t *buf, uint32_t size)
+{
+ int fd;
+ int ret;
+ ssize_t len;
+ fd = open(path, O_RDWR | O_CREAT, 0);
+ if (fd < 0) {
+ if (mkdir_all_path(path) != 0) {
+ return -1;
+ }
+ fd = open(path, O_RDWR | O_CREAT, 0);
+ if (fd < 0) {
+ return -1;
+ }
+ }
+ int pos = (int)lseek(fd, offset, SEEK_SET);
+ if (pos < 0) {
+ return -1;
+ }
+ len = write(fd, buf, size);
+ if (len < 0) {
+ return -1;
+ }
+ ret = close(fd);
+ if (ret < 0) {
+ return -1;
+ }
+ return len;
}
\ No newline at end of file
* @return true if PWREN is pressed, false otherwise.
*/
bool is_pwren_press(void);
+
+/**
+ * @brief create a file and write info
+ * @return write length
+ */
+int32_t write_fileinfo(const char *path, uint32_t offset, const uint8_t *buf, uint32_t size);
#endif
#include "time.h"
#include "sys/time.h"
#include "chip_io.h"
+#include "flash.h"
+#include "soc_osal.h"
+#include "vectors.h"
+#include "chip_exception_utils.h"
+
+#define MAX_FILE_NAME_LENGTH 100
+#define REGS_BUFF_SIZE 500
+
#ifdef CFG_DRIVERS_NANDFLASH
#include "nandflash_config.h"
-
#define PSRAM_DUMP_TO_FILE_LENGTH 0x40000 // 256KB
void exception_dump_memory_to_file(char *file_name, uint32_t dump_time, uintptr_t startAddr, uint32_t length)
{
- char *str = (char *)malloc(200);
- memset_s(str, 200, 0, 200);
- sprintf(str, file_name, dump_time);
+ char *str = (char *)malloc(MAX_FILE_NAME_LENGTH);
+ memset_s(str, MAX_FILE_NAME_LENGTH, 0, MAX_FILE_NAME_LENGTH);
+ sprintf_s(str, MAX_FILE_NAME_LENGTH, file_name, dump_time);
exc_info_write(str, 0, (const uint8_t *)startAddr, length);
}
#endif
#ifdef CFG_DUMP_REG_SUPPORT
-char *g_regist_str = "[PMU1_B_SOC_PWR_EN_REG %x, %x]\r\n
- [PMU1_BT_CBB_PWR_EN_REG %x, %x]\r\n
- [PMU1_BMEM_PWR_EN_REG %x, %x]\r\n
- [PMU1_BT_EM_PWR_EN_REG %x, %x]\r\n
- [PMU1_MCU_HS_PWR_EN_REG %x, %x]\r\n
- [PMU1_DSUB_PWR_EN_REG %x, %x]\r\n
- [PMU1_ASUB_PWR_EN_REG %x, %x]\r\n
- [PMU1_S_EGPIO_PWR_EN_REG %x, %x]\r\n
- [PMU1_BT_RF_PWR_EN_REG %x, %x]\r\n
- [PMU1_MCU_PWR_EN_REG %x, %x]\r\n
- [PMU1_MEM_PWR_EN_REG %x, %x]\r\n
- [PMU1_COM_PWR_EN_REG %x, %x]";
+char *g_regist_str = "[PMU1_B_SOC_PWR_EN_REG %x, %x]\r\n[PMU1_BT_CBB_PWR_EN_REG %x, %x]\r\n[PMU1_BMEM_PWR_EN_REG %x, %x]\r\n[PMU1_BT_EM_PWR_EN_REG %x, %x]\r\n[PMU1_MCU_HS_PWR_EN_REG %x, %x]\r\n[PMU1_DSUB_PWR_EN_REG %x, %x]\r\n[PMU1_ASUB_PWR_EN_REG %x, %x]\r\n[PMU1_S_EGPIO_PWR_EN_REG %x, %x]\r\n[PMU1_BT_RF_PWR_EN_REG %x, %x]\r\n[PMU1_MCU_PWR_EN_REG %x, %x]\r\n[PMU1_MEM_PWR_EN_REG %x, %x]\r\n[PMU1_COM_PWR_EN_REG %x, %x]";
static const char *g_reg_path = "/user/exc/reg_path%d.txt";
void dump_reg_to_file(uint32_t time_sec)
{
- char *file_name = (char *)malloc(100);
- sprintf(file_name, g_reg_path, time_sec);
- char *str = (char *)malloc(500);
+ char *file_name = (char *)malloc(MAX_FILE_NAME_LENGTH);
+ sprintf_s(file_name, MAX_FILE_NAME_LENGTH, g_reg_path, time_sec);
+ char *str = (char *)malloc(REGS_BUFF_SIZE);
uint32_t ctrl_base = 0x57004000;
- sprintf(str, g_regist_str,
+ sprintf_s(str, REGS_BUFF_SIZE, g_regist_str,
ctrl_base + 0x20, readl(ctrl_base + 0x20),
ctrl_base + 0x24, readl(ctrl_base + 0x24),
ctrl_base + 0x28, readl(ctrl_base + 0x28),
#ifdef CFG_DUMP_REG_SUPPORT
dump_reg_to_file(timestamp);
#endif
+}
+
+#define MAGIC_SIZE 8
+#define NORFLASH_TRACE_START 0x3d000
+#define NORFLASH_DEBUG_LENGTH 0x3000
+#define NORFLASH_DEVIATION 0x70000000
+static const char *g_trace_in_norflash = "/user/exc/norflash_trace_%s_%d.bin";
+static const char *g_exc_in_norflash = "/user/exc/norflash_exc_%s_%d.bin";
+void write_trace(exc_context_t *exc_buff_addr)
+{
+#if defined(BUILD_APPLICATION_STANDARD) && !defined(BUILD_RECOVERY_IMAGE)
+ uint8_t magic_array[MAGIC_SIZE] = {0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a};
+ uapi_flash_exit_from_xip_mode(CHIP_FLASH_ID);
+ uapi_flash_write_data(CHIP_FLASH_ID, NORFLASH_TRACE_START, magic_array, MAGIC_SIZE);
+ uapi_flash_write_data(CHIP_FLASH_ID,
+ NORFLASH_TRACE_START + MAGIC_SIZE,
+ (const uint8_t *)MCPU_TRACE_MEM_REGION_START,
+ CPU_TRACE_MEM_REGION_LENGTH);
+ uint32_t exc_buff_size = sizeof(exc_context_t);
+ uapi_flash_write_data(
+ CHIP_FLASH_ID, NORFLASH_TRACE_START + MAGIC_SIZE + CPU_TRACE_MEM_REGION_LENGTH, exc_buff_addr, exc_buff_size);
+ uapi_flash_switch_to_xip_mode(CHIP_FLASH_ID);
+#endif
+}
+
+void dump_norflash_trace_to_file(void)
+{
+#if defined(BUILD_APPLICATION_STANDARD) && !defined(BUILD_RECOVERY_IMAGE)
+ if (readl(NORFLASH_DEVIATION + NORFLASH_TRACE_START) == 0x5a5a5a5a) {
+ uint32_t current_time = get_local_timestamp();
+ char file_name_buff[MAX_FILE_NAME_LENGTH];
+ uint32_t exc_buff_size = sizeof(exc_context_t);
+ sprintf_s(file_name_buff, MAX_FILE_NAME_LENGTH, g_trace_in_norflash, "FIRMWARE_VERSION", current_time);
+ write_fileinfo(file_name_buff,
+ 0,
+ (const uint8_t *)(NORFLASH_DEVIATION + NORFLASH_TRACE_START + MAGIC_SIZE),
+ CPU_TRACE_MEM_REGION_LENGTH);
+ memset_s(file_name_buff, MAX_FILE_NAME_LENGTH, 0, MAX_FILE_NAME_LENGTH);
+ sprintf_s(file_name_buff, MAX_FILE_NAME_LENGTH, g_exc_in_norflash, "FIRMWARE_VERSION", current_time);
+ write_fileinfo(file_name_buff,
+ 0,
+ (const uint8_t *)(NORFLASH_DEVIATION + NORFLASH_TRACE_START + MAGIC_SIZE + CPU_TRACE_MEM_REGION_LENGTH),
+ exc_buff_size);
+ unsigned int irq_sts = osal_irq_lock();
+ if (uapi_flash_exit_from_xip_mode(0) != ERRCODE_SUCC) {
+ return;
+ }
+ uapi_flash_block_erase(CHIP_FLASH_ID, NORFLASH_TRACE_START, NORFLASH_DEBUG_LENGTH, true);
+ if (uapi_flash_switch_to_xip_mode(0) != ERRCODE_SUCC) {
+ return;
+ }
+ osal_irq_restore(irq_sts);
+ }
+#endif
+}
+
+void printcpu_tracemem(void)
+{
+ uint32_t colum = 16;
+ uint32_t line = CPU_TRACE_MEM_REGION_LENGTH / colum;
+ for (uint32_t j = 0; j < line; j++) {
+ for (uint32_t i = 0; i < colum; i++) {
+ uint32_t index = j * colum + i + MCPU_TRACE_MEM_REGION_START;
+ printf("%02x ", readb(index));
+ }
+ printf("\r\n");
+ }
}
\ No newline at end of file
*/
#ifndef EXCEPTION_DUMP_H
#define EXCEPTION_DUMP_H
+#include "vectors.h"
/**
* @brief support nandflash storage dump sysmem to file.
*/
void dump_all_to_file(void);
+void printcpu_tracemem(void);
+
+void write_trace(exc_context_t *exc_buff_addr);
+
+void dump_norflash_trace_to_file(void);
+
#endif
\ No newline at end of file
#endif\r
PRINT("ra = 0x%x\n", exc->context->task_context.ra);\r
PRINT("sp = 0x%x\n", exc->context->task_context.sp);\r
+#ifndef BUILD_RECOVERY_IMAGE\r
PRINT("gp = 0x%x\n", exc->context->gp);\r
PRINT("tp = 0x%x\n", exc->context->task_context.tp);\r
PRINT("t0 = 0x%x\n", exc->context->task_context.t0);\r
PRINT("t4 = 0x%x\n", exc->context->task_context.t4);\r
PRINT("t5 = 0x%x\n", exc->context->task_context.t5);\r
PRINT("t6 = 0x%x\n", exc->context->task_context.t6);\r
-\r
PRINT("**************Exception Information end************** \n");\r
+#endif\r
+\r
return;\r
}\r
\r
/* Some exception apis are in the XIP region. Ensure the flash in XIP mode */\r
uapi_flash_switch_to_xip_mode(CHIP_FLASH_ID);\r
#if (CORE == MASTER_BY_ALL) && (CORE != WIFI)\r
+ if (g_is_repeat_exc == false) {\r
+ // if is first excepion write cpu trace to norflash\r
+ write_trace(exc_buf_addr);\r
+ }\r
+\r
if (g_is_repeat_exc == true) {\r
cpu_utils_reset_chip_with_log((cores_t)MASTER_BY_ALL, REBOOT_CAUSE_APPLICATION_SECOND_FAULT);\r
}\r
static td_void disp_set_isr_enable(td_bool enable)\r
{\r
dpu_hal_disp_set_dhd0_te_mode(enable); /* set dpu work te mode */\r
- dpu_hal_disp_set_int_enable(DPU_DISP_INT_TYPE_TE_INT, enable);\r
dpu_hal_disp_set_int_enable(DPU_DISP_INT_TYPE_LOWBAND, enable);\r
dpu_hal_disp_set_int_enable(DPU_DISP_INT_TYPE_BUS_ERR, enable);\r
dpu_hal_disp_set_int_enable(DPU_DISP_INT_TYPE_FRM_DONE, enable);\r
#include "vau_reg_define.h"\r
#include "vau_dfx.h"\r
\r
+static td_float g_cubic_threshold = 0.125f;\r
static td_void hal_apb_set_vau_srst_req(td_bool reset)\r
{\r
volatile u_video_srst_reg video_srst_reg;\r
u_vau_draw_cvrg_weight1 weight1;\r
\r
quad.bits.threshold_quad = 0.125; /* 0.125 : default threshold for quad split */\r
- cubic.bits.threshold_cubic = 0.125; /* 0.125 : default threshold for cubic split */\r
+ cubic.bits.threshold_cubic = g_cubic_threshold; /* 0.125 : default threshold for cubic split */\r
\r
weight0.bits.weight0 = 32; /* 32 default weithg for 8x */\r
weight0.bits.weight1 = 32; /* 32 default weithg for 8x */\r
td_void vau_hal_apb_set_cubic_threshold(td_float cubic_threshold)\r
{\r
u_vau_draw_threshold_cubic cubic;\r
+ cubic.bits.threshold_cubic = cubic_threshold;\r
+ uapi_reg_write(HAL_VAU_DRAW_THRESHOLD_CUBIC, cubic.u32);\r
\r
- if (cubic_threshold != 0) {\r
- cubic.bits.threshold_cubic = cubic_threshold;\r
- uapi_reg_write(HAL_VAU_DRAW_THRESHOLD_CUBIC, cubic.u32);\r
- } else {\r
- cubic.bits.threshold_cubic = 0.125; /* 0.125 : default threshold for cubic split */\r
- uapi_reg_write(HAL_VAU_DRAW_THRESHOLD_CUBIC, cubic.u32);\r
- }\r
+ g_cubic_threshold = cubic_threshold;\r
}\r
\r
td_void vau_hal_apb_vector_cmddata_range(td_u32 type, td_u32 start, td_u32 end)\r
${PROP_UI_SRC}/components_ext/ui_map_view.cpp\r
${PROP_UI_SRC}/components_ext/map_svg_parser.cpp\r
${PROP_UI_SRC}/components_ext/ui_coverflow_view.cpp\r
+ ${PROP_UI_SRC}/components_ext/ui_coverflow_view2.cpp\r
${PROP_UI_SRC}/components_ext/ui_icosahedron_view.cpp\r
+ ${PROP_UI_SRC}/components_ext/ui_transform_group.cpp\r
+ ${PROP_UI_SRC}/components_ext/ui_transform_list.cpp\r
)\r
\r
set(SOURCES\r
--- /dev/null
+/*\r
+ * Copyright (c) 2024 CompanyNameMagicTag.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef UI_COVERFLOW_VIEW_2_H\r
+#define UI_COVERFLOW_VIEW_2_H\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label.h"\r
+#include "components/ui_swipe_view.h"\r
+#include "components/ui_transform_group.h"\r
+#include "gfx_utils/vector.h"\r
+\r
+namespace OHOS {\r
+class UICoverFlowView2 : public UISwipeView {\r
+public:\r
+ explicit UICoverFlowView2(bool supportMirror = true, uint8_t mirrorOpa = 50); // 50:mirror view opaque\r
+ ~UICoverFlowView2() override;\r
+\r
+ /**\r
+ * @brief Obtains the component type.\r
+ *\r
+ * @return Returns the component type, as defined in {@link UIViewType}.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ UIViewType GetViewType() const override\r
+ {\r
+ return UI_COVER_FLOW_2;\r
+ }\r
+\r
+ /**\r
+ * @brief Adds a child view.\r
+ *\r
+ * @param view Indicates the pointer to the child view to add.\r
+ * Only UITransform are allowed to be added.\r
+ * Mirror image with UICanvasExt in UITransform are not supported.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ void Add(UIView* view) override;\r
+\r
+ /**\r
+ * @brief Inserts a new child view behind the current one.\r
+ *\r
+ * @param prevView Indicates the pointer to the current child view, previous to the new child view to insert.\r
+ * @param view Indicates the pointer to the new child view to insert.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ void Insert(UIView* prevView, UIView* insertView) override;\r
+\r
+ /**\r
+ * @brief Removes a child view.\r
+ *\r
+ * @param view Indicates the pointer to the child view to remove.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ void Remove(UIView* view) override;\r
+\r
+ /**\r
+ * @brief Set page direct interval.\r
+ *\r
+ * @param padding setting padding value. The interval between two images is twice the padding.\r
+ */\r
+ void SetPagePadding(uint16_t padding);\r
+\r
+ /**\r
+ * @brief Set rotate angle between the left and right items in static display mode.\r
+ *\r
+ * @param angle setting rotate angle.\r
+ */\r
+ void SetChildMaxRotateAngle(float angle);\r
+\r
+ /**\r
+ * @brief Represents a listener for swipe of the coverflow view.\r
+ */\r
+ class OnCoverflowScrollListener : public HeapBase {\r
+ public:\r
+ virtual bool OnScroll(uint16_t distance) = 0;\r
+ virtual ~OnCoverflowScrollListener() {}\r
+ };\r
+\r
+ /**\r
+ * @brief Sets the listener that contains a callback to be invoked upon a swipe event.\r
+ *\r
+ * @param onCoverflowListener Indicates the listener to set.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ void SetOnCoverflowListener(OnCoverflowScrollListener* onCoverflowListener)\r
+ {\r
+ coverflowListener_ = onCoverflowListener;\r
+ }\r
+\r
+ void SetDirection(uint8_t direction) = delete;\r
+ uint8_t GetDirection() const = delete;\r
+protected:\r
+ bool DragXInner(int16_t distance) override;\r
+ void RefreshCurrentView(int16_t distance, uint8_t dragDirection) override;\r
+\r
+private:\r
+ void ReMeasure(void) override;\r
+ bool CalCurViewInfo();\r
+ void UpdatePerspectiveMatrix();\r
+\r
+ using UISwipeView::Add;\r
+ using UISwipeView::Remove;\r
+ Matrix4<float> perspectiveMatrix_;\r
+ OnCoverflowScrollListener* coverflowListener_;\r
+ uint16_t swipeMid_;\r
+ float rotateAngle_;\r
+ bool isFirstRender_;\r
+ uint16_t padding_;\r
+ uint8_t mirrorOpa_;\r
+ bool isShowMirrorImg_;\r
+ Graphic::Vector<UITransformGroup*> mirrorViews_;\r
+};\r
+} // namespace OHOS\r
+#endif // UI_COVERFLOW_VIEW_2_H\r
*
*/
void ForceResetText() override;
-
- void SetTextTransformMap(TransformMap& transMap);
protected:
void InitLabelText() override;
};
class UIRollerView : public UIAbstractScroll {
public:
- UIRollerView();
+ /**
+ * @brief If want to turn off mirroring, It needs to be configured during construction.
+ */
+ UIRollerView(bool isShowMirrorImg_ = true);
virtual ~UIRollerView() override;
/**
UIViewGroup* GetCurrentItem();
/**
- * @brief Set current item.
+ * @brief Set current item. must to call it once.
*/
void SetCurrentItem(std::string name, bool enableAnimator = false);
bool needLayout_ = false;
UIViewGroup* currentItem_ = nullptr;
UIViewGroup* alignItem_ = nullptr;
+ bool isShowMirrorImg_;
float alignAngle_ = 0.0f;
};
} // namespace OHOS
--- /dev/null
+/*\r
+ * Copyright (c) 2024 CompanyNameMagicTag.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef GRAPHIC_UI_TRANSFORM_GROUP_H\r
+#define GRAPHIC_UI_TRANSFORM_GROUP_H\r
+#include "graphic_config.h"\r
+#include "components/ui_view_group.h"\r
+\r
+namespace OHOS {\r
+class UITransformGroup : public UIViewGroup {\r
+public:\r
+ UITransformGroup();\r
+ UITransformGroup(UITransformGroup* view);\r
+ virtual ~UITransformGroup();\r
+\r
+ /**\r
+ * @brief Obtains the view type.\r
+ *\r
+ * @return Returns <b>UI_TRANSFORM_GROUP</b>, as defined in {@link UIViewType}.\r
+ */\r
+ UIViewType GetViewType() const override\r
+ {\r
+ return UI_TRANSFORM_GROUP;\r
+ }\r
+\r
+ /**\r
+ * @brief Adds a child view.\r
+ *\r
+ * @param view Indicates the pointer to the child view to add.\r
+ * Support add <UILabel> <UILabelExt> <UIImageView> <UICanvasExt>.\r
+ */\r
+ virtual void Add(UIView* view) override;\r
+\r
+ /**\r
+ * @brief Set camera position the view in 3d.\r
+ * @param position Indicates camera position.\r
+ * @since 5.0\r
+ * @version 3.0\r
+ */\r
+ void SetCameraPosition(const Vector3<float>& position);\r
+\r
+ /**\r
+ * @brief Sets a style.\r
+ *\r
+ * @param key Indicates the key of the style to set.\r
+ * @param value Indicates the value matching the key.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ void SetStyle(uint8_t key, int64_t value) override;\r
+private:\r
+ void ReMeasure() override;\r
+ void DeleteMirrorView();\r
+ TransformMap labelTextTransMap_;\r
+};\r
+} // namespace OHOS\r
+#endif // GRAPHIC_UI_TRANSFORM_GROUP_H
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) 2024 CompanyNameMagicTag.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef GRAPHIC_UI_TRANSFORM_LIST_H\r
+#define GRAPHIC_UI_TRANSFORM_LIST_H\r
+#include "graphic_config.h"\r
+#include "components/ui_list.h"\r
+#include "components/ui_transform_group.h"\r
+#include "gfx_utils/vector.h"\r
+\r
+namespace OHOS {\r
+class UITransformList : public UIList {\r
+public:\r
+ /**\r
+ * @brief A constructor used to create a <b>UITransformList</b> instance.\r
+ *\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ UITransformList() : transformFunc_(nullptr), space_(5) {} // 5: default item space\r
+\r
+ /**\r
+ * @brief A constructor used to create a <b>UITransformList</b> instance.\r
+ *\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ explicit UITransformList(uint8_t direction)\r
+ {\r
+ SetDirection(direction);\r
+ }\r
+\r
+ /**\r
+ * @brief A destructor used to delete the <b>UITransformList</b> instance.\r
+ *\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ ~UITransformList() override {}\r
+\r
+ /**\r
+ * @brief Obtains the view type.\r
+ * @return Returns the view type, as defined in {@link UIViewType}.\r
+ * @since 1.0\r
+ * @version 1.0\r
+ */\r
+ UIViewType GetViewType() const override\r
+ {\r
+ return UI_TRANSFORM_LIST;\r
+ }\r
+\r
+ /**\r
+ * @brief Sets the spacing between items.\r
+ *\r
+ * @param value Indicates spacing between items.\r
+ */\r
+ void SetItemSpace(uint16_t value)\r
+ {\r
+ space_ = value;\r
+ }\r
+\r
+ /**\r
+ * @brief Customized transformation function type.\r
+ *\r
+ * @param list Indicates current transformlist obj.\r
+ * @param item Indicates current item obj.\r
+ * @return whether an item is in the middle.\r
+ * <b>true<b> current item is center view.\r
+ * <b>false<b> current item is not center view.\r
+ */\r
+ using TransformFunc = bool (*)(UITransformList* list, UIView* item);\r
+\r
+ /**\r
+ * @brief Setting a custom transformation function.\r
+ *\r
+ * @param func Indicates Transformation function point.\r
+ */\r
+ void SetItemTransformFunc(TransformFunc func);\r
+\r
+protected:\r
+ void ModifyItemSpace(int16_t centerIndex);\r
+ void ReMeasure() override;\r
+\r
+private:\r
+ TransformFunc transformFunc_;\r
+ uint16_t space_;\r
+ Graphic::Vector<UIView*> items_;\r
+};\r
+} // namespace OHOS\r
+#endif // GRAPHIC_UI_TRANSFORM_LIST_H
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2024 CompanyNameMagicTag.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef GRAPHIC_LITE_DFX_DOM_DUMP_H
+#define GRAPHIC_LITE_DFX_DOM_DUMP_H
+#include <cstdlib>
+#include "cJSON.h"
+#include "graphic_config.h"
+#include "gfx_utils/vector.h"
+#include "components/ui_view.h"
+#include "components/root_view.h"
+
+namespace OHOS {
+class DfxDomDump : public HeapBase {
+ struct DomNode : public HeapBase {
+ DomNode *parent = nullptr;
+ UIView *view = nullptr;
+ cJSON *obj = nullptr;
+ DomNode(DomNode *par = nullptr, UIView *vw = nullptr, cJSON *object = nullptr)
+ : parent(par), view(vw), obj(object) {}
+ ~DomNode() {}
+ };
+public:
+ static DfxDomDump &GetInstance();
+ virtual ~DfxDomDump();
+ DfxDomDump(const DfxDomDump&) = delete;
+ DfxDomDump &operator=(const DfxDomDump&) = delete;
+
+ void DumpRootView();
+ void DumpView(UIView *view);
+
+private:
+ DfxDomDump();
+ bool AddAttribute(cJSON *node, UIView *view) const;
+ bool AddCommonAttribute(cJSON *node, UIView *view) const;
+ void AddSpecialAttribute(cJSON *node, UIView *view) const;
+ bool AddChildNodeToStack(UIViewGroup *group, DomNode *parent, Graphic::Vector<DomNode*> &stackView) const;
+ bool RecordAndAddToParent(DomNode &curNode, Graphic::Vector<DomNode*> &buf) const;
+ void FreeDomNodeVector(Graphic::Vector<DomNode*> &vec) const;
+ void PrintAndReleaseCjson(cJSON *obj) const;
+ const char *UIViewType2Name(UIViewType type) const;
+};
+}
+#endif // GRAPHIC_LITE_DFX_DOM_DUMP_H
--- /dev/null
+/*
+ * Copyright (c) 2024 CompanyNameMagicTag.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef GRAPHIC_LITE_DFX_FRAME_TRACE_H
+#define GRAPHIC_LITE_DFX_FRAME_TRACE_H
+#include <cstdlib>
+#include "tcxo.h"
+#include "graphic_config.h"
+#include "gfx_utils/vector.h"
+#include "components/ui_view.h"
+#include "components/root_view.h"
+#include "common/graphic_utils.h"
+#include "graphic_service_wrapper.h"
+
+#if ENABLE_DFX_CMD
+#define FRAME_TRACE_ENABLE 1
+#else
+#define FRAME_TRACE_ENABLE 0
+#endif
+#if FRAME_TRACE_ENABLE
+#define FRAME_TRACE_START(type) DfxFrameTrace::GetInstance().FrameTraceStart(type)
+#define FRAME_TRACE_END(type, prect) DfxFrameTrace::GetInstance().FrameTraceEnd((type), (prect))
+#define FRAME_TRACE_ENABLE_COUNT(cnt) DfxFrameTrace::GetInstance().EnableFrameTrace(cnt)
+#define FRAME_TRACE_BEGIN_TRACE() DfxFrameTrace::GetInstance().BeginTrace()
+#define FRAME_TRACE_SET_RECT(rect) DfxFrameTrace::GetInstance().SetDrawRect(rect)
+#define FRAME_TRACE_END_TRACE() DfxFrameTrace::GetInstance().EndTrace()
+#define FRAME_TRACE_SHOW() DfxFrameTrace::GetInstance().ShowFrameTrace()
+#else
+#define FRAME_TRACE_START(type)
+#define FRAME_TRACE_END(type, prect)
+#define FRAME_TRACE_ENABLE_COUNT(cnt)
+#define FRAME_TRACE_BEGIN_TRACE()
+#define FRAME_TRACE_SET_RECT(rect)
+#define FRAME_TRACE_END_TRACE()
+#define FRAME_TRACE_SHOW()
+#endif
+
+namespace OHOS {
+enum class FrameTraceType {
+ SW_DRAW_TRANSFORM = 0,
+ SW_DRAW_IMGBLIT,
+ HW_DRAW_IMGBLIT,
+ HW_DRAW_PATH,
+ HW_CLIP_IMGBYPATH,
+ SW_DRAW_CUBICBEZIER,
+ SW_DRAW_RECT,
+ HW_DRAW_RECT,
+ HW_DRAW_BLUR,
+ SW_DRAW_LETTER,
+ SW_DRAW_ARC,
+ SW_DRAW_LINE,
+ HW_DRAW_SUBMIT,
+ HW_DRAW_FLUSH,
+ HW_DRAW_WAIT,
+ DRAW_MAX
+};
+
+class DfxFrameTrace : public HeapBase {
+public:
+ virtual ~DfxFrameTrace() {}
+ static DfxFrameTrace& GetInstance();
+ DfxFrameTrace(const DfxFrameTrace&) = delete;
+ DfxFrameTrace& operator=(DfxFrameTrace&) = delete;
+ void EnableFrameTrace(int enable)
+ {
+ enableTrace_ = enable;
+ }
+
+ void BeginTrace()
+ {
+ beginTrace_ = enableTrace_ > 0 ? true : false;
+ if (beginTrace_) {
+ isNativeRunning_ = IsNativeRunning();
+ freq_ = GetFrequence();
+ --enableTrace_;
+ }
+ }
+
+ void SetDrawRect(const Rect &rect)
+ {
+ drawRect_ = beginTrace_ ? rect : drawRect_;
+ }
+
+ void EndTrace()
+ {
+ if (beginTrace_) {
+ ClearState();
+ }
+ }
+
+ void FrameTraceStart(FrameTraceType type);
+ void FrameTraceEnd(FrameTraceType type, const Rect *rect = nullptr);
+ void ShowFrameTrace() const;
+
+private:
+ DfxFrameTrace()
+ {
+ ClearState();
+ }
+
+ bool CanTrace() const
+ {
+ return beginTrace_ && drawCount_ < DRAW_RECORD_MAX;
+ }
+
+ void ClearState();
+ std::string ToString(FrameTraceType type) const;
+ uint64_t GetDuration(uint64_t start, uint64_t end) const;
+ uint64_t ComputeTime() const;
+ void RecordStart(FrameTraceType type);
+ void RecordEnd(FrameTraceType type, const Rect *rect);
+ static constexpr int32_t DRAW_RECORD_MAX = 128;
+ struct {
+ FrameTraceType cmd;
+ uint64_t preTime;
+ uint64_t costTime;
+ bool isNeedWait;
+ } trace_[DRAW_RECORD_MAX];
+ Rect rect_[DRAW_RECORD_MAX];
+ int pathCnt_ = 0;
+ int pathIndex_ = -1;
+ Rect drawRect_;
+ uint64_t firstDrawTime_ = 0;
+ uint64_t startTime_ = 0;
+ uint64_t endTime_ = 0;
+ int32_t drawCount_ = 0;
+ int32_t drawStack_ = 0;
+ int enableTrace_ = 0;
+ bool beginTrace_ = false;
+ int isNativeRunning_ = 0;
+ int freq_ = 0;
+};
+} // OHOS
+#endif // GRAPHIC_LITE_DFX_FRAME_TRACE_H
uint32_t setEventGapMax; // The max time gap for current tp event to last one.
uint32_t getToSetTimeTotal; // The total time accumulated by each gap from get event time to set event time.
uint32_t getToSetTimeMax; // The max for get event time to set event time.
-
- /* Render */
- uint8_t renderCnt; // Render count.
- uint32_t renderTimeTotal; // Total time for render.
- uint32_t renderTimeStart; // Render start time.
- uint32_t renderTimeSWCurr; // Software render time consume for courrent render cycle.
- uint32_t renderTimeSWTotal; // Total software render time consume.
- uint32_t renderTimeSWMax; // Max software render time consume.
- uint32_t renderTimeHWCurr; // Hardware render time consume for courrent render cycle.
- uint32_t renderTimeHWTotal; // Total hardware render time consume.
- uint32_t renderTimeHWMax; // Max hardware render time consume.
- uint32_t renderTimeFlushCurr; // Hardware render time consume for courrent render cycle.
- uint32_t renderTimeFlushTotal; // Total hardware render time consume.
- uint32_t renderTimeFlushMax; // Max hardware render time consume.
};
enum class ShowType {
DFX_SHOW_TP = 0,
DFX_SHOW_POINT,
- DFX_SHOW_RENDER,
- DFX_SHOW_ULPS,
DFX_SHOW_DISABLE
};
-enum class TimeRecordType {
- DFX_TIME_RECORD_SW_CURR = 0,
- DFX_TIME_RECORD_HW_CURR,
- DFX_TIME_RECORD_FLUSH_CURR,
- DFX_TIME_RECORD_END
-};
-
void DfxShowType(ShowType type);
bool IsShowTPRaw();
bool IsShowPoint();
-void DfxRecordTime(TimeRecordType type);
void DfxTPSetEvent(uint32_t time);
void DfxTPGetEvent();
void DfxRecordShow();
-void DfxRenderReset();
-void DfxUlpsFlushRecord(uint8_t flag);
}
#endif // GRAPHIC_LITE_DFX_TYPE_H
int32_t leakSize_ = 0;
};
} // namespace OHOS
-
-/**
- * @brief Overrides the <b>new</b> function.
- * @param size Indicates the size of the memory to be allocated.
- *
- * @since 1.0
- * @version 1.0
- */
-inline void* operator new(std::size_t size)
-{
- return OHOS::UIMalloc(size);
-}
-
-/**
- * @brief Overrides the <b>new[]</b> function.
- * @param size Indicates the size of the memory to be allocated.
- *
- * @since 1.0
- * @version 1.0
- */
-inline void* operator new[](std::size_t size)
-{
- return OHOS::UIMalloc(size);
-}
-
-/**
- * @brief Overrides the <b>delete</b> function.
- * @param ptr Indicates the pointer to the memory to be released.
- *
- * @since 1.0
- * @version 1.0
- */
-inline void operator delete(void *ptr)
-{
- if (ptr != nullptr) {
- OHOS::UIFree(ptr);
- }
-}
-
-/**
- * @brief Overrides the <b>delete[]</b> function.
- * @param ptr Indicates the pointer to the memory to be released.
- *
- * @since 1.0
- * @version 1.0
- */
-inline void operator delete[](void *ptr)
-{
- if (ptr != nullptr) {
- OHOS::UIFree(ptr);
- }
-}
#endif
#endif
/**
#ifndef OHOS_GRAPHIC_SERVICE_H\r
#define OHOS_GRAPHIC_SERVICE_H\r
#include "graphic_event_handler.h"\r
+#if !defined(_WIN32)\r
#include "soc_osal.h"\r
+#else\r
+#include <atomic>\r
+#endif\r
\r
/**\r
* @ignore\r
*/\r
void SetNativeUIRunning(bool isRunning);\r
\r
+ int IsNativeRunning() const;\r
+\r
+ int IsScreenOn() const;\r
+\r
+ int GetGraphicTaskTriggeredCount() const;\r
+\r
/**\r
* @brief Post a task to an asynchronous thread, which would handle posted tasks sequently.\r
* @param event, indicates the task to post.\r
private:\r
friend class GraphicEventHandler;\r
static VsyncCallback jsVsyncCallback_;\r
+#if !defined(_WIN32)\r
static osal_atomic isNativeRunning_;\r
static osal_atomic graphicTaskTriggeredCount_;\r
static osal_atomic isScreenOn_;\r
+#else\r
+ static std::atomic<int> isNativeRunning_;\r
+ static std::atomic<int> graphicTaskTriggeredCount_;\r
+ static std::atomic<int> isScreenOn_;\r
+#endif\r
static OHOS::GraphicMutex rtcEventMutex_;\r
static OHOS::GraphicCond rtcEventCond_;\r
static bool fullRefreshFlag_;\r
extern "C" {
#endif
+/**
+ * @brief Get current frequence.
+ */
+int GetFrequence(void);
+
/**
* @brief Set frequence for graphic, cannot use PostGraphicEvent() to excute this method.
*/
void SetFrequence(int freq);
+/**
+ * @brief Get native running state.
+ */
+int IsNativeRunning(void);
+
/**
* @brief Set frequence for graphic inner.
*/
*/
void HideGraphicLogo(void);
-/**
- * @brief GPU Reset start.
- */
-void GpuResetStart(void);
-
-/**
- * @brief GPU Reset end.
- */
-void GpuResetEnd(void);
-
#ifdef __cplusplus
};
#endif
#include "graphic_event_handler.h"\r
#include "dfx/dfx_record.h"\r
#include "common/low_power_manager.h"\r
+#include "gfx_utils/graphic_log.h"\r
\r
namespace OHOS {\r
GraphicEventHandler::GraphicEventHandler() {}\r
void GraphicEventHandler::ClearGraphicEvent()\r
{\r
queueMutex_.Lock();\r
+ GRAPHIC_LOGP("ClearGraphicEvent! EventQueue's size: %d", eventQueue_.size());\r
while (!eventQueue_.empty()) {\r
eventQueue_.pop();\r
}\r
#include "gfx_utils/graphic_log.h"\r
#include "graphic_config.h"\r
#include "hals/display_dev.h"\r
+#if !defined(_WIN32)\r
#include "soc_lcd_api.h"\r
+#endif\r
#include "graphic_thread.h"\r
#include "dock/input_device.h"\r
#include "dock/lite_touch_device.h"\r
#include "components/root_view.h"\r
\r
VsyncCallback GraphicService::jsVsyncCallback_;\r
+#if !defined(_WIN32)\r
osal_atomic GraphicService::isNativeRunning_{1};\r
osal_atomic GraphicService::graphicTaskTriggeredCount_{0};\r
osal_atomic GraphicService::isScreenOn_{0};\r
+#else\r
+std::atomic<int> GraphicService::isNativeRunning_(1);\r
+std::atomic<int> GraphicService::graphicTaskTriggeredCount_(0);\r
+std::atomic<int> GraphicService::isScreenOn_(0);\r
+#endif\r
OHOS::GraphicMutex GraphicService::rtcEventMutex_;\r
OHOS::GraphicCond GraphicService::rtcEventCond_;\r
static ThreadId g_rtcEventThreadId;\r
\r
bool GraphicService::SyncTriggerJSGraphicTask()\r
{\r
+#if !defined(_WIN32)\r
if ((osal_atomic_read(&isNativeRunning_) == 1) || osal_atomic_read(&graphicTaskTriggeredCount_) > 0 ||\r
osal_atomic_read(&isScreenOn_) == 0) {\r
GRAPHIC_LOGI("Trigger JS Task failed. Native is running or Graphic Task is already triggered.");\r
return false;\r
}\r
+#else\r
+ if ((isNativeRunning_.load() == 1) || graphicTaskTriggeredCount_.load() > 0 ||\r
+ isScreenOn_.load() == 0) {\r
+ GRAPHIC_LOGI("Trigger JS Task failed. Native is running or Graphic Task is already triggered.");\r
+ return false;\r
+ }\r
+#endif\r
\r
OHOS::TaskManager::GetInstance()->TaskHandler();\r
return true;\r
\r
bool GraphicService::AsyncTriggerNativeGraphicTask()\r
{\r
+#if !defined(_WIN32)\r
if (osal_atomic_read(&graphicTaskTriggeredCount_) <= 1) {\r
osal_atomic_inc(&graphicTaskTriggeredCount_);\r
+#else\r
+ if (graphicTaskTriggeredCount_.load() <= 1) {\r
+ graphicTaskTriggeredCount_.fetch_add(1);\r
+#endif\r
OHOS::GraphicEventHandler::GetInstance()->PostGraphicEvent(\r
[] {\r
OHOS::TaskManager::GetInstance()->TaskHandler();\r
void GraphicService::SetNativeUIRunning(bool isRunning)\r
{\r
if (isRunning) {\r
+#if !defined(_WIN32)\r
osal_atomic_set(&isNativeRunning_, 1);\r
} else {\r
osal_atomic_set(&isNativeRunning_, 0);\r
OHOS::GraphicEventHandler::GetInstance()->ClearGraphicEvent();\r
osal_atomic_set(&graphicTaskTriggeredCount_, 0);\r
+#else\r
+ isNativeRunning_.store(1);\r
+ } else {\r
+ isNativeRunning_.store(0);\r
+ OHOS::GraphicEventHandler::GetInstance()->ClearGraphicEvent();\r
+ graphicTaskTriggeredCount_.store(0);\r
+#endif\r
}\r
}\r
\r
+int GraphicService::IsNativeRunning() const\r
+{\r
+#if !defined(_WIN32)\r
+ return osal_atomic_read(&isNativeRunning_);\r
+#else\r
+ return isNativeRunning_.load();\r
+#endif\r
+}\r
+\r
+int GraphicService::GetGraphicTaskTriggeredCount() const\r
+{\r
+#if !defined(_WIN32)\r
+ return osal_atomic_read(&graphicTaskTriggeredCount_);\r
+#else\r
+ return graphicTaskTriggeredCount_.load();\r
+#endif\r
+}\r
+\r
+int GraphicService::IsScreenOn() const\r
+{\r
+#if !defined(_WIN32)\r
+ return osal_atomic_read(&isScreenOn_);\r
+#else\r
+ return isScreenOn_.load();\r
+#endif\r
+}\r
+\r
void GraphicService::DecreaseTriggerCount()\r
{\r
+#if !defined(_WIN32)\r
osal_atomic_dec(&graphicTaskTriggeredCount_);\r
+#else\r
+ graphicTaskTriggeredCount_.fetch_sub(1);\r
+#endif\r
}\r
\r
void GraphicService::PostGraphicEvent(const OHOS::GraphicEvent& event)\r
\r
void GraphicService::NotifyScreenOn()\r
{\r
+ fullRefreshFlag_ = true;\r
+#if !defined(_WIN32)\r
if (osal_atomic_read(&isScreenOn_) == 0) {\r
osal_atomic_set(&isScreenOn_, 1);\r
- fullRefreshFlag_ = true;\r
}\r
+#else\r
+ if (isScreenOn_.load() == 0) {\r
+ isScreenOn_.store(1);\r
+ }\r
+#endif\r
}\r
\r
void GraphicService::NotifyScreenOff()\r
{\r
+#if !defined(_WIN32)\r
osal_atomic_set(&isScreenOn_, 0);\r
OHOS::GraphicEventHandler::GetInstance()->ClearGraphicEvent();\r
osal_atomic_set(&graphicTaskTriggeredCount_, 0);\r
+#else\r
+ isScreenOn_.store(0);\r
+ OHOS::GraphicEventHandler::GetInstance()->ClearGraphicEvent();\r
+ graphicTaskTriggeredCount_.store(0);\r
+#endif\r
}\r
\r
void GraphicService::EnableAsyncMode(bool enable)\r
rtcEventMutex_.Lock();\r
rtcEventCond_.Wait(rtcEventMutex_);\r
rtcEventMutex_.Unlock();\r
+#if !defined(_WIN32)\r
if (osal_atomic_read(&isScreenOn_) == 0) {\r
+#else\r
+ if (isScreenOn_.load() == 0) {\r
+#endif\r
continue;\r
}\r
if (fullRefreshFlag_) {\r
fullRefreshFlag_ = false;\r
}\r
\r
+#if !defined(_WIN32)\r
if (osal_atomic_read(&isNativeRunning_) == 1) {\r
AsyncTriggerNativeGraphicTask();\r
} else {\r
jsVsyncCallback_();\r
}\r
+#else\r
+ if (isNativeRunning_.load() == 1) {\r
+ AsyncTriggerNativeGraphicTask();\r
+ }\r
+#endif\r
}\r
#if !defined(ENABLE_CMSIS)\r
return nullptr;\r
\r
bool GraphicService::InitGraphicService()\r
{\r
+#if !defined(_WIN32)\r
if (!uapi_is_lcd_connect()) {\r
return false;\r
}\r
+#endif\r
\r
OHOS::GraphicStartUp::Init();\r
+#if !defined(_WIN32)\r
OHOS::LiteInputHal::GetInstance()->SetUp();\r
+#endif\r
#ifndef QSPI_DISPLAY\r
OHOS::BaseGfxEngine::GetInstance()->SetScreenShape(OHOS::CIRCLE);\r
#endif\r
#ifdef ENABLE_CMSIS\r
rtcAttr.priority = static_cast<uint8_t>(osPriorityAboveNormal2);\r
#endif\r
- g_rtcEventThreadId = ThreadCreate(GraphicService::RtcEventThread, nullptr, &rtcAttr);\r
+ g_rtcEventThreadId = (ThreadId)ThreadCreate((Runnable)GraphicService::RtcEventThread, nullptr, &rtcAttr);\r
if (g_rtcEventThreadId == nullptr) {\r
GRAPHIC_LOGE("%s: create thread fail\n", __func__);\r
return false;\r
#ifdef ENABLE_CMSIS\r
mainAttr.priority = static_cast<uint8_t>(osPriorityAboveNormal2);\r
#endif\r
- g_mainThreadId = ThreadCreate(GraphicService::NativeMainThread, nullptr, &mainAttr);\r
+ g_mainThreadId = (ThreadId)ThreadCreate((Runnable)GraphicService::NativeMainThread, nullptr, &mainAttr);\r
if (g_mainThreadId == nullptr) {\r
GRAPHIC_LOGE("create thread fail\n");\r
return false;\r
*/
#include "graphic_service_wrapper.h"
+#if !defined(_WIN32)
#include "rtc.h"
+#endif
#include "graphic_event_handler.h"
#include "graphic_service.h"
#include "gfx_utils/graphic_log.h"
#endif
static const uint32_t SECOND_TO_MILLISECOND = 1000;
static const int32_t FULL_FREQUENCE = 60;
+#if !defined(_WIN32)
static rtc_handle_t g_rtcHandle = nullptr;
+#endif
static int32_t g_timeInterval = 16;
static int32_t g_freq = FULL_FREQUENCE;
static bool g_initialized = false;
if (!g_initialized || !g_isScreenOn) {
return;
}
+#if !defined(_WIN32)
uapi_rtc_start(g_rtcHandle, g_timeInterval, UikitRTCCallBack, 0);
+#endif
GraphicService::GetInstance()->UpdateGraphicEvent();
}
} else {
GraphicService::GetInstance()->EnableAsyncMode(false);
}
+#if !defined(_WIN32)
uapi_rtc_start(g_rtcHandle, g_timeInterval, UikitRTCCallBack, 0);
+#endif
}
}
+int GetFrequence(void)
+{
+ return g_freq;
+}
+
+int IsNativeRunning(void)
+{
+ return GraphicService::GetInstance()->IsNativeRunning();
+}
+
void SetFrequence(int freq)
{
GraphicService::GetInstance()->PostGraphicEvent([=] {
void NotifyScreenOn(void)
{
+#if !defined(_WIN32)
if (g_rtcHandle == nullptr) {
return;
}
+#endif
if (!g_isScreenOn) {
g_isScreenOn = true;
OHOS::LowPowerManager::GetInstance()->ExitLowPower();
+#if !defined(_WIN32)
+ GRAPHIC_LOGP("ScreenOn and start RTC! time interval: %d", g_timeInterval);
uapi_rtc_start(g_rtcHandle, g_timeInterval, static_cast<rtc_callback_t>(UikitRTCCallBack), 0);
+#endif
}
GraphicService::GetInstance()->NotifyScreenOn();
}
void NotifyScreenOff(void)
{
+#if !defined(_WIN32)
if (g_rtcHandle == nullptr) {
return;
}
+#endif
if (g_isScreenOn) {
g_isScreenOn = false;
+#if !defined(_WIN32)
+ GRAPHIC_LOGP("ScreenOff and stop RTC!");
uapi_rtc_stop(g_rtcHandle);
+#endif
}
g_freq = 1;
g_timeInterval = SECOND_TO_MILLISECOND;
return;
}
+#if !defined(_WIN32)
/* start RTC timer */
uapi_rtc_create(RTC_0, &g_rtcHandle);
if (g_rtcHandle == nullptr) {
GRAPHIC_LOGE("create RTC timer fail!!");
return;
}
+#endif
if (!GraphicService::GetInstance()->InitGraphicService()) {
GRAPHIC_LOGE("InitGraphicService fail!!");
+#if !defined(_WIN32)
uapi_rtc_stop(g_rtcHandle);
uapi_rtc_delete(g_rtcHandle);
+#endif
return;
}
g_initialized = true;
#include "engines/gfx/lite_m_gfx_engine.h"
#include "components/root_view.h"
#include "hal_tick.h"
+#include "gfx_utils/list.h"
namespace OHOS {
-static const uint32_t RE_ENTRY_CLAMP = 1000;
+static const uint32_t TRY_ENTER_LOW_POWER_INTERVAL = 100; // to avoid switch refresh rate frequently during roate
void LowPowerManager::TryToEnterLowPower()
{
- if (HALTick::GetInstance().GetElapseTime(lastExitTime_) < RE_ENTRY_CLAMP) {
+ // this condition can be removed later, switching refresh rate frequently doesn't seen to have any effect
+ if (HALTick::GetInstance().GetElapseTime(lastExitTime_) < TRY_ENTER_LOW_POWER_INTERVAL) {
return;
}
- if (CheckGuiState()) {
- EnterLowPower();
+ if (AnimatorManager::GetInstance()->IsActive() || InputDeviceManager::GetInstance()->IsEventExist()) {
+ return;
}
-}
-void LowPowerManager::EnterLowPower()
-{
- SetFrequenceInner(1);
+ if (LiteMGfxEngine::GetInstance()->HasPendingFrame()) {
+ return;
+ }
+
+ if (IsLiteSurfaceInRootView()) {
+ return;
+ }
+
+ uint32_t period = TaskManager::GetInstance()->GetMinimumCustomerTaskPeriod();
+ int freq = (period == 0) ? 1 : 1000 / static_cast<int>(period);
+ SetFrequenceInner(freq);
}
void LowPowerManager::ExitLowPower()
return (view == RootView::GetInstance());
}
-
-bool LowPowerManager::CheckTaskState()
-{
- uint32_t period = TaskManager::GetInstance()->GetMinimumCustomerTaskPeriod();
- if (period == 0) {
- return false;
- } else {
- int freq = 1000 / static_cast<int>(period); // 1000: 1000ms per second
- SetFrequenceInner(freq);
- return true;
- }
-}
-
-bool LowPowerManager::CheckGuiState()
-{
- if ((powerLock_ != 0) || AnimatorManager::GetInstance()->IsActive() || IsLiteSurfaceInRootView() ||
- InputDeviceManager::GetInstance()->IsEventExist() || CheckTaskState()) {
- return false;
- }
-
- return true;
-}
} // namespace OHOS
#include "graphic_service.h"\r
#include "draw/draw_rect.h"\r
#include "draw/draw_utils.h"\r
+#include "dfx/dfx_frame_trace.h"\r
#include "gfx_utils/graphic_log.h"\r
#include "hals/display_dev.h"\r
#include "securec.h"\r
return;\r
}\r
surface_->RegisterConsumerListener(*this);\r
- LowPowerManager::GetInstance()->PowerLock();\r
}\r
\r
UILiteSurfaceView::~UILiteSurfaceView()\r
LiteMGfxEngine::GetInstance()->ClearHardwareLayer();\r
GraphicService::GetInstance()->PostGraphicEvent([] {\r
GraphicService::GetInstance()->EnableAsyncMode(true);\r
- LowPowerManager::GetInstance()->PowerUnLock();\r
});\r
\r
if (preView_ != nullptr) {\r
layer.data.phyAddr = currentBuffer_->addr;\r
layer.data.virAddr = reinterpret_cast<void*>(currentBuffer_->addr);\r
\r
+ FRAME_TRACE_START(FrameTraceType::HW_DRAW_FLUSH);\r
DisplayDev::GetInstance()->SetHardwareLayerBuffer(LAYER_1, BUFFER_0, layer);\r
DisplayDev::GetInstance()->LcdFlush(LAYER_1);\r
+ FRAME_TRACE_END(FrameTraceType::HW_DRAW_FLUSH, nullptr);\r
}\r
\r
if (flushCount_ > 0) {\r
});\r
} else if (isStopped_) {\r
isStopped_ = false;\r
+ LowPowerManager::GetInstance()->ExitLowPower();\r
GraphicService::GetInstance()->PostGraphicEvent(\r
[&, ws] {\r
if (!ws.expired()) {\r
#define UI_HOR_SWIPE_VIEW_H
#include "components/ui_swipe_view.h"
#include "components/card_swipe.h"
+#include "animator/animator.h"
namespace OHOS {
class HorSwipeView : public UISwipeView {
*/
void SwipeStart(void);
+ /* *
+ * @brief Get state of scroll animator.
+ * @since 1.0
+ * @version 1.0
+ */
+ uint8_t GetScrollState()
+ {
+ return scrollAnimator_.GetState();
+ }
+
private:
bool enableScreenCap_ = false;
CardSwipe* swipeCallback_ = nullptr;
#include <cstdlib>
#include "graphic_config.h"
+#include "dfx/dfx_dom_dump.h"
+#include "graphic_service.h"
#include "dfx/dfx_cmd.h"
#if ENABLE_DFX_CMD
#include <unistd.h>
#include "gfx_utils/image_info.h"
#include "securec.h"
#include "dfx/dfx_record.h"
+#include "dfx/dfx_frame_trace.h"
#include "common/low_power_manager.h"
#include "common/image_cache_manager.h"
printf("=== Dump Widget ViewId End===\n");
}
+void DumpRootView(int argc, char *argv[])
+{
+ printf("=== Begin Dump RootView ===\n");
+ DfxDomDump::GetInstance().DumpRootView();
+ printf("=== Dump RootView End===\n");
+}
+
#if ENABLE_MEMORY_CHECK
void DumpMemoryCmd(int argc, char *argv[])
{
MemCheck::GetInstance()->DumpMemInfo();
}
+void DumpState(int argc, char *argv[])
+{
+ printf("=== Dump State ===\n");
+ printf(" NativeRunninng: %d\n", GraphicService::GetInstance()->IsNativeRunning());
+ printf(" IsScreenOn: %d\n", GraphicService::GetInstance()->IsScreenOn());
+ printf(" GraphicTaskTriggeredCount_: %d\n", GraphicService::GetInstance()->GetGraphicTaskTriggeredCount());
+}
+
void LeakPanic(int argc, char *argv[])
{
if (argc != 2) { // 2: param num
DfxShowType(ShowType::DFX_SHOW_TP);
} else if (strcmp(argv[0], "point") == 0) {
DfxShowType(ShowType::DFX_SHOW_POINT);
- } else if (strcmp(argv[0], "render") == 0) {
- DfxShowType(ShowType::DFX_SHOW_RENDER);
} else if (strcmp(argv[0], "close") == 0) {
DfxShowType(ShowType::DFX_SHOW_DISABLE);
- } else if (strcmp(argv[0], "ulps") == 0) {
- DfxShowType(ShowType::DFX_SHOW_ULPS);
}
+ } else if (argc == 3) { // 3: argc
+ if (strcmp(argv[0], "render") != 0) {
+ printf("param err.");
+ return;
+ }
+ uint16_t cnt;
+ uint16_t invalid;
+ if (!ConvertToInt(argv[1], cnt) || !ConvertToInt(argv[2], invalid)) {
+ printf("param err.");
+ return;
+ }
+ if (invalid != 0) {
+ GraphicService::GetInstance()->PostGraphicEvent([]() { RootView::GetInstance()->Invalidate(); });
+ }
+ DfxFrameTrace::GetInstance().EnableFrameTrace(static_cast<int>(cnt));
} else {
printf("param err.");
}
struct DfxCmd g_dfxCmdList[] = {
{"screencap", OHOS::ScreencapCmd},
{"dump_view_id", OHOS::DumpViewIdCmd},
+ {"dump_root_view", OHOS::DumpRootView},
{"printfps", OHOS::PrintFPS},
{"hidefps", OHOS::HideFPS},
{"showfps", OHOS::ShowFPS},
{"showtime", OHOS::ShowTime},
#if ENABLE_MEMORY_CHECK
+ {"dumpstate", OHOS::DumpState},
{"dumpmem", OHOS::DumpMemoryCmd},
{"mem_monitor", OHOS::SetMemMonitorCmd},
{"dumpimg", OHOS::DumpImgCmd},
--- /dev/null
+/*
+ * Copyright (c) 2024 CompanyNameMagicTag.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "dfx/dfx_dom_dump.h"
+#include "graphic_service.h"
+#include "draw/draw_image.h"
+#include "common/graphic_utils.h"
+
+namespace OHOS {
+static const struct {
+ UIViewType type;
+ const char *name;
+} g_type2Name[] = {
+ {UI_ROOT_VIEW, "UI_ROOT_VIEW"},
+ {UI_VIEW_GROUP, "UI_VIEW_GROUP"},
+ {UI_LABEL, "UI_LABEL"},
+ {UI_ARC_LABEL, "UI_ARC_LABEL"},
+ {UI_LABEL_BUTTON, "UI_LABEL_BUTTON"},
+ {UI_CHECK_BOX, "UI_CHECK_BOX"},
+ {UI_TOGGLE_BUTTON, "UI_TOGGLE_BUTTON"},
+ {UI_RADIO_BUTTON, "UI_RADIO_BUTTON"},
+ {UI_IMAGE_VIEW, "UI_IMAGE_VIEW"},
+ {UI_BOX_PROGRESS, "UI_BOX_PROGRESS"},
+ {UI_SLIDER, "UI_SLIDER"},
+ {UI_CIRCLE_PROGRESS, "UI_CIRCLE_PROGRESS"},
+ {UI_SCROLL_VIEW, "UI_SCROLL_VIEW"},
+ {UI_LIST, "UI_LIST"},
+ {UI_DIGITAL_CLOCK, "UI_DIGITAL_CLOCK"},
+ {UI_ANALOG_CLOCK, "UI_ANALOG_CLOCK"},
+#if ENABLE_SWEEP_CLOCK
+ {UI_SWEEP_CLOCK, "UI_SWEEP_CLOCK"},
+#endif
+ {UI_PICKER, "UI_PICKER"},
+ {UI_SWIPE_VIEW, "UI_SWIPE_VIEW"},
+ {UI_TIME_PICKER, "UI_TIME_PICKER"},
+ {UI_ABSTRACT_CLOCK, "UI_ABSTRACT_CLOCK"},
+ {UI_ABSTRACT_PROGRESS, "UI_ABSTRACT_PROGRESS"},
+ {UI_ABSTRACT_SCROLL, "UI_ABSTRACT_SCROLL"},
+ {UI_AXIS, "UI_AXIS"},
+ {UI_BUTTON, "UI_BUTTON"},
+ {UI_CANVAS, "UI_CANVAS"},
+ {UI_CHART, "UI_CHART"},
+ {UI_IMAGE_ANIMATOR_VIEW, "UI_IMAGE_ANIMATOR_VIEW"},
+ {UI_REPEAT_BUTTON, "UI_REPEAT_BUTTON"},
+ {UI_TEXTURE_MAPPER, "UI_TEXTURE_MAPPER"},
+ {UI_DIALOG, "UI_DIALOG"},
+ {UI_QRCODE, "UI_QRCODE"},
+ {UI_LABEL_EXT, "UI_LABEL_EXT"},
+ {UI_LABEL_BUTTON_EXT, "UI_LABEL_BUTTON_EXT"},
+ {UI_CANVAS_EXT, "UI_CANVAS_EXT"},
+ {UI_CHART_PILLAR, "UI_CHART_PILLAR"},
+ {UI_CHART_POLYLINE, "UI_CHART_POLYLINE"},
+ {UI_X_AXIS, "UI_X_AXIS"},
+ {UI_Y_AXIS, "UI_Y_AXIS"},
+ {UI_LITE_SURFACE_VIEW, "UI_LITE_SURFACE_VIEW"},
+ {LAYOUT, "LAYOUT"},
+ {LIST_LAYOUT, "LIST_LAYOUT"},
+ {FLEX_LAYOUT, "FLEX_LAYOUT"},
+ {GRID_LAYOUT, "GRID_LAYOUT"},
+#if ENABLE_SOFT_KEYBOARD
+ {UI_EDIT_TEXT, "UI_EDIT_TEXT"},
+ {UI_TEXT_PREVIEW_BOX, "UI_TEXT_PREVIEW_BOX"},
+ {UI_KEYBOARD_BUTTON, "UI_KEYBOARD_BUTTON"},
+#endif
+ {UI_MENU_ITEM, "UI_MENU_ITEM"},
+ {UI_CARD_PAGE, "UI_CARD_PAGE"},
+ {UI_COVER_FLOW, "UI_COVER_FLOW"},
+ {UI_CROSS_VIEW, "UI_CROSS_VIEW"},
+ {UI_BARCODE, "UI_BARCODE"},
+ {UI_MAP_VIEW, "UI_MAP_VIEW"},
+ {UI_KALEIDOSCOPE_VIEW, "UI_KALEIDOSCOPE_VIEW"},
+ {UI_ROLLER_VIEW, "UI_ROLLER_VIEW"},
+ {UI_HEXAGONS_LIST, "UI_HEXAGONS_LIST"},
+ {UI_IMAGE_PICKER, "UI_IMAGE_PICKER"},
+ {UI_ICOSAHEDRON_VIEW, "UI_ICOSAHEDRON_VIEW"},
+ {UI_TRANSFORM_GROUP, "UI_TRANSFORM_GROUP"},
+ {UI_TRANSFORM_LIST, "UI_TRANSFORM_LIST"},
+ {UI_NUMBER_MAX, "UI_NUMBER_MAX"},
+};
+
+DfxDomDump::DfxDomDump()
+{
+}
+
+DfxDomDump::~DfxDomDump()
+{
+}
+
+DfxDomDump& DfxDomDump::GetInstance()
+{
+ static DfxDomDump dfxDomDump;
+ return dfxDomDump;
+}
+
+void DfxDomDump::DumpRootView()
+{
+ DumpView(RootView::GetInstance());
+}
+
+void DfxDomDump::DumpView(UIView *view)
+{
+ if (view == nullptr) {
+ return;
+ }
+
+ Graphic::Vector<DomNode*> stackView; // traverse stack
+ Graphic::Vector<DomNode*> buf; // nodes to free
+ DomNode domNode(nullptr, view, nullptr);
+ stackView.PushBack(&domNode);
+ while (!stackView.IsEmpty()) {
+ DomNode &curNode = *(stackView.Back());
+ stackView.PopBack();
+ curNode.obj = cJSON_CreateObject();
+ if (curNode.obj == nullptr) {
+ break;
+ }
+
+ if (!RecordAndAddToParent(curNode, buf)) {
+ break;
+ }
+
+ if (!AddAttribute(curNode.obj, curNode.view)) {
+ break;
+ }
+
+ UIViewGroup *group = dynamic_cast<UIViewGroup*>(curNode.view);
+ if (group == nullptr) {
+ continue;
+ }
+
+ if (!AddChildNodeToStack(group, &curNode, stackView)) {
+ break;
+ }
+ }
+ PrintAndReleaseCjson(domNode.obj);
+
+ FreeDomNodeVector(buf);
+ FreeDomNodeVector(stackView);
+}
+
+bool DfxDomDump::AddAttribute(cJSON *node, UIView *view) const
+{
+ if (node == nullptr || view == nullptr) {
+ return false;
+ }
+ bool ret = AddCommonAttribute(node, view);
+ AddSpecialAttribute(node, view);
+ return ret;
+}
+
+bool DfxDomDump::AddCommonAttribute(cJSON *node, UIView *view) const
+{
+ if (node == nullptr || view == nullptr) {
+ return false;
+ }
+
+ Rect rect = view->GetRect();
+ const size_t size = 256;
+ char *buf = new char[size];
+ defer {
+ if (buf != nullptr) {
+ delete []buf;
+ }
+ };
+ cJSON_AddStringToObject(node, "typename", UIViewType2Name(view->GetViewType()));
+ if (buf == nullptr) {
+ return false;
+ }
+ memset_s(buf, size, 0, size);
+ sprintf_s(buf, size, "[ptr %p, x %d y %d w %d h %d, opa %u, visible %d, touchable %d, draggable %d, view-id %s]",
+ view, rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight(), view->GetOpaScale(), view->IsVisible(),
+ view->IsTouchable(), view->IsDraggable(), view->GetViewId());
+ cJSON_AddStringToObject(node, "common-info", buf);
+ return true;
+}
+
+void DfxDomDump::AddSpecialAttribute(cJSON *node, UIView *view) const
+{
+ if (node == nullptr || view == nullptr) {
+ return;
+ }
+ cJSON_AddStringToObject(node, "special info", view->GetGuiInfo().c_str());
+}
+
+bool DfxDomDump::AddChildNodeToStack(UIViewGroup *group, DomNode *parent, Graphic::Vector<DomNode*> &stackView) const
+{
+ if (group == nullptr || parent == nullptr) {
+ return false;
+ }
+ Graphic::Vector<UIView*> reverse;
+ for (UIView *child = group->GetChildrenHead();
+ child != nullptr; child = child->GetNextSibling()) {
+ reverse.PushBack(child);
+ }
+ int size = reverse.Size();
+ if (size == 0) {
+ return true;
+ }
+ if (cJSON_AddNumberToObject(parent->obj, "child-num", size) == nullptr) {
+ return false;
+ }
+ if (cJSON_AddArrayToObject(parent->obj, "children") == nullptr) {
+ return false;
+ }
+ for (int i = size - 1; i >= 0; --i) {
+ DomNode *childNode = new DomNode(parent, reverse[i]);
+ if (childNode == nullptr) {
+ return false;
+ }
+ stackView.PushBack(childNode);
+ }
+ return true;
+}
+
+bool DfxDomDump::RecordAndAddToParent(DomNode &curNode, Graphic::Vector<DomNode*> &buf) const
+{
+ if (curNode.parent != nullptr) {
+ buf.PushBack(&curNode);
+ cJSON *parentArray = cJSON_GetObjectItemCaseSensitive(curNode.parent->obj, "children");
+ if (parentArray == nullptr) {
+ return false;
+ }
+ if (!cJSON_AddItemToArray(parentArray, curNode.obj)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+void DfxDomDump::FreeDomNodeVector(Graphic::Vector<DomNode*> &vec) const
+{
+ for (uint16_t i = 0; i < vec.Size(); ++i) {
+ if (vec[i]->parent == nullptr) {
+ continue;
+ }
+ delete vec[i];
+ }
+}
+
+void DfxDomDump::PrintAndReleaseCjson(cJSON *obj) const
+{
+ if (obj == nullptr) {
+ return;
+ }
+ GraphicService::GetInstance()->PostGraphicEvent([obj]() {
+ FILE *file = fopen(RES_PATH"view_tree.json", "w");
+ defer {
+ if (file != nullptr) {
+ fclose(file);
+ }
+ };
+ char *info = cJSON_Print(obj);
+ if (info != nullptr) {
+ printf("%s\n", info);
+ if (file != nullptr) {
+ fwrite(info, 1, strlen(info), file);
+ }
+ cJSON_free(info);
+ }
+ cJSON_free(obj);
+ });
+}
+
+const char *DfxDomDump::UIViewType2Name(UIViewType type) const
+{
+ constexpr int size = sizeof(g_type2Name) / sizeof(g_type2Name[0]);
+ for (int i = 0; i < size; ++i) {
+ if (g_type2Name[i].type == type) {
+ return g_type2Name[i].name;
+ }
+ }
+ return "unkonwn";
+}
+}
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) 2024 CompanyNameMagicTag.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "securec.h"
+#include "dfx/dfx_frame_trace.h"
+
+namespace OHOS {
+static struct {
+ FrameTraceType type;
+ std::string str;
+} g_type2string[] = {
+ {FrameTraceType::SW_DRAW_TRANSFORM, "sw_tran"},
+ {FrameTraceType::SW_DRAW_IMGBLIT, "sw_blit"},
+ {FrameTraceType::HW_DRAW_IMGBLIT, "hw_blit"},
+ {FrameTraceType::HW_DRAW_PATH, "hw_path"},
+ {FrameTraceType::HW_CLIP_IMGBYPATH, "hw_clip"},
+ {FrameTraceType::SW_DRAW_CUBICBEZIER, "sw_bezier"},
+ {FrameTraceType::SW_DRAW_RECT, "sw_rect"},
+ {FrameTraceType::HW_DRAW_RECT, "hw_rect"},
+ {FrameTraceType::HW_DRAW_BLUR, "hw_blur"},
+ {FrameTraceType::SW_DRAW_LETTER, "sw_letter"},
+ {FrameTraceType::SW_DRAW_ARC, "sw_arc"},
+ {FrameTraceType::SW_DRAW_LINE, "sw_line"},
+ {FrameTraceType::HW_DRAW_SUBMIT, "hw_submit"},
+ {FrameTraceType::HW_DRAW_FLUSH, "hw_flush"},
+ {FrameTraceType::HW_DRAW_WAIT, "hw_wait"},
+};
+
+uint64_t DfxFrameTrace::GetDuration(uint64_t start, uint64_t end) const
+{
+ uint64_t dur = end >= start ? end - start : UINT64_MAX - start + end + 1;
+ return dur;
+}
+
+DfxFrameTrace& DfxFrameTrace::GetInstance()
+{
+ static DfxFrameTrace dfx;
+ return dfx;
+}
+
+void DfxFrameTrace::FrameTraceStart(FrameTraceType type)
+{
+ if (!CanTrace()) {
+ return;
+ }
+ if (drawStack_ == 0) {
+ RecordStart(type);
+ }
+ ++drawStack_;
+}
+
+void DfxFrameTrace::FrameTraceEnd(FrameTraceType type, const Rect *rect)
+{
+ if (!CanTrace()) {
+ return;
+ }
+ --drawStack_;
+ if (drawStack_ != 0) {
+ return;
+ }
+
+ RecordEnd(type, rect);
+}
+
+void DfxFrameTrace::RecordStart(FrameTraceType type)
+{
+ startTime_ = uapi_tcxo_get_us();
+ uint64_t preTime = 0;
+ if (drawCount_ == 0) {
+ preTime = 0;
+ firstDrawTime_ = startTime_;
+ } else {
+ preTime = GetDuration(endTime_, startTime_);
+ }
+
+ if (type == FrameTraceType::HW_DRAW_PATH) {
+ if (pathIndex_ == -1) {
+ pathIndex_ = drawCount_;
+ ++drawCount_;
+ }
+ trace_[pathIndex_].cmd = type;
+ trace_[pathIndex_].preTime += preTime;
+ return;
+ }
+ trace_[drawCount_].cmd = type;
+ trace_[drawCount_].preTime = preTime;
+}
+
+void DfxFrameTrace::RecordEnd(FrameTraceType type, const Rect *rect)
+{
+ endTime_ = uapi_tcxo_get_us();
+ uint64_t costTime = GetDuration(startTime_, endTime_);
+
+ if (type == FrameTraceType::HW_DRAW_PATH) {
+ trace_[pathIndex_].costTime += costTime;
+ ++pathCnt_;
+ return;
+ }
+ trace_[drawCount_].costTime = costTime;
+ rect_[drawCount_] = rect == nullptr ? Rect() : *rect;
+ if (type == FrameTraceType::HW_DRAW_SUBMIT) {
+ trace_[drawCount_].isNeedWait = (rect != nullptr);
+ }
+ ++drawCount_;
+}
+
+void DfxFrameTrace::ShowFrameTrace() const
+{
+ if (!beginTrace_) {
+ return;
+ }
+
+ uint64_t totalTime = GetDuration(firstDrawTime_, endTime_);
+ printf("\nisNativeRunning %d, freq %d", isNativeRunning_, freq_);
+ printf("\nCmd count: %d time: %llu, {%d %d %d %d}\n", drawCount_, totalTime,
+ drawRect_.GetLeft(), drawRect_.GetTop(), drawRect_.GetRight(), drawRect_.GetBottom());
+ for (int32_t i = 0; i < drawCount_; ++i) {
+ if (trace_[i].cmd == FrameTraceType::HW_DRAW_PATH) {
+ printf("%d. %s: %llu, %llu, %d\n",
+ i, ToString(trace_[i].cmd).c_str(), trace_[i].preTime, trace_[i].costTime, pathCnt_);
+ continue;
+ }
+ if (trace_[i].cmd == FrameTraceType::HW_DRAW_SUBMIT) {
+ printf("%d. %s: %llu, %llu, %d\n",
+ i, ToString(trace_[i].cmd).c_str(), trace_[i].preTime, trace_[i].costTime, trace_[i].isNeedWait);
+ continue;
+ }
+ if (!rect_[i].IsValid()) {
+ printf("%d. %s: %llu, %llu\n", i, ToString(trace_[i].cmd).c_str(), trace_[i].preTime, trace_[i].costTime);
+ continue;
+ }
+ printf("%d. %s: %llu, %llu, {%d, %d, %d, %d}\n",
+ i, ToString(trace_[i].cmd).c_str(), trace_[i].preTime, trace_[i].costTime,
+ rect_[i].GetLeft(), rect_[i].GetTop(), rect_[i].GetRight(), rect_[i].GetBottom());
+ }
+}
+
+void DfxFrameTrace::ClearState()
+{
+ memset_s(trace_, sizeof(trace_), 0, sizeof(trace_));
+ drawRect_ = Rect();
+ drawCount_ = 0;
+ drawStack_ = 0;
+ beginTrace_ = false;
+ startTime_ = 0;
+ endTime_ = 0;
+ firstDrawTime_ = 0;
+ pathCnt_ = 0;
+ pathIndex_ = -1;
+ freq_ = 0;
+ isNativeRunning_ = 0;
+}
+
+std::string DfxFrameTrace::ToString(FrameTraceType type) const
+{
+ constexpr int size = sizeof(g_type2string) / sizeof(g_type2string[0]);
+ for (int i = 0; i < size; ++i) {
+ if (g_type2string[i].type == type) {
+ return g_type2string[i].str;
+ }
+ }
+ return "";
+}
+} // OHOS
static uint32_t g_lastTime;
static uint32_t g_currentTime;
static uint32_t g_tpSetTime;
-static uint32_t g_renderStartTime;
static ShowType g_dfxShow = ShowType::DFX_SHOW_DISABLE;
static DfxRecord g_dfxRecord = {0};
static const uint16_t MS_TO_US = 1000;
-static uint32_t g_ulpsExit = 0;
-static uint32_t g_flush = 0;
static uint32_t GetTimeUs()
{
g_dfxShow = type;
}
-void DfxUlpsFlushRecord(uint8_t flag)
-{
- if (flag == 1) {
- g_ulpsExit++;
- } else {
- g_flush++;
- }
-}
-
-static void DfxUpdateTime(uint32_t& record)
-{
- uint32_t temp = GetTimeUs();
- record += (temp - g_dfxRecord.renderTimeStart);
- g_dfxRecord.renderTimeStart = temp;
-}
-
-static void DfxRenderRecordEnd(void)
-{
- g_dfxRecord.renderTimeSWTotal += g_dfxRecord.renderTimeSWCurr;
- if (g_dfxRecord.renderTimeSWCurr > g_dfxRecord.renderTimeSWMax) {
- g_dfxRecord.renderTimeSWMax = g_dfxRecord.renderTimeSWCurr;
- }
-
- g_dfxRecord.renderTimeHWTotal += g_dfxRecord.renderTimeHWCurr;
- if (g_dfxRecord.renderTimeHWCurr > g_dfxRecord.renderTimeHWMax) {
- g_dfxRecord.renderTimeHWMax = g_dfxRecord.renderTimeHWCurr;
- }
-
- g_dfxRecord.renderTimeFlushTotal += g_dfxRecord.renderTimeFlushCurr;
- if (g_dfxRecord.renderTimeFlushCurr > g_dfxRecord.renderTimeFlushMax) {
- g_dfxRecord.renderTimeFlushMax = g_dfxRecord.renderTimeFlushCurr;
- }
- g_dfxRecord.renderTimeTotal += GetTimeUs() - g_renderStartTime;
-}
-
-void DfxRecordTime(TimeRecordType type)
-{
- if (g_dfxShow != ShowType::DFX_SHOW_RENDER) {
- return;
- }
- switch (type) {
- case TimeRecordType::DFX_TIME_RECORD_SW_CURR:
- DfxUpdateTime(g_dfxRecord.renderTimeSWCurr);
- break;
- case TimeRecordType::DFX_TIME_RECORD_HW_CURR:
- DfxUpdateTime(g_dfxRecord.renderTimeHWCurr);
- break;
- case TimeRecordType::DFX_TIME_RECORD_FLUSH_CURR:
- DfxUpdateTime(g_dfxRecord.renderTimeFlushCurr);
- break;
- case TimeRecordType::DFX_TIME_RECORD_END:
- DfxRenderRecordEnd();
- break;
- default:
- return;
- }
-}
-
bool IsShowTPRaw()
{
return (g_dfxShow == ShowType::DFX_SHOW_TP);
g_tpSetTime = 0;
}
-void DfxRenderReset()
-{
- if (g_dfxShow == ShowType::DFX_SHOW_RENDER) {
- g_dfxRecord.renderTimeStart = GetTimeUs();
- g_dfxRecord.renderTimeSWCurr = 0;
- g_dfxRecord.renderTimeHWCurr = 0;
- g_dfxRecord.renderTimeFlushCurr = 0;
- g_dfxRecord.renderTimeSWMax = 0;
- g_dfxRecord.renderTimeHWMax = 0;
- g_dfxRecord.renderTimeFlushMax = 0;
- g_dfxRecord.renderCnt++;
- g_renderStartTime = g_dfxRecord.renderTimeStart;
- }
-}
-
void DfxRecordShow()
{
- if (g_dfxShow == ShowType::DFX_SHOW_ULPS) {
- GRAPHIC_LOGP("g_ulpsExit: %u, g_flush: %u\n", g_ulpsExit, g_flush);
- return;
- }
-
- if ((g_dfxShow != ShowType::DFX_SHOW_POINT) && (g_dfxShow != ShowType::DFX_SHOW_RENDER)) {
+ if (g_dfxShow != ShowType::DFX_SHOW_POINT) {
return;
}
GRAPHIC_LOGP("TP: sc: %u, gc: %u, sMin: %u, sMax: %u, g2sAvg: %u, g2sMax: %u", g_dfxRecord.setEventCnt,
g_dfxRecord.getEventCnt, g_dfxRecord.setEventGapMin, g_dfxRecord.setEventGapMax, g2sAvg,
g_dfxRecord.getToSetTimeMax / MS_TO_US);
- } else if (g_dfxShow == ShowType::DFX_SHOW_RENDER) {
- float swAvg = (g_dfxRecord.renderCnt == 0) ? 0 :
- static_cast<float>(g_dfxRecord.renderTimeSWTotal) / (g_dfxRecord.renderCnt * MS_TO_US);
- float hwAvg = (g_dfxRecord.renderCnt == 0) ? 0 :
- static_cast<float>(g_dfxRecord.renderTimeHWTotal) / (g_dfxRecord.renderCnt * MS_TO_US);
- float dpuAvg = (g_dfxRecord.renderCnt == 0) ? 0 :
- static_cast<float>(g_dfxRecord.renderTimeFlushTotal) / (g_dfxRecord.renderCnt * MS_TO_US);
- float totalAvg = (g_dfxRecord.renderCnt == 0) ? 0 :
- static_cast<float>(g_dfxRecord.renderTimeTotal) / (g_dfxRecord.renderCnt * MS_TO_US);
- GRAPHIC_LOGP("Render: Cnt: %u, totalAvg: %4.2f, swAvg: %4.2f, swMax: %u, subAvg: %4.2f "
- "subMax: %u, flushAvg: %4.2f, flushMax: %u",
- g_dfxRecord.renderCnt, totalAvg, swAvg, g_dfxRecord.renderTimeSWMax / MS_TO_US, hwAvg,
- g_dfxRecord.renderTimeHWMax / MS_TO_US, dpuAvg, g_dfxRecord.renderTimeFlushMax / MS_TO_US);
}
g_lastTime = g_currentTime;
memset_s(&g_dfxRecord, sizeof(g_dfxRecord), 0, sizeof(g_dfxRecord));
return;
}
-void DfxUlpsFlushRecord(uint8_t flag)
-{
- return;
-}
-
bool IsShowTPRaw()
{
return false;
return false;
}
-void DfxRecordTime(TimeRecordType type)
-{
- return;
-}
-
void DfxTPSetEvent(uint32_t time)
{
return;
{
return;
}
-
-void DfxRenderReset()
-{
- return;
-}
#endif // ENABLE_DFX_CMD
}
hardwareView_ = nullptr;
}
+ bool HasPendingFrame()
+ {
+ return lastAsyncInfo_.hasPendingFrame;
+ }
+
#endif
private:
LiteMGfxEngine() {}
void AddHwDraw(uint16_t cnt);
void AsyncFlush();
#endif
+ void FlushInner(const Rect &rect);
};
}
#endif // GRAPHIC_LITE_LITE_M_GFX_ENGINE_H
* Author:
* Create: 2023-10
*/
-
-#include "draw/draw_utils.h"
-#include "common/screen.h"
-#include "engines/gfx/lite_m_gfx_engine.h"
#include "turn_page_effect.h"
+#include "imgdecode/image_load.h"
namespace OHOS {
-static constexpr int16_t CAMERA_DISTANCE = 600;
-static constexpr int16_t EASE_RANGE = 100;
-
-void TurnPageEffect::GetImgs(UIView* leftCard, UIView* rightCard)
-{
- ImageInfo info;
- ImageInfo leftInfo;
- ImageInfo rightInfo;
-
- if (preLeftCard != nullptr) {
- info = *(imgll_.GetImageInfo());
- ImageCacheFree(info);
- info = *(imglr_.GetImageInfo());
- ImageCacheFree(info);
- info = *(imgrl_.GetImageInfo());
- ImageCacheFree(info);
- info = *(imgrr_.GetImageInfo());
- ImageCacheFree(info);
- preLeftCard->SetVisible(true);
- preRightCard->SetVisible(true);
- }
-
- if (leftCard->GetViewType() == UI_IMAGE_VIEW) {
- leftInfo = *(static_cast<UIImageView *>(leftCard)->GetImageInfo());
- rightInfo = *(static_cast<UIImageView *>(rightCard)->GetImageInfo());
- } else {
- leftCard->GetBitmap(leftInfo);
- rightCard->GetBitmap(rightInfo);
- }
-
- int16_t height = Screen::GetInstance().GetHeight();
- int16_t middleWidth = Screen::GetInstance().GetWidth() / 2;
- int16_t middleHeight = height / 2;
- imgll_.SetPosition(0, 0, middleWidth, height);
- GetBitmapByRect(leftInfo, info, Rect(0, 0, middleWidth - 1, height - 1));
- imgll_.SetSrc(&info);
-
- imglr_.SetPosition(middleWidth - 1, 0, middleWidth, height);
- imglr_.SetCameraPosition(Vector2<float>(0, middleHeight));
- imglr_.SetCameraDistance(CAMERA_DISTANCE);
- GetBitmapByRect(leftInfo, info, Rect(middleWidth - 1, 0, leftCard->GetWidth() - 1, height - 1));
- imglr_.SetSrc(&info);
-
- imgrl_.SetPosition(0, 0, middleWidth, height);
- imgrl_.SetCameraPosition(Vector2<float>(middleWidth, middleHeight));
- imgrl_.SetCameraDistance(CAMERA_DISTANCE);
- GetBitmapByRect(rightInfo, info, Rect(0, 0, middleWidth - 1, height - 1));
- imgrl_.SetSrc(&info);
-
- imgrr_.SetPosition(middleWidth, 0, middleWidth, height);
- GetBitmapByRect(rightInfo, info, Rect(middleWidth, 0, leftCard->GetWidth() - 1, height - 1));
- imgrr_.SetSrc(&info);
-
- leftCard->SetVisible(false);
- rightCard->SetVisible(false);
- preLeftCard = leftCard;
- preRightCard = rightCard;
-
- if (leftCard->GetViewType() != UI_IMAGE_VIEW) {
- ImageCacheFree(leftInfo);
- ImageCacheFree(rightInfo);
- }
-}
-
-bool TurnPageEffect::GetBitmapByRect(ImageInfo& srcInfo, ImageInfo& dstInfo, const Rect rect)
-{
- BufferInfo srcBuff;
- uint8_t bpp = DrawUtils::GetByteSizeByColorMode(srcInfo.header.colorMode);
- srcBuff.mode = static_cast<ColorMode>(srcInfo.header.colorMode);
- srcBuff.compressMode = 0;
- srcBuff.stride = ALIGN_BYTE(srcInfo.header.width, BYTE_ALIGNMENT) * bpp;
- srcBuff.phyAddr = static_cast<void *>(const_cast<uint8_t *>(srcInfo.phyAddr));
- srcBuff.virAddr = static_cast<void *>(const_cast<uint8_t *>(srcInfo.data));
- srcBuff.width = srcInfo.header.width;
- srcBuff.height = srcInfo.header.height;
- srcBuff.rect = rect;
-
- dstInfo.header.width = rect.GetWidth();
- dstInfo.header.height = rect.GetHeight();
- dstInfo.header.colorMode = srcBuff.mode;
- dstInfo.dataSize = ALIGN_BYTE(dstInfo.header.width, BYTE_ALIGNMENT) * dstInfo.header.height * bpp;
- dstInfo.header.compressMode = 0;
- if (ImageCacheMalloc(dstInfo) == nullptr) {
- return false;
- }
-
- Rect dstRect = Rect(0, 0, rect.GetWidth() - 1, rect.GetHeight() - 1);
- BufferInfo dstBuf;
- dstBuf.mode = srcBuff.mode;
- dstBuf.compressMode = 0;
- dstBuf.stride = ALIGN_BYTE(rect.GetWidth(), BYTE_ALIGNMENT) * bpp;
- dstBuf.phyAddr = static_cast<void *>(const_cast<uint8_t *>(dstInfo.phyAddr));
- dstBuf.virAddr = static_cast<void *>(const_cast<uint8_t *>(dstInfo.data));
- dstBuf.width = rect.GetWidth();
- dstBuf.height = rect.GetHeight();
- dstBuf.rect = dstRect;
-
- BlendOption opt;
- opt.opacity = OPA_OPAQUE;
- opt.mode = BLEND_SRC;
- if (LiteMGfxEngine::GetInstance()->IsAsyncModeEnabled()) {
- LiteMGfxEngine::GetInstance()->Flush(Rect(0, 0, 0, 0));
- }
- BaseGfxEngine::GetInstance()->Blit(dstBuf, {0, 0}, srcBuff, dstRect, opt);
-#if ENABLE_VGU_ENGINE
- LiteMGfxEngine::GetInstance()->SyncHwDraw();
-#endif
- return true;
-}
-
void TurnPageEffect::OnSwipe(UISwipeView& view)
{
if (preLeftCard != nullptr) {
- container_->UIViewGroup::Remove(&imgll_);
- container_->UIViewGroup::Remove(&imglr_);
- container_->UIViewGroup::Remove(&imgrl_);
- container_->UIViewGroup::Remove(&imgrr_);
+ RemoveFromContainer();
+
preLeftCard->SetVisible(true);
preRightCard->SetVisible(true);
preLeftCard = nullptr;
preRightCard = nullptr;
- visibleCard_ = nullptr;
- ImageInfo info = *(imgll_.GetImageInfo());
- ImageCacheFree(info);
- info = *(imglr_.GetImageInfo());
- ImageCacheFree(info);
- info = *(imgrl_.GetImageInfo());
- ImageCacheFree(info);
- info = *(imgrr_.GetImageInfo());
- ImageCacheFree(info);
+ FreeInfo();
}
}
void TurnPageEffect::CommonAlg(UIView* leftCard, UIView* rightCard, int16_t xOffset)
{
- if (preLeftCard == nullptr) {
- container_->UIViewGroup::Add(&imgrr_);
- container_->UIViewGroup::Add(&imgll_);
- }
-
if (preLeftCard != leftCard && preRightCard != rightCard) {
- GetImgs(leftCard, rightCard);
- }
-
- int16_t width = Screen::GetInstance().GetWidth();
- int16_t middleWidth = width / 2;
- float factor;
- if (abs(xOffset) < middleWidth) {
- factor = EasingEquation::LinearEaseNone(0, EASE_RANGE, abs(xOffset), middleWidth);
- } else {
- factor = EasingEquation::LinearEaseNone(0, EASE_RANGE, width - abs(xOffset), middleWidth);
- }
-
- float angle = 90 * factor / EASE_RANGE; // 90: quarter cycle degrees
- Vector3<float> rotateStart = {middleWidth, 0, 0};
- Vector3<float> rotateEnd = {middleWidth, 1, 0};
- UIView* tmpCard = nullptr;
-
- if (xOffset > 0) {
- if (xOffset < middleWidth) {
- tmpCard = &imgrl_;
- } else {
- tmpCard = &imglr_;
- angle = -angle;
- rotateStart.x_ = 0.0;
- rotateEnd.x_ = 0.0;
+ if (preLeftCard != nullptr) {
+ preLeftCard->SetVisible(true);
+ preRightCard->SetVisible(true);
+ FreeInfo();
}
- } else if (xOffset < 0) {
- if (abs(xOffset) < middleWidth) {
- tmpCard = &imglr_;
- angle = -angle;
- rotateStart.x_ = 0.0;
- rotateEnd.x_ = 0.0;
+ if (leftCard->GetViewType() == UI_IMAGE_VIEW) {
+ lInfo_ = *(static_cast<UIImageView *>(leftCard)->GetImageInfo());
+ rInfo_ = *(static_cast<UIImageView *>(rightCard)->GetImageInfo());
} else {
- tmpCard = &imgrl_;
+ FreeInfo();
+ if (!AllocInfo(leftCard, rightCard)) {
+ GRAPHIC_LOGE("get bitmap failed!");
+ return;
+ }
+ lInfo_ = *leftInfo_;
+ rInfo_ = *rightInfo_;
}
- } else {
- if (preLeftCard == leftCard) {
- tmpCard = &imglr_;
- } else {
- tmpCard = &imgrl_;
- }
- }
- if (visibleCard_ != tmpCard) {
- container_->UIViewGroup::Remove(visibleCard_);
- container_->UIViewGroup::Add(tmpCard);
- visibleCard_ = tmpCard;
+ leftCard->SetVisible(false);
+ rightCard->SetVisible(false);
+ preLeftCard = leftCard;
+ preRightCard = rightCard;
}
-
- visibleCard_->Rotate(angle, rotateStart, rotateEnd);
- return;
+ AddToContainer();
+ turnPageView_.SetTurnPageInfo(&lInfo_, &rInfo_, ComputeAngle(xOffset));
}
void TurnPageEffect::CardSwipeAlg(UICardPage* leftCard, UICardPage* rightCard, int16_t xOffset)
{
CommonAlg(leftCard, rightCard, xOffset);
}
+
+void TurnPageEffect::FreeInfo()
+{
+ if (leftInfo_ != nullptr) {
+ ImageCacheFree(*leftInfo_);
+ delete leftInfo_;
+ leftInfo_ = nullptr;
+ }
+ if (rightInfo_ != nullptr) {
+ ImageCacheFree(*rightInfo_);
+ delete rightInfo_;
+ rightInfo_ = nullptr;
+ }
+}
+
+bool TurnPageEffect::AllocInfo(UIView* leftCard, UIView* rightCard)
+{
+ if (leftCard == nullptr || rightCard == nullptr) {
+ return false;
+ }
+ leftInfo_ = new ImageInfo;
+ rightInfo_ = new ImageInfo;
+ if (leftInfo_ == nullptr || rightInfo_ == nullptr) {
+ delete leftInfo_;
+ delete rightInfo_;
+ return false;
+ }
+ memset_s(leftInfo_, sizeof(ImageInfo), 0, sizeof(ImageInfo));
+ memset_s(rightInfo_, sizeof(ImageInfo), 0, sizeof(ImageInfo));
+ leftCard->GetBitmap(*leftInfo_);
+ rightCard->GetBitmap(*rightInfo_);
+ return true;
+}
+
+float TurnPageEffect::ComputeAngle(int16_t xOffset)
+{
+ float w = Screen::GetInstance().GetWidth();
+ float x = xOffset;
+ const float maxAngle = 180;
+ const float rightAngle = 90;
+ x = x < 0 ? -x : w - x;
+ float angle = x / w * maxAngle;
+ if (xOffset == 0) {
+ angle = lastPage_ ? 0 : maxAngle;
+ }
+ lastPage_ = (angle < rightAngle);
+ return angle;
+}
}
#ifndef UI_TURN_PAGE_H
#define UI_TURN_PAGE_H
+#include "common/screen.h"
+#include "turn_page_view.h"
#include "components/ui_cross_view.h"
namespace OHOS {
{
isNeedClip_ = true;
}
- ~TurnPageEffect() override {}
+ ~TurnPageEffect() override
+ {
+ FreeInfo();
+ }
void CardSwipeAlg(UICardPage* leftCard, UICardPage* rightCard, int16_t xOffset) override;
void CardSwipeAlg(UIImageView* leftCard, UIImageView* rightCard, int16_t xOffset) override;
void OnSwipe(UISwipeView& view) override;
}
private:
- UIImageView imgll_;
- UIImageView imglr_;
- UIImageView imgrl_;
- UIImageView imgrr_;
- UIView* visibleCard_ = nullptr;
+ TurnPageView turnPageView_;
+ ImageInfo lInfo_ = {0};
+ ImageInfo rInfo_ = {0};
+ bool added_ = false;
UIView* preLeftCard = nullptr;
UIView* preRightCard = nullptr;
UICrossView* container_ = nullptr;
+ ImageInfo *leftInfo_ = nullptr;
+ ImageInfo *rightInfo_ = nullptr;
+ bool lastPage_ = false; // false for left, true for right
- void GetImgs(UIView* leftCard, UIView* rightCard);
- bool GetBitmapByRect(ImageInfo& srcInfo, ImageInfo& dstInfo, const Rect rect);
void CommonAlg(UIView* leftCard, UIView* rightCard, int16_t xOffset);
+ void FreeInfo();
+ bool AllocInfo(UIView* leftCard, UIView* rightCard);
+ float ComputeAngle(int16_t xOffset);
+ void AddToContainer()
+ {
+ if (!added_) {
+ turnPageView_.SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+ container_->UIViewGroup::Add(&turnPageView_);
+ added_ = true;
+ }
+ }
+
+ void RemoveFromContainer()
+ {
+ if (added_) {
+ container_->UIViewGroup::Remove(&turnPageView_);
+ added_ = false;
+ }
+ }
};
}
#endif
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2024. All rights reserved.
+ * Description: TurnPageView
+ * Author:
+ * Create: 2024-6
+ */
+
+#include "turn_page_view.h"
+#include "imgdecode/image_load.h"
+#include "engines/gfx/lite_m_gfx_engine.h"
+
+namespace OHOS {
+void TurnPageView::SetTurnPageInfo(ImageInfo* leftCard, ImageInfo* rightCard, float angle)
+{
+ if (leftCard == nullptr || rightCard == nullptr) {
+ leftInfo_ = nullptr;
+ rightInfo_ = nullptr;
+ return;
+ }
+
+ int16_t height = GetHeight();
+ int16_t width = GetWidth();
+ if (height != leftCard->header.height || width != leftCard->header.width
+ || height != rightCard->header.height || width != rightCard->header.width) {
+ GRAPHIC_LOGE("image shape not coninsides with the view rect!");
+ leftInfo_ = nullptr;
+ rightInfo_ = nullptr;
+ return;
+ }
+ int16_t middleWidth = width / 2; // 2: half
+ int16_t middleHeight = height / 2; // 2: half
+ Rect origRect = GetOrigRect();
+ leftInfo_ = leftCard;
+ rightInfo_ = rightCard;
+ Rect rect;
+ rect.SetWidth(middleWidth);
+ rect.SetHeight(height);
+
+ // ll
+ rect.SetPosition(origRect.GetX(), origRect.GetY());
+ transll_.SetTransMapRect(rect);
+ // lr
+ rect.SetPosition(origRect.GetX() + middleWidth - 1, origRect.GetY());
+ translr_.SetTransMapRect(rect);
+ SetCamera({0, middleWidth}, translr_);
+ // rl
+ rect.SetPosition(origRect.GetX(), origRect.GetY());
+ transrl_.SetTransMapRect(rect);
+ SetCamera({middleWidth, middleHeight}, transrl_);
+ // rr
+ rect.SetPosition(origRect.GetX() + middleWidth, origRect.GetY());
+ transrr_.SetTransMapRect(rect);
+
+ RotateImg(angle);
+ UpdateInvalidArea();
+}
+
+void TurnPageView::OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea)
+{
+ DrawPartialRect(gfxDstBuffer, invalidatedArea, leftInfo_, transll_);
+ DrawPartialRect(gfxDstBuffer, invalidatedArea, rightInfo_, transrr_);
+ if (usingLeft_) {
+ DrawPartialRect(gfxDstBuffer, invalidatedArea, leftInfo_, translr_);
+ } else {
+ DrawPartialRect(gfxDstBuffer, invalidatedArea, rightInfo_, transrl_);
+ }
+}
+
+void TurnPageView::DrawPartialRect(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea,
+ ImageInfo *info, const TransformMap &transform)
+{
+ uint8_t opa = GetMixOpaScale();
+ if (info == nullptr) {
+ return;
+ }
+ Rect dstRect(invalidatedArea);
+ if (!dstRect.Intersect(dstRect, transform.GetBoxRect())) {
+ return;
+ }
+ BufferInfo src = {{0, 0, info->header.width - 1, info->header.height - 1}};
+ src.width = info->header.width;
+ src.height = info->header.height;
+ src.stride = static_cast<int32_t>(ImageLoad::GetAlignedStride(src.width,
+ info->header.compressMode, info->header.colorMode));
+ src.compressMode = info->header.compressMode;
+ src.mode = static_cast<ColorMode>(info->header.colorMode);
+ src.virAddr = reinterpret_cast<void*>(const_cast<uint8_t*>(info->data));
+ src.phyAddr = reinterpret_cast<void*>(const_cast<uint8_t*>(info->data));
+
+ BlendOption opt;
+ opt.mode = BLEND_SRC_OVER;
+ opt.opacity = opa;
+ src.rect = transform.GetTransMapRect();
+
+ opt.transMap.SetMatrix(transform.GetTransformMatrix());
+ BaseGfxEngine::GetInstance()->Blit(gfxDstBuffer, {0, 0}, src, dstRect, opt);
+}
+
+void TurnPageView::RotateImg(float angle)
+{
+ const float maxAngle = 180;
+ const float rightAngle = 90;
+ TransformMap *transform = angle < rightAngle ? &translr_ : &transrl_;
+ float w = GetWidth();
+ float x = angle < rightAngle ? 0 : w / 2; // 2: half
+ angle = angle < rightAngle ? angle : angle - maxAngle;
+ usingLeft_ = (transform == &translr_);
+ transform->Rotate(angle, Vector3<float>{x, 0, 0}, Vector3<float>{x, 1, 0});
+}
+
+void TurnPageView::UpdateInvalidArea()
+{
+ Rect joinRect = transll_.GetBoxRect();
+ joinRect.Join(joinRect, transrr_.GetBoxRect());
+ joinRect.Join(joinRect, translr_.GetBoxRect());
+ joinRect.Join(joinRect, transrl_.GetBoxRect());
+ InvalidateRect(joinRect);
+}
+} // OHOS
\ No newline at end of file
--- /dev/null
+/*
+ * Copyright (c) CompanyNameMagicTag 2024. All rights reserved.
+ * Description: TurnPageView
+ * Author:
+ * Create: 2024-6
+ */
+
+#ifndef UI_TURN_PAGE_VIEW_H
+#define UI_TURN_PAGE_VIEW_H
+#include "securec.h"
+#include "components/ui_view.h"
+
+namespace OHOS {
+class TurnPageView : public UIView {
+public:
+ TurnPageView()
+ {
+ }
+ ~TurnPageView() override {}
+ TurnPageView &operator=(const TurnPageView&) = delete;
+ TurnPageView(const TurnPageView&) = delete;
+ void SetTurnPageInfo(ImageInfo* leftCard, ImageInfo* rightCard, float angle);
+ void OnDraw(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea) override;
+
+private:
+ void DrawPartialRect(BufferInfo& gfxDstBuffer, const Rect& invalidatedArea,
+ ImageInfo *info, const TransformMap &transform);
+ void SetCamera(Vector2<float> pos, TransformMap &transform)
+ {
+ constexpr int16_t CAMERA_ZPOS = -600;
+ transform.SetCameraPosition(pos);
+ transform.SetCameraDistance(CAMERA_ZPOS);
+ }
+ void RotateImg(float angle);
+ void UpdateInvalidArea();
+ ImageInfo *leftInfo_ = nullptr;
+ ImageInfo *rightInfo_ = nullptr;
+ bool usingLeft_ = false;
+ TransformMap transll_;
+ TransformMap translr_;
+ TransformMap transrl_;
+ TransformMap transrr_;
+};
+} // OHOS
+#endif // UI_TURN_PAGE_VIEW_H
\ No newline at end of file
*
*/
void ExitLowPower();
-
/**
* @brief Check if LiteSurface is in rootView.
*
*/
bool IsLiteSurfaceInRootView();
- /**
- * @brief Increase use count for powerLock_, witch is used to lock at full freq(60fps).
- *
- */
- void PowerLock()
- {
- powerLock_++;
- }
-
- /**
- * @brief Decrease use count for powerLock_, witch is used to lock at full freq(60fps).
- *
- */
- void PowerUnLock()
- {
- if (powerLock_ > 0) {
- powerLock_--;
- }
- }
-
-protected:
+private:
uint32_t lastExitTime_ = 0;
- int8_t powerLock_ = 0;
-
- bool CheckGuiState();
- bool CheckTaskState();
- void EnterLowPower();
};
} // OHOS
#endif // GRAPHIC_LOW_POWER_MANAGER
#include "gfx_utils/mem_api.h"
#include "graphic_config.h"
#include "hals/gralloc_engines.h"
+#include "dfx/dfx_frame_trace.h"
namespace OHOS {
DisplayDev::DisplayDev() : isDisplayDevInited_{false}, devId_(0), layerFuncs_{nullptr}
}
if (layerFuncs_->SetLayerDirtyRegion != nullptr) {
+ FRAME_TRACE_SET_RECT(rect);
IRect iRect = {rect.GetX(), rect.GetY(), rect.GetWidth(), rect.GetHeight()};
if (layerFuncs_->SetLayerDirtyRegion(devId_, layer_[layerId].layerHdl, &iRect) !=
DISPLAY_SUCCESS) {
if (!AllocBufferOnce(info, buffer)) {
GRAPHIC_LOGE("GrallocEngines::AllocBuffer realloc size: %u", info.expectedSize);
if (ImageCacheManager::GetInstance().FreeAndGetBuf(info, buffer) == nullptr) {
+#if ENABLE_MEMORY_CHECK
DumpMem();
+#endif
#ifdef __LITEOS__
OsMemInfoPrint(reinterpret_cast<void*>(MEM_POOL_UI_OTHER));
#endif
void LiteInputDistributer::SendRawEvent(const RawEvent& rawEvent)
{
+#if !defined(_WIN32)
RawEvent event = rawEvent;
DisplayDev* displayDev = DisplayDev::GetInstance();
if ((event.type == InputDevType::INDEV_TYPE_TOUCH) &&
SendEventToPM(event);
#endif
SetEventData(event);
+#endif
}
void LiteInputDistributer::GetEventData(DeviceData& data, InputDevType type)
bool LiteInputDistributer::IsEventEmpty(InputDevType type)
{
if (type == InputDevType::INDEV_TYPE_TOUCH) {
- return ((g_lastData.state == 0) && (deviceData_.state == 0));
+ return ((g_lastData.state == 0) && (deviceData_.state == 0) && (dataBuf_.IsEmpty()));
} else if (type == InputDevType::INDEV_TYPE_KEY) {
return keyList_.IsEmpty();
}
--- /dev/null
+/*\r
+ * Copyright (c) 2024 CompanyNameMagicTag.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include "ui_test_coverflow2.h"\r
+#include "common/screen.h"\r
+#include "font/ui_font.h"\r
+#include "gfx_utils/graphic_math.h"\r
+#include "gfx_utils/rect.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label_ext.h"\r
+#include "components/ui_transform_group.h"\r
+\r
+namespace OHOS {\r
+namespace {\r
+struct FaceInfo {\r
+ const char* name;\r
+ const char* path;\r
+} ;\r
+\r
+static constexpr uint8_t COVERFLOW_MAX_PAGE_NUM = 6;\r
+static FaceInfo g_faceInfo[COVERFLOW_MAX_PAGE_NUM] = {\r
+ {"1 rainbow", RES_PATH"/rainbow.bin"},\r
+ {"2 kaleidoscope", RES_PATH"/kaleidoscope.bin"},\r
+ {"3 planet", RES_PATH"/planet.bin"},\r
+ {"4 rainbow", RES_PATH"/rainbow.bin"},\r
+ {"5 kaleidoscope", RES_PATH"/kaleidoscope.bin"},\r
+ {"6 planet", RES_PATH"/planet.bin"}\r
+};\r
+const char* addImgPath = RES_PATH"/add.bin";\r
+const char* subImgPath = RES_PATH"/sub.bin";\r
+static constexpr uint8_t PAGE_MARGIN = 20;\r
+static constexpr uint16_t PAGE_WIDTH = 250;\r
+static constexpr uint16_t PAGE_HEIGHT = 250;\r
+static constexpr uint8_t DIVISOR_TWO = 2;\r
+static constexpr int16_t LABEL_FONT_SIZE = 30;\r
+static constexpr uint16_t IMAGE_WIDTH = 200;\r
+static constexpr uint16_t IMAGE_HEIGHT = 200;\r
+} // namespace\r
+\r
+void UITestCoverflow2::SetUp()\r
+{\r
+ if (container_ == nullptr) {\r
+ container_ = new UIScrollView();\r
+ container_->SetThrowDrag(true);\r
+ container_->SetHorizontalScrollState(false);\r
+ container_->Resize(Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
+ }\r
+}\r
+\r
+void UITestCoverflow2::TearDown()\r
+{\r
+ if (coverflow_ != nullptr) {\r
+ UITransformGroup* child = dynamic_cast<UITransformGroup*>(coverflow_->GetChildrenHead());\r
+ while (child != nullptr) {\r
+ UIView* node = child;\r
+ child = dynamic_cast<UITransformGroup*>(child->GetNextSibling());\r
+ coverflow_->Remove(node);\r
+ delete node;\r
+ }\r
+ delete coverflow_;\r
+ coverflow_ = nullptr;\r
+ }\r
+ lastIndex_ = 0;\r
+ lastPage_ = nullptr;\r
+ addImage_ = nullptr;\r
+ if (label_ != nullptr) {\r
+ delete label_;\r
+ label_ = nullptr;\r
+ }\r
+\r
+ if (container_ != nullptr) {\r
+ delete container_;\r
+ container_ = nullptr;\r
+ }\r
+}\r
+\r
+const UIView* UITestCoverflow2::GetTestView()\r
+{\r
+ UITestCoverflow2001();\r
+ return container_;\r
+}\r
+\r
+void UITestCoverflow2::UITestCoverflow2001()\r
+{\r
+ if (container_ == nullptr) {\r
+ return;\r
+ }\r
+ if (coverflow_ == nullptr) {\r
+ coverflow_ = new UICoverFlowView2();\r
+ }\r
+ coverflow_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
+ coverflow_->SetThrowDrag(true);\r
+ coverflow_->SetOnCoverflowListener(this);\r
+ coverflow_->SetPagePadding(PAGE_MARGIN);\r
+ container_->Add(coverflow_);\r
+ for (uint8_t i = 0; i < COVERFLOW_MAX_PAGE_NUM - 1; i++) {\r
+ UITransformGroup* page = new UITransformGroup();\r
+ page->SetPosition(0, 100, PAGE_WIDTH, PAGE_HEIGHT); // 100: y position\r
+ UIImageView* image = new UIImageView();\r
+ image->Resize(IMAGE_WIDTH, IMAGE_HEIGHT);\r
+ page->Add(image);\r
+ ImageInfo* src = ImageCacheManager::GetInstance().LoadSingleRes(std::string(g_faceInfo[i].path));\r
+ image->SetSrc(src);\r
+ image->LayoutCenterOfParent();\r
+\r
+ UIImageView* imageSub = new UIImageView();\r
+ imageSub->SetPosition(200, 0, 50, 50); // 200: x position 50: width and height\r
+ page->Add(imageSub);\r
+ src = ImageCacheManager::GetInstance().LoadSingleRes(std::string(subImgPath));\r
+ imageSub->SetSrc(src);\r
+ imageSub->SetTouchable(true);\r
+ imageSub->SetOnClickListener(this);\r
+ coverflow_->Add(page);\r
+ lastPage_ = page;\r
+ }\r
+ CreateAddButton();\r
+ CreateTitleLabel();\r
+}\r
+\r
+void UITestCoverflow2::CreateAddButton()\r
+{\r
+ UITransformGroup* page = new UITransformGroup();\r
+ page->SetPosition(0, 100, PAGE_WIDTH, PAGE_HEIGHT);\r
+\r
+ if (addImage_ == nullptr) {\r
+ addImage_ = new UIImageView();\r
+ }\r
+\r
+ addImage_->Resize(IMAGE_WIDTH, IMAGE_HEIGHT);\r
+ addImage_->SetTouchable(true);\r
+ addImage_->SetAutoEnable(false);\r
+ addImage_->SetResizeMode(UIImageView::ImageResizeMode::FILL);\r
+ addImage_->SetOnClickListener(this);\r
+ page->Add(addImage_);\r
+ addImage_->LayoutCenterOfParent();\r
+\r
+ ImageInfo* src = ImageCacheManager::GetInstance().LoadSingleRes(std::string(addImgPath));\r
+ addImage_->SetSrc(src);\r
+ coverflow_->Add(page);\r
+}\r
+\r
+void UITestCoverflow2::CreateTitleLabel()\r
+{\r
+ if (label_ == nullptr) {\r
+ label_ = new UILabel();\r
+ }\r
+ label_->SetPosition(127, 50, 200, 50); // 127 50 200 50: label position\r
+ label_->SetTextColor(Color::White());\r
+ label_->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ lastIndex_ = coverflow_->GetCurrentPage();\r
+ label_->SetText(g_faceInfo[lastIndex_].name);\r
+ label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, LABEL_FONT_SIZE);\r
+ container_->Add(label_);\r
+}\r
+\r
+bool UITestCoverflow2::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+ if (&view == addImage_) {\r
+ UITransformGroup* page = new UITransformGroup();\r
+ page->SetPosition(0, 100, PAGE_WIDTH, PAGE_HEIGHT);\r
+\r
+ UIImageView* image = new UIImageView();\r
+ image->Resize(IMAGE_WIDTH, IMAGE_HEIGHT);\r
+ page->Add(image);\r
+ ImageInfo* src = ImageCacheManager::GetInstance().LoadSingleRes(RES_PATH"/planet.bin");\r
+ image->SetSrc(src);\r
+ image->LayoutCenterOfParent();\r
+\r
+ UIImageView* imageSub = new UIImageView();\r
+ imageSub->SetPosition(200, 0, 50, 50); // 200: x position 50: width and height\r
+ page->Add(imageSub);\r
+ src = ImageCacheManager::GetInstance().LoadSingleRes(std::string(subImgPath));\r
+ imageSub->SetSrc(src);\r
+ imageSub->SetTouchable(true);\r
+ imageSub->SetOnClickListener(this);\r
+ coverflow_->Insert(lastPage_, page);\r
+ lastPage_ = page;\r
+ } else {\r
+ UITransformGroup* page = dynamic_cast<UITransformGroup*>(view.GetParent());\r
+ UIView* child = page->GetChildrenHead();\r
+ while (child != nullptr) {\r
+ UIView* node = child;\r
+ child = child->GetNextSibling();\r
+ page->Remove(node);\r
+ delete node;\r
+ }\r
+ coverflow_->Remove(page);\r
+ delete page;\r
+ }\r
+ return true;\r
+}\r
+\r
+bool UITestCoverflow2::OnScroll(uint16_t distance)\r
+{\r
+ int16_t contMidX = static_cast<int16_t>(Screen::GetInstance().GetWidth() / DIVISOR_TWO);\r
+ int16_t minOffset = contMidX;\r
+ uint8_t newCenterIndex = lastIndex_;\r
+ for (uint8_t i = 0; i < coverflow_->GetChildrenNumber(); i++) {\r
+ Rect rect = coverflow_->GetViewByIndex(i)->GetOrigRect();\r
+ int16_t x = rect.GetLeft();\r
+ int16_t x1 = rect.GetRight();\r
+ int16_t xMid = static_cast<int16_t>(x + (x1 - x + 1) / DIVISOR_TWO);\r
+ int16_t distance = MATH_ABS(xMid - contMidX);\r
+ if (distance < minOffset) {\r
+ newCenterIndex = i;\r
+ minOffset = distance;\r
+ }\r
+ }\r
+ if (newCenterIndex != lastIndex_ && newCenterIndex < COVERFLOW_MAX_PAGE_NUM) {\r
+ lastIndex_ = newCenterIndex;\r
+ label_->SetText(g_faceInfo[newCenterIndex].name);\r
+ } else if (newCenterIndex >= COVERFLOW_MAX_PAGE_NUM) {\r
+ label_->SetText("");\r
+ }\r
+\r
+ Rect curViewRect = coverflow_->GetViewByIndex(lastIndex_)->GetOrigRect();\r
+ int16_t centerMid = curViewRect.GetLeft() + curViewRect.GetWidth() / DIVISOR_TWO;\r
+ int16_t offset = MATH_ABS(contMidX - centerMid);\r
+ if (offset > curViewRect.GetWidth() / DIVISOR_TWO) {\r
+ label_->SetStyle(STYLE_TEXT_OPA, 0);\r
+ } else {\r
+ uint8_t alpha = (uint8_t)((1.0f - ((float)offset / (curViewRect.GetWidth() / DIVISOR_TWO))) * OPA_OPAQUE);\r
+ label_->SetStyle(STYLE_TEXT_OPA, alpha);\r
+ }\r
+ return true;\r
+}\r
+} // namespace OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) 2024 CompanyNameMagicTag.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef UI_TEST_COVERFLOW_VIEW_2_H\r
+#define UI_TEST_COVERFLOW_VIEW_2_H\r
+\r
+#include "components/ui_coverflow_view2.h"\r
+#include "components/ui_scroll_view.h"\r
+#include "components/ui_label.h"\r
+#include "ui_test.h"\r
+\r
+namespace OHOS {\r
+class UITestCoverflow2 : public UITest,\r
+ public UICoverFlowView2::OnCoverflowScrollListener, public UIView::OnClickListener {\r
+public:\r
+ UITestCoverflow2() {}\r
+ ~UITestCoverflow2() override {}\r
+ void SetUp() override;\r
+ void TearDown() override;\r
+ const UIView* GetTestView() override;\r
+ /**\r
+ * @brief Test display UICoverflow\r
+ */\r
+ void UITestCoverflow2001();\r
+\r
+protected:\r
+ bool OnScroll(uint16_t distance) override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+ void CreateAddButton();\r
+ void CreateTitleLabel();\r
+\r
+ UIScrollView* container_ = nullptr;\r
+ UICoverFlowView2* coverflow_ = nullptr;\r
+ UILabel* label_ = nullptr;\r
+ UIImageView* addImage_ = nullptr;\r
+ uint16_t lastIndex_ = 0;\r
+ UITransformGroup* lastPage_ = nullptr;\r
+};\r
+} // namespace OHOS\r
+#endif // UI_TEST_COVERFLOW_VIEW_2_H\r
--- /dev/null
+/*\r
+ * Copyright (c) 2024 CompanyNameMagicTag.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include "ui_test_icosahedron.h"\r
+#include "common/screen.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_image_view.h"\r
+\r
+namespace OHOS {\r
+static constexpr uint8_t PLANES_NUM = 20;\r
+void EntryAnimatorCallback::Callback(UIView *view)\r
+{\r
+ UIIcosahedronView* footView = dynamic_cast<UIIcosahedronView*>(view);\r
+ int16_t el = EasingEquation::LinearEaseNone(startPos_, endPos_, animator_->GetRunTime(), animator_->GetTime());\r
+ footView->SetSideLength(el);\r
+ footView->RefreshIcosahedron();\r
+ const Vector3<float> rotateStart(Screen::GetInstance().GetWidth() / 2.0, // 2.0: divisor\r
+ Screen::GetInstance().GetHeight() / 2.0, 0); // 2.0: divisor\r
+ const Vector3<float> rotateEnd(0, 0, 0);\r
+ // 270 : stop angle\r
+ int16_t angle = EasingEquation::LinearEaseNone(0, 270, animator_->GetRunTime(), animator_->GetTime());\r
+ footView->RotatePlanes(angle, rotateStart, rotateEnd);\r
+}\r
+\r
+bool UITestIcosahedron::OnClick(UIView& view, const ClickEvent& event)\r
+{\r
+ if (view.GetViewType() == UI_IMAGE_VIEW) {\r
+ UIImageView* img = static_cast<UIImageView*>(&view);\r
+ img->SetSrc(imgInverseInfo_);\r
+ }\r
+ return true;\r
+}\r
+\r
+void UITestIcosahedron::SetUp()\r
+{\r
+ if (imgInfo_ == nullptr) {\r
+ imgInfo_ = ImageCacheManager::GetInstance().LoadSingleRes(RES_PATH"regular_hexagon.bin");\r
+ if (imgInfo_ == nullptr) {\r
+ return;\r
+ }\r
+ }\r
+ if (imgInverseInfo_ == nullptr) {\r
+ imgInverseInfo_ = ImageCacheManager::GetInstance().LoadSingleRes(RES_PATH"regular_hexagon_inverse.bin");\r
+ if (imgInverseInfo_ == nullptr) {\r
+ return;\r
+ }\r
+ }\r
+\r
+ if (container_ == nullptr) {\r
+ container_ = new UIIcosahedronView();\r
+ container_->SetThrowDrag(true);\r
+ container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());\r
+ container_->SetDefaultImage(imgInverseInfo_);\r
+ container_->SetLuminanceFactor(2); // 2: Twice as bright\r
+ for (uint8_t i = 0; i < PLANES_NUM - 5; i++) { // 5: Reduce the quantity and test the default image.\r
+ UIImageView* view = new UIImageView();\r
+ view->SetTouchable(true);\r
+ view->SetOnClickListener(this);\r
+ view->SetSrc(imgInfo_);\r
+ container_->Add(view);\r
+ }\r
+ if (callback_ == nullptr) {\r
+ callback_ = new EntryAnimatorCallback(container_, 30, 200); // 30: Initial Size 200: Final display size\r
+ }\r
+ enterAnimator_ = callback_->GetAnimator();\r
+ }\r
+}\r
+\r
+void UITestIcosahedron::TearDown()\r
+{\r
+ if (container_ != nullptr) {\r
+ DeleteChildren(container_);\r
+ container_ = nullptr;\r
+ }\r
+ if (imgInfo_ != nullptr) {\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(RES_PATH"regular_hexagon.bin");\r
+ imgInfo_ = nullptr;\r
+ }\r
+ if (imgInverseInfo_ != nullptr) {\r
+ ImageCacheManager::GetInstance().UnloadSingleRes(RES_PATH"regular_hexagon_inverse.bin");\r
+ imgInverseInfo_ = nullptr;\r
+ }\r
+ if (callback_ != nullptr) {\r
+ delete callback_;\r
+ callback_ = nullptr;\r
+ }\r
+}\r
+\r
+const UIView* UITestIcosahedron::GetTestView()\r
+{\r
+ enterAnimator_->Start();\r
+ return container_;\r
+}\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) 2024 CompanyNameMagicTag.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef UI_TEST_ICOSAHEDRON_H\r
+#define UI_TEST_ICOSAHEDRON_H\r
+\r
+#include "ui_test.h"\r
+#include "components/ui_icosahedron_view.h"\r
+#include "components/ui_image_view.h"\r
+#include "animator/animator_manager.h"\r
+\r
+namespace OHOS {\r
+class EntryAnimatorCallback : public AnimatorCallback {\r
+public:\r
+ explicit EntryAnimatorCallback(UIView* view, int16_t startPos, int16_t endPos)\r
+ : startPos_(startPos),\r
+ endPos_(endPos),\r
+ animator_(new Animator(this, view, 1000, false)) {} // 1000:duration of animator_, in milliseconds.\r
+\r
+ ~EntryAnimatorCallback() override\r
+ {\r
+ if (animator_ != nullptr) {\r
+ delete animator_;\r
+ animator_ = nullptr;\r
+ }\r
+ }\r
+\r
+ void Callback(UIView* view) override;\r
+\r
+ Animator* GetAnimator() const\r
+ {\r
+ return animator_;\r
+ }\r
+\r
+protected:\r
+ int16_t startPos_;\r
+ int16_t endPos_;\r
+ Animator* animator_;\r
+};\r
+\r
+class UITestIcosahedron : public UITest, public UIView::OnClickListener {\r
+public:\r
+ UITestIcosahedron() {}\r
+ ~UITestIcosahedron() override {}\r
+ void SetUp() override;\r
+ void TearDown() override;\r
+ const UIView* GetTestView() override;\r
+ bool OnClick(UIView& view, const ClickEvent& event) override;\r
+\r
+private:\r
+ UIIcosahedronView* container_ = nullptr;\r
+ ImageInfo* imgInfo_ = nullptr;\r
+ ImageInfo* imgInverseInfo_ = nullptr;\r
+ EntryAnimatorCallback* callback_ = nullptr;\r
+ Animator* enterAnimator_ = nullptr;\r
+};\r
+}\r
+#endif // UI_TEST_ICOSAHEDRON_H
\ No newline at end of file
item->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);
item->SetImgResizeMode(UIImageView::ImageResizeMode::CENTER);
item->SetFont(fontName_, fontSize_);
- item->SetAlign(TEXT_ALIGNMENT_CENTER);
item->SetScaleAlignMode(UIMenuItem::ScaleAlignMode::ALIGN_ITEM_CENTER);
item->SetLineBreakMode(UILabel::LineBreakMode::LINE_BREAK_MARQUEE);
} else {
}
item->SetImageSrc(node->data_->imgInfo);
item->SetText(node->data_->txt);
+ item->SetAlign(TEXT_ALIGNMENT_CENTER);
item->SetViewIndex(index);
}
return item;
ImageInfo* info;
};
-static constexpr uint8_t ITEM_CNT = 6;
+static constexpr uint8_t ITEM_CNT = 10;
static RollerItemStruct g_rollerItems[ITEM_CNT] = {
{"planet", RES_PATH"/planet.bin", nullptr},
- {"kaleidoscope", RES_PATH"/kaleidoscope.bin", nullptr},
- {"rainbow", RES_PATH"/rainbow.bin", nullptr},
{"kaleidoscope1", RES_PATH"/kaleidoscope.bin", nullptr},
- {"planet1", RES_PATH"/planet.bin", nullptr},
- {"rainbow1", RES_PATH"/rainbow.bin", nullptr},
+ {"kaleidoscope2", RES_PATH"/kaleidoscope.bin", nullptr},
+ {"kaleidoscope3", RES_PATH"/kaleidoscope.bin", nullptr},
+ {"kaleidoscope4", RES_PATH"/kaleidoscope.bin", nullptr},
+ {"kaleidoscope5", RES_PATH"/kaleidoscope.bin", nullptr},
+ {"kaleidoscope6", RES_PATH"/kaleidoscope.bin", nullptr},
+ {"kaleidoscope7", RES_PATH"/kaleidoscope.bin", nullptr},
+ {"kaleidoscope8", RES_PATH"/kaleidoscope.bin", nullptr},
+ {"rainbow", RES_PATH"/rainbow.bin", nullptr}
};
void UITestRollerView::CreateButton(UILabelButton*& button, const char* text, int16_t x, int16_t y)
container_->Add(button);
}
+void UITestRollerView::CreateNoMirrorRollerView()
+{
+ noMirrorRollerView_ = new UIRollerView(false);
+ noMirrorRollerView_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
+ noMirrorRollerView_->SetItemSize(150, 150); // 150: item size
+ noMirrorRollerView_->SetThrowDrag(true);
+ noMirrorRollerView_->SetItemPadding(80); // 80: item padding
+ noMirrorRollerView_->SetCamDistance(380); // 380: Camer distance
+ noMirrorRollerView_->SetCamY(48); // 48: Camer Y position
+ for (uint8_t i = 0; i < ITEM_CNT; i++) {
+ if (g_rollerItems[i].info == nullptr) {
+ g_rollerItems[i].info = ImageCacheManager::GetInstance().LoadSingleRes(g_rollerItems[i].path);
+ }
+ noMirrorRollerView_->AddItem(g_rollerItems[i].name, g_rollerItems[i].info);
+ }
+ noMirrorRollerView_->SetCurrentItem("rainbow", false);
+}
+
void UITestRollerView::SetUp()
{
+ CreateNoMirrorRollerView();
+
container_ = new UIViewGroup();
container_->SetPosition(0, 0, Screen::GetInstance().GetWidth(), Screen::GetInstance().GetHeight());
container_->SetStyle(STYLE_BACKGROUND_OPA, OPA_OPAQUE);
rollerView_->SetThrowDrag(true);
rollerView_->SetItemPadding(80); // 80: item padding
container_->Add(rollerView_);
-
+ curRollerView_ = rollerView_;
for (uint8_t i = 0; i < ITEM_CNT; i++) {
if (g_rollerItems[i].info == nullptr) {
g_rollerItems[i].info = ImageCacheManager::GetInstance().LoadSingleRes(g_rollerItems[i].path);
rollerView_->AddItem(g_rollerItems[i].name, g_rollerItems[i].info);
}
- rollerView_->SetCurrentItem("rainbow1", false);
+ rollerView_->SetCurrentItem("rainbow", false);
rollerView_->SetOnClickListener(this);
rollerView_->SetOnModeChangeListener(this);
CreateButton(alignBtn_, "align", 60, 370); // 60, 370: x y
CreateButton(switchAnimBtn_, "switchAnim", 180, 370); // 180, 370: x y
CreateButton(switchBtn_, "switch", 300, 370); // 300, 370: x y
+ CreateButton(offMirrorBtn_, "offMirror", 180, 420); // 180, 420: x y
}
void UITestRollerView::HideOrShowBtn()
alignBtn_->SetVisible(isVisible);
switchAnimBtn_->SetVisible(isVisible);
switchBtn_->SetVisible(isVisible);
+ offMirrorBtn_->SetVisible(isVisible);
isBtnVisible_ = isVisible;
}
void UITestRollerView::OnModeChange(UIRollerView* view, RollerViewMode targetMode)
rollerView_->ClearAll();
} else if (&view == alignBtn_) {
printf("Align kaleidoscope.");
- rollerView_->SetCurrentItem("kaleidoscope", true);
+ rollerView_->SetCurrentItem("kaleidoscope5", true);
} else if (&view == switchBtn_) {
RollerViewMode mode = rollerView_->GetMode();
RollerViewMode setMode = (mode == DISPLAY) ? COVER : DISPLAY;
RollerViewMode mode = rollerView_->GetMode();
RollerViewMode setMode = (mode == DISPLAY) ? COVER : DISPLAY;
rollerView_->SetMode(setMode, true);
+ } else if (&view == offMirrorBtn_) {
+ if (curRollerView_ == rollerView_) {
+ container_->Remove(rollerView_);
+ container_->Insert(nullptr, noMirrorRollerView_);
+ curRollerView_ = noMirrorRollerView_;
+ } else {
+ container_->Remove(noMirrorRollerView_);
+ container_->Insert(nullptr, rollerView_);
+ curRollerView_ = rollerView_;
+ }
}
return true;
}
void UITestRollerView::TearDown()
{
- container_->Remove(rollerView_);
+ if (curRollerView_ == rollerView_) {
+ container_->Remove(rollerView_);
+ } else {
+ container_->Remove(noMirrorRollerView_);
+ }
+ curRollerView_ = nullptr;
delete rollerView_;
+ delete noMirrorRollerView_;
rollerView_ = nullptr;
+ noMirrorRollerView_ = nullptr;
DeleteChildren(container_);
removeCurrentBtn_ = nullptr;
switchAnimBtn_ = nullptr;
switchBtn_ = nullptr;
container_ = nullptr;
-
+ offMirrorBtn_ = nullptr;
isBtnVisible_ = false;
}
private:
void CreateButton(UILabelButton*& button, const char* text, int16_t x, int16_t y);
void HideOrShowBtn();
-
+ void CreateNoMirrorRollerView();
UIViewGroup* container_ = nullptr;
UIRollerView* rollerView_ = nullptr;
-
+ UIRollerView* noMirrorRollerView_ = nullptr;
+ UIRollerView* curRollerView_ = nullptr;
UILabelButton* removeCurrentBtn_ = nullptr;
UILabelButton* addBackBtn_ = nullptr;
UILabelButton* clearBtn_ = nullptr;
UILabelButton* alignBtn_ = nullptr;
UILabelButton* switchAnimBtn_ = nullptr;
UILabelButton* switchBtn_ = nullptr;
-
+ UILabelButton* offMirrorBtn_ = nullptr;
bool isBtnVisible_ = false;
};
}
--- /dev/null
+/*\r
+ * Copyright (c) 2024 CompanyNameMagicTag.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include "scale_item_adapter.h"\r
+#include "common/image_cache_manager.h"\r
+#include "components/ui_transform_group.h"\r
+#include "components/ui_image_view.h"\r
+#include "components/ui_label_ext.h"\r
+#include "graphic_config.h"\r
+#include "ui_test_list_fps/ui_list_fps_res.h"\r
+#include "securec.h"\r
+\r
+namespace OHOS {\r
+class ItemContainer : public UITransformGroup {\r
+public:\r
+ ItemContainer() : image_(nullptr), label_(nullptr)\r
+ {\r
+ SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ }\r
+\r
+ ~ItemContainer() override\r
+ {\r
+ RemoveAll();\r
+ if (image_ != nullptr) {\r
+ delete image_;\r
+ image_ = nullptr;\r
+ }\r
+ if (label_ != nullptr) {\r
+ delete label_;\r
+ label_ = nullptr;\r
+ }\r
+ }\r
+\r
+ bool InitContainer()\r
+ {\r
+ if (image_ == nullptr) {\r
+ image_ = new UIImageView();\r
+ if (image_ == nullptr) {\r
+ return false;\r
+ }\r
+ }\r
+ image_->SetResizeMode(UIImageView::ImageResizeMode::CENTER);\r
+\r
+ if (label_ == nullptr) {\r
+ label_ = new UILabelExt();\r
+ if (label_ == nullptr) {\r
+ delete image_;\r
+ image_ = nullptr;\r
+ return false;\r
+ }\r
+ }\r
+ label_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ label_->SetFont(DEFAULT_VECTOR_FONT_FILENAME, 40); // 40: item font size\r
+\r
+ Add(label_);\r
+ Add(image_);\r
+ return true;\r
+ }\r
+\r
+ UIImageView* GetImageView()\r
+ {\r
+ return image_;\r
+ }\r
+\r
+ UILabelExt* GetLabelView()\r
+ {\r
+ return label_;\r
+ }\r
+\r
+ ItemContainer(const ItemContainer &) = delete;\r
+ ItemContainer &operator=(const ItemContainer &) = delete;\r
+private:\r
+ UIImageView* image_;\r
+ UILabelExt* label_;\r
+};\r
+\r
+ScaleItemAdapter::~ScaleItemAdapter()\r
+{\r
+ ClearData();\r
+}\r
+\r
+uint16_t ScaleItemAdapter::GetCount()\r
+{\r
+ return nodeList_.Size();\r
+}\r
+\r
+void ScaleItemAdapter::ClearData()\r
+{\r
+ ListNode<ItemDataNode*>* node = nodeList_.Begin();\r
+ while (node != nodeList_.End()) {\r
+ if (node->data_ != nullptr) {\r
+ if (node->data_->txt != nullptr) {\r
+ UIFree(node->data_->txt);\r
+ node->data_->txt = nullptr;\r
+ }\r
+ UIFree(node->data_);\r
+ node->data_ = nullptr;\r
+ }\r
+ node = node->next_;\r
+ }\r
+ ImageCacheManager::GetInstance().UnloadAllInMultiRes(LIST_FPS);\r
+}\r
+\r
+void ScaleItemAdapter::FreeNode(ItemDataNode* node)\r
+{\r
+ if (node != nullptr) {\r
+ if (node->txt != nullptr) {\r
+ UIFree(node->txt);\r
+ node->txt = nullptr;\r
+ }\r
+ UIFree(node);\r
+ node = nullptr;\r
+ }\r
+}\r
+\r
+void ScaleItemAdapter::SetData(const List<ItemDataNode*>* data)\r
+{\r
+ if (data == nullptr) {\r
+ return;\r
+ }\r
+ if (!nodeList_.IsEmpty()) {\r
+ ClearData();\r
+ }\r
+ ListNode<ItemDataNode*>* node = data->Begin();\r
+ while (node != data->End()) {\r
+ ItemDataNode* tmpNode = static_cast<ItemDataNode *>(UIMalloc(sizeof(ItemDataNode)));\r
+ if (tmpNode == nullptr) {\r
+ return;\r
+ }\r
+\r
+ tmpNode->resId = node->data_->resId;\r
+ uint32_t len = strlen(node->data_->txt);\r
+ tmpNode->txt = static_cast<char*>(UIMalloc(len + 1));\r
+ if (tmpNode->txt == nullptr) {\r
+ FreeNode(tmpNode);\r
+ return;\r
+ }\r
+ if (memcpy_s(tmpNode->txt, len + 1, node->data_->txt, len) != EOK) {\r
+ FreeNode(tmpNode);\r
+ return;\r
+ }\r
+ tmpNode->txt[len] = '\0';\r
+ tmpNode->lineBreakMode = node->data_->lineBreakMode;\r
+ tmpNode->imgInfo = nullptr;\r
+\r
+ nodeList_.PushBack(tmpNode);\r
+ node = node->next_;\r
+ }\r
+}\r
+\r
+UIView* ScaleItemAdapter::GetView(UIView* inView, int16_t index)\r
+{\r
+ if (nodeList_.IsEmpty() || index > nodeList_.Size() - 1 || index < 0) {\r
+ return nullptr;\r
+ }\r
+\r
+ ListNode<ItemDataNode*>* node = nodeList_.Begin();\r
+ for (uint16_t i = 0; i < index; i++) {\r
+ node = node->next_;\r
+ }\r
+ ItemContainer* item = nullptr;\r
+ if (inView == nullptr) {\r
+ item = new ItemContainer();\r
+ if (item == nullptr) {\r
+ return nullptr;\r
+ }\r
+ if (!item->InitContainer()) {\r
+ delete item;\r
+ return nullptr;\r
+ }\r
+ item->Resize(width_, height_);\r
+\r
+ UIImageView* image = item->GetImageView();\r
+ image->SetPosition(imageRect_.GetX(), imageRect_.GetY(), imageRect_.GetWidth(), imageRect_.GetHeight());\r
+\r
+ UILabelExt* label = item->GetLabelView();\r
+ label->SetPosition(labelRect_.GetX(), labelRect_.GetY(), labelRect_.GetWidth(), labelRect_.GetHeight());\r
+ } else {\r
+ item = static_cast<ItemContainer*>(inView);\r
+ }\r
+\r
+ if (item != nullptr) {\r
+ if (node->data_->imgInfo == nullptr) {\r
+ node->data_->imgInfo = ImageCacheManager::GetInstance().LoadOneInMultiRes(node->data_->resId, LIST_FPS);\r
+ }\r
+ UIImageView* image = item->GetImageView();\r
+ if (image != nullptr) {\r
+ image->SetSrc(node->data_->imgInfo);\r
+ }\r
+ UILabelExt* label = item->GetLabelView();\r
+ if (label != nullptr) {\r
+ label->SetText(node->data_->txt);\r
+ label->SetLineBreakMode(node->data_->lineBreakMode);\r
+ label->SetAlign(TEXT_ALIGNMENT_CENTER, TEXT_ALIGNMENT_CENTER);\r
+ }\r
+ item->SetViewIndex(index);\r
+ }\r
+ return item;\r
+}\r
+\r
+void ScaleItemAdapter::ItemResize(uint16_t w, uint16_t h)\r
+{\r
+ width_ = w;\r
+ height_ = h;\r
+}\r
+\r
+void ScaleItemAdapter::SetLabelPosition(int16_t x, int16_t y, uint16_t w, uint16_t h)\r
+{\r
+ labelRect_.SetPosition(x, y);\r
+ labelRect_.SetWidth(w);\r
+ labelRect_.SetHeight(h);\r
+}\r
+\r
+void ScaleItemAdapter::SetImagePosition(int16_t x, int16_t y, uint16_t w, uint16_t h)\r
+{\r
+ imageRect_.SetPosition(x, y);\r
+ imageRect_.SetWidth(w);\r
+ imageRect_.SetHeight(h);\r
+}\r
+} // namespace OHOS
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) 2024 CompanyNameMagicTag.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+#ifndef SCALE_ITEM_ADAPTER_H\r
+#define SCALE_ITEM_ADAPTER_H\r
+#include "components/abstract_adapter.h"\r
+#include "gfx_utils/list.h"\r
+#include "gfx_utils/vector.h"\r
+\r
+namespace OHOS {\r
+struct ItemDataNode {\r
+ int resId;\r
+ char* txt;\r
+ uint8_t lineBreakMode;\r
+ ImageInfo* imgInfo;\r
+};\r
+\r
+class ScaleItemAdapter : public AbstractAdapter {\r
+public:\r
+ ScaleItemAdapter() : width_(0), height_(0) {}\r
+ ~ScaleItemAdapter() override;\r
+\r
+ UIView* GetView(UIView* inView, int16_t index) override;\r
+ uint16_t GetCount() override;\r
+ void SetData(const List<ItemDataNode*>* data);\r
+\r
+ void ItemResize(uint16_t w, uint16_t h);\r
+ void SetLabelPosition(int16_t x, int16_t y, uint16_t w, uint16_t h);\r
+ void SetImagePosition(int16_t x, int16_t y, uint16_t w, uint16_t h);\r
+private:\r
+ void ClearData(void);\r
+ void FreeNode(ItemDataNode* node);\r
+ List<ItemDataNode*> nodeList_;\r
+ uint16_t width_;\r
+ uint16_t height_;\r
+ Rect imageRect_;\r
+ Rect labelRect_;\r
+};\r
+} // namespace OHOS\r
+#endif // SCALE_ITEM_ADAPTER_H\r
--- /dev/null
+/*\r
+ * Copyright (c) 2024 CompanyNameMagicTag.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include "ui_test_scale_list.h"\r
+#include "ui_test_list_fps/ui_list_fps_res.h"\r
+#include "graphic_config.h"\r
+#include "securec.h"\r
+\r
+namespace OHOS {\r
+static const int16_t LIST_WIDTH = 454;\r
+static const int16_t LIST_HEIGHT = 454;\r
+static const uint16_t ITEM_WIDTH = 400;\r
+static const uint16_t ITEM_HEIGHT = 100;\r
+static const uint16_t IMAGE_WIDTH = 100;\r
+static const uint16_t IMAGE_HEIGHT = 100;\r
+static const uint16_t LABEL_WIDTH = 350;\r
+static const uint16_t LABEL_HEIGHT = 100;\r
+static const uint16_t SCALE_FACTOR = 400;\r
+static ItemDataNode g_itemNode[] = {\r
+ {APPLIST_ALARM, "闹钟", UILabel::LINE_BREAK_ELLIPSIS},\r
+ {BLUETOOTH_TITLE, "蓝牙", UILabel::LINE_BREAK_ELLIPSIS},\r
+ {APPLIST_CALLER_IMAGE, "通话记录", UILabel::LINE_BREAK_ELLIPSIS},\r
+ {APPLIST_COMPASS_IMAGE, "指南针", UILabel::LINE_BREAK_ELLIPSIS},\r
+ {APPLIST_SETTING, "设置", UILabel::LINE_BREAK_ELLIPSIS},\r
+ {APPLIST_SPO2, "血氧饱和度", UILabel::LINE_BREAK_ELLIPSIS},\r
+ {APPLIST_VOCASSIST_IMAGE, "语音助手", UILabel::LINE_BREAK_ELLIPSIS},\r
+ {APPLIST_ALARM, "长文本滚动测试ABCD", UILabel::LINE_BREAK_MARQUEE},\r
+ {APPLIST_ALARM, "闹钟", UILabel::LINE_BREAK_ELLIPSIS},\r
+ {BLUETOOTH_TITLE, "蓝牙", UILabel::LINE_BREAK_ELLIPSIS},\r
+ {APPLIST_CALLER_IMAGE, "通话记录", UILabel::LINE_BREAK_ELLIPSIS},\r
+ {APPLIST_COMPASS_IMAGE, "指南针", UILabel::LINE_BREAK_ELLIPSIS}\r
+};\r
+\r
+static bool TransformItemBaseOnPosition(UITransformList* list, UIView* item)\r
+{\r
+ if (list == nullptr || item == nullptr) {\r
+ return false;\r
+ }\r
+ if (item->GetViewType() != UI_TRANSFORM_GROUP) {\r
+ return false;\r
+ }\r
+ UITransformGroup* group = dynamic_cast<UITransformGroup*>(item);\r
+ if (group == nullptr) {\r
+ return false;\r
+ }\r
+ int16_t w = group->GetWidth();\r
+ int16_t h = group->GetHeight();\r
+ if (list->GetDirection() == UIList::VERTICAL) {\r
+ int16_t midY = list->GetY() + (list->GetHeight() >> 1);\r
+ int16_t y = group->GetY();\r
+ int offset = (y + (h >> 1) - midY);\r
+ int temp = EasingEquation::SineEaseIn(0, SCALE_FACTOR, abs(offset), SCALE_FACTOR);\r
+ float scale = 1.0 - (static_cast<float>(temp) / SCALE_FACTOR);\r
+ group->Scale(Vector2<float>(scale, scale), Vector2<float>(w >> 1, h >> 1));\r
+ if ((y <= midY) && (y + group->GetHeight() >= midY)) {\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+}\r
+\r
+void UITestScaleList::SetUp()\r
+{\r
+ if (data_ == nullptr) {\r
+ data_ = new List<ItemDataNode*>();\r
+ if (data_ == nullptr) {\r
+ return;\r
+ }\r
+ for (uint8_t i = 0; i < (sizeof(g_itemNode) / sizeof(ItemDataNode)); ++i) {\r
+ data_->PushBack(&g_itemNode[i]);\r
+ }\r
+ }\r
+}\r
+\r
+void UITestScaleList::TearDown()\r
+{\r
+ if (data_ != nullptr) {\r
+ data_->Clear();\r
+ delete data_;\r
+ data_ = nullptr;\r
+ }\r
+ if (adapter_ != nullptr) {\r
+ delete adapter_;\r
+ adapter_ = nullptr;\r
+ }\r
+ if (list_ != nullptr) {\r
+ delete list_;\r
+ list_ = nullptr;\r
+ }\r
+}\r
+\r
+UIView* UITestScaleList::GetTestView()\r
+{\r
+ UIScaleListTest();\r
+ return list_;\r
+}\r
+\r
+void UITestScaleList::UIScaleListTest()\r
+{\r
+ adapter_ = new ScaleItemAdapter();\r
+ if (adapter_ == nullptr) {\r
+ TearDown();\r
+ return;\r
+ }\r
+ adapter_->ItemResize(ITEM_WIDTH, ITEM_HEIGHT);\r
+ adapter_->SetLabelPosition(IMAGE_WIDTH, 0, LABEL_WIDTH, LABEL_HEIGHT);\r
+ adapter_->SetImagePosition(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT);\r
+ adapter_->SetData(data_);\r
+\r
+ if (list_ == nullptr) {\r
+ list_ = new UITransformList();\r
+ }\r
+ list_->SetPosition(0, 0, LIST_WIDTH, LIST_HEIGHT);\r
+ list_->SetItemTransformFunc(&TransformItemBaseOnPosition);\r
+ list_->SetAdapter(adapter_);\r
+ list_->SetThrowDrag(true);\r
+ list_->SetStyle(STYLE_BACKGROUND_OPA, OPA_TRANSPARENT);\r
+ list_->SetMaxScrollDistance(1000); // 1000: max scroll distance\r
+ list_->SetSwipeACCLevel(800); // 800: compensation distance\r
+ list_->SetDragACCLevel(5); // 5: drag acceleration\r
+ list_->SetYScrollBarVisible(true);\r
+}\r
+} // namespace OHOS
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) 2024 CompanyNameMagicTag.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+#ifndef UI_TEST_SCALEABEL_LIST_H\r
+#define UI_TEST_SCALEABEL_LIST_H\r
+\r
+#include "graphic_config.h"\r
+#include "components/ui_transform_list.h"\r
+#include "ui_test.h"\r
+#include "ui_test_transform_list/scale_item_adapter.h"\r
+\r
+namespace OHOS {\r
+class UITestScaleList : public UITest {\r
+public:\r
+ UITestScaleList() : list_(nullptr), data_(nullptr), adapter_(nullptr) {}\r
+ ~UITestScaleList() override {}\r
+ void SetUp() override;\r
+ void TearDown() override;\r
+ UIView* GetTestView() override;\r
+ void UIScaleListTest();\r
+\r
+private:\r
+ UITransformList* list_;\r
+ List<ItemDataNode*>* data_;\r
+ ScaleItemAdapter* adapter_;\r
+};\r
+} // namespace OHOS\r
+#endif // UI_TEST_SCALEABEL_LIST_H
\ No newline at end of file
#if ENABLE_ICU && ENABLE_MULTI_FONT && ENABLE_SHAPING
#include "ui_test_font/ui_test_multi_font.h"
#endif
+#include "ui_test_icosahedron/ui_test_icosahedron.h"
#include "ui_test_texture_mapper/ui_test_texture_mapper.h"
#include "ui_test_label/ui_test_arc_label.h"
#include "ui_test_clock_dial/ui_test_clock_dial.h"
#include "ui_test_cross/ui_test_cross.h"
#include "ui_test_map/ui_test_map.h"
#include "ui_test_coverflow/ui_test_coverflow.h"
+#include "ui_test_coverflow/ui_test_coverflow2.h"
#include "ui_test_kaleidoscope/ui_test_kaleidoscope.h"
#include "ui_test_roller_view/ui_test_roller_view.h"
+#include "ui_test_transform_list/ui_test_scale_list.h"
namespace OHOS {
void UITestGroup::AddTestCase(TestCaseInfo testCaseInfo)
#ifndef QSPI_DISPLAY
testCaseList_->PushBack(TestCaseInfo{"蜂窝表盘", new UITestHexagonsList()});
#endif
- testCaseList_->PushBack(TestCaseInfo{"滑动列表", new UITestListFPS()});
- testCaseList_->PushBack(TestCaseInfo{"缩放型滑动列表", new UITestListExt()});
+ testCaseList_->PushBack(TestCaseInfo{"无变换滑动列表", new UITestListFPS()});
+ testCaseList_->PushBack(TestCaseInfo{"带缩放滑动列表", new UITestListExt()});
+ testCaseList_->PushBack(TestCaseInfo{"自定义变换滑动列表", new UITestScaleList()});
testCaseList_->PushBack(TestCaseInfo{"扫秒", new UITestSweepClock()});
testCaseList_->PushBack(TestCaseInfo{"指南针", new UITestCompass()});
testCaseList_->PushBack(TestCaseInfo{"界面切换", new UITestClockDial()});
#if !defined(_WIN32)
testCaseList_->PushBack(TestCaseInfo{"万花筒", new UITestKaleidoscope()});
#endif
+ testCaseList_->PushBack(TestCaseInfo{"容器覆盖流", new UITestCoverflow2()});
testCaseList_->PushBack(TestCaseInfo{"覆盖流", new UITestCoverflow()});
#endif
testCaseList_->PushBack(TestCaseInfo{"滚筒", new UITestRollerView()});
testCaseList_->PushBack(TestCaseInfo{"绘制SVG", new UITestSVG()});
#endif
#endif
+ testCaseList_->PushBack(TestCaseInfo{"足球效果", new UITestIcosahedron()});
#if ENABLE_ICU && ENABLE_MULTI_FONT && ENABLE_SHAPING
testCaseList_->PushBack(TestCaseInfo{"多语言混排", new UITestMultiFont()});
#endif
#include "animator/animator_manager.h"
#include "hal_tick.h"
+#include "common/low_power_manager.h"
namespace OHOS {
Animator::~Animator()
void Animator::Start()
{
+ LowPowerManager::GetInstance()->ExitLowPower();
SetState(START);
runTime_ = 0;
lastRunTime_ = HALTick::GetInstance().GetTime();
#if ENABLE_MAP_BUFFER
if ((curView->GetViewType() != UI_IMAGE_VIEW) && (curView->GetViewType() != UI_TEXTURE_MAPPER) &&
(curView->GetViewType() != UI_CANVAS_EXT) && (curView->GetViewType() != UI_MENU_ITEM) &&
- (curView->GetViewType() != UI_MAP_VIEW) && !curView->IsTransInvalid() && !enableAnimator) {
+ (curView->GetViewType() != UI_MAP_VIEW) && (curView->GetViewType() != UI_LABEL_EXT) &&
+ (curView->GetViewType() != UI_LABEL) && (curView->GetViewType() != UI_TRANSFORM_GROUP) &&
+ !curView->IsTransInvalid() && !enableAnimator) {
origRect = curView->GetOrigRect();
relativeRect = curView->GetRelativeRect();
curView->GetTransformMap().SetInvalid(true);
DrawArcText(gfxDstBuffer, trunc, opa);
}
+std::string UIArcLabel::GetGuiInfo() const
+{
+ if (arcLabelText_ == nullptr) {
+ return "";
+ }
+ const size_t size = 256;
+ char *buf = new char[size];
+
+ if (buf == nullptr) {
+ return "";
+ }
+ memset_s(buf, size, 0, size);
+ sprintf_s(buf, size, "text: %s, start angle: %f, end angle %f, radius: %u, center[%d, %d]",
+ arcLabelText_->GetText(), startAngle_, endAngle_, radius_, arcCenter_.x, arcCenter_.y);
+ std::string res(buf);
+ delete []buf;
+ return res;
+}
+
void UIArcLabel::DrawArcText(BufferInfo& gfxDstBuffer, const Rect& mask, OpacityType opaScale)
{
Point center;
}
}
+std::string UIImageView::GetGuiInfo() const
+{
+ const size_t size = 256;
+ char *buf = new char[size];
+ if (buf == nullptr) {
+ return "";
+ }
+ if (image_.GetSrcType() == IMG_SRC_VARIABLE && buf != nullptr) {
+ memset_s(buf, size, 0, size);
+ const ImageInfo* info = image_.GetImageInfo();
+ sprintf_s(buf, size, "ImgInfo[%p]: size = [%d, %d], fmt = %d, data = %p, dataSize = %d, cacheNode = %p",
+ info, info->header.width, info->header.height,
+ info->header.colorMode, info->data, info->dataSize, info->cacheNode);
+ std::string res(buf);
+ delete []buf;
+ return res;
+ }
+ delete []buf;
+ return "";
+}
+
#ifndef VERSION_LITE
void UIImageView::AddAndStartGifAnimator()
{
}
}
+void UILabel::SetTextTransformMap(TransformMap& transMap)
+{
+ InitLabelText();
+ labelText_->SetTransformMap(transMap);
+ SetTransformMap(transMap);
+}
+
void UILabel::RefreshLabel()
{
Invalidate();
}
}
+std::string UILabel::GetGuiInfo() const
+{
+ const size_t size = 256;
+ char *buf = new char[size];
+ if (buf == nullptr) {
+ return "";
+ }
+ if (labelText_ == nullptr) {
+ delete []buf;
+ return "";
+ }
+ memset_s(buf, size, 0, size);
+ sprintf_s(buf, size, "text: %s, breakmode %u, font id: %u",
+ labelText_->GetText(), lineBreakMode_, labelText_->GetFontId());
+ std::string res(buf);
+ delete []buf;
+ return res;
+}
+
void UILabel::RemeasureForAnimation(int16_t textWidth, LineBreakMode mode)
{
int16_t rectWidth = GetWidth();
if (textWidth > rectWidth) {
offsetX_ = GetRollStartPos();
if (labelText_->GetDirect() == TEXT_DIRECT_RTL) {
- labelText_->SetAlign(TEXT_ALIGNMENT_RIGHT);
+ labelText_->SetAlign(TEXT_ALIGNMENT_RIGHT, labelText_->GetVerAlign());
} else {
- labelText_->SetAlign(TEXT_ALIGNMENT_LEFT);
+ labelText_->SetAlign(TEXT_ALIGNMENT_LEFT, labelText_->GetVerAlign());
}
if (hasAnimator_) {
static_cast<LabelAnimator*>(animator_.animator)->UpdateWidth(textWidth, rectWidth);
bool UIList::OnDragEndEvent(const DragEvent& event)
{
- if (isElastic_ && (reboundSize_ > 0)) {
- bool elasticFlag = false;
- if (direction_ == HORIZONTAL) {
- elasticFlag = (childrenHead_->GetX() > 0) ||
- (childrenTail_->GetX() + childrenTail_->GetRelativeRect().GetWidth() < GetWidth());
- } else {
- elasticFlag = (childrenHead_->GetY() > 0) ||
- (childrenTail_->GetY() + childrenTail_->GetRelativeRect().GetHeight() < GetHeight());
- }
- if (elasticFlag) {
- ElasticAnimator(elasticTime_ / DEFAULT_TASK_PERIOD);
- return true;
- }
- accumulatedSize_ = 0;
- }
-
Point last = event.GetPreLastPoint();
Point current = event.GetLastPoint();
if ((last.x == current.x) && (last.y == current.y)) {
if (isLoopList_) {
return MoveOffset(distance, 0);
}
- if (isElastic_ && (reboundSize_ > 0) &&
- (((childrenHead_->GetX() >= 0) && (distance > 0)) ||
- ((childrenTail_->GetX() + childrenTail_->GetRelativeRect().GetWidth() <= listWidth) && (distance < 0)))) {
- int16_t elasticLen = childrenHead_->GetX();
- if (distance < 0) {
- elasticLen = listWidth - (childrenTail_->GetX() + childrenTail_->GetRelativeRect().GetWidth());
- }
- accumulatedSize_ += distance;
- distance = CalculateElasticDragLen(reboundSize_ + scrollBlankSize_, elasticLen, accumulatedSize_);
- if (distance != 0) {
- accumulatedSize_ = 0;
- }
- } else {
- if (distance > 0) {
- if (childrenHead_ && ((childrenHead_->GetX() + distance) >
- (scrollBlankSize_ + reboundSize + childrenHead_->GetStyle(STYLE_MARGIN_LEFT)))) {
+
+ if (distance > 0) {
+ if (childrenHead_ != nullptr) {
+ if (isElastic_ && (reboundSize > 0) &&
+ (childrenHead_->GetX() > (scrollBlankSize_ + childrenHead_->GetStyle(STYLE_MARGIN_LEFT)))) {
+ int16_t offset = childrenHead_->GetX() - (scrollBlankSize_ + childrenHead_->GetStyle(STYLE_MARGIN_LEFT));
+ if (offset > reboundSize) {
+ offset = reboundSize;
+ }
+ distance = CalculateElasticDragLen(reboundSize, offset, distance);
+ }
+
+ if ((childrenHead_->GetX() + distance) >
+ (scrollBlankSize_ + reboundSize + childrenHead_->GetStyle(STYLE_MARGIN_LEFT))) {
distance =
scrollBlankSize_ + reboundSize + childrenHead_->GetStyle(STYLE_MARGIN_LEFT) - childrenHead_->GetX();
}
- } else {
- if (childrenTail_) {
- if (childrenTail_->GetRelativeRect().GetRight() <=
- (listWidth - scrollBlankSize_ - reboundSize - childrenTail_->GetStyle(STYLE_MARGIN_RIGHT))) {
- distance = 0;
- } else if ((listWidth - childrenTail_->GetX() - childrenTail_->GetRelativeRect().GetWidth() - distance) >
- (scrollBlankSize_ + reboundSize + childrenTail_->GetStyle(STYLE_MARGIN_RIGHT))) {
- distance = listWidth - scrollBlankSize_ - reboundSize - childrenTail_->GetX() -
- childrenTail_->GetRelativeRect().GetWidth() - childrenTail_->GetStyle(STYLE_MARGIN_RIGHT);
+ }
+ } else {
+ if (childrenTail_ != nullptr) {
+ if (isElastic_ && (reboundSize > 0) &&
+ (childrenTail_->GetRelativeRect().GetRight() <
+ (listWidth - scrollBlankSize_ - childrenTail_->GetStyle(STYLE_MARGIN_RIGHT)))) {
+ int16_t offset = (listWidth - scrollBlankSize_ - childrenTail_->GetStyle(STYLE_MARGIN_RIGHT))
+ - (childrenTail_->GetRelativeRect().GetRight());
+ if (offset > reboundSize) {
+ offset = reboundSize;
}
+ distance = CalculateElasticDragLen(reboundSize, offset, distance);
+ }
+ if ((childrenTail_->GetRelativeRect().GetRight() + distance) <
+ (listWidth - scrollBlankSize_ - reboundSize - childrenTail_->GetStyle(STYLE_MARGIN_RIGHT))) {
+ distance = listWidth - scrollBlankSize_ - reboundSize - childrenTail_->GetStyle(STYLE_MARGIN_RIGHT)
+ - childrenTail_->GetRelativeRect().GetRight();
}
}
}
+
return MoveOffset(distance, 0);
}
if (isLoopList_) {
return MoveOffset(0, distance);
}
- if (isElastic_ && (reboundSize_ > 0) && (((childrenHead_->GetY() >= 0) && (distance > 0)) ||
- ((childrenTail_->GetY() + childrenTail_->GetRelativeRect().GetHeight() <= listHeight) && (distance < 0)))) {
- int16_t elasticLen = childrenHead_->GetY();
- if (distance < 0) {
- elasticLen = listHeight - (childrenTail_->GetY() + childrenTail_->GetRelativeRect().GetHeight());
- }
- accumulatedSize_ += distance;
- distance = CalculateElasticDragLen(reboundSize + scrollBlankSize_, elasticLen, accumulatedSize_);
- if (distance != 0) {
- accumulatedSize_ = 0;
- }
- } else {
- if (distance > 0) {
- if (childrenHead_ && ((childrenHead_->GetY() + distance) >
- (scrollBlankSize_ + reboundSize + childrenHead_->GetStyle(STYLE_MARGIN_TOP)))) {
+
+ if (distance > 0) {
+ if (childrenHead_ != nullptr) {
+ if (isElastic_ && (reboundSize > 0) &&
+ (childrenHead_->GetY() > (scrollBlankSize_ + childrenHead_->GetStyle(STYLE_MARGIN_TOP)))) {
+ int16_t offset = childrenHead_->GetY() - (scrollBlankSize_ + childrenHead_->GetStyle(STYLE_MARGIN_TOP));
+ if (offset > reboundSize) {
+ offset = reboundSize;
+ }
+ distance = CalculateElasticDragLen(reboundSize, offset, distance);
+ }
+ if ((childrenHead_->GetY() + distance) >
+ (scrollBlankSize_ + reboundSize + childrenHead_->GetStyle(STYLE_MARGIN_TOP))) {
distance =
scrollBlankSize_ + reboundSize + childrenHead_->GetStyle(STYLE_MARGIN_TOP) - childrenHead_->GetY();
}
- } else {
- if (childrenTail_) {
- if (childrenTail_->GetRelativeRect().GetBottom() <=
- (listHeight - scrollBlankSize_ - reboundSize - childrenTail_->GetStyle(STYLE_MARGIN_BOTTOM))) {
- distance = 0;
- } else if ((listHeight - childrenTail_->GetY() - childrenTail_->GetRelativeRect().GetHeight() - distance) >
- (scrollBlankSize_ + reboundSize + childrenTail_->GetStyle(STYLE_MARGIN_BOTTOM))) {
- distance = listHeight - scrollBlankSize_ - reboundSize - childrenTail_->GetY() -
- childrenTail_->GetRelativeRect().GetHeight() - childrenTail_->GetStyle(STYLE_MARGIN_BOTTOM);
+ }
+ } else {
+ if (childrenTail_ != nullptr) {
+ if (isElastic_ && (reboundSize > 0) &&
+ (childrenTail_->GetRelativeRect().GetBottom() <
+ (listHeight - scrollBlankSize_ - childrenTail_->GetStyle(STYLE_MARGIN_BOTTOM)))) {
+ int16_t offset = (listHeight - scrollBlankSize_ - childrenTail_->GetStyle(STYLE_MARGIN_BOTTOM))
+ - (childrenTail_->GetRelativeRect().GetBottom());
+ if (offset > reboundSize) {
+ offset = reboundSize;
}
+ distance = CalculateElasticDragLen(reboundSize, offset, distance);
+ }
+ if ((childrenTail_->GetRelativeRect().GetBottom() + distance) <
+ (listHeight - scrollBlankSize_ - reboundSize - childrenTail_->GetStyle(STYLE_MARGIN_BOTTOM))) {
+ distance = listHeight - scrollBlankSize_ - reboundSize - childrenTail_->GetStyle(STYLE_MARGIN_BOTTOM)
+ - childrenTail_->GetRelativeRect().GetBottom();
}
}
}
+
return MoveOffset(0, distance);
}
}
return true;
}
+
bool UIList::ReCalculateDragEnd()
{
if ((onSelectedView_ == nullptr) || isReCalculateDragEnd_ || !autoAlign_) {
void UIList::FixHorDistance(int16_t& distanceX)
{
+ int16_t ofs = 0;
+ Rect childrenRect = GetAllChildRelativeRect();
+ if (childrenRect.GetX() > 0) {
+ int16_t headMid = childrenHead_->GetX() + childrenHead_->GetRelativeRect().GetWidth() / 2;
+ if ((headMid + distanceX >= selectPosition_) || (headMid >= selectPosition_)) {
+ ofs = selectPosition_ - (headMid + distanceX);
+ }
+ } else if (childrenRect.GetRight() < GetWidth() - 1) {
+ int16_t tailMid = childrenTail_->GetX() + childrenTail_->GetRelativeRect().GetWidth() / 2;
+ if ((tailMid + distanceX <= selectPosition_) || (tailMid <= selectPosition_)) {
+ ofs = selectPosition_ - (tailMid + distanceX);
+ }
+ }
+
+ if (ofs != 0) {
+ distanceX += ofs;
+ return;
+ }
+
UIView* targetView = childrenHead_;
while (targetView != nullptr) {
int16_t pos = targetView->GetX();
void UIList::FixVerDistance(int16_t& distanceY)
{
+ int16_t ofs = 0;
+ Rect childrenRect = GetAllChildRelativeRect();
+ if (childrenRect.GetY() > 0) {
+ int16_t headMid = childrenHead_->GetY() + childrenHead_->GetRelativeRect().GetHeight() / 2;
+ if ((headMid + distanceY >= selectPosition_) || (headMid >= selectPosition_)) {
+ ofs = selectPosition_ - (headMid + distanceY);
+ }
+ } else if (childrenRect.GetBottom() < GetHeight() - 1) {
+ int16_t tailMid = childrenTail_->GetY() + childrenTail_->GetRelativeRect().GetHeight() / 2;
+ if ((tailMid + distanceY <= selectPosition_) || (tailMid <= selectPosition_)) {
+ ofs = selectPosition_ - (tailMid + distanceY);
+ }
+ }
+
+ if (ofs != 0) {
+ distanceY += ofs;
+ return;
+ }
+
UIView* targetView = childrenHead_;
while (targetView != nullptr) {
int16_t pos = targetView->GetY();
void UIView::Rotate(int16_t angle, const Vector2<float>& pivot)
#endif
{
-#if !ENABLE_MAP_BUFFER
- UIViewType type = GetViewType();
- if ((type != UI_IMAGE_VIEW) && (type != UI_TEXTURE_MAPPER) && (type != UI_CANVAS_EXT) && (type != UI_MAP_VIEW) &&
- (type != UI_MENU_ITEM)) {
- GRAPHIC_LOGE("Rotate is not supported for view type %d if ENABLE_MAP_BUFFER is 0", type);
- return;
- }
-#endif
-
Vector3<float> pivotStart3D = Vector3<float>(pivot.x_, pivot.y_, 0);
Vector3<float> pivotEnd3D = Vector3<float>(pivot.x_, pivot.y_, 1.0f);
Rotate(angle, pivotStart3D, pivotEnd3D);
#if !ENABLE_MAP_BUFFER
UIViewType type = GetViewType();
if ((type != UI_IMAGE_VIEW) && (type != UI_TEXTURE_MAPPER) && (type != UI_CANVAS_EXT) && (type != UI_MAP_VIEW) &&
- (type != UI_MENU_ITEM)) {
+ (type != UI_MENU_ITEM) && (type != UI_LABEL_EXT) && (type != UI_LABEL) && (type != UI_TRANSFORM_GROUP)) {
GRAPHIC_LOGE("Rotate is not supported for view type %d if ENABLE_MAP_BUFFER is 0", type);
return;
}
void UIView::Scale(const Vector2<float>& scale, const Vector2<float>& pivot)
{
-#if !ENABLE_MAP_BUFFER
- UIViewType type = GetViewType();
- if ((type != UI_IMAGE_VIEW) && (type != UI_TEXTURE_MAPPER) && (type != UI_CANVAS_EXT) && (type != UI_MAP_VIEW) &&
- (type != UI_MENU_ITEM)) {
- GRAPHIC_LOGE("Scale is not supported for view type %d if ENABLE_MAP_BUFFER is 0", type);
- return;
- }
-#endif
Vector3<float> scale3D = Vector3<float>(scale.x_, scale.y_, 1.0f);
Vector3<float> pivot3D = Vector3<float>(pivot.x_, pivot.y_, 0);
Scale(scale3D, pivot3D);
#if !ENABLE_MAP_BUFFER
UIViewType type = GetViewType();
if ((type != UI_IMAGE_VIEW) && (type != UI_TEXTURE_MAPPER) && (type != UI_CANVAS_EXT) && (type != UI_MAP_VIEW) &&
- (type != UI_MENU_ITEM)) {
+ (type != UI_MENU_ITEM) && (type != UI_LABEL_EXT) && (type != UI_LABEL) && (type != UI_TRANSFORM_GROUP)) {
GRAPHIC_LOGE("Scale is not supported for view type %d if ENABLE_MAP_BUFFER is 0", type);
return;
}
void UIView::Translate(const Vector2<int16_t>& trans)
{
-#if !ENABLE_MAP_BUFFER
- UIViewType type = GetViewType();
- if ((type != UI_IMAGE_VIEW) && (type != UI_TEXTURE_MAPPER) && (type != UI_CANVAS_EXT) && (type != UI_MAP_VIEW) &&
- (type != UI_MENU_ITEM)) {
- GRAPHIC_LOGE("Translate is not supported for view type %d if ENABLE_MAP_BUFFER is 0", type);
- return;
- }
-#endif
Vector3<int16_t> trans3D = Vector3<int16_t>(trans.x_, trans.y_, 0);
Translate(trans3D);
}
#if !ENABLE_MAP_BUFFER
UIViewType type = GetViewType();
if ((type != UI_IMAGE_VIEW) && (type != UI_TEXTURE_MAPPER) && (type != UI_CANVAS_EXT) && (type != UI_MAP_VIEW) &&
- (type != UI_MENU_ITEM)) {
+ (type != UI_MENU_ITEM) && (type != UI_LABEL_EXT) && (type != UI_LABEL) && (type != UI_TRANSFORM_GROUP)) {
GRAPHIC_LOGE("Translate is not supported for view type %d if ENABLE_MAP_BUFFER is 0", type);
return;
}
#if !ENABLE_MAP_BUFFER
UIViewType type = GetViewType();
if ((type != UI_IMAGE_VIEW) && (type != UI_TEXTURE_MAPPER) && (type != UI_CANVAS_EXT) && (type != UI_MAP_VIEW) &&
- (type != UI_MENU_ITEM)) {
+ (type != UI_MENU_ITEM) && (type != UI_LABEL) && (type != UI_LABEL_EXT) && (type != UI_TRANSFORM_GROUP)) {
GRAPHIC_LOGE("SetTransformMap is not supported for view type %d if ENABLE_MAP_BUFFER is 0", type);
return;
}
}
}
}
+
+std::string UIView::GetGuiInfo() const
+{
+ return "";
+}
} // namespace OHOS
void UIViewGroup::Add(UIView* view)
{
if ((view == this) || (view == nullptr)) {
- GRAPHIC_LOGE("view can not be nullptr and added to self");
+ GRAPHIC_LOGE("view %p can not be nullptr or added to self!", view);
return;
}
if (view->GetParent() != nullptr) {
GRAPHIC_LOGE("param group is nullptr !!");
return;
}
-
+
UIViewType type = group->GetViewType();
if ((type == UI_DIGITAL_CLOCK) || (type == UI_PICKER) || (type == UI_TIME_PICKER) || (type == UI_MENU_ITEM) ||
(type == UI_IMAGE_PICKER) || (type == UI_ROLLER_VIEW) || (type == UI_COVER_FLOW)) {
group = nullptr;
return;
}
-
+
if (type == UI_CROSS_VIEW) {
GRAPHIC_LOGE("Need to remove UICardPage in UICrossView manully !!");
delete group;
group = nullptr;
return;
}
-
+
UIView* node = group->GetChildrenHead();
UIView* tmp = nullptr;
while (node != nullptr) {
BLEND_MULTIPLY, /* S * (1 - Da) + D * (1 - Sa) + S * D */
BLEND_ADDITIVE, /* S + D */
BLEND_SUBTRACT, /* D * (1 - S) */
+ BLEND_SRC_ATOP,
+ BLEND_DST_ATOP,
};
#ifndef TRANSFORMOPTION
UITextLanguageDirect direct;
};
+ std::string GetGuiInfo() const override;
+
protected:
Text* arcLabelText_;
void DumpImgInfo() override;
+ std::string GetGuiInfo() const override;
+
protected:
/**
* @brief Represents the width of this image.
*/
void SetHeight(int16_t height) override;
+ /**
+ * @brief Sets the transform for this label text.
+ *
+ * @param transMap Indicates the transformation matrix.
+ * @since 1.0
+ * @version 1.0
+ */
+ void SetTextTransformMap(TransformMap& transMap);
+
void ReMeasure() override;
+ std::string GetGuiInfo() const override;
+
#if ENABLE_FONT_VECTOR_GLOBAL
virtual void ForceResetText() {};
#endif
UIView* onSelectedView_;
protected:
- static constexpr int16_t RECALCULATE_DRAG_DISTANCE = 10;
+ static constexpr int16_t RECALCULATE_DRAG_DISTANCE = 0;
static constexpr int16_t RECALCULATE_DRAG_TIMES = 10;
static constexpr int16_t DEFAULT_ALIGN_TIMES = 100;
void StopAnimator() override;
{
return list_.GetRotateFactor();
}
+
+ /**
+ * @brief Sets a rotation event listener for the view.
+ * @param onRotateListener Indicates the pointer to the rotation event listener to set.
+ * @since 5.0
+ * @version 3.0
+ */
+ void SetOnRotateListener(OnRotateListener* onRotateListener) override
+ {
+ list_.SetOnRotateListener(onRotateListener);
+ }
+
+ /**
+ * @brief Obtains the rotation event listener for the view.
+ * @return Returns the rotation event listener.
+ * @since 5.0
+ * @version 3.0
+ */
+ OnRotateListener*& GetOnRotateListener() override
+ {
+ return list_.GetOnRotateListener();
+ }
+#endif
+
+#if ENABLE_FOCUS_MANAGER
+ /**
+ * @brief 设置视图是否可获焦.
+ *
+ * @param focusable 是否可获焦.
+ * @since 5.0
+ * @version 3.0
+ */
+ void SetFocusable(bool focusable) override
+ {
+ list_.SetFocusable(focusable);
+ }
+
+ /**
+ * @brief 获取视图是否可获焦.
+ *
+ * @return 是否可获焦.
+ * @since 5.0
+ * @version 3.0
+ */
+ bool IsFocusable() const override
+ {
+ return list_.IsFocusable();
+ }
+
+ /**
+ * @brief 组件获焦响应
+ *
+ * @since 5.0
+ * @version 3.0
+ */
+ void Focus() override
+ {
+ list_.Focus();
+ }
+
+ /**
+ * @brief 组件失焦响应
+ *
+ * @since 5.0
+ * @version 3.0
+ */
+ void Blur() override
+ {
+ list_.Blur();
+ }
+
+ /**
+ * @brief 设置当前视图焦点改变事件监听者.
+ * @param onFocusListener 焦点改变事件监听者.
+ * @since 5.0
+ * @version 3.0
+ */
+ void SetOnFocusListener(OnFocusListener* onFocusListener) override
+ {
+ list_.SetOnFocusListener(onFocusListener);
+ }
+
+ /**
+ * @brief 获取当前视图焦点改变事件监听者.
+ * @return 焦点改变事件监听者.
+ * @since 5.0
+ * @version 3.0
+ */
+ OnFocusListener* GetOnFocusListener() const override
+ {
+ return list_.GetOnFocusListener();
+ }
#endif
protected:
#ifndef GRAPHIC_LITE_UI_VIEW_H
#define GRAPHIC_LITE_UI_VIEW_H
+#include <string>
+#include "securec.h"
#include "events/cancel_event.h"
#include "events/click_event.h"
#include "events/drag_event.h"
UI_HEXAGONS_LIST,
UI_IMAGE_PICKER,
UI_ICOSAHEDRON_VIEW,
+ UI_TRANSFORM_GROUP,
+ UI_TRANSFORM_LIST,
+ UI_COVER_FLOW_2,
UI_NUMBER_MAX
};
* @since 5.0
* @version 3.0
*/
- void SetOnRotateListener(OnRotateListener* onRotateListener)
+ virtual void SetOnRotateListener(OnRotateListener* onRotateListener)
{
onRotateListener_ = onRotateListener;
}
* @since 5.0
* @version 3.0
*/
- OnRotateListener*& GetOnRotateListener()
+ virtual OnRotateListener*& GetOnRotateListener()
{
return onRotateListener_;
}
* @since 5.0
* @version 3.0
*/
- void SetFocusable(bool focusable)
+ virtual void SetFocusable(bool focusable)
{
focusable_ = focusable;
}
* @since 5.0
* @version 3.0
*/
- bool IsFocusable() const
+ virtual bool IsFocusable() const
{
return focusable_;
}
* @since 5.0
* @version 3.0
*/
- void SetOnFocusListener(OnFocusListener* onFocusListener)
+ virtual void SetOnFocusListener(OnFocusListener* onFocusListener)
{
onFocusListener_ = onFocusListener;
}
* @since 5.0
* @version 3.0
*/
- OnFocusListener* GetOnFocusListener() const
+ virtual OnFocusListener* GetOnFocusListener() const
{
return onFocusListener_;
}
virtual void DumpImgInfo() {}
+ virtual std::string GetGuiInfo() const;
+
protected:
bool touchable_ : 1;
bool visible_ : 1;
return ERRCODE_FAIL;\r
}\r
\r
- MediaThreadattr attr = { "AudioCaptureTask", 0x2000, THREAD_SCHED_INVALID, 0, true };\r
+ MediaThreadattr attr = { "AudioCaptureTask", 0x2000, THREAD_SCHED_INVALID, 0, false };\r
g_sample.audioCaptureProcess = MediaThreadCreate(AudioCaptureProcess, NULL, &attr);\r
if (g_sample.audioCaptureProcess == nullptr) {\r
MEDIA_ERR_LOG("thread create failed");\r
JSIValue AudioCapturerModule::Stop(const JSIValue thisVal, const JSIValue *args, uint8_t argsSize)\r
{\r
g_sample.needStop = true;\r
+ MediaThreadJoin(&g_sample.audioCaptureProcess);\r
+ g_sample.audioCaptureProcess = nullptr;\r
return JSI::CreateBoolean(0);\r
}\r
\r
isEntered_ = true;\r
MediaThreadattr attr = { "VideoPlayThread", 0x2000, THREAD_SCHED_INVALID, 0, true };\r
if (isSyncExitMode_) {\r
+ MediaThreadJoin(&threadHandle_);\r
attr.detached = false;\r
}\r
threadHandle_ = MediaThreadCreate(VideoPlayThread, this, &attr);\r
MediaMutexLock(mutex_);\r
if (!isPlayed_) {\r
MEDIA_INFO_LOG("video play is not start,can not stop!");\r
- isPlaybackStopped_ = true;\r
- MediaMutexUnLock(mutex_);\r
- return MEDIA_OK;\r
+ goto EXIT;\r
}\r
if (isPlaybackStopped_ || isPlaybackCompleted_ || interruptHintStop_) {\r
if (isLoop_) {\r
return MEDIA_OK;\r
}\r
}\r
+EXIT:\r
isPlaybackStopped_ = true;\r
MediaThreadCondSignal(cond_);\r
MediaMutexUnLock(mutex_);\r
void MediaVideoPlay::DestroyVideoPlaySource(void)\r
{\r
if (!isEntered_) {\r
+ if (isSyncExitMode_) {\r
+ MediaThreadJoin(&threadHandle_);\r
+ // clear buffers safely in sync mode to reduce peak memory\r
+ dynamic_cast<LiteSurface *>(surface_)->ClearBuffers();\r
+ }\r
MEDIA_ERR_LOG("video is not played\n");\r
return;\r
}\r
osThreadAttr_t taskAttr = {
attr->name, attrBits, nullptr, 0, nullptr, attr->stackSize, osPriorityNormal, 0, 0
};
+ // Allocate the memory of the thread to the psram.
+ taskAttr.stack_mem = memalign(0x10, attr->stackSize);
MediaSetCmsisThreadPriorityAttr(&taskAttr, attr->prioty);
subId = osThreadNew((osThreadFunc_t)MediaThreadFunc, member, &taskAttr);
}
uint32_t attrBits = osThreadDetached;
#endif
osThreadAttr_t taskAttr = { attr->name, attrBits, NULL, 0, NULL, attr->stackSize, osPriorityNormal, 0, 0 };
+ // Allocate the memory of the thread to the psram.
+ taskAttr.stack_mem = memalign(0x10, attr->stackSize);
MediaHalSetCmsisThreadPriorityAttr(&taskAttr, attr->prioty);
subId = osThreadNew(MediaHalThreadFunc, member, &taskAttr);
}
#ifdef CFG_DRIVERS_NANDFLASH
#include "nandflash_inner.h"
#endif
+#ifdef CFG_DRIVERS_MMC
+#include "drv_mmc_adapter.h"
+#endif
#include "memory_core.h"
#ifdef SUPPORT_HW_SHA256
#include "sec_sha.h"
static bool codeloader_execute_command_nandflash_writing_buffer(
const uint8_t *input_buffer_to_write, uint32_t bytes_to_write);
#endif
+#ifdef CFG_DRIVERS_MMC
+/* write to emmc and update the internal state */
+static bool codeloader_execute_command_emmc_writing_buffer(
+ const uint8_t *input_buffer_to_write, uint32_t bytes_to_write);
+#endif
//lint -esym(459, codeloader_command_processor_start_flashing)
/* Start flashing command function */
} else if (g_codeloader_data_save_position.type == CODELOADER_COMMAND_SET_BIN_POSITION_AT_FS_BIN) {
#ifdef CFG_DRIVERS_NANDFLASH
if (!codeloader_execute_command_nandflash_writing_buffer(input_buffer->buffer, input_buffer->length))
+#endif
+#ifdef CFG_DRIVERS_MMC
+ if (!codeloader_execute_command_emmc_writing_buffer(input_buffer->buffer, input_buffer->length))
#endif
{
return_code = CODELOADER_COMMAND_FLASH_COMMANDS_ERROR_CODE_ERROR_WR_NANDFLASH;
}
#endif
+#ifdef CFG_DRIVERS_MMC
+static bool codeloader_execute_command_emmc_writing_buffer(
+ const uint8_t *input_buffer_to_write, uint32_t bytes_to_write)
+{
+ const char *ptr = (char*)input_buffer_to_write;
+ uint16_t len;
+ int ret;
+ if (bytes_to_write % MAX_BLOCK_SIZE == 0) {
+ len = bytes_to_write / MAX_BLOCK_SIZE;
+ } else {
+ len = bytes_to_write / MAX_BLOCK_SIZE + 1;
+ }
+
+ ret = ssb_emmc_write(ptr, g_codeloader_flash_writing_commands_location, len);
+ PRINT("emmc pos=%d len=%d ret=%d\n", g_codeloader_flash_writing_commands_location, len, ret);
+ if (ret == len) {
+ g_codeloader_flash_writing_commands_location += len;
+ return true;
+ } else {
+ return false;
+ }
+}
+#endif
+
int8_t codeloader_command_processor_dbg_show_disk_info(
const codeloader_rx_buffer_t *input_buffer, codeloader_common_generic_buffer_t *output_buffer)
{
}
#ifdef CFG_DRIVERS_NANDFLASH
-static int8_t codeloader_nand_set_bin_head_info(uint32_t* start_addr, uint32_t* length)
+static int8_t codeloader_set_bin_head_info(uint32_t* start_addr, uint32_t* length)
{
struct nand_driver_struct *nand_drv = (struct nand_driver_struct *)get_nand_flash();
if (g_nandflash_init != 0) {
}
#endif
+#ifdef CFG_DRIVERS_MMC
+#define MMC_START_LOCATION 2048
+static int8_t codeloader_set_bin_head_info(uint32_t* start_addr, uint32_t* length)
+{
+ struct rt_mmcsd_host* mmc = get_ssb_emmc();
+
+ (void)ssb_emmc_erase(0, mmc->card->erase_size);
+ g_codeloader_flash_writing_commands_location = MMC_START_LOCATION;
+ PRINT("mmc erase size=%d pos=%d\n", mmc->card->erase_size, g_codeloader_flash_writing_commands_location);
+ return CODELOADER_COMMAND_GENERAL_RETURN_CODE_SUCCESS;
+}
+#endif
+
int8_t codeloader_command_processor_set_bin_head_info(const codeloader_rx_buffer_t *input_buffer,
codeloader_common_generic_buffer_t *output_buffer)
{
}
if (input_parameters->type == CODELOADER_COMMAND_SET_BIN_POSITION_AT_FS_BIN) {
-#ifdef CFG_DRIVERS_NANDFLASH
- return_code = codeloader_nand_set_bin_head_info(&load_start_addr, &load_length);
+#if (defined CFG_DRIVERS_NANDFLASH) || (defined CFG_DRIVERS_MMC)
+ return_code = codeloader_set_bin_head_info(&load_start_addr, &load_length);
if (return_code != CODELOADER_COMMAND_GENERAL_RETURN_CODE_SUCCESS) {
return return_code;
}
#endif
#include "panic.h"
+#if !defined(BUILD_APPLICATION_SSB) && !defined(BUILD_RECOVERY_IMAGE)
+#include "calendar_porting.h"
+#include "tcxo.h"
+#include "pm.h"
+#endif
+
#define NON_OS_ENTER_MAX_NUM 8
#define MAX_STR_LEN 64
+#define SELF_HEAL_WAIT_TIME 100
static bool g_already_panicking = false;
#ifdef SUPPORT_CPU_TRACE
cpu_trace_disable();
#endif
-
+#if !defined(BUILD_APPLICATION_SSB) && !defined(BUILD_RECOVERY_IMAGE)
+ if (origin == PANIC_BT_STS_ABNORMAL) {
+ uapi_self_heal_timer_enable();
+ uapi_sys_shipmode(0);
+ uapi_tcxo_delay_ms(SELF_HEAL_WAIT_TIME);
+ }
+#endif
panic_deal_log(origin, code, caller);
non_os_enter_critical();
PANIC_DSS_MIPI_ERR = 100,
PANIC_GNSS_DFR_ERR = 101,
PANIC_BT_SEC_BOOT_ERR = 102,
+ PANIC_BT_STS_ABNORMAL = 103,
} panic_id_t;
typedef struct {
nv_key_map_t *cur_key = (nv_key_map_t *)value;
if (cur_key->permanent == 1 || (cur_key->encrypted == 1 &&
(attr == NULL || (attr != NULL && attr->encrypted == false)))
- || (attr == NULL && cur_key->upgrade == 1)) {
+ || (attr == NULL && cur_key->non_upgrade == 1)) {
return false;
}
return ERRCODE_SUCC;
}
/* 保持hash表中数据和传入的属性保持一致 */
- cur_key->permanent = attr->permanent;
- cur_key->encrypted = attr->encrypted;
- cur_key->upgrade = attr->non_upgrade;
+ if (attr->permanent) {
+ cur_key->permanent = 1;
+ cur_key->non_upgrade = 1;
+ }
+ if (attr->encrypted) {
+ cur_key->encrypted = 1;
+ cur_key->non_upgrade = 1;
+ }
+
+ /* 可升级属性支持属性更改 */
+ if (attr->non_upgrade) {
+ cur_key->non_upgrade = 1;
+ } else {
+ cur_key->non_upgrade = 0;
+ }
return ERRCODE_SUCC;
}
/* 对三个属性进行判断 */
if (key.header.type != KV_KEY_TYPE_NORMAL) {
cur_key->permanent = 1;
- cur_key->upgrade = 1;
+ cur_key->non_upgrade = 1;
}
if (key.header.enc_key != 0) {
cur_key->encrypted = 1;
- cur_key->upgrade = 1;
+ cur_key->non_upgrade = 1;
}
if (key.header.upgrade != KV_KEY_TYPE_NORMAL) {
- cur_key->upgrade = 1;
+ cur_key->non_upgrade = 1;
}
/* 传入柔性数组的数组名既首地址,获取flash数据 */
res = kv_key_read_data(&key, cur_key->kvalue);
attr->encrypted = true;
attr->non_upgrade = true;
}
- if (cur_key->upgrade == 1) {
+ if (cur_key->non_upgrade == 1) {
attr->non_upgrade = true;
}
osal_sem_up(&nv_async_sem);
nv_key_attr_t attr;
attr.permanent = (msg_data->permanent == 1) ? true : false;
attr.encrypted = (msg_data->encrypted == 1) ? true : false;
- attr.non_upgrade = (msg_data->upgrade == 1) ? true : false;
+ attr.non_upgrade = (msg_data->non_upgrade == 1) ? true : false;
nv_log_debug("[NV] nv async msg process key=0x%x,len=%d,attr %d %d %d\r\n",
msg_data->key_id, msg_data->key_len, attr.permanent, attr.encrypted, attr.non_upgrade);
res = nv_direct_write_with_attr(msg_data->key_id, msg_data->kvalue, msg_data->key_len, &attr, NULL);
uint16_t key_len : 13; /* Key length */
uint16_t permanent : 1; /* 是否是永久Key */
uint16_t encrypted : 1; /* 是否是加密Key */
- uint16_t upgrade : 1; /* 是否可以升级 */
+ uint16_t non_upgrade : 1; /* 是否不可以升级 */
uint8_t kvalue[0]; /* key value */
} nv_key_map_t;
struct hci_softc *sc;
struct sdhci_slot *slot;
dpal_resource_t *res;
+
+#ifdef CFG_SDIO_EMMC_COEXIST
+ static bool emmc_initialized = false;
+ static bool sdio_initialized = false;
+#else
static bool mmc_initialized = false;
+#endif
sc = dpal_zalloc(sizeof(struct hci_softc));
if (sc == NULL)
if (err != 0)
goto clear_mmc_proc;
+#ifdef CFG_SDIO_EMMC_COEXIST
+ if (slot->num == 0 && !emmc_initialized) {
+ emmc_initialized = true;
+ err = sdhci_thread_create((dpal_tsk_entry_func)sdhci_task,
+ "cdsw_emmc_task", (uint32_t *)&slot->cd_tsk_id);
+ if (err) {
+ goto clear_mem_resource;
+ }
+ }
+ if (slot->num == 1 && !sdio_initialized) {
+ sdio_initialized = true;
+ err = sdhci_thread_create((dpal_tsk_entry_func)sdhci_task,
+ "cdsw_sdio_task", (uint32_t *)&slot->cd_tsk_id);
+ if (err) {
+ goto clear_mem_resource;
+ }
+ }
+#else
if (!mmc_initialized) {
mmc_initialized = true;
err = sdhci_thread_create((dpal_tsk_entry_func)sdhci_task,
goto clear_mem_resource;
}
}
+#endif
return (0);
clear_mem_resource:
${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits/dfx
${ROOT_DIR}/application/wearable/nativeabilityfwk/include
+ ${ROOT_DIR}/open_source/openharmony/foundation/ace/ace_engine_lite/modules/presets
)
if("__LITEOS__" IN_LIST DEFINES)
#include "want.h"
#include "slite_ability.h"
#include "ability_state.h"
+#include "timer_module.h"
namespace OHOS {
struct AbilitySvcInfo {
${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/innerkits/common
${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits/font
${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits/dfx
+ ${ROOT_DIR}/middleware/services/gui/uikit/ui/frameworks
${ROOT_DIR}/open_source/openharmony/drivers/peripheral/display/interfaces/include
${ROOT_DIR}/application/wearable/ohos_deps
+ ${ROOT_DIR}/application/wearable/nativeabilityfwk/include
+ ${ROOT_DIR}/application/wearable/nativeapp/nativelauncher/include
${ROOT_DIR}/open_source/openharmony/third_party/cJSON
${ROOT_DIR}/open_source/openharmony/third_party/qrcodegen/cpp
${ROOT_DIR}/open_source/openharmony/base/global/i18n_lite/frameworks/i18n/include
${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits/font
${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits/dfx
${ROOT_DIR}/middleware/services/gui/uikit/ui/interfaces/kits/common
+ ${ROOT_DIR}/middleware/services/gui/uikit/ui/frameworks
${ROOT_DIR}/open_source/openharmony/drivers/peripheral/display/interfaces/include
${ROOT_DIR}/application/wearable/ohos_deps
+ ${ROOT_DIR}/application/wearable/nativeabilityfwk/include
+ ${ROOT_DIR}/application/wearable/nativeapp/nativelauncher/include
${ROOT_DIR}/open_source/openharmony/third_party/cJSON
${ROOT_DIR}/open_source/openharmony/third_party/qrcodegen/cpp
${ROOT_DIR}/open_source/openharmony/base/global/i18n_lite/frameworks/i18n/include
${CMAKE_CURRENT_SOURCE_DIR}/components/baidu_map_component.cpp
${CMAKE_CURRENT_SOURCE_DIR}/modules/app_module.cpp
${CMAKE_CURRENT_SOURCE_DIR}/modules/device_module.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/modules/vibrator_module.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/modules/battery_module.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/modules/sensor_module.cpp
${CMAKE_CURRENT_SOURCE_DIR}/modules/dfx_module.cpp
${CMAKE_CURRENT_SOURCE_DIR}/modules/module_manager.cpp
${CMAKE_CURRENT_SOURCE_DIR}/modules/locale_module.cpp
#endif
#include "graphic_config.h"
#include "wrapper/js.h"
+#include "events/rotate_event.h"
namespace OHOS {
namespace ACELite {
bool CallBaseEvent(const jerry_value_t func, const Event &event, const uint16_t id);
jerry_value_t *ConvertDragEventInfo(const DragEvent &event, const uint16_t id);
jerry_value_t *ConvertKeyEventInfo(const KeyEvent &event);
-void ClearEventListener(const jerry_value_t args[], uint8_t argc);
#endif
+void ClearEventListener(const jerry_value_t args[], uint8_t argc);
+
+jerry_value_t *ConvertRotateEventInfo(const RotateEvent &event);
JSValue GetRootAbilitySlice();
JSValue CallWithRootAbilitySlice(JSValue func, JSValue args[], JSSize size);
JSValue CallWithRootAbilitySlice(JSValue func);
KEYWORD(REVERSE, reverse) // image-animator attribute
KEYWORD(RIGHT, right) // text align type
KEYWORD(ROTATE, rotate) // animation rotate
+ KEYWORD(ROTATE_INPUT, rotate_input)
KEYWORD(ROW, row) // layout style
KEYWORD(ROW_REVERSE, row-reverse) // layout style
KEYWORD(SCALE_DOWN, scaleDown) // image component scale down
KEYWORD(SCROLLAMOUNT, scrollamount) // marquee scroll speed
KEYWORD(SCROLLEND, scrollend) // scroll end event listener
KEYWORD(SCROLLSTART, scrollstart) // scroll start event listener
+ KEYWORD(SCROLLBAR, scrollbar) // list scroll bar
#ifdef FEATURE_COMPONENT_ANALOG_CLOCK
KEYWORD(SEC, sec) // analog-clock second
#endif // FEATURE_COMPONENT_ANALOG_CLOCK
#include "ace_log.h"\r
#include "key_parser.h"\r
#include "keys.h"\r
+#include "soc_vau_api.h"\r
\r
namespace OHOS {\r
namespace ACELite {\r
for (uint16_t index = 0; index < funcMapLength; index++) {\r
RegisterNamedFunction(funcMap[index].funcName, funcMap[index].handler);\r
}\r
+ uapi_vau_set_cubic_threshold(1.0f);\r
+}\r
+\r
+BaiduMapComponent::~BaiduMapComponent()\r
+{\r
+ HILOG_INFO(HILOG_MODULE_ACE,"BaiduMapComponent destructor");\r
+ MapComponentApi::getInstance().destroy();\r
+ uapi_vau_set_cubic_threshold(0.125f);\r
}\r
\r
UIView *BaiduMapComponent::GetComponentRootView() const\r
ACE_DISALLOW_COPY_AND_MOVE(BaiduMapComponent);\r
BaiduMapComponent() = delete;\r
BaiduMapComponent(jerry_value_t options, jerry_value_t children, AppStyleManager* styleManager);\r
- ~BaiduMapComponent() override{}\r
+ ~BaiduMapComponent() override;\r
\r
/**\r
* SetZoomEventEnabled, enabled Indicates whether to allow scaling events. This function is disabled by default\r
onClickListener_(nullptr),
onLongPressListener_(nullptr),
onSwipeListener_(nullptr),
+ onKeyInputListener_(nullptr),
#ifdef JS_TOUCH_EVENT_SUPPORT
onTouchStartListener_(nullptr),
onTouchMoveListener_(nullptr),
onTouchEndListener_(nullptr),
keyBoardEventListener_(nullptr),
#endif
+ onRotateListener_(nullptr),
viewId_(nullptr),
componentName_(K_UNKNOWN),
rendered_(false),
}
#endif
+void Component::SetKeyInputEventListener(UIView &view, jerry_value_t eventFunc, uint16_t eventTypeId)
+{
+ RootView *rootView = RootView::GetInstance();
+ if (rootView == nullptr) {
+ HILOG_ERROR(HILOG_MODULE_ACE, "get rootView is nullptr");
+ return;
+ }
+ onKeyInputListener_ = new KeyInputEventListener(eventFunc, eventTypeId);
+ if (onKeyInputListener_ == nullptr) {
+ HILOG_ERROR(HILOG_MODULE_ACE, "on key input event listener create failed");
+ return;
+ }
+ rootView->SetOnKeyActListener(onKeyInputListener_);
+}
+
void Component::SetLongPressEventListener(UIView &view, const jerry_value_t eventFunc, bool isStopPropagation)
{
onLongPressListener_ = new ViewOnLongPressListener(eventFunc, isStopPropagation);
view.SetTouchable(true);
}
+void Component::SetRotateEventListener(UIView& view, jerry_value_t eventFunc)
+{
+ onRotateListener_ = new ViewOnRotateListener(eventFunc);
+ if (onRotateListener_ == nullptr) {
+ HILOG_ERROR(HILOG_MODULE_ACE, "rotate listener create failed");
+ return;
+ }
+ view.SetOnRotateListener(onRotateListener_);
+}
+
// default implementation
bool Component::RegisterEventListener(uint16_t eventTypeId, jerry_value_t funcValue, bool isStopPropagation)
{
SetLongPressEventListener(view, funcValue, isStopPropagation);
break;
}
+ case K_ROTATE_INPUT: {
+ SetRotateEventListener(view, funcValue);
+ break;
+ }
case K_SWIPE: {
SetSwipeEventListener(view, funcValue, isStopPropagation);
break;
return false;
}
}
+ SetKeyInputEventListener(view, funcValue, eventTypeId);
return true;
}
{
ACE_DELETE(onClickListener_);
ACE_DELETE(onLongPressListener_);
+ ACE_DELETE(onKeyInputListener_);
#ifdef JS_TOUCH_EVENT_SUPPORT
ACE_DELETE(keyBoardEventListener_);
ACE_DELETE(onTouchStartListener_);
ACE_DELETE(onTouchEndListener_);
#endif
ACE_DELETE(onSwipeListener_);
+ ACE_DELETE(onRotateListener_);
}
void Component::AppendDescriptorOrElements(Component *parent, const JSValue descriptorOrElements)
void SetClickEventListener(UIView& view, const jerry_value_t eventFunc, bool isStopPropagation);
void SetLongPressEventListener(UIView& view, const jerry_value_t eventFunc, bool isStopPropagation);
void SetSwipeEventListener(UIView& view, jerry_value_t eventFunc, bool isStopPropagation);
+ void SetRotateEventListener(UIView& view, jerry_value_t eventFunc);
#ifdef JS_TOUCH_EVENT_SUPPORT
void SetTouchStartEventListener(UIView &view, jerry_value_t eventFunc, bool isStopPropagation);
void SetTouchMoveEventListener(UIView &view, jerry_value_t eventFunc, bool isStopPropagation);
void SetTouchCancelEventListener(UIView &view, jerry_value_t eventFunc, bool isStopPropagation);
void SetKeyBoardEventListener(jerry_value_t eventFunc, bool isStopPropagation);
#endif
+ void SetKeyInputEventListener(UIView &view, jerry_value_t eventFunc, uint16_t eventTypeId);
/**
* @brief release common event listeners if any is set
*/
ViewOnClickListener *onClickListener_;
ViewOnLongPressListener *onLongPressListener_;
ViewOnSwipeListener *onSwipeListener_;
+ ViewOnRotateListener *onRotateListener_;
#ifdef JS_TOUCH_EVENT_SUPPORT
ViewOnTouchStartListener *onTouchStartListener_;
ViewOnTouchMoveListener *onTouchMoveListener_;
ViewOnTouchEndListener *onTouchEndListener_;
KeyBoardEventListener *keyBoardEventListener_;
#endif
+ KeyInputEventListener *onKeyInputListener_;
/**
* record view id, need to be released when this component get released
*/
}
#endif // JS_TOUCH_EVENT_SUPPORT
+ViewOnRotateListener::ViewOnRotateListener(jerry_value_t fn)
+{
+ fn_ = jerry_acquire_value(fn);
+}
+
+ViewOnRotateListener::~ViewOnRotateListener()
+{
+ jerry_release_value(fn_);
+}
+
+bool ViewOnRotateListener::OnRotateStart(UIView& view, const RotateEvent& event)
+{
+ if (jerry_value_is_undefined(fn_)) {
+ HILOG_ERROR(HILOG_MODULE_ACE, "OnRotateStart received, but no JS function to call");
+ return false;
+ }
+ HILOG_DEBUG(HILOG_MODULE_ACE, "OnRotateStart received");
+ jerry_value_t *args = ConvertRotateEventInfo(event);
+ jerry_release_value(CallJSFunctionOnRoot(fn_, args, 1));
+ ClearEventListener(args, 1);
+ return true;
+}
+
+bool ViewOnRotateListener::OnRotate(UIView& view, const RotateEvent& event)
+{
+ if (jerry_value_is_undefined(fn_)) {
+ HILOG_ERROR(HILOG_MODULE_ACE, "OnRotate received, but no JS function to call");
+ return false;
+ }
+ HILOG_DEBUG(HILOG_MODULE_ACE, "OnRotate received");
+ jerry_value_t *args = ConvertRotateEventInfo(event);
+ jerry_release_value(CallJSFunctionOnRoot(fn_, args, 1));
+ ClearEventListener(args, 1);
+ return true;
+}
+
+bool ViewOnRotateListener::OnRotateEnd(UIView& view, const RotateEvent& event)
+{
+ if (jerry_value_is_undefined(fn_)) {
+ HILOG_ERROR(HILOG_MODULE_ACE, "OnRotateEnd received, but no JS function to call");
+ return false;
+ }
+ HILOG_DEBUG(HILOG_MODULE_ACE, "OnRotateEnd received");
+ jerry_value_t *args = ConvertRotateEventInfo(event);
+ jerry_release_value(CallJSFunctionOnRoot(fn_, args, 1));
+ ClearEventListener(args, 1);
+ return true;
+}
+
+KeyInputEventListener::KeyInputEventListener(jerry_value_t fn, uint16_t id)
+{
+ fn_ = jerry_acquire_value(fn);
+ id_ = id;
+}
+
+KeyInputEventListener::~KeyInputEventListener()
+{
+ jerry_release_value(fn_);
+}
+
+void KeyInputEventListener::OnKeyPress(void)
+{
+ pressFlag = 1; // 短按标志
+ return;
+}
+
+void KeyInputEventListener::OnKeyLongPress(const KeyEvent& event)
+{
+ longPressFlag = 1; // 长按标志
+
+ uint16_t keyID = event.GetKeyId();
+ if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER)) {
+ // 切换到关机/重启卡片
+ NativeAbility::GetInstance().ChangeSlice(VIEW_REBOOT);
+ } else if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_FUNC)) {
+ // 切换到查看系统版本卡片
+ }
+ return;
+}
+
+void KeyInputEventListener::OnKeyRelease(const KeyEvent& event)
+{
+ uint16_t currentViewId = NativeAbility::GetInstance().GetCurSliceId();
+ uint16_t keyID = event.GetKeyId();
+ if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_POWER)) {
+ if (longPressFlag == 0 && pressFlag == 1) { // 短按电源键
+ // 退出JS应用
+ JsAppContext::GetInstance()->TerminateAbility();
+ }
+ } else if (keyID == static_cast<uint16_t>(ZliteKeyCode::ZLITE_KEY_FUNC)) {
+ if (longPressFlag == 0 && pressFlag == 1) { // 短按功能键
+ // 短按功能键处理
+ }
+ }
+
+ pressFlag = 0;
+ longPressFlag = 0;
+ return;
+}
+
+bool KeyInputEventListener::OnKeyAct(UIView& view, const KeyEvent& event)
+{
+ UNUSED(view);
+
+ uint8_t state = event.GetState();
+
+ switch (state) {
+ case InputDevice::STATE_PRESS: // 短按
+ OnKeyPress();
+ break;
+#ifdef __LITEOS_M__
+ case InputDevice::STATE_LONG_PRESS: // 长按
+ OnKeyLongPress(event);
+ break;
+#endif
+ case InputDevice::STATE_RELEASE: // 释放
+ OnKeyRelease(event);
+ break;
+ default:
+ break;
+ }
+ return true;
+}
+
void ViewOnSwipeListener::SetStopPropagation(bool isStopPropogation)
{
isStopPropagation_ = isStopPropogation;
if (IS_UNDEFINED(fn_)) {
return;
}
-
+
jerry_value_t textValue = jerry_create_string(reinterpret_cast<const jerry_char_t *>(value));
jerry_value_t args[1] = {textValue};
if (jerry_value_is_function(fn_)) {
#include "ui_slider.h"
#include "ui_toggle_button.h"
#include "ui_edit_text.h"
+#include "dock/input_device.h"
+#include "components/root_view.h"
+#include "events/key_event.h"
+#include "common/key_code.h"
+#include "js_app_context.h"
+#include "NativeAbility.h"
+#include "AppViewIDs.h"
namespace OHOS {
namespace ACELite {
ACE_DISALLOW_COPY_AND_MOVE(ValueChangeListener);
explicit ValueChangeListener(jerry_value_t fn)
: fn_(jerry_acquire_value(fn)) {}
-
+
~ValueChangeListener()
{
jerry_release_value(fn_);
}
-
+
void OnChange(UIView& view, const char* value) override;
private:
jerry_value_t fn_;
};
-
+
class ViewOnClickListener final : public UIView::OnClickListener {
public:
ACE_DISALLOW_COPY_AND_MOVE(ViewOnClickListener);
};
#endif
+class KeyInputEventListener final : public RootView::OnKeyActListener {
+public:
+ ACE_DISALLOW_COPY_AND_MOVE(KeyInputEventListener);
+ KeyInputEventListener(jerry_value_t fn, const uint16_t id);
+ ~KeyInputEventListener();
+ bool OnKeyAct(UIView &view, const KeyEvent &event) override;
+private:
+ void OnKeyPress(void);
+ void OnKeyLongPress(const KeyEvent& event);
+ void OnKeyRelease(const KeyEvent& event);
+ int32_t pressFlag{0};
+ int32_t longPressFlag{0};
+ jerry_value_t fn_;
+ uint16_t id_;
+};
+
class ViewOnSwipeListener final : public UIView::OnDragListener {
public:
ACE_DISALLOW_COPY_AND_MOVE(ViewOnSwipeListener);
bool isStopPropagation_;
};
+class ViewOnRotateListener final : public UIView::OnRotateListener {
+public:
+ ACE_DISALLOW_COPY_AND_MOVE(ViewOnRotateListener);
+ ViewOnRotateListener(jerry_value_t fn);
+
+ ~ViewOnRotateListener() override;
+
+ bool OnRotateStart(UIView& view, const RotateEvent& event) override;
+ bool OnRotate(UIView& view, const RotateEvent& event) override;
+ bool OnRotateEnd(UIView& view, const RotateEvent& event) override;
+private:
+ jerry_value_t fn_;
+};
+
class SliderEventListener final : public UISlider::UISliderEventListener {
public:
ACE_DISALLOW_COPY_AND_MOVE(SliderEventListener);
return true;
}
+bool ListComponent::SetPrivateAttribute(uint16_t attrKeyId, jerry_value_t attrValue)
+{
+ if (attrKeyId == K_SCROLLBAR) {
+ if (jerry_value_is_boolean(attrValue)) {
+ list_.SetYScrollBarVisible(BoolOf(attrValue));
+ } else {
+ list_.SetYScrollBarVisible(false);
+ }
+ return true;
+ }
+ return false;
+}
+
bool ListComponent::RegisterPrivateEventListener(uint16_t eventTypeId, JSValue funcValue, bool isStopPropagation)
{
list_.SetScrollStateListener(&listEventListener_);
UIView *GetComponentRootView() const override;
bool ApplyPrivateStyle(const AppStyleItem* style) override;
bool RegisterPrivateEventListener(uint16_t eventTypeId, JSValue funcValue, bool isStopPropagation) override;
+ bool SetPrivateAttribute(uint16_t attrKeyId, jerry_value_t attrValue) override;
bool ProcessChildren() override;
void OnViewAttached() override;
bool UpdateForView() override;
*/
#define FEATURE_MODULE_DEVICE
+/**
+ * support sensor module
+ */
+#define FEATURE_MODULE_SENSOR
+
+/**
+ * support battery module
+ */
+#define FEATURE_MODULE_BATTERY
+
/**
* date time module
*/
return JSI::CreateBoolean(0);
}
+/**
+ * exit Navigation
+ */
+JSIValue BaiduMapComponentModule::NaviDestroy(const JSIValue thisVal, const JSIValue *args, uint8_t argsSize)
+{
+ HILOG_INFO(HILOG_MODULE_ACE,"exitNavigation");
+ char *data = JSI::JsonStringify(args[0]);
+ HILOG_INFO(HILOG_MODULE_ACE,"exitNavigation : %s \n",data);
+ msg_center_vector_navi_req_destroy_from_watch(MSGCENTER_CMD_VECTOR_NAVI,MSGCENTER_TYPE_ID_VECTOR_NAVI_REQ_DESTROY_FROM_WATCH,data,strlen(data));
+ return JSI::CreateBoolean(0);
+}
+
void InitBaiduMapComponentModule(JSIValue exports)
{
HILOG_INFO(HILOG_MODULE_ACE,"InitBaiduMapComponentModule");
* BT connect interface
*/
JSI::SetModuleAPI(exports, "onBTConnect", BaiduMapComponentModule::onBTConnect);
-
+ /**
+ * exit navigation
+ */
+ JSI::SetModuleAPI(exports, "naviDestroy", BaiduMapComponentModule::NaviDestroy);
}
} // namespace ACELite
} // namespace OHOS
-void BaidumapSendMsgToJS(const char *msgBody,uint8_t type)
+int32_t BaidumapSendMsgToJS(const char *msgBody,uint8_t type)
{
BaiduMapAsyncMsgParams *params = new BaiduMapAsyncMsgParams();
if (params == nullptr) {
- HILOG_ERROR(HILOG_MODULE_ACE,"Failed to allocate memory for params");
- return;
+ HILOG_ERROR(HILOG_MODULE_ACE,"Failed to allocate memory for params");
+ return -1;
}
params->type = type;
params->flag = true;
int32_t copyRet = OHOS::ACELite::DmsLiteCpoyStr(¶ms->msgBody, msgBody);
if (copyRet != 0) {
- HILOG_ERROR(HILOG_MODULE_ACE,"Failed to copy msgBody");
+ HILOG_ERROR(HILOG_MODULE_ACE,"Failed to copy msgBody");
delete params;
params = nullptr;
- return;
+ return copyRet;
}
bool ret = OHOS::ACELite::JsAsyncWork::DispatchAsyncWork(OHOS::ACELite::ExecuteSendMsgToJS,static_cast<void *>(params));
HILOG_ERROR(HILOG_MODULE_ACE, "Failed to dispatch async work");
delete params;
params = nullptr;
+ return -1;
}
- return;
+ return 0;
}
-void BaidumapFailSendMsgToJS(const char *msgBody,uint8_t type)
+int32_t BaidumapFailSendMsgToJS(const char *msgBody,uint8_t type)
{
BaiduMapAsyncMsgParams *params = new BaiduMapAsyncMsgParams();
if (params == nullptr) {
HILOG_ERROR(HILOG_MODULE_ACE,"Failed to allocate memory for params");
- return;
+ return -1;
}
params->type = type;
params->flag = false;
HILOG_ERROR(HILOG_MODULE_ACE,"Failed to copy msgBody");
delete params;
params = nullptr;
- return;
+ return copyRet;
}
bool ret = OHOS::ACELite::JsAsyncWork::DispatchAsyncWork(OHOS::ACELite::ExecuteSendMsgToJS, static_cast<void *>(params));
HILOG_ERROR(HILOG_MODULE_ACE, "Failed to dispatch async work");
delete params;
params = nullptr;
+ return -1;
}
- return;
+ return 0;
}
*/
static JSIValue onBTConnect(const JSIValue thisVal, const JSIValue *args, uint8_t argsSize);
+ /**
+ * exit navigation
+ */
+ static JSIValue NaviDestroy(const JSIValue thisVal, const JSIValue *args, uint8_t argsSize);
+
};
void InitBaiduMapComponentModule(JSIValue exports);
}
}
-void BaidumapSendMsgToJS(const char *msgBody,uint8_t type);
-void BaidumapFailSendMsgToJS(const char *msgBody,uint8_t type);
+int32_t BaidumapSendMsgToJS(const char *msgBody,uint8_t type);
+int32_t BaidumapFailSendMsgToJS(const char *msgBody,uint8_t type);
#endif
--- /dev/null
+/*\r
+ * Copyright (c) 2020 Huawei Device Co., Ltd.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include <new>\r
+#include "ace_log.h"\r
+#include "js_app_context.h"\r
+#include "js_async_work.h"\r
+#include "product_adapter.h"\r
+#include <securec.h>\r
+#include "battery_module.h"\r
+#include "media_log.h"\r
+#include "global.h"\r
+#include "screen.h"\r
+\r
+\r
+namespace OHOS {\r
+namespace ACELite {\r
+\r
+const char * const BatteryModule::BATTERY_CHARGING_NAME = "charging";\r
+const char * const BatteryModule::BATTERY_LEVEL_NAME = "level";\r
+const bool BatteryModule::DFAULT_BATTERY_CHARGING = false;\r
+const double BatteryModule::DFAULT_BATTERY_LEVEL = 0.5; // 50%\r
+\r
+JSIValue BatteryModule::GetStatus(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)\r
+{\r
+ return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteGetStatus);\r
+}\r
+\r
+JSIValue BatteryModule::ExecuteAsyncWork(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum, AsyncWorkHandler ExecuteFunc)\r
+{\r
+ JSIValue undefValue = JSI::CreateUndefined();\r
+ if ((args == nullptr) || (argsNum == 0) || (JSI::ValueIsUndefined(args[0]))) {\r
+ HILOG_ERROR(HILOG_MODULE_ACE, "Error in obtaining Battery information parameters");\r
+ return undefValue;\r
+ }\r
+ BatteryParams* params = new(std::nothrow) BatteryParams();\r
+ if (params == nullptr) {\r
+ return undefValue;\r
+ }\r
+ params->thisVal = JSI::AcquireValue(thisVal);\r
+ params->args = JSI::AcquireValue(args[0]);\r
+ JsAsyncWork::DispatchAsyncWork(ExecuteFunc, reinterpret_cast<void *>(params));\r
+ return undefValue;\r
+}\r
+\r
+void BatteryModule::ExecuteGetStatus(void* data)\r
+{\r
+ BatteryParams* params = reinterpret_cast<BatteryParams *>(data);\r
+ if (params == nullptr) {\r
+ return;\r
+ }\r
+ JSIValue args = params->args;\r
+ JSIValue thisVal = params->thisVal;\r
+ JSIValue result = JSI::CreateObject();\r
+ JSI::SetBooleanProperty(result, BATTERY_CHARGING_NAME, DFAULT_BATTERY_CHARGING);\r
+ JSI::SetNumberProperty(result, BATTERY_LEVEL_NAME, DFAULT_BATTERY_LEVEL);\r
+ if (true) {\r
+ SuccessCallBack(thisVal, args, result);\r
+ } else {\r
+ FailCallBack(thisVal, args, -1);\r
+ }\r
+ JSI::ReleaseValueList(args, thisVal, result, ARGS_END);\r
+ delete params;\r
+}\r
+\r
+void BatteryModule::SuccessCallBack(const JSIValue thisVal, const JSIValue args, JSIValue jsiValue)\r
+{\r
+ if (JSI::ValueIsUndefined(args)) {\r
+ return;\r
+ }\r
+ JSIValue success = JSI::GetNamedProperty(args, CB_SUCCESS);\r
+ JSIValue complete = JSI::GetNamedProperty(args, CB_COMPLETE);\r
+ if (!JSI::ValueIsUndefined(success)) {\r
+ if (JSI::ValueIsUndefined(jsiValue)) {\r
+ JSI::CallFunction(success, thisVal, nullptr, 0);\r
+ } else {\r
+ JSI::CallFunction(success, thisVal, &jsiValue, ARGC_ONE);\r
+ }\r
+ }\r
+ if (!JSI::ValueIsUndefined(complete)) {\r
+ JSI::CallFunction(complete, thisVal, nullptr, 0);\r
+ }\r
+ JSI::ReleaseValueList(success, complete, ARGS_END);\r
+}\r
+\r
+void BatteryModule::FailCallBack(const JSIValue thisVal, const JSIValue args, int ret)\r
+{\r
+ if (JSI::ValueIsUndefined(args)) {\r
+ return;\r
+ }\r
+ JSIValue errInfo;\r
+ errInfo = JSI::CreateString("Battery faild");\r
+ JSIValue errCode = JSI::CreateNumber(ret);\r
+ JSIValue fail = JSI::GetNamedProperty(args, CB_FAIL);\r
+ JSIValue complete = JSI::GetNamedProperty(args, CB_COMPLETE);\r
+ JSIValue argv[ARGC_TWO] = {errInfo, errCode};\r
+ if (!JSI::ValueIsUndefined(fail)) {\r
+ JSI::CallFunction(fail, thisVal, argv, ARGC_TWO);\r
+ }\r
+ if (!JSI::ValueIsUndefined(complete)) {\r
+ JSI::CallFunction(complete, thisVal, nullptr, 0);\r
+ }\r
+ JSI::ReleaseValueList(fail, complete, errInfo, errCode, ARGS_END);\r
+}\r
+\r
+} // namespace ACELite\r
+} // namespace OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) 2020 Huawei Device Co., Ltd.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef OHOS_ACELITE_BATTERY_MODULE_H\r
+#define OHOS_ACELITE_BATTERY_MODULE_H\r
+\r
+#include <cJSON.h>\r
+#include "acelite_config.h"\r
+#include "jsi.h"\r
+#include "js_async_work.h"\r
+#include "non_copyable.h"\r
+#include "product_adapter.h"\r
+#include "abilityms_slite_client.h"\r
+\r
+namespace OHOS {\r
+namespace ACELite {\r
+\r
+struct BatteryParams {\r
+ JSIValue args = JSI::CreateUndefined();\r
+ JSIValue thisVal = JSI::CreateUndefined();\r
+};\r
+\r
+class BatteryModule final : public MemoryHeap {\r
+public:\r
+ ACE_DISALLOW_COPY_AND_MOVE(BatteryModule);\r
+ BatteryModule() = default;\r
+ ~BatteryModule() = default;\r
+ static const char * const BATTERY_CHARGING_NAME;\r
+ static const char * const BATTERY_LEVEL_NAME;\r
+ static const bool DFAULT_BATTERY_CHARGING;\r
+ static const double DFAULT_BATTERY_LEVEL;\r
+ static JSIValue GetStatus(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum);\r
+\r
+private:\r
+ static JSIValue ExecuteAsyncWork(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum, AsyncWorkHandler ExecuteFunc);\r
+ static void SuccessCallBack(const JSIValue thisVal, const JSIValue args, JSIValue jsiValue);\r
+ static void FailCallBack(const JSIValue thisVal, const JSIValue args, int ret);\r
+ static void ExecuteGetStatus(void *data);\r
+\r
+};\r
+\r
+void InitBatteryModule(JSIValue exports)\r
+{\r
+ JSI::SetModuleAPI(exports, "getStatus", BatteryModule::GetStatus);\r
+}\r
+\r
+} // namespace ACELite\r
+} // namespace OHOS\r
+#endif // OHOS_ACELITE_APP_MODULE_H\r
#endif\r
\r
constexpr char KEEPSCREENON[] = "keepScreenOn";\r
+constexpr char MODE[] = "mode";\r
+constexpr char VALUE[] = "value";\r
uint32_t g_keepOnTimeout = 5000; // 5000ms\r
+brightness_mode_t g_brightness_mode = static_cast<brightness_mode_t>(50);\r
+uint8_t g_brightness_value = 50;\r
const char * ERR_GENERAL = "display error";\r
const char * ERR_NOT_SUPPORT = "display set is not support";\r
const int DISPLAY_SUCCESS = 0; \r
}\r
return JSI::CreateUndefined();\r
}\r
+\r
+JSIValue DisplayModule::SetMode(const JSIValue thisVal, const JSIValue *args, uint8_t argsSize)\r
+{\r
+ int ret = DISPLAY_NOT_SUPPORT;\r
+#if defined(SUPPORT_POWER_MANAGER)\r
+ errcode_t result;\r
+ brightness_mode_t mode = static_cast<brightness_mode_t>(JSI::GetNumberProperty(args[0], MODE));\r
+ const power_display_svr_api_t *display_api = power_display_svr_get_api();\r
+ screen_context_t * curScreenCtx = power_display_get_screen_context();\r
+ g_brightness_mode = curScreenCtx->brightness_mode;\r
+ if (mode <= AUTO) {\r
+ if (display_api->get_screen_state() != SCREEN_ON) {\r
+ display_api->turn_on_screen();\r
+ }\r
+ result = display_api->set_brightness_mode(mode);\r
+ } else {\r
+ result = display_api->set_brightness_mode(g_brightness_mode);\r
+ }\r
+ if (result == ERRCODE_SUCC) {\r
+ ret = DISPLAY_SUCCESS;\r
+ }\r
+ else {\r
+ ret = DISPLAY_FAIL;\r
+ }\r
+#endif\r
+ if (ret == DISPLAY_SUCCESS) {\r
+ SuccessCallBack(thisVal, args[0], JSI::CreateUndefined());\r
+ } else {\r
+ FailCallBack(thisVal, args[0], ret);\r
+ }\r
+ return JSI::CreateUndefined();\r
+}\r
+\r
+JSIValue DisplayModule::GetMode(const JSIValue thisVal, const JSIValue *args, uint8_t argsSize)\r
+{\r
+ int ret = DISPLAY_NOT_SUPPORT;\r
+#if defined(SUPPORT_POWER_MANAGER)\r
+ JSIValue result = JSI::CreateObject();\r
+ const power_display_svr_api_t *display_api = power_display_svr_get_api();\r
+ if (display_api->get_screen_state() != SCREEN_ON) {\r
+ display_api->turn_on_screen();\r
+ }\r
+ brightness_mode_t mode = display_api->get_brightness_mode();\r
+ JSI::SetNumberProperty(result, MODE, static_cast<double>(mode));\r
+#endif\r
+ if (mode >= 0) {\r
+ SuccessCallBack(thisVal, args[0], result);\r
+ } else {\r
+ FailCallBack(thisVal, args[0], ret);\r
+ }\r
+ return JSI::CreateUndefined();\r
+}\r
+\r
+JSIValue DisplayModule::SetValue(const JSIValue thisVal, const JSIValue *args, uint8_t argsSize)\r
+{\r
+ int ret = DISPLAY_NOT_SUPPORT;\r
+#if defined(SUPPORT_POWER_MANAGER)\r
+ errcode_t result;\r
+ uint8_t brightness_value = static_cast<uint8_t>(JSI::GetNumberProperty(args[0], VALUE));\r
+ const power_display_svr_api_t *display_api = power_display_svr_get_api();\r
+ screen_context_t * curScreenCtx = power_display_get_screen_context();\r
+ uint8_t g_brightness_value = curScreenCtx->brightness_value;\r
+ if (brightness_value >= 0) {\r
+ if (display_api->get_screen_state() != SCREEN_ON) {\r
+ display_api->turn_on_screen();\r
+ }\r
+ result = display_api->set_brightness(brightness_value);\r
+ } else {\r
+ result = display_api->set_brightness(g_brightness_mode);\r
+ }\r
+ if (result == ERRCODE_SUCC) {\r
+ ret = DISPLAY_SUCCESS;\r
+ }\r
+ else {\r
+ ret = DISPLAY_FAIL;\r
+ }\r
+#endif\r
+ if (ret == DISPLAY_SUCCESS) {\r
+ SuccessCallBack(thisVal, args[0], JSI::CreateUndefined());\r
+ } else {\r
+ FailCallBack(thisVal, args[0], ret);\r
+ }\r
+ return JSI::CreateUndefined();\r
+}\r
+\r
+JSIValue DisplayModule::GetValue(const JSIValue thisVal, const JSIValue *args, uint8_t argsSize)\r
+{\r
+ int ret = DISPLAY_NOT_SUPPORT;\r
+#if defined(SUPPORT_POWER_MANAGER)\r
+ JSIValue result = JSI::CreateObject();\r
+ const power_display_svr_api_t *display_api = power_display_svr_get_api();\r
+ if (display_api->get_screen_state() != SCREEN_ON) {\r
+ display_api->turn_on_screen();\r
+ }\r
+ uint8_t brightness_value = display_api->get_brightness();\r
+ JSI::SetNumberProperty(result, VALUE, static_cast<double>(brightness_value));\r
+#endif\r
+ if (brightness_value >= 0) {\r
+ SuccessCallBack(thisVal, args[0], result);\r
+ } else {\r
+ FailCallBack(thisVal, args[0], ret);\r
+ }\r
+ return JSI::CreateUndefined();\r
+}\r
+\r
void InitBrightnessModule(JSIValue exports)\r
{\r
JSI::SetModuleAPI(exports, "setKeepScreenOn", DisplayModule::SetKeepScreenOn);\r
+ JSI::SetModuleAPI(exports, "setMode", DisplayModule::SetMode);\r
+ JSI::SetModuleAPI(exports, "getMode", DisplayModule::GetMode);\r
+ JSI::SetModuleAPI(exports, "setValue", DisplayModule::SetValue);\r
+ JSI::SetModuleAPI(exports, "getValue", DisplayModule::GetValue);\r
}\r
} // namespace ACELite\r
} // namespace OHOS
\ No newline at end of file
*/\r
static JSIValue SetKeepScreenOn(const JSIValue thisVal, const JSIValue *args, uint8_t argsSize);\r
\r
+ /**\r
+ * Display interface\r
+ */\r
+ static JSIValue SetMode(const JSIValue thisVal, const JSIValue *args, uint8_t argsSize);\r
+\r
+ /**\r
+ * Display interface\r
+ */\r
+ static JSIValue GetMode(const JSIValue thisVal, const JSIValue *args, uint8_t argsSize);\r
+\r
+ /**\r
+ * Display interface\r
+ */\r
+ static JSIValue SetValue(const JSIValue thisVal, const JSIValue *args, uint8_t argsSize);\r
+\r
+ /**\r
+ * Display interface\r
+ */\r
+ static JSIValue GetValue(const JSIValue thisVal, const JSIValue *args, uint8_t argsSize);\r
};\r
\r
void InitBrightnessModule(JSIValue exports);\r
#include "ace_log.h"
#include "internal/jsi_internal.h"
#include "ohos_module_config.h"
+#include "timer_module.h"
namespace OHOS {
namespace ACELite {
void ModuleManager::CleanUpModule()
{
+ ACELite::TimerModule::GetInstance()->Clear();
if (requiredSystemModules != 0) {
JSI::ReleaseValue(requiredSystemModules);
requiredSystemModules = 0;
// extern void InitLocationModule(JSIValue exports);
// #endif
-// #ifdef FEATURE_MODULE_SENSOR
-// extern void InitVibratorModule(JSIValue exports);
-// extern void InitSensorModule(JSIValue exports);
-// #endif
+#ifdef FEATURE_MODULE_SENSOR
+extern void InitVibratorModule(JSIValue exports);
+extern void InitSensorModule(JSIValue exports);
+#endif
#ifdef FEATURE_MODULE_BRIGHTNESS
extern void InitBrightnessModule(JSIValue exports);
#endif
-// #ifdef FEATURE_MODULE_BATTERY
-// extern void InitBatteryModule(JSIValue exports);
-// #endif
+#ifdef FEATURE_MODULE_BATTERY
+extern void InitBatteryModule(JSIValue exports);
+#endif
#ifdef FEATURE_MODULE_CONFIGURATION
extern void InitLocaleModule(JSIValue exports);
// #ifdef FEATURE_MODULE_GEO
// {"geolocation", InitLocationModule},
// #endif
-// #ifdef FEATURE_MODULE_SENSOR
-// {"vibrator", InitVibratorModule},
-// {"sensor", InitSensorModule},
-// #endif
+#ifdef FEATURE_MODULE_SENSOR
+ {"vibrator", InitVibratorModule},
+ {"sensor", InitSensorModule},
+#endif
#ifdef FEATURE_MODULE_BRIGHTNESS
{"brightness", InitBrightnessModule},
#endif
-// #ifdef FEATURE_MODULE_BATTERY
-// {"battery", InitBatteryModule},
-// #endif
+#ifdef FEATURE_MODULE_BATTERY
+ {"battery", InitBatteryModule},
+#endif
#ifdef FEATURE_MODULE_CONFIGURATION
{"configuration", InitLocaleModule},
#endif
if (timer != nullptr) {
StopTimerTask(timer->timerId);
}
-#endif
timerList->DeleteTimer(arg->index);
+#endif
}
#else // SYNC_TIMER_CALLBACK
if (jerry_value_is_function(arg->func)) {
if ((currentTimer != nullptr) && (!funcArgs->repeated)) {
#if defined(__LITEOS_A__)
StopTimerTask(timer->timerId);
-#endif
timerList->DeleteTimer(funcArgs->index);
+#endif
}
}
}
--- /dev/null
+/*\r
+ * Copyright (c) 2020 Huawei Device Co., Ltd.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include <new>\r
+#include "ace_log.h"\r
+#include "js_app_context.h"\r
+#include "js_async_work.h"\r
+#include "product_adapter.h"\r
+#include <securec.h>\r
+#include "sensor_module.h"\r
+#include "media_log.h"\r
+#include "global.h"\r
+#include "screen.h"\r
+\r
+namespace OHOS {\r
+namespace ACELite {\r
+\r
+const char * const SensorModule::STEPS = "steps";\r
+const uint32_t SensorModule::DEFAULT_STEPS = 2000; // 2000 steps\r
+const char * const SensorModule::PRESSURE = "pressure";\r
+const uint32_t SensorModule::DEFAULT_PRESSURE = 101300; // 1.013×10^5 Pa\r
+const char * const SensorModule::HEARTRATE = "heartRate";\r
+const uint32_t SensorModule::DEFAULT_HEARTRATE = 80; // 80/min\r
+const char * const SensorModule::ISONBODY = "value";\r
+const bool SensorModule::DEFAULT_ISONBODY = true; \r
+\r
+void SensorModule::SuccessCallBack(const JSIValue thisVal, const JSIValue args, JSIValue jsiValue, bool flag)\r
+{\r
+ if (JSI::ValueIsUndefined(args)) {\r
+ return;\r
+ }\r
+ JSIValue success = JSI::GetNamedProperty(args, CB_SUCCESS);\r
+ JSIValue complete = JSI::GetNamedProperty(args, CB_COMPLETE);\r
+ if (!JSI::ValueIsUndefined(success)) {\r
+ if (JSI::ValueIsUndefined(jsiValue)) {\r
+ JSI::CallFunction(success, thisVal, nullptr, 0);\r
+ } else {\r
+ JSI::CallFunction(success, thisVal, &jsiValue, ARGC_ONE);\r
+ }\r
+ }\r
+ if (!JSI::ValueIsUndefined(complete) && flag) {\r
+ JSI::CallFunction(complete, thisVal, nullptr, 0);\r
+ }\r
+ JSI::ReleaseValueList(success, complete, ARGS_END);\r
+}\r
+\r
+void SensorModule::FailCallBack(const JSIValue thisVal, const JSIValue args, int ret, bool flag)\r
+{\r
+ if (JSI::ValueIsUndefined(args)) {\r
+ return;\r
+ }\r
+ JSIValue errInfo;\r
+ errInfo = JSI::CreateString("Sensor faild");\r
+ JSIValue errCode = JSI::CreateNumber(ret);\r
+ JSIValue fail = JSI::GetNamedProperty(args, CB_FAIL);\r
+ JSIValue complete = JSI::GetNamedProperty(args, CB_COMPLETE);\r
+ JSIValue argv[ARGC_TWO] = {errInfo, errCode};\r
+ if (!JSI::ValueIsUndefined(fail)) {\r
+ JSI::CallFunction(fail, thisVal, argv, ARGC_TWO);\r
+ }\r
+ if (!JSI::ValueIsUndefined(complete) && flag) {\r
+ JSI::CallFunction(complete, thisVal, nullptr, 0);\r
+ }\r
+ JSI::ReleaseValueList(fail, complete, errInfo, errCode, ARGS_END);\r
+}\r
+\r
+void SensorModule::ExecuteSubscribeStepCounter(void* data)\r
+{\r
+ SensorParams* params = reinterpret_cast<SensorParams *>(data);\r
+ if (params == nullptr) {\r
+ return;\r
+ }\r
+ JSIValue args = params->args;\r
+ JSIValue thisVal = params->thisVal;\r
+ JSIValue result = JSI::CreateObject();\r
+ uint32_t steps = DEFAULT_STEPS;\r
+ JSI::SetNumberProperty(result, STEPS, static_cast<double>(steps));\r
+ if (true) {\r
+ SuccessCallBack(thisVal, args, result, false);\r
+ } else {\r
+ FailCallBack(thisVal, args, -1, false);\r
+ }\r
+ JSI::ReleaseValueList(args, thisVal, result, ARGS_END);\r
+ delete params;\r
+}\r
+\r
+void SensorModule::ExecuteUnsubscribeStepCounter(void* data)\r
+{\r
+ SensorParams* params = reinterpret_cast<SensorParams *>(data);\r
+ if (params == nullptr) {\r
+ return;\r
+ }\r
+ JSIValue thisVal = params->thisVal;\r
+ printf("--------ExecuteUnsubscribeStepCounter--------\n");\r
+ JSI::ReleaseValueList(thisVal, JSI::CreateUndefined(), ARGS_END);\r
+ delete params;\r
+}\r
+\r
+void SensorModule::ExecuteSubscribeBarometer(void* data)\r
+{\r
+ SensorParams* params = reinterpret_cast<SensorParams *>(data);\r
+ if (params == nullptr) {\r
+ return;\r
+ }\r
+ JSIValue args = params->args;\r
+ JSIValue thisVal = params->thisVal;\r
+ JSIValue result = JSI::CreateObject();\r
+ uint32_t pressure = DEFAULT_PRESSURE;\r
+ JSI::SetNumberProperty(result, PRESSURE, static_cast<double>(pressure));\r
+ if (true) {\r
+ SuccessCallBack(thisVal, args, result, false);\r
+ } else {\r
+ FailCallBack(thisVal, args, -1, false);\r
+ }\r
+ JSI::ReleaseValueList(args, thisVal, result, ARGS_END);\r
+ delete params;\r
+}\r
+\r
+void SensorModule::ExecuteUnsubscribeBarometer(void* data)\r
+{\r
+ printf("--------ExecuteUnsubscribeBarometer--------\n");\r
+ SensorParams* params = reinterpret_cast<SensorParams *>(data);\r
+ if (params == nullptr) {\r
+ return;\r
+ }\r
+ JSIValue thisVal = params->thisVal;\r
+ JSI::ReleaseValueList(thisVal, JSI::CreateUndefined(), ARGS_END);\r
+ delete params;\r
+}\r
+\r
+void SensorModule::ExecuteSubscribeHeartRate(void* data)\r
+{\r
+ SensorParams* params = reinterpret_cast<SensorParams *>(data);\r
+ if (params == nullptr) {\r
+ return;\r
+ }\r
+ JSIValue args = params->args;\r
+ JSIValue thisVal = params->thisVal;\r
+ JSIValue result = JSI::CreateObject();\r
+ uint32_t heartRate = DEFAULT_HEARTRATE;\r
+ JSI::SetNumberProperty(result, HEARTRATE, static_cast<double>(heartRate));\r
+ if (true) {\r
+ SuccessCallBack(thisVal, args, result, false);\r
+ } else {\r
+ FailCallBack(thisVal, args, -1, false);\r
+ }\r
+ JSI::ReleaseValueList(args, thisVal, result, ARGS_END);\r
+ delete params;\r
+}\r
+\r
+void SensorModule::ExecuteUnsubscribeHeartRate(void* data)\r
+{\r
+ SensorParams* params = reinterpret_cast<SensorParams *>(data);\r
+ if (params == nullptr) {\r
+ return;\r
+ }\r
+ JSIValue thisVal = params->thisVal;\r
+ printf("--------ExecuteUnsubscribeHeartRate--------\n");\r
+ JSI::ReleaseValueList(thisVal, JSI::CreateUndefined(), ARGS_END);\r
+ delete params;\r
+}\r
+\r
+void SensorModule::ExecuteSubscribeOnBodyState(void* data)\r
+{\r
+ SensorParams* params = reinterpret_cast<SensorParams *>(data);\r
+ if (params == nullptr) {\r
+ return;\r
+ }\r
+ JSIValue args = params->args;\r
+ JSIValue thisVal = params->thisVal;\r
+ JSIValue result = JSI::CreateObject();\r
+ bool value = DEFAULT_ISONBODY;\r
+ JSI::SetBooleanProperty(result, ISONBODY, static_cast<double>(value));\r
+ if (true) {\r
+ SuccessCallBack(thisVal, args, result, false);\r
+ } else {\r
+ FailCallBack(thisVal, args, -1, false);\r
+ }\r
+ JSI::ReleaseValueList(args, thisVal, result, ARGS_END);\r
+ delete params;\r
+}\r
+\r
+void SensorModule::ExecuteUnsubscribeOnBodyState(void* data)\r
+{\r
+ SensorParams* params = reinterpret_cast<SensorParams *>(data);\r
+ if (params == nullptr) {\r
+ return;\r
+ }\r
+ JSIValue thisVal = params->thisVal;\r
+ printf("--------ExecuteUnsubscribeOnBodyState--------\n");\r
+ JSI::ReleaseValueList(thisVal, JSI::CreateUndefined(), ARGS_END);\r
+ delete params;\r
+}\r
+\r
+void SensorModule::ExecuteGetOnBodyState(void* data)\r
+{\r
+ SensorParams* params = reinterpret_cast<SensorParams *>(data);\r
+ if (params == nullptr) {\r
+ return;\r
+ }\r
+ JSIValue args = params->args;\r
+ JSIValue thisVal = params->thisVal;\r
+ JSIValue result = JSI::CreateObject();\r
+ bool value = DEFAULT_ISONBODY;\r
+ JSI::SetBooleanProperty(result, ISONBODY, static_cast<double>(value));\r
+ if (true) {\r
+ SuccessCallBack(thisVal, args, result, true);\r
+ } else {\r
+ FailCallBack(thisVal, args, -1, true);\r
+ }\r
+ JSI::ReleaseValueList(args, thisVal, result, ARGS_END);\r
+ delete params;\r
+}\r
+\r
+JSIValue SensorModule::ExecuteAsyncWork(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum, AsyncWorkHandler ExecuteFunc)\r
+{\r
+ printf("args=%p argsNum=%d\n", args, argsNum);\r
+ JSIValue undefValue = JSI::CreateUndefined();\r
+ // if ((args == nullptr) || (argsNum == 0) || (JSI::ValueIsUndefined(args[0]))) {\r
+ // HILOG_ERROR(HILOG_MODULE_ACE, "Error in obtaining Sensor information parameters");\r
+ // return undefValue;\r
+ // }\r
+\r
+ SensorParams* params = new(std::nothrow) SensorParams();\r
+ if (params == nullptr) {\r
+ return undefValue;\r
+ }\r
+ params->thisVal = JSI::AcquireValue(thisVal);\r
+ if (args != nullptr) {\r
+ params->args = JSI::AcquireValue(args[0]);\r
+ }\r
+ JsAsyncWork::DispatchAsyncWork(ExecuteFunc, reinterpret_cast<void *>(params));\r
+ return undefValue;\r
+}\r
+\r
+JSIValue SensorModule::SubscribeStepCounter(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)\r
+{\r
+ return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteSubscribeStepCounter);\r
+}\r
+\r
+JSIValue SensorModule::UnsubscribeStepCounter(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)\r
+{\r
+ return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteUnsubscribeStepCounter);\r
+}\r
+\r
+JSIValue SensorModule::SubscribeBarometer(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)\r
+{\r
+ return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteSubscribeBarometer);\r
+}\r
+\r
+JSIValue SensorModule::UnsubscribeBarometer(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)\r
+{\r
+ return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteUnsubscribeBarometer);\r
+}\r
+\r
+JSIValue SensorModule::SubscribeHeartRate(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)\r
+{\r
+ return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteSubscribeHeartRate);\r
+}\r
+\r
+JSIValue SensorModule::UnsubscribeHeartRate(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)\r
+{\r
+ return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteUnsubscribeHeartRate);\r
+}\r
+\r
+JSIValue SensorModule::SubscribeOnBodyState(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)\r
+{\r
+ return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteSubscribeOnBodyState);\r
+}\r
+\r
+JSIValue SensorModule::UnsubscribeOnBodyState(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)\r
+{\r
+ return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteUnsubscribeOnBodyState);\r
+}\r
+\r
+JSIValue SensorModule::GetOnBodyState(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)\r
+{\r
+ return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteGetOnBodyState);\r
+}\r
+\r
+} // namespace ACELite\r
+} // namespace OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) 2020 Huawei Device Co., Ltd.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef OHOS_ACELITE_SENSOR_MODULE_H\r
+#define OHOS_ACELITE_SENSOR_MODULE_H\r
+\r
+#include <cJSON.h>\r
+#include "acelite_config.h"\r
+#include "jsi.h"\r
+#include "js_async_work.h"\r
+#include "non_copyable.h"\r
+#include "product_adapter.h"\r
+#include "abilityms_slite_client.h"\r
+\r
+namespace OHOS {\r
+namespace ACELite {\r
+\r
+struct SensorParams {\r
+ JSIValue args = JSI::CreateUndefined();\r
+ JSIValue thisVal = JSI::CreateUndefined();\r
+};\r
+\r
+class SensorModule final : public MemoryHeap {\r
+public:\r
+ ACE_DISALLOW_COPY_AND_MOVE(SensorModule);\r
+ SensorModule() = default;\r
+ ~SensorModule() = default;\r
+ static const char * const STEPS;\r
+ static const uint32_t DEFAULT_STEPS;\r
+ static const char * const PRESSURE;\r
+ static const uint32_t DEFAULT_PRESSURE;\r
+ static const char * const HEARTRATE;\r
+ static const uint32_t DEFAULT_HEARTRATE;\r
+ static const char * const ISONBODY;\r
+ static const bool DEFAULT_ISONBODY; \r
+ static JSIValue SubscribeStepCounter(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum);\r
+ static JSIValue UnsubscribeStepCounter(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum);\r
+ static JSIValue SubscribeBarometer(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum);\r
+ static JSIValue UnsubscribeBarometer(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum);\r
+ static JSIValue SubscribeHeartRate(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum);\r
+ static JSIValue UnsubscribeHeartRate(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum);\r
+ static JSIValue SubscribeOnBodyState(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum);\r
+ static JSIValue UnsubscribeOnBodyState(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum);\r
+ static JSIValue GetOnBodyState(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum);\r
+\r
+private:\r
+ static JSIValue ExecuteAsyncWork(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum, AsyncWorkHandler ExecuteFunc);\r
+ static void SuccessCallBack(const JSIValue thisVal, const JSIValue args, JSIValue jsiValue, bool flag);\r
+ static void FailCallBack(const JSIValue thisVal, const JSIValue args, int ret, bool flag);\r
+ static void ExecuteSubscribeStepCounter(void *data);\r
+ static void ExecuteUnsubscribeStepCounter(void *data);\r
+ static void ExecuteSubscribeBarometer(void *data);\r
+ static void ExecuteUnsubscribeBarometer(void *data);\r
+ static void ExecuteSubscribeHeartRate(void *data);\r
+ static void ExecuteUnsubscribeHeartRate(void *data);\r
+ static void ExecuteSubscribeOnBodyState(void *data);\r
+ static void ExecuteUnsubscribeOnBodyState(void *data);\r
+ static void ExecuteGetOnBodyState(void *data);\r
+\r
+};\r
+\r
+void InitSensorModule(JSIValue exports)\r
+{\r
+ JSI::SetModuleAPI(exports, "subscribeStepCounter", SensorModule::SubscribeStepCounter);\r
+ JSI::SetModuleAPI(exports, "unsubscribeStepCounter", SensorModule::UnsubscribeStepCounter);\r
+ JSI::SetModuleAPI(exports, "subscribeBarometer", SensorModule::SubscribeBarometer);\r
+ JSI::SetModuleAPI(exports, "unsubscribeBarometer", SensorModule::UnsubscribeBarometer);\r
+ JSI::SetModuleAPI(exports, "subscribeHeartRate", SensorModule::SubscribeHeartRate);\r
+ JSI::SetModuleAPI(exports, "unsubscribeHeartRate", SensorModule::UnsubscribeHeartRate);\r
+ JSI::SetModuleAPI(exports, "subscribeOnBodyState", SensorModule::SubscribeOnBodyState);\r
+ JSI::SetModuleAPI(exports, "unsubscribeOnBodyState", SensorModule::UnsubscribeOnBodyState);\r
+ JSI::SetModuleAPI(exports, "getOnBodyState", SensorModule::GetOnBodyState);\r
+}\r
+\r
+} // namespace ACELite\r
+} // namespace OHOS\r
+#endif // OHOS_ACELITE_APP_MODULE_H\r
--- /dev/null
+/*\r
+ * Copyright (c) 2020 Huawei Device Co., Ltd.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#include <new>\r
+#include "ace_log.h"\r
+#include "js_app_context.h"\r
+#include "js_async_work.h"\r
+#include "product_adapter.h"\r
+#include <securec.h>\r
+#include "vibrator_module.h"\r
+#include "media_log.h"\r
+#include "global.h"\r
+#include "screen.h"\r
+\r
+namespace OHOS {\r
+namespace ACELite {\r
+\r
+const char * const VibratorModule::VIBTATOR_MODE = "mode";\r
+\r
+JSIValue VibratorModule::Vibrate(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum)\r
+{\r
+ return ExecuteAsyncWork(thisVal, args, argsNum, ExecuteVibrate);\r
+}\r
+\r
+JSIValue VibratorModule::ExecuteAsyncWork(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum, AsyncWorkHandler ExecuteFunc)\r
+{\r
+ JSIValue undefValue = JSI::CreateUndefined();\r
+ if ((args == nullptr) || (argsNum == 0) || (JSI::ValueIsUndefined(args[0]))) {\r
+ HILOG_ERROR(HILOG_MODULE_ACE, "Error in obtaining device information parameters");\r
+ return undefValue;\r
+ }\r
+ VibratorParams* params = new(std::nothrow) VibratorParams();\r
+ if (params == nullptr) {\r
+ return undefValue;\r
+ }\r
+ params->thisVal = JSI::AcquireValue(thisVal);\r
+ params->args = JSI::AcquireValue(args[0]);\r
+ JsAsyncWork::DispatchAsyncWork(ExecuteFunc, reinterpret_cast<void *>(params));\r
+ return undefValue;\r
+}\r
+\r
+void VibratorModule::ExecuteVibrate(void* data)\r
+{\r
+ VibratorParams* params = reinterpret_cast<VibratorParams *>(data);\r
+ if (params == nullptr) {\r
+ return;\r
+ }\r
+ JSIValue args = params->args;\r
+ JSIValue thisVal = params->thisVal;\r
+ JSIValue result = JSI::CreateObject();\r
+ char* mode = JSI::GetStringProperty(args, VIBTATOR_MODE);\r
+ if (strcmp(mode, "long") == 0|| strcmp(mode, "short") == 0) {\r
+ SuccessCallBack(thisVal, args, result);\r
+ } else {\r
+ FailCallBack(thisVal, args, -1);\r
+ }\r
+\r
+ JSI::ReleaseValueList(args, thisVal, result, ARGS_END);\r
+ delete params;\r
+}\r
+\r
+void VibratorModule::SuccessCallBack(const JSIValue thisVal, const JSIValue args, JSIValue jsiValue)\r
+{\r
+ if (JSI::ValueIsUndefined(args)) {\r
+ return;\r
+ }\r
+ JSIValue success = JSI::GetNamedProperty(args, CB_SUCCESS);\r
+ JSIValue complete = JSI::GetNamedProperty(args, CB_COMPLETE);\r
+ if (!JSI::ValueIsUndefined(success)) {\r
+ if (JSI::ValueIsUndefined(jsiValue)) {\r
+ JSI::CallFunction(success, thisVal, nullptr, 0);\r
+ } else {\r
+ JSI::CallFunction(success, thisVal, &jsiValue, ARGC_ONE);\r
+ }\r
+ }\r
+ if (!JSI::ValueIsUndefined(complete)) {\r
+ JSI::CallFunction(complete, thisVal, nullptr, 0);\r
+ }\r
+ JSI::ReleaseValueList(success, complete, ARGS_END);\r
+}\r
+\r
+void VibratorModule::FailCallBack(const JSIValue thisVal, const JSIValue args, int ret)\r
+{\r
+ if (JSI::ValueIsUndefined(args)) {\r
+ return;\r
+ }\r
+ JSIValue errInfo;\r
+ errInfo = JSI::CreateString("Vibrator faild");\r
+ JSIValue errCode = JSI::CreateNumber(ret);\r
+ JSIValue fail = JSI::GetNamedProperty(args, CB_FAIL);\r
+ JSIValue complete = JSI::GetNamedProperty(args, CB_COMPLETE);\r
+ JSIValue argv[ARGC_TWO] = {errInfo, errCode};\r
+ if (!JSI::ValueIsUndefined(fail)) {\r
+ JSI::CallFunction(fail, thisVal, argv, ARGC_TWO);\r
+ }\r
+ if (!JSI::ValueIsUndefined(complete)) {\r
+ JSI::CallFunction(complete, thisVal, nullptr, 0);\r
+ }\r
+ JSI::ReleaseValueList(fail, complete, errInfo, errCode, ARGS_END);\r
+}\r
+\r
+} // namespace ACELite\r
+} // namespace OHOS\r
--- /dev/null
+/*\r
+ * Copyright (c) 2020 Huawei Device Co., Ltd.\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ * http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ */\r
+\r
+#ifndef OHOS_ACELITE_VIBRATOR_MODULE_H\r
+#define OHOS_ACELITE_VIBRATOR_MODULE_H\r
+\r
+#include <cJSON.h>\r
+#include "acelite_config.h"\r
+#include "jsi.h"\r
+#include "js_async_work.h"\r
+#include "non_copyable.h"\r
+#include "product_adapter.h"\r
+#include "abilityms_slite_client.h"\r
+\r
+namespace OHOS {\r
+namespace ACELite {\r
+\r
+struct VibratorParams {\r
+ JSIValue args = JSI::CreateUndefined();\r
+ JSIValue thisVal = JSI::CreateUndefined();\r
+};\r
+\r
+class VibratorModule final : public MemoryHeap {\r
+public:\r
+ ACE_DISALLOW_COPY_AND_MOVE(VibratorModule);\r
+ VibratorModule() = default;\r
+ ~VibratorModule() = default;\r
+ static const char * const VIBTATOR_MODE;\r
+ static JSIValue Vibrate(const JSIValue thisVal, const JSIValue *args, uint8_t argsNum);\r
+\r
+private:\r
+ static JSIValue ExecuteAsyncWork(const JSIValue thisVal, const JSIValue* args, uint8_t argsNum, AsyncWorkHandler ExecuteFunc);\r
+ static void SuccessCallBack(const JSIValue thisVal, const JSIValue args, JSIValue jsiValue);\r
+ static void FailCallBack(const JSIValue thisVal, const JSIValue args, int ret);\r
+ static void ExecuteVibrate(void *data);\r
+\r
+};\r
+\r
+void InitVibratorModule(JSIValue exports)\r
+{\r
+ JSI::SetModuleAPI(exports, "vibrate", VibratorModule::Vibrate);\r
+}\r
+\r
+} // namespace ACELite\r
+} // namespace OHOS\r
+#endif // OHOS_ACELITE_APP_MODULE_H\r
)
set(PRIVATE_DEFINES
- JERRY_GLOBAL_HEAP_SIZE=128
+ JERRY_GLOBAL_HEAP_SIZE=512
JERRY_ERROR_MESSAGES=1
JERRY_LINE_INFO=1
JERRY_FUNCTION_NAME
MC_BT_SRV_A2DP_RPT_STREAM_REJECT,
MC_BT_SRV_A2DP_STREAM_START_ACCEPT,
MC_BT_SRV_A2DP_SNK_UNREGISTER_SERVICE,
+ MC_BT_SRV_A2DP_SNK_REGISTER_SERVICE,
MC_BT_SRC_A2DP_MAX,
} mc_bt_a2dp_command_type;
int32_t btsdk_a2dp_stream_start(void *stream_hdl);
int32_t btsdk_a2dp_stream_suspend(void *stream_hdl);
int32_t a2dp_src_set_stream_codec_req(bool reconfig, const void *stream_hdl, const void *cfg, uint32_t size);
+int32_t btsdk_registera2dpsnk_service(uint16_t len, const uint8_t *audio_card);
int32_t btsdk_unregistera2dpsnk_service(void);
void btsdk_a2dp_reg_cbk(const btsdka2dp_cbk *a2dp_cbk);
void btsdk_a2dp_snk_reg_cbk(const btsdka2dp_cbk *a2dp_cbk);
--- /dev/null
+#Tue Aug 27 08:59:29 CST 2024
+gradle.version=6.3
--- /dev/null
+【补丁名称】patch_0626_to_0720\r
+【基础版本】b602 + 0521 + 0626\r
+【修复问题】\r
+BT合入内容\r
+ 1、解决【spp client被动断连死锁】问题\r
+ 2、解决【B核内存维测缺少空判断】问题\r
+ 3、解决【数传和音乐日志打印过多】问题\r
+ 4、B核日志精简\r
+ 5、B核上电超时主动panic\r
+PLT合入内容\r
+ 1、ssb支持mmc资源烧录,分区顺序调整\r
+ 2、修复NV异步存储不可升级属性更改为可升级属性失败问题\r
+ 3、ipc异常场景自愈处理\r
+ 4、支持死机trace保存到norflash\r
+ 5、解决nandflash写断流问题\r
+ 6、SystemView适配\r
+GUI合入内容\r
+ 1、修复亮屏局刷问题\r
+ 2、修复足球图片镜像问题\r
+ 3、修复ImageCacheManager资源加载问题\r
+ 4、修复离线表盘资源释放及视频相关问题\r
+ 5、修复UICrossView调用不匹配,对齐动画卡顿,快速拖动等问题\r
+ 6、支持帧耗时统计\r
+ 7、支持UIList阻尼效果\r
+ 8、支持Dump控件树信息\r
+ 9、TurnPage效果内存优化\r
+ 10、UIPicker重写焦点相关函数\r
+ 11、增加DFX打印NativeUI状态\r
+ 12、修复资源加载问题\r
+GPU合入内容\r
+ 1、贝塞尔阈值,保持进出低功耗前后寄存器值一致\r
+ 2、屏蔽TE中断\r
+AUDIO&MEDIA合入内容\r
+ 1、修改视频播放自动停止再起播,重复几次导致线程创建失败的问题\r
+ 2、把小度语音的录制线程改成同步,防止在反复录制的时候,出现时序的问题\r
+ 3、把线程使用的内存改到psram上面,以让出DTCM的内存空间\r
+OHOS合入内容\r
+ 1、新增泄露定时器清理方法。\r
+ 2、新增JS应用内对HOME键的响应。\r
+ 3、Notify 清理函数改为注册方式。\r
+ 4、新增 brightness、battery、sensor、Vibrator Js接口自测用例。\r
+ 5、新增 AT命令两个:根据包名起JS应用、强切native应用。\r
+ 6、Baidumap消息函数新增返回值。\r
+ 7、地图,新增百度协议,JS主动发起退出导航。\r
+ 8、修复定时器泄露问题。\r
+ 9、新增编码器旋转事件支持。\r
+ 10、修复JSapp切换表盘大概率卡住黑屏问题。\r
+【修改影响】NA\r
+【使用方法】\r
+ 1、合入0521补丁\r
+ 2、合入0626补丁\r
+ 3、合入0720补丁\r
+【自测情况】\r
+ 自验证范围:\r
+ 全功能冒烟\r
+ 自验证target:\r
+ Native-js、target3 rc版本\r
+【是否合入版本】根据测试结果确定\r