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

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

?? ccp.c

?? ccp
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*----------------------------------------------------------------------------
| File:
|   ccp.c
|
| Project:
|   CCP driver
|
| Description:
|   CCP driver main module
|
 ----------------------------------------------------------------------------*/

/* CCP Definitions and Parameters */
#include "ccp.h"

#ifndef C_DISABLE_CCP

/* Version History:

   V1.29, 24.9.2000
    - new define CCP_CHECKSUM_BLOCKSIZE
   V1.30, 29.11.2000
    - #ifndef CCP_EXTERNAL_STATION_ID
   V1.31, 08.02.2001,
    - new define CCP_DAQ_BASE_ADDR
    - new function ccpGetDaqPointer
   V1.32, 30.05.2001,
    - Reserved word "data" in KEIL Compiler for C5x5
    - Prefix CCP_ for all #defines
   V1.33, 14.09.2001
    - #define CCP_ODT_ENTRY_SIZE
    - #define CCP_INTEL,CCP_MOTOROLA
   V1.34, 28.10.2001
    - ccpSend return value removed
      Transmission error handling should be done by the user
   V1.35, 8.4.2002
    - #define CCP_CPUTYPE_32BIT
    - Max checksum block size is DWORD on 32 bit CPUs
   V1.36, 2.6.2002
    - #undef CCP_DAQ for drivers without DAQ fixed
    - double - float conversion for SHORT_UPLOAD, DNLOAD and DAQ
   V1.37, 17.7.2002
    - Fixed the version nr. because the version was in the comment 1.36 but 135
    - was define.
    - Set #define CCP_DRIVER_VERSION to 137
*/

#define CCP_DRIVER_VERSION 137




/*--------------------------------------------------------------------------*/
/* Performance measurements */

#ifndef CCP_PROFILE

  #define SET_PORT_BIT(i)
  #define RST_PORT_BIT(i)

#else

  /*
  t[0] - ccpCommand
  t[1] - ccpCallBack
  t[2] - ccpBackground
  t[3] - ccpDaq
  */
  unsigned int t0[4],t[4];
  #define SET_PORT_BIT(i) t0[i-1]=ccpGetTimestamp();
  #define RST_PORT_BIT(i) t[i-1]=T3-t0[i-1];

#endif


/*--------------------------------------------------------------------------*/
/* Test */

#ifdef CCP_TESTMODE
  #include <stdio.h>
  static void ccpPrintCANapeSettings( void );
  static void ccpPrintDaqList( CCP_BYTE daq );
#endif


/*--------------------------------------------------------------------------*/
/* ROM */
/*--------------------------------------------------------------------------*/

/*
   Identification
   Must be 0 terminated !!

   This string is used by CANape as the ASAP2 database filename
   The extension .A2L or .DB is added by CANape
*/
#ifdef CCP_EXTERNAL_STATION_ID
  extern ROM CCP_BYTE ccpStationId[];
#else
  CCP_ROM CCP_BYTE ccpStationId[] = CCP_STATION_ID;
#endif


/*--------------------------------------------------------------------------*/
/* RAM */
/*--------------------------------------------------------------------------*/

/*
   The following structure containes all RAM locations needed by the CCP driver
   It has to be word aligned on a C167 !!!
*/

CCP_RAM struct ccp ccp;


/*--------------------------------------------------------------------------*/
/* CODE */
/*--------------------------------------------------------------------------*/

/*--------------------------------------------------------------------------*/
/* Transmit */
/*--------------------------------------------------------------------------*/

/* Send a CRM, if no other message is pending */
void ccpSendCrm( void ) {

  CCP_DISABLE_INTERRUPT;

  if (ccp.SendStatus&CCP_SEND_PENDING) {

    ccp.SendStatus |= CCP_CRM_REQUEST;

  } else {

    ccp.SendStatus |= CCP_CRM_PENDING;
    ccpSend(ccp.Crm);

  }

  CCP_ENABLE_INTERRUPT;
}


/* Send a DTM, if no other message is pending */
#ifdef CCP_DAQ
#ifndef CCP_SEND_QUEUE
static void ccpSendDtm( void ) {

  CCP_DISABLE_INTERRUPT;

  if (ccp.SendStatus&CCP_SEND_PENDING) {

    ccp.SendStatus |= CCP_DTM_REQUEST;

  } else {

    ccp.SendStatus |= CCP_DTM_PENDING;
    ccpSend(ccp.Dtm);

  }

  CCP_ENABLE_INTERRUPT;
}
#endif
#endif


