1 /**
2  * Copyright (c) 2013 - 2017, Nordic Semiconductor ASA
3  *
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without modification,
7  * are permitted provided that the following conditions are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright notice, this
10  *    list of conditions and the following disclaimer.
11  *
12  * 2. Redistributions in binary form, except as embedded into a Nordic
13  *    Semiconductor ASA integrated circuit in a product or a software update for
14  *    such product, must reproduce the above copyright notice, this list of
15  *    conditions and the following disclaimer in the documentation and/or other
16  *    materials provided with the distribution.
17  *
18  * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
19  *    contributors may be used to endorse or promote products derived from this
20  *    software without specific prior written permission.
21  *
22  * 4. This software, with or without modification, must only be used with a
23  *    Nordic Semiconductor ASA integrated circuit.
24  *
25  * 5. Any software provided in binary form under this license must not be reverse
26  *    engineered, decompiled, modified and/or disassembled.
27  *
28  * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
29  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
30  * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
31  * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
32  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
34  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
37  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38  *
39  */
40 //#include "sdk_common.h"
41 //#if NRF_MODULE_ENABLED(CRC16)
42 #include "crc16.h"
43 
44 #include <stdlib.h>
45 
util_crc16_compute(uint8_t const * p_data,uint32_t size,uint16_t const * p_crc)46 uint16_t util_crc16_compute(uint8_t const *p_data, uint32_t size, uint16_t const *p_crc)
47 {
48     uint16_t crc = (p_crc == NULL) ? 0xFFFF : *p_crc;
49 
50     for (uint32_t i = 0; i < size; i++)
51     {
52         crc = (uint8_t)(crc >> 8) | (crc << 8);
53         crc ^= p_data[i];
54         crc ^= (uint8_t)(crc & 0xFF) >> 4;
55         crc ^= (crc << 8) << 4;
56         crc ^= ((crc & 0xFF) << 4) << 1;
57     }
58 
59     return crc;
60 }
61 
util_crc16_ccitt(uint8_t const * p_data,uint32_t size,uint16_t const * p_crc)62 uint16_t util_crc16_ccitt(uint8_t const *p_data, uint32_t size, uint16_t const *p_crc)
63 {
64     uint16_t crc = (p_crc == NULL) ? 0xFFFF : *p_crc;
65     uint8_t b = 0;
66 
67     if (p_crc == NULL)
68     {
69         b = 0;
70     }
71 
72     for (uint32_t i = 0; i < size; i++)
73     {
74         for (uint8_t j = 0; j < 8; j++)
75         {
76             b = ((p_data[i] << j) & 0x80) ^ ((crc & 0x8000) >> 8);
77             crc <<= 1;
78             if (b != 0)
79             {
80                 crc ^= 0x1021;
81             }
82         }
83     }
84 
85     return crc;
86 }
87 
88 //#endif //NRF_MODULE_ENABLED(CRC16)
89