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

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

?? stk500protocol.c

?? 可用來自做的AVR-USB-ISP的源碼,內符電路圖,用AVR M8來模擬USB接口
?? C
字號:
/************************************************************************************************ * Project: USB AVR-ISP * Author: Christian Ulrich
 * Contact: christian at ullihome dot de
 * * Creation Date: 2007-03-22 * Copyright: (c) 2007 by Christian Ulrich * License: GPLv2 ***********************************************************************************************/
#include <stdint.h>
#include <stdio.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <avr/eeprom.h>
#include "stk500protocol.h"
#include "usb_uart.h"
#include "isp.h"
#include "timer.h"
#include "led.h"
#include "main.h"

#include <util/delay.h>

#define BUFFER_SIZE     281 /* results in 275 bytes max body size */#define RX_TIMEOUT      200 /* timeout in milliseconds */#define STK_TXMSG_START 5static uint8_t        Buffer[BUFFER_SIZE];static uint16_t       rxPos;
static uint16_t  	  rxLen;static uint16_t  	  txLen;

uint8_t    STK500_Status;
stkParam_t STK500_Param;
uint32_t   STK500_Address;
uint8_t eeSoftwareMajor EEMEM;
uint8_t eeSoftwareMinor EEMEM;

void STK500_init()
{
  STK500_Status = PGM_STATUS_IDLE;
  STK500_Param.s.softwareVersionMajor = eeprom_read_byte(&eeSoftwareMajor);
  STK500_Param.s.softwareVersionMinor = eeprom_read_byte(&eeSoftwareMinor);
  if (STK500_Param.s.softwareVersionMajor > 0xa)
    {
      STK500_Param.s.softwareVersionMajor = 2;
      STK500_Param.s.softwareVersionMinor = 0xa;
	}
  STK500_Param.s.hardwareVersion = 1;
}

void STK500_save()
{
  eeprom_write_byte(&eeSoftwareMajor,STK500_Param.s.softwareVersionMajor);
  eeprom_write_byte(&eeSoftwareMinor,STK500_Param.s.softwareVersionMinor);
}
  

void STK500_sendmessage()
{
  uint8_t *p = Buffer, sum = 0;
  uint16_t len;  *p++ = STK_STX;  *p++ = Buffer[1];  /* sequence number */  *p++ = txLen >> 8;  *p++ = txLen;  *p++ = STK_TOKEN;

  len = txLen+6;  txLen = len--;  p = Buffer;  while(len--)
    sum ^= *p++;  *p = sum;
  p = Buffer;
  while (txLen--)
    UART_putc(*p++);}