/*--------------------------------------------------------------------------*/
/* Transmit Queue */
/*--------------------------------------------------------------------------*/
#ifdef CCP_SEND_QUEUE

void ccpQueueInit(void) {

  ccp.Queue.len = 0;
  ccp.Queue.rp = 0;
}

CCP_BYTE ccpQueueWrite(ccpMsg_t *msg) {

  if (ccp.Queue.len>=CCP_SEND_QUEUE_SIZE) return 0;
  ccp.Queue.msg[(ccp.Queue.rp+ccp.Queue.len)%CCP_SEND_QUEUE_SIZE] = *msg;
  ccp.Queue.len++;
  return 1;
}

#endif


/*--------------------------------------------------------------------------*/
/* Handle MTAs (Memory-Transfer-Address) */
/*--------------------------------------------------------------------------*/

/* Assign a pointer to a MTA */
#define ccpSetMTA(n,p) ccp.MTA[n] = p;

/* Write n bytes */
static CCP_BYTE ccpWriteMTA( CCP_BYTE n, CCP_BYTE size, CCP_BYTEPTR d ) {

  /* EEPROM write access */
  #ifdef CCP_WRITE_EEPROM
    CCP_BYTE r = ccpCheckWriteEEPROM(ccp.MTA[n],size,d);
    if (r) { /* EEPROM write access */
      ccp.MTA[n] += size;
      return r;
    }
  #endif

  /* Checked ram memory write access */
  #ifdef CCP_WRITE_PROTECTION
    if (!ccpCheckWriteAccess(ccp.MTA[n],size)) {
      ccp.MTA[n] += size;
      return CCP_WRITE_DENIED;
    }
  #endif

   /* double conversion */
   #ifdef CCP_DOUBLE_FLOAT
     if (size==8) {
       *(double*)ccp.MTA[n] = *(float*)d;
       #ifdef CCP_TESTMODE
         if (gDebugLevel>=2) CCPPRINT("[ccpWriteMTA] conversion -> double %g\n",*(double*)ccp.MTA[n]);
       #endif
       ccp.MTA[n] += 8;
       return CCP_WRITE_OK;
     }
   #endif

   while (size-->0) {
     /* COSMIC Compiler Bug: *(ccp.MTA[n]++) = *(d++);  */
     *(ccp.MTA[n]) = *d;
     ccp.MTA[n]++;
     d++;
   }
   return CCP_WRITE_OK;
}

/* Read n bytes */
static void ccpReadMTA( CCP_BYTE n, CCP_BYTE size, CCP_BYTEPTR d ) {

  /* EEPROM read access */
  #ifdef CCP_READ_EEPROM
    if (ccpCheckReadEEPROM(ccp.MTA[n],size,d)) {
      ccp.MTA[n] += size;
      return;
    }
  #endif

  /* double conversion */
  #ifdef CCP_DOUBLE_FLOAT
    if (size==8) {
      *(float*)d = (float)(*(double*)(ccp.MTA[n]));
      #ifdef CCP_TESTMODE
        if (gDebugLevel>=2) CCPPRINT("[ccpReadMTA] conversion -> float %g\n",(double)(*(float*)d));
      #endif
      return;
    }
  #endif

  while (size-->0) {
    *d = *(ccp.MTA[n]);
    d++;
    ccp.MTA[n]++;
  }
}


/*--------------------------------------------------------------------------*/
/* Data Aquisition Setup */
/*--------------------------------------------------------------------------*/

#ifdef CCP_DAQ

/* Clear DAQ list */
static CCP_BYTE ccpClearDaqList( CCP_BYTE daq ) {

  CCP_BYTEPTR p;
  CCP_BYTEPTR pl;

  if (daq>=CCP_MAX_DAQ) return 0;

  /* Clear this daq list to zero */
  p = (CCP_BYTEPTR)&ccp.DaqList[daq];
  pl = p+sizeof(ccpDaqList_t);
  while (p<pl) *p++ = 0;

  /* @@@@ Not DAQ list specific */
  ccp.SessionStatus |= SS_DAQ;
  #ifdef CCP_SEND_SINGLE
    ccp.CurrentDaq = 0;
    ccp.CurrentOdt = 0;
  #endif
  #ifdef CCP_SEND_QUEUE
    ccpQueueInit();
  #endif

  return CCP_MAX_ODT;
}

