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

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

?? avr.c

?? tinyos-2.x.rar
?? C
字號:
// $Id: Avr.C,v 1.4 2006/12/12 18:23:01 vlahan Exp $

/*
 * $Id: Avr.C,v 1.4 2006/12/12 18:23:01 vlahan Exp $
 *
 ****************************************************************************
 *
 * uisp - The Micro In-System Programmer for Atmel AVR microcontrollers.
 * Copyright (C) 1999, 2000, 2001, 2002, 2003  Uros Platise
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 ****************************************************************************
 */

/*
	Avr.C
	
	Top class of the AVR micro controllers 
	Uros Platise (c) 1999
*/

#include "config.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "Avr.h"
#include "Error.h"

#define TARGET_MISSING 0xff
#define DEVICE_LOCKED  0x1

/* ATMEL AVR codes */
TAvr::TPart TAvr::parts [] = {
  /* device         sig. bytes   flash page EEPROM twdFL twdEE  flags */
  { "AT90S1200",    0x90, 0x01,   1024,   0,   64,  4000, 4000, AVR_1200 },

  { "ATtiny12",     0x90, 0x05,   1024,   0,   64,  1700, 3400, AVR_TN12 },
  { "ATtiny15",     0x90, 0x06,   1024,   0,   64,  2000, 4000, AVR_TN15 },
#if 0
  /* 12V serial programming only; here just for the evidence */
  /* ATtiny10 = QuickFlash(TM) OTP */
  { "ATtiny10",     0x90, 0x03,   1024,   0,    0,  8000,    0, 0 },
  { "ATtiny11",     0x90, 0x04,   1024,   0,    0,  8000,    0, 0 },
#endif

  { "AT90S2313",    0x91, 0x01,   2048,   0,  128,  4000, 4000, AVR_2313 },
  { "AT90S2343",    0x91, 0x03,   2048,   0,  128,  4000, 4000, AVR_8535 },
  { "AT90S2323",    0x91, 0x02,   2048,   0,  128,  4000, 4000, AVR_8535 },

  /* no longer in production?  2333 -> 4433, tiny22 -> 2343? */
  { "AT90S2333",    0x91, 0x05,   2048,   0,  128,  4000, 4000, AVR_4433 },
  { "ATtiny22",     0x91, 0x06,   2048,   0,  128,  4000, 4000, AVR_TN22 },

  { "ATtiny26",     0x91, 0x09,   2048,  32,  128,  4500, 9000, AVR_TN26 },

#if 0
  /* 12V parallel programming only; here just for the evidence */
  { "ATtiny28",     0x91, 0x07,   2048,   0,    0,  8000,    0, 0 },
#endif

  { "AT90S4433",    0x92, 0x03,   4096,   0,  256,  4000, 4000, AVR_4433 },

  /* no longer in production? -> use 8515, 8535 instead */
  { "AT90S4414",    0x92, 0x01,   4096,   0,  256,  4000, 4000, AVR_2313 },
  { "AT90S4434",    0x92, 0x02,   4096,   0,  256,  4000, 4000, AVR_8535 },

  { "AT90S8515",    0x93, 0x01,   8192,   0,  512,  4000, 4000, AVR_2313 },
  { "AT90S8535",    0x93, 0x03,   8192,   0,  512,  4000, 4000, AVR_8535 },

#if 0
  /* aka AT90S8555 - probably doesn't exist, use ATmega8535 */
  { "ATmega83",     0x93, 0x05,   8192, 128,  512, 11000, 4000, AVR_M163 },
#endif

  { "ATmega8515",   0x93, 0x06,   8192,  64,  512,  4500, 9000, AVR_M163 },
  { "ATmega8",      0x93, 0x07,   8192,  64,  512,  4500, 9000, AVR_M163 },
  { "ATmega8535",   0x93, 0x08,   8192,  64,  512,  4500, 9000, AVR_M163 },

#if 0
  /* 12V parallel programming only; here just for the evidence */
  { "AT90C8534",    0x93, 0x04,   8192,   0,  512,  8000, 4000, 0 }, 
#endif

  { "ATmega161",    0x94, 0x01,  16384, 128,  512, 11000, 4000, AVR_M161 },
  { "ATmega163",    0x94, 0x02,  16384, 128,  512, 15000, 3800, AVR_M163 },
  { "ATmega16",     0x94, 0x03,  16384, 128,  512,  4500, 9000, AVR_M163 },
  { "ATmega162",    0x94, 0x04,  16384, 128,  512,  4500, 9000, AVR_M128 },
  { "ATmega169",    0x94, 0x05,  16384, 128,  512,  4500, 9000, AVR_M128 },

  { "ATmega323",    0x95, 0x01,  32768, 128, 1024, 15000, 3800, AVR_M163 },
  { "ATmega32",     0x95, 0x02,  32768, 128, 1024,  4500, 9000, AVR_M163 },

  { "ATmega64",     0x96, 0x02,  65536, 256, 2048,  4500, 9000, AVR_M128 },

  { "ATmega103",    0x97, 0x01, 131072, 256, 4096, 22000, 4000, AVR_M103 },
  { "ATmega128",    0x97, 0x02, 131072, 256, 4096,  4500, 9000, AVR_M128 },

  { "ATmega103-old",0x01, 0x01, 131072, 256, 4096, 22000, 4000, AVR_M103 },

#if 0
  { "ATmega603",    0x96, 0x01,  65536, 256, 2048, 22000, 4000, AVR_M103 },
  { "ATmega603-old",0x06, 0x01,  65536, 256, 2048, 22000, 4000, AVR_M103 },
#endif

#if 0 /* not yet */
  { "AT89S52",      0x52, 0x06,   8192,   0,    0,  1000,    0, AT89S52 },
#endif

  { "",          TARGET_MISSING, 0,  0,   0,    0,     0,    0, 0 },
  { "locked",    DEVICE_LOCKED,  0,  0,   0,    0,     0,    0, 0 },
  { "",          0x0,            0,  0,   0,    0,     0,    0, 0 }
};

