Statistics
| Branch: | Tag: | Revision:

amiro-blt / Target / Source / xcp.c @ f7d2c786

History | View | Annotate | Download (52.392 KB)

1 69661903 Thomas Schöpping
/************************************************************************************//**
2
* \file         Source\xcp.c
3
* \brief        XCP 1.0 protocol core source file.
4
* \ingroup      Core
5
* \internal
6
*----------------------------------------------------------------------------------------
7
*                          C O P Y R I G H T
8
*----------------------------------------------------------------------------------------
9
*   Copyright (c) 2011  by Feaser    http://www.feaser.com    All rights reserved
10
*
11
*----------------------------------------------------------------------------------------
12
*                            L I C E N S E
13
*----------------------------------------------------------------------------------------
14
* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or
15
* modify it under the terms of the GNU General Public License as published by the Free
16
* Software Foundation, either version 3 of the License, or (at your option) any later
17
* version.
18
*
19
* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
20
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
21
* PURPOSE. See the GNU General Public License for more details.
22
*
23
* You should have received a copy of the GNU General Public License along with OpenBLT.
24
* If not, see <http://www.gnu.org/licenses/>.
25
*
26 d54d2f07 Thomas Schöpping
* A special exception to the GPL is included to allow you to distribute a combined work
27
* that includes OpenBLT without being obliged to provide the source code for any
28 69661903 Thomas Schöpping
* proprietary components. The exception text is included at the bottom of the license
29
* file <license.html>.
30 d54d2f07 Thomas Schöpping
*
31 69661903 Thomas Schöpping
* \endinternal
32
****************************************************************************************/
33
34
/****************************************************************************************
35
* Include files
36
****************************************************************************************/
37
#include "boot.h"                                /* bootloader generic header          */
38
39 d54d2f07 Thomas Schöpping
#include <helper.h>
40 69661903 Thomas Schöpping
41
/****************************************************************************************
42
* Defines
43
****************************************************************************************/
44
/** \brief XCP protocol layer version number (16-bit). */
45
#define XCP_VERSION_PROTOCOL_LAYER  (0x0100)
46
47
/** \brief XCP transport layer version number (16-bit). */
48
#define XCP_VERSION_TRANSPORT_LAYER (0x0100)
49
50
/* XCP packet identifiers */
51
/** \brief Command response packet identifier. */
52
#define XCP_PID_RES                 (0xff)
53 d54d2f07 Thomas Schöpping
/** \brief Error packet identifier. */
54 69661903 Thomas Schöpping
#define XCP_PID_ERR                 (0xfe)
55
56
/* XCP error codes */
57
/** \brief Cmd processor synchronization error code. */
58
#define XCP_ERR_CMD_SYNCH           (0x00)
59
/** \brief Command was not executed error code. */
60
#define XCP_ERR_CMD_BUSY            (0x10)
61
/** \brief Unknown or unsupported command error code. */
62
#define XCP_ERR_CMD_UNKNOWN         (0x20)
63
/** \brief Parameter out of range error code. */
64
#define XCP_ERR_OUT_OF_RANGE        (0x22)
65
/** \brief Protected error code. Seed/key required. */
66
#define XCP_ERR_ACCESS_LOCKED       (0x25)
67
/** \brief Cal page not valid error code. */
68
#define XCP_ERR_PAGE_NOT_VALID      (0x26)
69
/** \brief Sequence error code. */
70
#define XCP_ERR_SEQUENCE            (0x29)
71
/** \brief Generic error code. */
72
#define XCP_ERR_GENERIC             (0x31)
73
74
/* XCP command codes */
75
/** \brief CONNECT command code. */
76
#define XCP_CMD_CONNECT             (0xff)
77
/** \brief DISCONNECT command code. */
78
#define XCP_CMD_DISCONNECT          (0xfe)
79
/** \brief GET_STATUS command code. */
80
#define XCP_CMD_GET_STATUS          (0xfd)
81
/** \brief SYNCH command code. */
82
#define XCP_CMD_SYNCH               (0xfc)
83
/** \brief GET_ID command code. */
84
#define XCP_CMD_GET_ID              (0xfa)
85
/** \brief GET_SEED command code. */
86
#define XCP_CMD_GET_SEED            (0xf8)
87
/** \brief UNLOCK command code. */
88
#define XCP_CMD_UNLOCK              (0xf7)
89
/** \brief SET_MTA command code. */
90
#define XCP_CMD_SET_MTA             (0xf6)
91
/** \brief UPLOAD command code. */
92
#define XCP_CMD_UPLOAD              (0xf5)
93
/** \brief SHORT_UPLOAD command code. */
94
#define XCP_CMD_SHORT_UPLOAD        (0xf4)
95
/** \brief BUILD_CHECKSUM command code. */
96
#define XCP_CMD_BUILD_CHECKSUM      (0xf3)
97
/** \brief DOWNLOAD command code. */
98
#define XCP_CMD_DOWNLOAD            (0xf0)
99
/** \brief DOWNLOAD_MAX command code. */
100
#define XCP_CMD_DOWLOAD_MAX         (0xee)
101
/** \brief SET_CALPAGE command code. */
102
#define XCP_CMD_SET_CAL_PAGE        (0xeb)
103
/** \brief GET_CALPAGE command code. */
104
#define XCP_CMD_GET_CAL_PAGE        (0xea)
105
/** \brief PROGRAM_START command code. */
106
#define XCP_CMD_PROGRAM_START       (0xd2)
107
/** \brief PROGRAM_CLEAR command code. */
108
#define XCP_CMD_PROGRAM_CLEAR       (0xd1)
109
/** \brief PROGRAM command code. */
110
#define XCP_CMD_PROGRAM             (0xd0)
111
/** \brief PROGRAM_RESET command code. */
112
#define XCP_CMD_PROGRAM_RESET       (0xcf)
113
/** \brief PROGRAM_PREPARE command code. */
114
#define XCP_CMD_PROGRAM_PREPARE     (0xcc)
115
/** \brief PROGRAM_MAX command code. */
116
#define XCP_CMD_PROGRAM_MAX         (0xc9)
117
118
119
/****************************************************************************************
120
* Type definitions
121
****************************************************************************************/
122
/** \brief Struture type for grouping XCP internal module information. */
123
typedef struct
124
{
125
  blt_int8u  connected;                             /**< connection established                      */
126
#if (BOOT_GATE_ENABLE > 0)
127 d54d2f07 Thomas Schöpping
  blt_int32u  other_connection;                      /**< connection to other device established      */
128 69661903 Thomas Schöpping
#endif
129
#if (BOOTLOADER_OF_MAIN_DEVICE > 0)
130
  blt_bool   wasMainConnection;                     /**< connection to serialboot (0x00) established */
131
#endif
132
  blt_int8u  oldData[BOOT_COM_RX_MAX_DATA];         /**< old packet data buffer                      */
133
  blt_int8u  protection;                            /**< protection state                            */
134
  blt_int8u  s_n_k_resource;                        /**< for seed/key sequence                       */
135
  blt_int8u  ctoData[BOOT_COM_RX_MAX_DATA];         /**< cto packet data buffer                      */
136
  blt_int8u  ctoPending;                            /**< cto transmission pending flag               */
137
  blt_int16s ctoLen;                                /**< cto current packet length                   */
138
  blt_int32u mta;                                   /**< memory transfer address                     */
139
} tXcpInfo;
140
141
142
/****************************************************************************************
143
* Function prototypes
144
****************************************************************************************/
145
/* transport layer specific functions */
146
#if (BOOT_GATE_ENABLE > 0)
147
static void      XcpTransmitPacket(blt_int8u *data, blt_int16s len, blt_bool fromGate);
148
#else
149
static void      XcpTransmitPacket(blt_int8u *data, blt_int16s len);
150
#endif /* BOOT_GATE_ENABLE > 0 */
151
152
/* application specific functions */
153 d54d2f07 Thomas Schöpping
static blt_int8u XcpComputeChecksum(blt_int32u address, blt_int32u length,
154 69661903 Thomas Schöpping
                                    blt_int32u *checksum);
