int flash_physical_is_erased(uint32_t offset, int size) { int dest_addr = offset; uint32_t idx; uint8_t temp; /* Chip Select down. */ flash_cs_level(0); /* Set read address */ flash_set_address(dest_addr); /* Start fast read -1110 1001 - EXEC, WR, CMD, ADDR */ flash_execute_cmd(CMD_FAST_READ, MASK_CMD_ADR_WR); /* Burst read transaction */ for (idx = 0; idx < size; idx++) { /* 1101 0101 - EXEC, RD, NO CMD, NO ADDR, 4 bytes */ NPCX_UMA_CTS = MASK_RD_1BYTE; /* Wait for UMA to complete */ while (IS_BIT_SET(NPCX_UMA_CTS, EXEC_DONE)) ; /* Get read transaction results */ temp = NPCX_UMA_DB0; if (temp != 0xFF) break; } /* Chip Select up */ flash_cs_level(1); if (idx == size) return 1; else return 0; }
int flash_physical_read(int offset, int size, char *data) { int dest_addr = offset; uint32_t idx; /* Disable tri-state */ TRISTATE_FLASH(0); /* Chip Select down. */ flash_cs_level(0); /* Set read address */ flash_set_address(dest_addr); /* Start fast read - 1110 1001 - EXEC, WR, CMD, ADDR */ flash_execute_cmd(CMD_FAST_READ, MASK_CMD_ADR_WR); /* Burst read transaction */ for (idx = 0; idx < size; idx++) { /* 1101 0101 - EXEC, RD, NO CMD, NO ADDR, 4 bytes */ NPCX_UMA_CTS = MASK_RD_1BYTE; /* wait for UMA to complete */ while (IS_BIT_SET(NPCX_UMA_CTS, EXEC_DONE)) ; /* Get read transaction results*/ data[idx] = NPCX_UMA_DB0; } /* Chip Select up */ flash_cs_level(1); /* Enable tri-state */ TRISTATE_FLASH(1); return EC_SUCCESS; }
static int flash_wait_ready(int timeout) { uint8_t mask = SPI_FLASH_SR1_BUSY; if (timeout <= 0) return EC_ERROR_INVAL; /* Chip Select down. */ flash_cs_level(0); /* Command for Read status register */ flash_execute_cmd(CMD_READ_STATUS_REG, MASK_CMD_ONLY); while (timeout > 0) { /* Read status register */ NPCX_UMA_CTS = MASK_RD_1BYTE; while (IS_BIT_SET(NPCX_UMA_CTS, NPCX_UMA_CTS_EXEC_DONE)) ; /* Busy bit is clear */ if ((NPCX_UMA_DB0 & mask) == 0) break; if (--timeout > 0) msleep(1); }; /* Wait for Busy clear */ /* Chip Select high. */ flash_cs_level(1); if (timeout == 0) return EC_ERROR_TIMEOUT; return EC_SUCCESS; }
void flash_burst_write(unsigned int dest_addr, unsigned int bytes, const char *data) { unsigned int i; /* Chip Select down. */ flash_cs_level(0); /* Set erase address */ flash_set_address(dest_addr); /* Start write */ flash_execute_cmd(CMD_FLASH_PROGRAM, MASK_CMD_WR_ADR); for (i = 0; i < bytes; i++) { flash_execute_cmd(*data, MASK_CMD_WR_ONLY); data++; } /* Chip Select up */ flash_cs_level(1); }
void flash_wait_ready(void) { uint8_t mask = SPI_FLASH_SR1_BUSY; uint16_t timeout = FLASH_ABORT_TIMEOUT; /* Chip Select down. */ flash_cs_level(0); /* Command for Read status register */ flash_execute_cmd(CMD_READ_STATUS_REG, MASK_CMD_ONLY); while (--timeout) { /* Read status register */ NPCX_UMA_CTS = MASK_RD_1BYTE; while (IS_BIT_SET(NPCX_UMA_CTS, NPCX_UMA_CTS_EXEC_DONE)) ; /* Busy bit is clear */ if ((NPCX_UMA_DB0 & mask) == 0) break; msleep(1); }; /* Wait for Busy clear */ /* Chip Select high. */ flash_cs_level(1); }
int flash_physical_read_image_size(int offset, int size) { int dest_addr = offset; uint8_t temp; uint32_t idx; uint32_t image_size = 0; /* Disable tri-state */ TRISTATE_FLASH(0); /* Chip Select down. */ flash_cs_level(0); /* Set read address */ flash_set_address(dest_addr); /* Start fast read - 1110 1001 - EXEC, WR, CMD, ADDR */ flash_execute_cmd(CMD_FAST_READ, MASK_CMD_ADR_WR); /* Burst read transaction */ for (idx = 0; idx < size; idx++) { /* 1101 0101 - EXEC, RD, NO CMD, NO ADDR, 4 bytes */ NPCX_UMA_CTS = MASK_RD_1BYTE; /* wait for UMA to complete */ while (IS_BIT_SET(NPCX_UMA_CTS, EXEC_DONE)) ; /* Find eof of image */ temp = NPCX_UMA_DB0; if (temp == 0xea) image_size = idx; } /* Chip Select up */ flash_cs_level(1); /* Enable tri-state */ TRISTATE_FLASH(1); return image_size; }