const char* TAvr::segment_names[] = {"flash", "eeprom", "fuse", NULL};


/* Private Functions
*/

TAddr TAvr::GetWritePageSize(){
  if (device_locked){return 0;}
  assert(part!=NULL);
  return part->flash_page_size;
}

/* Protected Functions
*/

void TAvr::OverridePart(const char *part_name)
{
  int i;

  for (i = 0; parts[i].name[0]; i++) {
    if (strcasecmp(parts[i].name, part_name) == 0)
      break;
  }
  if (parts[i].name[0]) {
    if (vendor_code != 0x1e
	|| part_family != parts[i].part_family
	|| part_number != parts[i].part_number) {
      vendor_code = 0x1e;
      part_family = parts[i].part_family;
      part_number = parts[i].part_number;

      Info(3, "Override signature bytes, device %s assumed.\n",
	   parts[i].name);
    }
  } else
    throw Error_Device("Unknown device specified", part_name);
}

void TAvr::Identify()
{
  const char* vendor = "Device";

  Info(3, "Vendor Code: 0x%02x\nPart Family: 0x%02x\nPart Number: 0x%02x\n",
    vendor_code, part_family, part_number);  

  /* Identify AVR Part according to the vendor_code ... */
  if (vendor_code==0x1e){vendor = "Atmel AVR";}
  
  if (vendor_code==0 && part_family==DEVICE_LOCKED && part_number==0x02){
    device_locked=true;
    Info(0, "Cannot identify device because it is locked.\n");
    /* XXX hack to avoid "invalid parameter" errors if device is locked */
    GetCmdParam("-dt_wd_eeprom");
    GetCmdParam("-dt_wd_flash");
    GetCmdParam("-dvoltage");
#if 0
    return;
#endif
  } else{device_locked=false;}
  if (part_family==TARGET_MISSING){
    Info(0, "An error has occurred during the AVR initialization.\n"
	    " * Target status:\n"
	    "   Vendor Code = 0x%02x, Part Family = 0x%02x, Part Number = 0x%02x\n\n",
	    vendor_code, part_family, part_number);
    throw 
      Error_Device("Probably the wiring is incorrect or target"
        " might be `damaged'.");
  }
  int i,n;
  for(i=0; parts[i].part_family != 0x0; i++){
    if (part_family == parts[i].part_family){
      for (n=i; parts[n].part_family==part_family; n++){
        if (part_number == parts[n].part_number){i=n; break;}
      }
      if (i==n){Info(1, "%s %s is found.\n", vendor, parts[i].name);}
      else{Info(1, "%s similar to the %s is found.\n", vendor, parts[i].name);}
      part = &parts[i];
      break;
    }
  }
  if (parts[i].part_family == 0x0) {
    throw Error_Device ("Probably the AVR MCU is not in the RESET state.\n"
			"Check it out and run me again.");}

  if (!GetCmdParam("--download", false))
    SetWriteTimings();
}

