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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? ssp.c

?? Application of Bootstrap Loader in MSP430 With Flash Hardware and Software Proposal
?? C
字號:
/****************************************************************
*
* Copyright (C) 1999-2000 Texas Instruments, Inc.
* Author: Volker Rzehak
*
*----------------------------------------------------------------
* All software and related documentation is provided "AS IS" and 
* without warranty or support of any kind and Texas Instruments 
* expressly disclaims all other warranties, express or implied, 
* including, but not limited to, the implied warranties of 
* merchantability and fitness for a particular purpose. Under no 
* circumstances shall Texas Instruments be liable for any 
* incidental, special or consequential damages that result from 
* the use or inability to use the software or related 
* documentation, even if Texas Instruments has been advised of 
* the liability.
*
* Unless otherwise stated, software written and copyrighted by 
* Texas Instruments is distributed as "freeware". You may use 
* and modify this software without any charge or restriction. 
* You may distribute to others, as long as the original author 
* is acknowledged.
*
****************************************************************/

#include <string.h>
#include <stdio.h>
#include <windows.h>
#include "ssp.h"

/* Global Constants: */

/* Size of internal WINDOWS-Comm-Buffer: */
#define QUEUE_SIZE       512 

#define MAX_FRAME_COUNT   16
#define MAX_ERR_COUNT      5

/* Global Variables: */
const unsigned short protocolMode= MODE_BSL;
HANDLE       hComPort;    /* COM-Port Handle             */
DCB          comDCB;      /* COM-Port Control-Settings   */
COMSTAT      comState;    /* COM-Port Status-Information */
COMMTIMEOUTS orgTimeouts; /* Original COM-Port Time-out  */

/* Time in milliseconds until a timeout occurs: */
DWORD timeout      = DEFAULT_TIMEOUT; 
/* Factor by which the timeout after sending a frame is prolonged: */
int prolongFactor= DEFAULT_PROLONG; 

/* Variable to save the latest error (used by comGetLastError): */
int lastError;     

BYTE seqNo, reqNo, txPtr, rxPtr;
BYTE rxFrame[MAX_FRAME_SIZE];

DWORD nakDelay; /* Delay before DATA_NAK will be send */

/***************************************************************/
DWORD calcTimeout(DWORD startTime) /* exported! */
/* Calculates the difference between startTime and the acutal
 * windows time (in milliseconds).
 */
{
  return((DWORD)(GetTickCount() - startTime));
}

/*-------------------------------------------------------------*/
void delay(DWORD time) /* exported! */
/* Delays the execution by a given time in ms.
 */
{ 
#ifndef WIN32
  DWORD startTime= GetTickCount();
  while (calcTimeout(startTime) < time);
#else
  Sleep(time);
#endif
}

/*-------------------------------------------------------------*/
WORD calcChecksum(BYTE data[], WORD length)
/* Calculates a checksum of "data".
 */
{
  WORD* i_data;
  WORD checksum= 0;
  BYTE i= 0;

  i_data= (WORD*)data;

  for (i= 0; i < length/2; i++)
  { 
    checksum^= i_data[i];    /* xor-ing   */
  }
  return(checksum ^ 0xffff); /* inverting */
}

/*-------------------------------------------------------------*/
int comWaitForData(int count, DWORD timeout) /* exported! */
/* Waits until a given number (count) of bytes was received or a
 * given time (timeout) has passed.
 */
{
  DWORD errors;
  int rxCount= 0;
  DWORD startTime= GetTickCount();
  do
  { 
    ClearCommError(hComPort, &errors, &comState);
  } while (((rxCount= comState.cbInQue) < count) && 
           (calcTimeout(startTime) <= timeout));

  return(rxCount);
}

/*-------------------------------------------------------------*/
int comRxHeader(BYTE *rxHeader, BYTE *rxNum, 
                DWORD timeout)
{
  BYTE Hdr;
  DWORD dwRead;

  if (comWaitForData(1, timeout) >= 1)
  { 
    ReadFile(hComPort, &Hdr, 1, &dwRead, NULL);
    *rxHeader= Hdr & 0xf0;
    *rxNum   = Hdr & 0x0f;

    if (protocolMode == MODE_BSL)
    { reqNo= 0;
      seqNo= 0;
      *rxNum= 0; 
    }

    return(ERR_NONE);
  }
  else
  { 
    *rxHeader= 0; 
    *rxNum= 0;
    return(lastError= ERR_RX_HDR_TIMEOUT);
  }
}

/*-------------------------------------------------------------*/
void comTxHeader(const BYTE txHeader)
{
  DWORD dwWrite;
  BYTE Hdr= txHeader;

  WriteFile(hComPort, &Hdr, 1, &dwWrite, NULL);
}

