From 1c9770dd6480811deeca191e7f92be61056ff3c5 Mon Sep 17 00:00:00 2001 From: Frank Voorburg Date: Thu, 24 Aug 2017 17:16:22 +0000 Subject: [PATCH] Refs #316. Added Lawicel CANUSB CAN interface support to LibOpenBLT and updated version numbers of LibOpenBLT and BootCommander. git-svn-id: https://svn.code.sf.net/p/openblt/code/trunk@354 5dc33758-31d5-4daf-9ae8-b24bf3d40d73 --- Doc/doxygen/DoxyfileBootCommander | 2 +- Doc/doxygen/DoxyfileLibOpenBLT | 2 +- Host/BootCommander.exe | Bin 152064 -> 162816 bytes Host/Source/BootCommander/main.c | 2 +- Host/Source/LibOpenBLT/openblt.c | 6 +- .../port/windows/canif/kvaser/leaflight.c | 2 +- .../port/windows/canif/lawicel/canusb.c | 619 +++++++++++++++--- .../port/windows/canif/peak/pcanusb.c | 2 +- Host/libopenblt.dll | Bin 134144 -> 142336 bytes 9 files changed, 536 insertions(+), 99 deletions(-) diff --git a/Doc/doxygen/DoxyfileBootCommander b/Doc/doxygen/DoxyfileBootCommander index d24b9e36..bc582527 100644 --- a/Doc/doxygen/DoxyfileBootCommander +++ b/Doc/doxygen/DoxyfileBootCommander @@ -38,7 +38,7 @@ PROJECT_NAME = "BootCommander - Reference Manual" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.0.0 +PROJECT_NUMBER = 1.1.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/Doc/doxygen/DoxyfileLibOpenBLT b/Doc/doxygen/DoxyfileLibOpenBLT index 112d1daa..09dfc6ea 100644 --- a/Doc/doxygen/DoxyfileLibOpenBLT +++ b/Doc/doxygen/DoxyfileLibOpenBLT @@ -38,7 +38,7 @@ PROJECT_NAME = "OpenBLT Host Library - Reference Manual" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.0.0 +PROJECT_NUMBER = 1.1.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/Host/BootCommander.exe b/Host/BootCommander.exe index a4ba9e0d166e96df3bb7cf4f7e2640cfa30c4ce1..61df9303441b3177a2f0f9ff90887558dcb38197 100644 GIT binary patch delta 39253 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 Wwt;DxqLV<|^Ae2Sv>`pw;r{?JUgLfM diff --git a/Host/Source/BootCommander/main.c b/Host/Source/BootCommander/main.c index aac4e6c7..c65157dd 100644 --- a/Host/Source/BootCommander/main.c +++ b/Host/Source/BootCommander/main.c @@ -397,7 +397,7 @@ int main(int argc, char const * const argv[]) static void DisplayProgramInfo(void) { printf("--------------------------------------------------------------------------\n"); - printf("BootCommander version 1.00. Performs firmware updates on a microcontroller\n"); + printf("BootCommander version 1.01. Performs firmware updates on a microcontroller\n"); printf("based system that runs the OpenBLT bootloader.\n\n"); printf("Copyright (c) 2017 by Feaser http://www.feaser.com\n"); printf("-------------------------------------------------------------------------\n"); diff --git a/Host/Source/LibOpenBLT/openblt.c b/Host/Source/LibOpenBLT/openblt.c index 3eb00559..8c05737c 100644 --- a/Host/Source/LibOpenBLT/openblt.c +++ b/Host/Source/LibOpenBLT/openblt.c @@ -46,13 +46,13 @@ * Macro definitions ****************************************************************************************/ /** \brief The version number of the library as an integer. The number has two digits - * for major-, minor-, and build-version. Version 1.05.12 would for example be + * for major-, minor-, and patch-version. Version 1.05.12 would for example be * 10512. */ -#define BLT_VERSION_NUMBER (10000u) +#define BLT_VERSION_NUMBER (10100u) /** \brief The version number of the library as a null-terminated string. */ -#define BLT_VERSION_STRING "1.00.00" +#define BLT_VERSION_STRING "1.01.00" /**************************************************************************************** diff --git a/Host/Source/LibOpenBLT/port/windows/canif/kvaser/leaflight.c b/Host/Source/LibOpenBLT/port/windows/canif/kvaser/leaflight.c index 999b4616..62d82ed5 100644 --- a/Host/Source/LibOpenBLT/port/windows/canif/kvaser/leaflight.c +++ b/Host/Source/LibOpenBLT/port/windows/canif/kvaser/leaflight.c @@ -46,7 +46,7 @@ /*************************************************************************************** * Type definitions ****************************************************************************************/ -/* Type definitions of the function in the Kvaser CANLIB API that this CAN interface +/* Type definitions of the functions in the Kvaser CANLIB API that this CAN interface * uses. */ typedef void (__stdcall * tLeafLightLibFuncInitializeLibrary)(void); diff --git a/Host/Source/LibOpenBLT/port/windows/canif/lawicel/canusb.c b/Host/Source/LibOpenBLT/port/windows/canif/lawicel/canusb.c index ecd04901..bc0c5a19 100644 --- a/Host/Source/LibOpenBLT/port/windows/canif/lawicel/canusb.c +++ b/Host/Source/LibOpenBLT/port/windows/canif/lawicel/canusb.c @@ -41,6 +41,19 @@ #include "lawicel_can.h" /* for Lawicel CANUSB API */ +/*************************************************************************************** +* Type definitions +****************************************************************************************/ +/* Type definitions of the functions in the Lawicel CANUSB API that this CAN interface + * uses. + */ +typedef CANHANDLE (__stdcall * tCanUsbLibFuncOpen)(LPCSTR szID, LPCSTR szBitrate, uint32_t acceptance_code, uint32_t acceptance_mask, uint32_t flags); +typedef int32_t (__stdcall * tCanUsbLibFuncClose)(CANHANDLE h); +typedef int32_t (__stdcall * tCanUsbLibFuncWrite)(CANHANDLE h, CANMsg *msg); +typedef int32_t (__stdcall * tCanUsbLibFuncStatus)(CANHANDLE h); +typedef int32_t (__stdcall * tCanUsbLibFuncSetReceiveCallBack)(CANHANDLE h, LPFNDLL_RECEIVE_CALLBACK fn); + + /*************************************************************************************** * Function prototypes ****************************************************************************************/ @@ -52,8 +65,19 @@ static void CanUsbDisconnect(void); static bool CanUsbTransmit(tCanMsg const * msg); static bool CanUsbIsBusError(void); static void CanUsbRegisterEvents(tCanEvents const * events); -/* CAN message reception thread. */ -static DWORD WINAPI CanUsbReceptionThread(LPVOID pv); +static bool CanUsbOpenChannel(void); +static bool CanUsbCloseChannel(void); +/* Lawicel CANUSB library handling. */ +static void CanUsbLibLoadDll(void); +static void CanUsbLibUnloadDll(void); +static void __stdcall CanUsbLibReceiveCallback(CANMsg const * pMsg); +static CANHANDLE CanUsbLibFuncOpen(LPCSTR szID, LPCSTR szBitrate, + uint32_t acceptance_code, uint32_t acceptance_mask, + uint32_t flags); +static int32_t CanUsbLibFuncClose(CANHANDLE h); +static int32_t CanUsbLibFuncWrite(CANHANDLE h, CANMsg * msg); +static int32_t CanUsbLibFuncStatus(CANHANDLE h); +static int32_t CanUsbLibFuncSetReceiveCallBack(CANHANDLE h, LPFNDLL_RECEIVE_CALLBACK fn); /**************************************************************************************** @@ -84,11 +108,26 @@ static tCanEvents * canUsbEventsList; /** \brief Total number of event entries into the \ref canUsbEventsList list. */ static uint32_t canUsbEventsEntries; -/** \brief Handle for the event to terminate the reception thread. */ -static HANDLE canUsbTerminateEvent; +/** \brief Handle to the Lawicel CANUSB dynamic link library. */ +static HINSTANCE canUsbDllHandle; -/** \brief Handle for the CAN reception thread. */ -static HANDLE canUsbRxThreadHandle; +/** \brief Handle to the CAN channel. */ +static CANHANDLE canUsbCanHandle; + +/** \brief Function pointer to the Lawicel CANUSB canusb_Open function. */ +static tCanUsbLibFuncOpen canUsbLibFuncOpenPtr; + +/** \brief Function pointer to the Lawicel CANUSB canusb_Close function. */ +static tCanUsbLibFuncClose canUsbLibFuncClosePtr; + +/** \brief Function pointer to the Lawicel CANUSB canusb_Write function. */ +static tCanUsbLibFuncWrite canUsbLibFuncWritePtr; + +/** \brief Function pointer to the Lawicel CANUSB canusb_Status function. */ +static tCanUsbLibFuncStatus canUsbLibFuncStatusPtr; + +/** \brief Function pointer to the Lawicel CANUSB canusb_setReceiveCallBack function. */ +static tCanUsbLibFuncSetReceiveCallBack canUsbLibFuncSetReceiveCallBackPtr; /***********************************************************************************//** @@ -115,8 +154,14 @@ static void CanUsbInit(tCanSettings const * settings) /* Initialize locals. */ canUsbEventsList = NULL; canUsbEventsEntries = 0; - canUsbTerminateEvent = NULL; - canUsbRxThreadHandle = NULL; + canUsbDllHandle = NULL; + canUsbCanHandle = 0; + /* Reset library function pointers. */ + canUsbLibFuncOpenPtr = NULL; + canUsbLibFuncClosePtr = NULL; + canUsbLibFuncWritePtr = NULL; + canUsbLibFuncStatusPtr = NULL; + canUsbLibFuncSetReceiveCallBackPtr = NULL; /* Reset CAN interface settings. */ canUsbSettings.devicename = ""; canUsbSettings.channel = 0; @@ -146,7 +191,10 @@ static void CanUsbInit(tCanSettings const * settings) canUsbSettings.devicename = canDeviceName; } } - /* ##Vg TODO Perform initialization of Lawicel CANUSB API. */ + /* Perform initialization of Lawicel CANUSB API. */ + CanUsbLibLoadDll(); + /* Open the CAN channel. */ + (void)CanUsbOpenChannel(); } } /*** end of CanUsbInit ***/ @@ -157,7 +205,10 @@ static void CanUsbInit(tCanSettings const * settings) ****************************************************************************************/ static void CanUsbTerminate(void) { - /* ##Vg TODO Perform termination of Lawicel CANUSB API. */ + /* Close the CAN channel. */ + (void)CanUsbCloseChannel(); + /* Perform termination of Lawicel CANUSB API. */ + CanUsbLibUnloadDll(); /* Release memory that was allocated for storing the device name. */ if (canUsbSettings.devicename != NULL) { @@ -186,56 +237,27 @@ static void CanUsbTerminate(void) static bool CanUsbConnect(void) { bool result = false; - bool baudrateSupported = true; - /* Note that the device name itself is not needed anymore at this point, it was only - * needed by the CAN driver to link the correct interface (this one). The channel is - * also don't care as the adapter only has one channel. Check settings. - */ - assert(baudrateSupported); - - /* Invalidate handles. */ - canUsbTerminateEvent = NULL; - canUsbRxThreadHandle = NULL; - - /* Only continue with valid settings. */ - if (baudrateSupported) + /* Only continue with an opened CAN channel. */ + if (canUsbCanHandle != 0) { /* Init result code to success and only negate it on detection of error. */ result = true; - - /* ##Vg TODO Process and verify settings, configure acceptance filter, connect. */ - result = false; /* Temporary. */ - - /* Create the terminate event handle used in the reception thread. */ - if (result) + /* Set the reception callback function. */ + if (CanUsbLibFuncSetReceiveCallBack(canUsbCanHandle, + CanUsbLibReceiveCallback) <= 0) { - canUsbTerminateEvent = CreateEvent(NULL, TRUE, FALSE, ""); - if (canUsbTerminateEvent == NULL) - { - result = false; - } - } - /* Start the reception thread as the last step. */ - if (result) - { - canUsbRxThreadHandle = CreateThread(NULL, 0, CanUsbReceptionThread, - NULL, 0, NULL); - if (canUsbRxThreadHandle == NULL) - { - result = false; - } + result = false; } } /* Clean-up in case an error occurred. */ if (!result) { - if (canUsbTerminateEvent != NULL) + if (canUsbCanHandle != 0) { - /* Close the event handle. */ - (void)CloseHandle(canUsbTerminateEvent); - canUsbTerminateEvent = NULL; + /* Reset the reception callback handler and close the channel. */ + (void)CanUsbLibFuncSetReceiveCallBack(canUsbCanHandle, NULL); } } /* Give the result back to the caller. */ @@ -249,24 +271,11 @@ static bool CanUsbConnect(void) ****************************************************************************************/ static void CanUsbDisconnect(void) { - /* Stop the reception thread. */ - if (canUsbRxThreadHandle != NULL) + /* Reset the reception callback handler and close the channel. */ + if (canUsbCanHandle != 0) { - /* Trigger event to request the reception thread to stop. */ - (void)SetEvent(canUsbTerminateEvent); - /* Wait for the thread to signal termination. */ - (void)WaitForSingleObject(canUsbRxThreadHandle, INFINITE); - /* Close the thread handle. */ - (void)CloseHandle(canUsbRxThreadHandle); - canUsbRxThreadHandle = NULL; + (void)CanUsbLibFuncSetReceiveCallBack(canUsbCanHandle, NULL); } - /* Close the terminate event handle. */ - if (canUsbTerminateEvent != NULL) - { - (void)CloseHandle(canUsbTerminateEvent); - canUsbTerminateEvent = NULL; - } - /* ##Vg TODO Go off the bus and close the channel. */ } /*** end of CanUsbDisconnect ***/ @@ -279,14 +288,47 @@ static void CanUsbDisconnect(void) static bool CanUsbTransmit(tCanMsg const * msg) { bool result = false; + CANMsg txMsg; + tCanEvents const * pEvents; /* Check parameters. */ assert(msg != NULL); - /* Only continue with valid parameters. */ - if (msg != NULL) /*lint !e774 */ + /* Only continue with valid parameters and handle. */ + if ( (msg != NULL) && (canUsbCanHandle != 0) ) /*lint !e774 */ { - /* ##Vg TODO Transmit and trigger event(s). */ + /* Convert the message to a type supported by the PCAN-Basic API. */ + txMsg.id = msg->id & 0x1fffffffu; + txMsg.flags = 0; + if ((msg->id & CAN_MSG_EXT_ID_MASK) != 0) + { + txMsg.flags |= CANMSG_EXTENDED; + } + txMsg.len = msg->dlc; + for (uint8_t idx = 0; idx < msg->dlc; idx++) + { + txMsg.data[idx] = msg->data[idx]; + } + /* Submit CAN message for transmission. */ + if (CanUsbLibFuncWrite(canUsbCanHandle, &txMsg) > 0) + { + /* Update result value to success. */ + result = true; + /* Trigger transmit complete event(s). */ + pEvents = canUsbEventsList; + for (uint32_t idx = 0; idx < canUsbEventsEntries; idx++) + { + if (pEvents != NULL) + { + if (pEvents->MsgTxed != NULL) + { + pEvents->MsgTxed(msg); + } + /* Move on to the next entry in the list. */ + pEvents++; + } + } + } } /* Give the result back to the caller. */ return result; @@ -301,9 +343,27 @@ static bool CanUsbTransmit(tCanMsg const * msg) static bool CanUsbIsBusError(void) { bool result = false; + int32_t status; - /* ##Vg TODO Check and process status. */ - + /* Only continue with valid handle. */ + if (canUsbCanHandle != 0) + { + /* Check and process status. */ + status = CanUsbLibFuncStatus(canUsbCanHandle); + if ((status & CANSTATUS_BUS_ERROR) != 0) + { + result = true; + /* Due to poor time performance of the Lawicel CANUSB API when opening and closing + * the CAN channel, this is not done in CanUsbConnect/Disconnect, but in + * CanUsbInit/Terminate as a performance optimization workaround. Usually, when a + * bus error is detected here, the caller will do a Disconnect/Connect sequence to + * resolve the error, but this won't have any effect due to the before mentioned + * workaround. For this reason a CAN channel close/open was explicitely added here. + */ + (void)CanUsbCloseChannel(); + (void)CanUsbOpenChannel(); + } + } /* Give the result back to the caller. */ return result; } /*** end of CanUsbIsBusError ***/ @@ -350,37 +410,414 @@ static void CanUsbRegisterEvents(tCanEvents const * events) /************************************************************************************//** -** \brief CAN message reception thread. -** \param pv Pointer to thread parameters. -** \return Thread exit code. +** \brief Opens the CAN channel. Note that the opening of the CAN channel takes a +** long time in the Lawicel CANUSB API, therefore this is not done in +** CanUsbConnect() for this CAN interface. +** \return True if successful, false otherwise. ** ****************************************************************************************/ -static DWORD WINAPI CanUsbReceptionThread(LPVOID pv) +static bool CanUsbOpenChannel(void) { - DWORD waitResult; - bool running = true; + bool result = false; + bool baudrateSupported = true; + char bitrateStr[16] = ""; - /* Parameter not used. */ - (void)pv; + /* Reset the channel handle. */ + canUsbCanHandle = 0; - /* Enter thread's infinite loop. */ - while (running) + /* Convert the baudrate to a value supported by the Lawical CANUSB API. */ + switch (canUsbSettings.baudrate) { - waitResult = WaitForSingleObject(canUsbTerminateEvent, 10); - switch (waitResult) + case CAN_BR10K: + strcat(bitrateStr, "10"); + break; + case CAN_BR20K: + strcat(bitrateStr, "20"); + break; + case CAN_BR50K: + strcat(bitrateStr, "50"); + break; + case CAN_BR100K: + strcat(bitrateStr, "100"); + break; + case CAN_BR125K: + strcat(bitrateStr, "0x03:0x1c"); + break; + case CAN_BR250K: + strcat(bitrateStr, "250"); + break; + case CAN_BR500K: + strcat(bitrateStr, "500"); + break; + case CAN_BR800K: + strcat(bitrateStr, "800"); + break; + case CAN_BR1M: + strcat(bitrateStr, "1000"); + break; + default: + baudrateSupported = false; + break; + } + /* Validate baudrate. */ + assert(baudrateSupported); + + /* Only continue with a valid baudrate. */ + if (baudrateSupported) + { + /* Configure reception acceptance filter. Default to an open filter, which will be + * used in case both 11-bit standard and 29-bit extended CAN identiers should be + * received. It is not possible to optimize the filter for this scenario, because + * the SJA1000's acceptance filter on the CANUSB is pre-configured for dual filter + * mode. + */ + uint8_t regACR0 = 0x00u; + uint8_t regAMR0 = 0xffu; + uint8_t regACR1 = 0x00u; + uint8_t regAMR1 = 0xffu; + uint8_t regACR2 = 0x00u; + uint8_t regAMR2 = 0xffu; + uint8_t regACR3 = 0x00u; + uint8_t regAMR3 = 0xffu; + /* Use bit logic to determine if the filter should accept standard 11-bit and/or + * extended 29-bit identifiers: + * acceptStdId = ((mask & code & CAN_MSG_EXT_ID_MASK) == 0) + * acceptExtId = ((mask & code & CAN_MSG_EXT_ID_MASK) != 0) || + * ((mask & CAN_MSG_EXT_ID_MASK) == 0) + */ + bool acceptStdID = ((canUsbSettings.mask & canUsbSettings.code & CAN_MSG_EXT_ID_MASK) == 0); + bool acceptExtID = ((canUsbSettings.mask & canUsbSettings.code & CAN_MSG_EXT_ID_MASK) != 0) || + ((canUsbSettings.mask & CAN_MSG_EXT_ID_MASK) == 0); + /* Configure acceptance filter for standard 11-bit identifiers. */ + if (acceptStdID) { - /* Termination event. */ - case WAIT_OBJECT_0 + 0: /*lint !e835 */ - /* Stop thread. */ - running = false; - break; - default: - break; + /* Set 11-bit code and mask, taking into account that the meaning of the mask bits + * on the SJA1000 is inverted: 1=don't care and 0=care. + */ + uint16_t code11bit = canUsbSettings.code & 0x7ffu; + uint16_t mask11bit = ~(canUsbSettings.mask & 0x7ffu); + /* Convert to ACRx and AMRx register values. */ + regACR0 = (uint8_t)(code11bit >> 3); + regAMR0 = (uint8_t)(mask11bit >> 3); + regACR1 = ((uint8_t)(code11bit << 5)) | 0x1fu; + regAMR1 = ((uint8_t)(mask11bit << 5)) | 0x1fu; + regACR2 = (uint8_t)(code11bit >> 3); + regAMR2 = (uint8_t)(mask11bit >> 3); + regACR3 = ((uint8_t)(code11bit << 5)) | 0x1fu; + regAMR3 = ((uint8_t)(mask11bit << 5)) | 0x1fu; + } + /* Configure acceptance filter for extended 29-bit identifiers. */ + else if (acceptExtID) + { + /* Set 29-bit code and mask, taking into account that the meaning of the mask bits + * on the SJA1000 is inverted: 1=don't care and 0=care. Also note that only the 16 + * most significant bits of the CAN identifier can be filters due to hardware + * restrictions of the SJA1000. + */ + uint16_t code29bit = (uint16_t)((canUsbSettings.code & 0x1fffffffu) >> 13); + uint16_t mask29bit = ~((uint16_t)((canUsbSettings.mask & 0x1fffffffu) >> 13)); + /* Convert to ACRx and AMRx register values. */ + regACR0 = (uint8_t)(code29bit >> 8); + regAMR0 = (uint8_t)(mask29bit >> 8); + regACR1 = (uint8_t)code29bit; + regAMR1 = (uint8_t)mask29bit; + regACR2 = (uint8_t)(code29bit >> 8); + regAMR2 = (uint8_t)(mask29bit >> 8); + regACR3 = (uint8_t)code29bit; + regAMR3 = (uint8_t)mask29bit; + } + /* Convert to 32-bit code and mask values. */ + uint32_t acceptCode = ((uint32_t)regACR3 << 24) & 0xff000000u; + acceptCode |= ((uint32_t)regACR2 << 16) & 0x00ff0000u; + acceptCode |= ((uint32_t)regACR1 << 8) & 0x0000ff00u; + acceptCode |= ((uint32_t)regACR0) & 0x000000ffu; + uint32_t acceptMask = ((uint32_t)regAMR3 << 24) & 0xff000000u; + acceptMask |= ((uint32_t)regAMR2 << 16) & 0x00ff0000u; + acceptMask |= ((uint32_t)regAMR1 << 8) & 0x0000ff00u; + acceptMask |= ((uint32_t)regAMR0) & 0x000000ffu; + /* Open the CAN channel, configure the reception acceptance filter and obtains the + * channel handle. + */ + canUsbCanHandle = CanUsbLibFuncOpen(NULL, bitrateStr, acceptCode, acceptMask, 0); + if (canUsbCanHandle != 0) + { + result = true; } } - /* Exit thread. */ - return 0; -} /*** end of CanUsbReceptionThread ***/ + /* Give the result back to the caller. */ + return result; +} /*** end of CanUsbOpenChannel ***/ + + +/************************************************************************************//** +** \brief Closes the CAN channel. Note that the closing of the CAN channel takes a +** long time in the Lawicel CANUSB API, therefore this is not done in +** CanUsbDisconnect() for this CAN interface. +** \return True if successful, false otherwise. +** +****************************************************************************************/ +static bool CanUsbCloseChannel(void) +{ + bool result = false; + + /* Close the CAN channel. */ + if (canUsbCanHandle != 0) + { + if (CanUsbLibFuncClose(canUsbCanHandle) >= 0) + { + result = true; + } + canUsbCanHandle = 0; + } + /* Give the result back to the caller. */ + return result; +} /*** end of CanUsbCloseChannel ***/ + + +/************************************************************************************//** +** \brief Loads the Lawicel CANUSBDRV DLL and initializes the API function pointers. +** +****************************************************************************************/ +static void CanUsbLibLoadDll(void) +{ + /* Reset the channel handle. */ + canUsbCanHandle = 0; + /* Start out by resetting the API function pointers. */ + canUsbLibFuncOpenPtr = NULL; + canUsbLibFuncClosePtr = NULL; + canUsbLibFuncWritePtr = NULL; + canUsbLibFuncStatusPtr = NULL; + canUsbLibFuncSetReceiveCallBackPtr = NULL; + + /* Attempt to load the library and obtain a handle to it. */ + canUsbDllHandle = LoadLibrary("canusbdrv"); + + /* Assert libary handle. */ + assert(canUsbDllHandle != NULL); + + /* Only continue if the library was successfully loaded */ + if (canUsbDllHandle != NULL) /*lint !e774 */ + { + /* Set canusb_Open function pointer. */ + canUsbLibFuncOpenPtr = (tCanUsbLibFuncOpen)GetProcAddress(canUsbDllHandle, "canusb_Open"); + /* Set canusb_Close function pointer. */ + canUsbLibFuncClosePtr = (tCanUsbLibFuncClose)GetProcAddress(canUsbDllHandle, "canusb_Close"); + /* Set canusb_Write function pointer. */ + canUsbLibFuncWritePtr = (tCanUsbLibFuncWrite)GetProcAddress(canUsbDllHandle, "canusb_Write"); + /* Set canusb_Status function pointer. */ + canUsbLibFuncStatusPtr = (tCanUsbLibFuncStatus)GetProcAddress(canUsbDllHandle, "canusb_Status"); + /* Set canusb_setReceiveCallBack function pointer. */ + canUsbLibFuncSetReceiveCallBackPtr = (tCanUsbLibFuncSetReceiveCallBack)GetProcAddress(canUsbDllHandle, "canusb_setReceiveCallBack"); + } +} /*** end of CanUsbLibLoadDll ***/ + + +/************************************************************************************//** +** \brief Unloads the Lawicel CANUSBDRV DLL and resets the API function pointers. +** +****************************************************************************************/ +static void CanUsbLibUnloadDll(void) +{ + /* Reset the API function pointers. */ + canUsbLibFuncOpenPtr = NULL; + canUsbLibFuncClosePtr = NULL; + canUsbLibFuncWritePtr = NULL; + canUsbLibFuncStatusPtr = NULL; + canUsbLibFuncSetReceiveCallBackPtr = NULL; + /* Reset the channel handle. */ + canUsbCanHandle = 0; + /* Unload the library and invalidate its handle. */ + if (canUsbDllHandle != NULL) + { + (void)FreeLibrary(canUsbDllHandle); + canUsbDllHandle = NULL; + } +} /*** end of CanUsbLibUnloadDll **/ + + +/************************************************************************************//** +** \brief Callback function that gets called by the Lawicel CANUSB API each time a +** CAN message was received. +** \param pMsg Pointer to the received CAN message. +** +****************************************************************************************/ +static void __stdcall CanUsbLibReceiveCallback(CANMsg const * pMsg) +{ + tCanMsg rxMsg; + tCanEvents const * pEvents; + + /* Only continue with a valid message. */ + if (pMsg != NULL) + { + /* Ignore remote frames. */ + if ((pMsg->flags & CANMSG_RTR) == 0) + { + rxMsg.id = pMsg->id; + if ((pMsg->flags & CANMSG_EXTENDED) != 0) + { + rxMsg.id |= CAN_MSG_EXT_ID_MASK; + } + rxMsg.dlc = pMsg->len; + for (uint8_t idx = 0; idx < rxMsg.dlc; idx++) + { + rxMsg.data[idx] = pMsg->data[idx]; + } + /* Trigger message reception event(s). */ + pEvents = canUsbEventsList; + for (uint32_t idx = 0; idx < canUsbEventsEntries; idx++) + { + if (pEvents != NULL) + { + if (pEvents->MsgRxed != NULL) + { + pEvents->MsgRxed(&rxMsg); + } + /* Move on to the next entry in the list. */ + pEvents++; + } + } + } + } +} /*** end of CanUsbLibReceiveCallback ***/ + + +/************************************************************************************//** +** \brief Open a channel to a physical CAN interface. +** \param szID Serial number for adapter or NULL to open the first found. +** \param szBitrate "10", "20", "50", "100", "250", "500", "800" or "1000" (kbps) or +** as a btr pair. btr0:btr1 pair ex. "0x03:0x1c" can be used to set a custom +** baudrate. +** \param acceptance_code Set to CANUSB_ACCEPTANCE_CODE_ALL to get all messages or +** another code to filter messages. +** \param acceptance_mask Set to CANUSB_ACCEPTANCE_MASK_ALL to get all messages or +** another code to filter messages. +** \param flags Optional flags CANUSB_FLAG_xxx. +** \return Handle to device if open was successful or zero on failure. +** +****************************************************************************************/ +static CANHANDLE CanUsbLibFuncOpen(LPCSTR szID, LPCSTR szBitrate, + uint32_t acceptance_code, uint32_t acceptance_mask, + uint32_t flags) +{ + CANHANDLE result = 0; + + /* Check function pointer and library handle. */ + assert(canUsbLibFuncOpenPtr != NULL); + assert(canUsbDllHandle != NULL); + + /* Only continue with valid function pointer and library handle. */ + if ((canUsbLibFuncOpenPtr != NULL) && (canUsbDllHandle != NULL)) /*lint !e774 */ + { + /* Call library function. */ + result = canUsbLibFuncOpenPtr(szID, szBitrate, acceptance_code, acceptance_mask, + flags); + } + /* Give the result back to the caller. */ + return result; +} /*** end of CanUsbLibFuncOpen ***/ + + +/************************************************************************************//** +** \brief Close channel with handle h. +** \param h Handle to the opened device. +** \return > 0 if successful, ERROR_CANUSB_xxx (<= 0) otherwise. +** +****************************************************************************************/ +static int32_t CanUsbLibFuncClose(CANHANDLE h) +{ + int32_t result = ERROR_CANUSB_GENERAL; + + /* Check function pointer and library handle. */ + assert(canUsbLibFuncClosePtr != NULL); + assert(canUsbDllHandle != NULL); + + /* Only continue with valid function pointer and library handle. */ + if ((canUsbLibFuncClosePtr != NULL) && (canUsbDllHandle != NULL)) /*lint !e774 */ + { + /* Call library function. */ + result = canUsbLibFuncClosePtr(h); + } + /* Give the result back to the caller. */ + return result; +} /*** end of CanUsbLibFuncClose ***/ + + +/************************************************************************************//** +** \brief Write message to channel with handle h. +** \param h Handle to the opened device. +** \param msg CAN message to send. +** \return > 0 if successful, ERROR_CANUSB_xxx (<= 0) otherwise. +** +****************************************************************************************/ +static int32_t CanUsbLibFuncWrite(CANHANDLE h, CANMsg * msg) +{ + int32_t result = ERROR_CANUSB_GENERAL; + + /* Check function pointer and library handle. */ + assert(canUsbLibFuncWritePtr != NULL); + assert(canUsbDllHandle != NULL); + + /* Only continue with valid function pointer and library handle. */ + if ((canUsbLibFuncWritePtr != NULL) && (canUsbDllHandle != NULL)) /*lint !e774 */ + { + /* Call library function. */ + result = canUsbLibFuncWritePtr(h, msg); + } + /* Give the result back to the caller. */ + return result; +} /*** end of CanUsbLibFuncWrite ***/ + + +/************************************************************************************//** +** \brief Get Adapter status for channel with handle h. +** \param h Handle to the opened device. +** \return CANSTATUS_xxx if status info is set, 0 otherwise. +** +****************************************************************************************/ +static int32_t CanUsbLibFuncStatus(CANHANDLE h) +{ + int32_t result = 0; + + /* Check function pointer and library handle. */ + assert(canUsbLibFuncStatusPtr != NULL); + assert(canUsbDllHandle != NULL); + + /* Only continue with valid function pointer and library handle. */ + if ((canUsbLibFuncStatusPtr != NULL) && (canUsbDllHandle != NULL)) /*lint !e774 */ + { + /* Call library function. */ + result = canUsbLibFuncStatusPtr(h); + } + /* Give the result back to the caller. */ + return result; +} /*** end of CanUsbLibFuncStatus ***/ + + +/************************************************************************************//** +** \brief With this method one can define a function that will receive all incoming +** messages. +** \param h Handle to the opened device. +** \param fn Pointer to the callback function to set. NULL removes it again. +** \return > 0 if successful, ERROR_CANUSB_xxx (<= 0) otherwise. +** +****************************************************************************************/ +static int32_t CanUsbLibFuncSetReceiveCallBack(CANHANDLE h, LPFNDLL_RECEIVE_CALLBACK fn) +{ + int32_t result = ERROR_CANUSB_GENERAL; + + /* Check function pointer and library handle. */ + assert(canUsbLibFuncSetReceiveCallBackPtr != NULL); + assert(canUsbDllHandle != NULL); + + /* Only continue with valid function pointer and library handle. */ + if ((canUsbLibFuncSetReceiveCallBackPtr != NULL) && (canUsbDllHandle != NULL)) /*lint !e774 */ + { + /* Call library function. */ + result = canUsbLibFuncSetReceiveCallBackPtr(h, fn); + } + /* Give the result back to the caller. */ + return result; +} /*** end of CanUsbLibFuncSetReceiveCallBack ***/ /*********************************** end of canusb.c ***********************************/ diff --git a/Host/Source/LibOpenBLT/port/windows/canif/peak/pcanusb.c b/Host/Source/LibOpenBLT/port/windows/canif/peak/pcanusb.c index afb84d28..19d45760 100644 --- a/Host/Source/LibOpenBLT/port/windows/canif/peak/pcanusb.c +++ b/Host/Source/LibOpenBLT/port/windows/canif/peak/pcanusb.c @@ -44,7 +44,7 @@ /*************************************************************************************** * Type definitions ****************************************************************************************/ -/* Type definitions of the function in the PCAN-Basic API that this CAN interface uses.*/ +/* Type definitions of the functions in the PCAN-Basic API that this CAN interface uses.*/ typedef TPCANStatus (__stdcall * tPCanUsbLibFuncInitialize)(TPCANHandle, TPCANBaudrate, TPCANType, DWORD, WORD); typedef TPCANStatus (__stdcall * tPCanUsbLibFuncUninitialize)(TPCANHandle); typedef TPCANStatus (__stdcall * tPCanUsbLibFuncGetStatus)(TPCANHandle); diff --git a/Host/libopenblt.dll b/Host/libopenblt.dll index e38715d9bbe73d3a187814e495d31f8e75f5025d..8d0796f05dad0d2c5a0292c6abefc58f7d40f9dc 100644 GIT binary patch delta 36021 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 delta 32645 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