/* This looks like a good approximation to make the device table simpler
   (only specify the 5V timings).  */

#define CALC_FLASH_T_wd(voltage) ((long) \
  ((part ? part->t_wd_flash_50 : 22000) * (5.0 * 5.0) / (voltage * voltage)))
#define CALC_EEPROM_T_wd(voltage) ((long) \
  ((part ? part->t_wd_eeprom_50 : 4000) * (5.0 * 5.0) / (voltage * voltage)))

void TAvr::SetWriteTimings(){
  const char* val;

  page_size = GetWritePageSize();
  if (page_size)
    Info(3, "Page Write Enabled, size=%d\n", (int) page_size);
  else
    Info(3, "Page Write Disabled\n");

  /* defaults */
  t_wd_flash = CALC_FLASH_T_wd(AVR_DEFAULT_VOLTAGE);
  t_wd_eeprom = CALC_EEPROM_T_wd(AVR_DEFAULT_VOLTAGE);  
    
  /* set FLASH write delay */  
  if ((val=GetCmdParam("-dt_wd_flash"))){
    t_wd_flash = atol(val);
    Info(0, "t_wd_flash = %ld\n", t_wd_flash);
    if (t_wd_flash < CALC_FLASH_T_wd(AVR_MAX_VOLTAGE)){
      Info(0, " * According to the Atmel specs the t_wd_flash\n"
              "   should be at least %ld us\n", 
	      CALC_FLASH_T_wd(AVR_MAX_VOLTAGE));
#if 0
      throw Error_Device("-dt_wd_flash: Value out of range.");
#endif
    }
  }
  
  /* set EEPROM write delay */  
  if ((val=GetCmdParam("-dt_wd_eeprom"))){
    t_wd_eeprom = atol(val);
    if (t_wd_eeprom < CALC_EEPROM_T_wd(AVR_MAX_VOLTAGE)){
      Info(0, " * According to the Atmel specs the t_wd_eeprom\n"
              "   should be at least %ld us\n", 
	      CALC_EEPROM_T_wd(AVR_MAX_VOLTAGE));
#if 0
      throw Error_Device("-dt_wd_eeprom: Value out of range.");
#endif
    }
  }

  /* Set Timings according to the Power Supply Voltage */
  if ((val=GetCmdParam("-dvoltage"))){
    double voltage = atof(val);
    if (voltage < AVR_MIN_VOLTAGE || voltage > AVR_MAX_VOLTAGE){
      Info(0, " * Atmel AVR MCUs operate in range from %.1f to %.1f V\n",
           AVR_MIN_VOLTAGE, AVR_MAX_VOLTAGE);
	   
      throw Error_Device("-dvoltage: Value out of range.");
    }
    
    t_wd_flash = CALC_FLASH_T_wd(voltage);
    t_wd_eeprom = CALC_EEPROM_T_wd(voltage);
  }
  
  Info(3, "FLASH Write Delay (t_wd_flash): %ld us\n"
          "EEPROM Write Delay (t_wd_eeprom): %ld us\n",
	  t_wd_flash, t_wd_eeprom);
}

const char* TAvr::GetPartName(){
  return part->name;
}

TAddr
TAvr::GetSegmentSize()
{
  switch (segment) {
  case SEG_FLASH: return part->flash_size;
  case SEG_EEPROM: return part->eeprom_size;
  case SEG_FUSE: return 5;
  }
  throw Error_MemoryRange();
}

bool
TAvr::TestFeatures(unsigned int mask)
{
  return ((part->flags & mask) == mask);
}