/***************************************************************/
int comGetLastError()
/* Returns the error code generated by the last function call to
 * a SERCOMM-Function.  If this function returned without errors, 
 * comGetLastError will return zero (errNoError) as well.
 */
{ return(lastError); }

/***************************************************************/
int comInit(LPCSTR lpszDevice, DWORD aTimeout, int aProlongFactor)
/* Tries to open the serial port given in 'lpszDevice' and
 * initialises the port and global variables.
 * The timeout and the number of allowed errors is multiplied by
 * 'aProlongFactor' after transmission of a command to give
 * plenty of time to the micro controller to finish the command.
 * Returns zero if the function is successful.
 */
{
  COMMTIMEOUTS timeouts;
  DWORD dwCommEvents;

  /* Init. global variables: */

  seqNo= 0; 
  reqNo= 0;
  rxPtr= 0;
  txPtr= 0;

  timeout= aTimeout;
  prolongFactor= aProlongFactor;
  
  hComPort= CreateFile(lpszDevice, GENERIC_READ | GENERIC_WRITE, 
                       0, 0, OPEN_EXISTING, 0, 0);
  /* In this application the serial port is used in 
   * nonoverlapped mode! 
   */
  if (hComPort == INVALID_HANDLE_VALUE)
  {	
    hComPort= 0;
    return (lastError= ERR_OPEN_COMM); /* Error! */
  }
  if (SetupComm(hComPort, QUEUE_SIZE, QUEUE_SIZE) == 0)
  { 
    CloseHandle(hComPort);
	hComPort= 0;
    return (lastError= ERR_OPEN_COMM); /* Error! */
  }

  /* Save original timeout values: */
  GetCommTimeouts(hComPort, &orgTimeouts);
  /* Set Windows timeout values (disable build-in timeouts): */
  timeouts.ReadIntervalTimeout= 0;
  timeouts.ReadTotalTimeoutMultiplier= 0;
  timeouts.ReadTotalTimeoutConstant= 0;
  timeouts.WriteTotalTimeoutMultiplier= 0;
  timeouts.WriteTotalTimeoutConstant= 0;
  if (!SetCommTimeouts(hComPort, &timeouts))
  { 
    CloseHandle(hComPort);
	hComPort= 0;
    return (lastError= ERR_OPEN_COMM); /* Error! */
  }

  dwCommEvents= EV_RXCHAR | EV_TXEMPTY | EV_RXFLAG | EV_ERR;
  SetCommMask(hComPort, dwCommEvents);


  /* Get state and modify it: */
  if (!GetCommState(hComPort, &comDCB))
  { 
    CloseHandle(hComPort);
	hComPort= 0;
    return (lastError= ERR_OPEN_COMM); /* Error! */
  }

    comDCB.BaudRate    = CBR_9600; /* Startup-Baudrate: 9,6kBaud */
    comDCB.ByteSize    = 8;
    nakDelay= (DWORD)((11*MAX_FRAME_SIZE)/9.6);

  comDCB.Parity      = EVENPARITY;   
  comDCB.StopBits    = ONESTOPBIT;
  comDCB.fBinary     = TRUE; /* Enable Binary Transmission */
  comDCB.fParity     = TRUE; /* Enable Parity Check        */
  comDCB.ErrorChar   = (char)0xff; 
  /* Char. w/ Parity-Err are replaced with 0xff 
   *(if fErrorChar is set to TRUE) 
   */
  comDCB.fRtsControl = RTS_CONTROL_ENABLE; /* For power supply */
  comDCB.fDtrControl = DTR_CONTROL_ENABLE; /* For power supply */
                       
  comDCB.fOutxCtsFlow= FALSE;        comDCB.fOutxDsrFlow= FALSE;        
  comDCB.fOutX       = FALSE;        comDCB.fInX        = FALSE;
  comDCB.fNull       = FALSE;

    comDCB.fErrorChar   = FALSE; 

  /* Assign new state: */
  if (!SetCommState(hComPort, &comDCB))
  { 
    CloseHandle(hComPort);
	hComPort= 0;
    return(lastError= ERR_SET_COMM_STATE); /* Error! */
  }

  /* Clear buffers: */
  PurgeComm(hComPort, PURGE_TXCLEAR | PURGE_TXABORT);
  PurgeComm(hComPort, PURGE_RXCLEAR | PURGE_RXABORT);

  return(lastError= 0);
} /* comInit */

