amiro-blt / Target / Source / com.c @ 470d0567
History | View | Annotate | Download (14.094 KB)
1 | 69661903 | Thomas Schöpping | /************************************************************************************//** |
---|---|---|---|
2 | * \file Source\com.c
|
||
3 | * \brief Bootloader communication interface 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 | * 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 | * proprietary components. The exception text is included at the bottom of the license
|
||
29 | * file <license.html>.
|
||
30 | *
|
||
31 | * \endinternal
|
||
32 | ****************************************************************************************/
|
||
33 | |||
34 | /****************************************************************************************
|
||
35 | * Include files
|
||
36 | ****************************************************************************************/
|
||
37 | #include "boot.h" /* bootloader generic header */ |
||
38 | #if (BOOT_COM_CAN_ENABLE > 0) |
||
39 | #include "can.h" /* can driver module */ |
||
40 | #endif
|
||
41 | #if (BOOT_COM_UART_ENABLE > 0) |
||
42 | #include "uart.h" /* uart driver module */ |
||
43 | #endif
|
||
44 | #if (BOOT_COM_USB_ENABLE > 0) |
||
45 | #include "usb.h" /* usb driver module */ |
||
46 | #endif
|
||
47 | #if (BOOT_COM_NET_ENABLE > 0) |
||
48 | #include "net.h" /* tcp/ip driver module */ |
||
49 | #endif
|
||
50 | |||
51 | |||
52 | #if (BOOT_COM_ENABLE > 0) |
||
53 | /****************************************************************************************
|
||
54 | * Local data declarations
|
||
55 | ****************************************************************************************/
|
||
56 | /** \brief Holds the communication interface of the currently active interface. */
|
||
57 | static tComInterfaceId comActiveInterface = COM_IF_OTHER;
|
||
58 | #if (BOOT_DEBUGGING_UART2_ENABLE > 0) |
||
59 | static void InitDebugData(void); |
||
60 | #endif
|
||
61 | |||
62 | #if (BOOT_DEBUGGING_UART2_ENABLE > 0) |
||
63 | static blt_int8u debugDataRUart[8]; |
||
64 | #endif
|
||
65 | |||
66 | /************************************************************************************//** |
||
67 | ** \brief Initializes the communication module including the hardware needed for
|
||
68 | ** the communication.
|
||
69 | ** \return none
|
||
70 | **
|
||
71 | ****************************************************************************************/
|
||
72 | void ComInit(void) |
||
73 | { |
||
74 | #if (BOOT_DEBUGGING_UART2_ENABLE > 0) |
||
75 | InitDebugData(); |
||
76 | #endif
|
||
77 | /* initialize the XCP communication protocol */
|
||
78 | XcpInit(); |
||
79 | #if (BOOT_COM_CAN_ENABLE > 0) |
||
80 | /* initialize the CAN controller */
|
||
81 | CanInit(); |
||
82 | /* set it as active */
|
||
83 | comActiveInterface = COM_IF_CAN; |
||
84 | #endif
|
||
85 | #if (BOOT_COM_UART_ENABLE > 0) |
||
86 | /* initialize the UART interface */
|
||
87 | UartInit(); |
||
88 | /* set it as active */
|
||
89 | comActiveInterface = COM_IF_UART; |
||
90 | #endif
|
||
91 | #if (BOOT_COM_BLUETOOTH_UART_ENABLE > 0) |
||
92 | /* initialize the UART interface */
|
||
93 | BluetoothUartInit(); |
||
94 | /* set it as active */
|
||
95 | comActiveInterface = COM_IF_BLUETOOTH; |
||
96 | #endif
|
||
97 | #if (BOOT_COM_USB_ENABLE > 0) |
||
98 | /* initialize the USB interface */
|
||
99 | UsbInit(); |
||
100 | /* set it as active */
|
||
101 | comActiveInterface = COM_IF_USB; |
||
102 | #endif
|
||
103 | #if (BOOT_COM_NET_ENABLE > 0) |
||
104 | /* initialize the TCP/IP interface */
|
||
105 | NetInit(); |
||
106 | /* set it as active */
|
||
107 | comActiveInterface = COM_IF_NET; |
||
108 | #endif
|
||
109 | } /*** end of ComInit ***/
|
||
110 | |||
111 | #if (BOOT_DEBUGGING_UART2_ENABLE > 0) |
||
112 | /************************************************************************************//** |
||
113 | ** \brief Initializes the debugging data.
|
||
114 | ** \return none
|
||
115 | **
|
||
116 | ****************************************************************************************/
|
||
117 | static void InitDebugData(void) { |
||
118 | debugDataRUart[0] = 'r'; |
||
119 | debugDataRUart[1] = 'U'; |
||
120 | debugDataRUart[2] = 'A'; |
||
121 | debugDataRUart[3] = 'R'; |
||
122 | debugDataRUart[4] = 'T'; |
||
123 | debugDataRUart[5] = ':'; |
||
124 | debugDataRUart[6] = ' '; |
||
125 | debugDataRUart[7] = 10; |
||
126 | } /*** end of InitDebugData ***/
|
||
127 | #endif
|
||
128 | |||
129 | |||
130 | /************************************************************************************//** |
||
131 | ** \brief Updates the communication module by checking if new data was received
|
||
132 | ** and submitting the request to process newly received data.
|
||
133 | ** \return none
|
||
134 | **
|
||
135 | ****************************************************************************************/
|
||
136 | void ComTask(void) |
||
137 | { |
||
138 | blt_int16s messageLength; |
||
139 | /* make xcpCtoReqPacket static for runtime efficiency */
|
||
140 | static unsigned char xcpCtoReqPacket[BOOT_COM_RX_MAX_DATA]; |
||
141 | |||
142 | #if (BOOT_COM_CAN_ENABLE > 0) |
||
143 | messageLength = (blt_int16s)CanReceivePacket(&xcpCtoReqPacket[0]);
|
||
144 | if (messageLength > 0) |
||
145 | { |
||
146 | /* make this the active interface */
|
||
147 | comActiveInterface = COM_IF_CAN; |
||
148 | /* process packet */
|
||
149 | #if (BOOT_GATE_ENABLE > 0) |
||
150 | XcpPacketReceived(&xcpCtoReqPacket[0], messageLength, BLT_FALSE);
|
||
151 | #else
|
||
152 | XcpPacketReceived(&xcpCtoReqPacket[0], messageLength);
|
||
153 | #endif /* BOOT_GATE_ENABLE > 0 */ |
||
154 | } |
||
155 | #endif
|
||
156 | #if (BOOT_COM_UART_ENABLE > 0) |
||
157 | messageLength = (blt_int16s)UartReceivePacket(&xcpCtoReqPacket[0]);
|
||
158 | if (messageLength > 0) |
||
159 | { |
||
160 | /* make this the active interface */
|
||
161 | comActiveInterface = COM_IF_UART; |
||
162 | #if (BOOT_DEBUGGING_UART2_ENABLE > 0) |
||
163 | /* send debugging data */
|
||
164 | BuildData(&debugDataRUart, &xcpCtoReqPacket[0], messageLength);
|
||
165 | #endif
|
||
166 | /* process packet */
|
||
167 | #if (BOOT_GATE_ENABLE > 0) |
||
168 | XcpPacketReceived(&xcpCtoReqPacket[0], messageLength, BLT_FALSE);
|
||
169 | #else
|
||
170 | XcpPacketReceived(&xcpCtoReqPacket[0], messageLength);
|
||
171 | #endif /* BOOT_GATE_ENABLE > 0 */ |
||
172 | } |
||
173 | #endif
|
||
174 | #if (BOOT_COM_BLUETOOTH_UART_ENABLE > 0) |
||
175 | messageLength = (blt_int16s)BluetoothUartReceivePacket(&xcpCtoReqPacket[0]);
|
||
176 | if (messageLength > 0) |
||
177 | { |
||
178 | //UartTransmitPacket(&xcpCtoReqPacket[0], messageLength);
|
||
179 | //UartTransmitPacket("\n", 1);
|
||
180 | /* make this the active interface */
|
||
181 | comActiveInterface = COM_IF_BLUETOOTH; |
||
182 | /* process packet */
|
||
183 | #if (BOOT_GATE_ENABLE > 0) |
||
184 | XcpPacketReceived(&xcpCtoReqPacket[0], messageLength, BLT_FALSE);
|
||
185 | #else
|
||
186 | XcpPacketReceived(&xcpCtoReqPacket[0], messageLength);
|
||
187 | #endif /* BOOT_GATE_ENABLE > 0 */ |
||
188 | // } else {
|
||
189 | // UartTransmitPacket("-\n", 2);
|
||
190 | } |
||
191 | #endif
|
||
192 | #if (BOOT_COM_USB_ENABLE > 0) |
||
193 | messageLength = (blt_int16s)UsbReceivePacket(&xcpCtoReqPacket[0]);
|
||
194 | if (messageLength > 0) |
||
195 | { |
||
196 | /* make this the active interface */
|
||
197 | comActiveInterface = COM_IF_USB; |
||
198 | /* process packet */
|
||
199 | #if (BOOT_GATE_ENABLE > 0) |
||
200 | XcpPacketReceived(&xcpCtoReqPacket[0], messageLength, BLT_FALSE);
|
||
201 | #else
|
||
202 | XcpPacketReceived(&xcpCtoReqPacket[0], messageLength);
|
||
203 | #endif /* BOOT_GATE_ENABLE > 0 */ |
||
204 | } |
||
205 | #endif
|
||
206 | /* net conversation not impemented with length yet! */
|
||
207 | |||
208 | //#if (BOOT_COM_NET_ENABLE > 0)
|
||
209 | // if (NetReceivePacket(&xcpCtoReqPacket[0]) == BLT_TRUE)
|
||
210 | // {
|
||
211 | // /* make this the active interface */
|
||
212 | // comActiveInterface = COM_IF_NET;
|
||
213 | // /* process packet */
|
||
214 | // XcpPacketReceived(&xcpCtoReqPacket[0]);
|
||
215 | // }
|
||
216 | //#endif
|
||
217 | |||
218 | } /*** end of ComTask ***/
|
||
219 | |||
220 | |||
221 | /************************************************************************************//** |
||
222 | ** \brief Releases the communication module.
|
||
223 | ** \return none
|
||
224 | **
|
||
225 | ****************************************************************************************/
|
||
226 | void ComFree(void) |
||
227 | { |
||
228 | #if (BOOT_COM_USB_ENABLE > 0) |
||
229 | /* disconnect the usb device from the usb host */
|
||
230 | UsbFree(); |
||
231 | #endif
|
||
232 | } /*** end of ComFree ***/
|
||
233 | |||
234 | |||
235 | /************************************************************************************//** |
||
236 | ** \brief Transmits the packet using the xcp transport layer.
|
||
237 | ** \param data Pointer to the byte buffer with packet data.
|
||
238 | ** \param len Number of data bytes that need to be transmitted.
|
||
239 | ** \return none
|
||
240 | **
|
||
241 | ****************************************************************************************/
|
||
242 | void ComTransmitPacket(blt_int8u *data, blt_int16u len)
|
||
243 | { |
||
244 | #if (BOOT_COM_CAN_ENABLE > 0) |
||
245 | /* transmit the packet. note that len is limited to 8 in the plausibility check,
|
||
246 | * so cast is okay.
|
||
247 | */
|
||
248 | if (comActiveInterface == COM_IF_CAN)
|
||
249 | { |
||
250 | CanTransmitPacket(data, (blt_int8u)len, 0);
|
||
251 | } |
||
252 | #endif
|
||
253 | #if (BOOT_COM_UART_ENABLE > 0) |
||
254 | /* transmit the packet. note that len is limited to 255 in the plausibility check,
|
||
255 | * so cast is okay.
|
||
256 | */
|
||
257 | if (comActiveInterface == COM_IF_UART)
|
||
258 | { |
||
259 | UartTransmitPacket(data, (blt_int8u)len); |
||
260 | } |
||
261 | #endif
|
||
262 | #if (BOOT_COM_BLUETOOTH_UART_ENABLE > 0) |
||
263 | /* transmit the packet. note that len is limited to 255 in the plausibility check,
|
||
264 | |||
265 | * so cast is okay.
|
||
266 | */
|
||
267 | if (comActiveInterface == COM_IF_BLUETOOTH)
|
||
268 | { |
||
269 | BluetoothUartTransmitPacket(data, (blt_int8u)len); |
||
270 | } |
||
271 | #endif
|
||
272 | #if (BOOT_COM_USB_ENABLE > 0) |
||
273 | /* transmit the packet */
|
||
274 | if (comActiveInterface == COM_IF_USB)
|
||
275 | { |
||
276 | UsbTransmitPacket(data, len); |
||
277 | } |
||
278 | #endif
|
||
279 | #if (BOOT_COM_NET_ENABLE > 0) |
||
280 | if (comActiveInterface == COM_IF_NET)
|
||
281 | { |
||
282 | /* transmit the packet */
|
||
283 | NetTransmitPacket(data, len); |
||
284 | } |
||
285 | #endif
|
||
286 | |||
287 | /* send signal that the packet was transmitted */
|
||
288 | XcpPacketTransmitted(); |
||
289 | } /*** end of ComTransmitPacket ***/
|
||
290 | |||
291 | |||
292 | /************************************************************************************//** |
||
293 | ** \brief Obtains the maximum number of bytes that can be received on the specified
|
||
294 | ** communication interface.
|
||
295 | ** \return Maximum number of bytes that can be received.
|
||
296 | **
|
||
297 | ****************************************************************************************/
|
||
298 | blt_int16u ComGetActiveInterfaceMaxRxLen(void)
|
||
299 | { |
||
300 | blt_int16u result; |
||
301 | |||
302 | /* filter on communication interface identifier */
|
||
303 | switch (comActiveInterface)
|
||
304 | { |
||
305 | case COM_IF_UART:
|
||
306 | result = BOOT_COM_UART_RX_MAX_DATA; |
||
307 | break;
|
||
308 | |||
309 | case COM_IF_BLUETOOTH:
|
||
310 | result = BOOT_COM_UART_RX_MAX_DATA; |
||
311 | break;
|
||
312 | |||
313 | case COM_IF_CAN:
|
||
314 | result = BOOT_COM_CAN_RX_MAX_DATA; |
||
315 | break;
|
||
316 | |||
317 | case COM_IF_USB:
|
||
318 | result = BOOT_COM_USB_RX_MAX_DATA; |
||
319 | break;
|
||
320 | |||
321 | case COM_IF_NET:
|
||
322 | result = BOOT_COM_NET_RX_MAX_DATA; |
||
323 | break;
|
||
324 | |||
325 | default:
|
||
326 | result = BOOT_COM_RX_MAX_DATA; |
||
327 | break;
|
||
328 | } |
||
329 | |||
330 | return result;
|
||
331 | } /*** end of ComGetActiveInterfaceMaxRxLen ***/
|
||
332 | |||
333 | |||
334 | /************************************************************************************//** |
||
335 | ** \brief Obtains the maximum number of bytes that can be transmitted on the
|
||
336 | ** specified communication interface.
|
||
337 | ** \return Maximum number of bytes that can be received.
|
||
338 | **
|
||
339 | ****************************************************************************************/
|
||
340 | blt_int16u ComGetActiveInterfaceMaxTxLen(void)
|
||
341 | { |
||
342 | blt_int16u result; |
||
343 | |||
344 | /* filter on communication interface identifier */
|
||
345 | switch (comActiveInterface)
|
||
346 | { |
||
347 | case COM_IF_UART:
|
||
348 | result = BOOT_COM_UART_TX_MAX_DATA; |
||
349 | break;
|
||
350 | |||
351 | case COM_IF_BLUETOOTH:
|
||
352 | result = BOOT_COM_UART_TX_MAX_DATA; |
||
353 | break;
|
||
354 | |||
355 | case COM_IF_CAN:
|
||
356 | result = BOOT_COM_CAN_TX_MAX_DATA; |
||
357 | break;
|
||
358 | |||
359 | case COM_IF_USB:
|
||
360 | result = BOOT_COM_USB_TX_MAX_DATA; |
||
361 | break;
|
||
362 | |||
363 | case COM_IF_NET:
|
||
364 | result = BOOT_COM_NET_TX_MAX_DATA; |
||
365 | break;
|
||
366 | |||
367 | default:
|
||
368 | result = BOOT_COM_TX_MAX_DATA; |
||
369 | break;
|
||
370 | } |
||
371 | |||
372 | return result;
|
||
373 | } /*** end of ComGetActiveInterfaceMaxTxLen ***/
|
||
374 | |||
375 | |||
376 | /************************************************************************************//** |
||
377 | ** \brief This function obtains the XCP connection state.
|
||
378 | ** \return BLT_TRUE when an XCP connection is established, BLT_FALSE otherwise.
|
||
379 | **
|
||
380 | ****************************************************************************************/
|
||
381 | blt_bool ComIsConnected(void)
|
||
382 | { |
||
383 | return XcpIsConnected();
|
||
384 | } /*** end of ComIsConnected ***/
|
||
385 | |||
386 | |||
387 | #if (BOOTLOADER_OF_MAIN_DEVICE > 0) |
||
388 | /************************************************************************************//** |
||
389 | ** \brief This function obtains the XCP connection state.
|
||
390 | ** \return BLT_TRUE when an XCP connection to main was established, BLT_FALSE otherwise.
|
||
391 | **
|
||
392 | ****************************************************************************************/
|
||
393 | blt_bool ComWasConnectedToMain(void)
|
||
394 | { |
||
395 | return XcpWasConnectedToMain();
|
||
396 | } /*** end of ComWasConnectedToMain ***/
|
||
397 | #endif /* BOOTLOADER_OF_MAIN_DEVICE > 0 */ |
||
398 | |||
399 | |||
400 | #endif /* BOOT_COM_ENABLE > 0 */ |
||
401 | |||
402 | |||
403 | |||
404 | |||
405 | |||
406 | |||
407 | #if (BOOT_COM_UART_ENABLE > 0) |
||
408 | |||
409 | /************************************************************************************//** |
||
410 | ** \brief This function transmitts the packet direct with UART.
|
||
411 | ** \param data Pointer to the byte buffer with packet data.
|
||
412 | ** \param len Number of data bytes that need to be transmitted.
|
||
413 | ** \return none.
|
||
414 | **
|
||
415 | ****************************************************************************************/
|
||
416 | void ComTransmitPacketDirect(blt_int8u *data, blt_int8u len) {
|
||
417 | #if (BOOT_COM_BLUETOOTH_UART_ENABLE > 0) |
||
418 | if (comActiveInterface == COM_IF_UART) {
|
||
419 | #endif
|
||
420 | UartTransmitPacket(data, len); |
||
421 | #if (BOOT_COM_BLUETOOTH_UART_ENABLE > 0) |
||
422 | } else {
|
||
423 | BluetoothUartTransmitPacket(data, len); |
||
424 | } |
||
425 | #endif
|
||
426 | XcpPacketTransmitted(); |
||
427 | } /*** end of ComTransmitPacketDirect ***/
|
||
428 | |||
429 | #endif
|
||
430 | |||
431 | /*********************************** end of com.c **************************************/
|