From d9c14b539317d30b15b4d5df4bc3844bb43a2b25 Mon Sep 17 00:00:00 2001 From: Frank Voorburg Date: Fri, 28 Jul 2017 15:45:05 +0000 Subject: [PATCH] Refs #316. Implemented critical section utility functions with port for Windows. git-svn-id: https://svn.code.sf.net/p/openblt/code/trunk@315 5dc33758-31d5-4daf-9ae8-b24bf3d40d73 --- Host/Source/LibOpenBLT/CMakeLists.txt | 2 +- Host/Source/LibOpenBLT/port/linux/critutil.c | 64 ++++++ .../Source/LibOpenBLT/port/windows/critutil.c | 151 ++++++++++++ Host/Source/LibOpenBLT/util.h | 4 + Host/Source/LibOpenBLT/xcploader.c | 20 +- Host/Source/LibOpenBLT/xcptpcan.c | 216 +++++++++++++++++- Host/libopenblt.dll | Bin 99328 -> 102400 bytes 7 files changed, 439 insertions(+), 18 deletions(-) create mode 100644 Host/Source/LibOpenBLT/port/linux/critutil.c create mode 100644 Host/Source/LibOpenBLT/port/windows/critutil.c diff --git a/Host/Source/LibOpenBLT/CMakeLists.txt b/Host/Source/LibOpenBLT/CMakeLists.txt index da0a62a5..42f36f10 100644 --- a/Host/Source/LibOpenBLT/CMakeLists.txt +++ b/Host/Source/LibOpenBLT/CMakeLists.txt @@ -66,7 +66,7 @@ if(WIN32) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DPLATFORM_WIN32 -D_CRT_SECURE_NO_WARNINGS") elseif(UNIX) set(PROJECT_PORT_DIR ${PROJECT_SOURCE_DIR}/port/linux) - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DPLATFORM_LINUX") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DPLATFORM_LINUX -pthread") endif(WIN32) # Set the output directory diff --git a/Host/Source/LibOpenBLT/port/linux/critutil.c b/Host/Source/LibOpenBLT/port/linux/critutil.c new file mode 100644 index 00000000..a0b67609 --- /dev/null +++ b/Host/Source/LibOpenBLT/port/linux/critutil.c @@ -0,0 +1,64 @@ +/************************************************************************************//** +* \file port/linux/critutil.c +* \brief Critical section utility source file. +* \ingroup Utility +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2017 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include /* for standard integer types */ +#include /* for boolean type */ +#include /* for posix threads */ +#include "util.h" /* Utility module */ + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ + + +/************************************************************************************//** +** \brief Enters a critical section. The functions UtilCriticalSectionEnter and +** UtilCriticalSectionExit should always be used in a pair. +** +****************************************************************************************/ +void UtilCriticalSectionEnter(void) +{ +} /*** end of UtilCriticalSectionEnter ***/ + + +/************************************************************************************//** +** \brief Leaves a critical section. The functions UtilCriticalSectionEnter and +** UtilCriticalSectionExit should always be used in a pair. +** +****************************************************************************************/ +void UtilCriticalSectionExit(void) +{ +} /*** end of UtilCriticalSectionExit ***/ + + +/*********************************** end of critutil.c *********************************/ + diff --git a/Host/Source/LibOpenBLT/port/windows/critutil.c b/Host/Source/LibOpenBLT/port/windows/critutil.c new file mode 100644 index 00000000..7b57ba12 --- /dev/null +++ b/Host/Source/LibOpenBLT/port/windows/critutil.c @@ -0,0 +1,151 @@ +/************************************************************************************//** +* \file port/windows/critutil.c +* \brief Critical section utility source file. +* \ingroup Utility +* \internal +*---------------------------------------------------------------------------------------- +* C O P Y R I G H T +*---------------------------------------------------------------------------------------- +* Copyright (c) 2017 by Feaser http://www.feaser.com All rights reserved +* +*---------------------------------------------------------------------------------------- +* L I C E N S E +*---------------------------------------------------------------------------------------- +* This file is part of OpenBLT. OpenBLT is free software: you can redistribute it and/or +* modify it under the terms of the GNU General Public License as published by the Free +* Software Foundation, either version 3 of the License, or (at your option) any later +* version. +* +* OpenBLT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR +* PURPOSE. See the GNU General Public License for more details. +* +* You have received a copy of the GNU General Public License along with OpenBLT. It +* should be located in ".\Doc\license.html". If not, contact Feaser to obtain a copy. +* +* \endinternal +****************************************************************************************/ + +/**************************************************************************************** +* Include files +****************************************************************************************/ +#include /* for assertions */ +#include /* for standard integer types */ +#include /* for boolean type */ +#include /* for windows library */ +#include "util.h" /* Utility module */ + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/** \brief Flag to determine if the critical section object was already initialized. */ +static volatile bool criticalSectionInitialized = false; + +/** \brief Crital section nesting counter. ***/ +static volatile uint32_t criticalSectionNesting; + +/** \brief Critical section object. */ +static volatile CRITICAL_SECTION criticalSection; + + +/************************************************************************************//** +** \brief Initializes the critical section module. Should be called before the +** Enter/Exit functions are used. It is okay to call this initialization +** multiple times from different modules. +** +****************************************************************************************/ +void UtilCriticalSectionInit(void) +{ + /* Only initialize if not yet done so previously. */ + if (!criticalSectionInitialized) + { + /* Initialize the critical section object. */ + InitializeCriticalSection(&criticalSection); + /* Reset nesting counter. */ + criticalSectionNesting = 0; + /* Set initialized flag. */ + criticalSectionInitialized = true; + } +} /*** end of UtilCriticalSectionInit ***/ + + +/************************************************************************************//** +** \brief Terminates the critical section module. Should be called once critical +** sections are no longer needed. Typically called from another module's +** termination function that also initialized it. It is okay to call this +** termination multiple times from different modules. +** +****************************************************************************************/ +void UtilCriticalSectionTerminate(void) +{ + /* Only terminate if it was initialized. */ + if (criticalSectionInitialized) + { + /* Reset the initialized flag. */ + criticalSectionInitialized = false; + /* Reset nesting counter. */ + criticalSectionNesting = 0; + /* Delete the critical section object. */ + DeleteCriticalSection(&criticalSection); + } +} /*** end of UtilCriticalSectionTerminate ***/ + + + +/************************************************************************************//** +** \brief Enters a critical section. The functions UtilCriticalSectionEnter and +** UtilCriticalSectionExit should always be used in a pair. +** +****************************************************************************************/ +void UtilCriticalSectionEnter(void) +{ + /* Check initialization. */ + assert(criticalSectionInitialized); + + /* Only continue if actually initialized. */ + if (criticalSectionInitialized) + { + /* Enter the critical section if not already entered. */ + if (criticalSectionNesting == 0) + { + EnterCriticalSection(&criticalSection); + } + /* Increment nesting counter. */ + criticalSectionNesting++; + } +} /*** end of UtilCriticalSectionEnter ***/ + + +/************************************************************************************//** +** \brief Leaves a critical section. The functions UtilCriticalSectionEnter and +** UtilCriticalSectionExit should always be used in a pair. +** +****************************************************************************************/ +void UtilCriticalSectionExit(void) +{ + /* Check initialization. */ + assert(criticalSectionInitialized); + + /* Only continue if actually initialized. */ + if (criticalSectionInitialized) + { + /* Sanity check. */ + assert(criticalSectionNesting > 0); + + /* Decrement nesting counter if it is valid. */ + if (criticalSectionNesting > 0) + { + criticalSectionNesting--; + /* Leave the critical section. */ + if (criticalSectionNesting == 0) + { + LeaveCriticalSection(&criticalSection); + } + } + } +} /*** end of UtilCriticalSectionExit ***/ + + +/*********************************** end of critutil.c *********************************/ + diff --git a/Host/Source/LibOpenBLT/util.h b/Host/Source/LibOpenBLT/util.h index 4d538fbc..56ffb062 100644 --- a/Host/Source/LibOpenBLT/util.h +++ b/Host/Source/LibOpenBLT/util.h @@ -49,6 +49,10 @@ uint32_t UtilChecksumCrc32Calculate(uint8_t const * data, uint32_t len); bool UtilFileExtractFilename(char const * fullFilename, char * filenameBuffer); uint32_t UtilTimeGetSystemTimeMs(void); void UtilTimeDelayMs(uint16_t delay); +void UtilCriticalSectionInit(void); +void UtilCriticalSectionTerminate(void); +void UtilCriticalSectionEnter(void); +void UtilCriticalSectionExit(void); #ifdef __cplusplus diff --git a/Host/Source/LibOpenBLT/xcploader.c b/Host/Source/LibOpenBLT/xcploader.c index c630c4fc..35c28f25 100644 --- a/Host/Source/LibOpenBLT/xcploader.c +++ b/Host/Source/LibOpenBLT/xcploader.c @@ -237,16 +237,16 @@ static bool XcpLoaderStart(void) break; } } - } - /* Check if a connection with the target could be made within the finite amount - * of retries. - */ - if (!xcpConnected) - { - /* Disconnect the transport layer again. */ - xcpSettings.transport->Disconnect(); - /* Update the result. */ - result = false; + /* Check if a connection with the target could be made within the finite amount + * of retries. + */ + if (!xcpConnected) + { + /* Disconnect the transport layer again. */ + xcpSettings.transport->Disconnect(); + /* Update the result. */ + result = false; + } } /* Place the target in programming mode if connected. */ diff --git a/Host/Source/LibOpenBLT/xcptpcan.c b/Host/Source/LibOpenBLT/xcptpcan.c index 69e94ed2..0a042cd2 100644 --- a/Host/Source/LibOpenBLT/xcptpcan.c +++ b/Host/Source/LibOpenBLT/xcptpcan.c @@ -48,12 +48,16 @@ /**************************************************************************************** * Function prototypes ****************************************************************************************/ +/* Transport layer module functions. */ static void XcpTpCanInit(void const * settings); static void XcpTpCanTerminate(void); static bool XcpTpCanConnect(void); static void XcpTpCanDisconnect(void); static bool XcpTpCanSendPacket(tXcpTransportPacket const * txPacket, tXcpTransportPacket * rxPacket, uint16_t timeout); +/* CAN event functions. */ +static void XcpTpCanEventMessageTransmitted(tCanMsg const * msg); +static void XcpTpCanEventMessageReceived(tCanMsg const * msg); /**************************************************************************************** @@ -69,6 +73,20 @@ static const tXcpTransport canTransport = XcpTpCanSendPacket }; +/** \brief CAN driver event functions. */ +static const tCanEvents canEvents = +{ + XcpTpCanEventMessageTransmitted, + XcpTpCanEventMessageReceived +}; + + +/**************************************************************************************** +* Local data declarations +****************************************************************************************/ +/** \brief The settings to use in this transport layer. */ +static tXcpTpCanSettings tpCanSettings; + /***********************************************************************************//** ** \brief Obtains a pointer to the transport layer structure, so that it can be @@ -90,15 +108,103 @@ tXcpTransport const * XcpTpCanGetTransport(void) ****************************************************************************************/ static void XcpTpCanInit(void const * settings) { + char * canDeviceName; + tCanInterface const * canInterface = NULL; + tCanSettings canSettings; + + /* Reset transport layer settings. */ + tpCanSettings.device = NULL; + tpCanSettings.channel = 0; + tpCanSettings.baudrate = 500000; + tpCanSettings.transmitId = 0x667; + tpCanSettings.receiveId = 0x7e1; + tpCanSettings.useExtended = false; + + /* This module uses critical sections so initialize them. */ + UtilCriticalSectionInit(); + /* Check parameters. */ assert(settings != NULL); /* Only continue with valid parameters. */ if (settings != NULL) /*lint !e774 */ { - /* ##Vg TODO Extract and set the pointer to the CAN interface to link. */ + /* Shallow copy the transport layer settings for layer usage. */ + tpCanSettings = *((tXcpTpCanSettings *)settings); + /* The device name is a pointer and it is not gauranteed that it stays valid so we need + * to deep copy this one. note the +1 for '\0' in malloc. + */ + assert(((tXcpTpCanSettings *)settings)->device != NULL); + if (((tXcpTpCanSettings *)settings)->device != NULL) /*lint !e774 */ + { + canDeviceName = malloc(strlen(((tXcpTpCanSettings *)settings)->device) + 1); + assert(canDeviceName != NULL); + if (canDeviceName != NULL) /*lint !e774 */ + { + strcpy(canDeviceName, ((tXcpTpCanSettings *)settings)->device); + tpCanSettings.device = canDeviceName; + + /* Determine the pointer to the correct CAN interface, based on the specified + * device name. + */ +#if defined(PLATFORM_WIN32) + if (strcmp(tpCanSettings.device, "peak_pcanusb") == 0) + { + canInterface = PCanUsbGetInterface(); + } +#endif + } + } } - /* ##Vg TODO Implement CAN module initialization. */ + + /* Convert the transport layer settings to CAN driver settings. */ + canSettings.devicename = tpCanSettings.device; + canSettings.channel = tpCanSettings.channel; + switch (tpCanSettings.baudrate) + { + case 1000000: + canSettings.baudrate = CAN_BR1M; + break; + case 800000: + canSettings.baudrate = CAN_BR800K; + break; + case 500000: + canSettings.baudrate = CAN_BR500K; + break; + case 250000: + canSettings.baudrate = CAN_BR250K; + break; + case 125000: + canSettings.baudrate = CAN_BR125K; + break; + case 100000: + canSettings.baudrate = CAN_BR100K; + break; + case 50000: + canSettings.baudrate = CAN_BR50K; + break; + case 20000: + canSettings.baudrate = CAN_BR20K; + break; + case 10000: + canSettings.baudrate = CAN_BR10K; + break; + default: + /* Default to 500 kbits/sec in case an unsupported baudrate was specified. */ + canSettings.baudrate = CAN_BR500K; + break; + } + /* Configure the reception acceptance filter to receive only one CAN identifier. */ + canSettings.code = tpCanSettings.receiveId; + if (tpCanSettings.useExtended) + { + canSettings.code |= CAN_MSG_EXT_ID_MASK; + } + canSettings.mask = 0x9fffffff; + /* Initialize the CAN driver. */ + CanInit(&canSettings, canInterface); + /* Register CAN event functions. */ + CanRegisterEvents(&canEvents); } /*** end of XcpTpCanInit ***/ @@ -108,7 +214,22 @@ static void XcpTpCanInit(void const * settings) ****************************************************************************************/ static void XcpTpCanTerminate(void) { - /* ##Vg TODO Implement. */ + /* Terminate the CAN driver. */ + CanTerminate(); + /* Release memory that was allocated for storing the device name. */ + if (tpCanSettings.device != NULL) + { + free((char *)tpCanSettings.device); + } + /* Reset transport layer settings. */ + tpCanSettings.device = NULL; + tpCanSettings.channel = 0; + tpCanSettings.baudrate = 500000; + tpCanSettings.transmitId = 0x667; + tpCanSettings.receiveId = 0x7e1; + tpCanSettings.useExtended = false; + /* This module used critical sections so terminate them. */ + UtilCriticalSectionTerminate(); } /*** end of XcpTpCanTerminate ***/ @@ -121,7 +242,11 @@ static bool XcpTpCanConnect(void) { bool result = false; - /* ##Vg TODO Implement. */ + /* Connect to the CAN driver. */ + if (CanConnect()) + { + result = true; + } /* Give the result back to the caller. */ return result; @@ -134,7 +259,8 @@ static bool XcpTpCanConnect(void) ****************************************************************************************/ static void XcpTpCanDisconnect(void) { - /* ##Vg TODO Disconnect from the CAN bus. */ + /* Disconnect from the CAN driver. */ + CanDisconnect(); } /*** end of XcpTpCanDisconnect ***/ @@ -152,7 +278,9 @@ static bool XcpTpCanSendPacket(tXcpTransportPacket const * txPacket, tXcpTransportPacket * rxPacket, uint16_t timeout) { bool result = false; - + tCanMsg canMsg; + uint32_t responseTimeoutTime = 0; + /* Check parameters. */ assert(txPacket != NULL); assert(rxPacket != NULL); @@ -160,11 +288,85 @@ static bool XcpTpCanSendPacket(tXcpTransportPacket const * txPacket, /* Only continue with valid parameters. */ if ( (txPacket != NULL) && (rxPacket != NULL) ) /*lint !e774 */ { - /* ##Vg TODO Implement. */ + /* Only continue if data length fits in a CAN message and the CAN bus is not in error + * state. + */ + if ( ((txPacket->len <= CAN_MSG_MAX_LEN)) && (!CanIsBusError()) ) + { + /* Set result value to okay and only change it from now on if an error occurred. */ + result = true; + /* Store the packet data into a CAN message. */ + canMsg.id = tpCanSettings.transmitId; + if (tpCanSettings.useExtended) + { + canMsg.id |= CAN_MSG_EXT_ID_MASK; + } + canMsg.dlc = txPacket->len; + for (uint8_t idx = 0; idx < canMsg.dlc; idx++) + { + canMsg.data[idx] = txPacket->data[idx]; + } + /* Submit the packet for transmission on the CAN bus. */ + if (!CanTransmit(&canMsg)) + { + result = false; + } + /* Only continue if the transmission was successful. */ + if (result) + { + /* Determine timeout time for the response packet. */ + responseTimeoutTime = UtilTimeGetSystemTimeMs() + timeout; + /* Poll with timeout detection to receive the response packet as a CAN message + * on the CAN bus. + */ + while (UtilTimeGetSystemTimeMs() < responseTimeoutTime) + { + /* ##Vg TODO Implement packet reception. */ + break; + } + } + } } /* Give the result back to the caller. */ return result; } /*** end of XcpTpCanSendPacket ***/ +/************************************************************************************//** +** \brief CAN driver event callback function that gets called each time a CAN +** message was transmitted. +** \param msg Pointer to the transmitted CAN message. +** +****************************************************************************************/ +static void XcpTpCanEventMessageTransmitted(tCanMsg const * msg) +{ + (void)msg; + + /* Nothing needs to be done here for now. Added for possible future expansions. */ +} /*** end of XcpTpCanEventMessageTransmitted ***/ + + +/************************************************************************************//** +** \brief CAN driver event callback function that gets called each time a CAN +** message was received. +** \param msg Pointer to the received CAN message. +** +****************************************************************************************/ +static void XcpTpCanEventMessageReceived(tCanMsg const * msg) +{ + /* Determine CAN identifier for receiving XCP commands via CAN. */ + uint32_t tpCanRxId = tpCanSettings.receiveId; + if (tpCanSettings.useExtended) + { + tpCanRxId |= CAN_MSG_EXT_ID_MASK; + } + + /* Check if the identifier matches the one for XCP on CAN. */ + if (msg->id == tpCanRxId) + { + /* ##Vg TODO process CAN message reception. */ + } +} /*** end of XcpTpCanEventMessageReceived ***/ + + /*********************************** end of xcptpcan.c *********************************/ diff --git a/Host/libopenblt.dll b/Host/libopenblt.dll index 879470e2efebb350448aa1b22d8b1669c701cb3d..7f9b29fb82884d1ba1fa8e9d74d1bc2d4063f313 100644 GIT binary patch delta 26573 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