/***************************************************************/
int comDone()
/* Closes the used serial port. 
 * This function must be called at the end of a program,
 * otherwise the serial port might not be released and can not be
 * used in other programs.
 * Returns zero if the function is successful.
 */
{
  DWORD errors;
  DWORD startTime= GetTickCount();
  /* Wait until data is transmitted, but not too long... (Timeout-Time) */
  do
  { 
    ClearCommError(hComPort, &errors, &comState);
  } while ((comState.cbOutQue > 0) && 
           (calcTimeout(startTime) < timeout));

  /* Clear buffers: */
  PurgeComm(hComPort, PURGE_TXCLEAR | PURGE_TXABORT);
  PurgeComm(hComPort, PURGE_RXCLEAR | PURGE_RXABORT);
  /* Restore original timeout values: */
  SetCommTimeouts(hComPort, &orgTimeouts);
  /* Close COM-Port: */
  if (!CloseHandle(hComPort))
    return(lastError= ERR_CLOSE_COMM); /* Error! */
  else
    return(lastError= ERR_NONE);
} /* comDone */


/***************************************************************/

/*-------------------------------------------------------------*/
int comRxFrame(BYTE *rxHeader, BYTE *rxNum)
{
  DWORD dwRead;
  WORD checksum;
  BYTE* rxLength;
  WORD rxLengthCRC;

  rxFrame[0]= DATA_FRAME | *rxNum;

  if (comWaitForData(3, timeout) >= 3)
  {
    ReadFile(hComPort, &rxFrame[1], 3, &dwRead, NULL);
    
    if ((rxFrame[1] == 0) && (rxFrame[2] == rxFrame[3]))
    {
      rxLength= &rxFrame[2];      /* Pointer to rxFrame[2]   */
      rxLengthCRC= *rxLength + 2; /* Add CRC-Bytes to length */
        
      if (comWaitForData(rxLengthCRC, timeout) >= rxLengthCRC)
      {
        ReadFile(hComPort, &rxFrame[4], rxLengthCRC, &dwRead, NULL);

        /* Check received frame: */
        checksum= calcChecksum(rxFrame, (WORD)(*rxLength+4)); 
                  /* rxLength+4: Length with header but w/o CRC */

        if ((rxFrame[*rxLength+4] == (BYTE)checksum) && 
            (rxFrame[*rxLength+5] == (BYTE)(checksum >> 8)))
        {
          return(ERR_NONE); 
          /* Frame received correctly (=> send next frame) */
        } /* if (Checksum correct?)        */
      } /* if (Data: no timeout?)          */
    } /* if (Add. header info. correct?)   */
  } /* if (Add. header info.: no timeout?) */

  return(ERR_COM); /* Frame has errors! */
}  /* comRxFrame */