void TAvr::CheckMemoryRange(TAddr addr){
  if (device_locked){
    Info(0, "Device is locked.\n");
    throw Error_MemoryRange();
  }
  if (addr >= GetSegmentSize()) {
    throw Error_MemoryRange();
  }
}

long TAvr::Get_t_wd_flash() const {
  return t_wd_flash;
}

long TAvr::Get_t_wd_eeprom() const {
  return t_wd_eeprom;
}

long TAvr::Get_t_wd_erase() const{
#if 0
  return 3*t_wd_flash;	/* right factor is 2, but just in case */
#else
  /* Device might be locked and not possible to identify, assume 200ms
     which should be long enough for any device, and is not that long
     compared to the program time itself.  */
  return 200000;
#endif
}

/* Device Interface Functions
*/

bool TAvr::SetSegment(const char* segment_name){
  for (int i=0; segment_names[i]!=NULL; i++){
    if (strcmp(segment_names[i], segment_name)==0){
      segment=i; 
      return true;
    }
  }
  return false;
}

const char* TAvr::TellActiveSegment(){
  return segment_names[segment];
}

const char* TAvr::ListSegment(unsigned index){
  if (index>3){return NULL;}
  return segment_names[index];
}

const char* TAvr::ReadByteDescription(TAddr addr){
  static const char* no_desc = "No description available.";
  CheckMemoryRange(addr);
  return no_desc;
}

/* Constructor/Destructor
*/

TAvr::TAvr():
  part(NULL), 
  page_size(0), page_addr_fetched(false),
  page_poll_byte(0xFF),
  segment(SEG_FLASH){
}