/* Prepare DAQ */
static CCP_BYTE ccpPrepareDaq(  CCP_BYTE daq, CCP_BYTE last, CCP_BYTE eventChannel, CCP_WORD prescaler ) {

  if (daq>=CCP_MAX_DAQ) return 0;

  ccp.DaqList[daq].eventChannel = eventChannel;
  if (prescaler==0) prescaler = 1;
  ccp.DaqList[daq].prescaler = prescaler;
  ccp.DaqList[daq].cycle = 1;
  ccp.DaqList[daq].last = last;
  ccp.DaqList[daq].flags = DAQ_FLAG_PREPARED;
  return 1;
}

/* Start DAQ */
static CCP_BYTE ccpStartDaq( CCP_BYTE daq ) {

  if (daq>=CCP_MAX_DAQ) return 0;

  ccp.DaqList[daq].flags = DAQ_FLAG_START;
  ccp.SessionStatus |= SS_RUN;

  #ifdef CCP_TIMESTAMPING
    ccpClearTimestamp();
  #endif

  return 1;
}

/* Start all prepared DAQs */
static void ccpStartAllPreparedDaq(void) {

  CCP_BYTE q;

  for (q=0;q<CCP_MAX_DAQ;q++) {
    if (ccp.DaqList[q].flags==DAQ_FLAG_PREPARED) ccp.DaqList[q].flags = DAQ_FLAG_START;
  }
  ccp.SessionStatus |= SS_RUN;

  #ifdef CCP_TIMESTAMPING
    ccpClearTimestamp();
  #endif
}

/* Stop DAQ */
static void ccpStopDaq ( CCP_BYTE daq ) {

  CCP_BYTE i;

  if (daq>=CCP_MAX_DAQ) return;
  ccp.DaqList[daq].flags = 0;

  /* check if all DAQ lists are stopped */
  for (i=0;i<CCP_MAX_DAQ;i++) {
    if (ccp.DaqList[i].flags&DAQ_FLAG_START) return;
  }

  ccp.SessionStatus &= ~SS_RUN;
}

/* Stop all DAQs */
static void ccpStopAllDaq( void ) {

  CCP_BYTE q;

  for (q=0;q<CCP_MAX_DAQ;q++) ccp.DaqList[q].flags = 0;
  ccp.SessionStatus &= ~SS_RUN;
}


/*--------------------------------------------------------------------------*/
/* Data Aquisition Processor */
/*--------------------------------------------------------------------------*/

#ifndef CCP_SEND_SINGLE

/* Sample and transmit a DTM */
static int ccpSampleAndTransmitDtm( CCP_BYTE pid, CCP_BYTE daq, CCP_BYTE odt ) {

  #ifdef CCP_SEND_QUEUE
    CCP_BYTE dtm[8];
  #else
    #define dtm ccp.Dtm
  #endif
  #ifdef CCP_DAQ_BASE_ADDR
    CCP_BYTEPTR p;
  #else
    CCP_DAQBYTEPTR p;
  #endif
  #ifdef CCP_ODT_ENTRY_SIZE
    CCP_BYTE s;
    CCP_BYTE *d,*dl;
    ccpOdtEntry_t *e,*el;
  #else
    CCP_BYTE i;
    ccpOdtEntry_t *e;
  #endif

  /* PID */
  dtm[0] = pid;

  /* Assure data consistency */
  CCP_DISABLE_INTERRUPT;

  /* Sample */
  #ifdef CCP_ODT_ENTRY_SIZE

    e = &ccp.DaqList[daq].odt[odt][0];
    el = e+8;
    d = &dtm[1];
    dl = d+7;
    while (d<dl && e<el && e->ptr) {
      #ifdef CCP_DAQ_BASE_ADDR
        p = (CCP_BYTEPTR)( e->ptr ) + CCP_DAQ_BASE_ADDR;
      #else
        p = e->ptr;
      #endif
      s = e->siz;
      #ifdef CCP_DOUBLE_FLOAT
        if (s==8) {
           *(float*)d = (float)(*(double*)p);
          s = 4;
          #ifdef CCP_TESTMODE
           if (gDebugLevel>=2) CCPPRINT("[ccpSampleAndTransmitDtm] conversion -> float %g\n",*(float*)d);
          #endif
        } else
      #endif
      if (s==4) {
        *(CCP_DWORD*)d = *(CCP_DWORD*)p;
      } else if (s==2) {
        *(CCP_WORD*)d = *(CCP_WORD*)p;
      } else {
        *d = *p;
      }
      d += s;
      e++;
    }

  #else

    e =  &ccp.DaqList[daq].odt[odt][0];
    for (i=1;i<8;i++) {
      #ifdef CCP_DAQ_BASE_ADDR
        p = (CCP_BYTEPTR)( (e++)->ptr ) + CCP_DAQ_BASE_ADDR;
      #else
        p = (e++)->ptr;
      #endif
      if (p) dtm[i] = *p;
    }

  #endif

  /* Optional for CANape: Put a timestamp in the first ODT (Byte6+7) of each DAQ */
  #ifdef CCP_TIMESTAMPING
    if (odt==0) {
      *(CCP_WORD*)&dtm[6] = ccpGetTimestamp();
    }
  #endif

  /* Queue or transmit the DTM */
  #ifdef CCP_SEND_QUEUE

    if (ccp.SendStatus&CCP_SEND_PENDING) {
      if (!ccpQueueWrite((ccpMsg_t*)dtm)) {
        /* Overun */
        CCP_ENABLE_INTERRUPT;
        return 0;
      }
    } else {
      ccp.SendStatus |= CCP_DTM_PENDING;
      ccpSend(dtm);
    }

  #else

    if (ccp.SendStatus&CCP_DTM_REQUEST) {
      /* Overun */
      CCP_ENABLE_INTERRUPT;
      return 0;
    }
    if (ccp.SendStatus&CCP_SEND_PENDING) {
      ccp.SendStatus |= CCP_DTM_REQUEST;
    } else {
      ccp.SendStatus |= CCP_DTM_PENDING;
      ccpSend(dtm);
    }

  #endif

  CCP_ENABLE_INTERRUPT;
  return 1;

}