/*-------------------------------------------------------------*/
int comTxRx(BYTE cmd, BYTE dataOut[], BYTE length)
/* Sends the command cmd with the data given in dataOut to the
 * microcontroller and expects either an acknowledge or a frame
 * with result from the microcontroller.  The results are stored
 * in dataIn (if not a NULL pointer is passed).
 * In this routine all the necessary protocol stuff is handled.
 * Returns zero if the function was successful.
 */
{
  DWORD dwWrite;
  DWORD errors;
  BYTE txFrame[MAX_FRAME_SIZE];
  WORD checksum= 0;
  int k= 0;
  int errCtr= 0;
  int resendCtr= 0;
  BYTE rxHeader= 0;
  BYTE rxNum= 0;
  int resentFrame= 0;
  int pollCtr= 0;

  /* Transmitting part ----------------------------------------*/
  /* Prepare data for transmit */
  if ((length % 2) != 0)
  { /* Fill with one byte to have even number of bytes to send */
    if (protocolMode == MODE_BSL)
      dataOut[length++]= 0xFF; // fill with 0xFF
    else                    
      dataOut[length++]= 0;    // fill with zero 
  }

  txFrame[0]= DATA_FRAME | seqNo;
  txFrame[1]= cmd; 
  txFrame[2]= length;
  txFrame[3]= length;

  reqNo= (seqNo + 1) % MAX_FRAME_COUNT;

  memcpy(&txFrame[4], dataOut, length);

  checksum= calcChecksum(txFrame, (WORD)(length+4));
  txFrame[length+4]= (BYTE)(checksum);
  txFrame[length+5]= (BYTE)(checksum >> 8);

  {
    WORD accessAddr= (0x0212 + (checksum^0xffff)) & 0xfffe;
                     /* 0x0212: Address of wCHKSUM */
    if (BSLMemAccessWarning && (accessAddr < BSL_CRITICAL_ADDR))
    {
      printf("WARNING: This command might change data "
             "at address %x or %x!\n", 
             accessAddr, accessAddr + 1);
    }
  }

  /* Transmit data: */
  k= 0;

  /* Clear receiving queue: */
  PurgeComm(hComPort, PURGE_RXCLEAR | PURGE_RXABORT);
  do
  {
    WriteFile(hComPort, &txFrame[k++], 1, &dwWrite, NULL);
    
    ClearCommError(hComPort, &errors, &comState);
  } while ((k < length + 6) && (comState.cbInQue == 0));
  /* Check after each transmitted character, 
   * if microcontroller did send a character (probably a NAK!).
   */

  /* Receiving part -------------------------------------------*/
  rxFrame[2]= 0;
  rxFrame[3]= 0; /* Set lengths of received data to 0! */

  do
  {
    lastError= 0; /* Clear last error */
    if (comRxHeader(&rxHeader, &rxNum, timeout*prolongFactor) == 0) 
        /* prolong timeout to allow execution of sent command */
    { /* => Header received */
      do
      {
        resentFrame= 0;
        switch (rxHeader)
        { case DATA_ACK:
            if (rxNum == reqNo)
            { seqNo= reqNo;
              return(lastError= ERR_NONE); 
              /* Acknowledge received correctly => next frame */
            }
          break; /* case DATA_ACK */

          case DATA_NAK:
              return(lastError= ERR_RX_NAK);
          break; /* case DATA_NAK */

          case DATA_FRAME:
            if (rxNum == reqNo)
              if (comRxFrame(&rxHeader, &rxNum) == 0)
                return(lastError= ERR_NONE);
          break; /* case DATA_FRAME */

          case CMD_FAILED:
            /* Frame ok, but command failed. */
            return(lastError= ERR_CMD_FAILED); 
          break; /* case CMD_FAILED */

          default:
            ;
        } /* switch */
        
          errCtr= MAX_ERR_COUNT;
      } while ((resentFrame == 0) && (errCtr < MAX_ERR_COUNT));
    } /* if (comRxHeader) */
    else
    { /* => Timeout while receiving header */
        errCtr= MAX_ERR_COUNT;
    } /* else (comRxHeader) */
  } while (errCtr < MAX_ERR_COUNT);

  if (lastError == ERR_CMD_NOT_COMPLETED)
  { /* Accept QUERY_RESPONSE as real ACK and correct Seq.-No.: */
    seqNo= reqNo;
  }

  if (lastError == ERR_NONE)
    return(lastError= ERR_COM);
  else
    return(lastError);
} /* comTxRx */


