亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? isp.c

?? 老外做的 AVR-Doper 很強大
?? C
字號:
/* * Name: isp.c * Project: AVR-Doper * Author: Christian Starkjohann <cs@obdev.at> * Creation Date: 2006-06-21 * Tabsize: 4 * Copyright: (c) 2006 by Christian Starkjohann, all rights reserved. * License: GNU GPL v2 (see License.txt) or proprietary (CommercialLicense.txt) * Revision: $Id: isp.c 566 2008-04-26 14:21:47Z cs $ */#include "hardware.h"#include <avr/io.h>#include <avr/wdt.h>#include <avr/interrupt.h>#include "utils.h"#include <util/delay.h>#include "isp.h"#include "timer.h"#include "oddebug.h"static uchar    ispClockDelay;static uchar    cmdBuffer[4];/* ------------------------------------------------------------------------- *//* We disable interrupts while transfer a byte. This ensures that we execute * at nominal speed, in spite of aggressive USB polling. */static uchar ispBlockTransfer(uchar *block, uchar len){uchar   cnt, shift = 0, port, delay = ispClockDelay;/* minimum clock pulse width: * 5 + 4 * delay clock cycles           -> Tmin = 750 ns * total clock period: 12 + 8 * delay   -> fmax = 600 kHz *//*    DBG2(0x40, block, len); */    cli();    port = PORT_OUT(HWPIN_ISP_MOSI) & ~(1 << PORT_BIT(HWPIN_ISP_MOSI));    while(len--){   /* len may be 0 */        cnt = 8;        shift = *block++;        do{            if(shift & 0x80){                port |= (1 << PORT_BIT(HWPIN_ISP_MOSI));            }            PORT_OUT(HWPIN_ISP_MOSI) = port;            sei();            timerTicksDelay(delay);            cli();            PORT_PIN_SET(HWPIN_ISP_SCK);    /* <-- data clocked by device */            shift <<= 1;            port &= ~(1 << PORT_BIT(HWPIN_ISP_MOSI));#if METABOARD_HARDWARE            if(PORT_PIN_VALUE(HWPIN_ISP_MISO))  /* no driver in this hardware */                shift |= 1;#else /* METABOARD_HARDWARE */            if(!PORT_PIN_VALUE(HWPIN_ISP_MISO)) /* driver is inverting */                shift |= 1;#endif /* METABOARD_HARDWARE */            sei();            timerTicksDelay(delay);            cli();            PORT_PIN_CLR(HWPIN_ISP_SCK);    /* <-- device changes data */        }while(--cnt);    }    sei();/*    DBG2(0x41, &shift, 1); */    return shift;}/* ------------------------------------------------------------------------- */static void ispAttachToDevice(uchar stk500Delay, uchar stabDelay){#if !METABOARD_HARDWARE /* on metaboard, we use the jumper to select CDC vs. HID mode */    if(!PORT_PIN_VALUE(HWPIN_JUMPER)){      /* Jumper is set -> request clock below 8 kHz */        ispClockDelay = (uchar)(70/TIMER_TICK_US);   /* 140 us -> 7.14 kHz clock rate */    }else#endif    if(stk500Delay == 0){ /* 1.8 MHz nominal */        ispClockDelay = 0;    }else if(stk500Delay == 1){ /* 460 kHz nominal */        ispClockDelay = 0;    }else if(stk500Delay == 2){ /* 115 kHz nominal */        ispClockDelay = 1;    }else if(stk500Delay == 3){ /* 58 kHz nominal */        ispClockDelay = 2;    }else{        /* from STK500v2 spec: stk500Delay = 1/(24 * SCK / 7.37 MHz) - 10/12         * definition of ispClockDelay = 1 + 1/(SCK/MHz * 2 * TIMER_TICK_US)         * ispClockDelay = 1 + (stk500Delay + 10/12) * 12 / (TIMER_TICK_US * 7.37)         */#if F_CPU > 14000000L    /* ~ 16 MHz */        ispClockDelay = (stk500Delay + 1)/2 - (stk500Delay + 1)/8 + (stk500Delay + 1)/32;#else   /* must be 12 MHz */        ispClockDelay = (stk500Delay + 1)/4 + (stk500Delay + 1)/16;#endif    }#if METABOARD_HARDWARE    PORT_PIN_CLR(HWPIN_LED);        /* turn on LED */    /* turn on power for programming sockets: */    PORT_OUT(HWPIN_ISP_SUPPLY1) |= _BV(PORT_BIT(HWPIN_ISP_SUPPLY1)) | _BV(PORT_BIT(HWPIN_ISP_SUPPLY2));#ifdef HWPIN_ISP_CLK    PORT_DDR_SET(HWPIN_ISP_CLK);    /* turn on optional clock for programming socket */#endif    PORT_DDR_SET(HWPIN_ISP_SCK);    /* enable programming I/O pins */    PORT_DDR_SET(HWPIN_ISP_MOSI);    timerMsDelay(200);              /* allow device to power up */    PORT_DDR_SET(HWPIN_ISP_RESET);    timerMsDelay(stabDelay);    timerTicksDelay(ispClockDelay); /* stabDelay may have been 0 */    PORT_PIN_SET(HWPIN_ISP_RESET);  /* give positive RESET pulse */    timerTicksDelay(ispClockDelay);    PORT_PIN_CLR(HWPIN_ISP_RESET);  /* bring RESET back low */#else /* METABOARD_HARDWARE */    PORT_PIN_SET(HWPIN_LED);    /* setup initial condition: SCK, MOSI = 0 */    PORT_OUT(HWPIN_ISP_SCK) &= ~((1 << PORT_BIT(HWPIN_ISP_SCK)) | (1 << PORT_BIT(HWPIN_ISP_MOSI)));    PORT_PIN_SET(HWPIN_ISP_RESET);  /* set RESET */    PORT_DDR_CLR(HWPIN_ISP_DRIVER); /* make input: use internal pullup to control driver */    PORT_PIN_SET(HWPIN_ISP_DRIVER); /* attach to device: */    TCCR2 |= (1 << COM20);  /* set toggle on compare match mode -> activate clock */    timerMsDelay(stabDelay);    timerTicksDelay(ispClockDelay); /* stabDelay may have been 0 */    /* We now need to give a positive pulse on RESET since we can't guarantee     * that SCK was low during power up (according to instructions in Atmel's     * data sheets).     */    PORT_PIN_CLR(HWPIN_ISP_RESET);  /* give a positive RESET pulse */    timerTicksDelay(ispClockDelay);    PORT_PIN_SET(HWPIN_ISP_RESET);#endif /* METABOARD_HARDWARE */}static void ispDetachFromDevice(uchar removeResetDelay){#if METABOARD_HARDWARE    PORT_DDR_CLR(HWPIN_ISP_SCK);    PORT_DDR_CLR(HWPIN_ISP_MOSI);#ifdef HWPIN_ISP_CLK    PORT_DDR_CLR(HWPIN_ISP_CLK);    /* turn off optional clock for programming socket */#endif    PORT_DDR_CLR(HWPIN_ISP_RESET);    PORT_PIN_CLR(HWPIN_ISP_SCK);    /* ensure we have no pull-ups active */    PORT_PIN_CLR(HWPIN_ISP_MOSI);    /* turn off optional power supply for programming socket: */    PORT_OUT(HWPIN_ISP_SUPPLY1) &= ~(_BV(PORT_BIT(HWPIN_ISP_SUPPLY1)) | _BV(PORT_BIT(HWPIN_ISP_SUPPLY2)));    PORT_PIN_SET(HWPIN_LED);        /* turn off LED */#else /* METABOARD_HARDWARE */    PORT_OUT(HWPIN_ISP_SCK) &= ~((1 << PORT_BIT(HWPIN_ISP_SCK)) | (1 << PORT_BIT(HWPIN_ISP_MOSI)));    PORT_PIN_SET(HWPIN_ISP_RESET);    timerMsDelay(removeResetDelay);    TCCR2 &= ~(1 << COM20);  /* clear toggle on compare match mode */    PORT_PIN_CLR(HWPIN_ISP_DRIVER); /* detach from device */    PORT_DDR_SET(HWPIN_ISP_DRIVER); /* set pin level to low-Z 0 */    PORT_PIN_CLR(HWPIN_ISP_RESET);    PORT_PIN_CLR(HWPIN_LED);#endif /* METABOARD_HARDWARE */}/* ------------------------------------------------------------------------- */uchar   ispEnterProgmode(stkEnterProgIsp_t *param){uchar   i, rval;    ispAttachToDevice(stkParam.s.sckDuration, param->stabDelay);    timerMsDelay(param->cmdExeDelay);    /* we want for(i = param->synchLoops; i--;), but avrdude sends synchLoops == 0 */    for(i = 32; i--;){        wdt_reset();        rval = ispBlockTransfer(param->cmd, param->pollIndex);        if(param->pollIndex < 4)            ispBlockTransfer(param->cmd + param->pollIndex, 4 - param->pollIndex);        if(rval == param->pollValue){   /* success: we are in sync */            return STK_STATUS_CMD_OK;        }        /* insert one clock pulse and try again: */        PORT_PIN_SET(HWPIN_ISP_SCK);        timerTicksDelay(ispClockDelay);        PORT_PIN_CLR(HWPIN_ISP_SCK);        timerTicksDelay(ispClockDelay);    }    ispDetachFromDevice(0);    return STK_STATUS_CMD_FAILED;   /* failure */}void    ispLeaveProgmode(stkLeaveProgIsp_t *param){    ispDetachFromDevice(param->preDelay);    timerMsDelay(param->postDelay);}/* ------------------------------------------------------------------------- */static uchar    deviceIsBusy(void){    cmdBuffer[0] = 0xf0;    cmdBuffer[1] = 0;    return ispBlockTransfer(cmdBuffer, 4) & 1;}static uchar    waitUntilReady(uchar msTimeout){    timerSetupTimeout(msTimeout);    while(deviceIsBusy()){        if(timerTimeoutOccurred())            return STK_STATUS_RDY_BSY_TOUT;    }    return STK_STATUS_CMD_OK;}/* ------------------------------------------------------------------------- */uchar   ispChipErase(stkChipEraseIsp_t *param){uchar   maxDelay = param->eraseDelay;uchar   rval = STK_STATUS_CMD_OK;    ispBlockTransfer(param->cmd, 4);    if(param->pollMethod != 0){        if(maxDelay < 10)   /* allow at least 10 ms */            maxDelay = 10;        rval = waitUntilReady(maxDelay);    }else{        timerMsDelay(maxDelay);    }    return rval;}/* ------------------------------------------------------------------------- */uchar   ispProgramMemory(stkProgramFlashIsp_t *param, uchar isEeprom){utilWord_t  numBytes;uchar       rval = STK_STATUS_CMD_OK;uchar       valuePollingMask, rdyPollingMask;uint        i;    numBytes.bytes[1] = param->numBytes[0];    numBytes.bytes[0] = param->numBytes[1];    if(param->mode & 1){    /* page mode */        valuePollingMask = 0x20;        rdyPollingMask = 0x40;    }else{                  /* word mode */        valuePollingMask = 4;        rdyPollingMask = 8;    }    if(!isEeprom && stkAddress.bytes[3] & 0x80){        cmdBuffer[0] = 0x4d;    /* load extended address */        cmdBuffer[1] = 0x00;        cmdBuffer[2] = stkAddress.bytes[2];        cmdBuffer[3] = 0x00;        ispBlockTransfer(cmdBuffer, 4);    }    for(i = 0; rval == STK_STATUS_CMD_OK && i < numBytes.word; i++){        uchar x;        wdt_reset();        cmdBuffer[1] = stkAddress.bytes[1];        cmdBuffer[2] = stkAddress.bytes[0];        cmdBuffer[3] = param->data[i];        x = param->cmd[0];        if(!isEeprom){            x &= ~0x08;            if((uchar)i & 1){                x |= 0x08;                stkIncrementAddress();            }        }else{            stkIncrementAddress();        }        cmdBuffer[0] = x;#if 0   /* does not work this way... */        if(cmdBuffer[3] == 0xff && !(param->mode & 1) && !isEeprom)   /* skip 0xff in word mode */            continue;#endif        ispBlockTransfer(cmdBuffer, 4);        if(param->mode & 1){            /* is page mode */            if(i < numBytes.word - 1 || !(param->mode & 0x80))                continue;               /* not last byte written */            cmdBuffer[0] = param->cmd[1];     /* write program memory page */            ispBlockTransfer(cmdBuffer, 4);        }        /* poll for ready after each byte (word mode) or page (page mode) */        if(param->mode & valuePollingMask){ /* value polling */            uchar d = param->data[i];            if(d == param->poll[0] || d == param->poll[1]){ /* must use timed polling */                timerMsDelay(param->delay);            }else{                uchar x = param->cmd[2];     /* read flash */                x &= ~0x08;                if((uchar)i & 1){                    x |= 0x08;                }                cmdBuffer[0] = x;                timerSetupTimeout(param->delay);                while(ispBlockTransfer(cmdBuffer, 4) != d){                    if(timerTimeoutOccurred()){                        rval = STK_STATUS_CMD_TOUT;                        break;                    }                }            }        }else if(param->mode & rdyPollingMask){ /* rdy/bsy polling */            rval = waitUntilReady(param->delay);        }else{                          /* must be timed delay */            timerMsDelay(param->delay);        }    }    return rval;}/* ------------------------------------------------------------------------- */uint    ispReadMemory(stkReadFlashIsp_t *param, stkReadFlashIspResult_t *result, uchar isEeprom){utilWord_t  numBytes;uchar       *p, cmd0;uint        i;    cmdBuffer[3] = 0;    if(!isEeprom && stkAddress.bytes[3] & 0x80){        cmdBuffer[0] = 0x4d;    /* load extended address */        cmdBuffer[1] = 0x00;        cmdBuffer[2] = stkAddress.bytes[2];        ispBlockTransfer(cmdBuffer, 4);    }    numBytes.bytes[1] = param->numBytes[0];    numBytes.bytes[0] = param->numBytes[1];    p = result->data;    result->status1 = STK_STATUS_CMD_OK;    cmd0 = param->cmd;    for(i = 0; i < numBytes.word; i++){        wdt_reset();        cmdBuffer[1] = stkAddress.bytes[1];        cmdBuffer[2] = stkAddress.bytes[0];        if(!isEeprom){            if((uchar)i & 1){                cmd0 |= 0x08;                stkIncrementAddress();            }else{                cmd0 &= ~0x08;            }        }else{            stkIncrementAddress();        }        cmdBuffer[0] = cmd0;        *p++ = ispBlockTransfer(cmdBuffer, 4);    }    *p = STK_STATUS_CMD_OK; /* status2 */    return numBytes.word + 2;}/* ------------------------------------------------------------------------- */uchar   ispProgramFuse(stkProgramFuseIsp_t *param){    ispBlockTransfer(param->cmd, 4);    return STK_STATUS_CMD_OK;}/* ------------------------------------------------------------------------- */uchar   ispReadFuse(stkReadFuseIsp_t *param){uchar   rval;    rval = ispBlockTransfer(param->cmd, param->retAddr);    if(param->retAddr < 4)        ispBlockTransfer(param->cmd + param->retAddr, 4 - param->retAddr);    return rval;}/* ------------------------------------------------------------------------- */uint    ispMulti(stkMultiIsp_t *param, stkMultiIspResult_t *result){uchar   cnt1, i, *p;    cnt1 = param->numTx;    if(cnt1 > param->rxStartAddr)        cnt1 = param->rxStartAddr;    ispBlockTransfer(param->txData, cnt1);    p = result->rxData;    for(i = 0; i < param->numTx - cnt1; i++){        uchar b = ispBlockTransfer(&param->txData[cnt1] + i, 1);        if(i < param->numRx)            *p++ = b;        wdt_reset();    }        for(; i < param->numRx; i++){        cmdBuffer[0] = 0;        *p++ = ispBlockTransfer(cmdBuffer, 1);        wdt_reset();    }    *p = result->status1 = STK_STATUS_CMD_OK;    return (uint)param->numRx + 2;}/* ------------------------------------------------------------------------- */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99久久婷婷国产综合精品电影| 91精品1区2区| 另类小说视频一区二区| 亚洲电影视频在线| 亚洲综合激情另类小说区| 亚洲精品欧美激情| 亚洲免费伊人电影| 亚洲精品你懂的| 亚洲成人激情av| 亚洲国产va精品久久久不卡综合| 亚洲日本在线看| 亚洲精品日韩专区silk| 亚洲在线一区二区三区| 亚洲午夜一区二区三区| 首页国产欧美久久| 日本女优在线视频一区二区| 日韩高清欧美激情| 日本人妖一区二区| 国产剧情在线观看一区二区| 国产成人自拍网| 成人精品gif动图一区| 播五月开心婷婷综合| 91在线看国产| 欧美天天综合网| 日韩一级欧美一级| 久久一区二区三区四区| 国产精品久线在线观看| 亚洲精品视频在线| 久久国产精品免费| 成人免费视频caoporn| 97se亚洲国产综合自在线不卡 | jvid福利写真一区二区三区| 99久久亚洲一区二区三区青草| 日本电影欧美片| 欧美一级高清大全免费观看| www国产成人免费观看视频 深夜成人网| 国产丝袜在线精品| 亚洲欧美日韩在线| 日韩国产高清影视| 国产mv日韩mv欧美| 色婷婷久久久亚洲一区二区三区| 日本韩国精品在线| 欧美精品第一页| 久久久综合精品| 国产精品久久久久久妇女6080| 最新成人av在线| 国产欧美精品一区aⅴ影院| 国产精品初高中害羞小美女文| 亚洲欧美综合色| 亚洲欧美日韩国产另类专区| 无码av免费一区二区三区试看 | 欧美天天综合网| 日韩欧美国产精品| 中文字幕第一区综合| 亚洲精品一二三| 伦理电影国产精品| 国产成人精品一区二| 欧美在线你懂的| 久久久久久久综合| 亚洲男人电影天堂| 免费在线观看视频一区| 粉嫩高潮美女一区二区三区| 欧美三电影在线| 欧美精品一区二区三区蜜臀| 国产精品欧美精品| 午夜精品久久久久久久久久| 久久99久久99| 91福利在线免费观看| 日韩欧美你懂的| 亚洲美女免费在线| 久久国产精品区| 色婷婷久久久久swag精品| 日韩一级黄色大片| 国产精品电影院| 看片的网站亚洲| 91欧美一区二区| 亚洲小少妇裸体bbw| 国产一二精品视频| 精品视频1区2区3区| 欧美日韩视频在线观看一区二区三区 | 精品久久久网站| 一片黄亚洲嫩模| 国产精品中文字幕日韩精品| 欧美色国产精品| 亚洲欧洲精品一区二区三区| 亚洲h精品动漫在线观看| 91蜜桃视频在线| 久久先锋影音av| 日本一不卡视频| 一本一本大道香蕉久在线精品 | 性做久久久久久免费观看| 高清视频一区二区| 日韩精品在线网站| 亚洲成人av中文| 91视频免费播放| 国产欧美精品一区二区三区四区| 丝袜诱惑亚洲看片| 一本到一区二区三区| 国产亚洲福利社区一区| 青青草一区二区三区| 欧美在线视频你懂得| 亚洲视频资源在线| 国精品**一区二区三区在线蜜桃| 欧美午夜精品电影| 国产精品麻豆久久久| 经典三级视频一区| 91精品国产一区二区三区蜜臀| 亚洲综合一区二区| 91在线播放网址| 国产精品视频免费看| 国产精品一级二级三级| 日韩免费观看高清完整版| 天天影视网天天综合色在线播放| 色偷偷久久人人79超碰人人澡 | 亚洲国产中文字幕| 色婷婷激情综合| 亚洲色图视频网| 成人晚上爱看视频| 国产视频视频一区| 国产精品综合网| 精品成人a区在线观看| 久久电影网电视剧免费观看| 91精品国产高清一区二区三区蜜臀| 国产精品久久久久aaaa樱花| 久久er精品视频| 欧美日韩在线播| 亚洲一区二区在线免费看| 欧美日韩极品在线观看一区| 午夜欧美视频在线观看 | 天天做天天摸天天爽国产一区| 欧美亚洲国产怡红院影院| 亚洲午夜免费电影| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 亚洲视频图片小说| 在线观看91精品国产入口| 亚洲成人1区2区| 制服丝袜成人动漫| 欧美aaa在线| 国产精品欧美一区喷水| 色综合久久久久久久久| 一区二区三区四区蜜桃 | 国产精品久久久久久久蜜臀| va亚洲va日韩不卡在线观看| 亚洲欧美区自拍先锋| 欧美又粗又大又爽| 奇米色777欧美一区二区| 久久久精品黄色| 99久久er热在这里只有精品15 | 欧美日韩1区2区| 另类小说综合欧美亚洲| 国产亚洲女人久久久久毛片| www.在线欧美| 亚洲高清在线精品| 精品国产区一区| 97se亚洲国产综合自在线观| 亚洲国产精品尤物yw在线观看| 日韩一二三区不卡| 丁香婷婷综合激情五月色| 亚洲精品一二三区| 日韩亚洲欧美在线| 成人涩涩免费视频| 自拍av一区二区三区| 欧美日韩午夜精品| 久久精品国产亚洲5555| 中文字幕av不卡| 欧美三区免费完整视频在线观看| 免费观看久久久4p| 中文字幕亚洲一区二区av在线| 91一区二区三区在线观看| 青青草原综合久久大伊人精品| 国产精品国产三级国产普通话99| 欧美午夜电影在线播放| 狠狠色综合播放一区二区| 一区二区三区在线看| 精品99999| 欧美视频在线一区二区三区| 成人中文字幕在线| 视频一区二区不卡| 国产精品久久一卡二卡| 欧美日韩一本到| 色综合咪咪久久| 久久国产尿小便嘘嘘| 一区二区三区在线免费观看| 国产日产亚洲精品系列| 欧美日韩精品一区二区| 国产成+人+日韩+欧美+亚洲| 亚洲成精国产精品女| 国产精品日产欧美久久久久| 欧美日韩精品福利| 99re成人在线| 蜜臀久久99精品久久久久久9| 亚洲精品老司机| 久久精品这里都是精品| 欧美色综合影院| 成人在线综合网| 精品在线你懂的| 日韩国产欧美在线播放| 久久99精品国产.久久久久久| 亚洲日本电影在线| 久久久久久影视|