1 /*
2  * Copyright (C) 2017-2020 Alibaba Group Holding Limited
3  */
4 
5 /******************************************************************************
6  * @file     crc.h
7  * @brief    Header File for CRC Driver
8  * @version  V1.0
9  * @date     02. June 2020
10  * @model    crc
11  ******************************************************************************/
12 
13 #ifndef _DRV_CRC_H_
14 #define _DRV_CRC_H_
15 
16 #include <stdint.h>
17 #include <drv/common.h>
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 /**
24  * \brief Compute the CRC-7 checksum of a buffer.
25  *
26  * See JESD84-A441.  Used by the MMC protocol.  Uses 0x09 as the
27  * polynomial with no reflection.  The CRC is left
28  * justified, so bit 7 of the result is bit 6 of the CRC.
29  * init = 0; poly = 0x09 refin = 0 refout = 0 xorout = 0
30  * \param[in] crc      Crc init value or crc immediate result
31  * \param[in] data     Data buf to be calculate
32  * \param[in] size     Data size
33  *
34  * \return    The computed CRC7 value
35  */
36 uint8_t csi_crc7_be(uint8_t crc, uint8_t *data, uint32_t size);
37 
38 /**
39  * \brief Compute the CRC-8 checksum of a buffer.
40  *  init = 0 or 0xff; poly = 0x07 refin = 0 refout = 0 xorout = 0
41  * \param[in] crc      Crc init value or crc immediate result
42  * \param[in] data     Data buf to be calculate
43  * \param[in] size     Data size
44  * \return    The computed CRC8 value
45  */
46 uint8_t csi_crc8(uint8_t crc, uint8_t *data, size_t size);
47 
48 /**
49  * \brief Compute the CRC-8 checksum of a buffer.
50  *  init = 0; poly = 0x31 refin = 1 refout = 1 xorout = 0
51  * \param[in] crc      Crc init value or crc immediate result
52  * \param[in] data     Data buf to be calculate
53  * \param[in] size     Data size
54  * \return    The computed CRC8 value
55  */
56 uint8_t csi_crc8_maxim(uint8_t crc, uint8_t *data, size_t size);
57 
58 /**
59  * \brief Compute the CRC-16 checksum of a buffer.
60  *   init = 0 or 0xffff; poly = 0x8005 refin = 1 refout = 1 xorout = 0
61  * \param[in] crc      Crc init value or crc immediate result
62  * \param[in] data     Data buf to be calculate
63  * \param[in] size     Data size
64  * \return    The computed CRC16 without xorout
65  */
66 uint16_t csi_crc16(uint16_t crc, uint8_t *data, uint32_t size);
67 
68 /**
69  * \brief Compute the CRC-16 checksum of a buffer.
70  *  init = 0; poly = 0x1021 refin = 1 refout = 1 xorout = 0
71  * \param[in] crc      Crc init value or crc immediate result
72  * \param[in] data     Data buf to be calculate
73  * \param[in] size     Data size
74  * \return    The computed CRC16 without xorout
75  */
76 uint16_t csi_crc16_ccitt(uint16_t crc, uint8_t *data, uint32_t size);
77 
78 /**
79  * \brief Compute the CRC-16 checksum of a buffer.
80  *  init = 0; poly = 0x3d65 refin = 1 refout = 1 xorout = 0xffff
81  * \param[in] init_value      Crc init value
82  * \param[in] data            Data buf to be calculate
83  * \param[in] size            Data size
84  * \return    The computed CRC16 with xorout
85  */
86 uint16_t csi_crc16_dnp(uint16_t init_value, uint8_t *data, uint32_t size);
87 
88 /**
89  * \brief Compute the CRC-16 checksum of a buffer.
90  *  init = 0; poly = 0x1021 refin = 0 refout = 0 xorout = 0
91  * \param[in] crc      Crc init value or crc immediate result
92  * \param[in] data     Data buf to be calculate
93  * \param[in] size     Data size
94  * \return    The computed CRC16 without xorout
95  */
96 uint16_t csi_crc16_itu(uint16_t crc, uint8_t *data, uint32_t size);
97 
98 /**
99  * \brief Compute the CRC-32 checksum of a buffer.Little-endian by bit.
100  *  init = 0; poly = 0xEDB88320 refin = 0 refout = 0 xorout = 0
101  * \param[in] crc      Crc init value or crc immediate result
102  * \param[in] data     Data buf to be calculate
103  * \param[in] size     Data size
104  * \return    The computed CRC32 without xorout
105  */
106 uint32_t csi_crc32_le(uint32_t crc, uint8_t *data, uint32_t size);
107 
108 /**
109  * \brief Compute the CRC-32 checksum of a buffer.Big-endian by bit.
110  *  init = 0; poly = 0x04C11DB7 refin = 0 refout = 0 xorout = 0
111  * \param[in] crc      Crc init value or crc immediate result
112  * \param[in] data     Data buf to be calculate
113  * \param[in] size     Data size
114  * \return    The computed CRC32 without xorout
115  */
116 uint32_t csi_crc32_be(uint32_t crc, uint8_t *data, uint32_t size);
117 
118 #ifdef __cplusplus
119 }
120 #endif
121 
122 #endif /* _DRV_CRC_H_ */
123