/* EOF */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美午夜视频网站| 韩国成人在线视频| 国产三区在线成人av| 91精品国产一区二区人妖| 欧美日韩免费视频| 在线视频观看一区| 欧洲av在线精品| 欧美主播一区二区三区| 欧美亚洲综合色| 欧美色视频在线| 在线综合亚洲欧美在线视频| 欧美一区二区三区在线电影| 日韩午夜av电影| 精品不卡在线视频| 色婷婷综合在线| 欧美精品一区男女天堂| 日韩一区二区三区视频| 欧美一区二区免费观在线| 在线不卡免费欧美| 精品免费视频一区二区| 精品久久人人做人人爰| 国产欧美视频一区二区三区| 亚洲国产高清不卡| 伊人色综合久久天天人手人婷| 一区二区三区在线观看国产| 午夜精品成人在线视频| 久久国产精品一区二区| 国产精品18久久久久久久久久久久| 国产成+人+日韩+欧美+亚洲| 成人成人成人在线视频| 欧美日韩成人综合| 久久午夜羞羞影院免费观看| 亚洲欧洲成人av每日更新| 免费成人结看片| 欧美v国产在线一区二区三区| 99精品视频在线免费观看| 色婷婷综合五月| 精品久久久网站| 亚洲欧美另类综合偷拍| 蜜臀av一级做a爰片久久| 成人教育av在线| 91麻豆精品国产91久久久 | 日韩一二三区视频| 国产精品福利一区二区| 午夜精品福利视频网站| 成人在线视频一区| 777欧美精品| 亚洲天堂福利av| 激情六月婷婷久久| 欧美群妇大交群的观看方式| 国产色婷婷亚洲99精品小说| 亚洲国产综合在线| 成人教育av在线| 日韩精品一区二区三区视频| 亚洲精品第一国产综合野| 国产一二三精品| 欧美一级欧美一级在线播放| 亚洲欧美二区三区| 国产成人精品一区二区三区四区 | 亚洲国产综合在线| 成人的网站免费观看| 久久综合色婷婷| 久久精品国产网站| 4438x亚洲最大成人网| 亚洲乱码日产精品bd| 国产a级毛片一区| 久久婷婷国产综合国色天香| 日韩成人一级大片| 欧美久久久久久久久中文字幕| 亚洲日本丝袜连裤袜办公室| 国产精品99久久久久久似苏梦涵| 欧美一级一级性生活免费录像| 亚洲一区在线电影| 91福利资源站| 亚洲激情一二三区| av不卡免费在线观看| 婷婷开心久久网| 9l国产精品久久久久麻豆| 国产成人超碰人人澡人人澡| 日韩欧美综合在线| 免费视频最近日韩| 精品人在线二区三区| 免费欧美在线视频| 欧美精品一区二| 国产精品一区二区男女羞羞无遮挡| 日韩欧美中文字幕一区| 老司机精品视频一区二区三区| 日韩一级高清毛片| 经典三级视频一区| 国产欧美精品一区二区色综合| 国产高清一区日本| 国产精品成人一区二区艾草 | 欧美影院一区二区三区| 97精品超碰一区二区三区| 老鸭窝一区二区久久精品| 91麻豆精品国产自产在线观看一区| 91在线高清观看| 亚洲欧洲在线观看av| 91亚洲永久精品| 亚洲男人的天堂网| 欧美日韩一区二区三区在线看| 丝袜美腿亚洲色图| 精品区一区二区| 成人一区二区三区在线观看| 亚洲另类在线视频| 51精品秘密在线观看| 极品销魂美女一区二区三区| 中文字幕不卡三区| 欧美视频在线观看一区| 亚洲v精品v日韩v欧美v专区| 日韩一区二区三区精品视频| 成人性生交大合| 亚洲一区二区三区四区五区黄| av高清不卡在线| 97国产一区二区| 亚洲美女精品一区| 国产呦精品一区二区三区网站| 中文字幕欧美激情| 色婷婷国产精品久久包臀| 亚洲h动漫在线| 国产精品区一区二区三| 在线播放亚洲一区| 成人自拍视频在线| 亚洲v日本v欧美v久久精品| 欧美xxxxx裸体时装秀| 一本在线高清不卡dvd| 精品在线免费视频| 午夜欧美2019年伦理| 国产精品美女久久久久久| 欧美精品777| 91免费国产在线| 国产在线播放一区| 热久久免费视频| 中文字幕一区二区三区乱码在线| 7777精品伊人久久久大香线蕉完整版 | 经典三级一区二区| 亚洲日本在线看| 久久综合色综合88| 欧美日韩国产大片| 91日韩在线专区| 成人免费毛片a| 韩国一区二区三区| 精品一区二区三区视频在线观看| 亚洲一区二区精品3399| 国产精品久久精品日日| 久久亚洲一区二区三区明星换脸 | 美女网站色91| 亚洲国产精品影院| 亚洲精品视频在线观看网站| 国产精品九色蝌蚪自拍| 国产午夜久久久久| 国产欧美一区二区三区鸳鸯浴 | 国产一区二区三区免费在线观看| 亚洲成a人片在线不卡一二三区| 亚洲猫色日本管| 国产精品成人午夜| 亚洲视频综合在线| 最新中文字幕一区二区三区| 亚洲欧洲在线观看av| 国产精品色眯眯| 国产精品美女久久久久久久网站| 国产精品午夜春色av| 国产精品色哟哟| 亚洲欧美一区二区三区极速播放 | 亚洲国产视频a| 亚洲第一福利一区| 日本欧美韩国一区三区| 麻豆91小视频| 风间由美一区二区三区在线观看 | 91在线码无精品| 91丝袜呻吟高潮美腿白嫩在线观看| www.亚洲人| 欧美性猛交xxxx乱大交退制版| 欧美日韩国产高清一区二区三区| 欧美精品一二三| 精品福利一区二区三区免费视频| 久久精品视频免费| 亚洲精品免费视频| 日韩av一区二区在线影视| 久久99国内精品| 91视频国产资源| 91超碰这里只有精品国产| 久久久久九九视频| 一区二区三区在线视频播放| 天堂在线一区二区| 国产传媒日韩欧美成人| 91丨porny丨在线| 日韩免费高清电影| 国产精品成人免费在线| 日本成人在线不卡视频| 大美女一区二区三区| 欧美日韩一区二区三区在线看| 日韩欧美卡一卡二| 专区另类欧美日韩| 日本美女一区二区| bt欧美亚洲午夜电影天堂| 欧美一区二区福利在线| 国产精品嫩草影院av蜜臀| 日韩av一区二区在线影视| 成人手机电影网|