155
156
#if (XCP_SEED_KEY_PROTECTION_EN == 1)
157
static blt_int8u XcpGetSeed(blt_int8u resource, blt_int8u *seed);
158
static blt_int8u XcpVerifyKey(blt_int8u resource, blt_int8u *key, blt_int8u len);
159
#endif
160
161
/* general utility functions */
162
static void XcpProtectResources(void);
163
static void XcpSetCtoError(blt_int8u error);
164
165
/* XCP command processors */
166
static void XcpCmdConnect(blt_int8u *data, blt_int16s dataLength);
167
static void XcpCmdDisconnect(blt_int8u *data);
168
static void XcpCmdGetStatus(blt_int8u *data);
169
static void XcpCmdSynch(blt_int8u *data);
170
static void XcpCmdGetId(blt_int8u *data);
171
static void XcpCmdSetMta(blt_int8u *data);
172
static void XcpCmdUpload(blt_int8u *data);
173
static void XcpCmdShortUpload(blt_int8u *data);
174
static void XcpCmdBuildCheckSum(blt_int8u *data);
175
#if (XCP_SEED_KEY_PROTECTION_EN == 1)
176
static void XcpCmdGetSeed(blt_int8u *data);
177
static void XcpCmdUnlock(blt_int8u *data);
178
#endif
179
#if (XCP_RES_CALIBRATION_EN == 1)
180
static void XcpCmdDownload(blt_int8u *data);
181
static void XcpCmdDownloadMax(blt_int8u *data);
182
#endif
183
#if (XCP_RES_PAGING_EN == 1)
184
static void XcpCmdSetCalPage(blt_int8u *data);
185
static void XcpCmdGetCalPage(blt_int8u *data);
186
#endif
187
#if (XCP_RES_PROGRAMMING_EN == 1)
188
static void XcpCmdProgramMax(blt_int8u *data);
189
static void XcpCmdProgram(blt_int8u *data);
190
static void XcpCmdProgramStart(blt_int8u *data);
191
static void XcpCmdProgramClear(blt_int8u *data);
192
static void XcpCmdProgramReset(blt_int8u *data);
193
static void XcpCmdProgramPrepare(blt_int8u *data);
194
#endif
195
static void portedTransmission(blt_int8u *data);
196
197
198
/****************************************************************************************
199
* Hook functions
200
****************************************************************************************/
201
#if (XCP_RES_PAGING_EN == 1)
202
extern blt_int8u XcpCalSetPageHook(blt_int8u segment, blt_int8u page);
203
extern blt_int8u XcpCalGetPageHook(blt_int8u segment);
204
#endif
205
206
#if (XCP_CONNECT_MODE_HOOK_EN == 1)
207
extern blt_bool XcpConnectModeHook(blt_int8u mode);
208
#endif
209
210
#if (XCP_SEED_KEY_PROTECTION_EN == 1)
211
extern blt_int8u XcpGetSeedHook(blt_int8u resource, blt_int8u *seed);
212
extern blt_int8u XcpVerifyKeyHook(blt_int8u resource, blt_int8u *key, blt_int8u len);
213
#endif
214
215
216
217
/****************************************************************************************
218
* External functions
219
****************************************************************************************/
220
#if (BOOT_COM_ENABLE == 0)
221 d54d2f07 Thomas Schöpping
/* in case no internally supported communication interface is used, a custom
222 69661903 Thomas Schöpping
 * communication module can be added. In order to use the XCP protocol in the custom
223
 * communication module, this hook function needs to be implemented. In the XCP protocol
224
 * is not needed, then simply remove the xcp.c source from the project.
225
 */
226
extern void XcpTransmitPacketHook(blt_int8u *data, blt_int16u len);
227
#endif