11ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/*
21ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * Copyright (C) 2010-2014 NXP Semiconductors
31ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *
41ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * Licensed under the Apache License, Version 2.0 (the "License");
51ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * you may not use this file except in compliance with the License.
61ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * You may obtain a copy of the License at
71ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *
81ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *      http://www.apache.org/licenses/LICENSE-2.0
91ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao *
101ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * Unless required by applicable law or agreed to in writing, software
111ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * distributed under the License is distributed on an "AS IS" BASIS,
121ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * See the License for the specific language governing permissions and
141ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * limitations under the License.
151ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao */
161ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
171ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/*
181ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * Download Component
191ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao * Download Utility routines implementation
201ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao */
211ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
221ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#include <phDnldNfc_Utils.h>
231ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao#include <phNxpLog.h>
241ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
256fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoistatic uint16_t const aCrcTab[256] = {
266fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108,
276fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210,
286fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b,
296fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401,
306fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee,
316fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6,
326fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d,
336fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
346fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5,
356fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc,
366fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4,
376fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd,
386fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13,
396fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a,
406fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e,
416fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
426fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1,
436fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb,
446fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0,
456fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8,
466fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657,
476fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9,
486fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882,
496fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
506fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e,
516fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07,
526fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d,
536fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74,
546fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    0x2e93, 0x3eb2, 0x0ed1, 0x1ef0};
551ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
561ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao/*******************************************************************************
571ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
581ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Function         phDnldNfc_CalcCrc16
591ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
601ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Description      Calculates CRC16 for the frame buffer
611ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
621ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Parameters       pBuff - CRC16 calculation input buffer
631ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**                  wLen  - input buffer length
641ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
651ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao** Returns          wCrc  - computed 2 byte CRC16 value
661ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao**
671ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao*******************************************************************************/
686fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoiuint16_t phDnldNfc_CalcCrc16(uint8_t* pBuff, uint16_t wLen) {
696fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t wTmp;
706fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t wValue;
716fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint16_t wCrc = 0xffff;
726fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  uint32_t i;
731ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
746fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  if ((NULL == pBuff) || (0 == wLen)) {
756fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    NXPLOG_FWDNLD_W("Invalid Params supplied!!");
766fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  } else {
776fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    /* Perform CRC calculation according to ccitt with a initial value of 0x1d0f
786fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi     */
796fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi    for (i = 0; i < wLen; i++) {
806fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      wValue = 0x00ffU & (uint16_t)pBuff[i];
816fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      wTmp = (wCrc >> 8U) ^ wValue;
826fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi      wCrc = (wCrc << 8U) ^ aCrcTab[wTmp];
831ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao    }
846fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  }
851ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao
866fca02d5010de7bd31d83b853c32138021da5f29Ruchi Kandoi  return wCrc;
871ab8a755853d5118d6a504311d079bd5aa21a964Jizhou Liao}
88