#else


/* Sample and transmit the next DTM in SEND_SINGLE mode */
static void ccpSampleAndSendNextDtm( void ) {

  CCP_BYTE i,j;
  CCP_DAQBYTEPTR p;
  ccpOdtEntry_t *e;

  /* Request for DTM transmission pending */
  if (ccp.SendStatus&CCP_DTM_REQUEST) return;

  /* Find a DAQ list marked for transmission */
  for (i=0;i<CCP_MAX_DAQ;i++) {

    if (ccp.DaqList[ccp.CurrentDaq].flags&DAQ_FLAG_SEND) {

      /* PID */
      ccp.Dtm[0] = ccp.CurrentDaq*CCP_MAX_ODT+ccp.CurrentOdt;

      /* Sample */
      e =  &ccp.DaqList[ccp.CurrentDaq].odt[ccp.CurrentOdt][0];
      for (j=1;j<8;j++) {
        p = (e++)->ptr;
        if (p) ccp.Dtm[j] = *p;
      }

      /* Send */
      ccpSendDtm();

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美巨大另类极品videosbest| 国产精品99久久久久久似苏梦涵| 精品久久久三级丝袜| av高清不卡在线| 美女网站一区二区| 亚洲一区二区三区在线播放| 国产三级一区二区| 91精品国产91热久久久做人人| 91丝袜高跟美女视频| 国产成人日日夜夜| 精品在线观看视频| 婷婷六月综合网| 一区二区三区在线免费播放| 国产精品久久久久久久裸模| 精品播放一区二区| 欧美一区二区成人| 欧美日韩一区 二区 三区 久久精品| aa级大片欧美| 成人avav影音| 国产成人av一区| 国产成人精品综合在线观看| 狠狠色综合日日| 久久精品国产精品亚洲红杏| 日韩不卡免费视频| 日韩av网站在线观看| 午夜视频在线观看一区二区三区| 综合激情网...| 最新中文字幕一区二区三区 | 久久久综合视频| 日韩欧美电影在线| 日韩欧美一区二区视频| 欧美一区二区人人喊爽| 欧美猛男gaygay网站| 欧美最新大片在线看| 日本丶国产丶欧美色综合| 91麻豆123| 欧美色图在线观看| 欧美日韩综合在线免费观看| 在线看一区二区| 欧美性受xxxx黑人xyx| 欧美午夜寂寞影院| 欧美一区二区视频网站| 日韩免费性生活视频播放| 欧美成人精品福利| 久久久久久久久伊人| 国产亚洲短视频| 国产精品久久久久婷婷| 亚洲日本中文字幕区| 亚洲一区二区三区四区在线| 日韩不卡手机在线v区| 狠狠色丁香久久婷婷综合_中| 九色porny丨国产精品| 国产一区二区主播在线| 不卡一区在线观看| 在线观看国产91| 欧美一区二区在线视频| 精品国产欧美一区二区| 国产精品私房写真福利视频| 亚洲欧美激情插| 亚洲高清免费在线| 久久精品国产免费看久久精品| 国产成人无遮挡在线视频| 99精品久久99久久久久| 欧美久久免费观看| 精品奇米国产一区二区三区| 国产精品久久久久久久第一福利| 一区二区三区中文免费| 免费一级欧美片在线观看| 国产成人丝袜美腿| 欧美性猛交一区二区三区精品| 日韩精品一区国产麻豆| 国产精品久久综合| 日韩成人免费电影| 99久久99久久久精品齐齐| 欧美精品欧美精品系列| 欧美激情一区不卡| 午夜精品影院在线观看| 国产乱码精品一区二区三区五月婷| 成人av电影在线网| 日韩视频在线永久播放| 中文字幕在线一区免费| 蜜臀99久久精品久久久久久软件 | 91麻豆精品国产| 久久久久国产精品人| 一区二区三区四区中文字幕| 久草中文综合在线| 欧美午夜影院一区| 国产欧美一区二区精品仙草咪| 亚洲另类在线视频| 国产乱码字幕精品高清av| 欧美日韩精品是欧美日韩精品| 欧美国产一区二区在线观看| 性做久久久久久久免费看| 9i看片成人免费高清| 精品国产一区二区三区忘忧草| 一级日本不卡的影视| 国产成人精品免费视频网站| 91精品国产一区二区人妖| 亚洲美女视频在线| 风流少妇一区二区| 欧美mv日韩mv亚洲| 三级成人在线视频| 91在线视频播放地址| 国产丝袜欧美中文另类| 裸体一区二区三区| 欧美日韩一级黄| 一区二区三区中文字幕精品精品| 国产精品综合在线视频| 欧美一区二区成人| 午夜欧美在线一二页| 色屁屁一区二区| 中文字幕亚洲精品在线观看 | av电影在线不卡| 久久久美女艺术照精彩视频福利播放| 亚洲二区在线观看| 色狠狠色噜噜噜综合网| 亚洲欧美在线视频| 成人精品一区二区三区中文字幕| 精品奇米国产一区二区三区| 日本视频一区二区三区| 欧美日韩欧美一区二区| 亚洲国产精品一区二区www在线 | 成人看片黄a免费看在线| 26uuu久久综合| 国内久久精品视频| 精品日韩在线一区| 久久99精品国产麻豆婷婷洗澡| 欧美一区二区性放荡片| 美女诱惑一区二区| 欧美一区二区三区不卡| 免费成人av资源网| 日韩欧美123| 国产一区欧美二区| 国产人成亚洲第一网站在线播放| 国内精品伊人久久久久av影院| 精品成人免费观看| 国产成人夜色高潮福利影视| 国产精品嫩草久久久久| 不卡区在线中文字幕| 亚洲视频在线观看一区| 色偷偷久久人人79超碰人人澡| 一区二区日韩av| 欧美人成免费网站| 久久精品国产精品亚洲精品| 精品国偷自产国产一区| 国产福利91精品| 综合欧美一区二区三区| 欧美无乱码久久久免费午夜一区| 亚洲一区二区精品3399| 7777精品伊人久久久大香线蕉经典版下载 | 精品免费国产二区三区| 国产精品一品二品| 亚洲视频一二三区| 在线观看日韩av先锋影音电影院| 视频一区视频二区中文| 欧美电影免费观看完整版| 国产精品一级在线| 一区二区在线观看免费视频播放| 欧美日韩国产另类一区| 美女视频免费一区| 国产精品久线观看视频| 欧美视频在线一区二区三区| 久久99精品国产麻豆婷婷| 国产精品久久久久影院色老大| 91黄色免费版| 久久成人久久鬼色| 亚洲女子a中天字幕| 欧美一区二区三区不卡| 成人精品电影在线观看| 亚洲国产精品久久久男人的天堂 | 欧美激情自拍偷拍| 欧美午夜在线观看| 久久精品国产网站| 亚洲精品伦理在线| 日韩一区二区三区免费看| 东方欧美亚洲色图在线| 污片在线观看一区二区| 欧美极品美女视频| 欧美日韩电影一区| 北岛玲一区二区三区四区| 日韩av电影一区| 亚洲少妇30p| 亚洲精品一区二区精华| 在线视频综合导航| 国产馆精品极品| 三级在线观看一区二区| 国产精品女主播av| 777xxx欧美| 91美女视频网站| 国产高清精品在线| 免费观看日韩电影| 亚洲愉拍自拍另类高清精品| 久久久久久综合| 欧美剧情片在线观看| 91免费版pro下载短视频| 国内外成人在线| 日韩国产精品91| 一二三四社区欧美黄| 国产精品国产三级国产普通话三级| 欧美一区二区三区四区五区|