#include "DHL_OSAL.h" #include "DHL_DBG.h" #include "DHL_NVM.h" #include "bfds.h" #include "ramheader.h" static UINT32 s_pi_flash_size = 0x800000; static bfds_handle store; int DHL_NVM_FlashGetSize(int flashId) { return s_pi_flash_size; } DHL_RESULT DHL_NVM_FlashRead(int flashId, UINT32 offset, UINT8 *pBuffer, UINT32 len) { if (offset + len > s_pi_flash_size) { printf("%s | Out of Range 0x%X\n", __func__, offset); return DHL_FAIL_OUT_OF_RANGE; } return bfds_read(store,offset, pBuffer, len); } // 4KB SECTOR´ÜÀ§·Î Á¤·ÄµÇ¾î ½ÃÀÛÇÑ 4KB À̳»ÀÇ µ¥ÀÌÅ͸¸ ÀԷµȴÙ. static DHL_RESULT DHL_NVM_FlashWriteSub(int flashId, UINT32 offset, UINT8 *pBuffer, UINT32 len) { if (offset + 4096 > s_pi_flash_size) { printf("%s | Out of Range 0x%X\n", __func__, offset); return DHL_FAIL_OUT_OF_RANGE; } // STEP1 Àú´çµÈ µ¥ÀÌÅÍ¿Í ºñ±³ÇÑ´Ù. static unsigned char rdata[4096]; DHL_NVM_FlashRead(flashId, offset, rdata, 4096); if(memcmp(pBuffer, rdata, len)==0) { return DHL_OK; // ÀÌÀüµ¥ÀÌÅÍ¿Í µ¿ÀÏÇÏ´Ù ³¡. } // Áö¿ö¾ß ÇÏ´ÂÁö °Ë»ç static unsigned char wdata[4096]; memcpy(wdata, rdata, 4096); memcpy(wdata, pBuffer, len); int bNeedErase = 0; int i; for (i=0; i < 4096; i++) { if (!((~rdata[i]) & wdata[i])) continue; bNeedErase = 1; break; } if (bNeedErase == 1) { memset(rdata, 0xFF, 4096); bfds_sector_erase(store,offset); } for (i = 0; i < 4096; i+=256) // page ´ÜÀ§ Write { int j; int bNeedProgram = 0; for (j=0; j < 256;j++) { if (rdata[i+j] == wdata[i+j]) continue; bNeedProgram = 1; break; } if (bNeedProgram == 0) continue; int nStart = -1; for (j=0; j < 256+1;j++) { if (j == 256 || rdata[i+j] == wdata[i+j]) { if (nStart != -1) { bfds_page_program(store,offset+nStart,&wdata[nStart], i + j - nStart); nStart = -1; } } else { if (nStart == -1) nStart = i+j; } } } return DHL_OK; } // ½ÃÀÛ À§Ä¡°¡ 4KB SECTOR´ÜÀ§·Î Á¤·ÄµÇ¾î ½ÃÀÛÇØ¾ß ÇÑ´Ù. DHL_RESULT DHL_NVM_FlashWrite(int flashId, UINT32 offset, UINT8 *pBuffer, UINT32 len) { if (offset % 4096 != 0) { printf("%s | Not Aligned as 4KB\n", __func__); return DHL_FAIL_OUT_OF_RANGE; } int i; for ( i = 0; i < len; i+= 4096) { int len2 = 4096; if (i+len2 > len) len2 = len - i; DHL_NVM_FlashWriteSub(flashId, (offset + i), &pBuffer[i], len2); } return DHL_OK; } #if COMMENT ____Init____(){} #endif DHL_RESULT DHL_NVM_Init(void) { if (bfds_open(&store) != 0) { printf("fail to set serial flash mode.\n"); return -1; } bfds_properties properties; bfds_get_properties(store, &properties); s_pi_flash_size = properties.flash_total_size; //!!flash total size <-4Mbyte return DHL_OK; } void DHL_NVM_Uninit(void) { }