void STK500_processmessage()
{
  txLen = 2;
  uint16_t i;
  uint8_t res = 0;
  uint8_t Address_as_byte = 0;
  uint16_t len;
  uint8_t tmp;

  switch (Buffer[STK_TXMSG_START])
    {
	  case STK_CMD_SIGN_ON:
	    {
          static PROGMEM uint8_t STK500_initstring[] = {8, 'S', 'T', 'K', '5', '0', '0', '_', '2', 0};          uint8_t *p = &Buffer[STK_TXMSG_START + 2];          strcpy_P(p, STK500_initstring);          Buffer[STK_TXMSG_START + 1] = STK_STATUS_CMD_OK;          txLen = 11;
		  break; 
        }
      case STK_CMD_SET_PARAMETER:
	    {          STK500_Param.bytes[Buffer[STK_TXMSG_START + 1] & 0x1f] = Buffer[STK_TXMSG_START + 2];		  if (Buffer[STK_TXMSG_START + 1] == STK_PARAM_SCK_DURATION)
		    {              switch (Buffer[STK_TXMSG_START + 2])
                {
                case 0xfe:
				case 0x4c:
				case 0x3:ISP_Speed = 1;break;
                case 0x2:ISP_Speed = 2;break;
                case 0x1:ISP_Speed = 4;break;
                case 0x0:ISP_Speed = 6;
                }
            } 
          Buffer[STK_TXMSG_START + 1] = STK_STATUS_CMD_OK;		  break;
        }
      case STK_CMD_GET_PARAMETER:
	    {
		  if (Buffer[STK_TXMSG_START + 1] == STK_PARAM_SCK_DURATION)
		    {              switch (ISP_Speed)
                {
                case 1:STK500_Param.s.sckDuration = 0xfe;break;
                case 2:
				case 3:STK500_Param.s.sckDuration = 0x2;break;
                case 4:
				case 5:STK500_Param.s.sckDuration = 0x1;break;
                case 6:
				case 7:STK500_Param.s.sckDuration = 0x0;
                }
            } 
          else if (Buffer[STK_TXMSG_START + 1] == STK_PARAM_VTARGET)
		    {
#if defined(USBASP_COMPATIBLE)||defined(CCCB_COMPATIBLE)
  		  	  STK500_Param.s.vTarget = 50;
#else
			  STK500_Param.s.vTarget = ISP_getsupplyvoltage();
#endif
			}  
          Buffer[STK_TXMSG_START + 2] = STK500_Param.bytes[Buffer[STK_TXMSG_START + 1] & 0x1f];          Buffer[STK_TXMSG_START + 1] = STK_STATUS_CMD_OK;          txLen = 3;
		  break;
        } 
      case STK_CMD_ENTER_PROGMODE_ISP:
	    {
          if (PGM_statuschanged != NULL)
		    PGM_statuschanged(PGM_STATUS_PROGRAMMING);   
          STK500_Status = PGM_STATUS_PROGRAMMING;
		  ISP_connect();
		  if (ISP_enterprogrammingmode() == 0)
            Buffer[STK_TXMSG_START + 1] = STK_STATUS_CMD_OK;
          else
            Buffer[STK_TXMSG_START + 1] = STK_STATUS_CMD_FAILED;
		  break;
		} 
      case STK_CMD_LEAVE_PROGMODE_ISP:
	    {
		  ISP_disconnect();
          Buffer[STK_TXMSG_START + 1] = STK_STATUS_CMD_OK;
          if (PGM_statuschanged != NULL)
		    PGM_statuschanged(PGM_STATUS_IDLE);   
          STK500_Status = PGM_STATUS_IDLE;
		  break;
		}
      case STK_CMD_CHIP_ERASE_ISP:
	    {
		  ISP_erase();
     	  TIMER_delay(((stkChipEraseIsp_t*) &Buffer[STK_TXMSG_START + 1])->eraseDelay);
          Buffer[STK_TXMSG_START + 1] = STK_STATUS_CMD_OK;
		  break;
		}
      case STK_CMD_READ_FUSE_ISP:
	  case STK_CMD_READ_LOCK_ISP:
	  case STK_CMD_READ_SIGNATURE_ISP:
	  case STK_CMD_READ_OSCCAL_ISP:
	    {
		  for (i=0;i<4;i++)
            if (i == ((stkReadFuseIsp_t*) &Buffer[STK_TXMSG_START + 1])->retAddr-1)
		      res = ISP_transmit(((stkReadFuseIsp_t*) &Buffer[STK_TXMSG_START + 1])->cmd[i]);
		    else
		      ISP_transmit(((stkReadFuseIsp_t*) &Buffer[STK_TXMSG_START + 1])->cmd[i]);
          Buffer[STK_TXMSG_START + 1] = STK_STATUS_CMD_OK;
		  Buffer[STK_TXMSG_START + 2] = res;	 
          Buffer[STK_TXMSG_START + 3] = STK_STATUS_CMD_OK;
		  txLen = 4;		  break;
		}
      case STK_CMD_PROGRAM_LOCK_ISP:
      case STK_CMD_PROGRAM_FUSE_ISP:
	    {
		  for (i=0;i<4;i++)
     		ISP_transmit(((stkProgramFuseIsp_t*) &Buffer[STK_TXMSG_START + 1])->cmd[i]);
          Buffer[STK_TXMSG_START + 1] = STK_STATUS_CMD_OK;
          Buffer[STK_TXMSG_START + 2] = STK_STATUS_CMD_OK;
		  txLen = 3;
		  break;		}
	  case STK_CMD_LOAD_ADDRESS:
	    {
          STK500_Address  = Buffer[STK_TXMSG_START + 1];
          STK500_Address  = (STK500_Address << 8)|Buffer[STK_TXMSG_START + 2];
          STK500_Address  = (STK500_Address << 8)|Buffer[STK_TXMSG_START + 3];
          STK500_Address  = (STK500_Address << 8)|Buffer[STK_TXMSG_START + 4]; 		  
          Buffer[STK_TXMSG_START + 1] = STK_STATUS_CMD_OK;
          break;        }
      case STK_CMD_PROGRAM_EEPROM_ISP:
	    Address_as_byte = 1;
      case STK_CMD_PROGRAM_FLASH_ISP:
	    {
          #define progFlashParam ((stkProgramFlashIsp_t*) &Buffer[STK_TXMSG_START + 1])  
          
		  uint8_t valuePollingMask, rdyPollingMask; 
          uint8_t pollmode;
		  uint16_t startaddress = STK500_Address;
		  res = STK_STATUS_CMD_OK;
          len=  ((int)progFlashParam->numBytes[0])<<8;          len|= progFlashParam->numBytes[1]; 

          for (i=0;i<len;i++)
		    {
			  if ((i&8)==8)
			    usbPoll();
			  if (!Address_as_byte)
                ISP_transmit(progFlashParam->cmd[0] | ((i & 1) << 3));
              else                 ISP_transmit(progFlashParam->cmd[0]);
              ISP_transmit(STK500_Address>>8);              ISP_transmit(STK500_Address);
			  ISP_transmit(progFlashParam->data[i]);
			  if (!Address_as_byte)
      		    {
				  if (i&1)
				    STK500_Address++;
				}
              else  
			    STK500_Address++;
        	  if (progFlashParam->mode & 1) //page mode
			    {
				  if ((i < len-1) || !(progFlashParam->mode & 0x80)) continue;
				  //write page
                  ISP_transmit(progFlashParam->cmd[1]);
                  ISP_transmit(startaddress >> 8);                  ISP_transmit(startaddress);                  ISP_transmit(0);                  valuePollingMask = 0x20;                  rdyPollingMask = 0x40;
				}
			  else //word mode
			    {
                  valuePollingMask = 4;                  rdyPollingMask = 8; 
				}
              pollmode = progFlashParam->mode; 
              if (progFlashParam->poll[0] == progFlashParam->data[i])
			    pollmode = 0;
              //poll
/*              if (pollmode & valuePollingMask)
			    { //value polling
				  
//                  TIMER_start(progFlashParam->delay);         		  tmp = progFlashParam->poll[0];
				  while (tmp == progFlashParam->poll[0])
				    {
                      if (!Address_as_byte)
                        ISP_transmit(progFlashParam->cmd[2] | ((i & 1) << 3));
                      else                         ISP_transmit(progFlashParam->cmd[2]);
                      ISP_transmit(STK500_Address >> 8);                      ISP_transmit(STK500_Address);
                      tmp = ISP_transmit(0);
					  tmp = 0;
                      if(TIMER_overflowed())
					    {                          res = STK_STATUS_CMD_TOUT;
						  break;
						}                    }
				}
              else */if (pollmode & rdyPollingMask)
                { //ready polling
                  TIMER_start((progFlashParam->delay));                  while(ISP_deviceisbusy())
				    {
//					  usbPoll();
                      if(TIMER_overflowed())                        res = STK_STATUS_RDY_BSY_TOUT;
                    }                  res = STK_STATUS_CMD_OK;				}
              else
			    { //timed polling
   			      TIMER_start(progFlashParam->delay);
                  while (TIMER_timeout)
				    usbPoll();				  res = STK_STATUS_CMD_OK;
				}
            }
          Buffer[STK_TXMSG_START + 1] = res;
		  break;
		} 
      case STK_CMD_READ_EEPROM_ISP: 
	    Address_as_byte = 1;
      case STK_CMD_READ_FLASH_ISP:
	    {
		  len = (((stkReadFlashIsp_t*) &Buffer[STK_TXMSG_START + 1])->numBytes[0]<<8)+((stkReadFlashIsp_t*) &Buffer[STK_TXMSG_START + 1])->numBytes[1];
		  tmp = ((stkReadFlashIsp_t*) &Buffer[STK_TXMSG_START + 1])->cmd;
          for (i=0;i<len;i++)
		    {
     		  MAIN_critical_tasks(); //keep main tasks alive (wdt,usb)
              if (!Address_as_byte)
                ISP_transmit(tmp | ((i & 1) << 3));
              else                 ISP_transmit(tmp);
              ISP_transmit(STK500_Address >> 8);              ISP_transmit(STK500_Address);
              Buffer[STK_TXMSG_START + 2 + i] = ISP_transmit(0);
			  if (!Address_as_byte)
      		    {
				  if (i&1)
				    STK500_Address++;
				}
              else  
			    STK500_Address++;
		    }
          Buffer[STK_TXMSG_START + 1] = STK_STATUS_CMD_OK;
		  Buffer[STK_TXMSG_START + 1 + len + 1] = STK_STATUS_CMD_OK;
		  txLen = len+3;		  break;
		}      case STK_CMD_SPI_MULTI:
	    {
          #define progMultiParam ((stkMultiIsp_t*) &Buffer[STK_TXMSG_START + 1])  
		  uint8_t lentx = progMultiParam->numTx;
		  uint8_t lenrx = progMultiParam->numRx;
		  uint8_t rxstart = progMultiParam->rxStartAddr;
		  uint8_t rxpos = 1;
		  for (i = 1;i<lentx+1;i++)
		    {
			  if (i >= rxstart)
			    {
				  Buffer[STK_TXMSG_START + 1 + rxpos] = ISP_transmit(progMultiParam->txData[i]);
				  rxpos++;
				}
              else
			    ISP_transmit(progMultiParam->txData[i]);
			}
		  while (rxpos < lenrx)
		    {
			  Buffer[STK_TXMSG_START + 1 + rxpos] = ISP_transmit(progMultiParam->txData[i]);
			  rxpos++;
			}
          Buffer[STK_TXMSG_START + 1] = STK_STATUS_CMD_OK;
		  Buffer[STK_TXMSG_START + 1 + lenrx + 1] = STK_STATUS_CMD_OK;
		  txLen = lenrx+3;		  break;
		}
      default:
	    {
          Buffer[STK_TXMSG_START + 1] = STK_STATUS_CMD_FAILED;
		}	   
	}
  STK500_sendmessage();
}
void STK500_byterecived(uint8_t data)
{
  if(rxPos == 0)
    {       if (data == STK_STX)        Buffer[rxPos++] = data;    }
  else
    {      if(rxPos < BUFFER_SIZE)
	    {          Buffer[rxPos++] = data;          if (rxPos == 4)
		    {              rxLen = (Buffer[2] << 8)+Buffer[3];              rxLen += 6;              if(rxLen > BUFFER_SIZE) //wrong length
			    {
                rxPos = 0;
				}            }
		  else if (rxPos == 5)
		    {              if(data != STK_TOKEN)
			    {
                rxPos = 0;
				}            }
		  else if (rxPos > 4 && rxPos == rxLen)
		    {                 uint8_t sum = 0;//calculate chksum                uint8_t *p = Buffer;                while(rxPos)
				  {                     sum ^= *p++;                    rxPos--;                  }                if(sum == 0) //chksum ok
				  { 
                    STK500_processmessage();                  }
				else //chksum error
 				  {                    Buffer[STK_TXMSG_START] = STK_ANSWER_CKSUM_ERROR;                    Buffer[STK_TXMSG_START + 1] = STK_ANSWER_CKSUM_ERROR;					txLen = 3;                    STK500_sendmessage();
                  }            }        }
	  else
	    { 
          rxPos = 0;        }    }}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
