| | |
| | | |
| | | void efuse_read_block(uint16_t byte_addr_start, uint16_t byte_len, uint8_t *buf) |
| | | { |
| | | ASSERT(byte_addr_start + byte_len < 128, "The operation address is over range"); |
| | | ASSERT(byte_addr_start + byte_len <= 128, "The operation address is over range"); |
| | | ASSERT(buf != NULL, "The read buffer pointer is null"); |
| | | |
| | | EFUSE_CTRL->ADDR = EFUSE_ADDR_BYTE_ADDR(byte_addr_start); |
| | | EFUSE_CTRL->LENGTH = byte_len; |
| | | EFUSE_CTRL->LENGTH = byte_len - 1; |
| | | EFUSE_CTRL->CTRL = EFUSE_CTRL_ACCESS_EN_MSK | EFUSE_CTRL_ACCESS_MODE(EFUSE_LOAD_BLOCK); |
| | | while (EFUSE_CTRL->SEQUENCE_CNT & EFUSE_SEQUENCE_CNT_BUSY_MSK) |
| | | { |
| | |
| | | uint8_t val = REG_READ_BYTE(EFUSE_SHADOW_BASE | byte_addr); |
| | | REG_WRITE_BYTE(EFUSE_SHADOW_BASE | byte_addr, (uint8_t)(val | (1 << (bit_offset & 0x7)))); |
| | | EFUSE_CTRL->ADDR = EFUSE_ADDR_BYTE_ADDR(byte_addr) | EFUSE_ADDR_BIT_OFFSET(bit_offset); |
| | | EFUSE_CTRL->LENGTH = 1; |
| | | EFUSE_CTRL->LENGTH = 0; |
| | | EFUSE_CTRL->CTRL = EFUSE_CTRL_ACCESS_EN_MSK | EFUSE_CTRL_ACCESS_MODE(EFUSE_PROGRAM_BLOCK); |
| | | } |
| | | while (EFUSE_CTRL->SEQUENCE_CNT & EFUSE_SEQUENCE_CNT_BUSY_MSK) |