cpu_trace_enable_mcpu_repeat();
- otp_init();
+ // otp_init();
uapi_pm_control(PM_SDIO_POWER_UP_AND_RUN);
}
\r
log_memory_region_init();\r
\r
- otp_init();\r
+ // otp_init();\r
#if ENABLE_LOW_POWER == YES\r
copy_from_flash_to_pm_text();\r
#endif\r
'hso_enable': False,
'os': 'non-os',
'CONFIG_WATCHDOG_USING_V100': 'y',
- 'defines': ["RISCV_70", "CONFIG_XIP_ENABLE_READ_OVERTIME", 'CONFIG_PINCTRL_SUPPORT_IE'],
+ 'defines': ["RISCV_70", "CONFIG_XIP_ENABLE_READ_OVERTIME", 'CONFIG_PINCTRL_SUPPORT_IE', 'CONFIG_EFUSE_CLK_EN'],
'std_libs': ['c', 'm', 'clang_rt.builtins-riscv32', 'gloss'],
'defines_set': ['libsec_defines', 'chip_defines', 'version_defines'],
'ram_component_set': ['cpu_trace', 'ipc', 'mem', 'boot_common_lib', 'gpio_v100', 'ssb_libs',
"CONFIG_NV_SUPPORT_SINGLE_CORE_SYSTEM", 'CONFIG_NV_FEATURE_SUPPORT', 'CONFIG_SPI_SUPPORT_LPC',
"RISCV_70", 'SUPPORT_DIAG_V2_PROTOCOL', 'CONFIG_PINCTRL_SUPPORT_IE',
"DUMP_MEM_SUPPORT", "DUMP_REG_SUPPORT", "SUPPORT_DFX_EXCEPTION", 'CONFIG_SPI_SUPPORT_DMA',
- 'CONFIG_I2C_SUPPORT_DMA', 'CONFIG_I2C_SUPPORT_LPC'],
+ 'CONFIG_I2C_SUPPORT_DMA', 'CONFIG_I2C_SUPPORT_LPC', 'CONFIG_EFUSE_CLK_EN'],
'defines_set': ['chip_defines', 'version_defines'],
'ram_component': ['brandy_std_lds', 'liteos_207_1_0', 'partition', 'chip_brandy', 'driver_header', 'nand_flash',
'brandy_app_standard', 'board_brandy', 'brandy_clocks', 'pmu_brandy', 'hal_sectors',
"CONFIG_NV_SUPPORT_SINGLE_CORE_SYSTEM", 'CONFIG_NV_FEATURE_SUPPORT', 'CONFIG_SPI_SUPPORT_LPC',
"CONFIG_XIP_ENABLE_READ_OVERTIME", 'SUPPORT_DIAG_V2_PROTOCOL', 'CONFIG_PINCTRL_SUPPORT_IE',
"DUMP_MEM_SUPPORT", "DUMP_REG_SUPPORT", "SUPPORT_DFX_EXCEPTION", 'CONFIG_SPI_SUPPORT_DMA',
- 'CONFIG_I2C_SUPPORT_DMA', 'FREERTOS_DEBUG', 'CONFIG_I2C_SUPPORT_LPC'],
+ 'CONFIG_I2C_SUPPORT_DMA', 'FREERTOS_DEBUG', 'CONFIG_I2C_SUPPORT_LPC', 'CONFIG_EFUSE_CLK_EN'],
'defines_set': ['chip_defines', 'version_defines'],
'ram_component': ['brandy_std_lds', 'chip_brandy', 'brandy_app_standard', 'driver_header',
'board_brandy', 'brandy_clocks', 'pmu_brandy', 'c', 'm', 'segger', 'posix', 'sec', 'freertos',
'CONFIG_PINCTRL_SUPPORT_IE', 'CONFIG_DFX_SUPPORT_SOC_LOG=0',
'CONFIG_I2C_SUPPORT_LPC', 'CONFIG_DFX_SUPPORT_TRANSMIT_FILE=0', 'CONFIG_DFX_SUPPORT_DIAG_BEAT_HEART=0',
'CONFIG_DFX_SUPPORT_DIAG_VRTTUAL_SHELL=0', 'CONFIG_DFX_SUPPORT_DIAG_CONNECT_BLE=0',
- 'CONFIG_DFX_SUPPORT_OFFLINE_LOG_FILE=0', 'CONFIG_DFX_MEMORY_DEBUG=0', 'CONFIG_DFX_SUPPORT_DIAG_ADAPT_SOC_LOG=0'],
+ 'CONFIG_DFX_SUPPORT_OFFLINE_LOG_FILE=0', 'CONFIG_DFX_MEMORY_DEBUG=0', 'CONFIG_DFX_SUPPORT_DIAG_ADAPT_SOC_LOG=0',
+ 'CONFIG_EFUSE_CLK_EN'],
'defines_set': ['chip_defines', 'version_defines'],
'ram_component': ['brandy_recovery_lds', 'liteos_207_1_0', 'partition', 'chip_brandy', 'driver_header',
'brandy_app_recovery', 'board_brandy', 'brandy_clocks', 'pmu_brandy', 'partition_brandy',
'CONFIG_I2C_SUPPORT_LPC', 'CONFIG_DFX_SUPPORT_TRANSMIT_FILE=0', 'CONFIG_DFX_SUPPORT_SOC_LOG=0',
'CONFIG_DFX_SUPPORT_DIAG_BEAT_HEART=0', 'CONFIG_DFX_SUPPORT_DIAG_VRTTUAL_SHELL=0',
'CONFIG_DFX_SUPPORT_DIAG_CONNECT_BLE=0', 'CONFIG_DFX_SUPPORT_OFFLINE_LOG_FILE=0',
- 'CONFIG_DFX_MEMORY_DEBUG=0', 'CONFIG_DFX_SUPPORT_DIAG_ADAPT_SOC_LOG=0'],
+ 'CONFIG_DFX_MEMORY_DEBUG=0', 'CONFIG_DFX_SUPPORT_DIAG_ADAPT_SOC_LOG=0', 'CONFIG_EFUSE_CLK_EN'],
'defines_set': ['chip_defines', 'version_defines'],
'ram_component': ['brandy_recovery_lds', 'partition', 'chip_brandy', 'freertos', 'cmsis_rtos', 'xlt_mem',
'brandy_app_recovery', 'board_brandy', 'brandy_clocks', 'pmu_brandy', 'partition_brandy',
"RISCV_70", "CONFIG_XIP_ENABLE_READ_OVERTIME", 'SUPPORT_DIAG_V2_PROTOCOL', 'CONFIG_SPI_SUPPORT_LPC',
"SUPPORT_GPU_JPEG", "SUPPORT_GPU_GMMU", "SUPPORT_GPU_OPENVG", 'CONFIG_PINCTRL_SUPPORT_IE',
'CONFIG_SPI_SUPPORT_DMA', 'CONFIG_I2C_SUPPORT_DMA', 'CONFIG_UART_SUPPORT_DMA',
- 'CONFIG_I2C_SUPPORT_LPC'],
+ 'CONFIG_I2C_SUPPORT_LPC', 'CONFIG_EFUSE_CLK_EN'],
'defines_set': ['chip_defines', 'version_defines'],
'ram_component': ['brandy_std_lds', 'liteos_207_1_0', 'chip_brandy', 'driver_header', 'nand_flash',
'brandy_testsuite', 'board_brandy', 'brandy_clocks', 'pmu_brandy', 'hal_sectors',
#define OTP_DSP_OVERLAY_ROLLBACK_VERSION_BIT 32
#define OTP_ATE_CRC 255
+
+// reserved 256-383(128 bytes) for user
+#define OTP_APP_USER_START 256
+#define OTP_APP_USER_END 383
+
+
/**
* @}
*/
-/**
- * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved. \n
- *
- * Description: Provides efuse port template \n
- * Author: @CompanyNameTag \n
- * History: \n
- * 2022-07-25, Create file. \n
- */
-
-#ifndef EFUSE_PORTING_H
-#define EFUSE_PORTING_H
-
-#include <stdint.h>
-
-#ifdef __cplusplus
-#if __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-#endif /* __cplusplus */
-
-/**
- * @defgroup drivers_port_efuse Efuse
- * @ingroup drivers_port
- * @{
- */
-
-#define EFUSE_REGION_NUM 3
-#define EFUSE_REGION_MAX_BITS 1024
-#define EFUSE_REGION_MAX_BYTES (EFUSE_REGION_MAX_BITS >> 3) // MAX_BIT / 8
-#define EFUSE_MAX_BITS (EFUSE_REGION_MAX_BITS * EFUSE_REGION_NUM)
-#define EFUSE_MAX_BYTES (EFUSE_MAX_BITS >> 3) // MAX_BIT / 8
-#define EFUSE_MAX_BIT_POS 8U
-#define bit(x) (1UL << (uint32_t)(x))
-#define EFUSE_PMU_CLKLDO_VSET_MASK 0x78
-#define EFUSE_PMU_CLKLDO_OFFSET 3
-#define EFUSE_TRIM_VERSION_DEFAULT_VALUE 1
-#define EFUSE_CHAR_BIT_WIDE 8
-#define EFUSE_CALC_CRC_MAX_LEN 32
-#define HAL_EFUSE0_REGION_SIZE EFUSE_REGION_MAX_BYTES
-#define HAL_EFUSE1_REGION_SIZE EFUSE_REGION_MAX_BYTES
-#define HAL_EFUSE2_REGION_SIZE EFUSE_REGION_MAX_BYTES
-#define EFUSE_DIE_ID_BASE_BYTE_ADDR 0
-#define EFUSE_BIT_OPERATION YES
-
-#define EFUSE_TRIM_FLAG 50
-#define EFUSE_IS_CHIP_TRIMED 0
-// 7-0 -> Version of the trim
-#define EFUSE_TRIM_VERSION 51
-// 2-0 -> vset_bbldo[3:1]
-// 6-3 -> vset_clkldo[3:0]
-#define EFUSE_PMU_TRIM_VSET 25
-
-typedef enum {
- HAL_EFUSE_REGION_0,
- HAL_EFUSE_REGION_1,
- HAL_EFUSE_REGION_2,
- HAL_EFUSE_REGION_MAX,
-} hal_efuse_region_t;
-
-/**
- * @if Eng
- * @brief Base address for the IP.
- * @else
- * @brief IP的基地址
- * @endif
- */
-extern const uintptr_t g_efuse_base_addr[EFUSE_REGION_NUM];
-
-/**
- * @if Eng
- * @brief Base read address for the IP.
- * @else
- * @brief IP的读基地址
- * @endif
- */
-extern const uintptr_t g_efuse_region_read_address[EFUSE_REGION_NUM];
-
-/**
- * @if Eng
- * @brief Base write address for the IP.
- * @else
- * @brief IP的写基地址
- * @endif
- */
-extern const uintptr_t g_efuse_region_write_address[EFUSE_REGION_NUM];
-
-/**
- * @if Eng
- * @brief EFUSE region size
- * @else
- * @brief EFUSE各区域大小
- * @endif
- */
-extern const uintptr_t g_efuse_region_size[EFUSE_REGION_NUM];
-
-/**
- * @if Eng
- * @brief Register hal funcs objects into hal_efuse module.
- * @else
- * @brief 将hal funcs对象注册到hal_efuse模块中
- * @endif
- */
-void efuse_port_register_hal_funcs(void);
-
-/**
- * @if Eng
- * @brief Unregister hal funcs objects from hal_efuse module.
- * @else
- * @brief 从hal_efuse模块注销hal funcs对象
- * @endif
- */
-void efuse_port_unregister_hal_funcs(void);
-
-/**
- * @brief Get the region of a otp byte address
- * @param byte_addr the addr of the byte to get register
- * @retval region The region of otp
- * @else
- * @brief 获取otp字节地址的区域
- * @param byte_addr 要获取寄存器的字节的地址
- * @retval 区域OTP的区域
- */
-hal_efuse_region_t hal_efuse_get_region(uint32_t byte_addr);
-
-/**
- * @brief Get the offset addr of a otp byte address
- * @param byte_addr the addr of the byte to get register
- * @retval address
- * @else
- * @brief 获取otp字节地址的偏移地址
- * @param byte_addr 要获取寄存器的字节的地址
- * @retval 偏移地址
- */
-uint16_t hal_efuse_get_byte_offset(uint32_t byte_addr);
-
-
-/**
- * @brief load switch4 enbale signal.
- * @param val Value to be written to the register
- * @retval address
- * @else
- * @brief 负载开关4使能
- * @param val 要写入寄存器的值
- * @retval 偏移地址
- */
-void efuse_port_set_en_switch(uint32_t val);
-
-/**
- * @if Eng
- * @brief Obtains the enable signal of load switch 4.
- * @else
- * @brief 获取负载开关4使能信号。
- * @endif
- */
-uint8_t efuse_port_get_en_switch(void);
-
-/**
- * @if Eng
- * @brief Reload the efuse data before reads multiple bytes from the eFuse into the provided buffer.
- * @param [in] buffer The value of the bit read.
- * @param [in] byte_number The source eFuse bit byte_number of the bit to be read.
- * @param [in] length The length of the data, in bytes.
- * @retval ERRCODE_SUCC Success.
- * @retval Other Failure. For details, see @ref errcode_t.
- * @else
- * @brief 重新从efuse源头加载数据后,再从eFuse中读取多个字节,进入提供的缓冲区。
- * @param [in] buffer 保存读取数据的缓冲区。
- * @param [in] byte_number 要读取的数据的初始源eFuse字节地址。
- * @param [in] length 数据的长度,以字节为单位。
- * @retval ERRCODE_SUCC 成功。
- * @retval Other 失败,参考 @ref errcode_t 。
- * @endif
- */
-errcode_t efuse_port_read_buffer_by_reload(uint8_t *buffer, uint32_t byte_number, uint16_t length);
-/**
- * @}
- */
-
-#ifdef __cplusplus
-#if __cplusplus
-}
-#endif /* __cplusplus */
-#endif /* __cplusplus */
-
-#endif
+/**\r
+ * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved. \n\r
+ *\r
+ * Description: Provides efuse port template \n\r
+ * Author: @CompanyNameTag \n\r
+ * History: \n\r
+ * 2022-07-25, Create file. \n\r
+ */\r
+\r
+#ifndef EFUSE_PORTING_H\r
+#define EFUSE_PORTING_H\r
+\r
+#include <stdint.h>\r
+#include <stdbool.h>\r
+\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+extern "C" {\r
+#endif /* __cplusplus */\r
+#endif /* __cplusplus */\r
+\r
+/**\r
+ * @defgroup drivers_port_efuse Efuse\r
+ * @ingroup drivers_port\r
+ * @{\r
+ */\r
+\r
+#define EFUSE_REGION_NUM 3\r
+#define EFUSE_REGION_MAX_BITS 1024\r
+#define EFUSE_REGION_MAX_BYTES (EFUSE_REGION_MAX_BITS >> 3) // MAX_BIT / 8\r
+#define EFUSE_MAX_BITS (EFUSE_REGION_MAX_BITS * EFUSE_REGION_NUM)\r
+#define EFUSE_MAX_BYTES (EFUSE_MAX_BITS >> 3) // MAX_BIT / 8\r
+#define EFUSE_MAX_BIT_POS 8U\r
+#define bit(x) (1UL << (uint32_t)(x))\r
+#define EFUSE_PMU_CLKLDO_VSET_MASK 0x78\r
+#define EFUSE_PMU_CLKLDO_OFFSET 3\r
+#define EFUSE_TRIM_VERSION_DEFAULT_VALUE 1\r
+#define EFUSE_CHAR_BIT_WIDE 8\r
+#define EFUSE_CALC_CRC_MAX_LEN 32\r
+#define HAL_EFUSE0_REGION_SIZE EFUSE_REGION_MAX_BYTES\r
+#define HAL_EFUSE1_REGION_SIZE EFUSE_REGION_MAX_BYTES\r
+#define HAL_EFUSE2_REGION_SIZE EFUSE_REGION_MAX_BYTES\r
+#define EFUSE_DIE_ID_BASE_BYTE_ADDR 0\r
+#define EFUSE_BIT_OPERATION YES\r
+\r
+#define EFUSE_TRIM_FLAG 50\r
+#define EFUSE_IS_CHIP_TRIMED 0\r
+// 7-0 -> Version of the trim\r
+#define EFUSE_TRIM_VERSION 51\r
+// 2-0 -> vset_bbldo[3:1]\r
+// 6-3 -> vset_clkldo[3:0]\r
+#define EFUSE_PMU_TRIM_VSET 25\r
+\r
+typedef enum {\r
+ HAL_EFUSE_REGION_0,\r
+ HAL_EFUSE_REGION_1,\r
+ HAL_EFUSE_REGION_2,\r
+ HAL_EFUSE_REGION_MAX,\r
+} hal_efuse_region_t;\r
+\r
+/**\r
+ * @if Eng\r
+ * @brief Base address for the IP.\r
+ * @else\r
+ * @brief IP的基地址\r
+ * @endif\r
+ */\r
+extern const uintptr_t g_efuse_base_addr[EFUSE_REGION_NUM];\r
+\r
+/**\r
+ * @if Eng\r
+ * @brief Base read address for the IP.\r
+ * @else\r
+ * @brief IP的读基地址\r
+ * @endif\r
+ */\r
+extern const uintptr_t g_efuse_region_read_address[EFUSE_REGION_NUM];\r
+\r
+/**\r
+ * @if Eng\r
+ * @brief Base write address for the IP.\r
+ * @else\r
+ * @brief IP的写基地址\r
+ * @endif\r
+ */\r
+extern const uintptr_t g_efuse_region_write_address[EFUSE_REGION_NUM];\r
+\r
+/**\r
+ * @if Eng\r
+ * @brief EFUSE region size\r
+ * @else\r
+ * @brief EFUSE各区域大小\r
+ * @endif\r
+ */\r
+extern const uintptr_t g_efuse_region_size[EFUSE_REGION_NUM];\r
+\r
+/**\r
+ * @if Eng\r
+ * @brief Register hal funcs objects into hal_efuse module.\r
+ * @else\r
+ * @brief 将hal funcs对象注册到hal_efuse模块中\r
+ * @endif\r
+ */\r
+void efuse_port_register_hal_funcs(void);\r
+\r
+/**\r
+ * @if Eng\r
+ * @brief Unregister hal funcs objects from hal_efuse module.\r
+ * @else\r
+ * @brief 从hal_efuse模块注销hal funcs对象\r
+ * @endif\r
+ */\r
+void efuse_port_unregister_hal_funcs(void);\r
+\r
+/**\r
+ * @brief Get the region of a otp byte address\r
+ * @param byte_addr the addr of the byte to get register\r
+ * @retval region The region of otp\r
+ * @else\r
+ * @brief 获取otp字节地址的区域\r
+ * @param byte_addr 要获取寄存器的字节的地址\r
+ * @retval 区域OTP的区域\r
+ */\r
+hal_efuse_region_t hal_efuse_get_region(uint32_t byte_addr);\r
+\r
+/**\r
+ * @brief Get the offset addr of a otp byte address\r
+ * @param byte_addr the addr of the byte to get register\r
+ * @retval address\r
+ * @else\r
+ * @brief 获取otp字节地址的偏移地址\r
+ * @param byte_addr 要获取寄存器的字节的地址\r
+ * @retval 偏移地址\r
+ */\r
+uint16_t hal_efuse_get_byte_offset(uint32_t byte_addr);\r
+\r
+\r
+/**\r
+ * @brief load switch4 enbale signal.\r
+ * @param val Value to be written to the register\r
+ * @retval address\r
+ * @else\r
+ * @brief 负载开关4使能\r
+ * @param val 要写入寄存器的值\r
+ * @retval 偏移地址\r
+ */\r
+void efuse_port_set_en_switch(uint32_t val);\r
+\r
+/**\r
+ * @if Eng\r
+ * @brief Obtains the enable signal of load switch 4.\r
+ * @else\r
+ * @brief 获取负载开关4使能信号。\r
+ * @endif\r
+ */\r
+uint8_t efuse_port_get_en_switch(void);\r
+\r
+/**\r
+ * @if Eng\r
+ * @brief Reload the efuse data before reads multiple bytes from the eFuse into the provided buffer.\r
+ * @param [in] buffer The value of the bit read.\r
+ * @param [in] byte_number The source eFuse bit byte_number of the bit to be read.\r
+ * @param [in] length The length of the data, in bytes.\r
+ * @retval ERRCODE_SUCC Success.\r
+ * @retval Other Failure. For details, see @ref errcode_t.\r
+ * @else\r
+ * @brief 重新从efuse源头加载数据后,再从eFuse中读取多个字节,进入提供的缓冲区。\r
+ * @param [in] buffer 保存读取数据的缓冲区。\r
+ * @param [in] byte_number 要读取的数据的初始源eFuse字节地址。\r
+ * @param [in] length 数据的长度,以字节为单位。\r
+ * @retval ERRCODE_SUCC 成功。\r
+ * @retval Other 失败,参考 @ref errcode_t 。\r
+ * @endif\r
+ */\r
+errcode_t efuse_port_read_buffer_by_reload(uint8_t *buffer, uint32_t byte_number, uint16_t length);\r
+\r
+/**\r
+ * @if Eng\r
+ * @brief Open or close efuse region clock gate.\r
+ * @param [in] efuse_region the efuse region index.\r
+ * @param [in] en open or close.\r
+ * @else\r
+ * @brief 打开efuse的时钟门控。\r
+ * @param [in] efuse_region efuse 区域。\r
+ * @param [in] en 打开或关闭时钟。\r
+ * @endif\r
+ */\r
+void efuse_port_set_clk_en(hal_efuse_region_t efuse_region, bool en);\r
+\r
+/**\r
+ * @}\r
+ */\r
+\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+}\r
+#endif /* __cplusplus */\r
+#endif /* __cplusplus */\r
+\r
+#endif\r
-/**
- * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved. \n
- *
- * Description: Provides efuse port template \n
- * Author: @CompanyNameTag \n
- * History: \n
- * 2022-10-20, Create file. \n
- */
-#include "hal_efuse_v100.h"
-#include "efuse_porting.h"
-
-#define FUSE_CTL_RB_BASE 0x57028000
-#define FUSE_CTL_MCU_RB_BASE 0x52082000
-#define EFUSE0_BASE_ADDR (FUSE_CTL_RB_BASE + 0xD00)
-#define EFUSE1_BASE_ADDR (FUSE_CTL_MCU_RB_BASE + 0xD10)
-#define EFUSE2_BASE_ADDR (FUSE_CTL_MCU_RB_BASE + 0xD20)
-#define HAL_EFUSE0_WRITE_BASE_ADDR (FUSE_CTL_RB_BASE + 0x700)
-#define HAL_EFUSE1_WRITE_BASE_ADDR (FUSE_CTL_MCU_RB_BASE + 0x700)
-#define HAL_EFUSE2_WRITE_BASE_ADDR (FUSE_CTL_MCU_RB_BASE + 0x700)
-#define HAL_EFUSE0_READ_BASE_ADDR (FUSE_CTL_RB_BASE + 0x800)
-#define HAL_EFUSE1_READ_BASE_ADDR (FUSE_CTL_MCU_RB_BASE + 0xA00)
-#define HAL_EFUSE2_READ_BASE_ADDR (FUSE_CTL_MCU_RB_BASE + 0xC00)
-#define HAL_EFUSE_POWER_ON_SWITCH 0x57004258
-
-const uintptr_t g_efuse_base_addr[EFUSE_REGION_NUM] = {
- (uintptr_t)EFUSE0_BASE_ADDR,
- (uintptr_t)EFUSE1_BASE_ADDR,
- (uintptr_t)EFUSE2_BASE_ADDR
-};
-const uintptr_t g_efuse_region_read_address[EFUSE_REGION_NUM] = {
- (uintptr_t)HAL_EFUSE0_READ_BASE_ADDR,
- (uintptr_t)HAL_EFUSE1_READ_BASE_ADDR,
- (uintptr_t)HAL_EFUSE2_READ_BASE_ADDR
-};
-const uintptr_t g_efuse_region_write_address[EFUSE_REGION_NUM] = {
- (uintptr_t)HAL_EFUSE0_WRITE_BASE_ADDR,
- (uintptr_t)HAL_EFUSE1_WRITE_BASE_ADDR,
- (uintptr_t)HAL_EFUSE2_WRITE_BASE_ADDR
-};
-
-const uintptr_t g_efuse_region_size[EFUSE_REGION_NUM] = {
- (uintptr_t)HAL_EFUSE0_REGION_SIZE,
- (uintptr_t)HAL_EFUSE1_REGION_SIZE,
- (uintptr_t)HAL_EFUSE2_REGION_SIZE,
-};
-
-typedef union efuse_en_switch_data {
- uint32_t d32;
- struct {
- uint32_t en_efuse_switch_val : 16;
- } b;
-}en_switch_data_t;
-
-typedef struct efuse_en_switch_reg {
- volatile en_switch_data_t en_switch_data;
-} efuse_en_switch_reg_t;
-
-static efuse_en_switch_reg_t *g_efuse_en_switch_reg = (efuse_en_switch_reg_t*)(uintptr_t)HAL_EFUSE_POWER_ON_SWITCH;
-
-static inline uint8_t get_efuse_en_switch_val(void)
-{
- en_switch_data_t en_switch_val;
- en_switch_val.d32 = g_efuse_en_switch_reg->en_switch_data.d32;
- return (uint8_t)en_switch_val.b.en_efuse_switch_val;
-}
-
-static inline void set_efuse_en_switch_val(uint32_t val)
-{
- en_switch_data_t en_switch_val;
- en_switch_val.d32 = g_efuse_en_switch_reg->en_switch_data.d32;
- en_switch_val.b.en_efuse_switch_val = val;
- g_efuse_en_switch_reg->en_switch_data.d32 = en_switch_val.d32;
-}
-
-void efuse_port_register_hal_funcs(void)
-{
- hal_efuse_register_funcs(hal_efuse_v100_funcs_get());
-}
-
-void efuse_port_unregister_hal_funcs(void)
-{
- hal_efuse_unregister_funcs();
-}
-
-hal_efuse_region_t hal_efuse_get_region(uint32_t byte_addr)
-{
- return (hal_efuse_region_t)(byte_addr / EFUSE_REGION_MAX_BYTES);
-}
-
-uint16_t hal_efuse_get_byte_offset(uint32_t byte_addr)
-{
- return byte_addr % EFUSE_REGION_MAX_BYTES;
-}
-
-void efuse_port_set_en_switch(uint32_t val)
-{
- set_efuse_en_switch_val(val);
-}
-
-uint8_t efuse_port_get_en_switch(void)
-{
- return get_efuse_en_switch_val();
-}
-
-errcode_t efuse_port_read_buffer_by_reload(uint8_t *buffer, uint32_t byte_number, uint16_t length)
-{
- if ((length == 0) || (byte_number >= EFUSE_MAX_BYTES) ||
- ((byte_number + length) > EFUSE_MAX_BYTES) || (buffer == NULL)) {
- return ERRCODE_FAIL;
- }
- hal_efuse_funcs_t *hal_funcs = hal_efuse_get_funcs();
- if (hal_funcs->refresh_read(HAL_EFUSE_REGION_1) != ERRCODE_SUCC) {
- return ERRCODE_FAIL;
- }
- for (uint32_t i = 0; i < length; i++) {
- if (hal_funcs->read_byte(byte_number + i, &buffer[i]) != ERRCODE_SUCC) {
- return ERRCODE_FAIL;
- }
- }
- return ERRCODE_SUCC;
+/**\r
+ * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved. \n\r
+ *\r
+ * Description: Provides efuse port template \n\r
+ * Author: @CompanyNameTag \n\r
+ * History: \n\r
+ * 2022-10-20, Create file. \n\r
+ */\r
+#include "hal_efuse_v100.h"\r
+#include "efuse_porting.h"\r
+#include "chip_io.h"\r
+\r
+#define FUSE_CTL_RB_BASE 0x57028000\r
+#define FUSE_CTL_MCU_RB_BASE 0x52082000\r
+#define EFUSE0_BASE_ADDR (FUSE_CTL_RB_BASE + 0xD00)\r
+#define EFUSE1_BASE_ADDR (FUSE_CTL_MCU_RB_BASE + 0xD10)\r
+#define EFUSE2_BASE_ADDR (FUSE_CTL_MCU_RB_BASE + 0xD20)\r
+#define HAL_EFUSE0_WRITE_BASE_ADDR (FUSE_CTL_RB_BASE + 0x700)\r
+#define HAL_EFUSE1_WRITE_BASE_ADDR (FUSE_CTL_MCU_RB_BASE + 0x700)\r
+#define HAL_EFUSE2_WRITE_BASE_ADDR (FUSE_CTL_MCU_RB_BASE + 0x700)\r
+#define HAL_EFUSE0_READ_BASE_ADDR (FUSE_CTL_RB_BASE + 0x800)\r
+#define HAL_EFUSE1_READ_BASE_ADDR (FUSE_CTL_MCU_RB_BASE + 0xA00)\r
+#define HAL_EFUSE2_READ_BASE_ADDR (FUSE_CTL_MCU_RB_BASE + 0xC00)\r
+#define HAL_EFUSE_POWER_ON_SWITCH 0x57004258\r
+\r
+const uintptr_t g_efuse_base_addr[EFUSE_REGION_NUM] = {\r
+ (uintptr_t)EFUSE0_BASE_ADDR,\r
+ (uintptr_t)EFUSE1_BASE_ADDR,\r
+ (uintptr_t)EFUSE2_BASE_ADDR\r
+};\r
+const uintptr_t g_efuse_region_read_address[EFUSE_REGION_NUM] = {\r
+ (uintptr_t)HAL_EFUSE0_READ_BASE_ADDR,\r
+ (uintptr_t)HAL_EFUSE1_READ_BASE_ADDR,\r
+ (uintptr_t)HAL_EFUSE2_READ_BASE_ADDR\r
+};\r
+const uintptr_t g_efuse_region_write_address[EFUSE_REGION_NUM] = {\r
+ (uintptr_t)HAL_EFUSE0_WRITE_BASE_ADDR,\r
+ (uintptr_t)HAL_EFUSE1_WRITE_BASE_ADDR,\r
+ (uintptr_t)HAL_EFUSE2_WRITE_BASE_ADDR\r
+};\r
+\r
+const uintptr_t g_efuse_region_size[EFUSE_REGION_NUM] = {\r
+ (uintptr_t)HAL_EFUSE0_REGION_SIZE,\r
+ (uintptr_t)HAL_EFUSE1_REGION_SIZE,\r
+ (uintptr_t)HAL_EFUSE2_REGION_SIZE,\r
+};\r
+\r
+typedef union efuse_en_switch_data {\r
+ uint32_t d32;\r
+ struct {\r
+ uint32_t en_efuse_switch_val : 16;\r
+ } b;\r
+}en_switch_data_t;\r
+\r
+typedef struct efuse_en_switch_reg {\r
+ volatile en_switch_data_t en_switch_data;\r
+} efuse_en_switch_reg_t;\r
+\r
+static efuse_en_switch_reg_t *g_efuse_en_switch_reg = (efuse_en_switch_reg_t*)(uintptr_t)HAL_EFUSE_POWER_ON_SWITCH;\r
+\r
+static inline uint8_t get_efuse_en_switch_val(void)\r
+{\r
+ en_switch_data_t en_switch_val;\r
+ en_switch_val.d32 = g_efuse_en_switch_reg->en_switch_data.d32;\r
+ return (uint8_t)en_switch_val.b.en_efuse_switch_val;\r
+}\r
+\r
+static inline void set_efuse_en_switch_val(uint32_t val)\r
+{\r
+ en_switch_data_t en_switch_val;\r
+ en_switch_val.d32 = g_efuse_en_switch_reg->en_switch_data.d32;\r
+ en_switch_val.b.en_efuse_switch_val = val;\r
+ g_efuse_en_switch_reg->en_switch_data.d32 = en_switch_val.d32;\r
+}\r
+\r
+void efuse_port_register_hal_funcs(void)\r
+{\r
+ hal_efuse_register_funcs(hal_efuse_v100_funcs_get());\r
+}\r
+\r
+void efuse_port_unregister_hal_funcs(void)\r
+{\r
+ hal_efuse_unregister_funcs();\r
+}\r
+\r
+hal_efuse_region_t hal_efuse_get_region(uint32_t byte_addr)\r
+{\r
+ return (hal_efuse_region_t)(byte_addr / EFUSE_REGION_MAX_BYTES);\r
+}\r
+\r
+uint16_t hal_efuse_get_byte_offset(uint32_t byte_addr)\r
+{\r
+ return byte_addr % EFUSE_REGION_MAX_BYTES;\r
+}\r
+\r
+void efuse_port_set_en_switch(uint32_t val)\r
+{\r
+ set_efuse_en_switch_val(val);\r
+}\r
+\r
+uint8_t efuse_port_get_en_switch(void)\r
+{\r
+ return get_efuse_en_switch_val();\r
+}\r
+\r
+// void efuse_port_set_clk_en(hal_efuse_region_t efuse_region, bool en)\r
+// {\r
+ // uint32_t reg_addr[EFUSE_REGION_NUM] = { 0x57000084, 0x52000210, 0x52000210 };\r
+ // uint32_t reg_clk_en_value[EFUSE_REGION_NUM] = { 0x7F08, 0xB, 0xD };\r
+ // if (en) {\r
+ // writew(reg_addr[efuse_region], reg_clk_en_value[efuse_region]);\r
+ // }\r
+// }\r
+\r
+void efuse_port_set_clk_en(hal_efuse_region_t efuse_region, bool en)\r
+{\r
+ unused(en);\r
+ switch(efuse_region) {\r
+ case HAL_EFUSE_REGION_1:\r
+ writew(0x52000210, 0xB);\r
+ break;\r
+ case HAL_EFUSE_REGION_2:\r
+ writew(0x52000210, 0xD);\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+}\r
+\r
+\r
+errcode_t efuse_port_read_buffer_by_reload(uint8_t *buffer, uint32_t byte_number, uint16_t length)\r
+{\r
+ if ((length == 0) || (byte_number >= EFUSE_MAX_BYTES) ||\r
+ ((byte_number + length) > EFUSE_MAX_BYTES) || (buffer == NULL)) {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ hal_efuse_funcs_t *hal_funcs = hal_efuse_get_funcs();\r
+ if (hal_funcs->refresh_read(HAL_EFUSE_REGION_1) != ERRCODE_SUCC) {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ for (uint32_t i = 0; i < length; i++) {\r
+ if (hal_funcs->read_byte(byte_number + i, &buffer[i]) != ERRCODE_SUCC) {\r
+ return ERRCODE_FAIL;\r
+ }\r
+ }\r
+ return ERRCODE_SUCC;\r
}
\ No newline at end of file
if (region >= HAL_EFUSE_REGION_MAX) {
return ERRCODE_INVALID_PARAM;
}
+#ifdef CONFIG_EFUSE_CLK_EN
+ efuse_port_set_clk_en(region, true);
+#endif
hal_efuse_ctl_set_wr_rd(region, HAL_EFUSE_READ_MODE);
while (hal_efuse_ctl_get(region) != HAL_EFUSE_CLEAR_RESULT) {}
return ERRCODE_SUCC;
if (hal_efuse_v100_regs_init() != 0) {
return ERRCODE_EFUSE_REG_ADDR_INVALID;
}
- if (hal_efuse_v100_refresh_read(HAL_EFUSE_REGION_1) != 0) {
- return ERRCODE_FAIL;
+
+ for (uint32_t i = HAL_EFUSE_REGION_1; i < HAL_EFUSE_REGION_MAX; i++) {
+ if (hal_efuse_v100_refresh_read((hal_efuse_region_t)i) != 0) {
+ return ERRCODE_FAIL;
+ }
}
+
#ifdef CONFIG_EFUSE_READ_TO_RAM
- hal_efuse_v100_read_val_to_ram(HAL_EFUSE_REGION_1);
+ for (uint32_t i = HAL_EFUSE_REGION_1; i < HAL_EFUSE_REGION_MAX; i++) {
+ hal_efuse_v100_read_val_to_ram((hal_efuse_region_t)i);
+ }
#endif
return ERRCODE_SUCC;
}
return ERRCODE_INVALID_PARAM;
}
+#ifdef CONFIG_EFUSE_CLK_EN
+ hal_efuse_region_t region = hal_efuse_get_region(byte_address);
+ efuse_port_set_clk_en(region, true);
+#endif
+
volatile uint16_t *efuse_byte = (volatile uint16_t *)((uintptr_t)hal_efuse_v100_get_writeread_addr(byte_address));
if ((byte_address % HAL_EFUSE_BYTES_PRE_REG) != 0) {
hal_efuse_region_t region = hal_efuse_get_region(byte_address);
uint16_t offset = hal_efuse_get_byte_offset(byte_address);
+#ifdef CONFIG_EFUSE_CLK_EN
+ efuse_port_set_clk_en(region, true);
+#endif
+
volatile uint16_t *efuse_byte = (volatile uint16_t *)((uintptr_t)g_efuse_region_write_address[region] +
((offset >> 1U) << HAL_EFUSE_REG_SHIFT));
--- /dev/null
+uint8_t data[8] = { 1,2,3,4,5,6,7,8 };
+
+ uint8_t rdata[8] = {0} ;
+
+ uapi_efuse_init();
+
+ uapi_efuse_read_buffer(rdata, 96, 8);
+
+ for (int i=0;i<8;i++)
+
+ {
+
+ printf("+++++ %d +++++ ",rdata[i]);
+
+ }
+
+ memset(rdata, 0, 8) ;
+
+ for (int i=0;i<8;i++)
+
+ {
+
+ printf("----- %d ----- ",rdata[i]);
+
+ }
+
+ uapi_efuse_read_buffer(rdata, 300, 8);
+
+ for (int i=0;i<8;i++)
+
+ {
+
+ printf(" ##### %d ##### ",rdata[i]);
+
+ }
+
+ uapi_efuse_write_buffer(300, data, 8);
+
+ uapi_efuse_read_buffer(rdata, 300, 8);
+
+ for (int i=0;i<8;i++)
+
+ {
+
+ printf("+++++ %d +++++ ",rdata[i]);
+
+ }
+
+上面是efuse的参考代码,可写范围从第256字节开始往后可以写128字节。
+
+加压缩附件的压缩包,解压出的文件替换掉源代码中的同名文件,并且把sdk中的chip_init.c中的opt_init() 这一行注掉,然后就可以顺利读写efuse