高清不卡一区二区在线| 一区二区三区电影在线播| 欧美色综合网站| 91黄色免费看| 欧美猛男男办公室激情| 欧美视频一区二区在线观看| 欧美伊人久久久久久午夜久久久久| 99视频一区二区| 99精品欧美一区二区蜜桃免费| av男人天堂一区| 色哟哟精品一区| 欧美日韩在线播放一区| 在线综合视频播放| 久久综合久久久久88| 国产日韩欧美电影| 日韩理论片在线| 亚洲在线观看免费| 日本伊人色综合网| 国产一区二区三区久久久| 成人一道本在线| 91成人免费网站| 欧美岛国在线观看| 中文字幕日本不卡| 五月天一区二区三区| 国产一区欧美一区| 在线一区二区三区| 精品成人免费观看| 亚洲精品国产高清久久伦理二区| 丝袜国产日韩另类美女| 国内成+人亚洲+欧美+综合在线 | 欧美一区二区视频网站| 精品奇米国产一区二区三区| 亚洲国产精品精华液2区45| 一二三四社区欧美黄| 国产一区二区中文字幕| 欧洲av一区二区嗯嗯嗯啊| 精品伦理精品一区| 夜夜嗨av一区二区三区中文字幕 | 一色桃子久久精品亚洲| 亚洲午夜精品网| 高清久久久久久| 7777女厕盗摄久久久| 国产精品视频一二三| 蜜桃av噜噜一区二区三区小说| 成人激情黄色小说| 日韩美一区二区三区| 一区二区国产盗摄色噜噜| 国产精品69毛片高清亚洲| 欧美日韩国产美女| 亚洲欧美日韩成人高清在线一区| 国内精品伊人久久久久av一坑| 色婷婷亚洲一区二区三区| 国产区在线观看成人精品| 偷窥少妇高潮呻吟av久久免费| 91在线高清观看| 国产欧美日韩卡一| 国产激情视频一区二区在线观看| 欧美顶级少妇做爰| 亚洲高清免费视频| 在线免费观看日韩欧美| 日韩欧美三级在线| 美女性感视频久久| 3751色影院一区二区三区| 亚洲国产毛片aaaaa无费看 | 一本久久精品一区二区| 欧美国产禁国产网站cc| 九九**精品视频免费播放| 日韩一区二区在线观看视频 | 日韩欧美国产午夜精品| 亚洲成人一区二区在线观看| 日本精品视频一区二区| 亚洲激情综合网| 欧美吻胸吃奶大尺度电影 | 日韩欧美精品三级| 日韩中文字幕不卡| 欧美一级日韩不卡播放免费| 久久精品国产亚洲aⅴ| 日韩视频免费直播| 韩国一区二区三区| 日本一区二区免费在线| 成人一区二区三区视频在线观看 | 91丨porny丨首页| 亚洲免费视频成人| 欧美揉bbbbb揉bbbbb| 视频一区二区不卡| 精品国产乱码久久久久久影片| 国内精品写真在线观看| 国产精品网站一区| 91视频免费看| 日韩成人免费电影| 久久精品欧美一区二区三区不卡 | 亚洲777理论| 欧美一区二区三区在线电影| 麻豆免费看一区二区三区| 欧美成人a∨高清免费观看| 国产一区 二区| 1区2区3区精品视频| 精品视频在线看| 激情综合色丁香一区二区| 国产欧美日韩在线| 色婷婷国产精品| 捆绑调教美女网站视频一区| 中文幕一区二区三区久久蜜桃| 日本精品一区二区三区高清| 卡一卡二国产精品| 亚洲日本护士毛茸茸| 欧美一区二区三区成人| 成人精品国产福利| 日本亚洲天堂网| 国产日产欧美精品一区二区三区| 色欧美88888久久久久久影院| 午夜伦欧美伦电影理论片| 久久亚洲一级片| 91福利在线看| 成人sese在线| 久久99精品久久久久久动态图| 综合久久久久久久| www国产精品av| 欧美久久久一区| av中文字幕亚洲| 国产在线视频一区二区| 亚洲电影第三页| 国产精品每日更新在线播放网址| 欧美在线免费播放| 不卡免费追剧大全电视剧网站| 免费成人av在线播放| 亚洲欧美激情视频在线观看一区二区三区| 欧美一区二区三区思思人| 91久久精品网| a美女胸又www黄视频久久| 国产精品一区二区三区99| 亚洲国产精品麻豆| 亚洲激情自拍偷拍| 日韩美女视频19| 中文成人综合网| 国产丝袜欧美中文另类| 日韩欧美国产高清| 91精品国产综合久久久蜜臀粉嫩| 91蝌蚪国产九色| 99国产精品国产精品久久| 国产91精品免费| 国产精品影视在线| 美腿丝袜一区二区三区| 日日夜夜精品免费视频| 亚洲一区二区3| 一区二区成人在线| 亚洲乱码一区二区三区在线观看| 中文字幕的久久| 国产精品视频一二三| 国产精品久久久久aaaa| 国产精品看片你懂得| 综合激情成人伊人| 亚洲免费观看在线视频| 亚洲最大的成人av| 亚洲国产精品人人做人人爽| 视频在线观看91| 麻豆精品视频在线观看免费| 日本中文字幕一区| 美女视频一区二区| 国产精品一区专区| 高清国产一区二区| 色八戒一区二区三区| 欧美三级欧美一级| 日韩精品中文字幕在线不卡尤物 | 久久99久国产精品黄毛片色诱| 久久夜色精品国产欧美乱极品| 国产亚洲1区2区3区| 精品欧美一区二区久久| 2020国产精品| 国产精品美女一区二区三区 | 粉嫩一区二区三区在线看| 成人精品国产一区二区4080| 91麻豆成人久久精品二区三区| 欧洲精品一区二区三区在线观看| 欧美精品少妇一区二区三区| 日韩免费观看高清完整版| 久久久久久综合| 蜜桃在线一区二区三区| 久久99国产精品久久99果冻传媒| 成人综合激情网| 欧美日韩免费视频| 久久久精品人体av艺术| 成人免费小视频| 久久精品国产免费| 99精品欧美一区二区蜜桃免费| 欧美日精品一区视频| 久久久久久久久岛国免费| 亚洲制服丝袜av| 国产成人亚洲综合a∨猫咪| 欧美色区777第一页| 久久久国产精华| 丝袜诱惑制服诱惑色一区在线观看| 国产一区二区三区不卡在线观看| 91久久精品国产91性色tv| 欧美精品一区二区三区在线 | 欧美成人bangbros| 亚洲乱码中文字幕| 国产一区二区看久久| 欧美精品在线一区二区三区| 中文字幕乱码久久午夜不卡|