TAvr::~TAvr(){
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久久久久久久电影| 免费av成人在线| 国产精品美日韩| 国产欧美一区二区精品性色超碰| 日韩午夜三级在线| 日韩视频一区二区在线观看| 欧美一区二区日韩一区二区| 欧美群妇大交群中文字幕| 欧美亚洲综合另类| 欧美性xxxxx极品少妇| 在线欧美小视频| 欧美日韩一区高清| 69堂国产成人免费视频| 欧美一级黄色大片| 精品裸体舞一区二区三区| 日韩一区二区三区电影在线观看| 日韩一级完整毛片| 精品三级av在线| 久久精品一区二区三区不卡牛牛| 国产日韩精品视频一区| 中文字幕高清不卡| 亚洲欧美日本在线| 午夜在线成人av| 免费观看成人av| 国产精品资源网| 成人亚洲一区二区一| 99精品在线免费| 欧美日韩精品一区二区三区蜜桃| 91精品婷婷国产综合久久性色| 日韩一区二区三区精品视频| 国产日韩欧美精品电影三级在线| 日韩理论电影院| 天堂一区二区在线| 极品少妇xxxx精品少妇偷拍| 东方欧美亚洲色图在线| 色8久久精品久久久久久蜜 | 91麻豆精品国产91久久久资源速度| 制服丝袜激情欧洲亚洲| 精品国产制服丝袜高跟| 日韩一区日韩二区| 亚洲va天堂va国产va久| 极品少妇一区二区三区精品视频 | 91传媒视频在线播放| 欧美日韩情趣电影| 久久久久国产精品麻豆| 亚洲精品久久久蜜桃| 日本欧洲一区二区| 国产成人精品免费| 欧美伊人精品成人久久综合97 | 亚洲国产日韩av| 激情综合网av| 日本乱人伦一区| 欧美成人精品3d动漫h| 中文字幕一区二区三区在线不卡| 日韩在线播放一区二区| 国产suv精品一区二区883| 欧美无乱码久久久免费午夜一区| 2021久久国产精品不只是精品| 亚洲人成7777| 精品一区二区久久| 欧美在线免费播放| 亚洲国产精品ⅴa在线观看| 丝瓜av网站精品一区二区| 成人丝袜18视频在线观看| 欧美久久高跟鞋激| 亚洲少妇中出一区| 国产在线播精品第三| 欧洲精品一区二区| 欧美国产激情一区二区三区蜜月| 日本网站在线观看一区二区三区 | 欧美在线制服丝袜| 国产亚洲精品免费| 麻豆国产欧美日韩综合精品二区| 91免费视频大全| 久久精品视频一区二区| 日韩激情视频在线观看| 91福利在线导航| 国产精品美女久久久久久久久| 老司机精品视频在线| 一本到不卡免费一区二区| 国产人久久人人人人爽| 久久国产夜色精品鲁鲁99| 欧美三级视频在线| 亚洲女女做受ⅹxx高潮| 国产精品资源网| 精品国产乱码久久| 日本成人在线不卡视频| 欧美午夜一区二区三区免费大片| 日韩一区中文字幕| 成人av资源网站| 久久综合视频网| 国内精品嫩模私拍在线| 日韩欧美美女一区二区三区| 日韩中文字幕av电影| 欧美精品黑人性xxxx| 亚洲国产精品影院| 色狠狠桃花综合| 中文字幕在线一区二区三区| 国产精品一卡二| 国产日韩一级二级三级| 国产成人亚洲综合a∨猫咪| 26uuu精品一区二区| 免费成人深夜小野草| 欧美日韩一区二区三区在线看| 一区二区三区在线不卡| 91论坛在线播放| 伊人一区二区三区| 欧美三级乱人伦电影| 三级久久三级久久久| 欧美理论片在线| 日本欧美大码aⅴ在线播放| 欧美精品日韩一区| 日韩二区三区在线观看| 337p亚洲精品色噜噜噜| 蜜臀av一区二区| 久久在线观看免费| 国产91丝袜在线播放九色| 国产精品三级久久久久三级| 99视频在线观看一区三区| 亚洲欧美日韩人成在线播放| 欧美亚洲一区二区三区四区| 亚洲国产一区二区视频| 91麻豆精品国产91| 久久99国内精品| 久久午夜色播影院免费高清| 成人黄色电影在线| 亚洲欧美一区二区三区久本道91| 欧美最新大片在线看| 亚洲sss视频在线视频| 欧美一级高清片在线观看| 国产乱码字幕精品高清av| 中文字幕第一区| 日本韩国一区二区三区视频| 午夜久久久久久久久久一区二区| 日韩视频免费观看高清完整版在线观看 | 亚洲综合在线第一页| 欧美日韩精品二区第二页| 久久97超碰色| 国产精品视频线看| 在线观看欧美日本| 久久99久久精品| 国产精品久久久久毛片软件| 色94色欧美sute亚洲线路二| 奇米影视一区二区三区小说| 欧美韩国一区二区| 欧美视频一区二区三区四区 | 久久久久久久久久久黄色| 精品少妇一区二区三区视频免付费| 中文字幕在线一区| 日本伊人色综合网| 欧美主播一区二区三区| 热久久国产精品| 欧美国产97人人爽人人喊| 欧美色综合天天久久综合精品| 开心九九激情九九欧美日韩精美视频电影 | 欧美日韩国产a| 国产精品1区2区3区在线观看| 一区二区三区四区高清精品免费观看| 欧美一卡2卡三卡4卡5免费| 成人综合婷婷国产精品久久免费| 亚洲午夜精品久久久久久久久| 久久精品视频在线看| 欧美丰满嫩嫩电影| 99精品桃花视频在线观看| 久久精品国产澳门| 一区二区激情小说| 国产亚洲精品久| 欧美一区二区三区视频免费| a级精品国产片在线观看| 麻豆一区二区三| 亚洲一线二线三线久久久| 国产调教视频一区| 日韩色视频在线观看| 91国产视频在线观看| 成人晚上爱看视频| 精一区二区三区| 午夜精品免费在线观看| 国产精品久久久久久亚洲毛片 | 欧洲精品一区二区三区在线观看| 国产成人在线视频免费播放| 日本人妖一区二区| 亚洲成人资源在线| 亚洲同性gay激情无套| 日本一区二区三区四区在线视频| 51精品久久久久久久蜜臀| 欧美中文字幕一区二区三区亚洲| 成人一区在线看| 狠狠色丁香久久婷婷综合丁香| 亚洲国产日韩精品| 一区av在线播放| 亚洲欧美日韩综合aⅴ视频| 国产精品久久久久久久久图文区| 久久综合久久鬼色中文字| 欧美一级在线视频| 欧美日韩国产一二三| 精品视频在线免费看| 欧美综合一区二区| 日本道在线观看一区二区| 99riav一区二区三区| 成av人片一区二区|