?? hvprog.c
字號:
hvSetControlAndData(HVCTL(HV_CMD, HV_LOW, HV_NORW), HVCMD_CHIP_ERASE); hvSetControlAndData(HVCTL(HV_NONE, HV_LOW, HV_WRITE), 0); hvSetControlAndData(HVCTL(HV_NONE, HV_LOW, HV_NORW), 0); if(hvPollTimeout){ rval = hvPoll(); }else{ timerMsDelay(eraseTime); } hvSetControlAndData(HVCTL(HV_CMD, HV_LOW, HV_NORW), HVCMD_NOP); return rval;}uchar hvspChipErase(stkChipEraseHvsp_t *param){ hvPollTimeout = param->pollTimeout; return hvChipErase(param->eraseTime);}uchar ppChipErase(stkChipErasePp_t *param){ /* ### set pulse width to global variable */ hvPollTimeout = param->pollTimeout; return hvChipErase(10);}/* ------------------------------------------------------------------------- */#define MODEMASK_PAGEMODE 1#define MODEMASK_LAST_PAGE 0x40#define MODEMASK_FLASH_PAGE 0x80/* len == 0 means 256 bytes */static uchar hvProgramMemory(uchar *data, uchar len, uchar mode, uchar isEeprom){uchar x, pageMask = 0xff, rval = STK_STATUS_CMD_OK; x = -(mode >> 1) & 7; while(x--) /* pageMask >>= x is less efficient */ pageMask >>= 1; if(!isEeprom) pageMask >>= 1; hvSetControlAndData(HVCTL(HV_CMD, HV_LOW, HV_NORW), isEeprom ? HVCMD_WRITE_EEPROM : HVCMD_WRITE_FLASH); do{ wdt_reset(); hvSetControlAndData(HVCTL(HV_ADDR, HV_LOW, HV_NORW), stkAddress.bytes[0]); if(mode & MODEMASK_PAGEMODE){ hvSetControlAndData(HVCTL(HV_DATA, HV_LOW, HV_NORW), *data++); if(isEeprom){ hvSetControlAndData(HVCTL(HV_PAGEL, HV_LOW, HV_NORW), 0); hvSetControlAndData(HVCTL(HV_NONE, HV_LOW, HV_NORW), 0); }else{ hvSetControlAndData(HVCTL(HV_DATA, HV_HIGH, HV_NORW), *data++); hvSetControlAndData(HVCTL(HV_PAGEL, HV_HIGH, HV_NORW), 0); hvSetControlAndData(HVCTL(HV_NONE, HV_HIGH, HV_NORW), 0); } x = stkAddress.bytes[0] + 1; /* enforce byte wide operation */ if((x & pageMask) == 0 && (mode & MODEMASK_FLASH_PAGE)){ hvSetControlAndData(HVCTL(HV_ADDR, HV_HIGH, HV_NORW), stkAddress.bytes[1]); hvSetControlAndData(HVCTL(HV_NONE, HV_LOW, HV_WRITE), 0); hvSetControlAndData(HVCTL(HV_NONE, HV_LOW, HV_NORW), 0); rval = hvPoll(); } }else{ hvSetControlAndData(HVCTL(HV_ADDR, HV_HIGH, HV_NORW), stkAddress.bytes[1]); hvSetControlAndData(HVCTL(HV_DATA, HV_LOW, HV_NORW), *data++); if(isEeprom){ hvSetControlAndData(HVCTL(HV_PAGEL, HV_LOW, HV_NORW), 0); hvSetControlAndData(HVCTL(HV_NONE, HV_LOW, HV_WRITE), 0); hvSetControlAndData(HVCTL(HV_NONE, HV_LOW, HV_NORW), 0); }else{ hvSetControlAndData(HVCTL(HV_NONE, HV_LOW, HV_WRITE), 0); hvSetControlAndData(HVCTL(HV_NONE, HV_LOW, HV_NORW), 0); if((rval = hvPoll()) != STK_STATUS_CMD_OK) break; hvSetControlAndData(HVCTL(HV_DATA, HV_HIGH, HV_NORW), *data++); hvSetControlAndData(HVCTL(HV_NONE, HV_HIGH, HV_WRITE), 0); hvSetControlAndData(HVCTL(HV_NONE, HV_HIGH, HV_NORW), 0); } if((rval = hvPoll()) != STK_STATUS_CMD_OK) break; } stkIncrementAddress(); if(!isEeprom && !--len) /* should not happen, but we would hang indefinitely */ break; }while(--len); if(!(mode & MODEMASK_PAGEMODE) || (mode & MODEMASK_LAST_PAGE)) hvSetControlAndData(HVCTL(HV_CMD, HV_LOW, HV_NORW), HVCMD_NOP); return rval;}uchar hvspProgramMemory(stkProgramFlashHvsp_t *param, uchar isEeprom){ hvPollTimeout = param->pollTimeout; return hvProgramMemory(param->data, param->numBytes[1], param->mode, isEeprom);}/* ------------------------------------------------------------------------- */static void hvReadMemory(uchar *data, uint len, uchar isEeprom){ hvSetControlAndData(HVCTL(HV_CMD, HV_LOW, HV_NORW), isEeprom ? HVCMD_READ_EEPROM : HVCMD_READ_FLASH); while(len-- > 0){ wdt_reset(); hvSetControlAndData(HVCTL(HV_ADDR, HV_LOW, HV_NORW), stkAddress.bytes[0]); hvSetControlAndData(HVCTL(HV_ADDR, HV_HIGH, HV_NORW), stkAddress.bytes[1]); hvSetControlAndData(HVCTL(HV_NONE, HV_LOW, HV_READ), 0); *data++ = hvSetControlAndData(HVCTL(HV_NONE, HV_LOW, HV_NORW), 0); if(!isEeprom){ hvSetControlAndData(HVCTL(HV_NONE, HV_HIGH, HV_READ), 0); *data++ = hvSetControlAndData(HVCTL(HV_NONE, HV_HIGH, HV_NORW), 0); len--; } stkIncrementAddress(); } *data++ = STK_STATUS_CMD_OK; /* status2 */}uint hvspReadMemory(stkReadFlashHvsp_t *param, stkReadFlashHvspResult_t *result, uchar isEeprom){utilWord_t numBytes; numBytes.bytes[1] = param->numBytes[0]; numBytes.bytes[0] = param->numBytes[1]; result->status1 = STK_STATUS_CMD_OK; hvReadMemory(result->data, numBytes.word, isEeprom); return numBytes.word + 2;}/* ------------------------------------------------------------------------- */static uchar hvProgramFuse(uchar value, uchar cmd, uchar highLow){uchar rval; hvSetControlAndData(HVCTL(HV_CMD, HV_LOW, HV_NORW), cmd); hvSetControlAndData(HVCTL(HV_DATA, HV_LOW, HV_NORW), value); hvSetControlAndData(HVCTL(HV_NONE, highLow, HV_WRITE), 0); hvSetControlAndData(HVCTL(HV_NONE, highLow, HV_NORW), 0); rval = hvPoll(); hvSetControlAndData(HVCTL(HV_CMD, HV_LOW, HV_NORW), HVCMD_NOP); return rval;}uchar hvspProgramFuse(stkProgramFuseHvsp_t *param){uchar highLow; hvPollTimeout = param->pollTimeout; if(param->fuseAddress == 0){ highLow = HV_LOW; }else if(param->fuseAddress == 1){ highLow = HV_HIGH; }else{ highLow = HV_EXT; } return hvProgramFuse(param->fuseByte, HVCMD_WRITE_FUSE, highLow);}uchar hvspProgramLock(stkProgramFuseHvsp_t *param){ hvPollTimeout = param->pollTimeout; return hvProgramFuse(param->fuseByte, HVCMD_WRITE_LOCK, HV_LOW);}uchar ppProgramFuse(stkProgramFusePp_t *param){uchar highLow; /* ### set pulse width to global variable */ hvPollTimeout = param->pollTimeout; if(param->address == 0){ highLow = HV_LOW; }else if(param->address == 1){ highLow = HV_HIGH; }else if(param->address == 2){ highLow = HV_EXT; }else{ highLow = HV_EXT2; } return hvProgramFuse(param->data, HVCMD_WRITE_FUSE, highLow);}uchar ppProgramLock(stkProgramFusePp_t *param){ /* ### set pulse width to global variable */ hvPollTimeout = param->pollTimeout; return hvProgramFuse(param->data, HVCMD_WRITE_LOCK, HV_LOW);}/* ------------------------------------------------------------------------- */static uchar hvReadFuse(uchar highLow){ hvSetControlAndData(HVCTL(HV_CMD, HV_LOW, HV_NORW), HVCMD_READ_FUSELCK); hvSetControlAndData(HVCTL(HV_NONE, highLow, HV_READ), 0); return hvSetControlAndData(HVCTL(HV_NONE, highLow, HV_NORW), 0);}uchar hvspReadFuse(stkReadFuseHvsp_t *param){uchar highLow; if(param->fuseAddress == 0){ highLow = HV_LOW; }else if(param->fuseAddress == 1){ highLow = HV_EXT2; }else if(param->fuseAddress == 2){ highLow = HV_EXT; }else{ return STK_STATUS_CMD_FAILED; /* ### not implemented yet -- which data sheet documents this? */ } return hvReadFuse(highLow);}uchar hvspReadLock(void){ return hvReadFuse(HV_HIGH);}/* ------------------------------------------------------------------------- */static uchar hvReadSignature(uchar addr, uchar highLow){ hvSetControlAndData(HVCTL(HV_CMD, HV_LOW, HV_NORW), HVCMD_READ_SIGCAL); hvSetControlAndData(HVCTL(HV_ADDR, HV_LOW, HV_NORW), addr); hvSetControlAndData(HVCTL(HV_NONE, highLow, HV_READ), 0); return hvSetControlAndData(HVCTL(HV_NONE, highLow, HV_NORW), 0);}uchar hvspReadSignature(stkReadFuseHvsp_t *param){ return hvReadSignature(param->fuseAddress, HV_LOW);}uchar hvspReadOsccal(void){ return hvReadSignature(0, HV_HIGH);}/* ------------------------------------------------------------------------- */#endif /* ENABLE_HVPROG */
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -