⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hvprog.c

📁 老外做的 AVR-Doper 很强大
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -