/*----------------------------------------------------------------------------- * program flash */ bool FlashProgram(uint16_t wordAddr, uint16_t *pBuf, uint16_t numWords) { uint16_t page; uint16_t startPage; uint16_t endPage; uint16_t wordOffset; /* word offset within page */ uint8_t numPageWords; int flags; if ((wordAddr + numWords) > FIRMWARE_WORD_SIZE) { return false; } flags = DISABLE_INT; startPage = wordAddr & ~(PAGE_WORD_SIZE - 1); endPage = (wordAddr + numWords - 1) & ~(PAGE_WORD_SIZE - 1); wordOffset = wordAddr - startPage; if ((startPage != sActualProgramingPage) && (sActualProgramingPage != INV_PAGE)) { /* if continue in other page, program current buffer */ FlashProgramPagePuffer(sActualProgramingPage); } for (page = startPage; page <= endPage; page += PAGE_WORD_SIZE) { numPageWords = min(PAGE_WORD_SIZE - wordOffset, numWords); numWords -= numPageWords; FlashFillPagePuffer(wordOffset, pBuf, numPageWords); if ((wordOffset + numPageWords) == PAGE_WORD_SIZE) { /* buffer is full -> program page */ FlashProgramPagePuffer(page); sActualProgramingPage = INV_PAGE; /* next page not yet known */ } else { sActualProgramingPage = page; } pBuf += numPageWords; wordOffset = 0; } RESTORE_INT(flags); return true; }
/*----------------------------------------------------------------------------- * Flash programmieren */ BOOL FlashProgram(UINT16 wordAddr, UINT16 *pBuf, UINT16 numWords) { UINT16 page; UINT16 startPage; UINT16 endPage; UINT16 wordOffset; /* wordoffset innerhalb page */ UINT8 numPageWords; int flags; if ((wordAddr + numWords) > FIRMWARE_WORD_SIZE) { return FALSE; } flags = DISABLE_INT; startPage = wordAddr & ~(PAGE_WORD_SIZE -1); endPage = (wordAddr + numWords - 1) & ~(PAGE_WORD_SIZE -1); wordOffset = wordAddr - startPage; if ((startPage != sActualProgramingPage) && (sActualProgramingPage != INV_PAGE)) { /* zuvor teilgefüllte Page programmieren falls in anderer Page fortgesetzt wird */ FlashProgramPagePuffer(sActualProgramingPage); } for (page = startPage; page <= endPage; page += PAGE_WORD_SIZE) { numPageWords = min(PAGE_WORD_SIZE - wordOffset, numWords); numWords -= numPageWords; FlashFillPagePuffer(wordOffset, pBuf, numPageWords); if ((wordOffset + numPageWords) == PAGE_WORD_SIZE) { /* bei gefülltem Pagepuffer -> Pagepuffer programmieren */ FlashProgramPagePuffer(page); sActualProgramingPage = INV_PAGE; /* nächste Page ist beliebig */ } else { sActualProgramingPage = page; } pBuf += numPageWords; wordOffset = 0; } RESTORE_INT(flags); return TRUE; }
/*----------------------------------------------------------------------------- * terminate flash programing */ bool FlashProgramTerminate(void) { int flags; if (sActualProgramingPage != INV_PAGE) { /* program current page */ flags = DISABLE_INT; FlashProgramPagePuffer(sActualProgramingPage); RESTORE_INT(flags); } return true; }
/*----------------------------------------------------------------------------- * Flashprogrammierung abschließen */ BOOL FlashProgramTerminate(void) { int flags; if (sActualProgramingPage != INV_PAGE) { /* nooch im Puffer befindliche Page programmieren */ flags = DISABLE_INT; FlashProgramPagePuffer(sActualProgramingPage); RESTORE_INT(flags); } return TRUE; }