XCP_SIM
xcp_checksum.c
1 /*
2  * BlueParrot XCP
3  *
4  * (C) 2007-2022 by Christoph Schueler <github.com/Christoph2,
5  * cpu12.gems@googlemail.com>
6  *
7  * All Rights Reserved
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License along
20  * with this program; if not, write to the Free Software Foundation, Inc.,
21  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22  *
23  * s. FLOSS-EXCEPTION.txt
24  */
25 
27 /**********************************************************************
28  * Copyright (c) 2000 by Michael Barr. This software is placed into
29  * the public domain and may be used for any purpose. However, this
30  * notice must not be changed or removed and no warranty is either
31  * expressed or implied by its publication or distribution.
32  **********************************************************************/
33 
35 #include "xcp.h"
38 /*
39 ** Local Types
40 */
41 typedef enum tagXcp_ChecksumJobStateType {
42  XCP_CHECKSUM_STATE_IDLE,
43  XCP_CHECKSUM_STATE_RUNNING_INITIAL,
44  XCP_CHECKSUM_STATE_RUNNING_REMAINING,
45  XCP_CHECKSUM_STATE_RUNNING_FINAL
46 } Xcp_ChecksumJobStateType;
47 
48 typedef struct tagXcp_ChecksumJobType {
49  Xcp_ChecksumJobStateType state;
50  Xcp_MtaType mta;
51  uint32_t size;
52  Xcp_ChecksumType interimChecksum;
54 
55 #if XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_ADD_11
56 
57 #elif XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_ADD_12
58 
59 #elif XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_ADD_14
60 
61 #elif XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_ADD_22
62 
63 #elif XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_ADD_24
64 
65 #elif XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_ADD_44
66 
67 #elif XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_CRC_16
68 
69 #define XCP_CRC_NAME "CRC-16"
70 #define XCP_CRC_POLYNOMIAL ((uint16_t)0x8005)
71 #define XCP_CRC_INITIAL_VALUE ((uint16_t)0x0000)
72 #define XCP_CRC_FINAL_XOR_VALUE ((uint16_t)0x0000)
73 #define REFLECT_DATA XCP_TRUE
74 #define REFLECT_REMAINDER XCP_TRUE
75 #define CHECK_VALUE ((uint16_t)0xBB3D)
76 
77 static const uint16_t CRC_TAB[] = {
78  (uint16_t)0x0000, (uint16_t)0x8005, (uint16_t)0x800F, (uint16_t)0x000A,
79  (uint16_t)0x801B, (uint16_t)0x001E, (uint16_t)0x0014, (uint16_t)0x8011,
80  (uint16_t)0x8033, (uint16_t)0x0036, (uint16_t)0x003C, (uint16_t)0x8039,
81  (uint16_t)0x0028, (uint16_t)0x802D, (uint16_t)0x8027, (uint16_t)0x0022,
82  (uint16_t)0x8063, (uint16_t)0x0066, (uint16_t)0x006C, (uint16_t)0x8069,
83  (uint16_t)0x0078, (uint16_t)0x807D, (uint16_t)0x8077, (uint16_t)0x0072,
84  (uint16_t)0x0050, (uint16_t)0x8055, (uint16_t)0x805F, (uint16_t)0x005A,
85  (uint16_t)0x804B, (uint16_t)0x004E, (uint16_t)0x0044, (uint16_t)0x8041,
86  (uint16_t)0x80C3, (uint16_t)0x00C6, (uint16_t)0x00CC, (uint16_t)0x80C9,
87  (uint16_t)0x00D8, (uint16_t)0x80DD, (uint16_t)0x80D7, (uint16_t)0x00D2,
88  (uint16_t)0x00F0, (uint16_t)0x80F5, (uint16_t)0x80FF, (uint16_t)0x00FA,
89  (uint16_t)0x80EB, (uint16_t)0x00EE, (uint16_t)0x00E4, (uint16_t)0x80E1,
90  (uint16_t)0x00A0, (uint16_t)0x80A5, (uint16_t)0x80AF, (uint16_t)0x00AA,
91  (uint16_t)0x80BB, (uint16_t)0x00BE, (uint16_t)0x00B4, (uint16_t)0x80B1,
92  (uint16_t)0x8093, (uint16_t)0x0096, (uint16_t)0x009C, (uint16_t)0x8099,
93  (uint16_t)0x0088, (uint16_t)0x808D, (uint16_t)0x8087, (uint16_t)0x0082,
94  (uint16_t)0x8183, (uint16_t)0x0186, (uint16_t)0x018C, (uint16_t)0x8189,
95  (uint16_t)0x0198, (uint16_t)0x819D, (uint16_t)0x8197, (uint16_t)0x0192,
96  (uint16_t)0x01B0, (uint16_t)0x81B5, (uint16_t)0x81BF, (uint16_t)0x01BA,
97  (uint16_t)0x81AB, (uint16_t)0x01AE, (uint16_t)0x01A4, (uint16_t)0x81A1,
98  (uint16_t)0x01E0, (uint16_t)0x81E5, (uint16_t)0x81EF, (uint16_t)0x01EA,
99  (uint16_t)0x81FB, (uint16_t)0x01FE, (uint16_t)0x01F4, (uint16_t)0x81F1,
100  (uint16_t)0x81D3, (uint16_t)0x01D6, (uint16_t)0x01DC, (uint16_t)0x81D9,
101  (uint16_t)0x01C8, (uint16_t)0x81CD, (uint16_t)0x81C7, (uint16_t)0x01C2,
102  (uint16_t)0x0140, (uint16_t)0x8145, (uint16_t)0x814F, (uint16_t)0x014A,
103  (uint16_t)0x815B, (uint16_t)0x015E, (uint16_t)0x0154, (uint16_t)0x8151,
104  (uint16_t)0x8173, (uint16_t)0x0176, (uint16_t)0x017C, (uint16_t)0x8179,
105  (uint16_t)0x0168, (uint16_t)0x816D, (uint16_t)0x8167, (uint16_t)0x0162,
106  (uint16_t)0x8123, (uint16_t)0x0126, (uint16_t)0x012C, (uint16_t)0x8129,
107  (uint16_t)0x0138, (uint16_t)0x813D, (uint16_t)0x8137, (uint16_t)0x0132,
108  (uint16_t)0x0110, (uint16_t)0x8115, (uint16_t)0x811F, (uint16_t)0x011A,
109  (uint16_t)0x810B, (uint16_t)0x010E, (uint16_t)0x0104, (uint16_t)0x8101,
110  (uint16_t)0x8303, (uint16_t)0x0306, (uint16_t)0x030C, (uint16_t)0x8309,
111  (uint16_t)0x0318, (uint16_t)0x831D, (uint16_t)0x8317, (uint16_t)0x0312,
112  (uint16_t)0x0330, (uint16_t)0x8335, (uint16_t)0x833F, (uint16_t)0x033A,
113  (uint16_t)0x832B, (uint16_t)0x032E, (uint16_t)0x0324, (uint16_t)0x8321,
114  (uint16_t)0x0360, (uint16_t)0x8365, (uint16_t)0x836F, (uint16_t)0x036A,
115  (uint16_t)0x837B, (uint16_t)0x037E, (uint16_t)0x0374, (uint16_t)0x8371,
116  (uint16_t)0x8353, (uint16_t)0x0356, (uint16_t)0x035C, (uint16_t)0x8359,
117  (uint16_t)0x0348, (uint16_t)0x834D, (uint16_t)0x8347, (uint16_t)0x0342,
118  (uint16_t)0x03C0, (uint16_t)0x83C5, (uint16_t)0x83CF, (uint16_t)0x03CA,
119  (uint16_t)0x83DB, (uint16_t)0x03DE, (uint16_t)0x03D4, (uint16_t)0x83D1,
120  (uint16_t)0x83F3, (uint16_t)0x03F6, (uint16_t)0x03FC, (uint16_t)0x83F9,
121  (uint16_t)0x03E8, (uint16_t)0x83ED, (uint16_t)0x83E7, (uint16_t)0x03E2,
122  (uint16_t)0x83A3, (uint16_t)0x03A6, (uint16_t)0x03AC, (uint16_t)0x83A9,
123  (uint16_t)0x03B8, (uint16_t)0x83BD, (uint16_t)0x83B7, (uint16_t)0x03B2,
124  (uint16_t)0x0390, (uint16_t)0x8395, (uint16_t)0x839F, (uint16_t)0x039A,
125  (uint16_t)0x838B, (uint16_t)0x038E, (uint16_t)0x0384, (uint16_t)0x8381,
126  (uint16_t)0x0280, (uint16_t)0x8285, (uint16_t)0x828F, (uint16_t)0x028A,
127  (uint16_t)0x829B, (uint16_t)0x029E, (uint16_t)0x0294, (uint16_t)0x8291,
128  (uint16_t)0x82B3, (uint16_t)0x02B6, (uint16_t)0x02BC, (uint16_t)0x82B9,
129  (uint16_t)0x02A8, (uint16_t)0x82AD, (uint16_t)0x82A7, (uint16_t)0x02A2,
130  (uint16_t)0x82E3, (uint16_t)0x02E6, (uint16_t)0x02EC, (uint16_t)0x82E9,
131  (uint16_t)0x02F8, (uint16_t)0x82FD, (uint16_t)0x82F7, (uint16_t)0x02F2,
132  (uint16_t)0x02D0, (uint16_t)0x82D5, (uint16_t)0x82DF, (uint16_t)0x02DA,
133  (uint16_t)0x82CB, (uint16_t)0x02CE, (uint16_t)0x02C4, (uint16_t)0x82C1,
134  (uint16_t)0x8243, (uint16_t)0x0246, (uint16_t)0x024C, (uint16_t)0x8249,
135  (uint16_t)0x0258, (uint16_t)0x825D, (uint16_t)0x8257, (uint16_t)0x0252,
136  (uint16_t)0x0270, (uint16_t)0x8275, (uint16_t)0x827F, (uint16_t)0x027A,
137  (uint16_t)0x826B, (uint16_t)0x026E, (uint16_t)0x0264, (uint16_t)0x8261,
138  (uint16_t)0x0220, (uint16_t)0x8225, (uint16_t)0x822F, (uint16_t)0x022A,
139  (uint16_t)0x823B, (uint16_t)0x023E, (uint16_t)0x0234, (uint16_t)0x8231,
140  (uint16_t)0x8213, (uint16_t)0x0216, (uint16_t)0x021C, (uint16_t)0x8219,
141  (uint16_t)0x0208, (uint16_t)0x820D, (uint16_t)0x8207, (uint16_t)0x0202,
142 };
143 
144 #elif XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_CRC_16_CITT
145 
146 #define XCP_CRC_NAME "CRC-CCITT"
147 #define XCP_CRC_POLYNOMIAL ((uint16_t)0x1021)
148 #define XCP_CRC_INITIAL_VALUE ((uint16_t)0xFFFF)
149 #define XCP_CRC_FINAL_XOR_VALUE ((uint16_t)0x0000)
150 #define REFLECT_DATA XCP_FALSE
151 #define REFLECT_REMAINDER XCP_FALSE
152 #define CHECK_VALUE ((uint16_t)0x29B1)
153 
154 static const uint16_t CRC_TAB[] = {
155  (uint16_t)0x0000, (uint16_t)0x1021, (uint16_t)0x2042, (uint16_t)0x3063,
156  (uint16_t)0x4084, (uint16_t)0x50A5, (uint16_t)0x60C6, (uint16_t)0x70E7,
157  (uint16_t)0x8108, (uint16_t)0x9129, (uint16_t)0xA14A, (uint16_t)0xB16B,
158  (uint16_t)0xC18C, (uint16_t)0xD1AD, (uint16_t)0xE1CE, (uint16_t)0xF1EF,
159  (uint16_t)0x1231, (uint16_t)0x0210, (uint16_t)0x3273, (uint16_t)0x2252,
160  (uint16_t)0x52B5, (uint16_t)0x4294, (uint16_t)0x72F7, (uint16_t)0x62D6,
161  (uint16_t)0x9339, (uint16_t)0x8318, (uint16_t)0xB37B, (uint16_t)0xA35A,
162  (uint16_t)0xD3BD, (uint16_t)0xC39C, (uint16_t)0xF3FF, (uint16_t)0xE3DE,
163  (uint16_t)0x2462, (uint16_t)0x3443, (uint16_t)0x0420, (uint16_t)0x1401,
164  (uint16_t)0x64E6, (uint16_t)0x74C7, (uint16_t)0x44A4, (uint16_t)0x5485,
165  (uint16_t)0xA56A, (uint16_t)0xB54B, (uint16_t)0x8528, (uint16_t)0x9509,
166  (uint16_t)0xE5EE, (uint16_t)0xF5CF, (uint16_t)0xC5AC, (uint16_t)0xD58D,
167  (uint16_t)0x3653, (uint16_t)0x2672, (uint16_t)0x1611, (uint16_t)0x0630,
168  (uint16_t)0x76D7, (uint16_t)0x66F6, (uint16_t)0x5695, (uint16_t)0x46B4,
169  (uint16_t)0xB75B, (uint16_t)0xA77A, (uint16_t)0x9719, (uint16_t)0x8738,
170  (uint16_t)0xF7DF, (uint16_t)0xE7FE, (uint16_t)0xD79D, (uint16_t)0xC7BC,
171  (uint16_t)0x48C4, (uint16_t)0x58E5, (uint16_t)0x6886, (uint16_t)0x78A7,
172  (uint16_t)0x0840, (uint16_t)0x1861, (uint16_t)0x2802, (uint16_t)0x3823,
173  (uint16_t)0xC9CC, (uint16_t)0xD9ED, (uint16_t)0xE98E, (uint16_t)0xF9AF,
174  (uint16_t)0x8948, (uint16_t)0x9969, (uint16_t)0xA90A, (uint16_t)0xB92B,
175  (uint16_t)0x5AF5, (uint16_t)0x4AD4, (uint16_t)0x7AB7, (uint16_t)0x6A96,
176  (uint16_t)0x1A71, (uint16_t)0x0A50, (uint16_t)0x3A33, (uint16_t)0x2A12,
177  (uint16_t)0xDBFD, (uint16_t)0xCBDC, (uint16_t)0xFBBF, (uint16_t)0xEB9E,
178  (uint16_t)0x9B79, (uint16_t)0x8B58, (uint16_t)0xBB3B, (uint16_t)0xAB1A,
179  (uint16_t)0x6CA6, (uint16_t)0x7C87, (uint16_t)0x4CE4, (uint16_t)0x5CC5,
180  (uint16_t)0x2C22, (uint16_t)0x3C03, (uint16_t)0x0C60, (uint16_t)0x1C41,
181  (uint16_t)0xEDAE, (uint16_t)0xFD8F, (uint16_t)0xCDEC, (uint16_t)0xDDCD,
182  (uint16_t)0xAD2A, (uint16_t)0xBD0B, (uint16_t)0x8D68, (uint16_t)0x9D49,
183  (uint16_t)0x7E97, (uint16_t)0x6EB6, (uint16_t)0x5ED5, (uint16_t)0x4EF4,
184  (uint16_t)0x3E13, (uint16_t)0x2E32, (uint16_t)0x1E51, (uint16_t)0x0E70,
185  (uint16_t)0xFF9F, (uint16_t)0xEFBE, (uint16_t)0xDFDD, (uint16_t)0xCFFC,
186  (uint16_t)0xBF1B, (uint16_t)0xAF3A, (uint16_t)0x9F59, (uint16_t)0x8F78,
187  (uint16_t)0x9188, (uint16_t)0x81A9, (uint16_t)0xB1CA, (uint16_t)0xA1EB,
188  (uint16_t)0xD10C, (uint16_t)0xC12D, (uint16_t)0xF14E, (uint16_t)0xE16F,
189  (uint16_t)0x1080, (uint16_t)0x00A1, (uint16_t)0x30C2, (uint16_t)0x20E3,
190  (uint16_t)0x5004, (uint16_t)0x4025, (uint16_t)0x7046, (uint16_t)0x6067,
191  (uint16_t)0x83B9, (uint16_t)0x9398, (uint16_t)0xA3FB, (uint16_t)0xB3DA,
192  (uint16_t)0xC33D, (uint16_t)0xD31C, (uint16_t)0xE37F, (uint16_t)0xF35E,
193  (uint16_t)0x02B1, (uint16_t)0x1290, (uint16_t)0x22F3, (uint16_t)0x32D2,
194  (uint16_t)0x4235, (uint16_t)0x5214, (uint16_t)0x6277, (uint16_t)0x7256,
195  (uint16_t)0xB5EA, (uint16_t)0xA5CB, (uint16_t)0x95A8, (uint16_t)0x8589,
196  (uint16_t)0xF56E, (uint16_t)0xE54F, (uint16_t)0xD52C, (uint16_t)0xC50D,
197  (uint16_t)0x34E2, (uint16_t)0x24C3, (uint16_t)0x14A0, (uint16_t)0x0481,
198  (uint16_t)0x7466, (uint16_t)0x6447, (uint16_t)0x5424, (uint16_t)0x4405,
199  (uint16_t)0xA7DB, (uint16_t)0xB7FA, (uint16_t)0x8799, (uint16_t)0x97B8,
200  (uint16_t)0xE75F, (uint16_t)0xF77E, (uint16_t)0xC71D, (uint16_t)0xD73C,
201  (uint16_t)0x26D3, (uint16_t)0x36F2, (uint16_t)0x0691, (uint16_t)0x16B0,
202  (uint16_t)0x6657, (uint16_t)0x7676, (uint16_t)0x4615, (uint16_t)0x5634,
203  (uint16_t)0xD94C, (uint16_t)0xC96D, (uint16_t)0xF90E, (uint16_t)0xE92F,
204  (uint16_t)0x99C8, (uint16_t)0x89E9, (uint16_t)0xB98A, (uint16_t)0xA9AB,
205  (uint16_t)0x5844, (uint16_t)0x4865, (uint16_t)0x7806, (uint16_t)0x6827,
206  (uint16_t)0x18C0, (uint16_t)0x08E1, (uint16_t)0x3882, (uint16_t)0x28A3,
207  (uint16_t)0xCB7D, (uint16_t)0xDB5C, (uint16_t)0xEB3F, (uint16_t)0xFB1E,
208  (uint16_t)0x8BF9, (uint16_t)0x9BD8, (uint16_t)0xABBB, (uint16_t)0xBB9A,
209  (uint16_t)0x4A75, (uint16_t)0x5A54, (uint16_t)0x6A37, (uint16_t)0x7A16,
210  (uint16_t)0x0AF1, (uint16_t)0x1AD0, (uint16_t)0x2AB3, (uint16_t)0x3A92,
211  (uint16_t)0xFD2E, (uint16_t)0xED0F, (uint16_t)0xDD6C, (uint16_t)0xCD4D,
212  (uint16_t)0xBDAA, (uint16_t)0xAD8B, (uint16_t)0x9DE8, (uint16_t)0x8DC9,
213  (uint16_t)0x7C26, (uint16_t)0x6C07, (uint16_t)0x5C64, (uint16_t)0x4C45,
214  (uint16_t)0x3CA2, (uint16_t)0x2C83, (uint16_t)0x1CE0, (uint16_t)0x0CC1,
215  (uint16_t)0xEF1F, (uint16_t)0xFF3E, (uint16_t)0xCF5D, (uint16_t)0xDF7C,
216  (uint16_t)0xAF9B, (uint16_t)0xBFBA, (uint16_t)0x8FD9, (uint16_t)0x9FF8,
217  (uint16_t)0x6E17, (uint16_t)0x7E36, (uint16_t)0x4E55, (uint16_t)0x5E74,
218  (uint16_t)0x2E93, (uint16_t)0x3EB2, (uint16_t)0x0ED1, (uint16_t)0x1EF0,
219 };
220 
221 #elif XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_CRC_32
222 
223 #define XCP_CRC_NAME "CRC-32"
224 #define XCP_CRC_POLYNOMIAL ((uint32_t)0x04C11DB7)
225 #define XCP_CRC_INITIAL_VALUE ((uint32_t)0xFFFFFFFF)
226 #define XCP_CRC_FINAL_XOR_VALUE ((uint32_t)0xFFFFFFFF)
227 #define REFLECT_DATA XCP_TRUE
228 #define REFLECT_REMAINDER XCP_TRUE
229 #define CHECK_VALUE ((uint32_t)0xCBF43926)
230 
231 static const uint32_t CRC_TAB[] = {
232  (uint32_t)0x00000000, (uint32_t)0x77073096, (uint32_t)0xee0e612c,
233  (uint32_t)0x990951ba, (uint32_t)0x076dc419, (uint32_t)0x706af48f,
234  (uint32_t)0xe963a535, (uint32_t)0x9e6495a3, (uint32_t)0x0edb8832,
235  (uint32_t)0x79dcb8a4, (uint32_t)0xe0d5e91e, (uint32_t)0x97d2d988,
236  (uint32_t)0x09b64c2b, (uint32_t)0x7eb17cbd, (uint32_t)0xe7b82d07,
237  (uint32_t)0x90bf1d91, (uint32_t)0x1db71064, (uint32_t)0x6ab020f2,
238  (uint32_t)0xf3b97148, (uint32_t)0x84be41de, (uint32_t)0x1adad47d,
239  (uint32_t)0x6ddde4eb, (uint32_t)0xf4d4b551, (uint32_t)0x83d385c7,
240  (uint32_t)0x136c9856, (uint32_t)0x646ba8c0, (uint32_t)0xfd62f97a,
241  (uint32_t)0x8a65c9ec, (uint32_t)0x14015c4f, (uint32_t)0x63066cd9,
242  (uint32_t)0xfa0f3d63, (uint32_t)0x8d080df5, (uint32_t)0x3b6e20c8,
243  (uint32_t)0x4c69105e, (uint32_t)0xd56041e4, (uint32_t)0xa2677172,
244  (uint32_t)0x3c03e4d1, (uint32_t)0x4b04d447, (uint32_t)0xd20d85fd,
245  (uint32_t)0xa50ab56b, (uint32_t)0x35b5a8fa, (uint32_t)0x42b2986c,
246  (uint32_t)0xdbbbc9d6, (uint32_t)0xacbcf940, (uint32_t)0x32d86ce3,
247  (uint32_t)0x45df5c75, (uint32_t)0xdcd60dcf, (uint32_t)0xabd13d59,
248  (uint32_t)0x26d930ac, (uint32_t)0x51de003a, (uint32_t)0xc8d75180,
249  (uint32_t)0xbfd06116, (uint32_t)0x21b4f4b5, (uint32_t)0x56b3c423,
250  (uint32_t)0xcfba9599, (uint32_t)0xb8bda50f, (uint32_t)0x2802b89e,
251  (uint32_t)0x5f058808, (uint32_t)0xc60cd9b2, (uint32_t)0xb10be924,
252  (uint32_t)0x2f6f7c87, (uint32_t)0x58684c11, (uint32_t)0xc1611dab,
253  (uint32_t)0xb6662d3d, (uint32_t)0x76dc4190, (uint32_t)0x01db7106,
254  (uint32_t)0x98d220bc, (uint32_t)0xefd5102a, (uint32_t)0x71b18589,
255  (uint32_t)0x06b6b51f, (uint32_t)0x9fbfe4a5, (uint32_t)0xe8b8d433,
256  (uint32_t)0x7807c9a2, (uint32_t)0x0f00f934, (uint32_t)0x9609a88e,
257  (uint32_t)0xe10e9818, (uint32_t)0x7f6a0dbb, (uint32_t)0x086d3d2d,
258  (uint32_t)0x91646c97, (uint32_t)0xe6635c01, (uint32_t)0x6b6b51f4,
259  (uint32_t)0x1c6c6162, (uint32_t)0x856530d8, (uint32_t)0xf262004e,
260  (uint32_t)0x6c0695ed, (uint32_t)0x1b01a57b, (uint32_t)0x8208f4c1,
261  (uint32_t)0xf50fc457, (uint32_t)0x65b0d9c6, (uint32_t)0x12b7e950,
262  (uint32_t)0x8bbeb8ea, (uint32_t)0xfcb9887c, (uint32_t)0x62dd1ddf,
263  (uint32_t)0x15da2d49, (uint32_t)0x8cd37cf3, (uint32_t)0xfbd44c65,
264  (uint32_t)0x4db26158, (uint32_t)0x3ab551ce, (uint32_t)0xa3bc0074,
265  (uint32_t)0xd4bb30e2, (uint32_t)0x4adfa541, (uint32_t)0x3dd895d7,
266  (uint32_t)0xa4d1c46d, (uint32_t)0xd3d6f4fb, (uint32_t)0x4369e96a,
267  (uint32_t)0x346ed9fc, (uint32_t)0xad678846, (uint32_t)0xda60b8d0,
268  (uint32_t)0x44042d73, (uint32_t)0x33031de5, (uint32_t)0xaa0a4c5f,
269  (uint32_t)0xdd0d7cc9, (uint32_t)0x5005713c, (uint32_t)0x270241aa,
270  (uint32_t)0xbe0b1010, (uint32_t)0xc90c2086, (uint32_t)0x5768b525,
271  (uint32_t)0x206f85b3, (uint32_t)0xb966d409, (uint32_t)0xce61e49f,
272  (uint32_t)0x5edef90e, (uint32_t)0x29d9c998, (uint32_t)0xb0d09822,
273  (uint32_t)0xc7d7a8b4, (uint32_t)0x59b33d17, (uint32_t)0x2eb40d81,
274  (uint32_t)0xb7bd5c3b, (uint32_t)0xc0ba6cad, (uint32_t)0xedb88320,
275  (uint32_t)0x9abfb3b6, (uint32_t)0x03b6e20c, (uint32_t)0x74b1d29a,
276  (uint32_t)0xead54739, (uint32_t)0x9dd277af, (uint32_t)0x04db2615,
277  (uint32_t)0x73dc1683, (uint32_t)0xe3630b12, (uint32_t)0x94643b84,
278  (uint32_t)0x0d6d6a3e, (uint32_t)0x7a6a5aa8, (uint32_t)0xe40ecf0b,
279  (uint32_t)0x9309ff9d, (uint32_t)0x0a00ae27, (uint32_t)0x7d079eb1,
280  (uint32_t)0xf00f9344, (uint32_t)0x8708a3d2, (uint32_t)0x1e01f268,
281  (uint32_t)0x6906c2fe, (uint32_t)0xf762575d, (uint32_t)0x806567cb,
282  (uint32_t)0x196c3671, (uint32_t)0x6e6b06e7, (uint32_t)0xfed41b76,
283  (uint32_t)0x89d32be0, (uint32_t)0x10da7a5a, (uint32_t)0x67dd4acc,
284  (uint32_t)0xf9b9df6f, (uint32_t)0x8ebeeff9, (uint32_t)0x17b7be43,
285  (uint32_t)0x60b08ed5, (uint32_t)0xd6d6a3e8, (uint32_t)0xa1d1937e,
286  (uint32_t)0x38d8c2c4, (uint32_t)0x4fdff252, (uint32_t)0xd1bb67f1,
287  (uint32_t)0xa6bc5767, (uint32_t)0x3fb506dd, (uint32_t)0x48b2364b,
288  (uint32_t)0xd80d2bda, (uint32_t)0xaf0a1b4c, (uint32_t)0x36034af6,
289  (uint32_t)0x41047a60, (uint32_t)0xdf60efc3, (uint32_t)0xa867df55,
290  (uint32_t)0x316e8eef, (uint32_t)0x4669be79, (uint32_t)0xcb61b38c,
291  (uint32_t)0xbc66831a, (uint32_t)0x256fd2a0, (uint32_t)0x5268e236,
292  (uint32_t)0xcc0c7795, (uint32_t)0xbb0b4703, (uint32_t)0x220216b9,
293  (uint32_t)0x5505262f, (uint32_t)0xc5ba3bbe, (uint32_t)0xb2bd0b28,
294  (uint32_t)0x2bb45a92, (uint32_t)0x5cb36a04, (uint32_t)0xc2d7ffa7,
295  (uint32_t)0xb5d0cf31, (uint32_t)0x2cd99e8b, (uint32_t)0x5bdeae1d,
296  (uint32_t)0x9b64c2b0, (uint32_t)0xec63f226, (uint32_t)0x756aa39c,
297  (uint32_t)0x026d930a, (uint32_t)0x9c0906a9, (uint32_t)0xeb0e363f,
298  (uint32_t)0x72076785, (uint32_t)0x05005713, (uint32_t)0x95bf4a82,
299  (uint32_t)0xe2b87a14, (uint32_t)0x7bb12bae, (uint32_t)0x0cb61b38,
300  (uint32_t)0x92d28e9b, (uint32_t)0xe5d5be0d, (uint32_t)0x7cdcefb7,
301  (uint32_t)0x0bdbdf21, (uint32_t)0x86d3d2d4, (uint32_t)0xf1d4e242,
302  (uint32_t)0x68ddb3f8, (uint32_t)0x1fda836e, (uint32_t)0x81be16cd,
303  (uint32_t)0xf6b9265b, (uint32_t)0x6fb077e1, (uint32_t)0x18b74777,
304  (uint32_t)0x88085ae6, (uint32_t)0xff0f6a70, (uint32_t)0x66063bca,
305  (uint32_t)0x11010b5c, (uint32_t)0x8f659eff, (uint32_t)0xf862ae69,
306  (uint32_t)0x616bffd3, (uint32_t)0x166ccf45, (uint32_t)0xa00ae278,
307  (uint32_t)0xd70dd2ee, (uint32_t)0x4e048354, (uint32_t)0x3903b3c2,
308  (uint32_t)0xa7672661, (uint32_t)0xd06016f7, (uint32_t)0x4969474d,
309  (uint32_t)0x3e6e77db, (uint32_t)0xaed16a4a, (uint32_t)0xd9d65adc,
310  (uint32_t)0x40df0b66, (uint32_t)0x37d83bf0, (uint32_t)0xa9bcae53,
311  (uint32_t)0xdebb9ec5, (uint32_t)0x47b2cf7f, (uint32_t)0x30b5ffe9,
312  (uint32_t)0xbdbdf21c, (uint32_t)0xcabac28a, (uint32_t)0x53b39330,
313  (uint32_t)0x24b4a3a6, (uint32_t)0xbad03605, (uint32_t)0xcdd70693,
314  (uint32_t)0x54de5729, (uint32_t)0x23d967bf, (uint32_t)0xb3667a2e,
315  (uint32_t)0xc4614ab8, (uint32_t)0x5d681b02, (uint32_t)0x2a6f2b94,
316  (uint32_t)0xb40bbe37, (uint32_t)0xc30c8ea1, (uint32_t)0x5a05df1b,
317  (uint32_t)0x2d02ef8d};
318 
319 #endif /* XCP_CHECKSUM_METHOD */
320 
321 #define WIDTH ((uint16_t)(8U * sizeof(Xcp_ChecksumType)))
322 #define TOPBIT (1 << (WIDTH - 1))
323 
324 #if (REFLECT_DATA == XCP_TRUE)
325 #define CRC_REFLECT_DATA(X) ((uint8_t)reflect((X), 8))
326 #else
327 #define CRC_REFLECT_DATA(X) (X)
328 #endif
329 
330 #if (REFLECT_REMAINDER == XCP_TRUE)
331 #define CRC_REFLECT_REMAINDER(X) ((Xcp_ChecksumType)reflect((X), WIDTH))
332 #else
333 #define CRC_REFLECT_REMAINDER(X) (X)
334 #endif
335 
336 #if (REFLECT_DATA == XCP_TRUE) || (REFLECT_REMAINDER == XCP_TRUE)
337 static uint32_t reflect(uint32_t data, uint8_t nBits) {
338  uint32_t reflection = 0x00000000;
339  uint8_t bit;
340  /*
341  * Reflect the data about the center bit.
342  */
343  for (bit = 0; bit < nBits; ++bit) {
344  /*
345  * If the LSB bit is set, set the reflection of it.
346  */
347  if (data & 0x01) {
348  reflection |= (1 << ((nBits - 1) - bit));
349  }
350  data = (data >> 1);
351  }
352  return reflection;
353 }
354 #endif /* (REFLECT_DATA == TRUE) || (REFLECT_REMAINDER == TRUE) */
355 
356 Xcp_ChecksumType Xcp_CalculateChecksum(uint8_t const *ptr, uint32_t length,
357  Xcp_ChecksumType startValue,
358  bool isFirstCall) {
359  Xcp_ChecksumType result = 0;
360  uint32_t idx = 0UL;
361 #if (XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_CRC_16) || \
362  (XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_CRC_16_CITT) || \
363  (XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_CRC_32)
364  uint8_t data = 0;
365 
366  if (isFirstCall) {
367  result = XCP_CRC_INITIAL_VALUE;
368  } else {
369  result = startValue;
370  }
371 
372  for (idx = (uint32_t)0UL; idx < length; ++idx) {
373  data = CRC_REFLECT_DATA(ptr[idx]) ^ UINT8(result >> (WIDTH - UINT8(8)));
374  result = CRC_TAB[data] ^ UINT16(result << 8);
375  }
376  return CRC_REFLECT_REMAINDER(result) ^ XCP_CRC_FINAL_XOR_VALUE;
377 #elif (XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_ADD_11) || \
378  (XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_ADD_12) || \
379  (XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_ADD_14)
380  if (isFirstCall) {
381  result = (Xcp_ChecksumType)0;
382  } else {
383  result = startValue;
384  }
385 
386  for (idx = (uint32_t)0UL; idx < length; ++idx) {
387  result += ptr[idx];
388  }
389 
390  return result;
391 #elif (XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_ADD_22) || \
392  (XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_ADD_24) || \
393  (XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_ADD_44)
394 
395 #if (XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_ADD_22) || \
396  (XCP_CHECKSUM_METHOD == XCP_CHECKSUM_METHOD_XCP_ADD_24)
397  uint16_t const *data =
398  (uint16_t const *)ptr; /* Undefined behaviour - See note above */
399 
400  length >>= 1;
401 #else
402  uint32_t const *data =
403  (uint32_t const *)ptr; /* Undefined behaviour - See note above */
404 
405  length >>= 2;
406 #endif /* XCP_CHECKSUM_METHOD */
407  if (isFirstCall) {
408  result = (Xcp_ChecksumType)0;
409  } else {
410  result = startValue;
411  }
412 
413  for (idx = (uint32_t)0UL; idx < length; ++idx) {
414  result += data[idx];
415  }
416 
417  return result;
418 #endif /* XCP_CHECKSUM_METHOD */
419 }
420 
421 #if XCP_ENABLE_BUILD_CHECKSUM == XCP_ON && \
422  XCP_CHECKSUM_CHUNKED_CALCULATION == XCP_ON
423 static Xcp_ChecksumJobType Xcp_ChecksumJob;
424 
425 void Xcp_ChecksumInit(void) {
426  Xcp_ChecksumJob.mta.address = UINT32(0ul);
427  Xcp_ChecksumJob.mta.ext = UINT8(0);
428  Xcp_ChecksumJob.interimChecksum = (Xcp_ChecksumType)0UL;
429  Xcp_ChecksumJob.size = UINT32(0ul);
430  Xcp_ChecksumJob.state = XCP_CHECKSUM_STATE_IDLE;
431 }
432 
433 void Xcp_StartChecksumCalculation(uint8_t const *ptr, uint32_t size) {
434  XCP_ENTER_CRITICAL();
435  if ((Xcp_ChecksumJob.state != XCP_CHECKSUM_STATE_IDLE) || Xcp_IsBusy()) {
436  XCP_LEAVE_CRITICAL();
437  return;
438  }
439  Xcp_SetBusy(XCP_TRUE);
440  Xcp_ChecksumJob.state = XCP_CHECKSUM_STATE_RUNNING_INITIAL;
441  /* printf("S-Address: %p Size: %u\n", ptr, size); */
442  Xcp_ChecksumJob.mta.address = (Xcp_PointerSizeType)ptr;
443  Xcp_ChecksumJob.size = size;
444  XCP_LEAVE_CRITICAL();
445 }
446 
451 void Xcp_ChecksumMainFunction(void) {
452  if (Xcp_ChecksumJob.state == XCP_CHECKSUM_STATE_IDLE) {
453  return;
454  } else if (Xcp_ChecksumJob.state == XCP_CHECKSUM_STATE_RUNNING_INITIAL) {
455  Xcp_ChecksumJob.interimChecksum = Xcp_CalculateChecksum(
456  (uint8_t const *)Xcp_ChecksumJob.mta.address, XCP_CHECKSUM_CHUNK_SIZE,
457  (Xcp_ChecksumType)0, XCP_TRUE);
458  Xcp_ChecksumJob.size -= XCP_CHECKSUM_CHUNK_SIZE;
459  Xcp_ChecksumJob.mta.address += XCP_CHECKSUM_CHUNK_SIZE;
460  Xcp_ChecksumJob.state = XCP_CHECKSUM_STATE_RUNNING_REMAINING;
461  } else if (Xcp_ChecksumJob.state == XCP_CHECKSUM_STATE_RUNNING_REMAINING) {
462  Xcp_ChecksumJob.interimChecksum = Xcp_CalculateChecksum(
463  (uint8_t const *)Xcp_ChecksumJob.mta.address, XCP_CHECKSUM_CHUNK_SIZE,
464  Xcp_ChecksumJob.interimChecksum, XCP_FALSE);
465  /* printf("N-Address: %x Size: %u CS: %x\n", Xcp_ChecksumJob.mta.address,
466  * Xcp_ChecksumJob.size, Xcp_ChecksumJob.interimChecksum); */
467  Xcp_ChecksumJob.size -= XCP_CHECKSUM_CHUNK_SIZE;
468  Xcp_ChecksumJob.mta.address += XCP_CHECKSUM_CHUNK_SIZE;
469  if (Xcp_ChecksumJob.size <= XCP_CHECKSUM_CHUNK_SIZE) {
470  Xcp_ChecksumJob.state = XCP_CHECKSUM_STATE_RUNNING_FINAL;
471  }
472  } else if (Xcp_ChecksumJob.state == XCP_CHECKSUM_STATE_RUNNING_FINAL) {
473  /* printf("F-Address: %x Size: %u CS: %x\n", Xcp_ChecksumJob.mta.address,
474  * Xcp_ChecksumJob.size, Xcp_ChecksumJob.interimChecksum); */
475  Xcp_ChecksumJob.interimChecksum = Xcp_CalculateChecksum(
476  (uint8_t const *)Xcp_ChecksumJob.mta.address, Xcp_ChecksumJob.size,
477  Xcp_ChecksumJob.interimChecksum, XCP_FALSE);
478  /* printf("FINAL-VALUE %x\n", Xcp_ChecksumJob.interimChecksum); */
479  Xcp_SetBusy(XCP_FALSE);
480  Xcp_SendChecksumPositiveResponse(Xcp_ChecksumJob.interimChecksum);
481  Xcp_ChecksumJob.state = XCP_CHECKSUM_STATE_IDLE;
482  }
483 }
484 #endif /* XCP_ENABLE_BUILD_CHECKSUM */