diff --git a/README.md b/README.md index 77f25f37f..e7ea8e500 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ FSP uses an open software ecosystem and provides flexibility in using your prefe ### Current Release -[FSP v3.2.1](https://github.com/renesas/fsp/releases/tag/v3.2.1) +[FSP v3.3.0](https://github.com/renesas/fsp/releases/tag/v3.3.0) ### Supported RA MCU Kits @@ -27,14 +27,20 @@ FSP uses an open software ecosystem and provides flexibility in using your prefe - EK-RA6M3G - EK-RA6M4 - EK-RA6M5 +- FBP-RA4E1 +- FBP-RA6E1 - RSSK-RA2L1 - RSSK-RA6T1 +### Product Security Advisories + +[Product Security Advisories](https://github.com/renesas/fsp/issues?q=label%3Aproduct_security_advisory) for FSP and third party software (where available) are tagged with the 'product_security_advisory' label. Please check these issues for information from the respective vendors for affected versions and a recommended workaround or patch upgrade. + ### Known Issues [Visit GitHub Issues for this project.](https://github.com/renesas/fsp/issues) -[Critical issues](https://github.com/renesas/fsp/issues?q=label%3Acritical+is%3Aclosed) that cause an MCU to operate out of the hardware manual documented specifications are tagged with the 'critical' label. Please check critical issues before going to production for a fix, workaround, or recommended patch upgrade. +[Critical issues](https://github.com/renesas/fsp/issues?q=label%3Acritical+is%3Aclosed) that cause an MCU to operate out of the hardware manual documented specifications are tagged with the 'critical' label. Please check critical issues before going to production for a workaround or recommended patch upgrade. ### Setup Instructions @@ -49,7 +55,7 @@ If you have already installed a previous FSP release that included e² studio th #### For new users that are using FSP with e² studio -1. Download the FSP with e² studio Installer from the Assets section of the [current release](https://github.com/renesas/fsp/releases/tag/v3.2.1). +1. Download the FSP with e² studio Installer from the Assets section of the [current release](https://github.com/renesas/fsp/releases/tag/v3.3.0). 2. Run the installer. This will install the e² studio tool, FSP packs, GCC toolchain and other tools required to use this software. No additional installations are required. #### If using RA Smart Configurator (RASC) with IAR Embedded Workbench or Keil MDK #### diff --git a/ra/board/ra4e1_fpb/board.h b/ra/board/ra4e1_fpb/board.h new file mode 100644 index 000000000..ac11a35e2 --- /dev/null +++ b/ra/board/ra4e1_fpb/board.h @@ -0,0 +1,61 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @ingroup BOARDS + * @defgroup BOARD_RA4E1_FPB for the RA4E1_FPB board + * @brief BSP for the RA4E1_FPB Board + * + * The RA4E1_FPB is a development kit for the Renesas R7FA4E10D2CFM microcontroller in a LQFP64 package. + * + * @{ + **********************************************************************************************************************/ + +#ifndef BOARD_H +#define BOARD_H + +/*********************************************************************************************************************** + * Includes , "Project Includes" + **********************************************************************************************************************/ + +/* BSP Board Specific Includes. */ +#include "board_init.h" +#include "board_leds.h" + +/*********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ +#define BOARD_RA4E1_FPB + +/*********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Exported global variables + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Exported global functions (to be accessed by other files) + **********************************************************************************************************************/ + +/** @} (end defgroup BOARD_RA4E1_FPB) */ + +#endif diff --git a/ra/board/ra4e1_fpb/board_init.c b/ra/board/ra4e1_fpb/board_init.c new file mode 100644 index 000000000..d1c04c47a --- /dev/null +++ b/ra/board/ra4e1_fpb/board_init.c @@ -0,0 +1,62 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @addtogroup BOARD_RA4E1_FPB + * + * @{ + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Includes , "Project Includes" + **********************************************************************************************************************/ +#include "bsp_api.h" + +#if defined(BOARD_RA4E1_FPB) + +/*********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Exported global variables (to be accessed by other files) + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Private global variables and functions + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @brief Performs any initialization specific to this BSP. + * + * @param[in] p_args Pointer to arguments of the user's choice. + **********************************************************************************************************************/ +void bsp_init (void * p_args) +{ + FSP_PARAMETER_NOT_USED(p_args); +} + +#endif + +/** @} (end addtogroup BOARD_RA4E1_FPB) */ diff --git a/ra/board/ra4e1_fpb/board_init.h b/ra/board/ra4e1_fpb/board_init.h new file mode 100644 index 000000000..84422e693 --- /dev/null +++ b/ra/board/ra4e1_fpb/board_init.h @@ -0,0 +1,58 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @addtogroup BOARD_RA4E1_FPB + * @brief Board specific code for the RA4E1_FPB Board + * + * This include file is specific to the RA4E1_FPB board. + * + * @{ + **********************************************************************************************************************/ + +#ifndef BOARD_INIT_H +#define BOARD_INIT_H + +/** Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */ +FSP_HEADER + +/*********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Exported global variables + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Exported global functions (to be accessed by other files) + **********************************************************************************************************************/ +void bsp_init(void * p_args); + +/** Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */ +FSP_FOOTER + +#endif + +/** @} (end addtogroup BOARD_RA4E1_FPB_EK) */ diff --git a/ra/board/ra4e1_fpb/board_leds.c b/ra/board/ra4e1_fpb/board_leds.c new file mode 100644 index 000000000..7ace39748 --- /dev/null +++ b/ra/board/ra4e1_fpb/board_leds.c @@ -0,0 +1,70 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @addtogroup BOARD_RA4E1_FPB_LEDS + * + * @{ + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Includes + **********************************************************************************************************************/ +#include "bsp_api.h" +#if defined(BOARD_RA4E1_FPB) + +/*********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Private global variables and functions + **********************************************************************************************************************/ + +/** Array of LED IOPORT pins. */ +static const uint16_t g_bsp_prv_leds[] = +{ + (uint16_t) BSP_IO_PORT_04_PIN_08, ///< LED1 + (uint16_t) BSP_IO_PORT_04_PIN_07, ///< LED2 +}; + +/*********************************************************************************************************************** + * Exported global variables (to be accessed by other files) + **********************************************************************************************************************/ + +/** Structure with LED information for this board. */ + +const bsp_leds_t g_bsp_leds = +{ + .led_count = (uint16_t) ((sizeof(g_bsp_prv_leds) / sizeof(g_bsp_prv_leds[0]))), + .p_leds = &g_bsp_prv_leds[0] +}; + +/*********************************************************************************************************************** + * Exported global variables (to be accessed by other files) + **********************************************************************************************************************/ + +#endif + +/** @} (end addtogroup BOARD_RA4E1_FPB_LEDS) */ diff --git a/ra/board/ra4e1_fpb/board_leds.h b/ra/board/ra4e1_fpb/board_leds.h new file mode 100644 index 000000000..b6b37a709 --- /dev/null +++ b/ra/board/ra4e1_fpb/board_leds.h @@ -0,0 +1,74 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @ingroup BOARD_RA4E1_FPB + * @defgroup BOARD_RA4E1_FPB_LEDS Board LEDs + * @brief LED information for this board. + * + * This is code specific to the EK board. It includes info on the number of LEDs and which pins are they + * are on. + * + * @{ + **********************************************************************************************************************/ + +#ifndef BOARD_LEDS_H +#define BOARD_LEDS_H + +/** Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */ +FSP_HEADER + +/*********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ + +/** Information on how many LEDs and what pins they are on. */ +typedef struct st_bsp_leds +{ + uint16_t led_count; ///< The number of LEDs on this board + uint16_t const * p_leds; ///< Pointer to an array of IOPORT pins for controlling LEDs +} bsp_leds_t; + +/** Available user-controllable LEDs on this board. These enums can be can be used to index into the array of LED pins + * found in the bsp_leds_t structure. */ +typedef enum e_bsp_led +{ + BSP_LED_LED1, ///< LED1 + BSP_LED_LED2, ///< LED2 +} bsp_led_t; + +/*********************************************************************************************************************** + * Exported global variables + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Public Functions + **********************************************************************************************************************/ + +/** Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */ +FSP_FOOTER + +#endif + +/** @} (end defgroup BOARD_RA4E1_FPB_LEDS) */ diff --git a/ra/board/ra6e1_fpb/board.h b/ra/board/ra6e1_fpb/board.h new file mode 100644 index 000000000..772334a95 --- /dev/null +++ b/ra/board/ra6e1_fpb/board.h @@ -0,0 +1,61 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @ingroup BOARDS + * @defgroup BOARD_RA6E1_FPB for the RA6E1_FPB board + * @brief BSP for the RA6E1_FPB Board + * + * The RA6E1_FPB is a development kit for the Renesas R7FA6E10F2CFP microcontroller in a LQFP100 package. + * + * @{ + **********************************************************************************************************************/ + +#ifndef BOARD_H +#define BOARD_H + +/*********************************************************************************************************************** + * Includes , "Project Includes" + **********************************************************************************************************************/ + +/* BSP Board Specific Includes. */ +#include "board_init.h" +#include "board_leds.h" + +/*********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ +#define BOARD_RA6E1_FPB + +/*********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Exported global variables + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Exported global functions (to be accessed by other files) + **********************************************************************************************************************/ + +/** @} (end defgroup BOARD_RA6E1_FPB) */ + +#endif diff --git a/ra/board/ra6e1_fpb/board_init.c b/ra/board/ra6e1_fpb/board_init.c new file mode 100644 index 000000000..82482cbe6 --- /dev/null +++ b/ra/board/ra6e1_fpb/board_init.c @@ -0,0 +1,62 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @addtogroup BOARD_RA6E1_FPB + * + * @{ + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Includes , "Project Includes" + **********************************************************************************************************************/ +#include "bsp_api.h" + +#if defined(BOARD_RA6E1_FPB) + +/*********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Exported global variables (to be accessed by other files) + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Private global variables and functions + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @brief Performs any initialization specific to this BSP. + * + * @param[in] p_args Pointer to arguments of the user's choice. + **********************************************************************************************************************/ +void bsp_init (void * p_args) +{ + FSP_PARAMETER_NOT_USED(p_args); +} + +#endif + +/** @} (end addtogroup BOARD_RA6E1_FPB) */ diff --git a/ra/board/ra6e1_fpb/board_init.h b/ra/board/ra6e1_fpb/board_init.h new file mode 100644 index 000000000..27014fd2b --- /dev/null +++ b/ra/board/ra6e1_fpb/board_init.h @@ -0,0 +1,58 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @addtogroup BOARD_RA6E1_FPB + * @brief Board specific code for the RA6E1_FPB Board + * + * This include file is specific to the RA6E1_FPB board. + * + * @{ + **********************************************************************************************************************/ + +#ifndef BOARD_INIT_H +#define BOARD_INIT_H + +/** Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */ +FSP_HEADER + +/*********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Exported global variables + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Exported global functions (to be accessed by other files) + **********************************************************************************************************************/ +void bsp_init(void * p_args); + +/** Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */ +FSP_FOOTER + +#endif + +/** @} (end addtogroup BOARD_RA6E1_FPB_EK) */ diff --git a/ra/board/ra6e1_fpb/board_leds.c b/ra/board/ra6e1_fpb/board_leds.c new file mode 100644 index 000000000..f4f9f8a3a --- /dev/null +++ b/ra/board/ra6e1_fpb/board_leds.c @@ -0,0 +1,70 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @addtogroup BOARD_RA6E1_FPB_LEDS + * + * @{ + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Includes + **********************************************************************************************************************/ +#include "bsp_api.h" +#if defined(BOARD_RA6E1_FPB) + +/*********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Private global variables and functions + **********************************************************************************************************************/ + +/** Array of LED IOPORT pins. */ +static const uint16_t g_bsp_prv_leds[] = +{ + (uint16_t) BSP_IO_PORT_04_PIN_08, ///< LED1 + (uint16_t) BSP_IO_PORT_04_PIN_07, ///< LED2 +}; + +/*********************************************************************************************************************** + * Exported global variables (to be accessed by other files) + **********************************************************************************************************************/ + +/** Structure with LED information for this board. */ + +const bsp_leds_t g_bsp_leds = +{ + .led_count = (uint16_t) ((sizeof(g_bsp_prv_leds) / sizeof(g_bsp_prv_leds[0]))), + .p_leds = &g_bsp_prv_leds[0] +}; + +/*********************************************************************************************************************** + * Exported global variables (to be accessed by other files) + **********************************************************************************************************************/ + +#endif + +/** @} (end addtogroup BOARD_RA6E1_FPB_LEDS) */ diff --git a/ra/board/ra6e1_fpb/board_leds.h b/ra/board/ra6e1_fpb/board_leds.h new file mode 100644 index 000000000..759648537 --- /dev/null +++ b/ra/board/ra6e1_fpb/board_leds.h @@ -0,0 +1,74 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @ingroup BOARD_RA6E1_FPB + * @defgroup BOARD_RA6E1_FPB_LEDS Board LEDs + * @brief LED information for this board. + * + * This is code specific to the EK board. It includes info on the number of LEDs and which pins are they + * are on. + * + * @{ + **********************************************************************************************************************/ + +#ifndef BOARD_LEDS_H +#define BOARD_LEDS_H + +/** Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */ +FSP_HEADER + +/*********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ + +/** Information on how many LEDs and what pins they are on. */ +typedef struct st_bsp_leds +{ + uint16_t led_count; ///< The number of LEDs on this board + uint16_t const * p_leds; ///< Pointer to an array of IOPORT pins for controlling LEDs +} bsp_leds_t; + +/** Available user-controllable LEDs on this board. These enums can be can be used to index into the array of LED pins + * found in the bsp_leds_t structure. */ +typedef enum e_bsp_led +{ + BSP_LED_LED1, ///< LED1 + BSP_LED_LED2, ///< LED2 +} bsp_led_t; + +/*********************************************************************************************************************** + * Exported global variables + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Public Functions + **********************************************************************************************************************/ + +/** Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */ +FSP_FOOTER + +#endif + +/** @} (end defgroup BOARD_RA6E1_FPB_LEDS) */ diff --git a/ra/fsp/inc/api/r_ctsu_api.h b/ra/fsp/inc/api/r_ctsu_api.h index 1f2eac0ac..ffb1833ad 100644 --- a/ra/fsp/inc/api/r_ctsu_api.h +++ b/ra/fsp/inc/api/r_ctsu_api.h @@ -232,6 +232,14 @@ typedef struct st_ctsu_api */ fsp_err_t (* dataGet)(ctsu_ctrl_t * const p_ctrl, uint16_t * p_data); + /** ScanStop. + * @par Implemented as + * - @ref R_CTSU_ScanStop() + * + * @param[in] p_ctrl Pointer to control structure. + */ + fsp_err_t (* scanStop)(ctsu_ctrl_t * const p_ctrl); + /** Diagnosis. * @par Implemented as * - @ref R_CTSU_Diagnosis() diff --git a/ra/fsp/inc/api/rm_ble_abs_api.h b/ra/fsp/inc/api/rm_ble_abs_api.h index 36a92dfe6..2a93d5fa5 100644 --- a/ra/fsp/inc/api/rm_ble_abs_api.h +++ b/ra/fsp/inc/api/rm_ble_abs_api.h @@ -627,7 +627,16 @@ typedef struct st_ble_abs_scan_parameter uint16_t filter_data_length; /** - * @brief Scan Filter Policy. Select one of the following. + * @brief Scan Filter Policy. Select one of the following.\n + * - Address type setting (Field [7:4]) + * | macro | description | + * |:---------------------------------|:------------------------------------------------------------------------------------------------------- | + * | BLE_GAP_ADDR_PUBLIC(0x00) | Use Public Address. | + * | BLE_GAP_ADDR_RAND(0x01) | Use Random Address. | + * | BLE_GAP_ADDR_RPA_ID_PUBLIC(0x02) | If the IRK of local device has been registered in Resolving list, use RPA. If not, use Public Address. | + * | BLE_GAP_ADDR_RPA_ID_RANDOM(0x03) | If the IRK of local device has been registered in Resolving list, use RPA. If not, use Random Address. | + * + * - White list setting (Field [3:0]) * | macro | description | * |:--------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | * | BLE_GAP_SCAN_ALLOW_ADV_ALL(0x00) | Accept all advertising and scan response PDUs except directed advertising PDUs not addressed to local device. | @@ -715,12 +724,21 @@ typedef struct st_ble_abs_connection_parameter /** * @brief Address of the device to be connected. \n - * If the filter field is @ref BLE_GAP_INIT_FILT_USE_WLST(0x01), this parameter is ignored. + * If the filter field is @ref BLE_GAP_INIT_FILT_USE_WLST(0x01), this parameter is ignored and please fill p_device_address.addr with 0x00. */ ble_device_address_t * p_device_address; /** * @brief The filter field specifies whether the White List is used or not, when connecting with a remote device.\n + * - Address type setting (Field [7:4]) + * | macro | description | + * |:---------------------------------|:------------------------------------------------------------------------------------------------------- | + * | BLE_GAP_ADDR_PUBLIC(0x00) | Use Public Address. | + * | BLE_GAP_ADDR_RAND(0x01) | Use Random Address. | + * | BLE_GAP_ADDR_RPA_ID_PUBLIC(0x02) | If the IRK of local device has been registered in Resolving list, use RPA. If not, use Public Address. | + * | BLE_GAP_ADDR_RPA_ID_RANDOM(0x03) | If the IRK of local device has been registered in Resolving list, use RPA. If not, use Random Address. | + * + * - White list setting (Field [3:0]) * | macro | description | * |:---------------------------------|:---------------------------------------------------------------------------------------------------------------------------------- | * | BLE_GAP_INIT_FILT_USE_ADDR(0x00) | White List is not used. \n The remote device to be connected is specified by the p_addr field is used. | @@ -880,6 +898,28 @@ typedef struct st_ble_abs_api */ fsp_err_t (* deleteBondInformation)(ble_abs_ctrl_t * const p_ctrl, ble_abs_bond_information_parameter_t const * const p_bond_information_parameter); + + /** Import local identity address, keys information to local storage. + * @par Implemented as + * - RM_BLE_ABS_ImportKeyInformation() + * @param[in] p_ctrl Pointer to control structure. + * @param[in] p_local_identity_address Pointer to local identiry address. + * @param[in] uint8_t p_local_irk Pointer to local IRK + * @param[in] uint8_t p_local_csrk Pointer to local CSRK + */ + fsp_err_t (* importKeyInformation)(ble_abs_ctrl_t * const p_ctrl, ble_device_address_t * p_local_identity_address, + uint8_t * p_local_irk, uint8_t * p_local_csrk); + + /** Export local identity address, keys information from local storage. + * @par Implemented as + * - RM_BLE_ABS_ExportKeyInformation() + * @param[in] p_ctrl Pointer to control structure. + * @param[out] p_local_identity_address Pointer to local identiry address. + * @param[out] uint8_t p_local_irk Pointer to local IRK + * @param[out] uint8_t p_local_csrk Pointer to local CSRK + */ + fsp_err_t (* exportKeyInformation)(ble_abs_ctrl_t * const p_ctrl, ble_device_address_t * p_local_identity_address, + uint8_t * p_local_irk, uint8_t * p_local_csrk); } ble_abs_api_t; /** This structure encompasses everything that is needed to use an instance of this interface. */ diff --git a/ra/fsp/inc/api/rm_fsxxxx_api.h b/ra/fsp/inc/api/rm_fsxxxx_api.h new file mode 100644 index 000000000..440d31b15 --- /dev/null +++ b/ra/fsp/inc/api/rm_fsxxxx_api.h @@ -0,0 +1,188 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @ingroup RENESAS_INTERFACES + * @defgroup RM_FSXXXX_API FSXXXX Middleware Interface + * @brief Interface for FSXXXX Middleware functions. + * + * @section RM_FSXXXX_API_Summary Summary + * The FSXXXX interface provides FSXXXX functionality. + * + * The FSXXXX interface can be implemented by: + * - @ref RM_FS2012 + * + * @{ + **********************************************************************************************************************/ + +#ifndef RM_FSXXXX_API_H_ +#define RM_FSXXXX_API_H_ + +/*********************************************************************************************************************** + * Includes + **********************************************************************************************************************/ +#if defined(__CCRX__) || defined(__ICCRX__) || defined(__RX__) + #include + #include "platform.h" +#elif defined(__CCRL__) || defined(__ICCRL__) || defined(__RL78__) + #include + #include "r_cg_macrodriver.h" + #include "r_fsp_error.h" +#else + #include "bsp_api.h" +#endif + +#include "rm_comms_api.h" + +#if defined(__CCRX__) || defined(__ICCRX__) || defined(__RX__) +#elif defined(__CCRL__) || defined(__ICCRL__) || defined(__RL78__) +#else + +/* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */ +FSP_HEADER +#endif + +/********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ + +/********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ + +/** Event in the callback function */ +typedef enum e_rm_fsxxxx_event +{ + RM_FSXXXX_EVENT_SUCCESS = 0, + RM_FSXXXX_EVENT_ERROR, +} rm_fsxxxx_event_t; + +/** FSXXXX callback parameter definition */ +typedef struct st_rm_fsxxxx_callback_args +{ + void const * p_context; + rm_fsxxxx_event_t event; +} rm_fsxxxx_callback_args_t; + +/** FSXXXX raw data */ +typedef struct st_rm_fsxxxx_raw_data +{ + uint8_t adc_data[5]; +} rm_fsxxxx_raw_data_t; + +/** FSXXXX sensor data block */ +typedef struct st_rm_fsxxxx_sensor_data +{ + int16_t integer_part; + int16_t decimal_part; ///< To two decimal places +} rm_fsxxxx_sensor_data_t; + +/** FSXXXX data block */ +typedef struct st_rm_fsxxxx_data +{ + rm_fsxxxx_sensor_data_t flow; + uint32_t count; +} rm_fsxxxx_data_t; + +/** FSXXXX Configuration */ +typedef struct st_rm_fsxxxx_cfg +{ + rm_comms_instance_t const * p_instance; ///< Pointer to Communications Middleware instance. + void const * p_context; ///< Pointer to the user-provided context. + void const * p_extend; ///< Pointer to extended configuration by instance of interface. + void (* p_callback)(rm_fsxxxx_callback_args_t * p_args); ///< Pointer to callback function. +} rm_fsxxxx_cfg_t; + +/** FSXXXX control block. Allocate an instance specific control block to pass into the FSXXXX API calls. + * @par Implemented as + * - rm_fsxxxx_instance_ctrl_t + */ +typedef void rm_fsxxxx_ctrl_t; + +/** FSXXXX APIs */ +typedef struct st_rm_fsxxxx_api +{ + /** Open sensor. + * @par Implemented as + * - @ref RM_FS2012_Open() + * + * @param[in] p_ctrl Pointer to control structure. + * @param[in] p_cfg Pointer to configuration structure. + */ + fsp_err_t (* open)(rm_fsxxxx_ctrl_t * const p_ctrl, rm_fsxxxx_cfg_t const * const p_cfg); + + /** Read ADC data from FSXXXX. + * @par Implemented as + * - @ref RM_FS2012_Read() + * + * @param[in] p_ctrl Pointer to control structure. + * @param[in] p_raw_data Pointer to raw data structure. + */ + fsp_err_t (* read)(rm_fsxxxx_ctrl_t * const p_ctrl, rm_fsxxxx_raw_data_t * const p_raw_data); + + /** Calculate flow values from ADC data. + * @par Implemented as + * - @ref RM_FS2012_DataCalculate() + * + * @param[in] p_ctrl Pointer to control structure. + * @param[in] p_raw_data Pointer to raw data. + * @param[in] p_fsxxxx_data Pointer to FSXXXX data structure. + */ + fsp_err_t (* dataCalculate)(rm_fsxxxx_ctrl_t * const p_ctrl, rm_fsxxxx_raw_data_t * const p_raw_data, + rm_fsxxxx_data_t * const p_fsxxxx_data); + + /** Close FSXXXX. + * @par Implemented as + * - @ref RM_FS2012_Close() + * + * @param[in] p_ctrl Pointer to control structure. + */ + fsp_err_t (* close)(rm_fsxxxx_ctrl_t * const p_ctrl); +} rm_fsxxxx_api_t; + +/** FSXXXX instance */ +typedef struct st_rm_fsxxxx_instance +{ + rm_fsxxxx_ctrl_t * p_ctrl; /**< Pointer to the control structure for this instance */ + rm_fsxxxx_cfg_t const * p_cfg; /**< Pointer to the configuration structure for this instance */ + rm_fsxxxx_api_t const * p_api; /**< Pointer to the API structure for this instance */ +} rm_fsxxxx_instance_t; + +/********************************************************************************************************************** + * Exported global variables + **********************************************************************************************************************/ + +/********************************************************************************************************************** + * Public Function Prototypes + **********************************************************************************************************************/ + +#if defined(__CCRX__) || defined(__ICCRX__) || defined(__RX__) +#elif defined(__CCRL__) || defined(__ICCRL__) || defined(__RL78__) +#else + +/* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */ +FSP_FOOTER +#endif + +#endif /* RM_FSXXXX_API_H_*/ + +/*******************************************************************************************************************//** + * @} (end addtogroup RM_FSXXXX_API) + **********************************************************************************************************************/ diff --git a/ra/fsp/inc/api/rm_hs300x_api.h b/ra/fsp/inc/api/rm_hs300x_api.h index 2d1e67d28..de49d5531 100644 --- a/ra/fsp/inc/api/rm_hs300x_api.h +++ b/ra/fsp/inc/api/rm_hs300x_api.h @@ -74,6 +74,22 @@ typedef enum e_rm_hs300x_event RM_HS300X_EVENT_ERROR, } rm_hs300x_event_t; +/** Data type of HS300X */ +typedef enum e_rm_hs300x_data_type +{ + RM_HS300X_HUMIDITY_DATA = 0, + RM_HS300X_TEMPERATURE_DATA, +} rm_hs300x_data_type_t; + +/** Resolution type of HS300X */ +typedef enum e_rm_hs300x_resolution +{ + RM_HS300X_RESOLUTION_8BIT = 0x00, + RM_HS300X_RESOLUTION_10BIT = 0x04, + RM_HS300X_RESOLUTION_12BIT = 0x08, + RM_HS300X_RESOLUTION_14BIT = 0x0C, +} rm_hs300x_resolution_t; + /** HS300X callback parameter definition */ typedef struct st_rm_hs300x_callback_args { @@ -157,6 +173,42 @@ typedef struct st_rm_hs300x_api fsp_err_t (* dataCalculate)(rm_hs300x_ctrl_t * const p_ctrl, rm_hs300x_raw_data_t * const p_raw_data, rm_hs300x_data_t * const p_hs300x_data); + /** Enter the programming mode. + * @par Implemented as + * - @ref RM_HS300X_ProgrammingModeEnter() + * + * @param[in] p_ctrl Pointer to control structure. + */ + fsp_err_t (* programmingModeEnter)(rm_hs300x_ctrl_t * const p_ctrl); + + /** Change the sensor resolution. + * @par Implemented as + * - @ref RM_HS300X_ResolutionChange() + * + * @param[in] p_ctrl Pointer to control structure. + * @param[in] data_type Data type of HS300X. + * @param[in] resolution Resolution type of HS300X. + */ + fsp_err_t (* resolutionChange)(rm_hs300x_ctrl_t * const p_ctrl, rm_hs300x_data_type_t const data_type, + rm_hs300x_resolution_t const resolution); + + /** Get the sensor ID. + * @par Implemented as + * - @ref RM_HS300X_SensorIdGet() + * + * @param[in] p_ctrl Pointer to control structure. + * @param[in] p_sensor_id Pointer to sensor ID of HS300X. + */ + fsp_err_t (* sensorIdGet)(rm_hs300x_ctrl_t * const p_ctrl, uint32_t * const p_sensor_id); + + /** Exit the programming mode. + * @par Implemented as + * - @ref RM_HS300X_ProgrammingModeExit() + * + * @param[in] p_ctrl Pointer to control structure. + */ + fsp_err_t (* programmingModeExit)(rm_hs300x_ctrl_t * const p_ctrl); + /** Close HS300X. * @par Implemented as * - @ref RM_HS300X_Close() diff --git a/ra/fsp/inc/api/rm_touch_api.h b/ra/fsp/inc/api/rm_touch_api.h index 1029384b0..2f71680a5 100644 --- a/ra/fsp/inc/api/rm_touch_api.h +++ b/ra/fsp/inc/api/rm_touch_api.h @@ -125,6 +125,15 @@ typedef struct st_touch_cfg void const * p_extend; ///< Pointer to extended configuration by instance of interface. } touch_cfg_t; +/** Configuration of each touch sensitivity information */ +typedef struct st_touch_sensitivity_info +{ + uint16_t * p_touch_sensitivity_ratio; ///< Pointer to sensitivity ratio array. + uint16_t old_threshold_ratio; ///< Old threshold ratio. + uint16_t new_threshold_ratio; ///< New threshold ratio. + uint8_t new_hysteresis_ratio; ///< New hysteresis ratio. +} touch_sensitivity_info_t; + /** Functions implemented at the HAL layer will follow this API. */ typedef struct st_touch_api { @@ -157,6 +166,14 @@ typedef struct st_touch_api fsp_err_t (* dataGet)(touch_ctrl_t * const p_ctrl, uint64_t * p_button_status, uint16_t * p_slider_position, uint16_t * p_wheel_position); + /** ScanStop. + * @par Implemented as + * - @ref RM_TOUCH_ScanStop() + * + * @param[in] p_ctrl Pointer to control structure. + */ + fsp_err_t (* scanStop)(ctsu_ctrl_t * const p_ctrl); + /** pad data get. * @par Implemented as * - @ref RM_TOUCH_PadDataGet() @@ -189,6 +206,33 @@ typedef struct st_touch_api * @param[in] p_ctrl Pointer to control structure. */ fsp_err_t (* close)(touch_ctrl_t * const p_ctrl); + + /** Sensitivity ratio get. + * @par Implemented as + * - @ref RM_TOUCH_SensitivityRatioGet() + * + * @param[in] p_ctrl Pointer to control structure. + * @param[in,out] p_touch_sensitivity_info Pointer to touch sensitivity structure. + */ + fsp_err_t (* sensitivityRatioGet)(touch_ctrl_t * const p_ctrl, touch_sensitivity_info_t * p_touch_sensitivity_info); + + /** Threshold adjust. + * @par Implemented as + * - @ref RM_TOUCH_ThresholdAdjust() + * + * @param[in] p_ctrl Pointer to control structure. + * @param[in] p_touch_sensitivity_info Pointer to touch sensitivity structure. + */ + fsp_err_t (* thresholdAdjust)(touch_ctrl_t * const p_ctrl, touch_sensitivity_info_t * p_touch_sensitivity_info); + + /** Drift control. + * @par Implemented as + * - @ref RM_TOUCH_DriftControl() + * + * @param[in] p_ctrl Pointer to control structure. + * @param[in] input_drift_freq Drift frequency value. + */ + fsp_err_t (* driftControl)(touch_ctrl_t * const p_ctrl, uint16_t input_drift_freq); } touch_api_t; /** This structure encompasses everything that is needed to use an instance of this interface. */ diff --git a/ra/fsp/inc/fsp_version.h b/ra/fsp/inc/fsp_version.h index e1382811b..7deb0da92 100644 --- a/ra/fsp/inc/fsp_version.h +++ b/ra/fsp/inc/fsp_version.h @@ -41,19 +41,19 @@ #define FSP_VERSION_MAJOR (3U) /** FSP pack minor version. */ -#define FSP_VERSION_MINOR (2U) +#define FSP_VERSION_MINOR (3U) /** FSP pack patch version. */ -#define FSP_VERSION_PATCH (1U) +#define FSP_VERSION_PATCH (0U) /** FSP pack version build number (currently unused). */ #define FSP_VERSION_BUILD (0U) /** Public FSP version name. */ -#define FSP_VERSION_STRING ("3.2.1") +#define FSP_VERSION_STRING ("3.3.0") /** Unique FSP version ID. */ -#define FSP_VERSION_BUILD_STRING ("Built with Renesas Advanced Flexible Software Package version 3.2.1") +#define FSP_VERSION_BUILD_STRING ("Built with Renesas Advanced Flexible Software Package version 3.3.0") /********************************************************************************************************************** * Typedef definitions diff --git a/ra/fsp/inc/instances/r_ctsu.h b/ra/fsp/inc/instances/r_ctsu.h index b876e903e..7da9feb66 100644 --- a/ra/fsp/inc/instances/r_ctsu.h +++ b/ra/fsp/inc/instances/r_ctsu.h @@ -254,6 +254,8 @@ typedef struct st_ctsu_diag_info uint16_t suclk_cnt[CTSU_CORRECTION_POINT_NUM]; ///< Diagnosis suclk count value uint16_t suclk_count_clk_recv[3]; ///< Diagnosis clock recovery suclk count value uint16_t cfc_cnt[CTSU_CORRCFC_POINT_NUM]; ///< Diagnosis cfc count value + uint32_t chaca; ///< Diagnosis CHACA + uint32_t chacb; ///< Diagnosis CHACB } ctsu_diag_info_t; #endif #endif @@ -263,6 +265,8 @@ typedef struct st_ctsu_instance_ctrl { uint32_t open; ///< Whether or not driver is open. volatile ctsu_state_t state; ///< CTSU run state. + ctsu_cap_t cap; ///< CTSU Scan Start Trigger Select + ctsu_md_t md; ///< CTSU Measurement Mode Select(copy to cfg) ctsu_tuning_t tuning; ///< CTSU Initial offset tuning status. uint16_t num_elements; ///< Number of elements to scan uint16_t wr_index; ///< Word index into ctsuwr register array. @@ -274,12 +278,29 @@ typedef struct st_ctsu_instance_ctrl uint8_t ctsucr1; ///< Copy from (atune1 << 3, md << 6) by Open API. CLK, ATUNE0, CSW, and PON is set by HAL driver. ctsu_ctsuwr_t * p_ctsuwr; ///< CTSUWR write register value. g_ctsu_ctsuwr[] is set by Open API. ctsu_self_buf_t * p_self_raw; ///< Pointer to Self raw data. g_ctsu_self_raw[] is set by Open API. + uint16_t * p_self_corr; ///< Pointer to Self correction data. g_ctsu_self_corr[] is set by Open API. uint16_t * p_self_data; ///< Pointer to Self moving average data. g_ctsu_self_data[] is set by Open API. ctsu_mutual_buf_t * p_mutual_raw; ///< Pointer to Mutual raw data. g_ctsu_mutual_raw[] is set by Open API. + uint16_t * p_mutual_pri_corr; ///< Pointer to Mutual primary correction data. g_ctsu_self_corr[] is set by Open API. + uint16_t * p_mutual_snd_corr; ///< Pointer to Mutual secondary correction data. g_ctsu_self_corr[] is set by Open API. uint16_t * p_mutual_pri_data; ///< Pointer to Mutual primary moving average data. g_ctsu_mutual_pri_data[] is set by Open API. uint16_t * p_mutual_snd_data; ///< Pointer to Mutual secondary moving average data. g_ctsu_mutual_snd_data[] is set by Open API. ctsu_correction_info_t * p_correction_info; ///< Pointer to correction info - + ctsu_txvsel_t txvsel; ///< CTSU Transmission Power Supply Select + ctsu_txvsel2_t txvsel2; ///< CTSU Transmission Power Supply Select 2 (CTSU2 Only) + uint8_t ctsuchac0; ///< TS00-TS07 enable mask + uint8_t ctsuchac1; ///< TS08-TS15 enable mask + uint8_t ctsuchac2; ///< TS16-TS23 enable mask + uint8_t ctsuchac3; ///< TS24-TS31 enable mask + uint8_t ctsuchac4; ///< TS32-TS39 enable mask + uint8_t ctsuchtrc0; ///< TS00-TS07 mutual-tx mask + uint8_t ctsuchtrc1; ///< TS08-TS15 mutual-tx mask + uint8_t ctsuchtrc2; ///< TS16-TS23 mutual-tx mask + uint8_t ctsuchtrc3; ///< TS24-TS31 mutual-tx mask + uint8_t ctsuchtrc4; ///< TS32-TS39 mutual-tx mask + uint16_t self_elem_index; ///< self element index number for Current instance. + uint16_t mutual_elem_index; ///< mutual element index number for Current instance. + uint16_t ctsu_elem_index; ///< CTSU element index number for Current instance. #if (BSP_FEATURE_CTSU_VERSION == 1) #if (CTSU_CFG_DIAG_SUPPORT_ENABLE == 1) ctsu_diag_info_t * p_diag_info; ///< pointer to diagnosis info @@ -302,6 +323,7 @@ typedef struct st_ctsu_instance_ctrl IRQn_Type read_irq; ///< Copy from config by Open API. CTSU_CTSURD interrupt vector IRQn_Type end_irq; ///< Copy from config by Open API. CTSU_CTSUFN interrupt vector void (* p_callback)(ctsu_callback_args_t *); ///< Callback provided when a CTSUFN occurs. + ctsu_event_t error_status; ///< error status variable to send to QE for serial tuning. ctsu_callback_args_t * p_callback_memory; ///< Pointer to non-secure memory that can be used to pass arguments to a callback in non-secure memory. void const * p_context; ///< Placeholder for user data. } ctsu_instance_ctrl_t; @@ -322,6 +344,7 @@ extern const ctsu_api_t g_ctsu_on_ctsu; fsp_err_t R_CTSU_Open(ctsu_ctrl_t * const p_ctrl, ctsu_cfg_t const * const p_cfg); fsp_err_t R_CTSU_ScanStart(ctsu_ctrl_t * const p_ctrl); fsp_err_t R_CTSU_DataGet(ctsu_ctrl_t * const p_ctrl, uint16_t * p_data); +fsp_err_t R_CTSU_ScanStop(ctsu_ctrl_t * const p_ctrl); fsp_err_t R_CTSU_CallbackSet(ctsu_ctrl_t * const p_api_ctrl, void ( * p_callback)(ctsu_callback_args_t *), void const * const p_context, diff --git a/ra/fsp/inc/instances/r_sci_uart.h b/ra/fsp/inc/instances/r_sci_uart.h index 211165a48..935f0cab1 100644 --- a/ra/fsp/inc/instances/r_sci_uart.h +++ b/ra/fsp/inc/instances/r_sci_uart.h @@ -56,9 +56,10 @@ typedef enum e_sci_clk_src /** UART flow control mode definition */ typedef enum e_flow_control { - SCI_UART_FLOW_CONTROL_RTS = 0U, ///< Use SCI pin for RTS - SCI_UART_FLOW_CONTROL_CTS = 1U, ///< Use SCI pin for CTS - SCI_UART_FLOW_CONTROL_CTSRTS = 3U, ///< Use SCI pin for CTS, external pin for RTS + SCI_UART_FLOW_CONTROL_RTS = 0U, ///< Use SCI pin for RTS + SCI_UART_FLOW_CONTROL_CTS = 1U, ///< Use SCI pin for CTS + SCI_UART_FLOW_CONTROL_CTSRTS = 3U, ///< Use SCI pin for CTS, external pin for RTS + SCI_UART_FLOW_CONTROL_HARDWARE_CTSRTS = 8U, ///< Use CTSn_RTSn pin for RTS and CTSn pin for CTS. Available only for some channels on selected MCUs. See hardware manual for channel specific options } sci_uart_flow_control_t; /** UART instance control block. */ diff --git a/ra/fsp/inc/instances/rm_ble_abs.h b/ra/fsp/inc/instances/rm_ble_abs.h index 6d168c4b5..d1771a08f 100644 --- a/ra/fsp/inc/instances/rm_ble_abs.h +++ b/ra/fsp/inc/instances/rm_ble_abs.h @@ -119,6 +119,18 @@ typedef struct st_ble_abs_timer ble_abs_timer_cb_t cb; } ble_abs_timer_t; +typedef struct st_ble_abs_identity_address_info +{ + /* identity address */ + ble_device_address_t identity_address[BLE_ABS_CFG_NUMBER_BONDING + 1]; + + /* local & remote IRK set */ + st_ble_gap_rslv_list_key_set_t key_set[BLE_ABS_CFG_NUMBER_BONDING + 1]; + + /* the number of identity info stored in Data Flash */ + uint8_t bond_count; +} ble_abs_identity_address_info_t; + /** BLE ABS private control block. DO NOT MODIFY. Initialization occurs when RM_BLE_ABS_Open() is called. */ typedef struct st_ble_abs_instance_ctrl { @@ -133,14 +145,16 @@ typedef struct st_ble_abs_instance_ctrl abs_advertising_parameter_t advertising_sets[BLE_MAX_NO_OF_ADV_SETS_SUPPORTED]; ///< Advertising set information. abs_scan_parameter_t abs_scan; ///< Scan information. st_ble_dev_addr_t loc_bd_addr; ///< Local device address. - uint8_t privacy_mode; ///< Privacy mode. - uint32_t set_privacy_status; ///< Local privacy status. - ble_abs_timer_t timer[BLE_ABS_CFG_TIMER_NUMBER_OF_SLOT]; + uint8_t privacy_mode; ///< Privacy mode. + uint32_t set_privacy_status; ///< Local privacy status. + ble_abs_timer_t timer[BLE_ABS_CFG_TIMER_NUMBER_OF_SLOT]; + uint8_t local_irk[BLE_GAP_IRK_SIZE]; + ble_abs_identity_address_info_t identity_address_info; - uint32_t current_timeout_ms; ///< Current timeout. - uint32_t elapsed_timeout_ms; ///< Elapsed timeout. + uint32_t current_timeout_ms; ///< Current timeout. + uint32_t elapsed_timeout_ms; ///< Elapsed timeout. - ble_abs_cfg_t const * p_cfg; ///< Pointer to the BLE ABS configuration block. + ble_abs_cfg_t const * p_cfg; ///< Pointer to the BLE ABS configuration block. } ble_abs_instance_ctrl_t; /******************************************************************************************************************//** @@ -249,6 +263,16 @@ fsp_err_t RM_BLE_ABS_StartAuthentication(ble_abs_ctrl_t * const p_ctrl, uint16_t fsp_err_t RM_BLE_ABS_DeleteBondInformation(ble_abs_ctrl_t * const p_ctrl, ble_abs_bond_information_parameter_t const * const p_bond_information_parameter); +fsp_err_t RM_BLE_ABS_ImportKeyInformation(ble_abs_ctrl_t * const p_ctrl, + ble_device_address_t * p_local_identity_address, + uint8_t * p_local_irk, + uint8_t * p_local_csrk); + +fsp_err_t RM_BLE_ABS_ExportKeyInformation(ble_abs_ctrl_t * const p_ctrl, + ble_device_address_t * p_local_identity_address, + uint8_t * p_local_irk, + uint8_t * p_local_csrk); + /* Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */ FSP_FOOTER diff --git a/ra/fsp/inc/instances/rm_filex_levelx_nor.h b/ra/fsp/inc/instances/rm_filex_levelx_nor.h index b463630a7..324eedf61 100644 --- a/ra/fsp/inc/instances/rm_filex_levelx_nor.h +++ b/ra/fsp/inc/instances/rm_filex_levelx_nor.h @@ -79,7 +79,7 @@ typedef struct typedef struct st_rm_filex_levelx_nor_instance { rm_filex_levelx_nor_instance_ctrl_t * p_ctrl; ///< Pointer to the control structure for this instance - rm_filex_levelx_nor_cfg_t const * const p_cfg; ///< Pointer to the configuration structure for this instance + rm_filex_levelx_nor_cfg_t * const p_cfg; ///< Pointer to the configuration structure for this instance } rm_filex_levelx_nor_instance_t; /********************************************************************************************************************** diff --git a/ra/fsp/inc/instances/rm_fs2012.h b/ra/fsp/inc/instances/rm_fs2012.h new file mode 100644 index 000000000..d647d2599 --- /dev/null +++ b/ra/fsp/inc/instances/rm_fs2012.h @@ -0,0 +1,95 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @addtogroup RM_FS2012 + * @{ + **********************************************************************************************************************/ + +#ifndef RM_FS2012_H +#define RM_FS2012_H + +/*********************************************************************************************************************** + * Includes + **********************************************************************************************************************/ +#include "rm_fsxxxx_api.h" + +#if defined(__CCRX__) || defined(__ICCRX__) || defined(__RX__) +#elif defined(__CCRL__) || defined(__ICCRL__) || defined(__RL78__) +#else + #include "rm_fs2012_cfg.h" + +/* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */ +FSP_HEADER +#endif + +/********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ + +/** FS2012 Control Block */ +typedef struct rm_fs2012_instance_ctrl +{ + uint32_t open; ///< Open flag + rm_fsxxxx_cfg_t const * p_cfg; ///< Pointer to FS2012 Configuration + rm_comms_instance_t const * p_comms_i2c_instance; ///< Pointer of I2C Communications Middleware instance structure + void const * p_context; ///< Pointer to the user-provided context + + /* Pointer to callback and optional working memory */ + void (* p_callback)(rm_fsxxxx_callback_args_t * p_args); +} rm_fs2012_instance_ctrl_t; + +/********************************************************************************************************************** + * Exported global variables + **********************************************************************************************************************/ + +/** @cond INC_HEADER_DEFS_SEC */ +/** Filled in Interface API structure for this Instance. */ +extern rm_fsxxxx_api_t const g_fsxxxx_on_fs2012; + +/** @endcond */ + +/********************************************************************************************************************** + * Public Function Prototypes + **********************************************************************************************************************/ +fsp_err_t RM_FS2012_Open(rm_fsxxxx_ctrl_t * const p_api_ctrl, rm_fsxxxx_cfg_t const * const p_cfg); +fsp_err_t RM_FS2012_Close(rm_fsxxxx_ctrl_t * const p_api_ctrl); +fsp_err_t RM_FS2012_Read(rm_fsxxxx_ctrl_t * const p_api_ctrl, rm_fsxxxx_raw_data_t * const p_raw_data); +fsp_err_t RM_FS2012_DataCalculate(rm_fsxxxx_ctrl_t * const p_api_ctrl, + rm_fsxxxx_raw_data_t * const p_raw_data, + rm_fsxxxx_data_t * const p_fs2012_data); + +#if defined(__CCRX__) || defined(__ICCRX__) || defined(__RX__) +#elif defined(__CCRL__) || defined(__ICCRL__) || defined(__RL78__) +#else + +/* Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */ +FSP_FOOTER +#endif + +#endif /* RM_FS2012_H_*/ + +/*******************************************************************************************************************//** + * @} (end addtogroup RM_FS2012) + **********************************************************************************************************************/ diff --git a/ra/fsp/inc/instances/rm_hs300x.h b/ra/fsp/inc/instances/rm_hs300x.h index ff2bbcfcb..b07928bf6 100644 --- a/ra/fsp/inc/instances/rm_hs300x.h +++ b/ra/fsp/inc/instances/rm_hs300x.h @@ -50,13 +50,23 @@ FSP_HEADER * Typedef definitions **********************************************************************************************************************/ +/** HS300X programming mode process block */ +typedef struct st_rm_hs300x_programmnig_mode_params +{ + volatile bool enter; ///< Enter flag. + volatile bool blocking; ///< Blocking flag. + volatile bool communication_finished; ///< Communication flag for blocking. + volatile rm_hs300x_event_t event; ///< Callback event +} rm_hs300x_programmnig_mode_params_t; + /** HS300x Control Block */ typedef struct rm_hs300x_instance_ctrl { - uint32_t open; ///< Open flag - rm_hs300x_cfg_t const * p_cfg; ///< Pointer to HS300X Configuration - rm_comms_instance_t const * p_comms_i2c_instance; ///< Pointer of I2C Communications Middleware instance structure - void const * p_context; ///< Pointer to the user-provided context + uint32_t open; ///< Open flag + rm_hs300x_cfg_t const * p_cfg; ///< Pointer to HS300X Configuration + rm_comms_instance_t const * p_comms_i2c_instance; ///< Pointer of I2C Communications Middleware instance structure + void const * p_context; ///< Pointer to the user-provided context + rm_hs300x_programmnig_mode_params_t programming_mode; ///< Programming mode flag /* Pointer to callback and optional working memory */ void (* p_callback)(rm_hs300x_callback_args_t * p_args); @@ -82,7 +92,12 @@ fsp_err_t RM_HS300X_Read(rm_hs300x_ctrl_t * const p_api_ctrl, rm_hs300x_raw_data fsp_err_t RM_HS300X_DataCalculate(rm_hs300x_ctrl_t * const p_api_ctrl, rm_hs300x_raw_data_t * const p_raw_data, rm_hs300x_data_t * const p_hs300x_data); -void rm_hs300x_callback(rm_comms_callback_args_t * p_args); +fsp_err_t RM_HS300X_ProgrammingModeEnter(rm_hs300x_ctrl_t * const p_api_ctrl); +fsp_err_t RM_HS300X_ResolutionChange(rm_hs300x_ctrl_t * const p_api_ctrl, + rm_hs300x_data_type_t const data_type, + rm_hs300x_resolution_t const resolution); +fsp_err_t RM_HS300X_SensorIdGet(rm_hs300x_ctrl_t * const p_api_ctrl, uint32_t * const p_sensor_id); +fsp_err_t RM_HS300X_ProgrammingModeExit(rm_hs300x_ctrl_t * const p_api_ctrl); #if defined(__CCRX__) || defined(__ICCRX__) || defined(__RX__) #elif defined(__CCRL__) || defined(__ICCRL__) || defined(__RL78__) diff --git a/ra/fsp/inc/instances/rm_touch.h b/ra/fsp/inc/instances/rm_touch.h index 8e55dd24a..5a820bfdf 100644 --- a/ra/fsp/inc/instances/rm_touch.h +++ b/ra/fsp/inc/instances/rm_touch.h @@ -43,6 +43,51 @@ FSP_HEADER * Typedef definitions **********************************************************************************************************************/ +#if (TOUCH_CFG_UART_TUNING_SUPPORT == 1) + +/** CTSU state number */ +typedef enum e_touch_tuning_state +{ + TOUCH_TUNING_STATE_RESET, + TOUCH_TUNING_STATE_INITIALIZE, + TOUCH_TUNING_STATE_SCAN, + TOUCH_TUNING_STATE_COMPLETE, + TOUCH_TUNING_STATE_STOP +} touch_tuning_state_t; + +typedef enum e_touch_tuning_mode +{ + TOUCH_TUNING_MODE_CORRECTION_1ST_VALUE, + TOUCH_TUNING_MODE_CORRECTION_2ND_VALUE, + TOUCH_TUNING_MODE_MEASURE_PHASE1, + TOUCH_TUNING_MODE_MEASURE_PHASE2, + TOUCH_TUNING_MODE_MEASURE_PHASE3, + TOUCH_TUNING_MODE_QE_WATTING, + TOUCH_TUNING_MODE_START, + TOUCH_TUNING_MODE_FINISH, +} touch_tuning_mode_t; + +typedef enum e_touch_tuning_scan +{ + TOUCH_TUNING_SCAN_SELF, + TOUCH_TUNING_SCAN_MUTUAL, + TOUCH_TUNING_SCAN_MUTUAL_CFC, + TOUCH_TUNING_SCAN_CURRENT, +} touch_tuning_scan_t; + +typedef struct st_ico +{ + uint16_t pri_sen; + uint16_t snd_sen; +} touch_tuning_ico_t; + +typedef struct +{ + uint32_t mska; + uint32_t mskb; +} touch_tuning_ts_msk_t; +#endif + /** Information of button */ typedef struct { @@ -93,13 +138,14 @@ typedef struct /** TOUCH private control block. DO NOT MODIFY. Initialization occurs when RM_TOUCH_Open() is called. */ typedef struct st_touch_instance_ctrl { - uint32_t open; ///< Whether or not driver is open. - touch_button_info_t binfo; ///< Information of button. - touch_slider_info_t sinfo; ///< Information of slider. - touch_wheel_info_t winfo; ///< Information of wheel. - touch_pad_info_t pinfo; ///< Information of pad. - touch_cfg_t const * p_touch_cfg; ///< Pointer to initial configurations. - ctsu_instance_t const * p_ctsu_instance; ///< Pointer to CTSU instance. + uint32_t open; ///< Whether or not driver is open. + touch_button_info_t binfo; ///< Information of button. + touch_slider_info_t sinfo; ///< Information of slider. + touch_wheel_info_t winfo; ///< Information of wheel. + bool serial_tuning_enable; ///< Flag of serial tuning status. + touch_pad_info_t pinfo; ///< Information of pad. + touch_cfg_t const * p_touch_cfg; ///< Pointer to initial configurations. + ctsu_instance_t const * p_ctsu_instance; ///< Pointer to CTSU instance. } touch_instance_ctrl_t; /********************************************************************************************************************** @@ -125,11 +171,16 @@ fsp_err_t RM_TOUCH_PadDataGet(touch_ctrl_t * const p_ctrl, uint16_t * p_pad_rx_coordinate, uint16_t * p_pad_tx_coordinate, uint8_t * p_pad_num_touch); +fsp_err_t RM_TOUCH_ScanStop(touch_ctrl_t * const p_ctrl); fsp_err_t RM_TOUCH_CallbackSet(touch_ctrl_t * const p_api_ctrl, void ( * p_callback)(touch_callback_args_t *), void const * const p_context, touch_callback_args_t * const p_callback_memory); fsp_err_t RM_TOUCH_Close(touch_ctrl_t * const p_ctrl); +fsp_err_t RM_TOUCH_SensitivityRatioGet(touch_ctrl_t * const p_ctrl, + touch_sensitivity_info_t * p_touch_sensitivity_info); +fsp_err_t RM_TOUCH_ThresholdAdjust(touch_ctrl_t * const p_ctrl, touch_sensitivity_info_t * p_touch_sensitivity_info); +fsp_err_t RM_TOUCH_DriftControl(touch_ctrl_t * const p_ctrl, uint16_t input_drift_freq); /* Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */ FSP_FOOTER diff --git a/ra/fsp/src/bsp/cmsis/Device/RENESAS/Include/renesas.h b/ra/fsp/src/bsp/cmsis/Device/RENESAS/Include/renesas.h index 9647bcdfc..da5f25a71 100644 --- a/ra/fsp/src/bsp/cmsis/Device/RENESAS/Include/renesas.h +++ b/ra/fsp/src/bsp/cmsis/Device/RENESAS/Include/renesas.h @@ -17419,14 +17419,14 @@ typedef struct /*!< (@ 0x40070000) R_SCI0 Structure struct { - __IOM uint8_t SSE : 1; /*!< [0..0] SSn Pin Function Enable */ - __IOM uint8_t CTSE : 1; /*!< [1..1] CTS Enable */ - __IOM uint8_t MSS : 1; /*!< [2..2] Master Slave Select */ - uint8_t : 1; - __IOM uint8_t MFF : 1; /*!< [4..4] Mode Fault Flag */ - uint8_t : 1; - __IOM uint8_t CKPOL : 1; /*!< [6..6] Clock Polarity Select */ - __IOM uint8_t CKPH : 1; /*!< [7..7] Clock Phase Select */ + __IOM uint8_t SSE : 1; /*!< [0..0] SSn Pin Function Enable */ + __IOM uint8_t CTSE : 1; /*!< [1..1] CTS Enable */ + __IOM uint8_t MSS : 1; /*!< [2..2] Master Slave Select */ + __IOM uint8_t CSTPEN : 1; /*!< [3..3] CTS external pin Enable */ + __IOM uint8_t MFF : 1; /*!< [4..4] Mode Fault Flag */ + uint8_t : 1; + __IOM uint8_t CKPOL : 1; /*!< [6..6] Clock Polarity Select */ + __IOM uint8_t CKPH : 1; /*!< [7..7] Clock Phase Select */ } SPMR_b; }; @@ -32629,6 +32629,8 @@ typedef struct /*!< (@ 0x400A6000) R_OSPI Structure #define R_SCI0_SPMR_CKPOL_Msk (0x40UL) /*!< CKPOL (Bitfield-Mask: 0x01) */ #define R_SCI0_SPMR_MFF_Pos (4UL) /*!< MFF (Bit 4) */ #define R_SCI0_SPMR_MFF_Msk (0x10UL) /*!< MFF (Bitfield-Mask: 0x01) */ + #define R_SCI0_SPMR_CSTPEN_Pos (3UL) /*!< CSTPEN (Bit 3) */ + #define R_SCI0_SPMR_CSTPEN_Msk (0x8UL) /*!< CSTPEN (Bitfield-Mask: 0x01) */ #define R_SCI0_SPMR_MSS_Pos (2UL) /*!< MSS (Bit 2) */ #define R_SCI0_SPMR_MSS_Msk (0x4UL) /*!< MSS (Bitfield-Mask: 0x01) */ #define R_SCI0_SPMR_CTSE_Pos (1UL) /*!< CTSE (Bit 1) */ diff --git a/ra/fsp/src/bsp/mcu/ra2a1/bsp_feature.h b/ra/fsp/src/bsp/mcu/ra2a1/bsp_feature.h index 1e6e8c85f..d7401eda7 100644 --- a/ra/fsp/src/bsp/mcu/ra2a1/bsp_feature.h +++ b/ra/fsp/src/bsp/mcu/ra2a1/bsp_feature.h @@ -272,6 +272,7 @@ #define BSP_FEATURE_SCI_CLOCK (FSP_PRIV_CLOCK_PCLKB) #define BSP_FEATURE_SCI_UART_FIFO_CHANNELS (0x1U) #define BSP_FEATURE_SCI_UART_FIFO_DEPTH (16U) +#define BSP_FEATURE_SCI_UART_CSTPEN_CHANNELS (0x0U) #define BSP_FEATURE_SDHI_HAS_CARD_DETECTION (0) // Feature not available on this MCU #define BSP_FEATURE_SDHI_SUPPORTS_8_BIT_MMC (0) // Feature not available on this MCU diff --git a/ra/fsp/src/bsp/mcu/ra2e1/bsp_feature.h b/ra/fsp/src/bsp/mcu/ra2e1/bsp_feature.h index aa5aaba5d..9b6e01b21 100644 --- a/ra/fsp/src/bsp/mcu/ra2e1/bsp_feature.h +++ b/ra/fsp/src/bsp/mcu/ra2e1/bsp_feature.h @@ -271,6 +271,7 @@ #define BSP_FEATURE_SCI_CLOCK (FSP_PRIV_CLOCK_PCLKB) #define BSP_FEATURE_SCI_UART_FIFO_CHANNELS (0x1U) #define BSP_FEATURE_SCI_UART_FIFO_DEPTH (16U) +#define BSP_FEATURE_SCI_UART_CSTPEN_CHANNELS (0x0U) #define BSP_FEATURE_SDHI_HAS_CARD_DETECTION (0) // Feature not available on this MCU #define BSP_FEATURE_SDHI_SUPPORTS_8_BIT_MMC (0) // Feature not available on this MCU diff --git a/ra/fsp/src/bsp/mcu/ra2l1/bsp_feature.h b/ra/fsp/src/bsp/mcu/ra2l1/bsp_feature.h index 1daccc1e3..ee744e3e4 100644 --- a/ra/fsp/src/bsp/mcu/ra2l1/bsp_feature.h +++ b/ra/fsp/src/bsp/mcu/ra2l1/bsp_feature.h @@ -271,6 +271,7 @@ #define BSP_FEATURE_SCI_CLOCK (FSP_PRIV_CLOCK_PCLKB) #define BSP_FEATURE_SCI_UART_FIFO_CHANNELS (0x1U) #define BSP_FEATURE_SCI_UART_FIFO_DEPTH (16U) +#define BSP_FEATURE_SCI_UART_CSTPEN_CHANNELS (0x0U) #define BSP_FEATURE_SDHI_HAS_CARD_DETECTION (0) // Feature not available on this MCU #define BSP_FEATURE_SDHI_SUPPORTS_8_BIT_MMC (0) // Feature not available on this MCU diff --git a/ra/fsp/src/bsp/mcu/ra4e1/bsp_elc.h b/ra/fsp/src/bsp/mcu/ra4e1/bsp_elc.h new file mode 100644 index 000000000..5562c116a --- /dev/null +++ b/ra/fsp/src/bsp/mcu/ra4e1/bsp_elc.h @@ -0,0 +1,200 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +#ifndef BSP_ELC_H +#define BSP_ELC_H + +/*********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Exported global variables + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Exported global functions (to be accessed by other files) + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @addtogroup BSP_MCU_RA4E1 + * @{ + **********************************************************************************************************************/ + +/** Sources of event signals to be linked to other peripherals or the CPU + * @note This list may change based on based on the device. + * */ +typedef enum e_elc_event_ra4m1 +{ + ELC_EVENT_NONE = (0), // Link disabled + ELC_EVENT_ICU_IRQ0 = (0x001), // External pin interrupt 0 + ELC_EVENT_ICU_IRQ1 = (0x002), // External pin interrupt 1 + ELC_EVENT_ICU_IRQ2 = (0x003), // External pin interrupt 2 + ELC_EVENT_ICU_IRQ3 = (0x004), // External pin interrupt 3 + ELC_EVENT_ICU_IRQ4 = (0x005), // External pin interrupt 4 + ELC_EVENT_ICU_IRQ5 = (0x006), // External pin interrupt 5 + ELC_EVENT_ICU_IRQ6 = (0x007), // External pin interrupt 6 + ELC_EVENT_ICU_IRQ7 = (0x008), // External pin interrupt 7 + ELC_EVENT_ICU_IRQ8 = (0x009), // External pin interrupt 8 + ELC_EVENT_ICU_IRQ9 = (0x00A), // External pin interrupt 9 + ELC_EVENT_ICU_IRQ13 = (0x00E), // External pin interrupt 13 + ELC_EVENT_DMAC0_INT = (0x020), // DMAC transfer end 0 + ELC_EVENT_DMAC1_INT = (0x021), // DMAC transfer end 1 + ELC_EVENT_DMAC2_INT = (0x022), // DMAC transfer end 2 + ELC_EVENT_DMAC3_INT = (0x023), // DMAC transfer end 3 + ELC_EVENT_DMAC4_INT = (0x024), // DMAC transfer end 4 + ELC_EVENT_DMAC5_INT = (0x025), // DMAC transfer end 5 + ELC_EVENT_DMAC6_INT = (0x026), // DMAC transfer end 6 + ELC_EVENT_DMAC7_INT = (0x027), // DMAC transfer end 7 + ELC_EVENT_DTC_COMPLETE = (0x029), // DTC transfer complete + ELC_EVENT_DTC_END = (0x02A), // DTC transfer end + ELC_EVENT_DMA_TRANSERR = (0x02B), // DTC transfer error + ELC_EVENT_ICU_SNOOZE_CANCEL = (0x02D), // Canceling from Snooze mode + ELC_EVENT_FCU_FIFERR = (0x030), // Flash access error interrupt + ELC_EVENT_FCU_FRDYI = (0x031), // Flash ready interrupt + ELC_EVENT_LVD_LVD1 = (0x038), // Voltage monitor 1 interrupt + ELC_EVENT_LVD_LVD2 = (0x039), // Voltage monitor 2 interrupt + ELC_EVENT_CGC_MOSC_STOP = (0x03B), // Main Clock oscillation stop + ELC_EVENT_LPM_SNOOZE_REQUEST = (0x03C), // Snooze entry + ELC_EVENT_AGT0_INT = (0x040), // AGT interrupt + ELC_EVENT_AGT0_COMPARE_A = (0x041), // Compare match A + ELC_EVENT_AGT0_COMPARE_B = (0x042), // Compare match B + ELC_EVENT_AGT1_INT = (0x043), // AGT interrupt + ELC_EVENT_AGT1_COMPARE_A = (0x044), // Compare match A + ELC_EVENT_AGT1_COMPARE_B = (0x045), // Compare match B + ELC_EVENT_AGT2_INT = (0x046), // AGT interrupt + ELC_EVENT_AGT2_COMPARE_A = (0x047), // Compare match A + ELC_EVENT_AGT2_COMPARE_B = (0x048), // Compare match B + ELC_EVENT_AGT3_INT = (0x049), // AGT interrupt + ELC_EVENT_AGT3_COMPARE_A = (0x04A), // Compare match A + ELC_EVENT_AGT3_COMPARE_B = (0x04B), // Compare match B + ELC_EVENT_AGT5_INT = (0x04F), // AGT interrupt + ELC_EVENT_AGT5_COMPARE_A = (0x050), // Compare match A + ELC_EVENT_AGT5_COMPARE_B = (0x051), // Compare match B + ELC_EVENT_IWDT_UNDERFLOW = (0x052), // IWDT underflow + ELC_EVENT_WDT_UNDERFLOW = (0x053), // WDT underflow + ELC_EVENT_RTC_ALARM = (0x054), // Alarm interrupt + ELC_EVENT_RTC_PERIOD = (0x055), // Periodic interrupt + ELC_EVENT_RTC_CARRY = (0x056), // Carry interrupt + ELC_EVENT_USBFS_FIFO_0 = (0x06B), // DMA transfer request 0 + ELC_EVENT_USBFS_FIFO_1 = (0x06C), // DMA transfer request 1 + ELC_EVENT_USBFS_INT = (0x06D), // USBFS interrupt + ELC_EVENT_USBFS_RESUME = (0x06E), // USBFS resume interrupt + ELC_EVENT_IIC0_RXI = (0x073), // Receive data full + ELC_EVENT_IIC0_TXI = (0x074), // Transmit data empty + ELC_EVENT_IIC0_TEI = (0x075), // Transmit end + ELC_EVENT_IIC0_ERI = (0x076), // Transfer error + ELC_EVENT_IIC0_WUI = (0x077), // Slave address match + ELC_EVENT_CAC_FREQUENCY_ERROR = (0x09E), // Frequency error interrupt + ELC_EVENT_CAC_MEASUREMENT_END = (0x09F), // Measurement end interrupt + ELC_EVENT_CAC_OVERFLOW = (0x0A0), // Overflow interrupt + ELC_EVENT_CAN0_ERROR = (0x0A1), // Error interrupt + ELC_EVENT_CAN0_FIFO_RX = (0x0A2), // Receive FIFO interrupt + ELC_EVENT_CAN0_FIFO_TX = (0x0A3), // Transmit FIFO interrupt + ELC_EVENT_CAN0_MAILBOX_RX = (0x0A4), // Reception complete interrupt + ELC_EVENT_CAN0_MAILBOX_TX = (0x0A5), // Transmission complete interrupt + ELC_EVENT_IOPORT_EVENT_1 = (0x0B1), // Port 1 event + ELC_EVENT_IOPORT_EVENT_2 = (0x0B2), // Port 2 event + ELC_EVENT_IOPORT_EVENT_3 = (0x0B3), // Port 3 event + ELC_EVENT_IOPORT_EVENT_4 = (0x0B4), // Port 4 event + ELC_EVENT_ELC_SOFTWARE_EVENT_0 = (0x0B5), // Software event 0 + ELC_EVENT_ELC_SOFTWARE_EVENT_1 = (0x0B6), // Software event 1 + ELC_EVENT_POEG0_EVENT = (0x0B7), // Port Output disable interrupt A + ELC_EVENT_POEG1_EVENT = (0x0B8), // Port Output disable interrupt B + ELC_EVENT_POEG2_EVENT = (0x0B9), // Port Output disable interrupt C + ELC_EVENT_POEG3_EVENT = (0x0BA), // Port Output disable interrupt D + ELC_EVENT_GPT1_CAPTURE_COMPARE_A = (0x0C9), // Compare match A + ELC_EVENT_GPT1_CAPTURE_COMPARE_B = (0x0CA), // Compare match B + ELC_EVENT_GPT1_COMPARE_C = (0x0CB), // Compare match C + ELC_EVENT_GPT1_COMPARE_D = (0x0CC), // Compare match D + ELC_EVENT_GPT1_COMPARE_E = (0x0CD), // Compare match E + ELC_EVENT_GPT1_COMPARE_F = (0x0CE), // Compare match F + ELC_EVENT_GPT1_COUNTER_OVERFLOW = (0x0CF), // Overflow + ELC_EVENT_GPT1_COUNTER_UNDERFLOW = (0x0D0), // Underflow + ELC_EVENT_GPT1_PC = (0x0D1), // Period count function finish + ELC_EVENT_GPT2_CAPTURE_COMPARE_A = (0x0D2), // Compare match A + ELC_EVENT_GPT2_CAPTURE_COMPARE_B = (0x0D3), // Compare match B + ELC_EVENT_GPT2_COMPARE_C = (0x0D4), // Compare match C + ELC_EVENT_GPT2_COMPARE_D = (0x0D5), // Compare match D + ELC_EVENT_GPT2_COMPARE_E = (0x0D6), // Compare match E + ELC_EVENT_GPT2_COMPARE_F = (0x0D7), // Compare match F + ELC_EVENT_GPT2_COUNTER_OVERFLOW = (0x0D8), // Overflow + ELC_EVENT_GPT2_COUNTER_UNDERFLOW = (0x0D9), // Underflow + ELC_EVENT_GPT4_CAPTURE_COMPARE_A = (0x0E4), // Compare match A + ELC_EVENT_GPT4_CAPTURE_COMPARE_B = (0x0E5), // Compare match B + ELC_EVENT_GPT4_COMPARE_C = (0x0E6), // Compare match C + ELC_EVENT_GPT4_COMPARE_D = (0x0E7), // Compare match D + ELC_EVENT_GPT4_COMPARE_E = (0x0E8), // Compare match E + ELC_EVENT_GPT4_COMPARE_F = (0x0E9), // Compare match F + ELC_EVENT_GPT4_COUNTER_OVERFLOW = (0x0EA), // Overflow + ELC_EVENT_GPT4_COUNTER_UNDERFLOW = (0x0EB), // Underflow + ELC_EVENT_GPT4_PC = (0x0EC), // Period count function finish + ELC_EVENT_GPT5_CAPTURE_COMPARE_A = (0x0ED), // Compare match A + ELC_EVENT_GPT5_CAPTURE_COMPARE_B = (0x0EE), // Compare match B + ELC_EVENT_GPT5_COMPARE_C = (0x0EF), // Compare match C + ELC_EVENT_GPT5_COMPARE_D = (0x0F0), // Compare match D + ELC_EVENT_GPT5_COMPARE_E = (0x0F1), // Compare match E + ELC_EVENT_GPT5_COMPARE_F = (0x0F2), // Compare match F + ELC_EVENT_GPT5_COUNTER_OVERFLOW = (0x0F3), // Overflow + ELC_EVENT_GPT5_COUNTER_UNDERFLOW = (0x0F4), // Underflow + ELC_EVENT_GPT5_PC = (0x0F5), // Period count function finish + ELC_EVENT_ADC0_SCAN_END = (0x160), // A/D scan end interrupt + ELC_EVENT_ADC0_SCAN_END_B = (0x161), // A/D scan end interrupt for group B + ELC_EVENT_ADC0_WINDOW_A = (0x162), // Window A Compare match + ELC_EVENT_ADC0_WINDOW_B = (0x163), // Window B Compare match + ELC_EVENT_ADC0_COMPARE_MATCH = (0x164), // Compare match + ELC_EVENT_ADC0_COMPARE_MISMATCH = (0x165), // Compare mismatch + ELC_EVENT_SCI0_RXI = (0x180), // Receive data full + ELC_EVENT_SCI0_TXI = (0x181), // Transmit data empty + ELC_EVENT_SCI0_TEI = (0x182), // Transmit end + ELC_EVENT_SCI0_ERI = (0x183), // Receive error + ELC_EVENT_SCI0_AM = (0x184), // Address match event + ELC_EVENT_SCI0_RXI_OR_ERI = (0x185), // Receive data full/Receive + ELC_EVENT_SCI3_RXI = (0x192), // Received data full + ELC_EVENT_SCI3_TXI = (0x193), // Transmit data empty + ELC_EVENT_SCI3_TEI = (0x194), // Transmit end + ELC_EVENT_SCI3_ERI = (0x195), // Receive error + ELC_EVENT_SCI3_AM = (0x196), // Address match event + ELC_EVENT_SCI4_RXI = (0x198), // Received data full + ELC_EVENT_SCI4_TXI = (0x199), // Transmit data empty + ELC_EVENT_SCI4_TEI = (0x19A), // Transmit end + ELC_EVENT_SCI4_ERI = (0x19B), // Receive error + ELC_EVENT_SCI4_AM = (0x19C), // Address match event + ELC_EVENT_SCI9_RXI = (0x1B6), // Received data full + ELC_EVENT_SCI9_TXI = (0x1B7), // Transmit data empty + ELC_EVENT_SCI9_TEI = (0x1B8), // Transmit end + ELC_EVENT_SCI9_ERI = (0x1B9), // Receive error + ELC_EVENT_SCI9_AM = (0x1BA), // Address match event + ELC_EVENT_SPI0_RXI = (0x1C4), // Receive buffer full + ELC_EVENT_SPI0_TXI = (0x1C5), // Transmit buffer empty + ELC_EVENT_SPI0_IDLE = (0x1C6), // Idle + ELC_EVENT_SPI0_ERI = (0x1C7), // Error + ELC_EVENT_SPI0_TEI = (0x1C8), // Transmission complete event + ELC_EVENT_QSPI_INT = (0x1DA), // QSPI interrupt + ELC_EVENT_DOC_INT = (0x1DB), // Data operation circuit interrupt +} elc_event_t; + +/** @} (end addtogroup BSP_MCU_RA4E1) */ + +#endif diff --git a/ra/fsp/src/bsp/mcu/ra4e1/bsp_feature.h b/ra/fsp/src/bsp/mcu/ra4e1/bsp_feature.h new file mode 100644 index 000000000..679108509 --- /dev/null +++ b/ra/fsp/src/bsp/mcu/ra4e1/bsp_feature.h @@ -0,0 +1,308 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +#ifndef BSP_FEATURE_H +#define BSP_FEATURE_H + +/*********************************************************************************************************************** + * Includes , "Project Includes" + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ + +/** The main oscillator drive value is based upon the oscillator frequency selected in the configuration */ +#if (BSP_CFG_XTAL_HZ > (19999999)) + #define CGC_MAINCLOCK_DRIVE (0x00U) +#elif (BSP_CFG_XTAL_HZ > (15999999)) && (BSP_CFG_XTAL_HZ < (20000000)) + #define CGC_MAINCLOCK_DRIVE (0x01U) +#elif (BSP_CFG_XTAL_HZ > (7999999)) && (BSP_CFG_XTAL_HZ < (16000000)) + #define CGC_MAINCLOCK_DRIVE (0x02U) +#else + #define CGC_MAINCLOCK_DRIVE (0x03U) +#endif + +/*********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Exported global variables (to be accessed by other files) + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Private global variables and functions + **********************************************************************************************************************/ + +#define BSP_FEATURE_ACMPHS_MIN_WAIT_TIME_US (0) // Feature not available on this MCU +#define BSP_FEATURE_ACMPHS_VREF (0) // Feature not available on this MCU + +#define BSP_FEATURE_ACMPLP_HAS_COMPSEL_REGISTERS (0) // Feature not available on this MCU +#define BSP_FEATURE_ACMPLP_MIN_WAIT_TIME_US (0) // Feature not available on this MCU + +#define BSP_FEATURE_ADC_ADDITION_SUPPORTED (1U) +#define BSP_FEATURE_ADC_CALIBRATION_REG_AVAILABLE (0U) +#define BSP_FEATURE_ADC_CLOCK_SOURCE (FSP_PRIV_CLOCK_PCLKC) +#define BSP_FEATURE_ADC_GROUP_B_SENSORS_ALLOWED (1U) +#define BSP_FEATURE_ADC_HAS_ADCER_ADPRC (1U) +#define BSP_FEATURE_ADC_HAS_ADCER_ADRFMT (1U) +#define BSP_FEATURE_ADC_HAS_ADHVREFCNT (0U) +#define BSP_FEATURE_BSP_HAS_CLOCK_SUPPLY_TYPEB (0U) +#define BSP_FEATURE_ADC_HAS_PGA (0U) +#define BSP_FEATURE_ADC_HAS_SAMPLE_HOLD_REG (0U) +#define BSP_FEATURE_ADC_HAS_VREFAMPCNT (0U) +#define BSP_FEATURE_ADC_MAX_RESOLUTION_BITS (12U) +#define BSP_FEATURE_ADC_SENSORS_EXCLUSIVE (0U) +#define BSP_FEATURE_ADC_SENSOR_MIN_SAMPLING_TIME (4150U) +#define BSP_FEATURE_ADC_TSN_CALIBRATION32_AVAILABLE (0U) // Feature not available on this MCU +#define BSP_FEATURE_ADC_TSN_CALIBRATION32_MASK (0U) // Feature not available on this MCU +#define BSP_FEATURE_ADC_TSN_CALIBRATION_AVAILABLE (0U) // Feature not available on this MCU +#define BSP_FEATURE_ADC_TSN_CONTROL_AVAILABLE (0U) // Feature not available on this MCU +#define BSP_FEATURE_ADC_TSN_SLOPE (0) // Feature not available on this MCU +#define BSP_FEATURE_ADC_UNIT_0_CHANNELS (0x1381F) // 0 to 4, 11 to 13, 16 +#define BSP_FEATURE_ADC_UNIT_1_CHANNELS (0) // Feature not available on this MCU +#define BSP_FEATURE_ADC_VALID_UNIT_MASK (1U) +#define BSP_FEATURE_ADC_HAS_ADBUF (1U) + +#define BSP_FEATURE_AGT_VALID_CHANNEL_MASK (0x2F) +#define BSP_FEATURE_AGT_MAX_CHANNEL_NUM (5) + +#define BSP_FEATURE_BSP_FLASH_CACHE (1) +#define BSP_FEATURE_BSP_FLASH_CACHE_DISABLE_OPM (0U) +#define BSP_FEATURE_BSP_FLASH_PREFETCH_BUFFER (0) +#define BSP_FEATURE_BSP_HAS_CODE_SYSTEM_CACHE (0) +#define BSP_FEATURE_BSP_HAS_OCTASPI_CLOCK (0) // Feature not available on this MCU +#define BSP_FEATURE_BSP_HAS_CANFD_CLOCK (0) // Feature not available on this MCU +#define BSP_FEATURE_BSP_HAS_SCE5 (0) // Feature not available on this MCU +#define BSP_FEATURE_BSP_HAS_SCE_ON_RA2 (0) // Feature not available on this MCU +#define BSP_FEATURE_BSP_HAS_SECURITY_MPU (0U) +#define BSP_FEATURE_BSP_HAS_SP_MON (0U) +#define BSP_FEATURE_BSP_HAS_USBCKDIVCR (1U) +#define BSP_FEATURE_BSP_HAS_USB_CLOCK_DIV (1U) +#define BSP_FEATURE_BSP_HAS_USB_CLOCK_REQ (1U) +#define BSP_FEATURE_BSP_HAS_USB_CLOCK_SEL (1U) +#define BSP_FEATURE_BSP_HAS_USB_CLOCK_SEL_ALT (0U) +#define BSP_FEATURE_BSP_MCU_INFO_POINTER_LOCATION (0U) +#define BSP_FEATURE_BSP_MPU_REGION0_MASK (0U) // Feature not available on this MCU +#define BSP_FEATURE_BSP_MSTP_GPT_MSTPD5_MAX_CH (0U) // If MSTPCRE is present than the setting is not valid. +#define BSP_FEATURE_BSP_MSTP_HAS_MSTPCRE (1U) +#define BSP_FEATURE_BSP_OFS1_HOCOFRQ_MASK (0xFFFFF9FFU) +#define BSP_FEATURE_BSP_OFS1_HOCOFRQ_OFFSET (9U) +#define BSP_FEATURE_BSP_OSIS_PADDING (0U) +#define BSP_FEATURE_BSP_POWER_CHANGE_MSTP_REQUIRED (0U) +#define BSP_FEATURE_BSP_HAS_DCDC_REGULATOR (0U) +#define BSP_FEATURE_BSP_RESET_TRNG (0U) +#define BSP_FEATURE_BSP_SYS_CLOCK_FREQ_NO_RAM_WAITS (100000000U) // The maximum frequency allowed without having RAM wait state enabled in SRAMWTSC. +#define BSP_FEATURE_BSP_SYS_CLOCK_FREQ_ONE_ROM_WAITS (50000000U) // The maximum frequency allowed without having one ROM wait cycle. +#define BSP_FEATURE_BSP_SYS_CLOCK_FREQ_THREE_ROM_WAITS (0U) // The maximum frequency allowed without having three ROM wait cycles (Set to zero if this is not an option). +#define BSP_FEATURE_BSP_SYS_CLOCK_FREQ_TWO_ROM_WAITS (0U) // The maximum frequency allowed without having two ROM wait cycles. +#define BSP_FEATURE_BSP_UNIQUE_ID_OFFSET (0U) +#define BSP_FEATURE_BSP_UNIQUE_ID_POINTER (0x01008190U) +#define BSP_FEATURE_BSP_VBATT_HAS_VBTCR1_BPWSWSTP (0U) + +#define BSP_FEATURE_CAN_CHECK_PCLKB_RATIO (0U) +#define BSP_FEATURE_CAN_CLOCK (0U) +#define BSP_FEATURE_CAN_MCLOCK_ONLY (0U) +#define BSP_FEATURE_CAN_NUM_CHANNELS (1U) + +#define BSP_FEATURE_CANFD_NUM_CHANNELS (0U) // Feature not available on this MCU + +#define BSP_FEATURE_CGC_HAS_BCLK (0U) +#define BSP_FEATURE_CGC_HAS_FCLK (1U) +#define BSP_FEATURE_CGC_HAS_FLDWAITR (0U) +#define BSP_FEATURE_CGC_HAS_FLWT (1U) +#define BSP_FEATURE_CGC_HAS_FLL (1U) +#define BSP_FEATURE_CGC_HAS_HOCOWTCR (0U) +#define BSP_FEATURE_CGC_HAS_MEMWAIT (0U) +#define BSP_FEATURE_CGC_HAS_PCLKA (1U) +#define BSP_FEATURE_CGC_HAS_PCLKB (1U) +#define BSP_FEATURE_CGC_HAS_PCLKC (1U) +#define BSP_FEATURE_CGC_HAS_PCLKD (1U) +#define BSP_FEATURE_CGC_HAS_PLL (1U) +#define BSP_FEATURE_CGC_HAS_PLL2 (1U) // This MCU has an additional PLL that can be used as a clock source for USB. +#define BSP_FEATURE_CGC_HAS_SRAMPRCR2 (1U) // This MCU has an additional register to enable write access for SRAMWTSC. +#define BSP_FEATURE_CGC_HAS_SRAMWTSC (1U) +#define BSP_FEATURE_CGC_HOCOSF_BEFORE_OPCCR (0U) +#define BSP_FEATURE_CGC_HOCOWTCR_64MHZ_ONLY (0U) +#define BSP_FEATURE_CGC_ICLK_DIV_RESET (BSP_CLOCKS_SYS_CLOCK_DIV_4) +#define BSP_FEATURE_CGC_LOCO_STABILIZATION_MAX_US (61U) +#define BSP_FEATURE_CGC_LOW_SPEED_MAX_FREQ_HZ (1000000U) // This MCU does have Low Speed Mode, up to 1MHz +#define BSP_FEATURE_CGC_LOW_VOLTAGE_MAX_FREQ_HZ (0U) // This MCU does not have Low Voltage Mode +#define BSP_FEATURE_CGC_MIDDLE_SPEED_MAX_FREQ_HZ (0U) // This MCU does not have Middle Speed Mode +#define BSP_FEATURE_CGC_MOCO_STABILIZATION_MAX_US (15U) +#define BSP_FEATURE_CGC_MODRV_MASK (0x30U) +#define BSP_FEATURE_CGC_MODRV_SHIFT (0x4U) +#define BSP_FEATURE_CGC_PLLCCR_TYPE (1U) +#define BSP_FEATURE_CGC_PLLCCR_WAIT_US (0U) // No wait between setting PLLCCR and clearing PLLSTP +#define BSP_FEATURE_CGC_PLLCCR_MAX_HZ (200000000U) +#define BSP_FEATURE_CGC_SCKDIVCR_BCLK_MATCHES_PCLKB (1) +#define BSP_FEATURE_CGC_SODRV_MASK (0x02U) +#define BSP_FEATURE_CGC_SODRV_SHIFT (0x01U) +#define BSP_FEATURE_CGC_STARTUP_OPCCR_MODE (0) + +#define BSP_FEATURE_CRYPTO_HAS_AES (0) +#define BSP_FEATURE_CRYPTO_HAS_AES_WRAPPED (0) +#define BSP_FEATURE_CRYPTO_HAS_ECC (0) +#define BSP_FEATURE_CRYPTO_HAS_ECC_WRAPPED (0) +#define BSP_FEATURE_CRYPTO_HAS_HASH (0) +#define BSP_FEATURE_CRYPTO_HAS_RSA (0) +#define BSP_FEATURE_CRYPTO_HAS_RSA_WRAPPED (0) +#define BSP_FEATURE_CRYPTO_HAS_CTR_DRBG (1) +#define BSP_FEATURE_CRYPTO_HAS_SCE9 (1) + +#define BSP_FEATURE_CTSU_CTSUCHAC_REGISTER_COUNT (0U) // Feature not available on this MCU +#define BSP_FEATURE_CTSU_CTSUCHTRC_REGISTER_COUNT (0U) // Feature not available on this MCU +#define BSP_FEATURE_CTSU_HAS_TXVSEL (0) // Feature not available on this MCU +#define BSP_FEATURE_CTSU_VERSION (0) // Feature not available on this MCU + +#define BSP_FEATURE_DAC8_HAS_CHARGEPUMP (0) // Feature not available on this MCU +#define BSP_FEATURE_DAC8_HAS_DA_AD_SYNCHRONIZE (0) // Feature not available on this MCU +#define BSP_FEATURE_DAC8_HAS_REALTIME_MODE (0) // Feature not available on this MCU +#define BSP_FEATURE_DAC8_MAX_CHANNELS (0) // Feature not available on this MCU + +#define BSP_FEATURE_DAC_HAS_CHARGEPUMP (0U) +#define BSP_FEATURE_DAC_HAS_DAVREFCR (0U) +#define BSP_FEATURE_DAC_HAS_OUTPUT_AMPLIFIER (1U) +#define BSP_FEATURE_DAC_MAX_CHANNELS (1U) + +#define BSP_FEATURE_DMAC_MAX_CHANNEL (8U) +#define BSP_FEATURE_DMAC_HAS_REPEAT_BLOCK_MODE (1U) + +#define BSP_FEATURE_DWT_CYCCNT (1U) // This MCU has Data Watchpoint Cycle Count Register + +#define BSP_FEATURE_ELC_PERIPHERAL_MASK (0x0003D1FFU) // Positions of event link set registers (ELSRs) available on this MCU + +#define BSP_FEATURE_ETHER_FIFO_DEPTH (0) // Feature not available on this MCU +#define BSP_FEATURE_ETHER_MAX_CHANNELS (0) // Feature not available on this MCU + +#define BSP_FEATURE_FLASH_DATA_FLASH_START (0x08000000U) +#define BSP_FEATURE_FLASH_HP_CF_REGION0_BLOCK_SIZE (0x2000U) +#define BSP_FEATURE_FLASH_HP_CF_REGION0_SIZE (0x10000U) +#define BSP_FEATURE_FLASH_HP_CF_REGION1_BLOCK_SIZE (0x8000U) +#define BSP_FEATURE_FLASH_HP_CF_WRITE_SIZE (128U) +#define BSP_FEATURE_FLASH_HP_DF_BLOCK_SIZE (64U) +#define BSP_FEATURE_FLASH_HP_DF_WRITE_SIZE (4U) +#define BSP_FEATURE_FLASH_HP_HAS_FMEPROT (1) +#define BSP_FEATURE_FLASH_HP_SUPPORTS_DUAL_BANK (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_HP_VERSION (40U) +#define BSP_FEATURE_FLASH_LP_AWS_FAW_MASK (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_LP_AWS_FAW_SHIFT (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_LP_CF_BLOCK_SIZE (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_LP_CF_WRITE_SIZE (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_LP_DF_BLOCK_SIZE (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_LP_DF_WRITE_SIZE (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_LP_FLASH_CLOCK_SRC (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_LP_VERSION (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_SUPPORTS_ACCESS_WINDOW (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_SUPPORTS_ID_CODE (0) // Feature not available on this MCU + +#define BSP_FEATURE_GPTEH_CHANNEL_MASK (0) + +#define BSP_FEATURE_GPTE_CHANNEL_MASK (0) + +#define BSP_FEATURE_GPT_32BIT_CHANNEL_MASK (0x06U) +#define BSP_FEATURE_GPT_VALID_CHANNEL_MASK (0x36U) + +#define BSP_FEATURE_ICU_HAS_WUPEN1 (1U) +#define BSP_FEATURE_ICU_IRQ_CHANNELS_MASK (0x23FFU) +#define BSP_FEATURE_ICU_WUPEN_MASK (0x7FB0D23FFULL) // Note there is another WUPEN1 register +#define BSP_FEATURE_ICU_HAS_INTERRUPT_GROUPS (0U) + +#define BSP_FEATURE_IIC_FAST_MODE_PLUS (1U << 0U) +#define BSP_FEATURE_IIC_VALID_CHANNEL_MASK (0x01) + +#define BSP_FEATURE_IOPORT_ELC_PORTS (4) +#define BSP_FEATURE_IOPORT_HAS_ETHERNET (0U) + +#define BSP_FEATURE_LPM_CHANGE_MSTP_ARRAY (0U) +#define BSP_FEATURE_LPM_CHANGE_MSTP_REQUIRED (0U) +#define BSP_FEATURE_LPM_DPSIEGR_MASK (0x1303F3U) +#define BSP_FEATURE_LPM_DPSIER_MASK (0x0D1F03F3U) +#define BSP_FEATURE_LPM_HAS_DEEP_STANDBY (1U) +#define BSP_FEATURE_LPM_HAS_SBYCR_OPE (0U) +#define BSP_FEATURE_LPM_HAS_SNZEDCR1 (1U) +#define BSP_FEATURE_LPM_HAS_SNZREQCR1 (1U) +#define BSP_FEATURE_LPM_HAS_STCONR (0U) +#define BSP_FEATURE_LPM_SBYCR_WRITE1_B14 (1) +#define BSP_FEATURE_LPM_SNZEDCR_MASK (0x000001FFU) // note there is another SNZEDCR1 register +#define BSP_FEATURE_LPM_SNZREQCR_MASK (0x77300FFFFULL) // note there is another SNZEREQCR1 register + +#define BSP_FEATURE_LVD_HAS_DIGITAL_FILTER (1U) +#define BSP_FEATURE_LVD_HAS_LVDLVLR (0U) +#define BSP_FEATURE_LVD_MONITOR_1_HI_THRESHOLD (LVD_THRESHOLD_MONITOR_1_LEVEL_2_99V) // 2.99V +#define BSP_FEATURE_LVD_MONITOR_1_LOW_THRESHOLD (LVD_THRESHOLD_MONITOR_1_LEVEL_2_85V) // 2.85V +#define BSP_FEATURE_LVD_MONITOR_2_HI_THRESHOLD (LVD_THRESHOLD_MONITOR_2_LEVEL_2_99V) // 2.99V +#define BSP_FEATURE_LVD_MONITOR_2_LOW_THRESHOLD (LVD_THRESHOLD_MONITOR_2_LEVEL_2_85V) // 2.85V +#define BSP_FEATURE_LVD_STABILIZATION_TIME_US (10U) // Time in microseconds required for LVD to stabilize + +#define BSP_FEATURE_OPAMP_BASE_ADDRESS (0U) +#define BSP_FEATURE_OPAMP_HAS_MIDDLE_SPEED (0) // Feature not available on this MCU +#define BSP_FEATURE_OPAMP_HAS_SWITCHES (0U) +#define BSP_FEATURE_OPAMP_HAS_THIRD_CHANNEL (0U) +#define BSP_FEATURE_OPAMP_MIN_WAIT_TIME_HS_US (0) // Feature not available on this MCU +#define BSP_FEATURE_OPAMP_MIN_WAIT_TIME_LP_US (0) // Feature not available on this MCU +#define BSP_FEATURE_OPAMP_MIN_WAIT_TIME_MS_US (0) // Feature not available on this MCU +#define BSP_FEATURE_OPAMP_TRIM_CAPABLE (0U) +#define BSP_FEATURE_OPAMP_VARIANT_CHANNEL_MASK (0U) + +#define BSP_FEATURE_OSPI_DEVICE_0_START_ADDRESS (0x0U) +#define BSP_FEATURE_OSPI_DEVICE_1_START_ADDRESS (0x0U) + +#define BSP_FEATURE_POEG_CHANNEL_MASK (0xFU) + +#define BSP_FEATURE_QSPI_DEVICE_START_ADDRESS (0x60000000U) + +#define BSP_FEATURE_SCI_ADDRESS_MATCH_CHANNELS (0x219U) +#define BSP_FEATURE_SCI_CHANNELS (0x219U) +#define BSP_FEATURE_SCI_CLOCK (FSP_PRIV_CLOCK_PCLKA) +#define BSP_FEATURE_SCI_UART_FIFO_CHANNELS (0x219U) +#define BSP_FEATURE_SCI_UART_FIFO_DEPTH (16U) +#define BSP_FEATURE_SCI_UART_CSTPEN_CHANNELS (0x0219U) // Channel 0, channel 3, Channel 4, channel 9 have CSTPEN feature + +#define BSP_FEATURE_SDHI_HAS_CARD_DETECTION (0U) // Feature not available on this MCU +#define BSP_FEATURE_SDHI_SUPPORTS_8_BIT_MMC (0U) // Feature not available on this MCU +#define BSP_FEATURE_SDHI_VALID_CHANNEL_MASK (0U) // Feature not available on this MCU +#define BSP_FEATURE_SDHI_CLOCK (FSP_PRIV_CLOCK_PCLKB) +#define BSP_FEATURE_SDHI_MIN_CLOCK_DIVISION_SHIFT (0U) // Feature not available on this MCU + +#define BSP_FEATURE_SDRAM_START_ADDRESS (0x0U) // Feature not available on this MCU + +#define BSP_FEATURE_SLCDC_HAS_8_TIME_SLICE (0) // Feature not available on this MCU +#define BSP_FEATURE_SLCDC_HAS_INTERNAL_VOLT_GEN (0) // Feature not available on this MCU +#define BSP_FEATURE_SLCDC_MAX_NUM_SEG (0) // Feature not available on this MCU + +#define BSP_FEATURE_SPI_CLK (FSP_PRIV_CLOCK_PCLKA) +#define BSP_FEATURE_SPI_HAS_SPCR3 (1U) +#define BSP_FEATURE_SPI_HAS_SSL_LEVEL_KEEP (1U) +#define BSP_FEATURE_SPI_MAX_CHANNEL (1U) + +#define BSP_FEATURE_SRAM_SRAMWTSC_WAIT_CYCLE_ENABLE (0x01U) + +#define BSP_FEATURE_SSI_FIFO_NUM_STAGES (0U) // Feature not available on this MCU +#define BSP_FEATURE_SSI_VALID_CHANNEL_MASK (0U) // Feature not available on this MCU + +#define BSP_FEATURE_TRNG_HAS_MODULE_STOP (0U) + +#define BSP_FEATURE_TZ_HAS_TRUSTZONE (1U) + +#define BSP_FEATURE_BSP_NUM_PMSAR (6U) + +#endif diff --git a/ra/fsp/src/bsp/mcu/ra4e1/bsp_mcu_info.h b/ra/fsp/src/bsp/mcu/ra4e1/bsp_mcu_info.h new file mode 100644 index 000000000..aef824215 --- /dev/null +++ b/ra/fsp/src/bsp/mcu/ra4e1/bsp_mcu_info.h @@ -0,0 +1,58 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @ingroup BSP_MCU + * @defgroup BSP_MCU_RA4E1 RA4E1 + * @includedoc config_bsp_ra4e1_fsp.html + * @{ + **********************************************************************************************************************/ + +/** @} (end defgroup BSP_MCU_RA4E1) */ + +#ifndef BSP_MCU_INFO_H +#define BSP_MCU_INFO_H + +/*********************************************************************************************************************** + * Includes , "Project Includes" + **********************************************************************************************************************/ + +/* BSP MCU Specific Includes. */ +#include "bsp_elc.h" +#include "bsp_feature.h" + +/*********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ +typedef elc_event_t bsp_interrupt_event_t; + +/*********************************************************************************************************************** + * Exported global variables + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Exported global functions (to be accessed by other files) + **********************************************************************************************************************/ + +#endif diff --git a/ra/fsp/src/bsp/mcu/ra4m1/bsp_feature.h b/ra/fsp/src/bsp/mcu/ra4m1/bsp_feature.h index d9a90c268..f942cfeab 100644 --- a/ra/fsp/src/bsp/mcu/ra4m1/bsp_feature.h +++ b/ra/fsp/src/bsp/mcu/ra4m1/bsp_feature.h @@ -272,6 +272,7 @@ #define BSP_FEATURE_SCI_CLOCK (FSP_PRIV_CLOCK_PCLKA) #define BSP_FEATURE_SCI_UART_FIFO_CHANNELS (0x3U) #define BSP_FEATURE_SCI_UART_FIFO_DEPTH (16U) +#define BSP_FEATURE_SCI_UART_CSTPEN_CHANNELS (0x0U) #define BSP_FEATURE_SDHI_HAS_CARD_DETECTION (0) // Feature not available on this MCU #define BSP_FEATURE_SDHI_SUPPORTS_8_BIT_MMC (0) // Feature not available on this MCU diff --git a/ra/fsp/src/bsp/mcu/ra4m2/bsp_feature.h b/ra/fsp/src/bsp/mcu/ra4m2/bsp_feature.h index 23e01dfac..0922b9feb 100644 --- a/ra/fsp/src/bsp/mcu/ra4m2/bsp_feature.h +++ b/ra/fsp/src/bsp/mcu/ra4m2/bsp_feature.h @@ -275,6 +275,7 @@ #define BSP_FEATURE_SCI_CLOCK (FSP_PRIV_CLOCK_PCLKA) #define BSP_FEATURE_SCI_UART_FIFO_CHANNELS (0x219U) #define BSP_FEATURE_SCI_UART_FIFO_DEPTH (16U) +#define BSP_FEATURE_SCI_UART_CSTPEN_CHANNELS (0x0219U) // Channel 0, channel 3, Channel 4, channel 9 have CSTPEN feature #define BSP_FEATURE_SDHI_HAS_CARD_DETECTION (1U) #define BSP_FEATURE_SDHI_SUPPORTS_8_BIT_MMC (1U) diff --git a/ra/fsp/src/bsp/mcu/ra4m3/bsp_feature.h b/ra/fsp/src/bsp/mcu/ra4m3/bsp_feature.h index c8f60934f..b0f9207cc 100644 --- a/ra/fsp/src/bsp/mcu/ra4m3/bsp_feature.h +++ b/ra/fsp/src/bsp/mcu/ra4m3/bsp_feature.h @@ -276,6 +276,7 @@ #define BSP_FEATURE_SCI_CLOCK (FSP_PRIV_CLOCK_PCLKA) #define BSP_FEATURE_SCI_UART_FIFO_CHANNELS (0x219U) #define BSP_FEATURE_SCI_UART_FIFO_DEPTH (16U) +#define BSP_FEATURE_SCI_UART_CSTPEN_CHANNELS (0x0219U) // Channel 0, channel 3, Channel 4, channel 9 have CSTPEN feature #define BSP_FEATURE_SDHI_HAS_CARD_DETECTION (1U) #define BSP_FEATURE_SDHI_SUPPORTS_8_BIT_MMC (1U) diff --git a/ra/fsp/src/bsp/mcu/ra4w1/bsp_feature.h b/ra/fsp/src/bsp/mcu/ra4w1/bsp_feature.h index 5a372b045..41c5f5b20 100644 --- a/ra/fsp/src/bsp/mcu/ra4w1/bsp_feature.h +++ b/ra/fsp/src/bsp/mcu/ra4w1/bsp_feature.h @@ -272,6 +272,7 @@ #define BSP_FEATURE_SCI_CLOCK (FSP_PRIV_CLOCK_PCLKA) #define BSP_FEATURE_SCI_UART_FIFO_CHANNELS (0x3U) #define BSP_FEATURE_SCI_UART_FIFO_DEPTH (16U) +#define BSP_FEATURE_SCI_UART_CSTPEN_CHANNELS (0x0U) #define BSP_FEATURE_SDHI_HAS_CARD_DETECTION (0) // Feature not available on this MCU #define BSP_FEATURE_SDHI_SUPPORTS_8_BIT_MMC (0) // Feature not available on this MCU diff --git a/ra/fsp/src/bsp/mcu/ra6e1/bsp_elc.h b/ra/fsp/src/bsp/mcu/ra6e1/bsp_elc.h new file mode 100644 index 000000000..4f1facb43 --- /dev/null +++ b/ra/fsp/src/bsp/mcu/ra6e1/bsp_elc.h @@ -0,0 +1,258 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +#ifndef BSP_ELC_H +#define BSP_ELC_H + +/*********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Exported global variables + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Exported global functions (to be accessed by other files) + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @addtogroup BSP_MCU_RA6E1 + * @{ + **********************************************************************************************************************/ + +/** Sources of event signals to be linked to other peripherals or the CPU + * @note This list may change based on based on the device. + * */ +typedef enum e_elc_event_ra6m1 +{ + ELC_EVENT_NONE = (0), // Link disabled + ELC_EVENT_ICU_IRQ0 = (0x001), // External pin interrupt 0 + ELC_EVENT_ICU_IRQ1 = (0x002), // External pin interrupt 1 + ELC_EVENT_ICU_IRQ2 = (0x003), // External pin interrupt 2 + ELC_EVENT_ICU_IRQ3 = (0x004), // External pin interrupt 3 + ELC_EVENT_ICU_IRQ4 = (0x005), // External pin interrupt 4 + ELC_EVENT_ICU_IRQ5 = (0x006), // External pin interrupt 5 + ELC_EVENT_ICU_IRQ6 = (0x007), // External pin interrupt 6 + ELC_EVENT_ICU_IRQ7 = (0x008), // External pin interrupt 7 + ELC_EVENT_ICU_IRQ8 = (0x009), // External pin interrupt 8 + ELC_EVENT_ICU_IRQ9 = (0x00A), // External pin interrupt 9 + ELC_EVENT_ICU_IRQ10 = (0x00B), // External pin interrupt 10 + ELC_EVENT_ICU_IRQ11 = (0x00C), // External pin interrupt 11 + ELC_EVENT_ICU_IRQ12 = (0x00D), // External pin interrupt 12 + ELC_EVENT_ICU_IRQ13 = (0x00E), // External pin interrupt 13 + ELC_EVENT_ICU_IRQ14 = (0x00F), // External pin interrupt 14 + ELC_EVENT_ICU_IRQ15 = (0x010), // External pin interrupt 15 + ELC_EVENT_DMAC0_INT = (0x020), // DMAC transfer end 0 + ELC_EVENT_DMAC1_INT = (0x021), // DMAC transfer end 1 + ELC_EVENT_DMAC2_INT = (0x022), // DMAC transfer end 2 + ELC_EVENT_DMAC3_INT = (0x023), // DMAC transfer end 3 + ELC_EVENT_DMAC4_INT = (0x024), // DMAC transfer end 4 + ELC_EVENT_DMAC5_INT = (0x025), // DMAC transfer end 5 + ELC_EVENT_DMAC6_INT = (0x026), // DMAC transfer end 6 + ELC_EVENT_DMAC7_INT = (0x027), // DMAC transfer end 7 + ELC_EVENT_DTC_COMPLETE = (0x029), // DTC transfer complete + ELC_EVENT_DTC_END = (0x02A), // DTC transfer end + ELC_EVENT_DMA_TRANSERR = (0x02B), // DTC transfer error + ELC_EVENT_ICU_SNOOZE_CANCEL = (0x02D), // Canceling from Snooze mode + ELC_EVENT_FCU_FIFERR = (0x030), // Flash access error interrupt + ELC_EVENT_FCU_FRDYI = (0x031), // Flash ready interrupt + ELC_EVENT_LVD_LVD1 = (0x038), // Voltage monitor 1 interrupt + ELC_EVENT_LVD_LVD2 = (0x039), // Voltage monitor 2 interrupt + ELC_EVENT_CGC_MOSC_STOP = (0x03B), // Main Clock oscillation stop + ELC_EVENT_LPM_SNOOZE_REQUEST = (0x03C), // Snooze entry + ELC_EVENT_AGT0_INT = (0x040), // AGT interrupt + ELC_EVENT_AGT0_COMPARE_A = (0x041), // Compare match A + ELC_EVENT_AGT0_COMPARE_B = (0x042), // Compare match B + ELC_EVENT_AGT1_INT = (0x043), // AGT interrupt + ELC_EVENT_AGT1_COMPARE_A = (0x044), // Compare match A + ELC_EVENT_AGT1_COMPARE_B = (0x045), // Compare match B + ELC_EVENT_AGT2_INT = (0x046), // AGT interrupt + ELC_EVENT_AGT2_COMPARE_A = (0x047), // Compare match A + ELC_EVENT_AGT2_COMPARE_B = (0x048), // Compare match B + ELC_EVENT_AGT3_INT = (0x049), // AGT interrupt + ELC_EVENT_AGT3_COMPARE_A = (0x04A), // Compare match A + ELC_EVENT_AGT3_COMPARE_B = (0x04B), // Compare match B + ELC_EVENT_AGT4_INT = (0x04C), // AGT interrupt + ELC_EVENT_AGT4_COMPARE_A = (0x04D), // Compare match A + ELC_EVENT_AGT4_COMPARE_B = (0x04E), // Compare match B + ELC_EVENT_AGT5_INT = (0x04F), // AGT interrupt + ELC_EVENT_AGT5_COMPARE_A = (0x050), // Compare match A + ELC_EVENT_AGT5_COMPARE_B = (0x051), // Compare match B + ELC_EVENT_IWDT_UNDERFLOW = (0x052), // IWDT underflow + ELC_EVENT_WDT_UNDERFLOW = (0x053), // WDT underflow + ELC_EVENT_RTC_ALARM = (0x054), // Alarm interrupt + ELC_EVENT_RTC_PERIOD = (0x055), // Periodic interrupt + ELC_EVENT_RTC_CARRY = (0x056), // Carry interrupt + ELC_EVENT_USBFS_FIFO_0 = (0x06B), // DMA transfer request 0 + ELC_EVENT_USBFS_FIFO_1 = (0x06C), // DMA transfer request 1 + ELC_EVENT_USBFS_INT = (0x06D), // USBFS interrupt + ELC_EVENT_USBFS_RESUME = (0x06E), // USBFS resume interrupt + ELC_EVENT_IIC0_RXI = (0x073), // Receive data full + ELC_EVENT_IIC0_TXI = (0x074), // Transmit data empty + ELC_EVENT_IIC0_TEI = (0x075), // Transmit end + ELC_EVENT_IIC0_ERI = (0x076), // Transfer error + ELC_EVENT_IIC0_WUI = (0x077), // Slave address match + ELC_EVENT_IIC1_RXI = (0x078), // Receive data full + ELC_EVENT_IIC1_TXI = (0x079), // Transmit data empty + ELC_EVENT_IIC1_TEI = (0x07A), // Transmit end + ELC_EVENT_IIC1_ERI = (0x07B), // Transfer error + ELC_EVENT_SDHIMMC0_ACCS = (0x082), // Card access + ELC_EVENT_SDHIMMC0_SDIO = (0x083), // SDIO access + ELC_EVENT_SDHIMMC0_CARD = (0x084), // Card detect + ELC_EVENT_SDHIMMC0_DMA_REQ = (0x085), // DMA transfer request + ELC_EVENT_SSI0_TXI = (0x08A), // Transmit data empty + ELC_EVENT_SSI0_RXI = (0x08B), // Receive data full + ELC_EVENT_SSI0_INT = (0x08D), // Error interrupt + ELC_EVENT_CAC_FREQUENCY_ERROR = (0x09E), // Frequency error interrupt + ELC_EVENT_CAC_MEASUREMENT_END = (0x09F), // Measurement end interrupt + ELC_EVENT_CAC_OVERFLOW = (0x0A0), // Overflow interrupt + ELC_EVENT_CAN0_ERROR = (0x0A1), // Error interrupt + ELC_EVENT_CAN0_FIFO_RX = (0x0A2), // Receive FIFO interrupt + ELC_EVENT_CAN0_FIFO_TX = (0x0A3), // Transmit FIFO interrupt + ELC_EVENT_CAN0_MAILBOX_RX = (0x0A4), // Reception complete interrupt + ELC_EVENT_CAN0_MAILBOX_TX = (0x0A5), // Transmission complete interrupt + ELC_EVENT_IOPORT_EVENT_1 = (0x0B1), // Port 1 event + ELC_EVENT_IOPORT_EVENT_2 = (0x0B2), // Port 2 event + ELC_EVENT_IOPORT_EVENT_3 = (0x0B3), // Port 3 event + ELC_EVENT_IOPORT_EVENT_4 = (0x0B4), // Port 4 event + ELC_EVENT_ELC_SOFTWARE_EVENT_0 = (0x0B5), // Software event 0 + ELC_EVENT_ELC_SOFTWARE_EVENT_1 = (0x0B6), // Software event 1 + ELC_EVENT_POEG0_EVENT = (0x0B7), // Port Output disable interrupt A + ELC_EVENT_POEG1_EVENT = (0x0B8), // Port Output disable interrupt B + ELC_EVENT_POEG2_EVENT = (0x0B9), // Port Output disable interrupt C + ELC_EVENT_POEG3_EVENT = (0x0BA), // Port Output disable interrupt D + ELC_EVENT_GPT1_CAPTURE_COMPARE_A = (0x0C9), // Compare match A + ELC_EVENT_GPT1_CAPTURE_COMPARE_B = (0x0CA), // Compare match B + ELC_EVENT_GPT1_COMPARE_C = (0x0CB), // Compare match C + ELC_EVENT_GPT1_COMPARE_D = (0x0CC), // Compare match D + ELC_EVENT_GPT1_COMPARE_E = (0x0CD), // Compare match E + ELC_EVENT_GPT1_COMPARE_F = (0x0CE), // Compare match F + ELC_EVENT_GPT1_COUNTER_OVERFLOW = (0x0CF), // Overflow + ELC_EVENT_GPT1_COUNTER_UNDERFLOW = (0x0D0), // Underflow + ELC_EVENT_GPT1_PC = (0x0D1), // Period count function finish + ELC_EVENT_GPT2_CAPTURE_COMPARE_A = (0x0D2), // Compare match A + ELC_EVENT_GPT2_CAPTURE_COMPARE_B = (0x0D3), // Compare match B + ELC_EVENT_GPT2_COMPARE_C = (0x0D4), // Compare match C + ELC_EVENT_GPT2_COMPARE_D = (0x0D5), // Compare match D + ELC_EVENT_GPT2_COMPARE_E = (0x0D6), // Compare match E + ELC_EVENT_GPT2_COMPARE_F = (0x0D7), // Compare match F + ELC_EVENT_GPT2_COUNTER_OVERFLOW = (0x0D8), // Overflow + ELC_EVENT_GPT2_COUNTER_UNDERFLOW = (0x0D9), // Underflow + ELC_EVENT_GPT4_CAPTURE_COMPARE_A = (0x0E4), // Compare match A + ELC_EVENT_GPT4_CAPTURE_COMPARE_B = (0x0E5), // Compare match B + ELC_EVENT_GPT4_COMPARE_C = (0x0E6), // Compare match C + ELC_EVENT_GPT4_COMPARE_D = (0x0E7), // Compare match D + ELC_EVENT_GPT4_COMPARE_E = (0x0E8), // Compare match E + ELC_EVENT_GPT4_COMPARE_F = (0x0E9), // Compare match F + ELC_EVENT_GPT4_COUNTER_OVERFLOW = (0x0EA), // Overflow + ELC_EVENT_GPT4_COUNTER_UNDERFLOW = (0x0EB), // Underflow + ELC_EVENT_GPT4_PC = (0x0EC), // Period count function finish + ELC_EVENT_GPT5_CAPTURE_COMPARE_A = (0x0ED), // Compare match A + ELC_EVENT_GPT5_CAPTURE_COMPARE_B = (0x0EE), // Compare match B + ELC_EVENT_GPT5_COMPARE_C = (0x0EF), // Compare match C + ELC_EVENT_GPT5_COMPARE_D = (0x0F0), // Compare match D + ELC_EVENT_GPT5_COMPARE_E = (0x0F1), // Compare match E + ELC_EVENT_GPT5_COMPARE_F = (0x0F2), // Compare match F + ELC_EVENT_GPT5_COUNTER_OVERFLOW = (0x0F3), // Overflow + ELC_EVENT_GPT5_COUNTER_UNDERFLOW = (0x0F4), // Underflow + ELC_EVENT_GPT5_PC = (0x0F5), // Period count function finish + ELC_EVENT_GPT6_CAPTURE_COMPARE_A = (0x0F6), // Compare match A + ELC_EVENT_GPT6_CAPTURE_COMPARE_B = (0x0F7), // Compare match B + ELC_EVENT_GPT6_COMPARE_C = (0x0F8), // Compare match C + ELC_EVENT_GPT6_COMPARE_D = (0x0F9), // Compare match D + ELC_EVENT_GPT6_COMPARE_E = (0x0FA), // Compare match E + ELC_EVENT_GPT6_COMPARE_F = (0x0FB), // Compare match F + ELC_EVENT_GPT6_COUNTER_OVERFLOW = (0x0FC), // Overflow + ELC_EVENT_GPT6_COUNTER_UNDERFLOW = (0x0FD), // Underflow + ELC_EVENT_GPT6_PC = (0x0FE), // Period count function finish + ELC_EVENT_GPT7_CAPTURE_COMPARE_A = (0x0FF), // Compare match A + ELC_EVENT_GPT7_CAPTURE_COMPARE_B = (0x100), // Compare match B + ELC_EVENT_GPT7_COMPARE_C = (0x101), // Compare match C + ELC_EVENT_GPT7_COMPARE_D = (0x102), // Compare match D + ELC_EVENT_GPT7_COMPARE_E = (0x103), // Compare match E + ELC_EVENT_GPT7_COMPARE_F = (0x104), // Compare match F + ELC_EVENT_GPT7_COUNTER_OVERFLOW = (0x105), // Overflow + ELC_EVENT_GPT7_COUNTER_UNDERFLOW = (0x106), // Underflow + ELC_EVENT_ADC0_SCAN_END = (0x160), // A/D scan end interrupt + ELC_EVENT_ADC0_SCAN_END_B = (0x161), // A/D scan end interrupt for group B + ELC_EVENT_ADC0_WINDOW_A = (0x162), // Window A Compare match + ELC_EVENT_ADC0_WINDOW_B = (0x163), // Window B Compare match + ELC_EVENT_ADC0_COMPARE_MATCH = (0x164), // Compare match + ELC_EVENT_ADC0_COMPARE_MISMATCH = (0x165), // Compare mismatch + ELC_EVENT_EDMAC0_EINT = (0x16F), // EDMAC 0 interrupt + ELC_EVENT_SCI0_RXI = (0x180), // Receive data full + ELC_EVENT_SCI0_TXI = (0x181), // Transmit data empty + ELC_EVENT_SCI0_TEI = (0x182), // Transmit end + ELC_EVENT_SCI0_ERI = (0x183), // Receive error + ELC_EVENT_SCI0_AM = (0x184), // Address match event + ELC_EVENT_SCI0_RXI_OR_ERI = (0x185), // Receive data full/Receive + ELC_EVENT_SCI1_RXI = (0x186), // Received data full + ELC_EVENT_SCI1_TXI = (0x187), // Transmit data empty + ELC_EVENT_SCI1_TEI = (0x188), // Transmit end + ELC_EVENT_SCI1_ERI = (0x189), // Receive error + ELC_EVENT_SCI2_RXI = (0x18C), // Received data full + ELC_EVENT_SCI2_TXI = (0x18D), // Transmit data empty + ELC_EVENT_SCI2_TEI = (0x18E), // Transmit end + ELC_EVENT_SCI2_ERI = (0x18F), // Receive error + ELC_EVENT_SCI3_RXI = (0x192), // Received data full + ELC_EVENT_SCI3_TXI = (0x193), // Transmit data empty + ELC_EVENT_SCI3_TEI = (0x194), // Transmit end + ELC_EVENT_SCI3_ERI = (0x195), // Receive error + ELC_EVENT_SCI3_AM = (0x196), // Address match event + ELC_EVENT_SCI4_RXI = (0x198), // Received data full + ELC_EVENT_SCI4_TXI = (0x199), // Transmit data empty + ELC_EVENT_SCI4_TEI = (0x19A), // Transmit end + ELC_EVENT_SCI4_ERI = (0x19B), // Receive error + ELC_EVENT_SCI4_AM = (0x19C), // Address match event + ELC_EVENT_SCI9_RXI = (0x1B6), // Received data full + ELC_EVENT_SCI9_TXI = (0x1B7), // Transmit data empty + ELC_EVENT_SCI9_TEI = (0x1B8), // Transmit end + ELC_EVENT_SCI9_ERI = (0x1B9), // Receive error + ELC_EVENT_SCI9_AM = (0x1BA), // Address match event + ELC_EVENT_SCIX0_SCIX0 = (0x1BC), // SCI0 extended serial mode event 0 + ELC_EVENT_SCIX0_SCIX1 = (0x1BD), // SCI0 extended serial mode event 1 + ELC_EVENT_SCIX0_SCIX2 = (0x1BE), // SCI0 extended serial mode event 2 + ELC_EVENT_SCIX0_SCIX3 = (0x1BF), // SCI0 extended serial mode event 3 + ELC_EVENT_SCIX1_SCIX0 = (0x1C0), // SCI1 extended serial mode event 0 + ELC_EVENT_SCIX1_SCIX1 = (0x1C1), // SCI1 extended serial mode event 1 + ELC_EVENT_SCIX1_SCIX2 = (0x1C2), // SCI1 extended serial mode event 2 + ELC_EVENT_SCIX1_SCIX3 = (0x1C3), // SCI1 extended serial mode event 3 + ELC_EVENT_SPI0_RXI = (0x1C4), // Receive buffer full + ELC_EVENT_SPI0_TXI = (0x1C5), // Transmit buffer empty + ELC_EVENT_SPI0_IDLE = (0x1C6), // Idle + ELC_EVENT_SPI0_ERI = (0x1C7), // Error + ELC_EVENT_SPI0_TEI = (0x1C8), // Transmission complete event + ELC_EVENT_SPI1_RXI = (0x1C9), // Receive buffer full + ELC_EVENT_SPI1_TXI = (0x1CA), // Transmit buffer empty + ELC_EVENT_SPI1_IDLE = (0x1CB), // Idle + ELC_EVENT_SPI1_ERI = (0x1CC), // Error + ELC_EVENT_SPI1_TEI = (0x1CD), // Transmission complete event + ELC_EVENT_QSPI_INT = (0x1DA), // QSPI interrupt + ELC_EVENT_DOC_INT = (0x1DB), // Data operation circuit interrupt +} elc_event_t; + +/** @} (end addtogroup BSP_MCU_RA6M1) */ + +#endif diff --git a/ra/fsp/src/bsp/mcu/ra6e1/bsp_feature.h b/ra/fsp/src/bsp/mcu/ra6e1/bsp_feature.h new file mode 100644 index 000000000..6f704bafd --- /dev/null +++ b/ra/fsp/src/bsp/mcu/ra6e1/bsp_feature.h @@ -0,0 +1,308 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +#ifndef BSP_FEATURE_H +#define BSP_FEATURE_H + +/*********************************************************************************************************************** + * Includes , "Project Includes" + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ + +/** The main oscillator drive value is based upon the oscillator frequency selected in the configuration */ +#if (BSP_CFG_XTAL_HZ > (19999999)) + #define CGC_MAINCLOCK_DRIVE (0x00U) +#elif (BSP_CFG_XTAL_HZ > (15999999)) && (BSP_CFG_XTAL_HZ < (20000000)) + #define CGC_MAINCLOCK_DRIVE (0x01U) +#elif (BSP_CFG_XTAL_HZ > (7999999)) && (BSP_CFG_XTAL_HZ < (16000000)) + #define CGC_MAINCLOCK_DRIVE (0x02U) +#else + #define CGC_MAINCLOCK_DRIVE (0x03U) +#endif + +/*********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Exported global variables (to be accessed by other files) + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Private global variables and functions + **********************************************************************************************************************/ + +#define BSP_FEATURE_ACMPHS_MIN_WAIT_TIME_US (0) // Feature not available on this MCU +#define BSP_FEATURE_ACMPHS_VREF (0) // Feature not available on this MCU + +#define BSP_FEATURE_ACMPLP_HAS_COMPSEL_REGISTERS (0) // Feature not available on this MCU +#define BSP_FEATURE_ACMPLP_MIN_WAIT_TIME_US (0) // Feature not available on this MCU + +#define BSP_FEATURE_ADC_ADDITION_SUPPORTED (1U) +#define BSP_FEATURE_ADC_CALIBRATION_REG_AVAILABLE (0U) +#define BSP_FEATURE_ADC_CLOCK_SOURCE (FSP_PRIV_CLOCK_PCLKC) +#define BSP_FEATURE_ADC_GROUP_B_SENSORS_ALLOWED (1U) +#define BSP_FEATURE_ADC_HAS_ADCER_ADPRC (1U) +#define BSP_FEATURE_ADC_HAS_ADCER_ADRFMT (1U) +#define BSP_FEATURE_ADC_HAS_ADHVREFCNT (0U) +#define BSP_FEATURE_BSP_HAS_CLOCK_SUPPLY_TYPEB (0U) +#define BSP_FEATURE_ADC_HAS_PGA (0U) +#define BSP_FEATURE_ADC_HAS_SAMPLE_HOLD_REG (0U) +#define BSP_FEATURE_ADC_HAS_VREFAMPCNT (0U) +#define BSP_FEATURE_ADC_MAX_RESOLUTION_BITS (12U) +#define BSP_FEATURE_ADC_SENSORS_EXCLUSIVE (0U) +#define BSP_FEATURE_ADC_SENSOR_MIN_SAMPLING_TIME (4150U) +#define BSP_FEATURE_ADC_TSN_CALIBRATION32_AVAILABLE (0) // Feature not available on this MCU +#define BSP_FEATURE_ADC_TSN_CALIBRATION32_MASK (0) // Feature not available on this MCU +#define BSP_FEATURE_ADC_TSN_CALIBRATION_AVAILABLE (0) // Feature not available on this MCU +#define BSP_FEATURE_ADC_TSN_CONTROL_AVAILABLE (0) // Feature not available on this MCU +#define BSP_FEATURE_ADC_TSN_SLOPE (0) // Feature not available on this MCU +#define BSP_FEATURE_ADC_UNIT_0_CHANNELS (0x31FF) // 0 to 8, 12, 13 +#define BSP_FEATURE_ADC_UNIT_1_CHANNELS (0) // Feature not available on this MCU +#define BSP_FEATURE_ADC_VALID_UNIT_MASK (1U) +#define BSP_FEATURE_ADC_HAS_ADBUF (1U) + +#define BSP_FEATURE_AGT_VALID_CHANNEL_MASK (0x3F) +#define BSP_FEATURE_AGT_MAX_CHANNEL_NUM (5) + +#define BSP_FEATURE_BSP_FLASH_CACHE (1) +#define BSP_FEATURE_BSP_FLASH_CACHE_DISABLE_OPM (0U) +#define BSP_FEATURE_BSP_FLASH_PREFETCH_BUFFER (0) +#define BSP_FEATURE_BSP_HAS_OCTASPI_CLOCK (0) +#define BSP_FEATURE_BSP_HAS_CANFD_CLOCK (0) +#define BSP_FEATURE_BSP_HAS_CODE_SYSTEM_CACHE (1) +#define BSP_FEATURE_BSP_HAS_SCE5 (0) // Feature not available on this MCU +#define BSP_FEATURE_BSP_HAS_SCE_ON_RA2 (0) // Feature not available on this MCU +#define BSP_FEATURE_BSP_HAS_SECURITY_MPU (0U) +#define BSP_FEATURE_BSP_HAS_SP_MON (0U) +#define BSP_FEATURE_BSP_HAS_USBCKDIVCR (1U) +#define BSP_FEATURE_BSP_HAS_USB_CLOCK_DIV (1U) +#define BSP_FEATURE_BSP_HAS_USB_CLOCK_REQ (1U) +#define BSP_FEATURE_BSP_HAS_USB_CLOCK_SEL (1U) +#define BSP_FEATURE_BSP_HAS_USB_CLOCK_SEL_ALT (0U) +#define BSP_FEATURE_BSP_MCU_INFO_POINTER_LOCATION (0U) +#define BSP_FEATURE_BSP_MPU_REGION0_MASK (0U) // Feature not available on this MCU +#define BSP_FEATURE_BSP_MSTP_GPT_MSTPD5_MAX_CH (0U) // If MSTPCRE is present then the setting is not valid. +#define BSP_FEATURE_BSP_MSTP_HAS_MSTPCRE (1U) +#define BSP_FEATURE_BSP_OFS1_HOCOFRQ_MASK (0xFFFFF9FFU) +#define BSP_FEATURE_BSP_OFS1_HOCOFRQ_OFFSET (9U) +#define BSP_FEATURE_BSP_OSIS_PADDING (0U) +#define BSP_FEATURE_BSP_POWER_CHANGE_MSTP_REQUIRED (0U) +#define BSP_FEATURE_BSP_HAS_DCDC_REGULATOR (0U) +#define BSP_FEATURE_BSP_RESET_TRNG (0U) +#define BSP_FEATURE_BSP_SYS_CLOCK_FREQ_NO_RAM_WAITS (100000000U) // The maximum frequency allowed without having RAM wait state enabled in SRAMWTSC. +#define BSP_FEATURE_BSP_SYS_CLOCK_FREQ_ONE_ROM_WAITS (50000000U) // The maximum frequency allowed without having one ROM wait cycle. +#define BSP_FEATURE_BSP_SYS_CLOCK_FREQ_THREE_ROM_WAITS (150000000U) // The maximum frequency allowed without having three ROM wait cycles (Set to zero if this is not an option). +#define BSP_FEATURE_BSP_SYS_CLOCK_FREQ_TWO_ROM_WAITS (100000000U) // The maximum frequency allowed without having two ROM wait cycles. +#define BSP_FEATURE_BSP_UNIQUE_ID_OFFSET (0U) +#define BSP_FEATURE_BSP_UNIQUE_ID_POINTER (0x01008190U) +#define BSP_FEATURE_BSP_VBATT_HAS_VBTCR1_BPWSWSTP (0U) + +#define BSP_FEATURE_CAN_CHECK_PCLKB_RATIO (0U) +#define BSP_FEATURE_CAN_CLOCK (0U) +#define BSP_FEATURE_CAN_MCLOCK_ONLY (0U) +#define BSP_FEATURE_CAN_NUM_CHANNELS (1U) + +#define BSP_FEATURE_CANFD_NUM_CHANNELS (0U) // Feature not available on this MCU + +#define BSP_FEATURE_CGC_HAS_BCLK (0U) +#define BSP_FEATURE_CGC_HAS_FCLK (1U) +#define BSP_FEATURE_CGC_HAS_FLDWAITR (0U) +#define BSP_FEATURE_CGC_HAS_FLWT (1U) +#define BSP_FEATURE_CGC_HAS_FLL (1U) +#define BSP_FEATURE_CGC_HAS_HOCOWTCR (0U) +#define BSP_FEATURE_CGC_HAS_MEMWAIT (0U) +#define BSP_FEATURE_CGC_HAS_PCLKA (1U) +#define BSP_FEATURE_CGC_HAS_PCLKB (1U) +#define BSP_FEATURE_CGC_HAS_PCLKC (1U) +#define BSP_FEATURE_CGC_HAS_PCLKD (1U) +#define BSP_FEATURE_CGC_HAS_PLL (1U) +#define BSP_FEATURE_CGC_HAS_PLL2 (1U) // This MCU has a second PLL that can be used as a clock source for certain peripherals. +#define BSP_FEATURE_CGC_HAS_SRAMPRCR2 (1U) // This MCU has another register to enable write access for SRAMWTSC. +#define BSP_FEATURE_CGC_HAS_SRAMWTSC (1U) +#define BSP_FEATURE_CGC_HOCOSF_BEFORE_OPCCR (0U) +#define BSP_FEATURE_CGC_HOCOWTCR_64MHZ_ONLY (0U) +#define BSP_FEATURE_CGC_ICLK_DIV_RESET (BSP_CLOCKS_SYS_CLOCK_DIV_4) +#define BSP_FEATURE_CGC_LOCO_STABILIZATION_MAX_US (61U) +#define BSP_FEATURE_CGC_LOW_SPEED_MAX_FREQ_HZ (1000000U) // This MCU does have Low Speed Mode, up to 1MHz +#define BSP_FEATURE_CGC_LOW_VOLTAGE_MAX_FREQ_HZ (0U) // This MCU does not have Low Voltage Mode +#define BSP_FEATURE_CGC_MIDDLE_SPEED_MAX_FREQ_HZ (0U) // This MCU does not have Middle Speed Mode +#define BSP_FEATURE_CGC_MOCO_STABILIZATION_MAX_US (15U) +#define BSP_FEATURE_CGC_MODRV_MASK (0x30U) +#define BSP_FEATURE_CGC_MODRV_SHIFT (0x4U) +#define BSP_FEATURE_CGC_PLLCCR_TYPE (1U) +#define BSP_FEATURE_CGC_PLLCCR_WAIT_US (0U) // No wait between setting PLLCCR and clearing PLLSTP +#define BSP_FEATURE_CGC_PLLCCR_MAX_HZ (200000000U) +#define BSP_FEATURE_CGC_SCKDIVCR_BCLK_MATCHES_PCLKB (1) +#define BSP_FEATURE_CGC_SODRV_MASK (0x02U) +#define BSP_FEATURE_CGC_SODRV_SHIFT (0x01U) +#define BSP_FEATURE_CGC_STARTUP_OPCCR_MODE (0) + +#define BSP_FEATURE_CRYPTO_HAS_AES (0) +#define BSP_FEATURE_CRYPTO_HAS_AES_WRAPPED (0) +#define BSP_FEATURE_CRYPTO_HAS_ECC (0) +#define BSP_FEATURE_CRYPTO_HAS_ECC_WRAPPED (0) +#define BSP_FEATURE_CRYPTO_HAS_HASH (0) +#define BSP_FEATURE_CRYPTO_HAS_RSA (0) +#define BSP_FEATURE_CRYPTO_HAS_RSA_WRAPPED (0) +#define BSP_FEATURE_CRYPTO_HAS_CTR_DRBG (1) +#define BSP_FEATURE_CRYPTO_HAS_SCE9 (1) + +#define BSP_FEATURE_CTSU_CTSUCHAC_REGISTER_COUNT (0) // Feature not available on this MCU +#define BSP_FEATURE_CTSU_CTSUCHTRC_REGISTER_COUNT (0) // Feature not available on this MCU +#define BSP_FEATURE_CTSU_HAS_TXVSEL (0) // Feature not available on this MCU +#define BSP_FEATURE_CTSU_VERSION (0) // Feature not available on this MCU + +#define BSP_FEATURE_DAC8_HAS_CHARGEPUMP (0) // Feature not available on this MCU +#define BSP_FEATURE_DAC8_HAS_DA_AD_SYNCHRONIZE (0) // Feature not available on this MCU +#define BSP_FEATURE_DAC8_HAS_REALTIME_MODE (0) // Feature not available on this MCU +#define BSP_FEATURE_DAC8_MAX_CHANNELS (0) // Feature not available on this MCU + +#define BSP_FEATURE_DAC_HAS_CHARGEPUMP (0U) +#define BSP_FEATURE_DAC_HAS_DAVREFCR (0U) +#define BSP_FEATURE_DAC_HAS_OUTPUT_AMPLIFIER (1U) +#define BSP_FEATURE_DAC_MAX_CHANNELS (1U) + +#define BSP_FEATURE_DMAC_MAX_CHANNEL (8U) +#define BSP_FEATURE_DMAC_HAS_REPEAT_BLOCK_MODE (1U) + +#define BSP_FEATURE_DWT_CYCCNT (1U) // This MCU has Data Watchpoint Cycle Count Register + +#define BSP_FEATURE_ELC_PERIPHERAL_MASK (0x0003D3FFU) // Positions of event link set registers (ELSRs) available on this MCU + +#define BSP_FEATURE_ETHER_FIFO_DEPTH (0x0000070FU) +#define BSP_FEATURE_ETHER_MAX_CHANNELS (1U) + +#define BSP_FEATURE_FLASH_DATA_FLASH_START (0x08000000U) +#define BSP_FEATURE_FLASH_HP_CF_REGION0_BLOCK_SIZE (0x2000U) +#define BSP_FEATURE_FLASH_HP_CF_REGION0_SIZE (0x10000U) +#define BSP_FEATURE_FLASH_HP_CF_REGION1_BLOCK_SIZE (0x8000U) +#define BSP_FEATURE_FLASH_HP_CF_WRITE_SIZE (128U) +#define BSP_FEATURE_FLASH_HP_DF_BLOCK_SIZE (64U) +#define BSP_FEATURE_FLASH_HP_DF_WRITE_SIZE (4U) +#define BSP_FEATURE_FLASH_HP_HAS_FMEPROT (1) +#define BSP_FEATURE_FLASH_HP_SUPPORTS_DUAL_BANK (1) +#define BSP_FEATURE_FLASH_HP_VERSION (40U) +#define BSP_FEATURE_FLASH_LP_AWS_FAW_MASK (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_LP_AWS_FAW_SHIFT (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_LP_CF_BLOCK_SIZE (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_LP_CF_WRITE_SIZE (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_LP_DF_BLOCK_SIZE (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_LP_DF_WRITE_SIZE (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_LP_FLASH_CLOCK_SRC (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_LP_VERSION (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_SUPPORTS_ACCESS_WINDOW (0) // Feature not available on this MCU +#define BSP_FEATURE_FLASH_SUPPORTS_ID_CODE (0) // Feature not available on this MCU + +#define BSP_FEATURE_GPTEH_CHANNEL_MASK (0) + +#define BSP_FEATURE_GPTE_CHANNEL_MASK (0) + +#define BSP_FEATURE_GPT_32BIT_CHANNEL_MASK (0x06U) +#define BSP_FEATURE_GPT_VALID_CHANNEL_MASK (0x0F6U) + +#define BSP_FEATURE_ICU_HAS_WUPEN1 (1U) +#define BSP_FEATURE_ICU_IRQ_CHANNELS_MASK (0xFFFFU) +#define BSP_FEATURE_ICU_WUPEN_MASK (0x7FB0DFFFFULL) // Note there is another WUPEN1 register +#define BSP_FEATURE_ICU_HAS_INTERRUPT_GROUPS (0U) + +#define BSP_FEATURE_IIC_FAST_MODE_PLUS (1U << 0U) +#define BSP_FEATURE_IIC_VALID_CHANNEL_MASK (0x03) + +#define BSP_FEATURE_IOPORT_ELC_PORTS (4) +#define BSP_FEATURE_IOPORT_HAS_ETHERNET (1U) + +#define BSP_FEATURE_LPM_CHANGE_MSTP_ARRAY (0U) +#define BSP_FEATURE_LPM_CHANGE_MSTP_REQUIRED (0U) +#define BSP_FEATURE_LPM_DPSIEGR_MASK (0x13DFF3U) +#define BSP_FEATURE_LPM_DPSIER_MASK (0x0D1FDFF3U) +#define BSP_FEATURE_LPM_HAS_DEEP_STANDBY (1U) +#define BSP_FEATURE_LPM_HAS_SBYCR_OPE (0U) +#define BSP_FEATURE_LPM_HAS_SNZEDCR1 (1U) +#define BSP_FEATURE_LPM_HAS_SNZREQCR1 (1U) +#define BSP_FEATURE_LPM_HAS_STCONR (0U) +#define BSP_FEATURE_LPM_SBYCR_WRITE1_B14 (0) +#define BSP_FEATURE_LPM_SNZEDCR_MASK (0x0000019FU) // note there is another SNZEDCR1 register +#define BSP_FEATURE_LPM_SNZREQCR_MASK (0x77300FFFFULL) // note tehre is another SNZEREQCR1 register + +#define BSP_FEATURE_LVD_HAS_DIGITAL_FILTER (1U) +#define BSP_FEATURE_LVD_HAS_LVDLVLR (0U) +#define BSP_FEATURE_LVD_MONITOR_1_HI_THRESHOLD (LVD_THRESHOLD_MONITOR_1_LEVEL_2_99V) // 2.99V +#define BSP_FEATURE_LVD_MONITOR_1_LOW_THRESHOLD (LVD_THRESHOLD_MONITOR_1_LEVEL_2_85V) // 2.85V +#define BSP_FEATURE_LVD_MONITOR_2_HI_THRESHOLD (LVD_THRESHOLD_MONITOR_2_LEVEL_2_99V) // 2.99V +#define BSP_FEATURE_LVD_MONITOR_2_LOW_THRESHOLD (LVD_THRESHOLD_MONITOR_2_LEVEL_2_85V) // 2.85V +#define BSP_FEATURE_LVD_STABILIZATION_TIME_US (10U) // Time in microseconds required for LVD to stabalize + +#define BSP_FEATURE_OPAMP_BASE_ADDRESS (0U) +#define BSP_FEATURE_OPAMP_HAS_MIDDLE_SPEED (0) // Feature not available on this MCU +#define BSP_FEATURE_OPAMP_HAS_SWITCHES (0U) +#define BSP_FEATURE_OPAMP_HAS_THIRD_CHANNEL (0U) +#define BSP_FEATURE_OPAMP_MIN_WAIT_TIME_HS_US (0) // Feature not available on this MCU +#define BSP_FEATURE_OPAMP_MIN_WAIT_TIME_LP_US (0) // Feature not available on this MCU +#define BSP_FEATURE_OPAMP_MIN_WAIT_TIME_MS_US (0) // Feature not available on this MCU +#define BSP_FEATURE_OPAMP_TRIM_CAPABLE (0U) +#define BSP_FEATURE_OPAMP_VARIANT_CHANNEL_MASK (0U) + +#define BSP_FEATURE_OSPI_DEVICE_0_START_ADDRESS (0x68000000U) +#define BSP_FEATURE_OSPI_DEVICE_1_START_ADDRESS (0x70000000U) + +#define BSP_FEATURE_POEG_CHANNEL_MASK (0xFU) + +#define BSP_FEATURE_QSPI_DEVICE_START_ADDRESS (0x60000000U) + +#define BSP_FEATURE_SCI_ADDRESS_MATCH_CHANNELS (0x219U) +#define BSP_FEATURE_SCI_CHANNELS (0x21FU) +#define BSP_FEATURE_SCI_CLOCK (FSP_PRIV_CLOCK_PCLKA) +#define BSP_FEATURE_SCI_UART_FIFO_CHANNELS (0x219U) +#define BSP_FEATURE_SCI_UART_FIFO_DEPTH (16U) +#define BSP_FEATURE_SCI_UART_CSTPEN_CHANNELS (0x0219U) // Channel 0, channel 3, Channel 4, channel 9 have CSTPEN feature + +#define BSP_FEATURE_SDHI_HAS_CARD_DETECTION (1U) +#define BSP_FEATURE_SDHI_SUPPORTS_8_BIT_MMC (0U) +#define BSP_FEATURE_SDHI_VALID_CHANNEL_MASK (1U) +#define BSP_FEATURE_SDHI_CLOCK (FSP_PRIV_CLOCK_PCLKB) +#define BSP_FEATURE_SDHI_MIN_CLOCK_DIVISION_SHIFT (0U) // 1 (2^0) is minimum division supported + +#define BSP_FEATURE_SDRAM_START_ADDRESS (0x0U) // Feature not available on this MCU + +#define BSP_FEATURE_SLCDC_HAS_8_TIME_SLICE (0) // Feature not available on this MCU +#define BSP_FEATURE_SLCDC_HAS_INTERNAL_VOLT_GEN (0) // Feature not available on this MCU +#define BSP_FEATURE_SLCDC_MAX_NUM_SEG (0) // Feature not available on this MCU + +#define BSP_FEATURE_SPI_CLK (FSP_PRIV_CLOCK_PCLKA) +#define BSP_FEATURE_SPI_HAS_SPCR3 (1U) +#define BSP_FEATURE_SPI_HAS_SSL_LEVEL_KEEP (1U) +#define BSP_FEATURE_SPI_MAX_CHANNEL (2U) + +#define BSP_FEATURE_SRAM_SRAMWTSC_WAIT_CYCLE_ENABLE (0x01U) + +#define BSP_FEATURE_SSI_FIFO_NUM_STAGES (32U) +#define BSP_FEATURE_SSI_VALID_CHANNEL_MASK (1U) + +#define BSP_FEATURE_TRNG_HAS_MODULE_STOP (0U) + +#define BSP_FEATURE_TZ_HAS_TRUSTZONE (1U) + +#define BSP_FEATURE_BSP_NUM_PMSAR (8U) + +#endif diff --git a/ra/fsp/src/bsp/mcu/ra6e1/bsp_mcu_info.h b/ra/fsp/src/bsp/mcu/ra6e1/bsp_mcu_info.h new file mode 100644 index 000000000..1742ee6b9 --- /dev/null +++ b/ra/fsp/src/bsp/mcu/ra6e1/bsp_mcu_info.h @@ -0,0 +1,58 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @ingroup BSP_MCU + * @defgroup BSP_MCU_RA6E1 RA6E1 + * @includedoc config_bsp_ra6e1_fsp.html + * @{ + **********************************************************************************************************************/ + +/** @} (end defgroup BSP_MCU_RA6E1) */ + +#ifndef BSP_MCU_INFO_H +#define BSP_MCU_INFO_H + +/*********************************************************************************************************************** + * Includes , "Project Includes" + **********************************************************************************************************************/ + +/* BSP MCU Specific Includes. */ +#include "bsp_elc.h" +#include "bsp_feature.h" + +/*********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ +typedef elc_event_t bsp_interrupt_event_t; + +/*********************************************************************************************************************** + * Exported global variables + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Exported global functions (to be accessed by other files) + **********************************************************************************************************************/ + +#endif diff --git a/ra/fsp/src/bsp/mcu/ra6m1/bsp_feature.h b/ra/fsp/src/bsp/mcu/ra6m1/bsp_feature.h index 4c72d1ea1..1e51cceb1 100644 --- a/ra/fsp/src/bsp/mcu/ra6m1/bsp_feature.h +++ b/ra/fsp/src/bsp/mcu/ra6m1/bsp_feature.h @@ -276,6 +276,7 @@ #define BSP_FEATURE_SCI_CLOCK (FSP_PRIV_CLOCK_PCLKA) #define BSP_FEATURE_SCI_UART_FIFO_CHANNELS (0x31FU) #define BSP_FEATURE_SCI_UART_FIFO_DEPTH (16U) +#define BSP_FEATURE_SCI_UART_CSTPEN_CHANNELS (0x0U) #define BSP_FEATURE_SDHI_HAS_CARD_DETECTION (1U) #define BSP_FEATURE_SDHI_SUPPORTS_8_BIT_MMC (0U) diff --git a/ra/fsp/src/bsp/mcu/ra6m2/bsp_feature.h b/ra/fsp/src/bsp/mcu/ra6m2/bsp_feature.h index 70a99bcb6..c8fc00b61 100644 --- a/ra/fsp/src/bsp/mcu/ra6m2/bsp_feature.h +++ b/ra/fsp/src/bsp/mcu/ra6m2/bsp_feature.h @@ -276,6 +276,7 @@ #define BSP_FEATURE_SCI_CLOCK (FSP_PRIV_CLOCK_PCLKA) #define BSP_FEATURE_SCI_UART_FIFO_CHANNELS (0x3FFU) #define BSP_FEATURE_SCI_UART_FIFO_DEPTH (16U) +#define BSP_FEATURE_SCI_UART_CSTPEN_CHANNELS (0x0U) #define BSP_FEATURE_SDHI_HAS_CARD_DETECTION (1U) #define BSP_FEATURE_SDHI_SUPPORTS_8_BIT_MMC (1U) diff --git a/ra/fsp/src/bsp/mcu/ra6m3/bsp_feature.h b/ra/fsp/src/bsp/mcu/ra6m3/bsp_feature.h index 3fb02b247..19a136bf2 100644 --- a/ra/fsp/src/bsp/mcu/ra6m3/bsp_feature.h +++ b/ra/fsp/src/bsp/mcu/ra6m3/bsp_feature.h @@ -276,6 +276,7 @@ #define BSP_FEATURE_SCI_CLOCK (FSP_PRIV_CLOCK_PCLKA) #define BSP_FEATURE_SCI_UART_FIFO_CHANNELS (0x3FFU) #define BSP_FEATURE_SCI_UART_FIFO_DEPTH (16U) +#define BSP_FEATURE_SCI_UART_CSTPEN_CHANNELS (0x0U) #define BSP_FEATURE_SDHI_HAS_CARD_DETECTION (1U) #define BSP_FEATURE_SDHI_SUPPORTS_8_BIT_MMC (1U) diff --git a/ra/fsp/src/bsp/mcu/ra6m4/bsp_feature.h b/ra/fsp/src/bsp/mcu/ra6m4/bsp_feature.h index 26c48a598..983f5c8ce 100644 --- a/ra/fsp/src/bsp/mcu/ra6m4/bsp_feature.h +++ b/ra/fsp/src/bsp/mcu/ra6m4/bsp_feature.h @@ -276,6 +276,7 @@ #define BSP_FEATURE_SCI_CLOCK (FSP_PRIV_CLOCK_PCLKA) #define BSP_FEATURE_SCI_UART_FIFO_CHANNELS (0x3F9U) #define BSP_FEATURE_SCI_UART_FIFO_DEPTH (16U) +#define BSP_FEATURE_SCI_UART_CSTPEN_CHANNELS (0x03F9U) // Channel 0, channel 3 to channel 9 have CSTPEN feature #define BSP_FEATURE_SDHI_HAS_CARD_DETECTION (1U) #define BSP_FEATURE_SDHI_SUPPORTS_8_BIT_MMC (1U) diff --git a/ra/fsp/src/bsp/mcu/ra6m5/bsp_elc.h b/ra/fsp/src/bsp/mcu/ra6m5/bsp_elc.h index 57ee822a9..976c4d705 100644 --- a/ra/fsp/src/bsp/mcu/ra6m5/bsp_elc.h +++ b/ra/fsp/src/bsp/mcu/ra6m5/bsp_elc.h @@ -73,6 +73,7 @@ typedef enum e_elc_event_ra6m5 ELC_EVENT_DMAC6_INT = (0x026), // DMAC transfer end 6 ELC_EVENT_DMAC7_INT = (0x027), // DMAC transfer end 7 ELC_EVENT_DTC_COMPLETE = (0x029), // DTC transfer complete + ELC_EVENT_DTC_END = (0x02A), // DTC transfer end ELC_EVENT_DMA_TRANSERR = (0x02B), // DTC transfer error ELC_EVENT_ICU_SNOOZE_CANCEL = (0x02D), // Canceling from Snooze mode ELC_EVENT_FCU_FIFERR = (0x030), // Flash access error interrupt diff --git a/ra/fsp/src/bsp/mcu/ra6m5/bsp_feature.h b/ra/fsp/src/bsp/mcu/ra6m5/bsp_feature.h index 5262b9dfe..2f5fcd8fc 100644 --- a/ra/fsp/src/bsp/mcu/ra6m5/bsp_feature.h +++ b/ra/fsp/src/bsp/mcu/ra6m5/bsp_feature.h @@ -276,6 +276,7 @@ #define BSP_FEATURE_SCI_CLOCK (FSP_PRIV_CLOCK_PCLKA) #define BSP_FEATURE_SCI_UART_FIFO_CHANNELS (0x3F9U) #define BSP_FEATURE_SCI_UART_FIFO_DEPTH (16U) +#define BSP_FEATURE_SCI_UART_CSTPEN_CHANNELS (0x03F9U) // Channel 0, channel 3 to channel 9 have CSTPEN feature #define BSP_FEATURE_SDHI_HAS_CARD_DETECTION (1U) #define BSP_FEATURE_SDHI_SUPPORTS_8_BIT_MMC (1U) diff --git a/ra/fsp/src/bsp/mcu/ra6t1/bsp_feature.h b/ra/fsp/src/bsp/mcu/ra6t1/bsp_feature.h index 14b3cd346..de58d8ca0 100644 --- a/ra/fsp/src/bsp/mcu/ra6t1/bsp_feature.h +++ b/ra/fsp/src/bsp/mcu/ra6t1/bsp_feature.h @@ -275,6 +275,7 @@ #define BSP_FEATURE_SCI_CLOCK (FSP_PRIV_CLOCK_PCLKA) #define BSP_FEATURE_SCI_UART_FIFO_CHANNELS (0x31FU) #define BSP_FEATURE_SCI_UART_FIFO_DEPTH (16U) +#define BSP_FEATURE_SCI_UART_CSTPEN_CHANNELS (0x0U) #define BSP_FEATURE_SDHI_HAS_CARD_DETECTION (0) // Feature not available on this MCU #define BSP_FEATURE_SDHI_SUPPORTS_8_BIT_MMC (0) // Feature not available on this MCU diff --git a/ra/fsp/src/r_ctsu/r_ctsu.c b/ra/fsp/src/r_ctsu/r_ctsu.c index affda13a8..458918b4d 100644 --- a/ra/fsp/src/r_ctsu/r_ctsu.c +++ b/ra/fsp/src/r_ctsu/r_ctsu.c @@ -398,11 +398,14 @@ static ctsu_ctsuwr_t g_ctsu_ctsuwr[(CTSU_CFG_NUM_SELF_ELEMENTS + CTSU_CFG_NUM_MU #if (CTSU_CFG_NUM_SELF_ELEMENTS != 0) static uint16_t g_ctsu_self_element_index = 0; static ctsu_self_buf_t g_ctsu_self_raw[CTSU_CFG_NUM_SELF_ELEMENTS * CTSU_CFG_NUM_SUMULTI]; +static uint16_t g_ctsu_self_corr[CTSU_CFG_NUM_SELF_ELEMENTS * CTSU_CFG_NUM_SUMULTI]; static uint16_t g_ctsu_self_data[CTSU_CFG_NUM_SELF_ELEMENTS * CTSU_CFG_NUM_SUMULTI]; #endif #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) static uint16_t g_ctsu_mutual_element_index = 0; static ctsu_mutual_buf_t g_ctsu_mutual_raw[CTSU_CFG_NUM_MUTUAL_ELEMENTS * CTSU_MUTUAL_BUF_SIZE]; +static uint16_t g_ctsu_mutual_pri_corr[CTSU_CFG_NUM_MUTUAL_ELEMENTS * CTSU_CFG_NUM_SUMULTI]; +static uint16_t g_ctsu_mutual_snd_corr[CTSU_CFG_NUM_MUTUAL_ELEMENTS * CTSU_CFG_NUM_SUMULTI]; static uint16_t g_ctsu_mutual_pri_data[CTSU_CFG_NUM_MUTUAL_ELEMENTS * CTSU_CFG_NUM_SUMULTI]; static uint16_t g_ctsu_mutual_snd_data[CTSU_CFG_NUM_MUTUAL_ELEMENTS * CTSU_CFG_NUM_SUMULTI]; #endif @@ -495,6 +498,7 @@ const ctsu_api_t g_ctsu_on_ctsu = .open = R_CTSU_Open, .scanStart = R_CTSU_ScanStart, .dataGet = R_CTSU_DataGet, + .scanStop = R_CTSU_ScanStop, .diagnosis = R_CTSU_Diagnosis, .close = R_CTSU_Close, .callbackSet = R_CTSU_CallbackSet, @@ -566,30 +570,53 @@ fsp_err_t R_CTSU_Open (ctsu_ctrl_t * const p_ctrl, ctsu_cfg_t const * const p_cf #if (CTSU_CFG_NUM_SELF_ELEMENTS != 0) if (CTSU_MODE_SELF_MULTI_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_cfg->md)) { - p_instance_ctrl->p_self_raw = &g_ctsu_self_raw[g_ctsu_self_element_index * CTSU_CFG_NUM_SUMULTI]; - p_instance_ctrl->p_self_data = &g_ctsu_self_data[g_ctsu_self_element_index * CTSU_CFG_NUM_SUMULTI]; - p_instance_ctrl->num_elements = p_cfg->num_rx; - g_ctsu_self_element_index = (uint8_t) (g_ctsu_self_element_index + p_instance_ctrl->num_elements); + p_instance_ctrl->p_self_raw = &g_ctsu_self_raw[g_ctsu_self_element_index * CTSU_CFG_NUM_SUMULTI]; + p_instance_ctrl->p_self_corr = &g_ctsu_self_corr[g_ctsu_self_element_index * CTSU_CFG_NUM_SUMULTI]; + p_instance_ctrl->p_self_data = &g_ctsu_self_data[g_ctsu_self_element_index * CTSU_CFG_NUM_SUMULTI]; + p_instance_ctrl->num_elements = p_cfg->num_rx; + g_ctsu_self_element_index = (uint8_t) (g_ctsu_self_element_index + p_instance_ctrl->num_elements); + p_instance_ctrl->self_elem_index = g_ctsu_self_element_index; + + #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) + p_instance_ctrl->p_mutual_raw = &g_ctsu_mutual_raw[0]; + p_instance_ctrl->p_mutual_pri_corr = &g_ctsu_mutual_pri_corr[0]; + p_instance_ctrl->p_mutual_snd_corr = &g_ctsu_mutual_snd_corr[0]; + p_instance_ctrl->p_mutual_pri_data = &g_ctsu_mutual_pri_data[0]; + p_instance_ctrl->p_mutual_snd_data = &g_ctsu_mutual_snd_data[0]; + #endif } #endif #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) if (CTSU_MODE_MUTUAL_FULL_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_cfg->md)) { p_instance_ctrl->p_mutual_raw = &g_ctsu_mutual_raw[g_ctsu_mutual_element_index * CTSU_MUTUAL_BUF_SIZE]; + p_instance_ctrl->p_mutual_pri_corr = + &g_ctsu_mutual_pri_corr[g_ctsu_mutual_element_index * CTSU_CFG_NUM_SUMULTI]; + p_instance_ctrl->p_mutual_snd_corr = + &g_ctsu_mutual_snd_corr[g_ctsu_mutual_element_index * CTSU_CFG_NUM_SUMULTI]; p_instance_ctrl->p_mutual_pri_data = &g_ctsu_mutual_pri_data[g_ctsu_mutual_element_index * CTSU_CFG_NUM_SUMULTI]; p_instance_ctrl->p_mutual_snd_data = &g_ctsu_mutual_snd_data[g_ctsu_mutual_element_index * CTSU_CFG_NUM_SUMULTI]; - p_instance_ctrl->num_elements = (uint8_t) (p_cfg->num_rx * p_cfg->num_tx); - g_ctsu_mutual_element_index = (uint8_t) (g_ctsu_mutual_element_index + p_instance_ctrl->num_elements); + p_instance_ctrl->num_elements = (uint8_t) (p_cfg->num_rx * p_cfg->num_tx); + g_ctsu_mutual_element_index = (uint8_t) (g_ctsu_mutual_element_index + p_instance_ctrl->num_elements); + p_instance_ctrl->mutual_elem_index = g_ctsu_mutual_element_index; + + #if (CTSU_CFG_NUM_SELF_ELEMENTS != 0) + p_instance_ctrl->p_self_raw = &g_ctsu_self_raw[0]; + p_instance_ctrl->p_self_corr = &g_ctsu_self_corr[0]; + p_instance_ctrl->p_self_data = &g_ctsu_self_data[0]; + #endif } #endif - p_instance_ctrl->p_tuning_count = &g_ctsu_tuning_count[g_ctsu_element_index]; - p_instance_ctrl->p_tuning_diff = &g_ctsu_tuning_diff[g_ctsu_element_index]; - p_instance_ctrl->p_ctsuwr = &g_ctsu_ctsuwr[g_ctsu_element_index * CTSU_CFG_NUM_SUMULTI]; - g_ctsu_element_index = (uint8_t) (g_ctsu_element_index + p_instance_ctrl->num_elements); + p_instance_ctrl->p_tuning_count = &g_ctsu_tuning_count[g_ctsu_element_index]; + p_instance_ctrl->p_tuning_diff = &g_ctsu_tuning_diff[g_ctsu_element_index]; + p_instance_ctrl->p_ctsuwr = &g_ctsu_ctsuwr[g_ctsu_element_index * CTSU_CFG_NUM_SUMULTI]; + g_ctsu_element_index = (uint8_t) (g_ctsu_element_index + p_instance_ctrl->num_elements); + p_instance_ctrl->ctsu_elem_index = g_ctsu_element_index; /* Set Value */ + p_instance_ctrl->cap = p_cfg->cap; p_instance_ctrl->num_moving_average = p_cfg->num_moving_average; p_instance_ctrl->average = 0; if (true == p_cfg->tunning_enable) @@ -622,6 +649,24 @@ fsp_err_t R_CTSU_Open (ctsu_ctrl_t * const p_ctrl, ctsu_cfg_t const * const p_cf p_instance_ctrl->ctsucr1 = (uint8_t) ((p_cfg->atune12 & 0x01) << 3); #endif p_instance_ctrl->ctsucr1 |= (uint8_t) (p_cfg->md << 6); + + p_instance_ctrl->txvsel = p_instance_ctrl->p_ctsu_cfg->txvsel; + p_instance_ctrl->txvsel2 = p_instance_ctrl->p_ctsu_cfg->txvsel2; + + p_instance_ctrl->ctsuchac0 = p_instance_ctrl->p_ctsu_cfg->ctsuchac0; + p_instance_ctrl->ctsuchac1 = p_instance_ctrl->p_ctsu_cfg->ctsuchac1; + p_instance_ctrl->ctsuchac2 = p_instance_ctrl->p_ctsu_cfg->ctsuchac2; + p_instance_ctrl->ctsuchac3 = p_instance_ctrl->p_ctsu_cfg->ctsuchac3; + p_instance_ctrl->ctsuchac4 = p_instance_ctrl->p_ctsu_cfg->ctsuchac4; + + p_instance_ctrl->ctsuchtrc0 = p_instance_ctrl->p_ctsu_cfg->ctsuchtrc0; + p_instance_ctrl->ctsuchtrc1 = p_instance_ctrl->p_ctsu_cfg->ctsuchtrc1; + p_instance_ctrl->ctsuchtrc2 = p_instance_ctrl->p_ctsu_cfg->ctsuchtrc2; + p_instance_ctrl->ctsuchtrc3 = p_instance_ctrl->p_ctsu_cfg->ctsuchtrc3; + p_instance_ctrl->ctsuchtrc4 = p_instance_ctrl->p_ctsu_cfg->ctsuchtrc4; + + p_instance_ctrl->md = p_instance_ctrl->p_ctsu_cfg->md; + #if (BSP_FEATURE_CTSU_VERSION == 2) p_instance_ctrl->ctsucr2 = (uint8_t) (p_cfg->atune12 & 0x02); p_instance_ctrl->ctsucr2 |= (uint8_t) ((p_cfg->md & 0x04) >> 2); @@ -657,14 +702,16 @@ fsp_err_t R_CTSU_Open (ctsu_ctrl_t * const p_ctrl, ctsu_cfg_t const * const p_cf { /* Current scan does not run multiple frequency */ p_instance_ctrl->p_ctsuwr[element_id].ctsuso = - (uint32_t) ((element_cfgs->sdpa << 24) | (element_cfgs->snum << 10) | element_cfgs->so); + (uint32_t) (((uint32_t) element_cfgs->sdpa << (uint32_t) 24) | + ((uint32_t) element_cfgs->snum << (uint32_t) 10) | element_cfgs->so); } else { if (CTSU_MODE_MUTUAL_CFC_SCAN != p_cfg->md) { p_instance_ctrl->p_ctsuwr[element_id * CTSU_CFG_NUM_SUMULTI].ctsuso = - (uint32_t) ((element_cfgs->sdpa << 24) | (element_cfgs->snum << 10) | element_cfgs->so); + (uint32_t) (((uint32_t) element_cfgs->sdpa << (uint32_t) 24) | + ((uint32_t) element_cfgs->snum << (uint32_t) 10) | element_cfgs->so); } #if (CTSU_CFG_NUM_CFC != 0) @@ -672,7 +719,8 @@ fsp_err_t R_CTSU_Open (ctsu_ctrl_t * const p_ctrl, ctsu_cfg_t const * const p_cf { /* CFC scan does not use CTSUSO */ p_instance_ctrl->p_ctsuwr[element_id * CTSU_CFG_NUM_SUMULTI].ctsuso = - (uint32_t) ((element_cfgs->sdpa << 24) | (element_cfgs->snum << 10)); + (uint32_t) (((uint32_t) element_cfgs->sdpa << (uint32_t) 24) | + ((uint32_t) element_cfgs->snum << (uint32_t) 10)); } #endif @@ -846,7 +894,7 @@ fsp_err_t R_CTSU_Open (ctsu_ctrl_t * const p_ctrl, ctsu_cfg_t const * const p_cf #if (BSP_FEATURE_CTSU_VERSION == 1) #if (CTSU_CFG_DIAG_SUPPORT_ENABLE == 1) - if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->md) { p_instance_ctrl->p_diag_info = &g_ctsu_diag_info; g_ctsu_diag_info.state = CTSU_DIAG_INIT; @@ -857,12 +905,58 @@ fsp_err_t R_CTSU_Open (ctsu_ctrl_t * const p_ctrl, ctsu_cfg_t const * const p_cf #if (BSP_FEATURE_CTSU_VERSION == 2) #if (CTSU_CFG_DIAG_SUPPORT_ENABLE == 1) - if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->md) { p_instance_ctrl->p_diag_info = &g_ctsu_diag_info; g_ctsu_diag_info.lvmode = CTSU_CFG_LOW_VOLTAGE_MODE; g_ctsu_diag_info.state = CTSU_DIAG_INIT; } + else + { + /* Once chac is set, it will not be set after that */ + if ((0 == g_ctsu_diag_info.chaca) && (0 == g_ctsu_diag_info.chacb)) + { + /* From the CHAC information configured in the normal measurement, */ + /* find the minimum TS pin on the CTSU peripheral for the OverCuurent test and clock recovery test. */ + + /* Get CHACA register info */ + ((uint8_t *) &(g_ctsu_diag_info.chaca))[0] = p_instance_ctrl->p_ctsu_cfg->ctsuchac0; + ((uint8_t *) &(g_ctsu_diag_info.chaca))[1] = p_instance_ctrl->p_ctsu_cfg->ctsuchac1; + ((uint8_t *) &(g_ctsu_diag_info.chaca))[2] = p_instance_ctrl->p_ctsu_cfg->ctsuchac2; + ((uint8_t *) &(g_ctsu_diag_info.chaca))[3] = p_instance_ctrl->p_ctsu_cfg->ctsuchac3; + + /* Get CHACB register info */ + g_ctsu_diag_info.chacb = (uint32_t) (p_instance_ctrl->p_ctsu_cfg->ctsuchac4); + + /* Get the number of measurable elements from enabled CHACA */ + if (0 != g_ctsu_diag_info.chaca) + { + /* Get the number of measurable elements from enabled CHACA */ + for (i = 0; i < CTSU_DIAG_CHACA_TSMAX; i++) + { + if ((g_ctsu_diag_info.chaca >> i) & (uint32_t) 0x00000001) + { + g_ctsu_diag_info.chaca = (uint32_t) (0x00000001 << i); + g_ctsu_diag_info.chacb = 0; + break; + } + } + } + else /* Check the measurable elements from enabled CHACB. */ + { + for (i = 0; i < 8; i++) + { + /* Get the number of measurable elements from enabled CHACB */ + if ((g_ctsu_diag_info.chacb >> i) & (uint32_t) 0x00000001) + { + g_ctsu_diag_info.chaca = 0; + g_ctsu_diag_info.chacb = (uint32_t) (0x00000001 << i); + break; + } + } + } + } + } #endif #endif @@ -910,7 +1004,7 @@ fsp_err_t R_CTSU_ScanStart (ctsu_ctrl_t * const p_ctrl) FSP_ASSERT(p_instance_ctrl); FSP_ERROR_RETURN(CTSU_OPEN == p_instance_ctrl->open, FSP_ERR_NOT_OPEN); #endif - if (CTSU_CAP_SOFTWARE == p_instance_ctrl->p_ctsu_cfg->cap) + if (CTSU_CAP_SOFTWARE == p_instance_ctrl->cap) { /* Can be checked if the previous measurement was a software trigger */ if (0 == (0x02 & R_CTSU->CTSUCR0)) @@ -930,7 +1024,7 @@ fsp_err_t R_CTSU_ScanStart (ctsu_ctrl_t * const p_ctrl) FSP_ERROR_RETURN(FSP_SUCCESS == err, err); #endif - if (CTSU_CAP_SOFTWARE == p_instance_ctrl->p_ctsu_cfg->cap) + if (CTSU_CAP_SOFTWARE == p_instance_ctrl->cap) { R_CTSU->CTSUCR0 &= (uint8_t) ~0x06; // specify Software trigger usage } @@ -942,18 +1036,18 @@ fsp_err_t R_CTSU_ScanStart (ctsu_ctrl_t * const p_ctrl) /* Write CTSU Control Register 1 and save mode */ #if (BSP_FEATURE_CTSU_VERSION == 2) - if ((CTSU_MODE_CORRECTION_SCAN != p_instance_ctrl->p_ctsu_cfg->md) && - (CTSU_MODE_DIAGNOSIS_SCAN != p_instance_ctrl->p_ctsu_cfg->md)) + if ((CTSU_MODE_CORRECTION_SCAN != p_instance_ctrl->md) && + (CTSU_MODE_DIAGNOSIS_SCAN != p_instance_ctrl->md)) { txvsel = - (uint8_t) ((p_instance_ctrl->p_ctsu_cfg->txvsel2 << 6) | (p_instance_ctrl->p_ctsu_cfg->txvsel << 7)); + (uint8_t) ((p_instance_ctrl->txvsel2 << 6) | (p_instance_ctrl->txvsel << 7)); temp = (uint8_t) (R_CTSU->CTSUCR0 & ~(CTSU_CR0_MODIFY_BIT)); R_CTSU->CTSUCR0 = (uint8_t) (temp | (txvsel & CTSU_CR0_MODIFY_BIT)); // TXVSEL temp = (uint8_t) (R_CTSU->CTSUCR1 & ~(CTSU_CR1_MODIFY_BIT)); R_CTSU->CTSUCR1 = (uint8_t) (temp | (p_instance_ctrl->ctsucr1 & CTSU_CR1_MODIFY_BIT)); // MD1, MD0, ATUNE1 temp = (uint8_t) (R_CTSU->CTSUCR2 & ~(CTSU_CR2_MODIFY_BIT)); R_CTSU->CTSUCR2 = (uint8_t) (temp | (p_instance_ctrl->ctsucr2 & CTSU_CR2_MODIFY_BIT)); // POSEL, ATUNE2, MD2 - if (CTSU_MODE_CURRENT_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_CURRENT_SCAN == p_instance_ctrl->md) { R_CTSU->CTSUSST = CTSU_SST_RECOMMEND_CURRENT; R_CTSU->CTSUCRA_b.DCMODE = 1; @@ -978,41 +1072,42 @@ fsp_err_t R_CTSU_ScanStart (ctsu_ctrl_t * const p_ctrl) } /* Write Channel setting */ - R_CTSU->CTSUCHAC0 = p_instance_ctrl->p_ctsu_cfg->ctsuchac0; - R_CTSU->CTSUCHAC1 = p_instance_ctrl->p_ctsu_cfg->ctsuchac1; - R_CTSU->CTSUCHAC2 = p_instance_ctrl->p_ctsu_cfg->ctsuchac2; - R_CTSU->CTSUCHAC3 = p_instance_ctrl->p_ctsu_cfg->ctsuchac3; - R_CTSU->CTSUCHAC4 = p_instance_ctrl->p_ctsu_cfg->ctsuchac4; - R_CTSU->CTSUCHTRC0 = p_instance_ctrl->p_ctsu_cfg->ctsuchtrc0; - R_CTSU->CTSUCHTRC1 = p_instance_ctrl->p_ctsu_cfg->ctsuchtrc1; - R_CTSU->CTSUCHTRC2 = p_instance_ctrl->p_ctsu_cfg->ctsuchtrc2; - R_CTSU->CTSUCHTRC3 = p_instance_ctrl->p_ctsu_cfg->ctsuchtrc3; - R_CTSU->CTSUCHTRC4 = p_instance_ctrl->p_ctsu_cfg->ctsuchtrc4; + R_CTSU->CTSUCHAC0 = p_instance_ctrl->ctsuchac0; + R_CTSU->CTSUCHAC1 = p_instance_ctrl->ctsuchac1; + R_CTSU->CTSUCHAC2 = p_instance_ctrl->ctsuchac2; + R_CTSU->CTSUCHAC3 = p_instance_ctrl->ctsuchac3; + R_CTSU->CTSUCHAC4 = p_instance_ctrl->ctsuchac4; + R_CTSU->CTSUCHTRC0 = p_instance_ctrl->ctsuchtrc0; + R_CTSU->CTSUCHTRC1 = p_instance_ctrl->ctsuchtrc1; + R_CTSU->CTSUCHTRC2 = p_instance_ctrl->ctsuchtrc2; + R_CTSU->CTSUCHTRC3 = p_instance_ctrl->ctsuchtrc3; + R_CTSU->CTSUCHTRC4 = p_instance_ctrl->ctsuchtrc4; } #if (CTSU_CFG_DIAG_SUPPORT_ENABLE == 1) - if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->md) { ctsu_diag_scan_start2(p_instance_ctrl); } #endif #if (CTSU_CFG_TEMP_CORRECTION_SUPPORT == 1) - if (CTSU_MODE_CORRECTION_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_CORRECTION_SCAN == p_instance_ctrl->md) { R_CTSU->CTSUSST = CTSU_SST_RECOMMEND; ctsu_correction_scan_start(); } #endif + p_instance_ctrl->state = CTSU_STATE_SCANNING; #endif #if (BSP_FEATURE_CTSU_VERSION == 1) - if (CTSU_MODE_DIAGNOSIS_SCAN != p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_DIAGNOSIS_SCAN != p_instance_ctrl->md) { temp = (uint8_t) (R_CTSU->CTSUCR1 & ~(CTSU_CR1_MODIFY_BIT)); R_CTSU->CTSUCR1 = (uint8_t) (temp | (p_instance_ctrl->ctsucr1 & CTSU_CR1_MODIFY_BIT)); // MD1, MD0, ATUNE1 #if BSP_FEATURE_CTSU_HAS_TXVSEL R_CTSU->CTSUCR0 = - (uint8_t) ((R_CTSU->CTSUCR0 & ~(CTSU_TXVSEL)) | (p_instance_ctrl->p_ctsu_cfg->txvsel & CTSU_TXVSEL)); + (uint8_t) ((R_CTSU->CTSUCR0 & ~(CTSU_TXVSEL)) | (p_instance_ctrl->txvsel & CTSU_TXVSEL)); #endif /* Write Channel setting */ @@ -1044,7 +1139,7 @@ fsp_err_t R_CTSU_ScanStart (ctsu_ctrl_t * const p_ctrl) } #if (CTSU_CFG_DIAG_SUPPORT_ENABLE == 1) - if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->md) { ctsu_diag_scan_start1(p_instance_ctrl); } @@ -1089,7 +1184,7 @@ fsp_err_t R_CTSU_DataGet (ctsu_ctrl_t * const p_ctrl, uint16_t * p_data) #if (BSP_FEATURE_CTSU_VERSION == 2) #if (CTSU_CFG_TEMP_CORRECTION_SUPPORT == 1) - if (CTSU_MODE_CORRECTION_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_CORRECTION_SCAN == p_instance_ctrl->md) { ctsu_correction_data_get(p_instance_ctrl, p_data); p_instance_ctrl->state = CTSU_STATE_IDLE; @@ -1099,7 +1194,7 @@ fsp_err_t R_CTSU_DataGet (ctsu_ctrl_t * const p_ctrl, uint16_t * p_data) #endif #if (CTSU_CFG_DIAG_SUPPORT_ENABLE == 1) - if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->md) { err = ctsu_diag_data_get2(p_data); p_instance_ctrl->state = CTSU_STATE_IDLE; @@ -1119,7 +1214,7 @@ fsp_err_t R_CTSU_DataGet (ctsu_ctrl_t * const p_ctrl, uint16_t * p_data) #if (BSP_FEATURE_CTSU_VERSION == 1) #if (CTSU_CFG_DIAG_SUPPORT_ENABLE == 1) - if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->md) { err = ctsu_diag_data_get1(); p_instance_ctrl->state = CTSU_STATE_IDLE; @@ -1159,8 +1254,8 @@ fsp_err_t R_CTSU_DataGet (ctsu_ctrl_t * const p_ctrl, uint16_t * p_data) if (CTSU_TUNING_INCOMPLETE == p_instance_ctrl->tuning) { - if ((CTSU_MODE_SELF_MULTI_SCAN == p_instance_ctrl->p_ctsu_cfg->md) || - (CTSU_MODE_MUTUAL_FULL_SCAN == p_instance_ctrl->p_ctsu_cfg->md)) + if ((CTSU_MODE_SELF_MULTI_SCAN == p_instance_ctrl->md) || + (CTSU_MODE_MUTUAL_FULL_SCAN == p_instance_ctrl->md)) { ctsu_initial_offset_tuning(p_instance_ctrl); } @@ -1172,7 +1267,7 @@ fsp_err_t R_CTSU_DataGet (ctsu_ctrl_t * const p_ctrl, uint16_t * p_data) FSP_ERROR_RETURN(0 < p_instance_ctrl->average, FSP_ERR_CTSU_INCOMPLETE_TUNING); #if (CTSU_CFG_NUM_SELF_ELEMENTS != 0) - if (CTSU_MODE_SELF_MULTI_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_instance_ctrl->p_ctsu_cfg->md)) + if (CTSU_MODE_SELF_MULTI_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_instance_ctrl->md)) { if (true == p_instance_ctrl->p_ctsu_cfg->judge_multifreq_disable) { @@ -1193,7 +1288,7 @@ fsp_err_t R_CTSU_DataGet (ctsu_ctrl_t * const p_ctrl, uint16_t * p_data) } #endif #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) - if (CTSU_MODE_MUTUAL_FULL_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_instance_ctrl->p_ctsu_cfg->md)) + if (CTSU_MODE_MUTUAL_FULL_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_instance_ctrl->md)) { if (true == p_instance_ctrl->p_ctsu_cfg->judge_multifreq_disable) { @@ -1221,6 +1316,42 @@ fsp_err_t R_CTSU_DataGet (ctsu_ctrl_t * const p_ctrl, uint16_t * p_data) return err; } +/*******************************************************************************************************************//** + * @brief This function scan stops the sensor as scanning by the CTSU. + * Implements @ref ctsu_api_t::scanStop. + * @retval FSP_SUCCESS CTSU successfully scan stop. + * @retval FSP_ERR_ASSERTION Null pointer passed as a parameter. + * @retval FSP_ERR_NOT_OPEN Module is not open. + **********************************************************************************************************************/ +fsp_err_t R_CTSU_ScanStop (ctsu_ctrl_t * const p_ctrl) +{ + fsp_err_t err = FSP_SUCCESS; + ctsu_instance_ctrl_t * p_instance_ctrl = (ctsu_instance_ctrl_t *) p_ctrl; +#if (CTSU_CFG_PARAM_CHECKING_ENABLE) + FSP_ASSERT(p_ctrl); + FSP_ERROR_RETURN(CTSU_OPEN == p_instance_ctrl->open, FSP_ERR_NOT_OPEN); +#endif + + if (CTSU_STATE_SCANNING == p_instance_ctrl->state) + { +#if (BSP_FEATURE_CTSU_VERSION == 2) + R_CTSU->CTSUCRA ^= 0x11; +#else + R_CTSU->CTSUCR0 ^= 0x11; +#endif + + R_BSP_IrqStatusClear(p_instance_ctrl->p_ctsu_cfg->write_irq); + R_BSP_IrqStatusClear(p_instance_ctrl->p_ctsu_cfg->read_irq); + R_BSP_IrqStatusClear(p_instance_ctrl->p_ctsu_cfg->end_irq); + + p_instance_ctrl->state = CTSU_STATE_IDLE; + p_instance_ctrl->wr_index = 0; + p_instance_ctrl->rd_index = 0; + } + + return err; +} + /*******************************************************************************************************************//** * Updates the user callback and has option of providing memory for callback structure. * Implements ctsu_api_t::callbackSet @@ -1288,13 +1419,13 @@ fsp_err_t R_CTSU_Close (ctsu_ctrl_t * const p_ctrl) g_ctsu_element_index = (uint8_t) (g_ctsu_element_index - p_instance_ctrl->num_elements); #if (CTSU_CFG_NUM_SELF_ELEMENTS != 0) - if (CTSU_MODE_SELF_MULTI_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_instance_ctrl->p_ctsu_cfg->md)) + if (CTSU_MODE_SELF_MULTI_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_instance_ctrl->md)) { g_ctsu_self_element_index = (uint8_t) (g_ctsu_self_element_index - p_instance_ctrl->num_elements); } #endif #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) - if (CTSU_MODE_MUTUAL_FULL_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_instance_ctrl->p_ctsu_cfg->md)) + if (CTSU_MODE_MUTUAL_FULL_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_instance_ctrl->md)) { g_ctsu_mutual_element_index = (uint8_t) (g_ctsu_mutual_element_index - p_instance_ctrl->num_elements); } @@ -1393,7 +1524,7 @@ fsp_err_t ctsu_transfer_open (ctsu_instance_ctrl_t * const p_instance_ctrl) p_info->p_src = (void *) &R_CTSU->CTSUSC; p_info->p_dest = p_instance_ctrl->p_self_raw; #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) - if (CTSU_MODE_MUTUAL_FULL_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_instance_ctrl->p_ctsu_cfg->md)) + if (CTSU_MODE_MUTUAL_FULL_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_instance_ctrl->md)) { p_info->p_dest = p_instance_ctrl->p_mutual_raw; } @@ -1456,7 +1587,7 @@ fsp_err_t ctsu_transfer_configure (ctsu_instance_ctrl_t * const p_instance_ctrl) } #endif #if (CTSU_CFG_DIAG_SUPPORT_ENABLE == 1) - else if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + else if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->md) { if (CTSU_DIAG_CLOCK_RECOVERY == g_ctsu_diag_info.state) { @@ -1483,7 +1614,7 @@ fsp_err_t ctsu_transfer_configure (ctsu_instance_ctrl_t * const p_instance_ctrl) { p_info->src_addr_mode = TRANSFER_ADDR_MODE_INCREMENTED; - if (CTSU_MODE_CURRENT_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_CURRENT_SCAN == p_instance_ctrl->md) { p_info->num_blocks = p_instance_ctrl->num_elements; } @@ -1504,14 +1635,14 @@ fsp_err_t ctsu_transfer_configure (ctsu_instance_ctrl_t * const p_instance_ctrl) } #if (CTSU_CFG_DIAG_SUPPORT_ENABLE == 1) - else if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + else if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->md) { p_info->num_blocks = 1; p_info->p_src = (void *) &(g_ctsu_diag_info.ctsuwr); } #endif else if ((CTSU_CORRECTION_RUN != g_ctsu_correction_info.status) && - (CTSU_MODE_DIAGNOSIS_SCAN != p_instance_ctrl->p_ctsu_cfg->md)) + (CTSU_MODE_DIAGNOSIS_SCAN != p_instance_ctrl->md)) { p_info->num_blocks = p_instance_ctrl->num_elements; p_info->p_src = p_instance_ctrl->p_ctsuwr; @@ -1547,7 +1678,7 @@ fsp_err_t ctsu_transfer_configure (ctsu_instance_ctrl_t * const p_instance_ctrl) } #endif #if (CTSU_CFG_DIAG_SUPPORT_ENABLE == 1) - else if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + else if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->md) { p_info->size = TRANSFER_SIZE_4_BYTE; if (CTSU_DIAG_CLOCK_RECOVERY == g_ctsu_diag_info.state) @@ -1580,7 +1711,7 @@ fsp_err_t ctsu_transfer_configure (ctsu_instance_ctrl_t * const p_instance_ctrl) { p_info->size = TRANSFER_SIZE_2_BYTE; - if (CTSU_MODE_CURRENT_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_CURRENT_SCAN == p_instance_ctrl->md) { p_info->num_blocks = p_instance_ctrl->num_elements; } @@ -1592,14 +1723,14 @@ fsp_err_t ctsu_transfer_configure (ctsu_instance_ctrl_t * const p_instance_ctrl) p_info->p_dest = p_instance_ctrl->p_self_raw; p_info->p_src = (void *) &R_CTSU->CTSUSC; #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) - if (CTSU_MODE_MUTUAL_FULL_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_instance_ctrl->p_ctsu_cfg->md)) + if (CTSU_MODE_MUTUAL_FULL_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_instance_ctrl->md)) { p_info->p_dest = p_instance_ctrl->p_mutual_raw; p_info->num_blocks = (uint16_t) (p_info->num_blocks * 2); ///< Primary and Secondary } #if (CTSU_CFG_NUM_CFC != 0) - if (CTSU_MODE_MUTUAL_CFC_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_MUTUAL_CFC_SCAN == p_instance_ctrl->md) { p_info->length = p_instance_ctrl->p_ctsu_cfg->num_rx; p_info->num_blocks = (uint16_t) (p_info->num_blocks / p_instance_ctrl->p_ctsu_cfg->num_rx); @@ -1618,19 +1749,19 @@ fsp_err_t ctsu_transfer_configure (ctsu_instance_ctrl_t * const p_instance_ctrl) } #if (CTSU_CFG_DIAG_SUPPORT_ENABLE == 1) - else if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + else if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->md) { p_info->num_blocks = 1; p_info->p_dest = (void *) &g_ctsu_diag_info.scanbuf; } #endif else if ((CTSU_CORRECTION_RUN != g_ctsu_correction_info.status) && - (CTSU_MODE_DIAGNOSIS_SCAN != p_instance_ctrl->p_ctsu_cfg->md)) + (CTSU_MODE_DIAGNOSIS_SCAN != p_instance_ctrl->md)) { p_info->num_blocks = p_instance_ctrl->num_elements; p_info->p_dest = p_instance_ctrl->p_self_raw; #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) - if (CTSU_MODE_MUTUAL_FULL_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_instance_ctrl->p_ctsu_cfg->md)) + if (CTSU_MODE_MUTUAL_FULL_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_instance_ctrl->md)) { p_info->p_dest = p_instance_ctrl->p_mutual_raw; p_info->num_blocks = (uint16_t) (p_info->num_blocks * 2); ///< Primary and Secondary @@ -1669,7 +1800,7 @@ void ctsu_initial_offset_tuning (ctsu_instance_ctrl_t * const p_instance_ctrl) int32_t ctsuso; uint32_t snum; - if (CTSU_MODE_SELF_MULTI_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_SELF_MULTI_SCAN == p_instance_ctrl->md) { target_val = (CTSU_TUNING_VALUE_SELF / 2); } @@ -1686,13 +1817,13 @@ void ctsu_initial_offset_tuning (ctsu_instance_ctrl_t * const p_instance_ctrl) { #if (BSP_FEATURE_CTSU_VERSION == 1) #if (CTSU_CFG_NUM_SELF_ELEMENTS != 0) - if (CTSU_MODE_SELF_MULTI_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_SELF_MULTI_SCAN == p_instance_ctrl->md) { diff = *(p_instance_ctrl->p_self_data + element_id) - CTSU_TUNING_VALUE_SELF; } #endif #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) - if (CTSU_MODE_MUTUAL_FULL_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_MUTUAL_FULL_SCAN == p_instance_ctrl->md) { diff = *(p_instance_ctrl->p_mutual_pri_data + element_id) - CTSU_TUNING_VALUE_MUTUAL; } @@ -1758,7 +1889,7 @@ void ctsu_initial_offset_tuning (ctsu_instance_ctrl_t * const p_instance_ctrl) element_top = (uint16_t) (element_id * CTSU_CFG_NUM_SUMULTI); for (i = 0; i < CTSU_CFG_NUM_SUMULTI; i++) { - if (CTSU_MODE_SELF_MULTI_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_SELF_MULTI_SCAN == p_instance_ctrl->md) { corr_data[i] = p_instance_ctrl->p_self_data[element_top + i]; } @@ -1876,7 +2007,7 @@ void ctsu_write_isr (void) } #endif #endif - else if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + else if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->md) { #if (BSP_FEATURE_CTSU_VERSION == 2) #if (CTSU_CFG_DIAG_SUPPORT_ENABLE == 1) @@ -1937,7 +2068,7 @@ void ctsu_read_isr (void) #if (BSP_FEATURE_CTSU_VERSION == 1) #if (CTSU_CFG_DIAG_SUPPORT_ENABLE == 1) - else if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + else if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->md) { g_ctsu_diag_info.scanbuf.sen = R_CTSU->CTSUSC; g_ctsu_diag_info.scanbuf.ref = R_CTSU->CTSURC; @@ -1947,7 +2078,7 @@ void ctsu_read_isr (void) else { #if (CTSU_CFG_NUM_SELF_ELEMENTS != 0) - if (CTSU_MODE_SELF_MULTI_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_SELF_MULTI_SCAN == p_instance_ctrl->md) { (p_instance_ctrl->p_self_raw + p_instance_ctrl->rd_index)->sen = R_CTSU->CTSUSC; (p_instance_ctrl->p_self_raw + p_instance_ctrl->rd_index)->ref = R_CTSU->CTSURC; @@ -1955,7 +2086,7 @@ void ctsu_read_isr (void) } #endif #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) - if (CTSU_MODE_MUTUAL_FULL_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_MUTUAL_FULL_SCAN == p_instance_ctrl->md) { if (1 == R_CTSU->CTSUST_b.CTSUPS) { @@ -1992,7 +2123,7 @@ void ctsu_read_isr (void) } #endif #if (CTSU_CFG_DIAG_SUPPORT_ENABLE == 1) - else if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + else if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->md) { if (CTSU_DIAG_CFC == g_ctsu_diag_info.state) { @@ -2009,7 +2140,7 @@ void ctsu_read_isr (void) else { #if (CTSU_CFG_NUM_SELF_ELEMENTS != 0) - if (CTSU_MODE_SELF_MULTI_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_instance_ctrl->p_ctsu_cfg->md)) + if (CTSU_MODE_SELF_MULTI_SCAN == (CTSU_MODE_MUTUAL_FULL_SCAN & p_instance_ctrl->md)) { p_instance_ctrl->p_self_raw[p_instance_ctrl->rd_index] = R_CTSU->CTSUSC; p_instance_ctrl->rd_index++; @@ -2022,14 +2153,14 @@ void ctsu_read_isr (void) } #endif #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) - if (CTSU_MODE_MUTUAL_FULL_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_MUTUAL_FULL_SCAN == p_instance_ctrl->md) { p_instance_ctrl->p_mutual_raw[p_instance_ctrl->rd_index] = R_CTSU->CTSUSC; p_instance_ctrl->rd_index++; } #if (CTSU_CFG_NUM_CFC != 0) - if (CTSU_MODE_MUTUAL_CFC_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_MUTUAL_CFC_SCAN == p_instance_ctrl->md) { for (i = 0; i < p_instance_ctrl->p_ctsu_cfg->num_rx; i++) { @@ -2085,7 +2216,7 @@ void ctsu_end_isr (void) #if (BSP_FEATURE_CTSU_VERSION == 2) #if (CTSU_CFG_DIAG_SUPPORT_ENABLE == 1) - if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_DIAGNOSIS_SCAN == p_instance_ctrl->md) { if (CTSU_DIAG_OVER_CURRENT == g_ctsu_diag_info.state) { @@ -2136,7 +2267,7 @@ void ctsu_end_isr (void) #if (CTSU_CFG_TEMP_CORRECTION_SUPPORT == 1) if (CTSU_CORRECTION_RUN != g_ctsu_correction_info.status) { - if (CTSU_MODE_CORRECTION_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_CORRECTION_SCAN == p_instance_ctrl->md) { R_CTSU->CTSUCRA_b.SDPSEL = 0; R_CTSU->CTSUSUCLK0 = (uint16_t) ((CTSU_CFG_SUMULTI0 << 8) | g_ctsu_correction_info.suadj0); @@ -2151,8 +2282,9 @@ void ctsu_end_isr (void) #endif #endif - p_instance_ctrl->state = CTSU_STATE_SCANNED; - p_args->p_context = p_instance_ctrl->p_context; + p_instance_ctrl->state = CTSU_STATE_SCANNED; + p_instance_ctrl->error_status = args.event; + p_args->p_context = p_instance_ctrl->p_context; /* If a callback was provided, call it with the argument */ if (NULL != p_instance_ctrl->p_callback) @@ -2707,6 +2839,7 @@ void ctsu_correction_calib_rtrim (ctsu_instance_ctrl_t * const p_instance_ctrl, adctdr_sum = 0; for (i = 0; i < CTSU_CALIB_AVERAGE_TIME; i++) { + /* Software trigger start scan */ p_adc->p_api->scanStart(p_adc->p_ctrl); /* Wait for conversion to complete. */ @@ -2716,6 +2849,7 @@ void ctsu_correction_calib_rtrim (ctsu_instance_ctrl_t * const p_instance_ctrl, p_adc->p_api->scanStatusGet(p_adc->p_ctrl, &status); } + /* Read A/D data then scan normal end */ p_adc->p_api->read(p_adc->p_ctrl, ADC_CHANNEL_16, &adctdr_result); adctdr_sum += adctdr_result; } @@ -2967,7 +3101,7 @@ void ctsu_correction_exec (ctsu_instance_ctrl_t * const p_instance_ctrl) calc.snum = (p_instance_ctrl->p_ctsuwr[element_id].ctsuso0 >> 10) & CTSU_SNUM_MAX; calc.sdpa = (p_instance_ctrl->p_ctsuwr[element_id].ctsuso1 >> 8) & CTSU_SDPA_MAX; #if (CTSU_CFG_NUM_SELF_ELEMENTS != 0) - if (CTSU_MODE_SELF_MULTI_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_SELF_MULTI_SCAN == p_instance_ctrl->md) { p_self_data = (p_instance_ctrl->p_self_data + element_id); average_self = *p_self_data; @@ -2982,7 +3116,7 @@ void ctsu_correction_exec (ctsu_instance_ctrl_t * const p_instance_ctrl) #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) p_pri_data = (p_instance_ctrl->p_mutual_pri_data + element_id); p_snd_data = (p_instance_ctrl->p_mutual_snd_data + element_id); - if (CTSU_MODE_MUTUAL_FULL_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_MUTUAL_FULL_SCAN == p_instance_ctrl->md) { average_pri = *p_pri_data; average_snd = *p_snd_data; @@ -3040,7 +3174,7 @@ void ctsu_correction_exec (ctsu_instance_ctrl_t * const p_instance_ctrl) #endif #endif calc.range = p_instance_ctrl->range; - calc.md = p_instance_ctrl->p_ctsu_cfg->md; + calc.md = p_instance_ctrl->md; multi.judge_disable = p_instance_ctrl->p_ctsu_cfg->judge_multifreq_disable; for (element_id = 0; element_id < p_instance_ctrl->num_elements; element_id++) @@ -3053,14 +3187,17 @@ void ctsu_correction_exec (ctsu_instance_ctrl_t * const p_instance_ctrl) multi.offset[i] = (ctsuso * (uint32_t) (CTSU_CORRECTION_OFFSET_UNIT >> calc.range)); } - if (CTSU_MODE_SELF_MULTI_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_SELF_MULTI_SCAN == p_instance_ctrl->md) { #if (CTSU_CFG_NUM_SELF_ELEMENTS != 0) for (i = 0; i < CTSU_CFG_NUM_SUMULTI; i++) { - ctsu_correction_calc(&multi.pri[i], + ctsu_correction_calc(&p_instance_ctrl->p_self_corr[(element_id * CTSU_CFG_NUM_SUMULTI) + i], p_instance_ctrl->p_self_raw[(element_id * CTSU_CFG_NUM_SUMULTI) + i], &calc); + + multi.pri[i] = p_instance_ctrl->p_self_corr[(element_id * CTSU_CFG_NUM_SUMULTI) + i]; + multi.snd[i] = 0; } @@ -3093,7 +3230,7 @@ void ctsu_correction_exec (ctsu_instance_ctrl_t * const p_instance_ctrl) } } } - else if (CTSU_MODE_CURRENT_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + else if (CTSU_MODE_CURRENT_SCAN == p_instance_ctrl->md) { p_self_data = (p_instance_ctrl->p_self_data + (element_id * CTSU_CFG_NUM_SUMULTI)); @@ -3111,17 +3248,22 @@ void ctsu_correction_exec (ctsu_instance_ctrl_t * const p_instance_ctrl) } #endif } - else if (CTSU_MODE_MUTUAL_FULL_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + else if (CTSU_MODE_MUTUAL_FULL_SCAN == p_instance_ctrl->md) { #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) for (i = 0; i < CTSU_CFG_NUM_SUMULTI; i++) { - ctsu_correction_calc(&multi.pri[i], + ctsu_correction_calc(&p_instance_ctrl->p_mutual_pri_corr[(element_id * CTSU_CFG_NUM_SUMULTI) + i], p_instance_ctrl->p_mutual_raw[(element_id * CTSU_MUTUAL_BUF_SIZE) + (i * 2)], &calc); - ctsu_correction_calc(&multi.snd[i], + + multi.pri[i] = p_instance_ctrl->p_mutual_pri_corr[(element_id * CTSU_CFG_NUM_SUMULTI) + i]; + + ctsu_correction_calc(&p_instance_ctrl->p_mutual_snd_corr[(element_id * CTSU_CFG_NUM_SUMULTI) + i], p_instance_ctrl->p_mutual_raw[(element_id * CTSU_MUTUAL_BUF_SIZE) + (i * 2) + 1], &calc); + + multi.snd[i] = p_instance_ctrl->p_mutual_snd_corr[(element_id * CTSU_CFG_NUM_SUMULTI) + i]; } p_pri_data = (p_instance_ctrl->p_mutual_pri_data + (element_id * CTSU_CFG_NUM_SUMULTI)); @@ -3158,11 +3300,11 @@ void ctsu_correction_exec (ctsu_instance_ctrl_t * const p_instance_ctrl) } #endif } - else if (CTSU_MODE_MUTUAL_CFC_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + else if (CTSU_MODE_MUTUAL_CFC_SCAN == p_instance_ctrl->md) { #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) #if (CTSU_CFG_NUM_CFC != 0) - if (CTSU_MODE_MUTUAL_CFC_SCAN == p_instance_ctrl->p_ctsu_cfg->md) + if (CTSU_MODE_MUTUAL_CFC_SCAN == p_instance_ctrl->md) { num_rx = p_instance_ctrl->p_ctsu_cfg->num_rx; cfc_id = (uint16_t) (element_id % num_rx); @@ -3183,12 +3325,17 @@ void ctsu_correction_exec (ctsu_instance_ctrl_t * const p_instance_ctrl) for (i = 0; i < CTSU_CFG_NUM_SUMULTI; i++) { - ctsu_correction_calc(&multi.pri[i], + ctsu_correction_calc(&p_instance_ctrl->p_mutual_pri_corr[(element_id * CTSU_CFG_NUM_SUMULTI) + i], p_instance_ctrl->p_mutual_raw[offset + cfc_id + (num_rx * i * 2)], &calc); - ctsu_correction_calc(&multi.snd[i], + + multi.pri[i] = p_instance_ctrl->p_mutual_pri_corr[(element_id * CTSU_CFG_NUM_SUMULTI) + i]; + + ctsu_correction_calc(&p_instance_ctrl->p_mutual_snd_corr[(element_id * CTSU_CFG_NUM_SUMULTI) + i], p_instance_ctrl->p_mutual_raw[offset + cfc_id + (num_rx * i * 2) + num_rx], &calc); + + multi.snd[i] = p_instance_ctrl->p_mutual_snd_corr[(element_id * CTSU_CFG_NUM_SUMULTI) + i]; } p_pri_data = (p_instance_ctrl->p_mutual_pri_data + (element_id * CTSU_CFG_NUM_SUMULTI)); @@ -4891,8 +5038,8 @@ static void ctsu_diag_over_current_scan_start (void) R_CTSU->CTSUCRA_b.MD1 = 0; R_CTSU->CTSUCRA_b.MD2 = 0; - R_CTSU->CTSUCHACA = 1; - R_CTSU->CTSUCHACB = 1; + R_CTSU->CTSUCHACA = g_ctsu_diag_info.chaca; + R_CTSU->CTSUCHACB = g_ctsu_diag_info.chacb; R_CTSU->CTSUCHTRC0 = 0; R_CTSU->CTSUCHTRC1 = 0; R_CTSU->CTSUCHTRC2 = 0; @@ -5597,9 +5744,6 @@ static fsp_err_t ctsu_diag_cco_gain_result (void) static void ctsu_diag_clock_recovery_scan_start (void) { - uint8_t k; - uint8_t chac_bit; - R_CTSU->CTSUCRA = g_ctsu_diag_reg.ctsucra; R_CTSU->CTSUCRA_b.MD0 = 1; R_CTSU->CTSUCRA_b.MD1 = 0; @@ -5624,37 +5768,8 @@ static void ctsu_diag_clock_recovery_scan_start (void) R_CTSU->CTSUMCH_b.MCA2 = 1; R_CTSU->CTSUMCH_b.MCA3 = 0; - if (0 < g_ctsu_diag_reg.ctsuchaca) - { - for (k = 0; k < CTSU_DIAG_CHACA_TSMAX; k++) - { - chac_bit = (uint8_t) ((g_ctsu_diag_reg.ctsuchaca >> k) & 0x1); - if (1 == chac_bit) - { - break; - } - } - - R_CTSU->CTSUCHACA = (uint32_t) (1 << k); - R_CTSU->CTSUCHACB = 0; - } - else - { - R_CTSU->CTSUCHACA = 0; - for (k = 0; k < CTSU_DIAG_CHACA_TSMAX; k++) - { - chac_bit = (uint8_t) ((g_ctsu_diag_reg.ctsuchacb >> k) & 0x1); - if (1 == chac_bit) - { - if (1 != ((g_ctsu_diag_reg.ctsuchtrca >> k) & 0x1)) - { - break; - } - } - } - - R_CTSU->CTSUCHACB = (uint32_t) (1 << k); - } + R_CTSU->CTSUCHACA = g_ctsu_diag_info.chaca; + R_CTSU->CTSUCHACB = g_ctsu_diag_info.chacb; R_CTSU->CTSUCHTRC0 = 0; R_CTSU->CTSUCHTRC1 = 0; diff --git a/ra/fsp/src/r_ioport/r_ioport.c b/ra/fsp/src/r_ioport/r_ioport.c index 8867b49f8..7571e3170 100644 --- a/ra/fsp/src/r_ioport/r_ioport.c +++ b/ra/fsp/src/r_ioport/r_ioport.c @@ -440,10 +440,10 @@ fsp_err_t R_IOPORT_PortDirectionSet (ioport_ctrl_t * const p_ctrl, ioport_size_t direction_values, ioport_size_t mask) { - ioport_size_t orig_value; - ioport_size_t set_bits; - ioport_size_t clr_bits; - ioport_size_t write_value; + uint32_t orig_value; + uint32_t set_bits; + uint32_t clr_bits; + uint32_t write_value; #if (1 == IOPORT_CFG_PARAM_CHECKING_ENABLE) ioport_instance_ctrl_t * p_instance_ctrl = (ioport_instance_ctrl_t *) p_ctrl; @@ -458,23 +458,23 @@ fsp_err_t R_IOPORT_PortDirectionSet (ioport_ctrl_t * const p_ctrl, R_PORT0_Type * p_ioport_regs = IOPORT_PRV_PORT_ADDRESS((port >> IOPORT_PRV_PORT_OFFSET) & IOPORT_PRV_8BIT_MASK); /* Read current value of PCNTR1 register for the specified port */ - orig_value = p_ioport_regs->PCNTR1 & IOPORT_PRV_16BIT_MASK; + orig_value = p_ioport_regs->PCNTR1; /* High bits */ set_bits = direction_values & mask; /* Low bits */ /* Cast to ensure size */ - clr_bits = (ioport_size_t) ((~direction_values) & mask); + clr_bits = (uint32_t) ((~direction_values) & mask); /* New value to write to port direction register */ write_value = orig_value; write_value |= set_bits; - /* Cast to ensure size */ - write_value &= (ioport_size_t) (~clr_bits); + /* Clear bits as needed */ + write_value &= ~clr_bits; - p_ioport_regs->PCNTR1 = write_value & IOPORT_PRV_16BIT_MASK; + p_ioport_regs->PCNTR1 = write_value; return FSP_SUCCESS; } diff --git a/ra/fsp/src/r_sce_protected/crypto_procedures_protected/src/sce9/primitive/r_sce_func073.c b/ra/fsp/src/r_sce_protected/crypto_procedures_protected/src/sce9/primitive/r_sce_func073.c new file mode 100644 index 000000000..ea40ff98c --- /dev/null +++ b/ra/fsp/src/r_sce_protected/crypto_procedures_protected/src/sce9/primitive/r_sce_func073.c @@ -0,0 +1,1060 @@ +/*********************************************************************************************************************** +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only intended for use with Renesas products. No +* other uses are authorized. This software is owned by Renesas Electronics Corporation and is protected under all +* applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. TO THE MAXIMUM +* EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES +* SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR ANY REASON RELATED TO THIS +* SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software and to discontinue the availability of +* this software. By using this software, you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* +* Copyright (C) 2020 Renesas Electronics Corporation. All rights reserved. +***********************************************************************************************************************/ +/*********************************************************************************************************************** + * History : DD.MM.YYYY Version Description + * : 05.10.2020 1.00 First Release. + * : 02.12.2020 1.01 Added new functions such as the Brainpool curve. +***********************************************************************************************************************/ + +/*********************************************************************************************************************** +Includes , "Project Includes" +***********************************************************************************************************************/ +#include "r_sce.h" +#include "r_sce_private.h" + +/*********************************************************************************************************************** +Macro definitions +***********************************************************************************************************************/ + +/*********************************************************************************************************************** +Typedef definitions +***********************************************************************************************************************/ + +/*********************************************************************************************************************** +Imported global variables and functions (from other files) +***********************************************************************************************************************/ + +/*********************************************************************************************************************** +Exported global variables (to be accessed by other files) +***********************************************************************************************************************/ + +/*********************************************************************************************************************** +Private global variables and functions +***********************************************************************************************************************/ + +void R_SCE_func073_r2(uint32_t ARG1) +{ + uint32_t iLoop = 0U; + uint32_t iLoop1 = 0U; + uint32_t iLoop2 = 0U; + int32_t jLoop = 0U; + uint32_t kLoop = 0U; + uint32_t oLoop = 0U; + uint32_t oLoop1 = 0U; + uint32_t oLoop2 = 0U; + uint32_t dummy = 0U; + uint32_t KEY_ADR = 0U; + uint32_t OFS_ADR = 0U; + uint32_t MAX_CNT2 = 0U; + (void)iLoop; + (void)iLoop1; + (void)iLoop2; + (void)jLoop; + (void)kLoop; + (void)oLoop; + (void)oLoop1; + (void)oLoop2; + (void)dummy; + (void)KEY_ADR; + (void)OFS_ADR; + (void)MAX_CNT2; + SCE->REG_28H = 0x00870001U; + OFS_ADR = ARG1; + R_SCE_func100(0x5494a7e5U, 0xed0d7466U, 0xa092dc78U, 0x3ca4558fU); + R_SCE_func070_r2(OFS_ADR); + SCE->REG_24H = 0x0000dcd0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000403U; + SCE->REG_24H = 0x8000e8d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x000084d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00029008U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000800U; + SCE->REG_24H = 0x8000c0c1U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000010U; + SCE->REG_24H = 0x80005cd0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000003U; + SCE->REG_24H = 0x80008cd0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x0000880cU; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000800U; + SCE->REG_24H = 0x800050d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000802U; + SCE->REG_24H = 0x800088d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000004U; + SCE->REG_24H = 0x800094d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x0000880cU; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000800U; + SCE->REG_24H = 0x800070d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000802U; + SCE->REG_24H = 0x8000acd0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_104H = 0x00000058U; + SCE->REG_E0H = 0x80010360U; + /* WAIT_LOOP */ + while (1U != SCE->REG_104H_b.B31) + { + /* waiting */ + } + SCE->REG_100H = change_endian_long(0x000000f1U); + R_SCE_func101(0x8ad3d2cdU, 0x5e779bb7U, 0x0e85d5baU, 0x24e51ed7U); + R_SCE_func006(); + R_SCE_func100(0x3eab9b2cU, 0x1bb56cf8U, 0x80e22677U, 0xb8c0e8adU); + SCE->REG_1CH = 0x00400000U; + SCE->REG_1D0H = 0x00000000U; + if (1U == (SCE->REG_1CH_b.B22)) + { + SCE->REG_ECH = 0x00000800U; + R_SCE_func101(0x1cbf07d8U, 0xbc46e258U, 0x0989cfa2U, 0xfb2caab8U); + } + else + { + R_SCE_func100(0x5f223b5dU, 0xba508857U, 0x27e54efdU, 0x022e4c01U); + SCE->REG_24H = 0x00009cd0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x000019c0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00000591U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00000591U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x0000a0c1U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_18H = 0x00000004U; + SCE->REG_38H = 0x000000b0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_18H_b.B10) + { + /* waiting */ + } + SCE->REG_18H = 0x00000000U; + SCE->REG_34H = 0x00000010U; + SCE->REG_24H = 0x80005cd0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x0000880cU; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x0000a8d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000008U; + SCE->REG_24H = 0x800050d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00004a0cU; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x0000480cU; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x0000480cU; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00004a0cU; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000008U; + SCE->REG_24H = 0x800074d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00006e0cU; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00006c0cU; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00006c0cU; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00006c0cU; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00006e0cU; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00006e0cU; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + R_SCE_func100(0xa1877d3cU, 0x0331b725U, 0xb2a3b08eU, 0xf5d7db38U); + R_SCE_func103(); + R_SCE_func100(0xcfc2fbf2U, 0x703ecdbcU, 0x113f770bU, 0x8473c0f6U); + SCE->REG_104H = 0x00000052U; + SCE->REG_C4H = 0x01080c84U; + /* WAIT_LOOP */ + while (1U != SCE->REG_104H_b.B31) + { + /* waiting */ + } + SCE->REG_100H = change_endian_long(0x00000000U); + R_SCE_func100(0xb16d3e4aU, 0xdc676402U, 0x4b6214d5U, 0xf9efa276U); + SCE->REG_D0H = 0x00000100U; + SCE->REG_C4H = 0x42e087bfU; + SCE->REG_00H = 0x00002323U; + SCE->REG_2CH = 0x000000aaU; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + SCE->REG_04H = 0x00000222U; + /* WAIT_LOOP */ + while (1U != SCE->REG_04H_b.B30) + { + /* waiting */ + } + S_HEAP[0] = SCE->REG_100H; + S_HEAP[1] = SCE->REG_100H; + S_HEAP[2] = SCE->REG_100H; + S_HEAP[3] = SCE->REG_100H; + /* WAIT_LOOP */ + while (1U != SCE->REG_04H_b.B30) + { + /* waiting */ + } + S_HEAP[4] = SCE->REG_100H; + S_HEAP[5] = SCE->REG_100H; + S_HEAP[6] = SCE->REG_100H; + S_HEAP[7] = SCE->REG_100H; + R_SCE_func100(0x6b5acf8eU, 0x206e9286U, 0xc06643e1U, 0x87bf06c1U); + SCE->REG_D0H = 0x00000100U; + SCE->REG_C4H = 0x40e087bfU; + SCE->REG_00H = 0x00002323U; + SCE->REG_2CH = 0x000000abU; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + SCE->REG_04H = 0x00000222U; + /* WAIT_LOOP */ + while (1U != SCE->REG_04H_b.B30) + { + /* waiting */ + } + S_HEAP[8] = SCE->REG_100H; + S_HEAP[9] = SCE->REG_100H; + S_HEAP[10] = SCE->REG_100H; + S_HEAP[11] = SCE->REG_100H; + /* WAIT_LOOP */ + while (1U != SCE->REG_04H_b.B30) + { + /* waiting */ + } + S_HEAP[12] = SCE->REG_100H; + S_HEAP[13] = SCE->REG_100H; + S_HEAP[14] = SCE->REG_100H; + S_HEAP[15] = SCE->REG_100H; + R_SCE_func100(0x0a05d835U, 0x6ab17b84U, 0x2bd216acU, 0x080a9292U); + SCE->REG_D0H = 0x00000100U; + SCE->REG_C4H = 0x40e087bfU; + SCE->REG_00H = 0x00002323U; + SCE->REG_2CH = 0x000000a8U; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + SCE->REG_04H = 0x00000222U; + /* WAIT_LOOP */ + while (1U != SCE->REG_04H_b.B30) + { + /* waiting */ + } + S_HEAP[16] = SCE->REG_100H; + S_HEAP[17] = SCE->REG_100H; + S_HEAP[18] = SCE->REG_100H; + S_HEAP[19] = SCE->REG_100H; + /* WAIT_LOOP */ + while (1U != SCE->REG_04H_b.B30) + { + /* waiting */ + } + S_HEAP[20] = SCE->REG_100H; + S_HEAP[21] = SCE->REG_100H; + S_HEAP[22] = SCE->REG_100H; + S_HEAP[23] = SCE->REG_100H; + R_SCE_func100(0x267fdec4U, 0x8b07b543U, 0x77b10204U, 0x7a951cb7U); + SCE->REG_D0H = 0x00000100U; + SCE->REG_C4H = 0x40e087bfU; + SCE->REG_00H = 0x00002323U; + SCE->REG_2CH = 0x000000a9U; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + SCE->REG_04H = 0x00000222U; + /* WAIT_LOOP */ + while (1U != SCE->REG_04H_b.B30) + { + /* waiting */ + } + S_HEAP[24] = SCE->REG_100H; + S_HEAP[25] = SCE->REG_100H; + S_HEAP[26] = SCE->REG_100H; + S_HEAP[27] = SCE->REG_100H; + /* WAIT_LOOP */ + while (1U != SCE->REG_04H_b.B30) + { + /* waiting */ + } + S_HEAP[28] = SCE->REG_100H; + S_HEAP[29] = SCE->REG_100H; + S_HEAP[30] = SCE->REG_100H; + S_HEAP[31] = SCE->REG_100H; + R_SCE_func100(0x4c6bd155U, 0x44bf577bU, 0xee3a2c44U, 0x9de04f7aU); + SCE->REG_D0H = 0x00000100U; + SCE->REG_C4H = 0x40e087bfU; + SCE->REG_00H = 0x00002323U; + SCE->REG_2CH = 0x0000002aU; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + SCE->REG_04H = 0x00000222U; + /* WAIT_LOOP */ + while (1U != SCE->REG_04H_b.B30) + { + /* waiting */ + } + S_HEAP[32] = SCE->REG_100H; + S_HEAP[33] = SCE->REG_100H; + S_HEAP[34] = SCE->REG_100H; + S_HEAP[35] = SCE->REG_100H; + /* WAIT_LOOP */ + while (1U != SCE->REG_04H_b.B30) + { + /* waiting */ + } + S_HEAP[36] = SCE->REG_100H; + S_HEAP[37] = SCE->REG_100H; + S_HEAP[38] = SCE->REG_100H; + S_HEAP[39] = SCE->REG_100H; + R_SCE_func100(0x20a23b71U, 0x03f89d43U, 0xebab5818U, 0xaaae6467U); + SCE->REG_D0H = 0x00000100U; + SCE->REG_C4H = 0x40e087bfU; + SCE->REG_00H = 0x00002323U; + SCE->REG_2CH = 0x0000002bU; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + SCE->REG_04H = 0x00000222U; + /* WAIT_LOOP */ + while (1U != SCE->REG_04H_b.B30) + { + /* waiting */ + } + S_HEAP[40] = SCE->REG_100H; + S_HEAP[41] = SCE->REG_100H; + S_HEAP[42] = SCE->REG_100H; + S_HEAP[43] = SCE->REG_100H; + /* WAIT_LOOP */ + while (1U != SCE->REG_04H_b.B30) + { + /* waiting */ + } + S_HEAP[44] = SCE->REG_100H; + S_HEAP[45] = SCE->REG_100H; + S_HEAP[46] = SCE->REG_100H; + S_HEAP[47] = SCE->REG_100H; + R_SCE_func100(0xf26b0d0bU, 0x01c5202fU, 0xb04de638U, 0x40090be8U); + SCE->REG_D0H = 0x00000100U; + SCE->REG_C4H = 0x40e087bfU; + SCE->REG_00H = 0x00002323U; + SCE->REG_2CH = 0x00000022U; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + SCE->REG_04H = 0x00000222U; + /* WAIT_LOOP */ + while (1U != SCE->REG_04H_b.B30) + { + /* waiting */ + } + S_HEAP[48] = SCE->REG_100H; + S_HEAP[49] = SCE->REG_100H; + S_HEAP[50] = SCE->REG_100H; + S_HEAP[51] = SCE->REG_100H; + /* WAIT_LOOP */ + while (1U != SCE->REG_04H_b.B30) + { + /* waiting */ + } + S_HEAP[52] = SCE->REG_100H; + S_HEAP[53] = SCE->REG_100H; + S_HEAP[54] = SCE->REG_100H; + S_HEAP[55] = SCE->REG_100H; + R_SCE_func100(0xb371889aU, 0xe65f05c8U, 0x10378f82U, 0x4b65089bU); + SCE->REG_D0H = 0x00000100U; + SCE->REG_C4H = 0x40e087bfU; + SCE->REG_00H = 0x00002323U; + SCE->REG_2CH = 0x00000023U; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + SCE->REG_04H = 0x00000222U; + /* WAIT_LOOP */ + while (1U != SCE->REG_04H_b.B30) + { + /* waiting */ + } + S_HEAP[56] = SCE->REG_100H; + S_HEAP[57] = SCE->REG_100H; + S_HEAP[58] = SCE->REG_100H; + S_HEAP[59] = SCE->REG_100H; + /* WAIT_LOOP */ + while (1U != SCE->REG_04H_b.B30) + { + /* waiting */ + } + S_HEAP[60] = SCE->REG_100H; + S_HEAP[61] = SCE->REG_100H; + S_HEAP[62] = SCE->REG_100H; + S_HEAP[63] = SCE->REG_100H; + R_SCE_func100(0xaff0a84dU, 0xd1d74c3aU, 0x6201c09dU, 0x2c9919e2U); + SCE->REG_104H = 0x00000052U; + SCE->REG_C4H = 0x00000c84U; + /* WAIT_LOOP */ + while (1U != SCE->REG_104H_b.B31) + { + /* waiting */ + } + SCE->REG_100H = change_endian_long(0x00000000U); + SCE->REG_C4H = 0x400009cdU; + SCE->REG_00H = 0x00002213U; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + SCE->REG_04H = 0x00000212U; + /* WAIT_LOOP */ + while (1U != SCE->REG_04H_b.B30) + { + /* waiting */ + } + S_HEAP[64] = SCE->REG_100H; + S_HEAP[65] = SCE->REG_100H; + S_HEAP[66] = SCE->REG_100H; + S_HEAP[67] = SCE->REG_100H; + R_SCE_func100(0x60a55d8cU, 0x6795ce6fU, 0x0828aaf8U, 0xd4ce851cU); + R_SCE_func070_r2(OFS_ADR); + SCE->REG_24H = 0x000019c0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x0000dcd0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x0000e0c1U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000403U; + SCE->REG_24H = 0x8000e8d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000002U; + SCE->REG_24H = 0x800048d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000c00U; + SCE->REG_24H = 0x800058d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000c20U; + SCE->REG_24H = 0x8000bcd0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_00H = 0x00003523U; + SCE->REG_74H = 0x00000008U; + SCE->REG_2CH = 0x00000094U; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + SCE->REG_ECH = 0x00000908U; + SCE->REG_E0H = 0x81900008U; + SCE->REG_00H = 0x00003823U; + SCE->REG_2CH = 0x0000001dU; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + SCE->REG_00H = 0x00003823U; + SCE->REG_2CH = 0x00000010U; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + SCE->REG_24H = 0x0000dcd0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x0000a4d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x0002b208U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000800U; + SCE->REG_24H = 0x8000c0c1U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x000019c0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00000591U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000020U; + SCE->REG_24H = 0x80007cd0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00000d91U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001f00U; + SCE->REG_1CH = 0x00210000U; + SCE->REG_34H = 0x00000020U; + SCE->REG_24H = 0x80001dc0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00000591U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001f00U; + SCE->REG_1CH = 0x00210000U; + SCE->REG_24H = 0x000019c0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00000591U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00001191U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001f00U; + SCE->REG_1CH = 0x00210000U; + SCE->REG_24H = 0x000011c0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00000591U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001f00U; + SCE->REG_1CH = 0x00210000U; + R_SCE_func100(0x61e0c43dU, 0x4c4a90c1U, 0xd4a8dcc5U, 0xcee94750U); + SCE->REG_1CH = 0x00400000U; + SCE->REG_1D0H = 0x00000000U; + if (1U == (SCE->REG_1CH_b.B22)) + { + SCE->REG_ECH = 0x00000800U; + R_SCE_func101(0x853bd147U, 0x98bd78a0U, 0x7ee4c60aU, 0xfe2f49efU); + } + else + { + SCE->REG_34H = 0x00000c20U; + SCE->REG_24H = 0x8000fcd0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000800U; + SCE->REG_24H = 0x800048d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + R_SCE_func100(0xd3d8f585U, 0x628a7321U, 0xd2f1fad4U, 0x26bd2049U); + R_SCE_func009(); + R_SCE_func100(0xdc8a4af5U, 0x27d85f05U, 0x360b0b28U, 0x51d25448U); + SCE->REG_34H = 0x00000410U; + SCE->REG_24H = 0x800098d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + R_SCE_func071_r2(OFS_ADR); + R_SCE_func100(0xc3bde520U, 0xb5ca3b2cU, 0x2df162c8U, 0x8c01693aU); + SCE->REG_34H = 0x00000110U; + SCE->REG_24H = 0x800019c0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000110U; + SCE->REG_24H = 0x80001ec0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000330U; + SCE->REG_24H = 0x800019c0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000330U; + SCE->REG_24H = 0x80001ec0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + R_SCE_func011(S_HEAP); + SCE->REG_34H = 0x00000008U; + SCE->REG_24H = 0x8000f0d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000008U; + SCE->REG_24H = 0x800050d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_18H = 0x00000004U; + SCE->REG_38H = 0x00231030U; + /* WAIT_LOOP */ + while (0U != SCE->REG_18H_b.B10) + { + /* waiting */ + } + SCE->REG_18H = 0x00000000U; + SCE->REG_24H = 0x00001dc0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00000591U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001f00U; + SCE->REG_1CH = 0x00210000U; + R_SCE_func100(0x1b200d82U, 0x6ab73200U, 0x8fe3ed2fU, 0xc6242385U); + SCE->REG_1CH = 0x00400000U; + SCE->REG_1D0H = 0x00000000U; + if (1U == (SCE->REG_1CH_b.B22)) + { + SCE->REG_ECH = 0x00000800U; + R_SCE_func101(0x47a4d0cfU, 0xf5ccaee3U, 0xfbea38beU, 0xcb49368aU); + } + else + { + SCE->REG_24H = 0x0000bcd0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x0000b20cU; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x000054d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_ECH = 0x00000908U; + SCE->REG_ECH = 0x0000b500U; + SCE->REG_ECH = 0x00000060U; + SCE->REG_E0H = 0x81880008U; + SCE->REG_00H = 0x00003823U; + SCE->REG_2CH = 0x00000010U; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + SCE->REG_ECH = 0x00000908U; + SCE->REG_E0H = 0x81880008U; + SCE->REG_00H = 0x00003823U; + SCE->REG_2CH = 0x00000013U; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + SCE->REG_24H = 0x00008c0cU; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x0000880cU; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000008U; + SCE->REG_24H = 0x800011c0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00001191U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x000019a1U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x000080c1U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00009008U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_ECH = 0x0000b500U; + SCE->REG_ECH = 0x00000020U; + SCE->REG_E0H = 0x81880008U; + SCE->REG_00H = 0x00003823U; + SCE->REG_2CH = 0x00000014U; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + SCE->REG_24H = 0x0000a4d0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x0002b208U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_34H = 0x00000800U; + SCE->REG_24H = 0x8000c0c1U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_ECH = 0x0000b500U; + SCE->REG_ECH = 0x00000040U; + SCE->REG_E0H = 0x81880008U; + SCE->REG_00H = 0x00003823U; + SCE->REG_2CH = 0x00000012U; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + SCE->REG_24H = 0x0000880cU; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x000011c0U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_24H = 0x00000591U; + /* WAIT_LOOP */ + while (0U != SCE->REG_24H_b.B21) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001f00U; + SCE->REG_1CH = 0x00a10000U; + R_SCE_func100(0xa1cff671U, 0x1948b2a1U, 0xfa0d17f2U, 0xf049a4adU); + SCE->REG_1CH = 0x00400000U; + SCE->REG_1D0H = 0x00000000U; + if (1U == (SCE->REG_1CH_b.B22)) + { + SCE->REG_ECH = 0x00000800U; + R_SCE_func101(0x501f9387U, 0xa5871675U, 0xdaa1fe30U, 0x89014122U); + } + else + { + SCE->REG_ECH = 0x0000d000U; + R_SCE_func101(0x1f653ae7U, 0x345efc2fU, 0x8513230eU, 0xafd9c18bU); + } + } + } + } + SCE->REG_ECH = 0x38000c00U; + SCE->REG_E0H = 0x00000080U; + SCE->REG_1CH = 0x00260000U; + SCE->REG_ECH = 0x00007c1dU; + SCE->REG_1CH = 0x00602000U; +} + +/*********************************************************************************************************************** +End of function ./input_dir/S6C1/Cryptographic/R_SCE_func073_r2.prc +***********************************************************************************************************************/ diff --git a/ra/fsp/src/r_sce_protected/crypto_procedures_protected/src/sce9/primitive/r_sce_p9e.c b/ra/fsp/src/r_sce_protected/crypto_procedures_protected/src/sce9/primitive/r_sce_p9e.c new file mode 100644 index 000000000..7faac9acf --- /dev/null +++ b/ra/fsp/src/r_sce_protected/crypto_procedures_protected/src/sce9/primitive/r_sce_p9e.c @@ -0,0 +1,300 @@ +/*********************************************************************************************************************** +* DISCLAIMER +* This software is supplied by Renesas Electronics Corporation and is only intended for use with Renesas products. No +* other uses are authorized. This software is owned by Renesas Electronics Corporation and is protected under all +* applicable laws, including copyright laws. +* THIS SOFTWARE IS PROVIDED AND RENESAS MAKES NO WARRANTIES REGARDING +* THIS SOFTWARE, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. ALL SUCH WARRANTIES ARE EXPRESSLY DISCLAIMED. TO THE MAXIMUM +* EXTENT PERMITTED NOT PROHIBITED BY LAW, NEITHER RENESAS ELECTRONICS CORPORATION NOR ANY OF ITS AFFILIATED COMPANIES +* SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES FOR ANY REASON RELATED TO THIS +* SOFTWARE, EVEN IF RENESAS OR ITS AFFILIATES HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. +* Renesas reserves the right, without notice, to make changes to this software and to discontinue the availability of +* this software. By using this software, you agree to the additional terms and conditions found by accessing the +* following link: +* http://www.renesas.com/disclaimer +* +* Copyright (C) 2020 Renesas Electronics Corporation. All rights reserved. +***********************************************************************************************************************/ +/*********************************************************************************************************************** + * History : DD.MM.YYYY Version Description + * : 05.10.2020 1.00 First Release. + * : 02.12.2020 1.01 Added new functions such as the Brainpool curve. +***********************************************************************************************************************/ + +/*********************************************************************************************************************** +Includes , "Project Includes" +***********************************************************************************************************************/ +#include "r_sce.h" +#include "r_sce_private.h" + +/*********************************************************************************************************************** +Macro definitions +***********************************************************************************************************************/ + +/*********************************************************************************************************************** +Typedef definitions +***********************************************************************************************************************/ + +/*********************************************************************************************************************** +Imported global variables and functions (from other files) +***********************************************************************************************************************/ + +/*********************************************************************************************************************** +Exported global variables (to be accessed by other files) +***********************************************************************************************************************/ + +/*********************************************************************************************************************** +Private global variables and functions +***********************************************************************************************************************/ + +fsp_err_t R_SCE_EcdsaNistP256SignatureVerificationSub(uint32_t *InData_KeyIndex, uint32_t *InData_MsgDgst, uint32_t *InData_Signature) +{ + uint32_t iLoop = 0U; + uint32_t iLoop1 = 0U; + uint32_t iLoop2 = 0U; + int32_t jLoop = 0U; + uint32_t kLoop = 0U; + uint32_t oLoop = 0U; + uint32_t oLoop1 = 0U; + uint32_t oLoop2 = 0U; + uint32_t dummy = 0U; + uint32_t KEY_ADR = 0U; + uint32_t OFS_ADR = 0U; + uint32_t MAX_CNT2 = 0U; + (void)iLoop; + (void)iLoop1; + (void)iLoop2; + (void)jLoop; + (void)kLoop; + (void)oLoop; + (void)oLoop1; + (void)oLoop2; + (void)dummy; + (void)KEY_ADR; + (void)OFS_ADR; + (void)MAX_CNT2; + if (0x0U != (SCE->REG_1BCH & 0x1fU)) + { + return FSP_ERR_CRYPTO_SCE_RESOURCE_CONFLICT; + } + SCE->REG_84H = 0x00009e03U; + SCE->REG_108H = 0x00000000U; + SCE->REG_ECH = 0x00000bdeU; + SCE->REG_104H = 0x00001768U; + SCE->REG_E0H = 0x8098001eU; + for (iLoop = 0; iLoop < 16; iLoop = iLoop + 1) + { + /* WAIT_LOOP */ + while (1U != SCE->REG_104H_b.B31) + { + /* waiting */ + } + SCE->REG_100H = InData_Signature[iLoop + 0]; + } + for (iLoop = 0; iLoop < 8; iLoop = iLoop + 1) + { + /* WAIT_LOOP */ + while (1U != SCE->REG_104H_b.B31) + { + /* waiting */ + } + SCE->REG_100H = InData_MsgDgst[iLoop + 0]; + } + SCE->REG_28H = 0x00870001U; + SCE->REG_104H = 0x00000068U; + SCE->REG_E0H = 0x800100e0U; + /* WAIT_LOOP */ + while (1U != SCE->REG_104H_b.B31) + { + /* waiting */ + } + SCE->REG_100H = InData_KeyIndex[0]; + SCE->REG_104H = 0x00000058U; + SCE->REG_E0H = 0x800103a0U; + /* WAIT_LOOP */ + while (1U != SCE->REG_104H_b.B31) + { + /* waiting */ + } + SCE->REG_100H = change_endian_long(0x0000009eU); + R_SCE_func101(0x584681d8U, 0xbdafbbbdU, 0x816b5be5U, 0x879e996fU); + R_SCE_func043(); + SCE->REG_ECH = 0x0000b4e0U; + SCE->REG_ECH = 0x00000016U; + SCE->REG_104H = 0x00000058U; + SCE->REG_E0H = 0x800103a0U; + /* WAIT_LOOP */ + while (1U != SCE->REG_104H_b.B31) + { + /* waiting */ + } + SCE->REG_100H = change_endian_long(0x0000009eU); + R_SCE_func101(0x152b19cbU, 0xc060b615U, 0xc1845cb9U, 0x02e68eadU); + R_SCE_func044(); + SCE->REG_104H = 0x00000052U; + SCE->REG_C4H = 0x00040804U; + /* WAIT_LOOP */ + while (1U != SCE->REG_104H_b.B31) + { + /* waiting */ + } + SCE->REG_100H = change_endian_long(0x00000000U); + SCE->REG_104H = 0x00000f62U; + SCE->REG_D0H = 0x40000300U; + SCE->REG_C4H = 0x02e08887U; + /* WAIT_LOOP */ + while (1U != SCE->REG_104H_b.B31) + { + /* waiting */ + } + SCE->REG_100H = InData_KeyIndex[1]; + SCE->REG_100H = InData_KeyIndex[2]; + SCE->REG_100H = InData_KeyIndex[3]; + SCE->REG_100H = InData_KeyIndex[4]; + /* WAIT_LOOP */ + while (1U != SCE->REG_104H_b.B31) + { + /* waiting */ + } + SCE->REG_100H = InData_KeyIndex[5]; + SCE->REG_100H = InData_KeyIndex[6]; + SCE->REG_100H = InData_KeyIndex[7]; + SCE->REG_100H = InData_KeyIndex[8]; + SCE->REG_00H = 0x00003223U; + SCE->REG_2CH = 0x0000009bU; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + /* WAIT_LOOP */ + while (1U != SCE->REG_104H_b.B31) + { + /* waiting */ + } + SCE->REG_100H = InData_KeyIndex[9]; + SCE->REG_100H = InData_KeyIndex[10]; + SCE->REG_100H = InData_KeyIndex[11]; + SCE->REG_100H = InData_KeyIndex[12]; + /* WAIT_LOOP */ + while (1U != SCE->REG_104H_b.B31) + { + /* waiting */ + } + SCE->REG_100H = InData_KeyIndex[13]; + SCE->REG_100H = InData_KeyIndex[14]; + SCE->REG_100H = InData_KeyIndex[15]; + SCE->REG_100H = InData_KeyIndex[16]; + SCE->REG_00H = 0x00003223U; + SCE->REG_2CH = 0x00000091U; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + SCE->REG_104H = 0x00000362U; + SCE->REG_D0H = 0x40000000U; + SCE->REG_C4H = 0x000087b5U; + /* WAIT_LOOP */ + while (1U != SCE->REG_104H_b.B31) + { + /* waiting */ + } + SCE->REG_100H = InData_KeyIndex[17]; + SCE->REG_100H = InData_KeyIndex[18]; + SCE->REG_100H = InData_KeyIndex[19]; + SCE->REG_100H = InData_KeyIndex[20]; + SCE->REG_C4H = 0x00900c45U; + SCE->REG_00H = 0x00002213U; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + R_SCE_func100(0x426170c0U, 0x96b2d644U, 0x73894407U, 0x2a420925U); + SCE->REG_1CH = 0x00400000U; + SCE->REG_1D0H = 0x00000000U; + if (1U == (SCE->REG_1CH_b.B22)) + { + R_SCE_func102(0x4ef50b7aU, 0x53a2345aU, 0x9ab8b8d6U, 0x0afe84bbU); + SCE->REG_1BCH = 0x00000040U; + /* WAIT_LOOP */ + while (0U != SCE->REG_18H_b.B12) + { + /* waiting */ + } + return FSP_ERR_CRYPTO_SCE_KEY_SET_FAIL; + } + else + { + R_SCE_func100(0x8b486f93U, 0x6d98b0e7U, 0x645b2118U, 0xd9a5c2eeU); + SCE->REG_7CH = 0x00000011U; + SCE->REG_ECH = 0x0000b7c0U; + SCE->REG_ECH = 0x00000040U; + SCE->REG_E0H = 0x8188001eU; + SCE->REG_00H = 0x00005823U; + SCE->REG_74H = 0x00000004U; + /* WAIT_LOOP */ + while (0U != SCE->REG_00H_b.B25) + { + /* waiting */ + } + SCE->REG_1CH = 0x00001800U; + SCE->REG_ECH = 0x0000b400U; + SCE->REG_ECH = 0x00000080U; + SCE->REG_E0H = 0x81010000U; + SCE->REG_04H = 0x00000606U; + /* WAIT_LOOP */ + while (1U != SCE->REG_04H_b.B30) + { + /* waiting */ + } + S_RAM[0] = change_endian_long(SCE->REG_100H); + OFS_ADR = S_RAM[0]; + SCE->REG_ECH = 0x00000b5aU; + SCE->REG_ECH = 0x00000b9cU; + SCE->REG_104H = 0x00000058U; + SCE->REG_E0H = 0x800103a0U; + /* WAIT_LOOP */ + while (1U != SCE->REG_104H_b.B31) + { + /* waiting */ + } + SCE->REG_100H = change_endian_long(0x0000009eU); + R_SCE_func101(0xef9ba832U, 0x6dbb85caU, 0xea8ce17cU, 0xd467f51aU); + R_SCE_func073_r2(OFS_ADR); + R_SCE_func100(0xa3192968U, 0xcafbc778U, 0x59fbbd95U, 0x2eee7a6bU); + SCE->REG_1CH = 0x00400000U; + SCE->REG_1D0H = 0x00000000U; + if (1U == (SCE->REG_1CH_b.B22)) + { + R_SCE_func102(0x7a591970U, 0x15e49bafU, 0xc4607f2bU, 0xfdc3a6a3U); + SCE->REG_1BCH = 0x00000040U; + /* WAIT_LOOP */ + while (0U != SCE->REG_18H_b.B12) + { + /* waiting */ + } + return FSP_ERR_CRYPTO_SCE_FAIL; + } + else + { + R_SCE_func102(0x2cc1ca82U, 0xbab96ed1U, 0x20afd3f7U, 0x6c01f9e6U); + SCE->REG_1BCH = 0x00000040U; + /* WAIT_LOOP */ + while (0U != SCE->REG_18H_b.B12) + { + /* waiting */ + } + return FSP_SUCCESS; + } + } +} + +/*********************************************************************************************************************** +End of function ./input_dir/S6C1/Cryptographic/R_SCE_p9e.prc +***********************************************************************************************************************/ diff --git a/ra/fsp/src/r_sce_protected/crypto_procedures_protected/src/sce9/private/inc/r_sce_private.h b/ra/fsp/src/r_sce_protected/crypto_procedures_protected/src/sce9/private/inc/r_sce_private.h index 6436e680b..70d2abd2a 100644 --- a/ra/fsp/src/r_sce_protected/crypto_procedures_protected/src/sce9/private/inc/r_sce_private.h +++ b/ra/fsp/src/r_sce_protected/crypto_procedures_protected/src/sce9/private/inc/r_sce_private.h @@ -558,6 +558,11 @@ fsp_err_t R_SCE_EcdsaSignatureVerificationSub(uint32_t * InData_CurveType, uint32_t * InData_MsgDgst, uint32_t * InData_Signature); +/** @retval FSP_SUCCESS @retval FSP_ERR_CRYPTO_SCE_FAIL @retval FSP_ERR_CRYPTO_SCE_RESOURCE_CONFLICT @retval FSP_ERR_CRYPTO_SCE_KEY_SET_FAIL **/ +fsp_err_t R_SCE_EcdsaNistP256SignatureVerificationSub(uint32_t *InData_KeyIndex, + uint32_t *InData_MsgDgst, + uint32_t *InData_Signature); + /** @retval FSP_SUCCESS @retval FSP_ERR_CRYPTO_SCE_FAIL @retval FSP_ERR_CRYPTO_SCE_RESOURCE_CONFLICT @retval FSP_ERR_CRYPTO_SCE_KEY_SET_FAIL **/ fsp_err_t R_SCE_EcdsaP384SignatureVerificationSub(uint32_t * InData_CurveType, uint32_t * InData_KeyIndex, @@ -632,6 +637,7 @@ void R_SCE_func064(uint32_t ARG1, uint32_t * ARG2); void R_SCE_func068(void); void R_SCE_func070_r2(uint32_t ARG1); void R_SCE_func071_r2(uint32_t ARG1); +void R_SCE_func073_r2(uint32_t ARG1); void R_SCE_func074_r1(void); void R_SCE_func075_r1(void); void R_SCE_func076(void); diff --git a/ra/fsp/src/r_sce_protected/crypto_procedures_protected/src/sce9/public/r_sce_ecc.c b/ra/fsp/src/r_sce_protected/crypto_procedures_protected/src/sce9/public/r_sce_ecc.c index f88ced989..90d60ae1b 100644 --- a/ra/fsp/src/r_sce_protected/crypto_procedures_protected/src/sce9/public/r_sce_ecc.c +++ b/ra/fsp/src/r_sce_protected/crypto_procedures_protected/src/sce9/public/r_sce_ecc.c @@ -547,8 +547,6 @@ fsp_err_t R_SCE_ECDSA_secp256r1_SignatureVerify (sce_ecdsa_byte_data_t * sce_ecdsa_byte_data_t * message_hash, sce_ecc_public_wrapped_key_t * wrapped_key) { - uint32_t indata_cmd; - uint32_t curvetype; fsp_err_t error_code = FSP_SUCCESS; uint32_t data_buff[SCE_PRV_HASH_WORD_POS_ECDSA_P256 + (HW_SCE_SHA256_HASH_LENGTH_BYTE_SIZE / sizeof(uint32_t))] = { @@ -561,12 +559,8 @@ fsp_err_t R_SCE_ECDSA_secp256r1_SignatureVerify (sce_ecdsa_byte_data_t * return error_code; } - indata_cmd = change_endian_long(SCE_ECC_KEY_LENGTH_256); - curvetype = change_endian_long(SCE_ECC_CURVE_TYPE_NIST); - error_code = R_SCE_EcdsaSignatureVerificationSub( + error_code = R_SCE_EcdsaNistP256SignatureVerificationSub( /* Casting uint32_t pointer is used for address. */ - &curvetype, - &indata_cmd, (uint32_t *) &wrapped_key->value, (uint32_t *) data_buff, (uint32_t *) signature->pdata); diff --git a/ra/fsp/src/r_sci_uart/r_sci_uart.c b/ra/fsp/src/r_sci_uart/r_sci_uart.c index 03084d462..8a4a005a4 100644 --- a/ra/fsp/src/r_sci_uart/r_sci_uart.c +++ b/ra/fsp/src/r_sci_uart/r_sci_uart.c @@ -298,7 +298,8 @@ const uart_api_t g_uart_on_sci = * @retval FSP_SUCCESS Channel opened successfully. * @retval FSP_ERR_ASSERTION Pointer to UART control block or configuration structure is NULL. * @retval FSP_ERR_IP_CHANNEL_NOT_PRESENT The requested channel does not exist on this MCU. - * @retval FSP_ERR_INVALID_ARGUMENT Flow control is enabled but flow control pin is not defined. + * @retval FSP_ERR_INVALID_ARGUMENT Flow control is enabled but flow control pin is not defined or selected channel + * does not support "Hardware CTS and Hardware RTS" flow control. * @retval FSP_ERR_ALREADY_OPEN Control block has already been opened or channel is being used by another * instance. Call close() then open() to reconfigure. * @@ -330,6 +331,12 @@ fsp_err_t R_SCI_UART_Open (uart_ctrl_t * const p_api_ctrl, uart_cfg_t const * co FSP_ERR_INVALID_ARGUMENT); } + if (((sci_uart_extended_cfg_t *) p_cfg->p_extend)->flow_control == SCI_UART_FLOW_CONTROL_HARDWARE_CTSRTS) + { + FSP_ERROR_RETURN((0U != (((1U << (p_cfg->channel)) & BSP_FEATURE_SCI_UART_CSTPEN_CHANNELS))), + FSP_ERR_INVALID_ARGUMENT); + } + FSP_ASSERT(p_cfg->rxi_irq >= 0); FSP_ASSERT(p_cfg->txi_irq >= 0); FSP_ASSERT(p_cfg->tei_irq >= 0); @@ -1299,8 +1306,17 @@ static void r_sci_uart_config_set (sci_uart_instance_ctrl_t * const p_ctrl, uart sci_uart_extended_cfg_t * p_extend = (sci_uart_extended_cfg_t *) p_cfg->p_extend; - /* Configure CTS flow control if CTS/RTS flow control is enabled. */ - p_ctrl->p_reg->SPMR = ((uint8_t) (p_extend->flow_control << R_SCI0_SPMR_CTSE_Pos) & R_SCI0_SPMR_CTSE_Msk); + /* Configure flow control if CTS/RTS flow control is enabled. */ +#if BSP_FEATURE_SCI_UART_CSTPEN_CHANNELS + if (p_extend->flow_control == SCI_UART_FLOW_CONTROL_HARDWARE_CTSRTS) + { + p_ctrl->p_reg->SPMR = ((uint8_t) (1U << R_SCI0_SPMR_CSTPEN_Pos) & R_SCI0_SPMR_CSTPEN_Msk); + } + else +#endif + { + p_ctrl->p_reg->SPMR = ((uint8_t) (p_extend->flow_control << R_SCI0_SPMR_CTSE_Pos) & R_SCI0_SPMR_CTSE_Msk); + } uint32_t semr = 0; @@ -1625,7 +1641,7 @@ void sci_uart_txi_isr (void) * This interrupt also calls the callback function for RTS pin control if it is registered in R_SCI_UART_Open(). This is * special functionality to expand SCI hardware capability and make RTS/CTS hardware flow control possible. If macro * 'SCI_UART_CFG_FLOW_CONTROL_SUPPORT' is set, it is called at the beginning in this function to set the RTS pin high, - * then it is it is called again just before leaving this function to set the RTS pin low. + * then it is called again just before leaving this function to set the RTS pin low. * @retval none **********************************************************************************************************************/ void sci_uart_rxi_isr (void) diff --git a/ra/fsp/src/r_usb_basic/src/driver/inc/r_usb_extern.h b/ra/fsp/src/r_usb_basic/src/driver/inc/r_usb_extern.h index 08108f2a2..36e20a913 100644 --- a/ra/fsp/src/r_usb_basic/src/driver/inc/r_usb_extern.h +++ b/ra/fsp/src/r_usb_basic/src/driver/inc/r_usb_extern.h @@ -486,6 +486,12 @@ uint16_t usb_hstd_get_string_desc(usb_utr_t * ptr, uint16_t addr, uint16_t strin uint16_t usb_hstd_set_feature(usb_utr_t * ptr, uint16_t addr, uint16_t epnum); uint16_t usb_hstd_get_config_desc(usb_utr_t * ptr, uint16_t addr, uint16_t length); + #if ((BSP_CFG_RTOS == 1) && defined(USB_CFG_HHID_USE)) +void usb_hid_set_protocol(usb_utr_t * ptr, uint16_t addr, uint16_t setaddr); +void usb_hid_get_string_desc(usb_utr_t * ptr, uint16_t addr, uint16_t string); + + #endif + #else /* #if (BSP_CFG_RTOS != 0) */ uint16_t usb_hstd_get_string_desc(usb_utr_t * ptr, uint16_t addr, uint16_t string, usb_cb_t complete); uint16_t usb_hstd_set_feature(usb_utr_t * ptr, uint16_t addr, uint16_t epnum, usb_cb_t complete); diff --git a/ra/fsp/src/r_usb_basic/src/driver/r_usb_hmanager.c b/ra/fsp/src/r_usb_basic/src/driver/r_usb_hmanager.c index 2c2bbe7a9..1a9a13912 100644 --- a/ra/fsp/src/r_usb_basic/src/driver/r_usb_hmanager.c +++ b/ra/fsp/src/r_usb_basic/src/driver/r_usb_hmanager.c @@ -40,12 +40,18 @@ * Macro definitions ******************************************************************************/ - #define USB_PET_VID (0x1a0a) /* USB-PET Vendor ID */ - #define USB_PET_PID (0x0200) /* USB-PET Product ID (Use Embedded Host Test) */ - #define USB_VALUE_FFH (0xFF) - #define USB_VALUE_40H (0x40) - #define USB_VALUE_100 (100) - #define USB_VALUE_3000 (3000) + #define USB_PET_VID (0x1a0a) /* USB-PET Vendor ID */ + #define USB_PET_PID (0x0200) /* USB-PET Product ID (Use Embedded Host Test) */ + #define USB_VALUE_FFH (0xFF) + #define USB_VALUE_40H (0x40) + #define USB_VALUE_100 (100) + #define USB_VALUE_3000 (3000) + #if (BSP_CFG_RTOS == 1) + #if defined(USB_CFG_HHID_USE) + #define USB_HID_SET_PROTOCOL (0x0B00) + #define BOOT_PROTCOL (0) + #endif /* #if defined(USB_CFG_HHID_USE) */ + #endif /* #if (BSP_CFG_RTOS == 1) */ /****************************************************************************** * Private global variables and functions @@ -99,6 +105,18 @@ uint8_t g_usb_hstd_class_data[USB_NUM_USBIP][CLSDATASIZE]; usb_utr_t g_usb_hstd_class_ctrl[USB_NUM_USBIP]; uint16_t g_usb_hstd_class_request[USB_NUM_USBIP][5]; + #if ((BSP_CFG_RTOS == 1) && defined(USB_CFG_HHID_USE)) + +/* Enumeration Table */ +void (* g_usb_hstd_enumaration_process[9])(usb_utr_t *, uint16_t, uint16_t) = +{ + usb_hstd_enum_get_descriptor, usb_hstd_enum_set_address, + usb_hstd_enum_get_descriptor, usb_hstd_enum_get_descriptor, + usb_hstd_enum_get_descriptor, usb_hstd_enum_get_descriptor, + usb_hstd_enum_set_configuration, usb_hid_set_protocol, + usb_hid_get_string_desc, +}; + #else /* #if ((BSP_CFG_RTOS == 1) && defined(USB_CFG_HHID_USE)) */ /* Enumeration Table */ void (* g_usb_hstd_enumaration_process[8])(usb_utr_t *, uint16_t, uint16_t) = { @@ -107,6 +125,7 @@ void (* g_usb_hstd_enumaration_process[8])(usb_utr_t *, uint16_t, uint16_t) = usb_hstd_enum_get_descriptor, usb_hstd_enum_get_descriptor, usb_hstd_enum_set_configuration, usb_hstd_enum_dummy_request, }; + #endif /* #if ((BSP_CFG_RTOS == 1) && defined(USB_CFG_HHID_USE)) */ #if USB_CFG_COMPLIANCE == USB_CFG_ENABLE uint16_t g_usb_disp_param_set[USB_NUM_USBIP]; @@ -166,12 +185,13 @@ static void usb_hstd_mgr_chgdevst_cb (usb_utr_t * ptr) * Arguments : usb_utr_t *ptr : Pointer to usb_utr_t structure. * Return : uint16_t : Enumeration status. ******************************************************************************/ + #if ((BSP_CFG_RTOS == 1) && defined(USB_CFG_HHID_USE)) static uint16_t usb_hstd_enumeration (usb_utr_t * ptr) { - #if USB_CFG_COMPLIANCE == USB_CFG_ENABLE + #if USB_CFG_COMPLIANCE == USB_CFG_ENABLE uint16_t vendor_id; uint16_t product_id; - #endif /* USB_CFG_COMPLIANCE == USB_CFG_ENABLE */ + #endif /* USB_CFG_COMPLIANCE == USB_CFG_ENABLE */ uint16_t md; uint16_t flg; @@ -180,16 +200,350 @@ static uint16_t usb_hstd_enumeration (usb_utr_t * ptr) uint8_t * descriptor_table; uint16_t devsel; - #if (BSP_CFG_RTOS == 0) + UX_CONFIGURATION * configuration; + UX_CONFIGURATION * list_configuration; + UX_DEVICE * device; + uint32_t usbx_status = UX_ERROR; + + /* Attach Detect Mode */ + enume_mode = USB_NONDEVICE; + + /* Manager Mode Change */ + switch (p_usb_shstd_mgr_msg[ptr->ip]->result) + { + case USB_CTRL_END: + { + enume_mode = USB_DEVICEENUMERATION; + switch (g_usb_hstd_enum_seq[ptr->ip]) + { + /* Receive Device Descriptor */ + case 0: + { + break; + } + + /* Set Address */ + case 1: + { + descriptor_table = (uint8_t *) g_usb_hstd_device_descriptor[ptr->ip]; + devsel = (uint16_t) (g_usb_hstd_device_addr[ptr->ip] << USB_DEVADDRBIT); + + /* Set device speed */ + usb_hstd_set_dev_addr(ptr, devsel, g_usb_hstd_device_speed[ptr->ip]); + g_usb_hstd_dcp_register[ptr->ip][g_usb_hstd_device_addr[ptr->ip]] = + (uint16_t) ((uint16_t) (descriptor_table[7] & USB_MAXPFIELD) | devsel); + break; + } + + /* Receive Device Descriptor(18) */ + case 2: + { + descriptor_table = (uint8_t *) g_usb_hstd_device_descriptor[ptr->ip]; + _ux_utility_descriptor_parse(descriptor_table, + _ux_system_device_descriptor_structure, + UX_DEVICE_DESCRIPTOR_ENTRIES, + (uint8_t *) &g_p_usbx_device[ptr->ip]->ux_device_descriptor); + + break; + } + + /* Receive Configuration Descriptor(9) */ + case 3: + { + device = g_p_usbx_device[ptr->ip]; + configuration = + _ux_utility_memory_allocate(UX_NO_ALIGN, UX_REGULAR_MEMORY, sizeof(UX_CONFIGURATION)); + configuration->ux_configuration_device = device; + configuration->ux_configuration_handle = (uint32_t) (ALIGN_TYPE) configuration; + if (device->ux_device_first_configuration == UX_NULL) + { + device->ux_device_first_configuration = configuration; + } + else + { + list_configuration = device->ux_device_first_configuration; + while (list_configuration->ux_configuration_next_configuration != UX_NULL) + { + list_configuration = list_configuration->ux_configuration_next_configuration; + } + + list_configuration->ux_configuration_next_configuration = configuration; + } + + descriptor_table = (uint8_t *) g_usb_hstd_config_descriptor[ptr->ip]; + _ux_utility_descriptor_parse(descriptor_table, + _ux_system_configuration_descriptor_structure, + UX_CONFIGURATION_DESCRIPTOR_ENTRIES, + (uint8_t *) &configuration->ux_configuration_descriptor); + + g_p_usbx_configuration = configuration; + + break; + } + + /* Receive Configuration Descriptor(xx) */ + case 4: + { + #if USB_CFG_COMPLIANCE == USB_CFG_ENABLE + descriptor_table = (uint8_t *) g_usb_hstd_device_descriptor[ptr->ip]; + + /* If 'vendor_id' and 'product_id' value is defined by PET, */ + /* system works for compliance test mode. */ + /* Values ??defined by PET is the following. */ + /* vendor_id : 0x1A0A */ + /* product_id : 0x0101 - 0x0108 , 0x0200 */ + + vendor_id = (uint16_t) (descriptor_table[USB_DEV_ID_VENDOR_L] + + ((uint16_t) descriptor_table[USB_DEV_ID_VENDOR_H] << 8)); + + if (0x1A0A == vendor_id) + { + product_id = (uint16_t) (descriptor_table[USB_DEV_ID_PRODUCT_L] + + ((uint16_t) descriptor_table[USB_DEV_ID_PRODUCT_H] << 8)); + + descriptor_table = (uint8_t *) g_usb_hstd_config_descriptor[ptr->ip]; + #if USB_CFG_ELECTRICAL == USB_CFG_ENABLE + if ((0x0100 < product_id) && (product_id < 0x0109)) + { + usb_hstd_electrical_test_mode(ptr, product_id); + enume_mode = USB_NOTTPL; + break; + } + #endif /* USB_CFG_ELECTRICAL == USB_CFG_ENABLE */ + + if (0x0200 == product_id) + { + g_usb_hstd_enum_seq[ptr->ip]++; + break; + } + } + #endif /* USB_CFG_ELECTRICAL == USB_CFG_ENABLE */ + + /* Driver open */ + #if USB_CFG_COMPLIANCE == USB_CFG_ENABLE + g_usb_disp_param_set[ptr->ip] = USB_OFF; + #endif /* USB_CFG_COMPLIANCE == USB_CFG_ENABLE */ + + flg = 0U; + + /* WAIT_LOOP */ + for (md = 0; (md < g_usb_hstd_device_num[ptr->ip]) && (0U == flg); md++) + { + driver = &g_usb_hstd_device_drv[ptr->ip][md]; + if (USB_DETACHED == driver->devstate) + { + uint16_t retval; + retval = usb_hstd_chk_device_class(ptr, driver); + if (USB_OK == retval) + { + driver->devaddr = g_usb_hstd_device_addr[ptr->ip]; + flg = 1; /* break; */ + } + + usbx_status = _ux_host_stack_interfaces_scan(g_p_usbx_configuration, + (uint8_t *) g_usb_hstd_config_descriptor[ptr-> + ip]); + } + } + + #if USB_CFG_COMPLIANCE == USB_CFG_ENABLE + if (USB_ON == g_usb_disp_param_set[ptr->ip]) + { + usb_compliance_disp((void *) &g_usb_disp_param[ptr->ip]); + } + #endif /* USB_CFG_COMPLIANCE == USB_CFG_ENABLE */ + break; + } + + /* Class Check Result */ + case 5: + case 6: + case 7: + case 8: + { + break; + } + + /* Set Configuration */ + case 9: + { + /* Device enumeration function */ + USB_PRINTF0(" Configured Device\n"); + + /* WAIT_LOOP */ + for (md = 0; md < g_usb_hstd_device_num[ptr->ip]; md++) + { + driver = &g_usb_hstd_device_drv[ptr->ip][md]; + if (g_usb_hstd_device_addr[ptr->ip] == driver->devaddr) + { + /* Device state */ + g_usb_hstd_device_info[ptr->ip][g_usb_hstd_device_addr[ptr->ip]][1] = USB_CONFIGURED; + + /* Device speed */ + g_usb_hstd_device_info[ptr->ip][g_usb_hstd_device_addr[ptr->ip]][4] = + g_usb_hstd_device_speed[ptr->ip]; + + /* Device state */ + driver->devstate = USB_CONFIGURED; + + /* Call Back */ + (*driver->devconfig)(ptr, g_usb_hstd_device_addr[ptr->ip], (uint16_t) USB_NO_ARG); + + return USB_COMPLETEPIPESET; + } + } + + enume_mode = USB_COMPLETEPIPESET; + break; + } + + default: + { + break; + } + } + + g_usb_hstd_enum_seq[ptr->ip]++; + + /* Device Enumeration */ + if (USB_DEVICEENUMERATION == enume_mode) + { + switch (g_usb_hstd_enum_seq[ptr->ip]) + { + case 1: + { + (*g_usb_hstd_enumaration_process[1])(ptr, + (uint16_t) USB_DEVICE_0, + g_usb_hstd_device_addr[ptr->ip]); + break; + } + + case 5: + { + (*g_usb_hstd_enumaration_process[8])(ptr, + g_usb_hstd_device_addr[ptr->ip], + 0); + break; + } + + case 6: + { + descriptor_table = (uint8_t *) g_usb_hstd_device_descriptor[ptr->ip]; + + (*g_usb_hstd_enumaration_process[8])(ptr, + g_usb_hstd_device_addr[ptr->ip], + descriptor_table[15]); + break; + } + + case 7: + { + (*g_usb_hstd_enumaration_process[5])(ptr, + g_usb_hstd_device_addr[ptr->ip], + g_usb_hstd_enum_seq[ptr->ip]); + break; + } + + case 8: + { + usbx_status = _ux_host_stack_class_device_scan(g_p_usbx_device[ptr->ip]); + if (UX_SUCCESS != usbx_status) + { + if (usbx_status == UX_NO_CLASS_MATCH) + { + usbx_status = _ux_host_stack_class_interface_scan(g_p_usbx_device[ptr->ip]); + } + } + + break; + } + + case 9: + { + (*g_usb_hstd_enumaration_process[7])(ptr, + g_usb_hstd_device_addr[ptr->ip], + BOOT_PROTCOL); + break; + } + + #if USB_CFG_COMPLIANCE == USB_CFG_ENABLE + case 10: + { + enume_mode = USB_NOTTPL; + break; + } + #endif /* USB_CFG_COMPLIANCE == USB_CFG_ENABLE */ + default: + { + (*g_usb_hstd_enumaration_process[g_usb_hstd_enum_seq[ptr->ip]])(ptr, + g_usb_hstd_device_addr[ptr->ip], + g_usb_hstd_enum_seq[ptr->ip]); + break; + } + } + } + + break; + } + + case USB_DATA_ERR: + { + USB_PRINTF0("### Enumeration is stopped(SETUP or DATA-ERROR)\n"); + usb_hstd_enumeration_err(g_usb_hstd_enum_seq[ptr->ip]); + break; + } + + case USB_DATA_OVR: + { + USB_PRINTF0("### Enumeration is stopped(receive data over)\n"); + usb_hstd_enumeration_err(g_usb_hstd_enum_seq[ptr->ip]); + break; + } + + case USB_DATA_STALL: + { + USB_PRINTF0("### Enumeration is stopped(SETUP or DATA-STALL)\n"); + usb_hstd_enumeration_err(g_usb_hstd_enum_seq[ptr->ip]); + break; + } + + default: + { + USB_PRINTF0("### Enumeration is stopped(result error)\n"); + usb_hstd_enumeration_err(g_usb_hstd_enum_seq[ptr->ip]); + break; + } + } + + return enume_mode; +} + + #else /* #if ((BSP_CFG_RTOS == 1) && defined(USB_CFG_HHID_USE)) */ + +static uint16_t usb_hstd_enumeration (usb_utr_t * ptr) +{ + #if USB_CFG_COMPLIANCE == USB_CFG_ENABLE + uint16_t vendor_id; + uint16_t product_id; + #endif /* USB_CFG_COMPLIANCE == USB_CFG_ENABLE */ + + uint16_t md; + uint16_t flg; + usb_hcdreg_t * driver; + uint16_t enume_mode; /* Enumeration mode (device state) */ + uint8_t * descriptor_table; + uint16_t devsel; + + #if (BSP_CFG_RTOS == 0) usb_instance_ctrl_t ctrl; - #endif /* (BSP_CFG_RTOS == 0) */ + #endif /* (BSP_CFG_RTOS == 0) */ - #if (BSP_CFG_RTOS == 1) + #if (BSP_CFG_RTOS == 1) UX_CONFIGURATION * configuration; UX_CONFIGURATION * list_configuration; UX_DEVICE * device; uint32_t usbx_status = UX_ERROR; - #endif /* BSP_CFG_RTOS == 1 */ + #endif /* BSP_CFG_RTOS == 1 */ /* Attach Detect Mode */ enume_mode = USB_NONDEVICE; @@ -224,13 +578,13 @@ static uint16_t usb_hstd_enumeration (usb_utr_t * ptr) /* Receive Device Descriptor(18) */ case 2: { - #if (BSP_CFG_RTOS == 1) + #if (BSP_CFG_RTOS == 1) descriptor_table = (uint8_t *) g_usb_hstd_device_descriptor[ptr->ip]; _ux_utility_descriptor_parse(descriptor_table, _ux_system_device_descriptor_structure, UX_DEVICE_DESCRIPTOR_ENTRIES, (uint8_t *) &g_p_usbx_device[ptr->ip]->ux_device_descriptor); - #endif /* BSP_CFG_RTOS == 1 */ + #endif /* BSP_CFG_RTOS == 1 */ break; } @@ -238,7 +592,7 @@ static uint16_t usb_hstd_enumeration (usb_utr_t * ptr) /* Receive Configuration Descriptor(9) */ case 3: { - #if (BSP_CFG_RTOS == 1) + #if (BSP_CFG_RTOS == 1) device = g_p_usbx_device[ptr->ip]; configuration = _ux_utility_memory_allocate(UX_NO_ALIGN, UX_REGULAR_MEMORY, sizeof(UX_CONFIGURATION)); @@ -266,7 +620,7 @@ static uint16_t usb_hstd_enumeration (usb_utr_t * ptr) (uint8_t *) &configuration->ux_configuration_descriptor); g_p_usbx_configuration = configuration; - #endif /* BSP_CFG_RTOS == 1 */ + #endif /* BSP_CFG_RTOS == 1 */ break; } @@ -274,7 +628,7 @@ static uint16_t usb_hstd_enumeration (usb_utr_t * ptr) /* Receive Configuration Descriptor(xx) */ case 4: { - #if USB_CFG_COMPLIANCE == USB_CFG_ENABLE + #if USB_CFG_COMPLIANCE == USB_CFG_ENABLE descriptor_table = (uint8_t *) g_usb_hstd_device_descriptor[ptr->ip]; /* If 'vendor_id' and 'product_id' value is defined by PET, */ @@ -292,14 +646,14 @@ static uint16_t usb_hstd_enumeration (usb_utr_t * ptr) ((uint16_t) descriptor_table[USB_DEV_ID_PRODUCT_H] << 8)); descriptor_table = (uint8_t *) g_usb_hstd_config_descriptor[ptr->ip]; - #if USB_CFG_ELECTRICAL == USB_CFG_ENABLE + #if USB_CFG_ELECTRICAL == USB_CFG_ENABLE if ((0x0100 < product_id) && (product_id < 0x0109)) { usb_hstd_electrical_test_mode(ptr, product_id); enume_mode = USB_NOTTPL; break; } - #endif /* USB_CFG_ELECTRICAL == USB_CFG_ENABLE */ + #endif /* USB_CFG_ELECTRICAL == USB_CFG_ENABLE */ if (0x0200 == product_id) { @@ -307,12 +661,12 @@ static uint16_t usb_hstd_enumeration (usb_utr_t * ptr) break; } } - #endif /* USB_CFG_ELECTRICAL == USB_CFG_ENABLE */ + #endif /* USB_CFG_ELECTRICAL == USB_CFG_ENABLE */ /* Driver open */ - #if USB_CFG_COMPLIANCE == USB_CFG_ENABLE + #if USB_CFG_COMPLIANCE == USB_CFG_ENABLE g_usb_disp_param_set[ptr->ip] = USB_OFF; - #endif /* USB_CFG_COMPLIANCE == USB_CFG_ENABLE */ + #endif /* USB_CFG_COMPLIANCE == USB_CFG_ENABLE */ flg = 0U; @@ -324,19 +678,19 @@ static uint16_t usb_hstd_enumeration (usb_utr_t * ptr) { uint16_t retval; retval = usb_hstd_chk_device_class(ptr, driver); - #if (BSP_CFG_RTOS != 0) + #if (BSP_CFG_RTOS != 0) if (USB_OK == retval) { driver->devaddr = g_usb_hstd_device_addr[ptr->ip]; flg = 1; /* break; */ } - #if (BSP_CFG_RTOS == 1) + #if (BSP_CFG_RTOS == 1) usbx_status = _ux_host_stack_interfaces_scan(g_p_usbx_configuration, (uint8_t *) g_usb_hstd_config_descriptor[ptr-> ip]); - #endif /* BSP_CFG_RTOS == 1 */ - #else /* (BSP_CFG_RTOS != 0) */ + #endif /* BSP_CFG_RTOS == 1 */ + #else /* (BSP_CFG_RTOS != 0) */ g_usb_hstd_check_enu_result[ptr->ip] = USB_OK; /* In this function, check device class of */ @@ -347,38 +701,38 @@ static uint16_t usb_hstd_enumeration (usb_utr_t * ptr) usb_shstd_reg_pointer[ptr->ip] = md; flg = 1; /* break; */ } - #endif /* (BSP_CFG_RTOS != 0) */ + #endif /* (BSP_CFG_RTOS != 0) */ } } - #if USB_CFG_COMPLIANCE == USB_CFG_ENABLE + #if USB_CFG_COMPLIANCE == USB_CFG_ENABLE if (USB_ON == g_usb_disp_param_set[ptr->ip]) { usb_compliance_disp((void *) &g_usb_disp_param[ptr->ip]); } - #endif /* USB_CFG_COMPLIANCE == USB_CFG_ENABLE */ + #endif /* USB_CFG_COMPLIANCE == USB_CFG_ENABLE */ - #if (BSP_CFG_RTOS == 0) + #if (BSP_CFG_RTOS == 0) if (1 != flg) { ctrl.device_address = (uint8_t) g_usb_hstd_device_addr[ptr->ip]; /* USB Device address */ ctrl.module_number = ptr->ip; /* Module number setting */ usb_set_event(USB_STATUS_NOT_SUPPORT, &ctrl); /* Set Event() */ - #if USB_CFG_COMPLIANCE == USB_CFG_ENABLE + #if USB_CFG_COMPLIANCE == USB_CFG_ENABLE g_usb_hstd_enum_seq[ptr->ip] = g_usb_hstd_enum_seq[ptr->ip] + 2; - #else /* USB_CFG_COMPLIANCE == USB_CFG_ENABLE */ + #else /* USB_CFG_COMPLIANCE == USB_CFG_ENABLE */ g_usb_hstd_enum_seq[ptr->ip]++; - #endif /* USB_CFG_COMPLIANCE == USB_CFG_ENABLE */ + #endif /* USB_CFG_COMPLIANCE == USB_CFG_ENABLE */ } - #endif /* (BSP_CFG_RTOS == 0) */ + #endif /* (BSP_CFG_RTOS == 0) */ break; } /* Class Check Result */ case 5: { - #if (BSP_CFG_RTOS == 0) + #if (BSP_CFG_RTOS == 0) switch (g_usb_hstd_check_enu_result[ptr->ip]) { case USB_OK: @@ -402,7 +756,7 @@ static uint16_t usb_hstd_enumeration (usb_utr_t * ptr) break; } } - #endif /* (BSP_CFG_RTOS == 0) */ + #endif /* (BSP_CFG_RTOS == 0) */ break; } @@ -454,23 +808,25 @@ static uint16_t usb_hstd_enumeration (usb_utr_t * ptr) { case 1: { - (*g_usb_hstd_enumaration_process[1])(ptr, (uint16_t) USB_DEVICE_0, + (*g_usb_hstd_enumaration_process[1])(ptr, + (uint16_t) USB_DEVICE_0, g_usb_hstd_device_addr[ptr->ip]); break; } case 5: { - #if (BSP_CFG_RTOS != 0) - (*g_usb_hstd_enumaration_process[5])(ptr, g_usb_hstd_device_addr[ptr->ip], + #if (BSP_CFG_RTOS != 0) + (*g_usb_hstd_enumaration_process[5])(ptr, + g_usb_hstd_device_addr[ptr->ip], g_usb_hstd_enum_seq[ptr->ip]); - #endif /* (BSP_CFG_RTOS != 0) */ + #endif /* (BSP_CFG_RTOS != 0) */ break; } case 6: { - #if (BSP_CFG_RTOS == 1) + #if (BSP_CFG_RTOS == 1) usbx_status = _ux_host_stack_class_device_scan(g_p_usbx_device[ptr->ip]); if (UX_SUCCESS != usbx_status) { @@ -479,25 +835,25 @@ static uint16_t usb_hstd_enumeration (usb_utr_t * ptr) usbx_status = _ux_host_stack_class_interface_scan(g_p_usbx_device[ptr->ip]); } } - - #else /* (BSP_CFG_RTOS == 1) */ + #else /* (BSP_CFG_RTOS == 1) */ descriptor_table = (uint8_t *) g_usb_hstd_config_descriptor[ptr->ip]; /* Device state */ g_usb_hstd_device_info[ptr->ip][g_usb_hstd_device_addr[ptr->ip]][2] = descriptor_table[5]; - (*g_usb_hstd_enumaration_process[6])(ptr, g_usb_hstd_device_addr[ptr->ip], + (*g_usb_hstd_enumaration_process[6])(ptr, + g_usb_hstd_device_addr[ptr->ip], (uint16_t) (descriptor_table[5])); - #endif /* (BSP_CFG_RTOS == 1) */ + #endif /* (BSP_CFG_RTOS == 1) */ break; } - #if USB_CFG_COMPLIANCE == USB_CFG_ENABLE + #if USB_CFG_COMPLIANCE == USB_CFG_ENABLE case 7: { enume_mode = USB_NOTTPL; break; } - #endif /* USB_CFG_COMPLIANCE == USB_CFG_ENABLE */ + #endif /* USB_CFG_COMPLIANCE == USB_CFG_ENABLE */ default: { (*g_usb_hstd_enumaration_process[g_usb_hstd_enum_seq[ptr->ip]])(ptr, @@ -543,6 +899,8 @@ static uint16_t usb_hstd_enumeration (usb_utr_t * ptr) return enume_mode; } + #endif /* #if ((BSP_CFG_RTOS == 1) && defined(USB_CFG_HHID_USE)) */ + /****************************************************************************** * End of function usb_hstd_enumeration ******************************************************************************/ @@ -892,8 +1250,12 @@ void usb_hstd_enum_get_descriptor (usb_utr_t * ptr, uint16_t addr, uint16_t cnt_ /* continue */ case 1: - /* continue */ + /* continue */ + #if ((BSP_CFG_RTOS == 1) && defined(USB_CFG_HHID_USE)) + case 7: + #else case 5: + #endif { usb_shstd_std_request[ptr->ip][0] = USB_GET_DESCRIPTOR | USB_DEV_TO_HOST | USB_STANDARD | USB_DEVICE; usb_shstd_std_request[ptr->ip][1] = (uint16_t) USB_DEV_DESCRIPTOR; @@ -1661,6 +2023,7 @@ uint16_t usb_hstd_set_feature (usb_utr_t * ptr, uint16_t addr, uint16_t epnum, u return usb_hstd_cmd_submit(ptr); #else /* (BSP_CFG_RTOS != 0) */ + return usb_hstd_cmd_submit(ptr, complete); #endif /* (BSP_CFG_RTOS != 0) */ } @@ -1669,6 +2032,87 @@ uint16_t usb_hstd_set_feature (usb_utr_t * ptr, uint16_t addr, uint16_t epnum, u * End of function usb_hstd_set_feature ******************************************************************************/ + #if ((BSP_CFG_RTOS == 1) && defined(USB_CFG_HHID_USE)) + +/****************************************************************************** + * Function Name : usb_hid_set_protocol + * Description : Send SetProtocol to the connected USB device. + * Arguments : usb_utr_t *ptr : Pointer to usb_utr_t structure + * : uint16_t addr : Device Address. + * : uint16_t protocol : New address. + * Return : none + ******************************************************************************/ +void usb_hid_set_protocol (usb_utr_t * ptr, uint16_t addr, uint16_t protocol) +{ + usb_shstd_std_request[ptr->ip][0] = (USB_HID_SET_PROTOCOL | USB_HOST_TO_DEV | USB_CLASS | USB_INTERFACE); + usb_shstd_std_request[ptr->ip][1] = protocol; + usb_shstd_std_request[ptr->ip][2] = (uint16_t) 0x0000; + usb_shstd_std_request[ptr->ip][3] = (uint16_t) 0x0000; + usb_shstd_std_request[ptr->ip][4] = addr; + usb_shstd_std_req_msg[ptr->ip].keyword = (uint16_t) USB_PIPE0; + usb_shstd_std_req_msg[ptr->ip].tranlen = (uint32_t) usb_shstd_std_request[ptr->ip][3]; + usb_shstd_std_req_msg[ptr->ip].p_setup = usb_shstd_std_request[ptr->ip]; + usb_shstd_std_req_msg[ptr->ip].status = USB_DATA_NONE; + usb_shstd_std_req_msg[ptr->ip].complete = (usb_cb_t) &usb_hstd_submit_result; + usb_shstd_std_req_msg[ptr->ip].segment = USB_TRAN_END; + + usb_shstd_std_req_msg[ptr->ip].ipp = ptr->ipp; + usb_shstd_std_req_msg[ptr->ip].ip = ptr->ip; + usb_shstd_std_req_msg[ptr->ip].p_transfer_rx = ptr->p_transfer_rx; + usb_shstd_std_req_msg[ptr->ip].p_transfer_tx = ptr->p_transfer_tx; + + usb_hstd_transfer_start_req(&usb_shstd_std_req_msg[ptr->ip]); +} + +/****************************************************************************** + * Function Name : usb_hid_get_string_desc + * Description : Set GetDescriptor + * Arguments : usb_utr_t *ptr : Pointer to usb_utr_t structure + * : uint16_t addr : device address + * : uint16_t string : descriptor index + ******************************************************************************/ +void usb_hid_get_string_desc (usb_utr_t * ptr, uint16_t addr, uint16_t string) +{ + uint16_t i; + + if (0 == string) + { + usb_shstd_std_request[ptr->ip][2] = (uint16_t) 0x0000; + usb_shstd_std_request[ptr->ip][3] = (uint16_t) 0x0004; + } + else + { + /* Set LanguageID */ + usb_shstd_std_request[ptr->ip][2] = (uint16_t) (g_usb_hstd_class_data[ptr->ip][2]); + usb_shstd_std_request[ptr->ip][2] |= (uint16_t) ((uint16_t) (g_usb_hstd_class_data[ptr->ip][3]) << 8); + usb_shstd_std_request[ptr->ip][3] = (uint16_t) CLSDATASIZE; + } + + usb_shstd_std_request[ptr->ip][0] = USB_GET_DESCRIPTOR | USB_DEV_TO_HOST | USB_STANDARD | USB_DEVICE; + usb_shstd_std_request[ptr->ip][1] = (uint16_t) (USB_STRING_DESCRIPTOR + string); + usb_shstd_std_request[ptr->ip][4] = addr; + + /* WAIT_LOOP */ + for (i = 0; i < usb_shstd_std_request[ptr->ip][3]; i++) + { + g_usb_hstd_class_data[ptr->ip][i] = (uint8_t) USB_VALUE_FFH; + } + + usb_shstd_std_req_msg[ptr->ip].keyword = USB_PIPE0; + usb_shstd_std_req_msg[ptr->ip].tranlen = (uint32_t) usb_shstd_std_request[ptr->ip][3]; + usb_shstd_std_req_msg[ptr->ip].p_setup = usb_shstd_std_request[ptr->ip]; + usb_shstd_std_req_msg[ptr->ip].complete = &usb_hstd_submit_result; + usb_shstd_std_req_msg[ptr->ip].segment = USB_TRAN_END; + usb_shstd_std_req_msg[ptr->ip].p_tranadr = (void *) g_usb_hstd_class_data[ptr->ip]; + + usb_shstd_std_req_msg[ptr->ip].ip = ptr->ip; + usb_shstd_std_req_msg[ptr->ip].ipp = ptr->ipp; + + usb_hstd_transfer_start_req(&usb_shstd_std_req_msg[ptr->ip]); +} + + #endif /* #if ((BSP_CFG_RTOS == 1) && defined(USB_CFG_HHID_USE)) */ + /****************************************************************************** * Function Name : usb_hstd_get_config_desc * Description : Set GetConfigurationDescriptor @@ -1709,6 +2153,7 @@ uint16_t usb_hstd_get_config_desc (usb_utr_t * ptr, uint16_t addr, uint16_t leng return usb_hstd_cmd_submit(ptr); #else /* (BSP_CFG_RTOS != 0) */ + return usb_hstd_cmd_submit(ptr, complete); #endif /* (BSP_CFG_RTOS != 0) */ } @@ -1801,6 +2246,7 @@ uint16_t usb_hstd_get_string_desc (usb_utr_t * ptr, uint16_t addr, uint16_t stri return usb_hstd_cmd_submit(ptr); #else /* (BSP_CFG_RTOS != 0) */ + return usb_hstd_cmd_submit(ptr, complete); #endif /* (BSP_CFG_RTOS != 0) */ } @@ -1986,7 +2432,6 @@ void usb_hstd_mgr_task (void * stacd) #endif /* #if (BSP_CFG_RTOS == 1) */ #if (BSP_CFG_RTOS != 0) - /* WAIT_LOOP */ while (1) { @@ -2025,6 +2470,11 @@ void usb_hstd_mgr_task (void * stacd) /* End of reset signal */ case USB_DEFAULT: { + #if (BSP_CFG_RTOS == 1) + #if defined(USB_CFG_HHID_USE) + usb_host_usbx_attach_init(ptr->ip); + #endif /* #if defined(USB_CFG_HHID_USE) */ + #endif /* BSP_CFG_RTOS == 1 */ g_usb_hstd_device_speed[ptr->ip] = p_usb_shstd_mgr_msg[ptr->ip]->result; /* Set device speed */ @@ -2070,7 +2520,6 @@ void usb_hstd_mgr_task (void * stacd) { /* This Resume Sorce is moved to usb_hResuCont() by nonOS */ #if (BSP_CFG_RTOS != 0) - /* WAIT_LOOP */ for (md = 0; md < g_usb_hstd_device_num[ptr->ip]; md++) { @@ -2126,7 +2575,6 @@ void usb_hstd_mgr_task (void * stacd) case USB_RESUME_PROCESS: { #if (BSP_CFG_RTOS == 0) - /* Resume Sequence Number is 0 */ usb_hstd_resu_cont(ptr, USB_DEVICEADDR); #endif /* (BSP_CFG_RTOS == 0) */ @@ -2175,7 +2623,6 @@ void usb_hstd_mgr_task (void * stacd) switch (g_usb_hstd_mgr_mode[ptr->ip]) { #if (BSP_CFG_RTOS == 0) - /* Resume */ case USB_RESUME_PROCESS: { @@ -2197,69 +2644,69 @@ void usb_hstd_mgr_task (void * stacd) #if (BSP_CFG_RTOS == 1) case USB_CONFIGURED: #endif /* #if (BSP_CFG_RTOS == 1) */ + { + /* Peripheral Device Speed support check */ + connect_speed = usb_hstd_support_speed_check(ptr); + if (USB_NOCONNECT != connect_speed) { - /* Peripheral Device Speed support check */ - connect_speed = usb_hstd_support_speed_check(ptr); - if (USB_NOCONNECT != connect_speed) + enume_mode = usb_hstd_enumeration(ptr); + switch (enume_mode) { - enume_mode = usb_hstd_enumeration(ptr); - switch (enume_mode) + /* Detach Mode */ + case USB_NONDEVICE: { - /* Detach Mode */ - case USB_NONDEVICE: - { - USB_PRINTF1("### Enumeration error (address%d)\n", - g_usb_hstd_device_addr[ptr->ip]); - g_usb_hstd_mgr_mode[ptr->ip] = USB_DETACHED; - - if ((USB_DO_RESET_AND_ENUMERATION == usb_shstd_mgr_msginfo[ptr->ip]) || - (USB_PORT_ENABLE == usb_shstd_mgr_msginfo[ptr->ip])) - { - usb_hstd_mgr_chgdevst_cb(ptr); - } + USB_PRINTF1("### Enumeration error (address%d)\n", + g_usb_hstd_device_addr[ptr->ip]); + g_usb_hstd_mgr_mode[ptr->ip] = USB_DETACHED; - break; - } - - /* Detach Mode */ - case USB_NOTTPL: + if ((USB_DO_RESET_AND_ENUMERATION == usb_shstd_mgr_msginfo[ptr->ip]) || + (USB_PORT_ENABLE == usb_shstd_mgr_msginfo[ptr->ip])) { - USB_PRINTF1("### Not support device (address%d)\n", - g_usb_hstd_device_addr[ptr->ip]); - g_usb_hstd_mgr_mode[ptr->ip] = USB_DETACHED; + usb_hstd_mgr_chgdevst_cb(ptr); + } - if ((USB_DO_RESET_AND_ENUMERATION == usb_shstd_mgr_msginfo[ptr->ip]) || - (USB_PORT_ENABLE == usb_shstd_mgr_msginfo[ptr->ip])) - { - usb_hstd_mgr_chgdevst_cb(ptr); - } + break; + } - break; - } + /* Detach Mode */ + case USB_NOTTPL: + { + USB_PRINTF1("### Not support device (address%d)\n", + g_usb_hstd_device_addr[ptr->ip]); + g_usb_hstd_mgr_mode[ptr->ip] = USB_DETACHED; - case USB_COMPLETEPIPESET: + if ((USB_DO_RESET_AND_ENUMERATION == usb_shstd_mgr_msginfo[ptr->ip]) || + (USB_PORT_ENABLE == usb_shstd_mgr_msginfo[ptr->ip])) { - g_usb_hstd_mgr_mode[ptr->ip] = USB_CONFIGURED; + usb_hstd_mgr_chgdevst_cb(ptr); + } - if ((USB_DO_RESET_AND_ENUMERATION == usb_shstd_mgr_msginfo[ptr->ip]) || - (USB_PORT_ENABLE == usb_shstd_mgr_msginfo[ptr->ip])) - { - usb_hstd_mgr_chgdevst_cb(ptr); - } + break; + } - break; - } + case USB_COMPLETEPIPESET: + { + g_usb_hstd_mgr_mode[ptr->ip] = USB_CONFIGURED; - default: + if ((USB_DO_RESET_AND_ENUMERATION == usb_shstd_mgr_msginfo[ptr->ip]) || + (USB_PORT_ENABLE == usb_shstd_mgr_msginfo[ptr->ip])) { - break; + usb_hstd_mgr_chgdevst_cb(ptr); } + + break; } - } - break; + default: + { + break; + } + } } + break; + } + default: { break; @@ -2357,7 +2804,6 @@ void usb_hstd_mgr_task (void * stacd) g_usb_hstd_mgr_mode[ptr->ip] = USB_DEFAULT; #if USB_CFG_BC == USB_CFG_ENABLE - /* Call Back */ /*USB_BC_ATTACH(ptr, g_usb_hstd_device_addr[ptr->ip], (uint16_t)g_usb_hstd_bc[ptr->ip].state); */ if (USB_BC_STATE_CDP == g_usb_hstd_bc[ptr->ip].state) @@ -2369,7 +2815,9 @@ void usb_hstd_mgr_task (void * stacd) #endif /* USB_CFG_BC == USB_CFG_ENABLE */ #if (BSP_CFG_RTOS == 1) + #if !defined(USB_CFG_HHID_USE) usb_host_usbx_attach_init(ptr->ip); + #endif /* #if !defined(USB_CFG_HHID_USE) */ #endif /* BSP_CFG_RTOS == 1 */ usb_hstd_attach_function(); @@ -2557,7 +3005,6 @@ void usb_hstd_mgr_task (void * stacd) { continue; } - #else /* (BSP_CFG_RTOS != 0) */ if (0 == result) { diff --git a/ra/fsp/src/r_usb_pmsc/src/inc/r_usb_patapi.h b/ra/fsp/src/r_usb_pmsc/src/inc/r_usb_patapi.h index 8dfbf41bd..8651bf398 100644 --- a/ra/fsp/src/r_usb_pmsc/src/inc/r_usb_patapi.h +++ b/ra/fsp/src/r_usb_pmsc/src/inc/r_usb_patapi.h @@ -29,9 +29,6 @@ * Macro definitions ***********************************************************************************************************************/ -/* Storage sector size */ -#define USB_ATAPI_BLOCK_UNIT (0x0200UL) - /* Operation when responding with a short packet to a command */ /* 0: Respond to 0x00 with CSW with setting PIPE to STALL diff --git a/ra/fsp/src/r_usb_pmsc/src/r_usb_atapi_driver.c b/ra/fsp/src/r_usb_pmsc/src/r_usb_atapi_driver.c index 154bcfb6a..540f44a33 100644 --- a/ra/fsp/src/r_usb_pmsc/src/r_usb_atapi_driver.c +++ b/ra/fsp/src/r_usb_pmsc/src/r_usb_atapi_driver.c @@ -54,7 +54,7 @@ static void pmsc_atapi_get_read_data(uint32_t * size, uint8_t ** buff); static void pmsc_atapi_get_mode_sense10_data(uint8_t page_code, uint32_t * size, uint8_t ** buff); static uint8_t g_usb_atapi_is_data_stage = USB_FALSE; /* Data SetUp Flag */ -static uint8_t g_usb_pmsc_media_buffer[USB_ATAPI_BLOCK_UNIT * USB_CFG_PMSC_TRANS_COUNT]; +static uint8_t g_usb_pmsc_media_buffer[USB_CFG_PMSC_ATAPI_BLOCK_UNIT * USB_CFG_PMSC_TRANS_COUNT]; static usb_pmsc_cdb_t * g_usb_atapi_cbwcb; /* CBWCB pointer */ static uint32_t g_usb_atapi_cur_lba; /* the current Logical Block Address */ @@ -378,7 +378,7 @@ void pmsc_atapi_analyze_cbwcb (uint8_t * cbwcb) (uint32_t) g_usb_atapi_cbwcb->s_usb_ptn4569.us_length_lo); /* Convert block count to byte count. */ - ar_size = (ar_size * (uint32_t) USB_ATAPI_BLOCK_UNIT); + ar_size = (ar_size * (uint32_t) USB_CFG_PMSC_ATAPI_BLOCK_UNIT); ar_rst = USB_ATAPI_SND_DATAS; @@ -393,7 +393,7 @@ void pmsc_atapi_analyze_cbwcb (uint8_t * cbwcb) (uint32_t) g_usb_atapi_cbwcb->s_usb_ptn4569.us_length_lo); /* Convert block count to byte count. */ - ar_size = (ar_size * (uint32_t) USB_ATAPI_BLOCK_UNIT); + ar_size = (ar_size * (uint32_t) USB_CFG_PMSC_ATAPI_BLOCK_UNIT); /* Query the media device for total block count. */ r_usb_pmsc_media_ioctl(USB_MEDIA_IOCTL_GET_NUM_BLOCKS, &num_blocks); @@ -530,9 +530,9 @@ static void pmsc_atapi_get_read_data (uint32_t * size, uint8_t ** buff) } /* Calculate the number of logical blocks to read */ - if (g_usb_pmsc_message.ul_size < (USB_ATAPI_BLOCK_UNIT * USB_CFG_PMSC_TRANS_COUNT)) + if (g_usb_pmsc_message.ul_size < (USB_CFG_PMSC_ATAPI_BLOCK_UNIT * USB_CFG_PMSC_TRANS_COUNT)) { - trans_block = g_usb_pmsc_message.ul_size / USB_ATAPI_BLOCK_UNIT; + trans_block = g_usb_pmsc_message.ul_size / USB_CFG_PMSC_ATAPI_BLOCK_UNIT; } else { @@ -543,7 +543,7 @@ static void pmsc_atapi_get_read_data (uint32_t * size, uint8_t ** buff) g_usb_atapi_cur_lba += trans_block; - *size = (USB_ATAPI_BLOCK_UNIT * trans_block); + *size = (USB_CFG_PMSC_ATAPI_BLOCK_UNIT * trans_block); *buff = &g_usb_pmsc_media_buffer[0]; break; @@ -788,10 +788,10 @@ void pmsc_atapi_command_processing (uint8_t * cbw, uint16_t usb_result, usb_cb_t this_transfer_size = g_usb_pmsc_message.ul_size; p_atapi_rw_buff = &g_usb_pmsc_media_buffer[0]; - if (this_transfer_size > (USB_ATAPI_BLOCK_UNIT * USB_CFG_PMSC_TRANS_COUNT)) + if (this_transfer_size > (USB_CFG_PMSC_ATAPI_BLOCK_UNIT * USB_CFG_PMSC_TRANS_COUNT)) { /* Divide Size for WRITE10 & WRITE_AND_VERIFY*/ - this_transfer_size = (USB_ATAPI_BLOCK_UNIT * USB_CFG_PMSC_TRANS_COUNT); + this_transfer_size = (USB_CFG_PMSC_ATAPI_BLOCK_UNIT * USB_CFG_PMSC_TRANS_COUNT); } real_data_count = 0UL; @@ -809,8 +809,8 @@ void pmsc_atapi_command_processing (uint8_t * cbw, uint16_t usb_result, usb_cb_t { p_atapi_rw_buff = &g_usb_pmsc_media_buffer[0]; - trans_block = this_transfer_size / USB_ATAPI_BLOCK_UNIT; - if (0 != (this_transfer_size % USB_ATAPI_BLOCK_UNIT)) + trans_block = this_transfer_size / USB_CFG_PMSC_ATAPI_BLOCK_UNIT; + if (0 != (this_transfer_size % USB_CFG_PMSC_ATAPI_BLOCK_UNIT)) { trans_block++; } @@ -993,7 +993,7 @@ static void pmsc_atapi_get_mode_sense10_data (uint8_t page_code, uint32_t * size ***********************************************************************************************************************/ void pmsc_atapi_init (void) { - memset((void *) &g_usb_pmsc_media_buffer, 0, (USB_ATAPI_BLOCK_UNIT * USB_CFG_PMSC_TRANS_COUNT)); + memset((void *) &g_usb_pmsc_media_buffer, 0, (USB_CFG_PMSC_ATAPI_BLOCK_UNIT * USB_CFG_PMSC_TRANS_COUNT)); g_usb_atapi_cbwcb = USB_NULL; g_usb_atapi_cur_lba = 0; } /* End of function pmsc_atapi_init() */ diff --git a/ra/fsp/src/rm_ble_abs/rm_ble_abs.c b/ra/fsp/src/rm_ble_abs/rm_ble_abs.c index c1ae7916f..267a6915e 100644 --- a/ra/fsp/src/rm_ble_abs/rm_ble_abs.c +++ b/ra/fsp/src/rm_ble_abs/rm_ble_abs.c @@ -113,16 +113,22 @@ /** Define for privacy status */ /**********************************/ /** create irk */ -#define BLE_ABS_PV_STATUS_CREATE_IRK (0x00000001) +#define BLE_ABS_PV_STATUS_CREATE_IRK (0x00000001) /** add irk to resolving list */ -#define BLE_ABS_PV_STATUS_ADD_RSLV (0x00000002) +#define BLE_ABS_PV_STATUS_ADD_RSLV (0x00000002) /** set privacy mode */ -#define BLE_ABS_PV_STATUS_SET_MODE (0x00000004) +#define BLE_ABS_PV_STATUS_SET_MODE (0x00000004) /** enable resolvable private address function */ -#define BLE_ABS_PV_STATUS_EN_RPA (0x00000008) +#define BLE_ABS_PV_STATUS_EN_RPA (0x00000008) + +/** get address **/ +#define BLE_ABS_PV_STATUS_GET_ADDR (0x00000010) + +/** register the stored irk **/ +#define BLE_ABS_PV_STATUS_REG_STR_IRK (0x00000020) /**********************************/ /** Define for create connection */ @@ -157,6 +163,8 @@ #define BLE_SECD_UPD_BN_ADD_OVERWR (0x01) #define BLE_SECD_UPD_BN_DEL (0x02) #define BLE_SECD_UPD_BN_ALL_DEL (0x03) + #define BLE_SECD_UPD_BN_UPDATE (0x04) + #define BLE_ABS_SECURE_DATA_DELETE_LOCAL_FF (0xFF) #define BLE_ABS_SECURE_DATA_UPDATE_BOND_NUMBER_FF (0xFF) #define BLE_ABS_SECURE_DATA_REMOTE_BOND_NUMBER_FF (0xFF) @@ -285,6 +293,13 @@ #define BLE_ABS_TIMER_DEFAULT_TIMEOUT_MS (1000) #define BLE_ABS_TIMER_METRIC_PREFIX (1000) +#define BLE_ABS_SCAN_FILTER_MASK (0x0F) +#define BLE_ABS_SCAN_LOCAL_ADDRESS_TYPE_MASK (0xF0) +#define BLE_ABS_CONNECTION_FILTER_MASK (0x0F) +#define BLE_ABS_CONNECTION_LOCAL_ADDRESS_TYPE_MASK (0xF0) +#define BLE_ABS_PRIVACY_MODE_MASK (0x0F) +#define BLE_ABS_PRIVACY_ADDRESS_MASK (0xF0) + #define BLE_ABS_SCAN_STATUS_SET_MASK (0x00000000) #define BLE_ABS_SCAN_STATUS_CLEAR_MASK (0xFFFFFFFF) @@ -378,7 +393,12 @@ static void ble_abs_conflict_resolving_handler(ble_abs_instance_ctrl_t * const p st_ble_evt_data_t * p_event_data); static void ble_abs_random_handler(ble_abs_instance_ctrl_t * const p_instance_ctrl, st_ble_vs_evt_data_t * p_event_data); -static void ble_abs_set_irk_to_resolving_list(ble_abs_instance_ctrl_t * const p_instance_ctrl, uint8_t * p_lc_irk); + +static void ble_abs_get_address_handler(ble_abs_instance_ctrl_t * const p_instance_ctrl, + st_ble_vs_evt_data_t * p_event_data, + ble_status_t event_result); + +static void ble_abs_set_irk_to_resolving_list(ble_abs_instance_ctrl_t * const p_instance_ctrl, uint8_t * p_local_irk); static void ble_abs_advertising_start(ble_abs_instance_ctrl_t * const p_instance_ctrl, uint8_t advertising_handle); static void ble_abs_advertising_set_data(ble_abs_instance_ctrl_t * const p_instance_ctrl, uint8_t advertising_handle, @@ -405,15 +425,6 @@ static void ble_abs_set_connection_advertising_interval(st_ble_gap_adv_param_t * uint16_t fast_period); /*** ble secure data functions start ***/ - -static fsp_err_t ble_abs_secure_data_writelocinfo(flash_instance_t const * p_instance, - ble_device_address_t * p_lc_id_addr, - uint8_t * p_lc_irk, - uint8_t * p_lc_csrk); -static fsp_err_t ble_abs_secure_data_readlocinfo(flash_instance_t const * p_instance, - ble_device_address_t * p_lc_id_addr, - uint8_t * p_lc_irk, - uint8_t * p_lc_csrk); static void ble_abs_secure_data_recvremkeys(ble_device_address_t * p_addr, st_ble_gap_key_ex_param_t * p_keys); static fsp_err_t ble_abs_secure_data_writeremkeys(flash_instance_t const * p_instance, ble_device_address_t * p_addr, @@ -423,6 +434,11 @@ static void ble_abs_secure_data_delete_remote_keys(st_ble_dev_addr_t * p_ad static void ble_abs_secure_data_delete_local_keys(st_ble_dev_addr_t * p_addr); static void ble_abs_secure_data_delete_all_keys(st_ble_dev_addr_t * p_addr); +static fsp_err_t ble_abs_secure_data_get_identityinfo(flash_instance_t const * p_instance, + ble_device_address_t * p_idaddr, + st_ble_gap_rslv_list_key_set_t * p_key_set, + uint8_t * p_num); + #if (BLE_ABS_CFG_ENABLE_SECURE_DATA == 1) static st_ble_gap_key_ex_param_t gs_key_ex_param; @@ -539,6 +555,8 @@ const ble_abs_api_t g_ble_abs_on_ble = .setLocalPrivacy = RM_BLE_ABS_SetLocalPrivacy, .startAuthentication = RM_BLE_ABS_StartAuthentication, .deleteBondInformation = RM_BLE_ABS_DeleteBondInformation, + .importKeyInformation = RM_BLE_ABS_ImportKeyInformation, + .exportKeyInformation = RM_BLE_ABS_ExportKeyInformation, }; static ble_abs_instance_ctrl_t * gp_instance_ctrl; @@ -1246,8 +1264,6 @@ fsp_err_t RM_BLE_ABS_StartScanning (ble_abs_ctrl_t * const p_ctr * @retval FSP_ERR_ASSERTION p_instance_ctrl is specified as NULL. * @retval FSP_ERR_NOT_OPEN Control block not open. * @retval FSP_ERR_INVALID_ARGUMENT The privacy_mode parameter is out of range. - * @retval FSP_ERR_BLE_ABS_INVALID_OPERATION Host stack hasn't been initialized. - * configuring the resolving list or privacy mode. **********************************************************************************************************************/ fsp_err_t RM_BLE_ABS_SetLocalPrivacy (ble_abs_ctrl_t * const p_ctrl, uint8_t const * const p_lc_irk, @@ -1256,6 +1272,7 @@ fsp_err_t RM_BLE_ABS_SetLocalPrivacy (ble_abs_ctrl_t * const p_ctrl, ble_status_t ble_status = BLE_SUCCESS; ble_abs_instance_ctrl_t * p_instance_ctrl = (ble_abs_instance_ctrl_t *) p_ctrl; + uint8_t address_type = ((privacy_mode & BLE_ABS_PRIVACY_ADDRESS_MASK) >> 4); /* Parameter checking */ #if BLE_ABS_CFG_PARAM_CHECKING_ENABLE @@ -1263,22 +1280,28 @@ fsp_err_t RM_BLE_ABS_SetLocalPrivacy (ble_abs_ctrl_t * const p_ctrl, /* Verify the pointers are valid */ FSP_ASSERT(p_instance_ctrl); FSP_ERROR_RETURN(BLE_ABS_OPEN == p_instance_ctrl->open, FSP_ERR_NOT_OPEN); - FSP_ERROR_RETURN(BLE_GAP_DEV_PRIV_MODE >= privacy_mode, FSP_ERR_INVALID_ARGUMENT); + FSP_ERROR_RETURN(BLE_GAP_ADDR_RAND >= address_type, FSP_ERR_INVALID_ARGUMENT); + FSP_ERROR_RETURN(BLE_GAP_DEV_PRIV_MODE >= (privacy_mode & BLE_ABS_PRIVACY_MODE_MASK), FSP_ERR_INVALID_ARGUMENT); #endif - if (NULL == p_lc_irk) + if (NULL != p_lc_irk) + { + memcpy(p_instance_ctrl->local_irk, p_lc_irk, BLE_GAP_IRK_SIZE); + p_instance_ctrl->set_privacy_status = BLE_ABS_PV_STATUS_REG_STR_IRK; + } + + ble_status = R_BLE_VS_GetBdAddr(BLE_VS_ADDR_AREA_REG, address_type); + + if (BLE_SUCCESS == ble_status) { - ble_status = R_BLE_VS_GetRand(BLE_GAP_IRK_SIZE); - p_instance_ctrl->set_privacy_status = (BLE_SUCCESS == ble_status) ? BLE_ABS_PV_STATUS_CREATE_IRK : 0; + p_instance_ctrl->privacy_mode = (privacy_mode & BLE_ABS_PRIVACY_MODE_MASK); + p_instance_ctrl->set_privacy_status |= BLE_ABS_PV_STATUS_GET_ADDR; } else { - ble_abs_set_irk_to_resolving_list(p_instance_ctrl, (uint8_t *) p_lc_irk); - FSP_ERROR_RETURN(0 != p_instance_ctrl->set_privacy_status, FSP_ERR_BLE_ABS_INVALID_OPERATION); + p_instance_ctrl->set_privacy_status = 0; } - p_instance_ctrl->privacy_mode = privacy_mode; - return FSP_SUCCESS; } /* End of function RM_BLE_ABS_SetLocalPrivacy() */ @@ -1319,6 +1342,7 @@ fsp_err_t RM_BLE_ABS_CreateConnection (ble_abs_ctrl_t * const FSP_ERROR_RETURN(BLE_ABS_OPEN == p_instance_ctrl->open, FSP_ERR_NOT_OPEN); FSP_ERROR_RETURN(NULL != p_connection_parameter, FSP_ERR_INVALID_POINTER); FSP_ERROR_RETURN(10 >= p_connection_parameter->connection_timeout, FSP_ERR_INVALID_ARGUMENT); + FSP_ERROR_RETURN(NULL != p_connection_parameter->p_device_address, FSP_ERR_INVALID_ARGUMENT); #endif /* Status checking */ @@ -1327,19 +1351,13 @@ fsp_err_t RM_BLE_ABS_CreateConnection (ble_abs_ctrl_t * const st_ble_gap_create_conn_param_t connection_parameter; fsp_err_t ret = FSP_SUCCESS; ble_status_t retval = BLE_SUCCESS; + connection_parameter.init_filter_policy = + (p_connection_parameter->filter_parameter & BLE_ABS_CONNECTION_FILTER_MASK); + connection_parameter.own_addr_type = + (p_connection_parameter->filter_parameter & BLE_ABS_CONNECTION_LOCAL_ADDRESS_TYPE_MASK) >> 4; - connection_parameter.init_filter_policy = p_connection_parameter->filter_parameter; - connection_parameter.own_addr_type = BLE_GAP_ADDR_PUBLIC; - - if (BLE_GAP_INIT_FILT_USE_ADDR == p_connection_parameter->filter_parameter) - { - memcpy(connection_parameter.remote_bd_addr, p_connection_parameter->p_device_address->addr, BLE_BD_ADDR_LEN); - connection_parameter.remote_bd_addr_type = p_connection_parameter->p_device_address->type; - } - else - { - connection_parameter.remote_bd_addr_type = BLE_GAP_ADDR_PUBLIC; - } + memcpy(connection_parameter.remote_bd_addr, p_connection_parameter->p_device_address->addr, BLE_BD_ADDR_LEN); + connection_parameter.remote_bd_addr_type = p_connection_parameter->p_device_address->type; /** set connection parameters for 1M */ ble_gap_connection_parameter_t connection_parameter_1M; ///< connection parameter for 1M @@ -1549,6 +1567,175 @@ fsp_err_t RM_BLE_ABS_DeleteBondInformation (ble_abs_ctrl_t * const return FSP_SUCCESS; } +/*******************************************************************************************************************//** + * Import key information to BLE stack and storage. + * Implements @ref ble_abs_api_t::importKeyInformation. + * + * Example: + * @snippet rm_ble_abs_example.c RM_BLE_ABS_ImportKeyInformation + * + * @retval FSP_SUCCESS Operation succeeded. + * @retval FSP_ERR_ASSERTION The parameter p_instance_ctrl is NULL. + * @retval FSP_ERR_INVALID_POINTER The parameter p_local_identity_address, p_local_irk or p_local_csrk is NULL. + * @retval FSP_ERR_NOT_OPEN Control block not open. + * @retval FSP_ERR_INVALID_HW_CONDITION Failure to access internal storage. + **********************************************************************************************************************/ +fsp_err_t RM_BLE_ABS_ImportKeyInformation (ble_abs_ctrl_t * const p_ctrl, + ble_device_address_t * p_local_identity_address, + uint8_t * p_local_irk, + uint8_t * p_local_csrk) +{ + ble_abs_instance_ctrl_t * p_instance_ctrl = (ble_abs_instance_ctrl_t *) p_ctrl; + uint32_t local_temp_data[(BLE_ABS_SECURE_DATA_LOCAL_AREA_SIZE + BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE + 3) / 4]; + +#if BLE_ABS_CFG_PARAM_CHECKING_ENABLE + FSP_ASSERT(p_instance_ctrl); + FSP_ERROR_RETURN((((NULL != p_local_identity_address) && (NULL != p_local_irk)) || (NULL != p_local_csrk)), + FSP_ERR_INVALID_POINTER); + FSP_ERROR_RETURN(BLE_ABS_OPEN == p_instance_ctrl->open, FSP_ERR_NOT_OPEN); +#endif + + FSP_ERROR_RETURN(FSP_SUCCESS == ble_abs_secure_data_flash_read(p_instance_ctrl->p_cfg->p_flash_instance, + BLE_ABS_SECURE_DATA_BASE_ADDR, + (uint8_t *) local_temp_data, + BLE_ABS_SECURE_DATA_LOCAL_AREA_SIZE + + BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE), + FSP_ERR_INVALID_HW_CONDITION); + + if (NULL != p_local_irk) + { + memcpy((uint8_t *) local_temp_data + BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE, p_local_irk, BLE_GAP_IRK_SIZE); + memcpy( + (uint8_t *) local_temp_data + BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE + BLE_GAP_IRK_SIZE + BLE_GAP_CSRK_SIZE, + p_local_identity_address, + BLE_ABS_SECURE_DATA_BLUETOOTH_DEVICE_ADDRESS_SIZE); + } + + if (NULL != p_local_csrk) + { + memcpy((uint8_t *) local_temp_data + BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE + BLE_GAP_IRK_SIZE, + p_local_csrk, + BLE_GAP_CSRK_SIZE); + } + + local_temp_data[0] = BLE_ABS_SECURE_DATA_MAGIC_NUMBER; + + FSP_ERROR_RETURN(FSP_SUCCESS == ble_abs_secure_data_flash_write(p_instance_ctrl->p_cfg->p_flash_instance, + BLE_ABS_SECURE_DATA_BASE_ADDR, + (uint8_t *) local_temp_data, + BLE_ABS_SECURE_DATA_LOCAL_AREA_SIZE + + BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE), + FSP_ERR_INVALID_HW_CONDITION); + + return FSP_SUCCESS; +} + +/*******************************************************************************************************************//** + * Export key information to BLE stack and storage. + * Implements @ref ble_abs_api_t::exportKeyInformation. + * + * Example: + * @snippet rm_ble_abs_example.c RM_BLE_ABS_ExportKeyInformation + * + * @retval FSP_SUCCESS Operation succeeded. + * @retval FSP_ERR_ASSERTION The parameter p_instance_ctrl is NULL. + * @retval FSP_ERR_INVALID_POINTER The parameter p_local_identity_address, p_local_irk or p_local_csrk is NULL. + * @retval FSP_ERR_NOT_OPEN Control block not open. + * @retval FSP_ERR_BUFFER_EMPTY Dynamic memory allocation failed. + * @retval FSP_ERR_OUT_OF_MEMORY Failure to access internal storage. + * @retval FSP_ERR_NOT_INITIALIZED Not initialized internal storage. + **********************************************************************************************************************/ +fsp_err_t RM_BLE_ABS_ExportKeyInformation (ble_abs_ctrl_t * const p_ctrl, + ble_device_address_t * p_local_identity_address, + uint8_t * p_local_irk, + uint8_t * p_local_csrk) +{ + fsp_err_t retval; + uint8_t * p_loc_area; + uint32_t mgc_num; + ble_abs_instance_ctrl_t * p_instance_ctrl = (ble_abs_instance_ctrl_t *) p_ctrl; + +#if BLE_ABS_CFG_PARAM_CHECKING_ENABLE + FSP_ASSERT(p_instance_ctrl); + FSP_ERROR_RETURN((((NULL != p_local_identity_address) && (NULL != p_local_irk)) || (NULL != p_local_csrk)), + FSP_ERR_INVALID_POINTER); + FSP_ERROR_RETURN(BLE_ABS_OPEN == p_instance_ctrl->open, FSP_ERR_NOT_OPEN); +#endif + + p_loc_area = malloc(BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE + BLE_ABS_SECURE_DATA_LOCAL_AREA_SIZE); + + FSP_ERROR_RETURN(NULL != p_loc_area, FSP_ERR_BUFFER_EMPTY); + + retval = ble_abs_secure_data_flash_read(p_instance_ctrl->p_cfg->p_flash_instance, + BLE_ABS_SECURE_DATA_ADDR_MGN_DATA, + p_loc_area, + BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE + + BLE_ABS_SECURE_DATA_LOCAL_AREA_SIZE); + if (FSP_SUCCESS != retval) + { + free(p_loc_area); + p_loc_area = NULL; + } + + FSP_ERROR_RETURN(FSP_SUCCESS == retval, retval); + + memcpy(&mgc_num, p_loc_area, BLE_ABS_SECURE_DATA_MAGIC_NUMBER_SIZE); + if ((BLE_ABS_SECURE_DATA_MAGIC_NUMBER != mgc_num) && (NULL != p_loc_area)) + { + free(p_loc_area); + p_loc_area = NULL; + } + + FSP_ERROR_RETURN(BLE_ABS_SECURE_DATA_MAGIC_NUMBER == mgc_num, FSP_ERR_NOT_INITIALIZED); + + if ((NULL != p_local_irk) && (NULL != p_local_identity_address)) + { + if (BLE_ABS_SECURE_DATA_BOND_CHECK_FF == + p_loc_area[BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE + BLE_GAP_IRK_SIZE + BLE_GAP_CSRK_SIZE + + BLE_BD_ADDR_LEN]) + { + /* invalid IRK and identity address */ + memset(p_local_irk, 0x00, BLE_GAP_IRK_SIZE); + memset(p_local_identity_address, 0x00, BLE_BD_ADDR_LEN + sizeof(uint8_t)); + } + else + { + memcpy(p_local_irk, &p_loc_area[BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE], BLE_GAP_IRK_SIZE); + memcpy(p_local_identity_address, + &p_loc_area[BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE + BLE_GAP_IRK_SIZE + BLE_GAP_CSRK_SIZE], + BLE_ABS_SECURE_DATA_BLUETOOTH_DEVICE_ADDRESS_SIZE); + } + } + + if (NULL != p_local_csrk) + { + uint8_t df_init[BLE_GAP_CSRK_SIZE]; + memset(df_init, BLE_ABS_SECURE_DATA_DELETE_LOCAL_FF, BLE_GAP_CSRK_SIZE); + if (0 == + memcmp(df_init, + &p_loc_area[BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE + BLE_GAP_IRK_SIZE], + BLE_GAP_CSRK_SIZE)) + { + /* invalid CSRK */ + memset(p_local_csrk, 0x00, BLE_GAP_CSRK_SIZE); + } + else + { + /* valid CSRK */ + memcpy(p_local_csrk, + &p_loc_area[BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE + BLE_GAP_IRK_SIZE], + BLE_GAP_CSRK_SIZE); + } + } + + if (NULL != p_loc_area) + { + free(p_loc_area); + } + + return FSP_SUCCESS; +} + /************************************************ * static function definitions * ***********************************************/ @@ -2464,11 +2651,15 @@ static void ble_abs_convert_scan_parameter (ble_abs_instance_ctrl_t * const p_in ble_gap_scan_on_t * p_gap_scan_enable, uint32_t status) { - p_gap_scan_parameter->o_addr_type = BLE_GAP_ADDR_PUBLIC; - p_gap_scan_parameter->filter_policy = p_instance_ctrl->abs_scan.scan_parameter.device_scan_filter_policy; - p_gap_scan_enable->proc_type = BLE_GAP_SC_PROC_OBS; - p_gap_scan_enable->period = 0; - p_gap_scan_enable->filter_dups = p_instance_ctrl->abs_scan.scan_parameter.filter_duplicate; + p_gap_scan_parameter->o_addr_type = + (p_instance_ctrl->abs_scan.scan_parameter.device_scan_filter_policy & BLE_ABS_SCAN_LOCAL_ADDRESS_TYPE_MASK) >> + 4; + p_gap_scan_parameter->filter_policy = p_instance_ctrl->abs_scan.scan_parameter.device_scan_filter_policy & + BLE_ABS_SCAN_FILTER_MASK; + + p_gap_scan_enable->proc_type = BLE_GAP_SC_PROC_OBS; + p_gap_scan_enable->period = 0; + p_gap_scan_enable->filter_dups = p_instance_ctrl->abs_scan.scan_parameter.filter_duplicate; if (BLE_ABS_SCAN_STATUS_FAST_START == status) { @@ -2707,7 +2898,7 @@ static fsp_err_t ble_abs_convert_legacy_advertising_parameter ( p_gap_advertising_parameter->adv_prop_type = BLE_GAP_LEGACY_PROP_ADV_IND; p_gap_advertising_parameter->adv_ch_map = p_legacy_advertising_parameter->advertising_channel_map; - FSP_ERROR_RETURN((BLE_GAP_ADDR_RPA_ID_PUBLIC >= p_legacy_advertising_parameter->own_bluetooth_address_type), + FSP_ERROR_RETURN((BLE_GAP_ADDR_RPA_ID_RANDOM >= p_legacy_advertising_parameter->own_bluetooth_address_type), FSP_ERR_INVALID_ARGUMENT); memcpy(p_gap_advertising_parameter->o_addr, @@ -2756,7 +2947,7 @@ static fsp_err_t ble_abs_convert_extend_advertising_parameter ( p_gap_advertising_parameter->adv_hdl = BLE_ABS_EXT_HDL; p_gap_advertising_parameter->adv_ch_map = p_extend_advertising_parameter->advertising_channel_map; - FSP_ERROR_RETURN((BLE_GAP_ADDR_RPA_ID_PUBLIC >= p_extend_advertising_parameter->own_bluetooth_address_type), + FSP_ERROR_RETURN((BLE_GAP_ADDR_RPA_ID_RANDOM >= p_extend_advertising_parameter->own_bluetooth_address_type), FSP_ERR_INVALID_ARGUMENT); memcpy(p_gap_advertising_parameter->o_addr, @@ -2771,7 +2962,7 @@ static fsp_err_t ble_abs_convert_extend_advertising_parameter ( p_extend_advertising_parameter->p_peer_address->addr, BLE_BD_ADDR_LEN); p_gap_advertising_parameter->p_addr_type = p_extend_advertising_parameter->p_peer_address->type; - p_gap_advertising_parameter->adv_prop_type = BLE_GAP_EXT_PROP_ADV_CONN_NOSCAN_DIRECT; + p_gap_advertising_parameter->adv_prop_type = BLE_GAP_EXT_PROP_ADV_CONN_NOSCAN_UNDIRECT; } else { @@ -2819,7 +3010,7 @@ static fsp_err_t ble_abs_convert_non_connectable_advertising_parameter ( p_gap_advertising_parameter->adv_ch_map = p_non_connectable_advertising_parameter->advertising_channel_map; FSP_ERROR_RETURN( - (BLE_GAP_ADDR_RPA_ID_PUBLIC >= p_non_connectable_advertising_parameter->own_bluetooth_address_type), + (BLE_GAP_ADDR_RPA_ID_RANDOM >= p_non_connectable_advertising_parameter->own_bluetooth_address_type), FSP_ERR_INVALID_ARGUMENT); memcpy(p_gap_advertising_parameter->o_addr, @@ -2854,7 +3045,7 @@ static fsp_err_t ble_abs_convert_non_connectable_advertising_parameter ( p_gap_advertising_parameter->adv_prop_type = (uint16_t) ((BLE_ABS_ADVERTISING_PHY_LEGACY != p_non_connectable_advertising_parameter->primary_advertising_phy) ? - BLE_GAP_EXT_PROP_ADV_NOCONN_NOSCAN_DIRECT : + BLE_GAP_EXT_PROP_ADV_NOCONN_NOSCAN_UNDIRECT : BLE_GAP_LEGACY_PROP_ADV_NONCONN_IND); } else @@ -3082,28 +3273,31 @@ static void ble_abs_set_scan_status (ble_abs_instance_ctrl_t * const p_instance_ * * @retval FSP_SUCCESS Operation succeeded. **********************************************************************************************************************/ -static void ble_abs_set_irk_to_resolving_list (ble_abs_instance_ctrl_t * const p_instance_ctrl, uint8_t * p_lc_irk) +static void ble_abs_set_irk_to_resolving_list (ble_abs_instance_ctrl_t * const p_instance_ctrl, uint8_t * p_local_irk) { st_ble_gap_rslv_list_key_set_t peer_irk; ble_device_address_t remote_device_address; ble_status_t retval = BLE_SUCCESS; - memset(peer_irk.remote_irk, BLE_ABS_GAP_REMOTE_IRK_AA, BLE_GAP_IRK_SIZE); + memset(peer_irk.remote_irk, 0x00, BLE_GAP_IRK_SIZE); + peer_irk.local_irk_type = BLE_GAP_RL_LOC_KEY_REGISTERED; - memset(remote_device_address.addr, BLE_ABS_REMOTE_DEVICE_ADDRESS_55, BLE_BD_ADDR_LEN); + + memset(remote_device_address.addr, 0x00, BLE_BD_ADDR_LEN); remote_device_address.type = BLE_GAP_ADDR_PUBLIC; - R_BLE_GAP_SetLocIdInfo(&p_instance_ctrl->loc_bd_addr, p_lc_irk); + R_BLE_GAP_SetLocIdInfo(&p_instance_ctrl->loc_bd_addr, p_local_irk); /** store local id info */ - ble_abs_secure_data_writelocinfo(p_instance_ctrl->p_cfg->p_flash_instance, - (ble_device_address_t *) (&p_instance_ctrl->loc_bd_addr), - p_lc_irk, - NULL); ///< store local id info - +#if (BLE_ABS_CFG_ENABLE_SECURE_DATA == 1) + RM_BLE_ABS_ImportKeyInformation(p_instance_ctrl, + (ble_device_address_t *) (&p_instance_ctrl->loc_bd_addr), + p_local_irk, + NULL); ///< store local id info +#endif /* BLE_ABS_CFG_ENABLE_SECURE_DATA == 1 */ retval = R_BLE_GAP_ConfRslvList(BLE_GAP_LIST_ADD_DEV, (st_ble_dev_addr_t *) (&remote_device_address), &peer_irk, 1); p_instance_ctrl->set_privacy_status = (BLE_SUCCESS == retval) ? BLE_ABS_PV_STATUS_ADD_RSLV : 0; -} /* End of function ble_abs_set_irk_to_resolving_list() */ +} /* End of function ble_abs_set_irk_to_resolving_list() */ /*******************************************************************************************************************//** * Handler for GAP BLE_GAP_EVENT_RSLV_LIST_CONF_COMP event. @@ -3122,7 +3316,7 @@ static void ble_abs_conflict_resolving_handler (ble_abs_instance_ctrl_t * const if (BLE_GAP_LIST_ADD_DEV == p_resolving_list_config->op_code) { ble_device_address_t remote_device_address; - memset(remote_device_address.addr, BLE_ABS_REMOTE_DEVICE_ADDRESS_55, BLE_BD_ADDR_LEN); + memset(remote_device_address.addr, 0x00, BLE_BD_ADDR_LEN); remote_device_address.type = 0x00; retval = R_BLE_GAP_SetPrivMode((st_ble_dev_addr_t *) (&remote_device_address), &p_instance_ctrl->privacy_mode, @@ -3148,12 +3342,12 @@ static void ble_abs_gap_callback (uint16_t event_type, ble_status_t event_result case BLE_GAP_EVENT_STACK_ON: { R_BLE_GAP_GetVerInfo(); - uint8_t irk[BLE_GAP_IRK_SIZE]; - ble_device_address_t identity_address; - fsp_err_t retval; - + uint8_t irk[BLE_GAP_IRK_SIZE]; + ble_device_address_t identity_address; + fsp_err_t retval; + ble_abs_identity_address_info_t remote_id_info; ble_abs_secure_data_init(p_instance_ctrl->p_cfg->p_flash_instance); - retval = ble_abs_secure_data_readlocinfo(p_instance_ctrl->p_cfg->p_flash_instance, + retval = RM_BLE_ABS_ExportKeyInformation(p_instance_ctrl, &identity_address, irk, NULL); @@ -3162,6 +3356,18 @@ static void ble_abs_gap_callback (uint16_t event_type, ble_status_t event_result R_BLE_GAP_SetLocIdInfo((st_ble_dev_addr_t *) (&identity_address), irk); } + retval = ble_abs_secure_data_get_identityinfo(p_instance_ctrl->p_cfg->p_flash_instance, + remote_id_info.identity_address, + remote_id_info.key_set, + &remote_id_info.bond_count); + + if ((retval == FSP_SUCCESS) && (0 != remote_id_info.bond_count)) + { + R_BLE_GAP_ConfWhiteList(BLE_GAP_LIST_ADD_DEV, + (st_ble_dev_addr_t *) remote_id_info.identity_address, + remote_id_info.bond_count); + } + break; } @@ -3217,13 +3423,17 @@ static void ble_abs_gap_callback (uint16_t event_type, ble_status_t event_result case BLE_GAP_EVENT_ADV_ON: { + if (BLE_SUCCESS != event_result) + { #if (BLE_CFG_LIBRARY_TYPE == BLE_LIB_EXTENDED) - st_ble_gap_adv_set_evt_t * p_param; - p_param = (st_ble_gap_adv_set_evt_t *) p_event_data->p_param; - ble_abs_set_advertising_status(p_instance_ctrl, p_param->adv_hdl, 0, BLE_ABS_SCAN_STATUS_CLEAR_MASK); + st_ble_gap_adv_set_evt_t * p_param; + p_param = (st_ble_gap_adv_set_evt_t *) p_event_data->p_param; + ble_abs_set_advertising_status(p_instance_ctrl, p_param->adv_hdl, 0, BLE_ABS_SCAN_STATUS_CLEAR_MASK); #else /* (BLE_CFG_LIBRARY_TYPE == BLE_LIB_EXTENDED) */ - ble_abs_set_advertising_status(p_instance_ctrl, BLE_ABS_COMMON_HDL, 0, BLE_ABS_SCAN_STATUS_CLEAR_MASK); + ble_abs_set_advertising_status(p_instance_ctrl, BLE_ABS_COMMON_HDL, 0, BLE_ABS_SCAN_STATUS_CLEAR_MASK); #endif /* (BLE_CFG_LIBRARY_TYPE == BLE_LIB_EXTENDED) */ + } + break; } @@ -3299,6 +3509,22 @@ static void ble_abs_gap_callback (uint16_t event_type, ble_status_t event_result case BLE_GAP_EVENT_RPA_EN_COMP: { p_instance_ctrl->set_privacy_status = 0; + + /* Get remote device Identity address and IRK from Data Flash */ + ble_abs_secure_data_get_identityinfo(p_instance_ctrl->p_cfg->p_flash_instance, + p_instance_ctrl->identity_address_info.identity_address, + p_instance_ctrl->identity_address_info.key_set, + &p_instance_ctrl->identity_address_info.bond_count); + + /* register remote address & irk */ + R_BLE_GAP_ConfRslvList(BLE_GAP_LIST_ADD_DEV, + (st_ble_dev_addr_t *) p_instance_ctrl->identity_address_info.identity_address, + p_instance_ctrl->identity_address_info.key_set, + p_instance_ctrl->identity_address_info.bond_count); + R_BLE_GAP_SetPrivMode((st_ble_dev_addr_t *) p_instance_ctrl->identity_address_info.identity_address, + &p_instance_ctrl->privacy_mode, + p_instance_ctrl->identity_address_info.bond_count); + break; } @@ -3381,10 +3607,42 @@ static void ble_abs_random_handler (ble_abs_instance_ctrl_t * const p_instance_c { st_ble_vs_get_rand_comp_evt_t * p_random_parameter; p_random_parameter = (st_ble_vs_get_rand_comp_evt_t *) p_event_data->p_param; + memcpy(p_instance_ctrl->local_irk, p_random_parameter->p_rand, BLE_GAP_IRK_SIZE); ble_abs_set_irk_to_resolving_list(p_instance_ctrl, p_random_parameter->p_rand); } } /* End of function ble_abs_random_handler() */ +/*******************************************************************************************************************//** + * Handler for Vendor Specific BLE_VS_EVENT_GET_ADDR_COMP event. + **********************************************************************************************************************/ +static void ble_abs_get_address_handler (ble_abs_instance_ctrl_t * const p_instance_ctrl, + st_ble_vs_evt_data_t * p_event_data, + ble_status_t event_result) +{ + st_ble_vs_get_bd_addr_comp_evt_t * p_get_addr; + ble_status_t retval; + + if ((BLE_SUCCESS == event_result) && + (BLE_ABS_PV_STATUS_GET_ADDR == (BLE_ABS_PV_STATUS_GET_ADDR & p_instance_ctrl->set_privacy_status))) + { + /* get local device address to static variable. */ + p_get_addr = (st_ble_vs_get_bd_addr_comp_evt_t *) p_event_data->p_param; + p_instance_ctrl->loc_bd_addr = p_get_addr->addr; + + /* register the address as identity address and set resolving list.*/ + if (BLE_ABS_PV_STATUS_REG_STR_IRK == (BLE_ABS_PV_STATUS_REG_STR_IRK & p_instance_ctrl->set_privacy_status)) + { + ble_abs_set_irk_to_resolving_list(p_instance_ctrl, p_instance_ctrl->local_irk); + } + else + { + /* generate 128 bit random value for local IRK. */ + retval = R_BLE_VS_GetRand(BLE_GAP_IRK_SIZE); + p_instance_ctrl->set_privacy_status = (BLE_SUCCESS == retval) ? BLE_ABS_PV_STATUS_CREATE_IRK : 0; + } + } +} /* End of function ble_abs_get_address_handler() */ + /*******************************************************************************************************************//** * Vendor Specific Event handler. **********************************************************************************************************************/ @@ -3402,6 +3660,12 @@ static void ble_abs_vendor_specific_callback (uint16_t event_type, break; } + case BLE_VS_EVENT_GET_ADDR_COMP: + { + ble_abs_get_address_handler(p_instance_ctrl, p_event_data, event_result); + break; + } + default: { break; @@ -3459,124 +3723,6 @@ void r_ble_wake_up_task_from_isr (void * EventGroupHandle) #if (BLE_ABS_CFG_ENABLE_SECURE_DATA == 1) -/*******************************************************************************************************************//** - * Write Local device Identity Address, IRK and/or CSRK in DataFlash. - * - * @retval FSP_SUCCESS Operation succeeded. - * @retval FSP_ERR_INVALID_POINTER IRK(p_lc_id_addr or p_lc_irk) or CSRK(p_lc_csrk) - * is specified and as NULL. - * @retval FSP_ERR_BLE_ABS_INVALID_OPERATION Write to DataFlash is failed. - **********************************************************************************************************************/ -static fsp_err_t ble_abs_secure_data_writelocinfo (flash_instance_t const * p_instance, - ble_device_address_t * p_lc_id_addr, - uint8_t * p_lc_irk, - uint8_t * p_lc_csrk) -{ - uint32_t local_tmp_data[(BLE_ABS_SECURE_DATA_LOCAL_AREA_SIZE + BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE + 3) / 4]; - - FSP_ASSERT(p_lc_id_addr); - FSP_ASSERT(p_lc_irk); - FSP_ASSERT(p_lc_csrk); - - FSP_ERROR_RETURN(FSP_SUCCESS == ble_abs_secure_data_flash_read(p_instance, - BLE_ABS_SECURE_DATA_BASE_ADDR, - (uint8_t *) local_tmp_data, - BLE_ABS_SECURE_DATA_LOCAL_AREA_SIZE + - BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE), - FSP_ERR_BLE_ABS_INVALID_OPERATION); - - if (NULL != p_lc_irk) - { - memcpy((uint8_t *) local_tmp_data + BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE, p_lc_irk, BLE_GAP_IRK_SIZE); - memcpy( - (uint8_t *) local_tmp_data + BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE + BLE_GAP_IRK_SIZE + BLE_GAP_CSRK_SIZE, - p_lc_id_addr, - BLE_ABS_SECURE_DATA_BLUETOOTH_DEVICE_ADDRESS_SIZE); - } - - if (NULL != p_lc_csrk) - { - memcpy((uint8_t *) local_tmp_data + BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE + BLE_GAP_IRK_SIZE, - p_lc_csrk, - BLE_GAP_CSRK_SIZE); - } - - local_tmp_data[0] = BLE_ABS_SECURE_DATA_MAGIC_NUMBER; - - FSP_ERROR_RETURN(FSP_SUCCESS == ble_abs_secure_data_flash_write(p_instance, - BLE_ABS_SECURE_DATA_BASE_ADDR, - (uint8_t *) local_tmp_data, - BLE_ABS_SECURE_DATA_LOCAL_AREA_SIZE + - BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE), - FSP_ERR_BLE_ABS_INVALID_OPERATION); - - return FSP_SUCCESS; -} /* End of function ble_abs_secure_data_writelocinfo() */ - -/*******************************************************************************************************************//** - * Read Local device Identity Address and IRK and/or CSRK in DataFlash. - * - * @retval FSP_SUCCESS Operation succeeded. - * @retval FSP_ERR_INVALID_POINTER IRK(p_lc_id_addr or p_lc_irk) or CSRK(p_lc_csrk) - * is specified and as NULL. - * @retval FSP_ERR_BLE_ABS_INVALID_OPERATION Read to DataFlash is failed. - * @retval FSP_ERR_BLE_ABS_NOT_FOUND IRK and Identity Address not found. - **********************************************************************************************************************/ -static fsp_err_t ble_abs_secure_data_readlocinfo (flash_instance_t const * p_instance, - ble_device_address_t * p_lc_id_addr, - uint8_t * p_lc_irk, - uint8_t * p_lc_csrk) -{ - fsp_err_t retval; - uint8_t * p_loc_area; - uint32_t mgc_num; - - p_loc_area = malloc(BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE + BLE_ABS_SECURE_DATA_LOCAL_AREA_SIZE); - FSP_ERROR_RETURN(NULL != p_loc_area, FSP_ERR_BLE_ABS_NOT_FOUND); - - retval = ble_abs_secure_data_flash_read(p_instance, - BLE_ABS_SECURE_DATA_ADDR_MGN_DATA, - p_loc_area, - BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE + - BLE_ABS_SECURE_DATA_LOCAL_AREA_SIZE); - if (FSP_SUCCESS != retval) - { - free(p_loc_area); - p_loc_area = NULL; - } - - FSP_ERROR_RETURN(FSP_SUCCESS == retval, FSP_ERR_BLE_ABS_INVALID_OPERATION); - - memcpy(&mgc_num, p_loc_area, BLE_ABS_SECURE_DATA_MAGIC_NUMBER_SIZE); - if ((BLE_ABS_SECURE_DATA_MAGIC_NUMBER != mgc_num) && (NULL != p_loc_area)) - { - free(p_loc_area); - p_loc_area = NULL; - } - - FSP_ERROR_RETURN(BLE_ABS_SECURE_DATA_MAGIC_NUMBER == mgc_num, FSP_ERR_BLE_ABS_NOT_FOUND); - - if ((NULL != p_lc_irk) && (NULL != p_lc_id_addr)) - { - memcpy(p_lc_irk, &p_loc_area[BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE], BLE_GAP_IRK_SIZE); - memcpy(p_lc_id_addr, - &p_loc_area[BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE + BLE_GAP_IRK_SIZE + BLE_GAP_CSRK_SIZE], - BLE_ABS_SECURE_DATA_BLUETOOTH_DEVICE_ADDRESS_SIZE); - } - - if (NULL != p_lc_csrk) - { - memcpy(p_lc_csrk, &p_loc_area[BLE_ABS_SECURE_DATA_MANEGEMENT_DATA_SIZE + BLE_GAP_IRK_SIZE], BLE_GAP_CSRK_SIZE); - } - - if (NULL != p_loc_area) - { - free(p_loc_area); - } - - return FSP_SUCCESS; -} /* End of function ble_abs_secure_data_readlocinfo() */ - /*******************************************************************************************************************//** * Receive remote keys for write in DataFlash. **********************************************************************************************************************/ @@ -3610,7 +3756,7 @@ static fsp_err_t ble_abs_secure_data_writeremkeys (flash_instance_t const * p_in int32_t entry; int32_t op_code = BLE_SECD_UPD_BN_ADD; uint32_t start_addr; - uint8_t bond_num; + uint8_t bond_num = 0; uint8_t * p_sec_data; FSP_ASSERT(p_addr); @@ -3641,6 +3787,10 @@ static fsp_err_t ble_abs_secure_data_writeremkeys (flash_instance_t const * p_in op_code = BLE_SECD_UPD_BN_ADD_OVERWR; ///< found the entry for overwrite } } + else + { + op_code = BLE_SECD_UPD_BN_UPDATE; ///< found the entry for update + } start_addr = BLE_ABS_SECURE_DATA_ADDR_REM_START + (uint32_t) entry * BLE_ABS_SECURE_DATA_REMOTE_BONDING_SIZE; @@ -3793,6 +3943,7 @@ static fsp_err_t ble_abs_secure_data_update_bond_num (flash_instance_t const * p { case BLE_SECD_UPD_BN_ADD: case BLE_SECD_UPD_BN_ADD_OVERWR: + case BLE_SECD_UPD_BN_UPDATE: { /* update bond_num */ if (BLE_ABS_SECURE_DATA_UPDATE_BOND_NUMBER_FF == bond_num) @@ -3808,7 +3959,10 @@ static fsp_err_t ble_abs_secure_data_update_bond_num (flash_instance_t const * p } else { - bond_num++; + if (BLE_SECD_UPD_BN_UPDATE != op_code) + { + bond_num++; + } } p_sec_data[BLE_ABS_SECURE_DATA_MAGIC_NUMBER_SIZE] = bond_num; @@ -4087,42 +4241,68 @@ static void ble_abs_secure_data_delete_all_keys (st_ble_dev_addr_t * p_addr) { ble_abs_secure_data_delete_local_keys(NULL); } -#else /* (BLE_ABS_CFG_ENABLE_SECURE_DATA == 1) */ - /*******************************************************************************************************************//** - * Write Local device Identity Address, IRK and/or CSRK in DataFlash. - * @retval FSP_ERR_UNSUPPORTED This feature is not supported in this configuration. + * Get bonding information from DataFlash. + * + * @retval FSP_SUCCESS Operation succeeded. + * @retval FSP_ERR_INVALID_POINTER Parameter is NULL. + * @retval FSP_ERR_BLE_ABS_NOT_FOUND Security data area in DataFlash is not initialized. **********************************************************************************************************************/ -static fsp_err_t ble_abs_secure_data_writelocinfo (flash_instance_t const * p_instance, - ble_device_address_t * p_lc_id_addr, - uint8_t * p_lc_irk, - uint8_t * p_lc_csrk) +static fsp_err_t ble_abs_secure_data_get_identityinfo (flash_instance_t const * p_instance, + ble_device_address_t * p_idaddr, + st_ble_gap_rslv_list_key_set_t * p_key_set, + uint8_t * p_num) { - (void) p_instance; - (void) p_lc_id_addr; - (void) p_lc_irk; - (void) p_lc_csrk; + uint8_t in_bond_num = 0; + fsp_err_t retval = FSP_SUCCESS; + uint8_t * p_sec_data; + st_ble_gap_bond_info_t bond_info[BLE_ABS_CFG_NUMBER_BONDING]; + st_ble_gap_key_dist_t * key_info; + uint32_t i; - return FSP_ERR_UNSUPPORTED; -} + FSP_ERROR_RETURN((NULL != p_idaddr), FSP_ERR_INVALID_POINTER); + FSP_ERROR_RETURN((NULL != p_key_set), FSP_ERR_INVALID_POINTER); + FSP_ERROR_RETURN((NULL != p_num), FSP_ERR_INVALID_POINTER); -/*******************************************************************************************************************//** - * Read Local device Identity Address and IRK and/or CSRK in DataFlash. - * @retval FSP_ERR_UNSUPPORTED This feature is not supported in this configuration. - **********************************************************************************************************************/ -static fsp_err_t ble_abs_secure_data_readlocinfo (flash_instance_t const * p_instance, - ble_device_address_t * p_lc_id_addr, - uint8_t * p_lc_irk, - uint8_t * p_lc_csrk) -{ - (void) p_instance; - (void) p_lc_id_addr; - (void) p_lc_irk; - (void) p_lc_csrk; + /** Read bonding information from DataFlash. */ + retval = ble_abs_secure_data_read_bond_info(p_instance, &in_bond_num, &p_sec_data, bond_info); - return FSP_ERR_UNSUPPORTED; + if ((FSP_SUCCESS != retval) && (FSP_ERR_BLE_ABS_NOT_FOUND != retval)) + { + return retval; + } + + *p_num = 0; + + /** No bonding information is written in DataFlash. */ + if (0 == in_bond_num) + { + return FSP_SUCCESS; + } + + for (i = 0; i < in_bond_num; i++) + { + key_info = bond_info[i].p_keys->p_keys_info; + if (0 != (BLE_GAP_KEY_DIST_IDKEY & bond_info[i].p_keys->keys)) + { + /* set identity address */ + memcpy(p_idaddr[*p_num].addr, &key_info->id_addr_info[1], BLE_BD_ADDR_LEN); + p_idaddr[*p_num].type = key_info->id_addr_info[0]; + + /* set IRK */ + memcpy(p_key_set[*p_num].remote_irk, key_info->id_info, BLE_GAP_IRK_SIZE); + p_key_set[*p_num].local_irk_type = BLE_GAP_RL_LOC_KEY_REGISTERED; + (*p_num)++; + } + } + + /** bonding info buffer release */ + ble_abs_secure_data_release_bond_info_buf(p_sec_data); + + return retval; } +#else /* (BLE_ABS_CFG_ENABLE_SECURE_DATA == 1) */ static void ble_abs_secure_data_recvremkeys (ble_device_address_t * p_addr, st_ble_gap_key_ex_param_t * p_keys) { (void) p_addr; @@ -4167,12 +4347,30 @@ static void ble_abs_secure_data_delete_all_keys (st_ble_dev_addr_t * p_addr) { (void) p_addr; } +/*******************************************************************************************************************//** + * Get bonding information from DataFlash. + * + * @retval FSP_ERR_UNSUPPORTED This function is not supported on this configuration. + **********************************************************************************************************************/ +static fsp_err_t ble_abs_secure_data_get_identityinfo (flash_instance_t const * p_instance, + ble_device_address_t * p_idaddr, + st_ble_gap_rslv_list_key_set_t * p_key_set, + uint8_t * p_num) +{ + (void) p_instance; + (void) p_idaddr; + (void) p_key_set; + (void) p_num; + + return FSP_ERR_UNSUPPORTED; +} + #endif /* (BLE_ABS_CFG_ENABLE_SECURE_DATA == 1) */ /**************************************************************************************//** * Read the value of the specified data flash * @retval FSP_SUCCESS Operation succeeded. - * @retval FSP_ERR_INVALID_ARGUMENT parameter is invalid. + * @retval FSP_ERR_OUT_OF_MEMORY Parameter is invalid. *****************************************************************************************/ static fsp_err_t ble_abs_secure_data_flash_read (flash_instance_t const * p_instance, uint32_t addr, @@ -4194,7 +4392,7 @@ static fsp_err_t ble_abs_secure_data_flash_read (flash_instance_t const * p_inst if (((addr) < info.data_flash.p_block_array->block_section_st_addr) || ((addr + len) >= info.data_flash.p_block_array->block_section_end_addr)) { - err = FSP_ERR_INVALID_ARGUMENT; + err = FSP_ERR_OUT_OF_MEMORY; } } diff --git a/ra/fsp/src/rm_filex_levelx_nor/rm_filex_levelx_nor.c b/ra/fsp/src/rm_filex_levelx_nor/rm_filex_levelx_nor.c index ac6c6450a..d4d40ab80 100644 --- a/ra/fsp/src/rm_filex_levelx_nor/rm_filex_levelx_nor.c +++ b/ra/fsp/src/rm_filex_levelx_nor/rm_filex_levelx_nor.c @@ -117,8 +117,7 @@ static UINT rm_filex_levelx_nor_driver_request_handler (FX_MEDIA * p_fx_media) (rm_filex_levelx_nor_instance_t *) p_fx_media->fx_media_driver_info; rm_filex_levelx_nor_instance_ctrl_t * p_filex_levelx_nor_ctrl = p_filex_levelx_nor_instance->p_ctrl; - rm_filex_levelx_nor_cfg_t * p_filex_levelx_nor_cfg = - (rm_filex_levelx_nor_cfg_t *) p_filex_levelx_nor_instance->p_cfg; + rm_filex_levelx_nor_cfg_t * p_filex_levelx_nor_cfg = p_filex_levelx_nor_instance->p_cfg; /* Process the driver request specified in the media control block. */ switch (p_fx_media->fx_media_driver_request) diff --git a/ra/fsp/src/rm_fs2012/rm_fs2012.c b/ra/fsp/src/rm_fs2012/rm_fs2012.c new file mode 100644 index 000000000..8af860e9d --- /dev/null +++ b/ra/fsp/src/rm_fs2012/rm_fs2012.c @@ -0,0 +1,257 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Includes + **********************************************************************************************************************/ +#include "rm_fs2012.h" + +/*********************************************************************************************************************** + * Macro definitions + **********************************************************************************************************************/ + +/* Definitions of Open flag */ +#define RM_FS2012_OPEN (0x536C7181UL) // Open state + +/* Definitions of data size */ +#define RM_FS2012_DATA_SIZE (2) + +/* Definitions of A/D data */ +#define RM_FS2012_MASK_DATA_UPPER_0X0F (0x0F) + +/* Definitions for Calculation */ +#define RM_FS2012_CALC_DECIMAL_VALUE_100 (100.0) +#if RM_FS2012_CFG_DEVICE_TYPE + #define RM_FS2012_CALC_DEVISOR (10.0F) // FS2012-xxxx-LQ +#else + #define RM_FS2012_CALC_DEVISOR (1000.0F) // FS2012-xxxx-NG +#endif + +/*********************************************************************************************************************** + * Typedef definitions + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Global function prototypes + **********************************************************************************************************************/ +void rm_fs2012_callback(rm_comms_callback_args_t * p_args); + +/*********************************************************************************************************************** + * Private function prototypes + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Private global variables + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Global variables + **********************************************************************************************************************/ +rm_fsxxxx_api_t const g_fsxxxx_on_fs2012 = +{ + .open = RM_FS2012_Open, + .close = RM_FS2012_Close, + .read = RM_FS2012_Read, + .dataCalculate = RM_FS2012_DataCalculate, +}; + +/*******************************************************************************************************************//** + * @addtogroup RM_FS2012 + * @{ + **********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Functions + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @brief Opens and configures the FS2012 Middle module. Implements @ref rm_fsxxxx_api_t::open. + * + * Example: + * @snippet rm_fs2012_example.c RM_FS2012_Open + * + * @retval FSP_SUCCESS FS2012 successfully configured. + * @retval FSP_ERR_ASSERTION Null pointer, or one or more configuration options is invalid. + * @retval FSP_ERR_ALREADY_OPEN Module is already open. This module can only be opened once. + **********************************************************************************************************************/ +fsp_err_t RM_FS2012_Open (rm_fsxxxx_ctrl_t * const p_api_ctrl, rm_fsxxxx_cfg_t const * const p_cfg) +{ + fsp_err_t err = FSP_SUCCESS; + rm_fs2012_instance_ctrl_t * p_ctrl = (rm_fs2012_instance_ctrl_t *) p_api_ctrl; + +#if RM_FS2012_CFG_PARAM_CHECKING_ENABLE + FSP_ASSERT(NULL != p_ctrl); + FSP_ASSERT(NULL != p_cfg); + FSP_ASSERT(NULL != p_cfg->p_instance); + FSP_ERROR_RETURN(RM_FS2012_OPEN != p_ctrl->open, FSP_ERR_ALREADY_OPEN); +#endif + + p_ctrl->p_cfg = p_cfg; + p_ctrl->open = RM_FS2012_OPEN; + p_ctrl->p_comms_i2c_instance = p_cfg->p_instance; + p_ctrl->p_context = p_cfg->p_context; + p_ctrl->p_callback = p_cfg->p_callback; + + /* Open Communications middleware */ + err = p_ctrl->p_comms_i2c_instance->p_api->open(p_ctrl->p_comms_i2c_instance->p_ctrl, + p_ctrl->p_comms_i2c_instance->p_cfg); + FSP_ERROR_RETURN(FSP_SUCCESS == err, err); + + return FSP_SUCCESS; +} + +/*******************************************************************************************************************//** + * @brief Disables specified FS2012 control block. Implements @ref rm_fsxxxx_api_t::close. + * + * @retval FSP_SUCCESS Successfully closed. + * @retval FSP_ERR_ASSERTION Null pointer passed as a parameter. + * @retval FSP_ERR_NOT_OPEN Module is not open. + **********************************************************************************************************************/ +fsp_err_t RM_FS2012_Close (rm_fsxxxx_ctrl_t * const p_api_ctrl) +{ + rm_fs2012_instance_ctrl_t * p_ctrl = (rm_fs2012_instance_ctrl_t *) p_api_ctrl; + +#if RM_FS2012_CFG_PARAM_CHECKING_ENABLE + FSP_ASSERT(NULL != p_ctrl); + FSP_ERROR_RETURN(RM_FS2012_OPEN == p_ctrl->open, FSP_ERR_NOT_OPEN); +#endif + + /* Close Communications Middleware */ + p_ctrl->p_comms_i2c_instance->p_api->close(p_ctrl->p_comms_i2c_instance->p_ctrl); + + /* Clear Open flag */ + p_ctrl->open = 0; + + return FSP_SUCCESS; +} + +/*******************************************************************************************************************//** + * @brief Reads ADC data from FS2012. + * Implements @ref rm_fsxxxx_api_t::read. + * + * @retval FSP_SUCCESS Successfully data decoded. + * @retval FSP_ERR_ASSERTION Null pointer, or one or more configuration options is invalid. + * @retval FSP_ERR_NOT_OPEN Module is not open. + **********************************************************************************************************************/ +fsp_err_t RM_FS2012_Read (rm_fsxxxx_ctrl_t * const p_api_ctrl, rm_fsxxxx_raw_data_t * const p_raw_data) +{ + fsp_err_t err = FSP_SUCCESS; + rm_fs2012_instance_ctrl_t * p_ctrl = (rm_fs2012_instance_ctrl_t *) p_api_ctrl; + +#if RM_FS2012_CFG_PARAM_CHECKING_ENABLE + FSP_ASSERT(NULL != p_ctrl); + FSP_ASSERT(NULL != p_raw_data); + FSP_ERROR_RETURN(RM_FS2012_OPEN == p_ctrl->open, FSP_ERR_NOT_OPEN); +#endif + + /* Read 2 bytes raw data (See chapter 8 in FS2012 datasheet.) */ + err = + p_ctrl->p_comms_i2c_instance->p_api->read(p_ctrl->p_comms_i2c_instance->p_ctrl, + (uint8_t *) p_raw_data, + RM_FS2012_DATA_SIZE); + + FSP_ERROR_RETURN(FSP_SUCCESS == err, err); + + return FSP_SUCCESS; +} + +/*******************************************************************************************************************//** + * @brief Calculates flow from ADC data. + * Unit of Gas flow is SLPM (Standard liter per minute) + * Unit of Liquid flow is SCCM (Standard cubic centimeter per minute) + * Implements @ref rm_fsxxxx_api_t::dataCalculate. + * + * @retval FSP_SUCCESS Successfully data decoded. + * @retval FSP_ERR_ASSERTION Null pointer, or one or more configuration options is invalid. + * @retval FSP_ERR_NOT_OPEN Module is not open. + **********************************************************************************************************************/ +fsp_err_t RM_FS2012_DataCalculate (rm_fsxxxx_ctrl_t * const p_api_ctrl, + rm_fsxxxx_raw_data_t * const p_raw_data, + rm_fsxxxx_data_t * const p_fs2012_data) +{ + rm_fs2012_instance_ctrl_t * p_ctrl = (rm_fs2012_instance_ctrl_t *) p_api_ctrl; + float flow; + +#if RM_FS2012_CFG_PARAM_CHECKING_ENABLE + FSP_ASSERT(NULL != p_ctrl); + FSP_ASSERT(NULL != p_raw_data); + FSP_ASSERT(NULL != p_fs2012_data); + FSP_ERROR_RETURN(RM_FS2012_OPEN == p_ctrl->open, FSP_ERR_NOT_OPEN); +#endif + + FSP_PARAMETER_NOT_USED(p_ctrl); + + /* Calculate flow (Gas : [SLPM], Liquid : [SCCM]) */ + flow = (float) ((p_raw_data->adc_data[0] << 8) + p_raw_data->adc_data[1]) / RM_FS2012_CALC_DEVISOR; + + /* Set flow data */ + p_fs2012_data->flow.integer_part = (int16_t) flow; + p_fs2012_data->flow.decimal_part = + (int16_t) ((flow - (float) p_fs2012_data->flow.integer_part) * RM_FS2012_CALC_DECIMAL_VALUE_100); + + return FSP_SUCCESS; +} + +/*******************************************************************************************************************//** + * @} (end addtogroup FS2012) + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @brief FS2012 callback function called in the I2C Communications Middleware callback function. + **********************************************************************************************************************/ +void rm_fs2012_callback (rm_comms_callback_args_t * p_args) +{ + rm_fs2012_instance_ctrl_t * p_ctrl = (rm_fs2012_instance_ctrl_t *) p_args->p_context; + rm_fsxxxx_callback_args_t fs2012_callback_args; + + /* Set context */ + fs2012_callback_args.p_context = p_ctrl->p_context; + + /* Set event */ + switch (p_args->event) + { + case RM_COMMS_EVENT_OPERATION_COMPLETE: + { + fs2012_callback_args.event = RM_FSXXXX_EVENT_SUCCESS; + break; + } + + case RM_COMMS_EVENT_ERROR: + default: + { + fs2012_callback_args.event = RM_FSXXXX_EVENT_ERROR; + break; + } + } + + if (NULL != p_ctrl->p_callback) + { + /* Call callback function */ + p_ctrl->p_callback(&fs2012_callback_args); + } +} + +/*********************************************************************************************************************** + * Private Functions + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * Internal fs2012 private function. + **********************************************************************************************************************/ diff --git a/ra/fsp/src/rm_hs300x/rm_hs300x.c b/ra/fsp/src/rm_hs300x/rm_hs300x.c index 266b200dd..1a85a843b 100644 --- a/ra/fsp/src/rm_hs300x/rm_hs300x.c +++ b/ra/fsp/src/rm_hs300x/rm_hs300x.c @@ -28,52 +28,80 @@ **********************************************************************************************************************/ /* Definitions of Open flag */ -#define RM_HS300X_OPEN (0x433E4432UL) // Open state +#define RM_HS300X_OPEN (0x433E4432UL) // Open state /* Definitions of HS300X data size */ #if RM_HS300X_CFG_DATA_BOTH_HUMIDITY_TEMPERATURE - #define RM_HS300X_DATA_SIZE (4) // Both humidity and temperature + #define RM_HS300X_DATA_SIZE (4) // Both humidity and temperature #else - #define RM_HS300X_DATA_SIZE (2) // Humidity only + #define RM_HS300X_DATA_SIZE (2) // Humidity only #endif /* Definitions of Mask Data for A/D data */ -#define RM_HS300X_MASK_HUMIDITY_UPPER_0X3F (0x3F) -#define RM_HS300X_MASK_TEMPERATURE_LOWER_0XFC (0xFC) -#define RM_HS300X_MASK_STATUS_0XC0 (0xC0) +#define RM_HS300X_MASK_HUMIDITY_UPPER_0X3F (0x3F) +#define RM_HS300X_MASK_TEMPERATURE_LOWER_0XFC (0xFC) +#define RM_HS300X_MASK_STATUS_0XC0 (0xC0) /* Definitions for Status Bits of A/D Data */ -#define RM_HS300X_DATA_STATUS_VALID (0x00) // Status-bit: Valid data +#define RM_HS300X_DATA_STATUS_VALID (0x00) // Status-bit: Valid data /* Definitions for Calculation */ -#define RM_HS300X_CALC_STATIC_VALUE (16383.0F) -#define RM_HS300X_CALC_HUMD_VALUE_100 (100.0F) -#define RM_HS300X_CALC_TEMP_C_VALUE_165 (165.0F) -#define RM_HS300X_CALC_TEMP_C_VALUE_40 (40.0F) -#define RM_HS300X_CALC_DECIMAL_VALUE_100 (100.0F) +#define RM_HS300X_CALC_STATIC_VALUE (16383.0F) +#define RM_HS300X_CALC_HUMD_VALUE_100 (100.0F) +#define RM_HS300X_CALC_TEMP_C_VALUE_165 (165.0F) +#define RM_HS300X_CALC_TEMP_C_VALUE_40 (40.0F) +#define RM_HS300X_CALC_DECIMAL_VALUE_100 (100.0F) + +/* Definitions for Programming mode */ +#define RM_HS300X_PROGRAMMING_MODE_ENTER (0xA0) +#define RM_HS300X_PROGRAMMING_MODE_EXIT (0x80) +#define RM_HS300X_PROGRAMMING_MODE_SUCCESS_STATUS (0x81) +#define RM_HS300X_HUMIDITY_RESOLUTION_READ (0x06) +#define RM_HS300X_HUMIDITY_RESOLUTION_WRITE (0x46) +#define RM_HS300X_TEMPERATURE_RESOLUTION_READ (0x11) +#define RM_HS300X_TEMPERATURE_RESOLUTION_WRITE (0x51) +#define RM_HS300X_SENSOR_ID_UPPER (0x1E) +#define RM_HS300X_SENSOR_ID_LOWER (0x1F) +#define RM_HS300X_RESOLUTION_CLEAR (0xF3) + +/* Definitions of Timeout */ +#define RM_HS300X_TIMEOUT (1000) + +/* Definitions of Wait Time */ +#define RM_HS300X_WAIT_TIME_100 (100) +#define RM_HS300X_WAIT_TIME_120 (120) /*********************************************************************************************************************** * Typedef definitions **********************************************************************************************************************/ +/*********************************************************************************************************************** + * Global function prototypes + **********************************************************************************************************************/ +void rm_hs300x_callback(rm_comms_callback_args_t * p_args); + /*********************************************************************************************************************** * Private function prototypes **********************************************************************************************************************/ +extern fsp_err_t rm_hs300x_delay_us(rm_hs300x_instance_ctrl_t * const p_ctrl, uint32_t const delay_us); /*********************************************************************************************************************** * Private global variables **********************************************************************************************************************/ - /*********************************************************************************************************************** * Global variables **********************************************************************************************************************/ rm_hs300x_api_t const g_hs300x_on_hs300x = { - .open = RM_HS300X_Open, - .close = RM_HS300X_Close, - .measurementStart = RM_HS300X_MeasurementStart, - .read = RM_HS300X_Read, - .dataCalculate = RM_HS300X_DataCalculate, + .open = RM_HS300X_Open, + .close = RM_HS300X_Close, + .measurementStart = RM_HS300X_MeasurementStart, + .read = RM_HS300X_Read, + .dataCalculate = RM_HS300X_DataCalculate, + .programmingModeEnter = RM_HS300X_ProgrammingModeEnter, + .resolutionChange = RM_HS300X_ResolutionChange, + .sensorIdGet = RM_HS300X_SensorIdGet, + .programmingModeExit = RM_HS300X_ProgrammingModeExit, }; /*******************************************************************************************************************//** @@ -107,18 +135,19 @@ fsp_err_t RM_HS300X_Open (rm_hs300x_ctrl_t * const p_api_ctrl, rm_hs300x_cfg_t c FSP_ERROR_RETURN(RM_HS300X_OPEN != p_ctrl->open, FSP_ERR_ALREADY_OPEN); #endif - p_ctrl->p_cfg = p_cfg; - p_ctrl->open = RM_HS300X_OPEN; - p_ctrl->p_comms_i2c_instance = p_cfg->p_instance; - p_ctrl->p_context = p_cfg->p_context; - p_ctrl->p_callback = p_cfg->p_callback; + p_ctrl->p_cfg = p_cfg; + p_ctrl->p_comms_i2c_instance = p_cfg->p_instance; + p_ctrl->p_context = p_cfg->p_context; + p_ctrl->p_callback = p_cfg->p_callback; + p_ctrl->programming_mode.enter = false; /* Open Communications middleware */ err = p_ctrl->p_comms_i2c_instance->p_api->open(p_ctrl->p_comms_i2c_instance->p_ctrl, p_ctrl->p_comms_i2c_instance->p_cfg); FSP_ERROR_RETURN(FSP_SUCCESS == err, err); - /* May need to add resolution */ + /* Set open flag */ + p_ctrl->open = RM_HS300X_OPEN; return FSP_SUCCESS; } @@ -258,6 +287,348 @@ fsp_err_t RM_HS300X_DataCalculate (rm_hs300x_ctrl_t * const p_api_ctrl, return FSP_SUCCESS; } +/*******************************************************************************************************************//** + * @brief This function must be called within 10ms after applying power to the sensor. + * Sends the commands to enter the programming mode. + * After calling this function, please wait 120us. + * Implements @ref rm_hs300x_api_t::programmingModeEnter. + * + * @retval FSP_SUCCESS Successfully started. + * @retval FSP_ERR_ASSERTION Null pointer passed as a parameter. + * @retval FSP_ERR_NOT_OPEN Module is not open. + * @retval FSP_ERR_UNSUPPORTED Programming mode is not supported. + **********************************************************************************************************************/ +fsp_err_t RM_HS300X_ProgrammingModeEnter (rm_hs300x_ctrl_t * const p_api_ctrl) +{ + /* The procedure in this function is based on section 6.8 "Accessing the Non-volatile Memory" of the HS300x Datasheet R36DS0010EU0701. */ + +#if RM_HS300X_CFG_PROGRAMMING_MODE + fsp_err_t err = FSP_SUCCESS; + rm_hs300x_instance_ctrl_t * p_ctrl = (rm_hs300x_instance_ctrl_t *) p_api_ctrl; + uint8_t write_data[3]; + + #if RM_HS300X_CFG_PARAM_CHECKING_ENABLE + FSP_ASSERT(NULL != p_ctrl); + FSP_ERROR_RETURN(RM_HS300X_OPEN == p_ctrl->open, FSP_ERR_NOT_OPEN); + #endif + + /* Set the flag */ + p_ctrl->programming_mode.enter = true; + + /* Write the commands */ + write_data[0] = RM_HS300X_PROGRAMMING_MODE_ENTER; + write_data[1] = 0x00; + write_data[2] = 0x00; + err = p_ctrl->p_comms_i2c_instance->p_api->write(p_ctrl->p_comms_i2c_instance->p_ctrl, &write_data[0], 3); + FSP_ERROR_RETURN(FSP_SUCCESS == err, err); + + return FSP_SUCCESS; +#else + FSP_PARAMETER_NOT_USED(p_api_ctrl); + + return FSP_ERR_UNSUPPORTED; +#endif +} + +/*******************************************************************************************************************//** + * @brief This function must be called after calling the RM_HS300X_ProgrammingModeEnter function. + * Changes the sensor resolution. + * This function blocks for 120 us software delay plus 9 bytes on the I2C bus. + * After calling this function, 14ms must be waited. + * Failure to comply with these times may result in data corruption and introduce errors in sensor measurements. + * Implements @ref rm_hs300x_api_t::resolutionChange. + * + * @retval FSP_SUCCESS Successfully started. + * @retval FSP_ERR_ASSERTION Null pointer passed as a parameter. + * @retval FSP_ERR_NOT_OPEN Module is not open. + * @retval FSP_ERR_INVALID_MODE Module is not entering the programming mode. + * @retval FSP_ERR_ABORTED Communication is aborted. + * @retval FSP_ERR_TIMEOUT Communication is timeout. + * @retval FSP_ERR_UNSUPPORTED Programming mode is not supported. + **********************************************************************************************************************/ +fsp_err_t RM_HS300X_ResolutionChange (rm_hs300x_ctrl_t * const p_api_ctrl, + rm_hs300x_data_type_t const data_type, + rm_hs300x_resolution_t const resolution) +{ + /* The procedure in this function is based on section 6.9 "Setting the Measurement Resolution" of the HS300x Datasheet R36DS0010EU0701. */ + +#if RM_HS300X_CFG_PROGRAMMING_MODE + fsp_err_t err = FSP_SUCCESS; + rm_hs300x_instance_ctrl_t * p_ctrl = (rm_hs300x_instance_ctrl_t *) p_api_ctrl; + uint8_t transfer_data[3]; + uint16_t counter = 0; + + #if RM_HS300X_CFG_PARAM_CHECKING_ENABLE + FSP_ASSERT(NULL != p_ctrl); + FSP_ERROR_RETURN(RM_HS300X_OPEN == p_ctrl->open, FSP_ERR_NOT_OPEN); + FSP_ERROR_RETURN(true == p_ctrl->programming_mode.enter, FSP_ERR_INVALID_MODE); + #endif + + /* Set the register address */ + if (RM_HS300X_HUMIDITY_DATA == data_type) + { + transfer_data[0] = RM_HS300X_HUMIDITY_RESOLUTION_READ; + } + else + { + transfer_data[0] = RM_HS300X_TEMPERATURE_RESOLUTION_READ; + } + + transfer_data[1] = 0x00; + transfer_data[2] = 0x00; + + /* Set the blocking flag */ + p_ctrl->programming_mode.blocking = true; + + /* Write the register address */ + p_ctrl->programming_mode.communication_finished = false; + err = p_ctrl->p_comms_i2c_instance->p_api->write(p_ctrl->p_comms_i2c_instance->p_ctrl, &transfer_data[0], 3); + FSP_ERROR_RETURN(FSP_SUCCESS == err, err); + + /* Wait the callback */ + while (false == p_ctrl->programming_mode.communication_finished) + { + rm_hs300x_delay_us(p_ctrl, RM_HS300X_WAIT_TIME_100); + counter++; + FSP_ERROR_RETURN(RM_HS300X_TIMEOUT >= counter, FSP_ERR_TIMEOUT); + } + + /* Check the error */ + FSP_ERROR_RETURN(RM_HS300X_EVENT_SUCCESS == p_ctrl->programming_mode.event, FSP_ERR_ABORTED); + + /* Delay 120us */ + err = rm_hs300x_delay_us(p_ctrl, RM_HS300X_WAIT_TIME_120); + FSP_ERROR_RETURN(FSP_SUCCESS == err, err); + + /* Read the current resolution */ + p_ctrl->programming_mode.communication_finished = false; + err = p_ctrl->p_comms_i2c_instance->p_api->read(p_ctrl->p_comms_i2c_instance->p_ctrl, &transfer_data[0], 3); + FSP_ERROR_RETURN(FSP_SUCCESS == err, err); + + /* Wait the callback */ + while (false == p_ctrl->programming_mode.communication_finished) + { + rm_hs300x_delay_us(p_ctrl, RM_HS300X_WAIT_TIME_100); + counter++; + FSP_ERROR_RETURN(RM_HS300X_TIMEOUT >= counter, FSP_ERR_TIMEOUT); + } + + /* Check the errors */ + FSP_ERROR_RETURN(RM_HS300X_EVENT_SUCCESS == p_ctrl->programming_mode.event, FSP_ERR_ABORTED); + FSP_ERROR_RETURN(RM_HS300X_PROGRAMMING_MODE_SUCCESS_STATUS == transfer_data[0], FSP_ERR_INVALID_MODE); + + /* Set the register address */ + if (RM_HS300X_HUMIDITY_DATA == data_type) + { + transfer_data[0] = RM_HS300X_HUMIDITY_RESOLUTION_WRITE; + } + else + { + transfer_data[0] = RM_HS300X_TEMPERATURE_RESOLUTION_WRITE; + } + + /* set the next resolution */ + transfer_data[1] &= RM_HS300X_RESOLUTION_CLEAR; // Clear the current resolution + transfer_data[1] |= resolution; // Set the new resolution + + /* Clear the blocking flag */ + p_ctrl->programming_mode.blocking = false; + + /* Write the next resolution */ + err = p_ctrl->p_comms_i2c_instance->p_api->write(p_ctrl->p_comms_i2c_instance->p_ctrl, &transfer_data[0], 3); + FSP_ERROR_RETURN(FSP_SUCCESS == err, err); + + return FSP_SUCCESS; +#else + FSP_PARAMETER_NOT_USED(p_api_ctrl); + FSP_PARAMETER_NOT_USED(data_type); + FSP_PARAMETER_NOT_USED(resolution); + + return FSP_ERR_UNSUPPORTED; +#endif +} + +/*******************************************************************************************************************//** + * @brief This function must be called after calling the RM_HS300X_ProgrammingModeEnter function. + * Gets the sensor ID. + * This function blocks for 240 us software delay plus 12 bytes on the I2C bus. + * Implements @ref rm_hs300x_api_t::sensorIdGet. + * + * @retval FSP_SUCCESS Successfully started. + * @retval FSP_ERR_ASSERTION Null pointer passed as a parameter. + * @retval FSP_ERR_NOT_OPEN Module is not open. + * @retval FSP_ERR_INVALID_MODE Module is not entering the programming mode. + * @retval FSP_ERR_ABORTED Communication is aborted. + * @retval FSP_ERR_TIMEOUT Communication is timeout. + * @retval FSP_ERR_UNSUPPORTED Programming mode is not supported. + **********************************************************************************************************************/ +fsp_err_t RM_HS300X_SensorIdGet (rm_hs300x_ctrl_t * const p_api_ctrl, uint32_t * const p_sensor_id) +{ + /* The procedure in this function is based on section 6.10 "Reading the HS300x ID Number" of the HS300x Datasheet R36DS0010EU0701. */ + +#if RM_HS300X_CFG_PROGRAMMING_MODE + fsp_err_t err = FSP_SUCCESS; + rm_hs300x_instance_ctrl_t * p_ctrl = (rm_hs300x_instance_ctrl_t *) p_api_ctrl; + uint8_t transfer_data[3]; + uint16_t counter = 0; + + #if RM_HS300X_CFG_PARAM_CHECKING_ENABLE + FSP_ASSERT(NULL != p_ctrl); + FSP_ASSERT(NULL != p_sensor_id); + FSP_ERROR_RETURN(RM_HS300X_OPEN == p_ctrl->open, FSP_ERR_NOT_OPEN); + FSP_ERROR_RETURN(true == p_ctrl->programming_mode.enter, FSP_ERR_INVALID_MODE); + #endif + + /* Set the register address of upper value */ + transfer_data[0] = RM_HS300X_SENSOR_ID_UPPER; + transfer_data[1] = 0x00; + transfer_data[2] = 0x00; + + /* Set the blocking flag */ + p_ctrl->programming_mode.blocking = true; + + /* Write the register address */ + p_ctrl->programming_mode.communication_finished = false; + err = p_ctrl->p_comms_i2c_instance->p_api->write(p_ctrl->p_comms_i2c_instance->p_ctrl, &transfer_data[0], 3); + FSP_ERROR_RETURN(FSP_SUCCESS == err, err); + + /* Wait the callback */ + while (false == p_ctrl->programming_mode.communication_finished) + { + rm_hs300x_delay_us(p_ctrl, RM_HS300X_WAIT_TIME_100); + counter++; + FSP_ERROR_RETURN(RM_HS300X_TIMEOUT >= counter, FSP_ERR_TIMEOUT); + } + + /* Check the error */ + FSP_ERROR_RETURN(RM_HS300X_EVENT_SUCCESS == p_ctrl->programming_mode.event, FSP_ERR_ABORTED); + + /* Delay 120us */ + err = rm_hs300x_delay_us(p_ctrl, RM_HS300X_WAIT_TIME_120); + FSP_ERROR_RETURN(FSP_SUCCESS == err, err); + + /* Read the upper value of the sensor ID */ + p_ctrl->programming_mode.communication_finished = false; + err = p_ctrl->p_comms_i2c_instance->p_api->read(p_ctrl->p_comms_i2c_instance->p_ctrl, &transfer_data[0], 3); + FSP_ERROR_RETURN(FSP_SUCCESS == err, err); + + /* Wait the callback */ + while (false == p_ctrl->programming_mode.communication_finished) + { + rm_hs300x_delay_us(p_ctrl, RM_HS300X_WAIT_TIME_100); + counter++; + FSP_ERROR_RETURN(RM_HS300X_TIMEOUT >= counter, FSP_ERR_TIMEOUT); + } + + /* Check the errors */ + FSP_ERROR_RETURN(RM_HS300X_EVENT_SUCCESS == p_ctrl->programming_mode.event, FSP_ERR_ABORTED); + FSP_ERROR_RETURN(RM_HS300X_PROGRAMMING_MODE_SUCCESS_STATUS == transfer_data[0], FSP_ERR_INVALID_MODE); + + /* set the upper value of sensor ID */ + *p_sensor_id = (uint32_t) ((transfer_data[1] << 8) + transfer_data[2]) << 16; + + /* Set the register address of lower value */ + transfer_data[0] = RM_HS300X_SENSOR_ID_LOWER; + transfer_data[1] = 0x00; + transfer_data[2] = 0x00; + + /* Write the register address */ + p_ctrl->programming_mode.communication_finished = false; + err = p_ctrl->p_comms_i2c_instance->p_api->write(p_ctrl->p_comms_i2c_instance->p_ctrl, &transfer_data[0], 3); + FSP_ERROR_RETURN(FSP_SUCCESS == err, err); + + /* Wait the callback */ + while (false == p_ctrl->programming_mode.communication_finished) + { + rm_hs300x_delay_us(p_ctrl, RM_HS300X_WAIT_TIME_100); + counter++; + FSP_ERROR_RETURN(RM_HS300X_TIMEOUT >= counter, FSP_ERR_TIMEOUT); + } + + /* Check the error */ + FSP_ERROR_RETURN(RM_HS300X_EVENT_SUCCESS == p_ctrl->programming_mode.event, FSP_ERR_ABORTED); + + /* Delay 120us */ + err = rm_hs300x_delay_us(p_ctrl, RM_HS300X_WAIT_TIME_120); + FSP_ERROR_RETURN(FSP_SUCCESS == err, err); + + /* Read the lower value of the sensor ID */ + p_ctrl->programming_mode.communication_finished = false; + err = p_ctrl->p_comms_i2c_instance->p_api->read(p_ctrl->p_comms_i2c_instance->p_ctrl, &transfer_data[0], 3); + FSP_ERROR_RETURN(FSP_SUCCESS == err, err); + + /* Wait the callback */ + while (false == p_ctrl->programming_mode.communication_finished) + { + rm_hs300x_delay_us(p_ctrl, RM_HS300X_WAIT_TIME_100); + counter++; + FSP_ERROR_RETURN(RM_HS300X_TIMEOUT >= counter, FSP_ERR_TIMEOUT); + } + + /* Check the errors */ + FSP_ERROR_RETURN(RM_HS300X_EVENT_SUCCESS == p_ctrl->programming_mode.event, FSP_ERR_ABORTED); + FSP_ERROR_RETURN(RM_HS300X_PROGRAMMING_MODE_SUCCESS_STATUS == transfer_data[0], FSP_ERR_INVALID_MODE); + + /* set the upper value of sensor ID */ + *p_sensor_id = *p_sensor_id + (uint32_t) ((transfer_data[1] << 8) + transfer_data[2]); + + /* Clear the blocking flag */ + p_ctrl->programming_mode.blocking = false; + + return FSP_SUCCESS; +#else + FSP_PARAMETER_NOT_USED(p_api_ctrl); + FSP_PARAMETER_NOT_USED(p_sensor_id); + + return FSP_ERR_UNSUPPORTED; +#endif +} + +/*******************************************************************************************************************//** + * @brief This function must be called after calling the RM_HS300X_ProgrammingModeEnter function. + * This function must be called to return to normal sensor operation and perform measurements. + * Sends the commands to exit the programming mode. + * Implements @ref rm_hs300x_api_t::programmingModeExit. + * + * @retval FSP_SUCCESS Successfully started. + * @retval FSP_ERR_ASSERTION Null pointer passed as a parameter. + * @retval FSP_ERR_NOT_OPEN Module is not open. + * @retval FSP_ERR_INVALID_MODE Module is not entering the programming mode. + * @retval FSP_ERR_UNSUPPORTED Programming mode is not supported. + **********************************************************************************************************************/ +fsp_err_t RM_HS300X_ProgrammingModeExit (rm_hs300x_ctrl_t * const p_api_ctrl) +{ + /* The procedure in this function is based on section 6.8 "Accessing the Non-volatile Memory" of the HS300x Datasheet R36DS0010EU0701. */ + +#if RM_HS300X_CFG_PROGRAMMING_MODE + fsp_err_t err = FSP_SUCCESS; + rm_hs300x_instance_ctrl_t * p_ctrl = (rm_hs300x_instance_ctrl_t *) p_api_ctrl; + uint8_t write_data[3]; + + #if RM_HS300X_CFG_PARAM_CHECKING_ENABLE + FSP_ASSERT(NULL != p_ctrl); + FSP_ERROR_RETURN(RM_HS300X_OPEN == p_ctrl->open, FSP_ERR_NOT_OPEN); + FSP_ERROR_RETURN(true == p_ctrl->programming_mode.enter, FSP_ERR_INVALID_MODE); + #endif + + /* Write the commands */ + write_data[0] = RM_HS300X_PROGRAMMING_MODE_EXIT; + write_data[1] = 0x00; + write_data[2] = 0x00; + err = p_ctrl->p_comms_i2c_instance->p_api->write(p_ctrl->p_comms_i2c_instance->p_ctrl, &write_data[0], 3); + FSP_ERROR_RETURN(FSP_SUCCESS == err, err); + + /* Clear the flag */ + p_ctrl->programming_mode.enter = false; + + return FSP_SUCCESS; +#else + FSP_PARAMETER_NOT_USED(p_api_ctrl); + + return FSP_ERR_UNSUPPORTED; +#endif +} + /*******************************************************************************************************************//** * @} (end addtogroup HS300X) **********************************************************************************************************************/ @@ -290,10 +661,21 @@ void rm_hs300x_callback (rm_comms_callback_args_t * p_args) } } - if (NULL != p_ctrl->p_callback) + if (true == p_ctrl->programming_mode.blocking) { - /* Call callback function */ - p_ctrl->p_callback(&hs300x_callback_args); + /* Set flag */ + p_ctrl->programming_mode.communication_finished = true; + + /* Set event */ + p_ctrl->programming_mode.event = hs300x_callback_args.event; + } + else + { + if (NULL != p_ctrl->p_callback) + { + /* Call callback function */ + p_ctrl->p_callback(&hs300x_callback_args); + } } } diff --git a/ra/fsp/src/rm_hs300x/rm_hs300x_ra_driver.c b/ra/fsp/src/rm_hs300x/rm_hs300x_ra_driver.c new file mode 100644 index 000000000..9473a7dc0 --- /dev/null +++ b/ra/fsp/src/rm_hs300x/rm_hs300x_ra_driver.c @@ -0,0 +1,60 @@ +/*********************************************************************************************************************** + * Copyright [2020-2021] Renesas Electronics Corporation and/or its affiliates. All Rights Reserved. + * + * This software and documentation are supplied by Renesas Electronics America Inc. and may only be used with products + * of Renesas Electronics Corp. and its affiliates ("Renesas"). No other uses are authorized. Renesas products are + * sold pursuant to Renesas terms and conditions of sale. Purchasers are solely responsible for the selection and use + * of Renesas products and Renesas assumes no liability. No license, express or implied, to any intellectual property + * right is granted by Renesas. This software is protected under all applicable laws, including copyright laws. Renesas + * reserves the right to change or discontinue this software and/or this documentation. THE SOFTWARE AND DOCUMENTATION + * IS DELIVERED TO YOU "AS IS," AND RENESAS MAKES NO REPRESENTATIONS OR WARRANTIES, AND TO THE FULLEST EXTENT + * PERMISSIBLE UNDER APPLICABLE LAW, DISCLAIMS ALL WARRANTIES, WHETHER EXPLICITLY OR IMPLICITLY, INCLUDING WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NONINFRINGEMENT, WITH RESPECT TO THE SOFTWARE OR + * DOCUMENTATION. RENESAS SHALL HAVE NO LIABILITY ARISING OUT OF ANY SECURITY VULNERABILITY OR BREACH. TO THE MAXIMUM + * EXTENT PERMITTED BY LAW, IN NO EVENT WILL RENESAS BE LIABLE TO YOU IN CONNECTION WITH THE SOFTWARE OR DOCUMENTATION + * (OR ANY PERSON OR ENTITY CLAIMING RIGHTS DERIVED FROM YOU) FOR ANY LOSS, DAMAGES, OR CLAIMS WHATSOEVER, INCLUDING, + * WITHOUT LIMITATION, ANY DIRECT, CONSEQUENTIAL, SPECIAL, INDIRECT, PUNITIVE, OR INCIDENTAL DAMAGES; ANY LOST PROFITS, + * OTHER ECONOMIC DAMAGE, PROPERTY DAMAGE, OR PERSONAL INJURY; AND EVEN IF RENESAS HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH LOSS, DAMAGES, CLAIMS OR COSTS. + **********************************************************************************************************************/ + +/********************************************************************************************************************** + * Includes , "Project Includes" + *********************************************************************************************************************/ +#include "rm_hs300x.h" + +/********************************************************************************************************************** + * Macro definitions + *********************************************************************************************************************/ + +/********************************************************************************************************************** + * Local Typedef definitions + *********************************************************************************************************************/ + +/********************************************************************************************************************** + * Exported global variables + *********************************************************************************************************************/ +fsp_err_t rm_hs300x_delay_us(rm_hs300x_instance_ctrl_t * const p_ctrl, uint32_t const delay_us); + +/********************************************************************************************************************** + * Private (static) variables and functions + *********************************************************************************************************************/ + +/*********************************************************************************************************************** + * Functions + **********************************************************************************************************************/ + +/*******************************************************************************************************************//** + * @brief Delay some microseconds. + * + * @retval FSP_SUCCESS successfully configured. + **********************************************************************************************************************/ +fsp_err_t rm_hs300x_delay_us (rm_hs300x_instance_ctrl_t * const p_ctrl, uint32_t const delay_us) +{ + FSP_PARAMETER_NOT_USED(p_ctrl); + + /* Software delay */ + R_BSP_SoftwareDelay(delay_us, BSP_DELAY_UNITS_MICROSECONDS); + + return FSP_SUCCESS; +} diff --git a/ra/fsp/src/rm_touch/rm_touch.c b/ra/fsp/src/rm_touch/rm_touch.c index e2901fba6..792abbee5 100644 --- a/ra/fsp/src/rm_touch/rm_touch.c +++ b/ra/fsp/src/rm_touch/rm_touch.c @@ -88,7 +88,7 @@ (TOUCH_MONITOR_WHEAD_SIZE * TOUCH_MONITOR_BLOCK_MAX) + \ (TOUCH_MONITOR_WHEEL_SIZE * TOUCH_CFG_NUM_WHEELS) + \ (TOUCH_MONITOR_PAD_TOTAL_SIZE) + \ - TOUCH_MONITOR_FOOTER_SIZE) + TOUCH_MONITOR_FOOTER_SIZE * TOUCH_MONITOR_BLOCK_MAX) #if (TOUCH_CFG_UART_MONITOR_SUPPORT == 1) @@ -106,6 +106,8 @@ #define TOUCH_UART_COMMAND_WRITE (0x14) #define TOUCH_UART_COMMAND_VERSION (0x15) + #define TOUCH_UART_COMMAND_TOP_NUM (0x1) + /* Response ID */ #define TOUCH_UART_RESPONSE_BIT (0x80) #define TOUCH_UART_RESPONSE_ERROR_BIT (0xA0) @@ -137,22 +139,6 @@ /* UART Receive Buffer Size */ #define TOUCH_UART_RECIEVE_BUF_SIZE (13) -/* Register mask and bit-shift */ - #if (BSP_FEATURE_CTSU_VERSION == 2) - #define TOUCH_UART_CTSUSO_MASK (0x3FF) - #define TOUCH_UART_CTSUSNUM_MASK (0xFF) - #define TOUCH_UART_CTSUSDPA_MASK (0xFF) - #define TOUCH_UART_CTSUSNUM_SHIFT (10) - #define TOUCH_UART_CTSUSDPA_SHIFT (24) - #endif - #if (BSP_FEATURE_CTSU_VERSION == 1) - #define TOUCH_UART_CTSUSO_MASK (0x3FF) - #define TOUCH_UART_CTSUSNUM_MASK (0x3F) - #define TOUCH_UART_CTSUSDPA_MASK (0x1F) - #define TOUCH_UART_CTSUSNUM_SHIFT (10) - #define TOUCH_UART_CTSUSDPA_SHIFT (8) - #endif - /* UART Command version */ #define TOUCH_UART_VERSION_MAJOR ((uint8_t) 0x01U) #define TOUCH_UART_VERSION_MINOR ((uint8_t) 0x00U) @@ -169,6 +155,85 @@ #define TOUCH_PAD_MONITOR_TOUCH_NUM_MAX (10) #endif +#define TOUCH_RATIO_CALC(a) ((uint16_t) (a / 100)) + +#if (TOUCH_CFG_UART_TUNING_SUPPORT == 1) + #if (BSP_FEATURE_CTSU_VERSION == 2) + #define TOUCH_TUNING_CH_REG_MAX_NUM (32) + #define TOUCH_TUNING_KEY_MAX_NUM (CTSU_CFG_NUM_SELF_ELEMENTS + CTSU_CFG_NUM_MUTUAL_ELEMENTS * 2) + + #define TOUCH_UART_TSCHAC_MASK (0xFF) + #define TOUCH_UART_TSCHTRC_MASK (0xFF) + +/* UART Receive Buffer Size */ + #define TOUCH_TUNING_TRANSMIT_BUF_SIZE (0xC) + +/* Control byte */ + #define TOUCH_TUNING_HEADER (0x55) + #define TOUCH_TUNING_FOOTER (0x0A) + +/* Command ID */ + #define TOUCH_TUNING_COMMAND_START (0x21) + #define TOUCH_TUNING_COMMAND_STOP (0x22) + #define TOUCH_TUNING_COMMAND_VARIABLE_WRITE (0x23) + #define TOUCH_TUNING_COMMAND_VARIABLE_READ (0x24) + #define TOUCH_TUNING_COMMAND_ADDRESS_WRITE (0x25) + #define TOUCH_TUNING_COMMAND_ADDRESS_READ (0x26) + #define TOUCH_TUNING_COMMAND_PHASE_RUN (0x27) + #define TOUCH_TUNING_COMMAND_VERSION (0x28) + + #define TOUCH_TUNING_COMMAND_TOP_NUM (0x2) + +/* Response ID */ + #define TOUCH_TUNING_RESPONSE_BIT (0x60) + #define TOUCH_TUNING_RESPONSE_ERROR_BIT (0xA0) + +/*variable command ID */ + #define TOUCH_TUNIG_VARIABLE_MCU_GROUP (0x1) + #define TOUCH_TUNIG_VARIABLE_PCLKB_FREQUENCY (0x2) + #define TOUCH_TUNIG_VARIABLE_TUNING_MODE (0x3) + #define TOUCH_TUNIG_VARIABLE_CTSU_STATE (0x4) + #define TOUCH_TUNIG_VARIABLE_CTSU_SCAN_MODE (0x5) + #define TOUCH_TUNIG_VARIABLE_TS_CHAC_MASK_BOTTOM (0x6) + #define TOUCH_TUNIG_VARIABLE_TS_CHAC_MASK_TOP (0x7) + #define TOUCH_TUNIG_VARIABLE_TS_CHTRC_MASK_BOTTOM (0x8) + #define TOUCH_TUNIG_VARIABLE_TS_CHTRC_MASK_TOP (0x9) + #define TOUCH_TUNIG_VARIABLE_QE_TXVSEL (0xA) + #define TOUCH_TUNIG_VARIABLE_QE_ATUNE (0xB) + #define TOUCH_TUNIG_VARIABLE_QE_POSEL (0xC) + #define TOUCH_TUNIG_VARIABLE_ERR_EVENT (0xD) + #define TOUCH_TUNIG_VARIABLE_CTSU_ICO_DATA_PRI (0xE) + #define TOUCH_TUNIG_VARIABLE_CTSU_ICO_DATA_SND (0xF) + #define TOUCH_TUNIG_VARIABLE_CTSU_MUTUAL_DATA (0x10) + #define TOUCH_TUNIG_VARIABLE_ELEMENT_CFGS_SO (0x11) + #define TOUCH_TUNIG_VARIABLE_ELEMENT_CFGS_SNUM (0x12) + #define TOUCH_TUNIG_VARIABLE_ELEMENT_CFGS_SDPA (0x13) + #endif +#endif + +#if ((TOUCH_CFG_MONITOR_ENABLE && (TOUCH_CFG_UART_MONITOR_SUPPORT == 1)) || (TOUCH_CFG_UART_TUNING_SUPPORT == 1) && \ + (BSP_FEATURE_CTSU_VERSION == 2)) + +/* Register mask and bit-shift */ + #if (BSP_FEATURE_CTSU_VERSION == 2) + #define TOUCH_UART_CTSUSO_MASK (0x3FF) + #define TOUCH_UART_CTSUSNUM_MASK (0xFF) + #define TOUCH_UART_CTSUSDPA_MASK (0xFF) + #define TOUCH_UART_CTSUSNUM_SHIFT (10) + #define TOUCH_UART_CTSUSDPA_SHIFT (24) + #endif + #if (BSP_FEATURE_CTSU_VERSION == 1) + #define TOUCH_UART_CTSUSO_MASK (0x3FF) + #define TOUCH_UART_CTSUSNUM_MASK (0x3F) + #define TOUCH_UART_CTSUSDPA_MASK (0x1F) + #define TOUCH_UART_CTSUSNUM_SHIFT (10) + #define TOUCH_UART_CTSUSDPA_SHIFT (8) + #endif + + #define TOUCH_TUNING_COMMAND_BUF_NUM (0x2) + #define TOUCH_TUNING_RECIEVE_BUF_SIZE (0xF) +#endif + /*********************************************************************************************************************** * Typedef definitions **********************************************************************************************************************/ @@ -210,11 +275,41 @@ static void touch_pad_decode(touch_pad_info_t * p_pinfo, uint8_t num_x, uint8_t #endif -#if (TOUCH_CFG_UART_MONITOR_SUPPORT == 1) +#if ((TOUCH_CFG_MONITOR_ENABLE && (TOUCH_CFG_UART_MONITOR_SUPPORT == 1)) || (TOUCH_CFG_UART_TUNING_SUPPORT == 1) && \ + (BSP_FEATURE_CTSU_VERSION == 2)) void touch_uart_callback(uart_callback_args_t * p_args); #endif +#if (TOUCH_CFG_UART_TUNING_SUPPORT == 1) + #if (BSP_FEATURE_CTSU_VERSION == 2) +void touch_serial_tuning(touch_instance_ctrl_t * const p_instance_ctrl); + +void touch_tuning_uart_connect(void); + +void touch_tuning_initialize(touch_instance_ctrl_t * const p_instance_ctrl); +void touch_tuning_scan_mode_select(touch_instance_ctrl_t * const p_instance_ctrl); +void touch_tuning_scan_register_setting(touch_instance_ctrl_t * const p_instance_ctrl); +void touch_tuning_ts_setup(touch_instance_ctrl_t * const p_instance_ctrl); +void touch_tuning_count_element(uint32_t element_mask, uint16_t * num_element); +void touch_tuning_qe_get_cfg(touch_instance_ctrl_t * const p_instance_ctrl); +void touch_tuning_qe_get_value(touch_instance_ctrl_t * const p_instance_ctrl); + +void touch_tuning_open(touch_instance_ctrl_t * const p_instance_ctrl); +void touch_tuning_dataget(touch_instance_ctrl_t * const p_instance_ctrl); +void touch_tuning_scanstart(touch_instance_ctrl_t * const p_instance_ctrl); + +void touch_tuning_get32(uint32_t * p_val, uint16_t index); +void touch_tuning_get16(uint16_t * p_val, uint16_t index); +void touch_tuning_get8(uint8_t * p_val, uint16_t index); + +void touch_tuning_send32(uint32_t value, uint16_t index); +void touch_tuning_send16(uint16_t value, uint16_t index); +void touch_tuning_send8(uint8_t value, uint16_t index); + + #endif +#endif + /*********************************************************************************************************************** * Private global variables **********************************************************************************************************************/ @@ -254,16 +349,11 @@ static uint16_t g_touch_pad_buf[CTSU_CFG_NUM_CFC * CTSU_CFG_NUM_CFC_TX * 2]; static uint8_t g_touch_base_set_falg = 0; #endif #if TOUCH_CFG_MONITOR_ENABLE -static volatile uint8_t g_touch_monitor_buf[TOUCH_MONITOR_BUFFER_SIZE]; -static uint8_t g_touch_monitor_id; -static uint16_t g_touch_monitor_size[TOUCH_MONITOR_BLOCK_MAX]; +static uint8_t g_touch_monitor_buf[TOUCH_MONITOR_BUFFER_SIZE]; +static uint8_t g_touch_monitor_id; +static uint16_t g_touch_monitor_size[TOUCH_MONITOR_BLOCK_MAX]; #if (TOUCH_CFG_UART_MONITOR_SUPPORT == 1) static touch_instance_ctrl_t * gp_touch_ctrl_list[TOUCH_UART_INSTANCE_MAX]; -static uart_instance_t * gp_touch_uart_instance; -static uint8_t g_touch_uart_rx_buf[TOUCH_UART_RECIEVE_BUF_SIZE]; - -/* data transmit flag */ -volatile uint8_t g_touch_uart_transmit_flag; /* Detect method number */ uint32_t g_touch_uart_open_bitmap; @@ -273,19 +363,67 @@ uint8_t g_touch_uart_monitor_num; #endif #endif +#if (TOUCH_CFG_UART_TUNING_SUPPORT == 1) + #if (BSP_FEATURE_CTSU_VERSION == 2) + +/* QE send Data */ +volatile uint32_t g_touch_tuning_pclkb_frequency; +volatile uint8_t g_touch_tuning_mcu_group; +volatile touch_tuning_state_t g_touch_tuning_state; +volatile touch_tuning_mode_t g_touch_tuning_mode; +volatile touch_tuning_scan_t g_touch_tuning_scan_mode; +touch_tuning_ts_msk_t g_touch_tuning_ts_chac_mask; +touch_tuning_ts_msk_t g_touch_tuning_ts_chtrc_mask; +volatile ctsu_event_t g_touch_tuning_err_event; +volatile ctsu_atune12_t g_touch_tuning_qe_atune; +volatile ctsu_posel_t g_touch_tuning_qe_posel; +volatile uint8_t g_touch_tuning_qe_txvsel; +volatile uint8_t g_touch_tuning_phase_run; + +volatile touch_tuning_mode_t g_touch_tuning_mode_save; + +/* interrupt datas (QE get this data) */ +uint16_t g_touch_tuning_ico_data[TOUCH_TUNING_KEY_MAX_NUM]; + #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) +uint16_t g_touch_tuning_mutual_data[CTSU_CFG_NUM_MUTUAL_ELEMENTS]; + #endif +ctsu_element_cfg_t g_touch_tuning_element_cfgs[TOUCH_TUNING_KEY_MAX_NUM]; +ctsu_md_t g_touch_tuning_md; + +static uint8_t g_touch_tuning_tx_buf[TOUCH_TUNING_TRANSMIT_BUF_SIZE]; + #endif +#endif + +#if ((TOUCH_CFG_MONITOR_ENABLE && (TOUCH_CFG_UART_MONITOR_SUPPORT == 1)) || (TOUCH_CFG_UART_TUNING_SUPPORT == 1) && \ + (BSP_FEATURE_CTSU_VERSION == 2)) + +/* data transmit flag */ +volatile uint8_t g_touch_uart_transmit_flag; + +static uint8_t g_touch_uart_rx_buf[TOUCH_TUNING_RECIEVE_BUF_SIZE]; +static uint16_t g_touch_uart_rx_num = 0; +static uart_instance_t * gp_touch_uart_instance; +#endif + /*********************************************************************************************************************** * Global variables **********************************************************************************************************************/ const touch_api_t g_touch_on_ctsu = { - .open = RM_TOUCH_Open, - .scanStart = RM_TOUCH_ScanStart, - .dataGet = RM_TOUCH_DataGet, - .padDataGet = RM_TOUCH_PadDataGet, - .callbackSet = RM_TOUCH_CallbackSet, - .close = RM_TOUCH_Close, + .open = RM_TOUCH_Open, + .scanStart = RM_TOUCH_ScanStart, + .dataGet = RM_TOUCH_DataGet, + .padDataGet = RM_TOUCH_PadDataGet, + .callbackSet = RM_TOUCH_CallbackSet, + .scanStop = RM_TOUCH_ScanStop, + .close = RM_TOUCH_Close, + .sensitivityRatioGet = RM_TOUCH_SensitivityRatioGet, + .thresholdAdjust = RM_TOUCH_ThresholdAdjust, + .driftControl = RM_TOUCH_DriftControl, }; +touch_instance_ctrl_t * gp_touch_isr_context; + /*******************************************************************************************************************//** * @addtogroup TOUCH * @{ @@ -516,18 +654,31 @@ fsp_err_t RM_TOUCH_Open (touch_ctrl_t * const p_ctrl, touch_cfg_t const * const { p_instance_ctrl->p_touch_cfg->p_uart_instance->p_api->open(p_cfg->p_uart_instance->p_ctrl, p_cfg->p_uart_instance->p_cfg); + g_touch_uart_rx_num = TOUCH_TUNING_COMMAND_BUF_NUM; p_instance_ctrl->p_touch_cfg->p_uart_instance->p_api->read(p_cfg->p_uart_instance->p_ctrl, &g_touch_uart_rx_buf[0], - TOUCH_UART_RECIEVE_BUF_SIZE); + g_touch_uart_rx_num); gp_touch_uart_instance = (uart_instance_t *) p_cfg->p_uart_instance; g_touch_uart_monitor_num = TOUCH_UART_MONITOR_NONE; } - g_touch_uart_open_bitmap |= (uint32_t) (1 << num); + g_touch_uart_open_bitmap |= ((uint32_t) 1 << num); gp_touch_ctrl_list[num] = p_instance_ctrl; #endif #endif +#if (TOUCH_CFG_UART_TUNING_SUPPORT == 1) + #if (BSP_FEATURE_CTSU_VERSION == 2) + if ((NULL == gp_touch_uart_instance) && (NULL != p_cfg->p_uart_instance)) + { + gp_touch_uart_instance = (uart_instance_t *) p_cfg->p_uart_instance; + } + touch_tuning_uart_connect(); + #endif +#endif + + gp_touch_isr_context = p_instance_ctrl; + /* Mark driver as open */ p_instance_ctrl->open = TOUCH_OPEN; @@ -632,6 +783,15 @@ fsp_err_t RM_TOUCH_DataGet (touch_ctrl_t * const p_ctrl, TOUCH_ERROR_RETURN(TOUCH_OPEN == p_instance_ctrl->open, FSP_ERR_NOT_OPEN); #endif +#if (TOUCH_CFG_UART_TUNING_SUPPORT == 1) + #if (BSP_FEATURE_CTSU_VERSION == 2) + if (true == p_instance_ctrl->serial_tuning_enable) + { + touch_serial_tuning(p_instance_ctrl); + } + #endif +#endif + /* get results from previous scan */ err = p_instance_ctrl->p_ctsu_instance->p_api->dataGet(p_instance_ctrl->p_ctsu_instance->p_ctrl, data); FSP_ERROR_RETURN(FSP_ERR_CTSU_SCANNING != err, FSP_ERR_CTSU_SCANNING); @@ -843,6 +1003,9 @@ fsp_err_t RM_TOUCH_DataGet (touch_ctrl_t * const p_ctrl, index); } #endif + + /* avoid warning */ + (void) g_touch_monitor_buf[index]; #endif return FSP_SUCCESS; @@ -1136,6 +1299,26 @@ fsp_err_t RM_TOUCH_PadDataGet (touch_ctrl_t * const p_ctrl, return err; } +/*******************************************************************************************************************//** + * @brief Scan stop specified TOUCH control block. Implements @ref touch_api_t::scanStop. + * + * @retval FSP_SUCCESS Successfully closed. + * @retval FSP_ERR_ASSERTION Null pointer passed as a parameter. + * @retval FSP_ERR_NOT_OPEN Module is not open. + **********************************************************************************************************************/ +fsp_err_t RM_TOUCH_ScanStop (touch_ctrl_t * const p_ctrl) +{ + touch_instance_ctrl_t * p_instance_ctrl = (touch_instance_ctrl_t *) p_ctrl; + fsp_err_t err = FSP_SUCCESS; + + FSP_ASSERT(p_instance_ctrl); + TOUCH_ERROR_RETURN(TOUCH_OPEN == p_instance_ctrl->open, FSP_ERR_NOT_OPEN); + + err = p_instance_ctrl->p_ctsu_instance->p_api->scanStop(p_instance_ctrl->p_ctsu_instance->p_ctrl); + + return err; +} + /*******************************************************************************************************************//** * Updates the user callback and has option of providing memory for callback structure. * Implements touch_api_t::callbackSet @@ -1177,6 +1360,11 @@ fsp_err_t RM_TOUCH_Close (touch_ctrl_t * const p_ctrl) { touch_instance_ctrl_t * p_instance_ctrl = (touch_instance_ctrl_t *) p_ctrl; fsp_err_t err = FSP_SUCCESS; +#if (TOUCH_CFG_UART_TUNING_SUPPORT == 1) + #if (BSP_FEATURE_CTSU_VERSION == 2) + uint8_t num = 0; + #endif +#endif FSP_ASSERT(p_instance_ctrl); TOUCH_ERROR_RETURN(TOUCH_OPEN == p_instance_ctrl->open, FSP_ERR_NOT_OPEN); @@ -1196,24 +1384,185 @@ fsp_err_t RM_TOUCH_Close (touch_ctrl_t * const p_ctrl) #if TOUCH_CFG_MONITOR_ENABLE #if (TOUCH_CFG_UART_MONITOR_SUPPORT == 1) - g_touch_uart_open_bitmap &= (uint32_t) ~(1 << p_instance_ctrl->p_touch_cfg->number); + g_touch_uart_open_bitmap &= ~((uint32_t) 1 << p_instance_ctrl->p_touch_cfg->number); gp_touch_ctrl_list[p_instance_ctrl->p_touch_cfg->number] = p_instance_ctrl; if (0 == g_touch_uart_open_bitmap) { - p_instance_ctrl->p_touch_cfg->p_uart_instance->p_api->open(gp_touch_uart_instance->p_ctrl, - gp_touch_uart_instance->p_cfg); - p_instance_ctrl->p_touch_cfg->p_uart_instance->p_api->read(gp_touch_uart_instance->p_ctrl, - &g_touch_uart_rx_buf[0], - TOUCH_UART_RECIEVE_BUF_SIZE); + p_instance_ctrl->p_touch_cfg->p_uart_instance->p_api->close(gp_touch_uart_instance->p_ctrl); + gp_touch_uart_instance = NULL; + g_touch_uart_rx_num = 0; g_touch_uart_monitor_num = TOUCH_UART_MONITOR_NONE; } #endif #endif +#if (TOUCH_CFG_UART_TUNING_SUPPORT == 1) + #if (BSP_FEATURE_CTSU_VERSION == 2) + if (0 != g_touch_uart_rx_num) + { + #if (TOUCH_CFG_NUM_BUTTONS != 0) + num = g_touch_button_index; + #endif + #if (TOUCH_CFG_NUM_SLIDERS != 0) + num = (uint8_t) (num + g_touch_slider_index); + #endif + #if (TOUCH_CFG_NUM_WHEELS != 0) + num = (uint8_t) (num + g_touch_wheel_index); + #endif + if (0 == num) + { + p_instance_ctrl->p_touch_cfg->p_uart_instance->p_api->close(gp_touch_uart_instance->p_ctrl); + g_touch_uart_rx_num = 0; + } + } + #endif +#endif + return err; } +/*******************************************************************************************************************//** + * @brief Get the touch sensitivity ratio. Implements @ref touch_api_t::sensitivityRatioGet. + * + * @retval FSP_SUCCESS Successfully touch sensitivity ratio got. + * @retval FSP_ERR_ASSERTION Null pointer passed as a parameter. + * @retval FSP_ERR_NOT_OPEN Module is not open. + * @retval FSP_ERR_CTSU_SCANNING Scanning this instance. + * @retval FSP_ERR_CTSU_INCOMPLETE_TUNING Incomplete initial offset tuning. + **********************************************************************************************************************/ +fsp_err_t RM_TOUCH_SensitivityRatioGet (touch_ctrl_t * const p_ctrl, + touch_sensitivity_info_t * p_touch_sensitivity_info) +{ + fsp_err_t err = FSP_SUCCESS; + touch_instance_ctrl_t * p_instance_ctrl = (touch_instance_ctrl_t *) p_ctrl; + uint16_t data[CTSU_CFG_NUM_SELF_ELEMENTS + (CTSU_CFG_NUM_MUTUAL_ELEMENTS * 2)]; + uint8_t button_id; + +#if (TOUCH_CFG_PARAM_CHECKING_ENABLE == 1) + FSP_ASSERT(p_instance_ctrl); + FSP_ASSERT(p_touch_sensitivity_info); + TOUCH_ERROR_RETURN(TOUCH_OPEN == p_instance_ctrl->open, FSP_ERR_NOT_OPEN); +#endif + + err = p_instance_ctrl->p_ctsu_instance->p_api->dataGet(p_instance_ctrl->p_ctsu_instance->p_ctrl, data); + FSP_ERROR_RETURN(FSP_ERR_CTSU_SCANNING != err, FSP_ERR_CTSU_SCANNING); + FSP_ERROR_RETURN(FSP_ERR_CTSU_INCOMPLETE_TUNING != err, FSP_ERR_CTSU_INCOMPLETE_TUNING); + + for (button_id = 0; button_id < p_instance_ctrl->p_touch_cfg->num_buttons; button_id++) + { + if (CTSU_MODE_SELF_MULTI_SCAN == p_instance_ctrl->p_ctsu_instance->p_cfg->md) + { + if (0 > ((int32_t) data[button_id] - p_instance_ctrl->binfo.p_reference[button_id])) + { + p_touch_sensitivity_info->p_touch_sensitivity_ratio[button_id] = 0; + } + else + { + p_touch_sensitivity_info->p_touch_sensitivity_ratio[button_id] = + (uint16_t) (((int32_t) data[button_id] - p_instance_ctrl->binfo.p_reference[button_id]) * + p_touch_sensitivity_info->new_threshold_ratio / + p_instance_ctrl->binfo.p_threshold[button_id]); + } + } + else if (CTSU_MODE_MUTUAL_FULL_SCAN == p_instance_ctrl->p_ctsu_instance->p_cfg->md) + { + if (0 > + ((int32_t) p_instance_ctrl->binfo.p_reference[button_id] - + (data[button_id * 2 + 1] - data[button_id * 2]))) + { + p_touch_sensitivity_info->p_touch_sensitivity_ratio[button_id] = 0; + } + else + { + p_touch_sensitivity_info->p_touch_sensitivity_ratio[button_id] = + (uint16_t) (((int32_t) p_instance_ctrl->binfo.p_reference[button_id] - + (data[button_id * 2 + 1] - data[button_id * 2])) * + p_touch_sensitivity_info->new_threshold_ratio / + p_instance_ctrl->binfo.p_threshold[button_id]); + } + } + else + { + /* Not supported */ + } + } + + return FSP_SUCCESS; +} + +/*******************************************************************************************************************//** + * @brief Adjust the touch judgment threshold. Implements @ref touch_api_t::thresholdAdjust. + * + * @retval FSP_SUCCESS Successfully touch judgment threshold was adjusted. + * @retval FSP_ERR_ASSERTION Null pointer passed as a parameter. + * @retval FSP_ERR_NOT_OPEN Module is not open. + **********************************************************************************************************************/ +fsp_err_t RM_TOUCH_ThresholdAdjust (touch_ctrl_t * const p_ctrl, touch_sensitivity_info_t * p_touch_sensitivity_info) +{ + touch_instance_ctrl_t * p_instance_ctrl = (touch_instance_ctrl_t *) p_ctrl; + uint8_t button_id; + uint32_t touch_sensitivity_ratio_32bit; + +#if (TOUCH_CFG_PARAM_CHECKING_ENABLE == 1) + FSP_ASSERT(p_instance_ctrl); + FSP_ASSERT(p_touch_sensitivity_info); + FSP_ASSERT(p_touch_sensitivity_info->old_threshold_ratio); + TOUCH_ERROR_RETURN(TOUCH_OPEN == p_instance_ctrl->open, FSP_ERR_NOT_OPEN); +#endif + + /* The threshold value for a touch condition is calculated by the QE Tool to be 60% of the + * Touch Count - No Touch Count. + * Similarly, the hysteresis is set by QE tool as 5% of the threshold value. + * This threshold value (as a percentage) can be modified by passing in the parameters: + * old_threshold_ratio : value set by QE tool + * new_threshold_ratio : required value + * new_hysteresis_ratio : required hysteresis + */ + + for (button_id = 0; button_id < p_instance_ctrl->p_touch_cfg->num_buttons; button_id++) + { + /* Modify the threshold and hysteresis for each button */ + p_instance_ctrl->binfo.p_threshold[button_id] = + (uint16_t) ((uint32_t) p_instance_ctrl->p_touch_cfg->p_buttons[button_id].threshold * + p_touch_sensitivity_info->new_threshold_ratio / p_touch_sensitivity_info->old_threshold_ratio); + p_instance_ctrl->binfo.p_hysteresis[button_id] = TOUCH_RATIO_CALC( + p_instance_ctrl->binfo.p_threshold[button_id] * p_touch_sensitivity_info->new_hysteresis_ratio); + + /* Now adjust these values with the threshold offset values that are passed in via p_modifier */ + touch_sensitivity_ratio_32bit = + (uint32_t) p_touch_sensitivity_info->p_touch_sensitivity_ratio[button_id]; + touch_sensitivity_ratio_32bit = TOUCH_RATIO_CALC( + touch_sensitivity_ratio_32bit * p_instance_ctrl->binfo.p_threshold[button_id]); + p_instance_ctrl->binfo.p_threshold[button_id] = (uint16_t) touch_sensitivity_ratio_32bit; + p_instance_ctrl->binfo.p_hysteresis[button_id] = TOUCH_RATIO_CALC( + touch_sensitivity_ratio_32bit * p_touch_sensitivity_info->new_hysteresis_ratio); + } + + return FSP_SUCCESS; +} + +/*******************************************************************************************************************//** + * @brief Control drift correction. Implements @ref touch_api_t::driftControl. + * + * @retval FSP_SUCCESS Successfully drift correction was controlled. + * @retval FSP_ERR_ASSERTION Null pointer passed as a parameter. + * @retval FSP_ERR_NOT_OPEN Module is not open. + **********************************************************************************************************************/ +fsp_err_t RM_TOUCH_DriftControl (touch_ctrl_t * const p_ctrl, uint16_t input_drift_freq) +{ + touch_instance_ctrl_t * p_instance_ctrl = (touch_instance_ctrl_t *) p_ctrl; + +#if (TOUCH_CFG_PARAM_CHECKING_ENABLE == 1) + FSP_ASSERT(p_instance_ctrl); + TOUCH_ERROR_RETURN(TOUCH_OPEN == p_instance_ctrl->open, FSP_ERR_NOT_OPEN); +#endif + + p_instance_ctrl->binfo.drift_freq = input_drift_freq; + + return FSP_SUCCESS; +} + /*******************************************************************************************************************//** * @} (end addtogroup TOUCH) **********************************************************************************************************************/ @@ -1343,7 +1692,7 @@ void touch_button_on (touch_button_info_t * p_binfo, uint16_t value, uint8_t but /* If reaching max_on_threshold, it makes result off and it revises a drift. */ if (p_binfo->cancel_freq <= (*(p_binfo->p_on_count + button_id))) { - p_binfo->status &= ~((uint64_t) 1 << button_id); + p_binfo->status &= ~(((uint64_t) 1 << button_id)); *(p_binfo->p_on_count + button_id) = 0; *(p_binfo->p_reference + button_id) = value; } @@ -1390,7 +1739,7 @@ void touch_button_drift (touch_button_info_t * p_binfo, uint16_t value, uint8_t if (0 != p_binfo->drift_freq) { /* In case of doing drift correction being and moreover On/Off judgment result 1=OFF */ - if (0 == (p_binfo->status & ((uint64_t) 1 << button_id))) + if (0 == (p_binfo->status & (((uint64_t) 1 << button_id)))) { /* It is an addition for the drift correction average calculation */ *(p_binfo->p_drift_buf + button_id) += value; @@ -1915,8 +2264,8 @@ void touch_pad_decode (touch_pad_info_t * p_pinfo, uint8_t num_x, uint8_t num_y, #endif -#if TOUCH_CFG_MONITOR_ENABLE - #if (TOUCH_CFG_UART_MONITOR_SUPPORT == 1) +#if ((TOUCH_CFG_MONITOR_ENABLE && (TOUCH_CFG_UART_MONITOR_SUPPORT == 1)) || ((TOUCH_CFG_UART_TUNING_SUPPORT == 1) && \ + (BSP_FEATURE_CTSU_VERSION == 2))) /*********************************************************************************************************************** * Function Name: user_uart_qe_callback @@ -1926,6 +2275,9 @@ void touch_pad_decode (touch_pad_info_t * p_pinfo, uint8_t num_x, uint8_t num_y, ***********************************************************************************************************************/ void touch_uart_callback (uart_callback_args_t * p_args) { + uint16_t index; + + #if (TOUCH_CFG_MONITOR_ENABLE && (TOUCH_CFG_UART_MONITOR_SUPPORT == 1)) ctsu_instance_ctrl_t * p_ctsu_ctrl; uint16_t write_data; uint16_t ctsuso; @@ -1941,12 +2293,75 @@ void touch_uart_callback (uart_callback_args_t * p_args) uint16_t * p_ctsusdpa; uint16_t * p_ctsusnum; #endif - uint8_t num; - uint8_t element; - uint16_t index; + uint8_t num; + uint8_t element; + #endif + + #if (TOUCH_CFG_UART_TUNING_SUPPORT == 1) + #if (BSP_FEATURE_CTSU_VERSION == 2) + touch_instance_ctrl_t * p_instance_ctrl = gp_touch_isr_context; + uint16_t element_id; + uint8_t * port_adress_8; + uint16_t * port_adress_16; + uint32_t * port_adress_32; + uint8_t write_byte; + #endif + #endif if (NULL == gp_touch_uart_instance) { + g_touch_uart_transmit_flag = 0; + + return; + } + + if (p_args->event == UART_EVENT_RX_CHAR) + { + } + else if ((p_args->event >= UART_EVENT_ERR_PARITY) && (p_args->event < UART_EVENT_TX_DATA_EMPTY)) + { + return; + } + else + { + } + + if ((p_args->event == UART_EVENT_RX_COMPLETE) && (g_touch_uart_rx_num == TOUCH_TUNING_COMMAND_BUF_NUM)) + { + /* Restart reception */ + switch (g_touch_uart_rx_buf[1] >> 4) + { + #if (TOUCH_CFG_MONITOR_ENABLE && (TOUCH_CFG_UART_MONITOR_SUPPORT == 1)) + case TOUCH_UART_COMMAND_TOP_NUM: + { + g_touch_uart_rx_num = TOUCH_UART_RECIEVE_BUF_SIZE - TOUCH_TUNING_COMMAND_BUF_NUM; + gp_touch_uart_instance->p_api->read(gp_touch_uart_instance->p_ctrl, + &g_touch_uart_rx_buf[TOUCH_TUNING_COMMAND_BUF_NUM], + g_touch_uart_rx_num); + break; + } + #endif + #if (TOUCH_CFG_UART_TUNING_SUPPORT == 1) + #if (BSP_FEATURE_CTSU_VERSION == 2) + case TOUCH_TUNING_COMMAND_TOP_NUM: + { + g_touch_uart_rx_num = TOUCH_TUNING_RECIEVE_BUF_SIZE - TOUCH_TUNING_COMMAND_BUF_NUM; + gp_touch_uart_instance->p_api->read(gp_touch_uart_instance->p_ctrl, + &g_touch_uart_rx_buf[TOUCH_TUNING_COMMAND_BUF_NUM], + g_touch_uart_rx_num); + break; + } + #endif + #endif + default: + { + gp_touch_uart_instance->p_api->read(gp_touch_uart_instance->p_ctrl, + &g_touch_uart_rx_buf[0], + g_touch_uart_rx_num); + break; + } + } + return; } @@ -1954,8 +2369,17 @@ void touch_uart_callback (uart_callback_args_t * p_args) { g_touch_uart_transmit_flag = 0; } - else if (p_args->event == UART_EVENT_RX_COMPLETE) + + #if (TOUCH_CFG_MONITOR_ENABLE && (TOUCH_CFG_UART_MONITOR_SUPPORT == 1)) + if ((g_touch_uart_rx_num == (TOUCH_UART_RECIEVE_BUF_SIZE - TOUCH_TUNING_COMMAND_BUF_NUM)) && + (p_args->event == UART_EVENT_RX_COMPLETE)) { + /* Restart reception */ + g_touch_uart_rx_num = TOUCH_TUNING_COMMAND_BUF_NUM; + gp_touch_uart_instance->p_api->read(gp_touch_uart_instance->p_ctrl, + &g_touch_uart_rx_buf[0], + g_touch_uart_rx_num); + if (1 == g_touch_uart_transmit_flag) { /* Abort while sending response */ @@ -1986,7 +2410,7 @@ void touch_uart_callback (uart_callback_args_t * p_args) if (g_touch_uart_rx_buf[1] == TOUCH_UART_COMMAND_START) { num = g_touch_uart_rx_buf[5]; - if (0 == ((uint32_t) (1 << num) & g_touch_uart_open_bitmap)) + if (0 == (((uint32_t) 1 << num) & g_touch_uart_open_bitmap)) { /* Unopened methods generate errors */ g_touch_monitor_buf[1] = g_touch_uart_rx_buf[1] | TOUCH_UART_RESPONSE_ERROR_BIT; @@ -2011,7 +2435,7 @@ void touch_uart_callback (uart_callback_args_t * p_args) num = g_touch_uart_rx_buf[5]; element = g_touch_uart_rx_buf[7]; - if (0 == ((uint32_t) (1 << num) & g_touch_uart_open_bitmap)) + if (0 == (((uint32_t) 1 << num) & g_touch_uart_open_bitmap)) { /* Unopened methods generate errors */ g_touch_monitor_buf[1] = g_touch_uart_rx_buf[1] | TOUCH_UART_RESPONSE_ERROR_BIT; @@ -2067,7 +2491,8 @@ void touch_uart_callback (uart_callback_args_t * p_args) else { /* Write Action */ - write_data = (uint16_t) ((g_touch_uart_rx_buf[9] << 8) | g_touch_uart_rx_buf[8]); + write_data = + (uint16_t) (((uint16_t) g_touch_uart_rx_buf[9] << 8) | (uint16_t) g_touch_uart_rx_buf[8]); switch (g_touch_uart_rx_buf[6]) /* data type */ { case TOUCH_UART_WRITE_DRIFT: @@ -2140,8 +2565,8 @@ void touch_uart_callback (uart_callback_args_t * p_args) case TOUCH_UART_WRITE_CTSUSNUM: { #if (BSP_FEATURE_CTSU_VERSION == 2) - *p_ctsusnum &= (uint32_t) (~(TOUCH_UART_CTSUSNUM_MASK << TOUCH_UART_CTSUSNUM_SHIFT)); - *p_ctsusnum |= (uint32_t) (write_data << TOUCH_UART_CTSUSNUM_SHIFT); + *p_ctsusnum &= (~((uint32_t) TOUCH_UART_CTSUSNUM_MASK << TOUCH_UART_CTSUSNUM_SHIFT)); + *p_ctsusnum |= ((uint32_t) write_data << TOUCH_UART_CTSUSNUM_SHIFT); #endif #if (BSP_FEATURE_CTSU_VERSION == 1) *p_ctsusnum &= (uint16_t) (~(TOUCH_UART_CTSUSNUM_MASK << TOUCH_UART_CTSUSNUM_SHIFT)); @@ -2153,8 +2578,8 @@ void touch_uart_callback (uart_callback_args_t * p_args) case TOUCH_UART_WRITE_CTSUSDPA: { #if (BSP_FEATURE_CTSU_VERSION == 2) - *p_ctsusdpa &= (uint32_t) (~(TOUCH_UART_CTSUSDPA_MASK << TOUCH_UART_CTSUSDPA_SHIFT)); - *p_ctsusdpa |= (uint32_t) (write_data << TOUCH_UART_CTSUSDPA_SHIFT); + *p_ctsusdpa &= (~((uint32_t) TOUCH_UART_CTSUSDPA_MASK << TOUCH_UART_CTSUSDPA_SHIFT)); + *p_ctsusdpa |= ((uint32_t) write_data << TOUCH_UART_CTSUSDPA_SHIFT); #endif #if (BSP_FEATURE_CTSU_VERSION == 1) *p_ctsusdpa &= (uint16_t) (~(TOUCH_UART_CTSUSDPA_MASK << TOUCH_UART_CTSUSDPA_SHIFT)); @@ -2223,19 +2648,1270 @@ void touch_uart_callback (uart_callback_args_t * p_args) /* Start transmission */ g_touch_uart_transmit_flag = 1; gp_touch_uart_instance->p_api->write(gp_touch_uart_instance->p_ctrl, - (uint8_t *) g_touch_monitor_buf, + &g_touch_monitor_buf[0], index); + return; + } + #endif + + #if (TOUCH_CFG_UART_TUNING_SUPPORT == 1) + #if (BSP_FEATURE_CTSU_VERSION == 2) + if ((g_touch_uart_rx_num == (TOUCH_TUNING_RECIEVE_BUF_SIZE - TOUCH_TUNING_COMMAND_BUF_NUM)) && + (p_args->event == UART_EVENT_RX_COMPLETE)) + { /* Restart reception */ + g_touch_uart_rx_num = TOUCH_TUNING_COMMAND_BUF_NUM; gp_touch_uart_instance->p_api->read(gp_touch_uart_instance->p_ctrl, &g_touch_uart_rx_buf[0], - TOUCH_UART_RECIEVE_BUF_SIZE); - } - else - { - } + g_touch_uart_rx_num); - /* End user code. Do not edit comment generated here */ + if (1 == g_touch_uart_transmit_flag) + { + /* Abort while sending response */ + gp_touch_uart_instance->p_api->communicationAbort(gp_touch_uart_instance->p_ctrl, UART_DIR_TX); + g_touch_uart_transmit_flag = 0; + } + + /* Set fixed header */ + g_touch_tuning_tx_buf[0] = TOUCH_TUNING_HEADER; + + /* Create response command */ + if ((g_touch_uart_rx_buf[0] == TOUCH_TUNING_HEADER) && (g_touch_uart_rx_buf[14] == TOUCH_TUNING_FOOTER)) + { + g_touch_tuning_tx_buf[1] = (uint8_t) (g_touch_uart_rx_buf[1] + TOUCH_TUNING_RESPONSE_BIT); + } + else + { + g_touch_tuning_tx_buf[1] = (uint8_t) (g_touch_uart_rx_buf[1] + TOUCH_TUNING_RESPONSE_ERROR_BIT); + g_touch_uart_rx_buf[1] = g_touch_tuning_tx_buf[1]; + } + + /* Set same ID */ + g_touch_tuning_tx_buf[4] = g_touch_uart_rx_buf[4]; + + /* Set index, Fixed data up to index 4. After index 5, it depends on the command. */ + index = 5; + + /* Run command */ + if (g_touch_uart_rx_buf[1] == TOUCH_TUNING_COMMAND_START) + { + /* Data length */ + g_touch_tuning_tx_buf[2] = 0x6; + g_touch_tuning_tx_buf[3] = 0x0; + p_instance_ctrl->serial_tuning_enable = true; + + g_touch_tuning_mode = TOUCH_TUNING_MODE_START; + } + else if (g_touch_uart_rx_buf[1] == TOUCH_TUNING_COMMAND_STOP) + { + /* Data length */ + g_touch_tuning_tx_buf[2] = 0x6; + g_touch_tuning_tx_buf[3] = 0x0; + + p_instance_ctrl->serial_tuning_enable = false; + g_touch_tuning_mode = TOUCH_TUNING_MODE_FINISH; + } + else if (g_touch_uart_rx_buf[1] == TOUCH_TUNING_COMMAND_VARIABLE_WRITE) + { + /* Data length */ + g_touch_tuning_tx_buf[2] = 0x6; + g_touch_tuning_tx_buf[3] = 0x0; + + switch (g_touch_uart_rx_buf[5]) /* data type */ + { + case TOUCH_TUNIG_VARIABLE_MCU_GROUP: + { + touch_tuning_get8((uint8_t *) &g_touch_tuning_mcu_group, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_PCLKB_FREQUENCY: + { + touch_tuning_get32((uint32_t *) &g_touch_tuning_pclkb_frequency, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_TUNING_MODE: + { + touch_tuning_get8((uint8_t *) &g_touch_tuning_mode, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_CTSU_STATE: + { + touch_tuning_get8((uint8_t *) &g_touch_tuning_state, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_CTSU_SCAN_MODE: + { + touch_tuning_get8((uint8_t *) &g_touch_tuning_scan_mode, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_TS_CHAC_MASK_BOTTOM: + { + touch_tuning_get32(&g_touch_tuning_ts_chac_mask.mska, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_TS_CHAC_MASK_TOP: + { + touch_tuning_get32(&g_touch_tuning_ts_chac_mask.mskb, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_TS_CHTRC_MASK_BOTTOM: + { + touch_tuning_get32(&g_touch_tuning_ts_chtrc_mask.mska, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_TS_CHTRC_MASK_TOP: + { + touch_tuning_get32(&g_touch_tuning_ts_chtrc_mask.mskb, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_QE_TXVSEL: + { + touch_tuning_get8((uint8_t *) &g_touch_tuning_qe_txvsel, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_QE_ATUNE: + { + touch_tuning_get8((uint8_t *) &g_touch_tuning_qe_atune, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_QE_POSEL: + { + touch_tuning_get8((uint8_t *) &g_touch_tuning_qe_posel, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_ERR_EVENT: + { + touch_tuning_get8((uint8_t *) &g_touch_tuning_err_event, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_CTSU_ICO_DATA_PRI: + { + element_id = g_touch_uart_rx_buf[6]; + if (TOUCH_TUNING_MODE_MEASURE_PHASE1 == g_touch_tuning_mode_save) + { + touch_tuning_get16(&g_touch_tuning_ico_data[element_id], 7); + } + else + { + if (TOUCH_TUNING_SCAN_SELF == g_touch_tuning_scan_mode) + { + touch_tuning_get16(&g_touch_tuning_ico_data[element_id], 7); + } + else if (TOUCH_TUNING_SCAN_MUTUAL == g_touch_tuning_scan_mode) + { + touch_tuning_get16(&g_touch_tuning_ico_data[element_id * 2], 7); + } + else if (TOUCH_TUNING_SCAN_MUTUAL_CFC == g_touch_tuning_scan_mode) + { + touch_tuning_get16(&g_touch_tuning_ico_data[element_id * 2], 7); + } + else + { + } + } + + break; + } + + case TOUCH_TUNIG_VARIABLE_CTSU_ICO_DATA_SND: + { + element_id = g_touch_uart_rx_buf[6]; + touch_tuning_get16(&g_touch_tuning_ico_data[element_id * 2 + 1], 7); + break; + } + + #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) + case TOUCH_TUNIG_VARIABLE_CTSU_MUTUAL_DATA: + { + element_id = g_touch_uart_rx_buf[6]; + touch_tuning_get16(&g_touch_tuning_mutual_data[element_id], 7); + break; + } + #endif + + case TOUCH_TUNIG_VARIABLE_ELEMENT_CFGS_SO: + { + element_id = g_touch_uart_rx_buf[6]; + touch_tuning_get16(&g_touch_tuning_element_cfgs[element_id].so, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_ELEMENT_CFGS_SNUM: + { + element_id = g_touch_uart_rx_buf[6]; + touch_tuning_get8(&g_touch_tuning_element_cfgs[element_id].snum, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_ELEMENT_CFGS_SDPA: + { + element_id = g_touch_uart_rx_buf[6]; + touch_tuning_get8(&g_touch_tuning_element_cfgs[element_id].sdpa, 7); + break; + } + + default: + { + break; + } + } + } + else if (g_touch_uart_rx_buf[1] == TOUCH_TUNING_COMMAND_VARIABLE_READ) + { + /* Data length */ + g_touch_tuning_tx_buf[2] = 0xC; + g_touch_tuning_tx_buf[3] = 0x0; + + index = 11; + + g_touch_tuning_tx_buf[5] = g_touch_uart_rx_buf[5]; + + switch (g_touch_uart_rx_buf[5]) /* data type */ + { + case TOUCH_TUNIG_VARIABLE_MCU_GROUP: + { + g_touch_tuning_tx_buf[6] = 0; + touch_tuning_send8(g_touch_tuning_mcu_group, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_PCLKB_FREQUENCY: + { + g_touch_tuning_tx_buf[6] = 0; + touch_tuning_send32(g_touch_tuning_pclkb_frequency, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_TUNING_MODE: + { + g_touch_tuning_tx_buf[6] = 0; + touch_tuning_send8((uint8_t) g_touch_tuning_mode, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_CTSU_STATE: + { + g_touch_tuning_tx_buf[6] = 0; + touch_tuning_send8((uint8_t) g_touch_tuning_state, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_CTSU_SCAN_MODE: + { + g_touch_tuning_tx_buf[6] = 0; + touch_tuning_send8((uint8_t) g_touch_tuning_scan_mode, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_TS_CHAC_MASK_BOTTOM: + { + g_touch_tuning_tx_buf[6] = 0; + touch_tuning_send32(g_touch_tuning_ts_chac_mask.mska, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_TS_CHAC_MASK_TOP: + { + g_touch_tuning_tx_buf[6] = 0; + touch_tuning_send32(g_touch_tuning_ts_chac_mask.mskb, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_TS_CHTRC_MASK_BOTTOM: + { + g_touch_tuning_tx_buf[6] = 0; + touch_tuning_send32(g_touch_tuning_ts_chac_mask.mskb, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_TS_CHTRC_MASK_TOP: + { + g_touch_tuning_tx_buf[6] = 0; + touch_tuning_send32(g_touch_tuning_ts_chtrc_mask.mskb, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_QE_TXVSEL: + { + g_touch_tuning_tx_buf[6] = 0; + touch_tuning_send8(g_touch_tuning_qe_txvsel, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_QE_ATUNE: + { + g_touch_tuning_tx_buf[6] = 0; + touch_tuning_send8((uint8_t) g_touch_tuning_qe_atune, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_QE_POSEL: + { + g_touch_tuning_tx_buf[6] = 0; + touch_tuning_send8((uint8_t) g_touch_tuning_qe_posel, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_ERR_EVENT: + { + g_touch_tuning_tx_buf[6] = 0; + touch_tuning_send8((uint8_t) g_touch_tuning_err_event, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_CTSU_ICO_DATA_PRI: + { + g_touch_tuning_tx_buf[5] = TOUCH_TUNIG_VARIABLE_CTSU_ICO_DATA_PRI; + element_id = g_touch_uart_rx_buf[6]; + if (TOUCH_TUNING_MODE_MEASURE_PHASE1 == g_touch_tuning_mode_save) + { + g_touch_tuning_tx_buf[6] = (uint8_t) element_id; + touch_tuning_send16(g_touch_tuning_ico_data[element_id], 7); + } + else + { + if (TOUCH_TUNING_SCAN_SELF == g_touch_tuning_scan_mode) + { + g_touch_tuning_tx_buf[6] = (uint8_t) element_id; + touch_tuning_send16(g_touch_tuning_ico_data[element_id], 7); + } + else if (TOUCH_TUNING_SCAN_MUTUAL == g_touch_tuning_scan_mode) + { + g_touch_tuning_tx_buf[6] = (uint8_t) element_id; + touch_tuning_send16(g_touch_tuning_ico_data[element_id * 2], 7); + } + else if (TOUCH_TUNING_SCAN_MUTUAL_CFC == g_touch_tuning_scan_mode) + { + g_touch_tuning_tx_buf[6] = (uint8_t) element_id; + touch_tuning_send16(g_touch_tuning_ico_data[element_id * 2], 7); + } + else + { + } + } + + break; + } + + case TOUCH_TUNIG_VARIABLE_CTSU_ICO_DATA_SND: + { + element_id = g_touch_uart_rx_buf[6]; + g_touch_tuning_tx_buf[6] = (uint8_t) element_id; + touch_tuning_send32(g_touch_tuning_ico_data[element_id * 2 + 1], 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_CTSU_MUTUAL_DATA: + { + element_id = g_touch_uart_rx_buf[6]; + g_touch_tuning_tx_buf[6] = (uint8_t) element_id; + #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) + touch_tuning_send32(g_touch_tuning_mutual_data[element_id], 7); + #endif + break; + } + + case TOUCH_TUNIG_VARIABLE_ELEMENT_CFGS_SO: + { + element_id = g_touch_uart_rx_buf[6]; + g_touch_tuning_tx_buf[6] = (uint8_t) element_id; + touch_tuning_send16(g_touch_tuning_element_cfgs[element_id].so, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_ELEMENT_CFGS_SNUM: + { + element_id = g_touch_uart_rx_buf[6]; + g_touch_tuning_tx_buf[6] = (uint8_t) element_id; + touch_tuning_send8(g_touch_tuning_element_cfgs[element_id].snum, 7); + break; + } + + case TOUCH_TUNIG_VARIABLE_ELEMENT_CFGS_SDPA: + { + g_touch_tuning_tx_buf[5] = TOUCH_TUNIG_VARIABLE_ELEMENT_CFGS_SDPA; + element_id = g_touch_uart_rx_buf[6]; + + g_touch_tuning_tx_buf[6] = (uint8_t) element_id; + touch_tuning_send8(g_touch_tuning_element_cfgs[element_id].sdpa, 7); + break; + } + + default: + { + break; + } + } + } + else if (g_touch_uart_rx_buf[1] == TOUCH_TUNING_COMMAND_ADDRESS_WRITE) + { + index = 5; + + write_byte = g_touch_uart_rx_buf[9]; + + if (1 == write_byte) + { + port_adress_8 = (uint8_t *) (g_touch_uart_rx_buf[5] | + (g_touch_uart_rx_buf[6] << 8) | + (g_touch_uart_rx_buf[7] << 16) | + (g_touch_uart_rx_buf[8] << 24)); + + (*port_adress_8) |= (g_touch_uart_rx_buf[10]); + } + else if (2 == write_byte) + { + port_adress_16 = (uint16_t *) (g_touch_uart_rx_buf[5] | + (g_touch_uart_rx_buf[6] << 8) | + (g_touch_uart_rx_buf[7] << 16) | + (g_touch_uart_rx_buf[8] << 24)); + + (*port_adress_16) |= (uint16_t) (g_touch_uart_rx_buf[10] | + (g_touch_uart_rx_buf[11] << 8)); + } + else + { + port_adress_32 = (uint32_t *) (g_touch_uart_rx_buf[5] | + (g_touch_uart_rx_buf[6] << 8) | + (g_touch_uart_rx_buf[7] << 16) | + (g_touch_uart_rx_buf[8] << 24)); + + (*port_adress_32) |= (uint32_t) (g_touch_uart_rx_buf[10] | + (g_touch_uart_rx_buf[11] << 8) | + (g_touch_uart_rx_buf[12] << 16) | + (g_touch_uart_rx_buf[13] << 24)); + } + } + else if (g_touch_uart_rx_buf[1] == TOUCH_TUNING_COMMAND_ADDRESS_READ) + { + index = 10; + + write_byte = g_touch_uart_rx_buf[9]; + + if (1 == write_byte) + { + port_adress_8 = (uint8_t *) (g_touch_uart_rx_buf[5] | + (g_touch_uart_rx_buf[6] << 8) | + (g_touch_uart_rx_buf[7] << 16) | + (g_touch_uart_rx_buf[8] << 24)); + + touch_tuning_send8((*port_adress_8), 6); + } + else if (2 == write_byte) + { + port_adress_16 = (uint16_t *) (g_touch_uart_rx_buf[5] | + (g_touch_uart_rx_buf[6] << 8) | + (g_touch_uart_rx_buf[7] << 16) | + (g_touch_uart_rx_buf[8] << 24)); + + touch_tuning_send16((*port_adress_16), 6); + } + else + { + port_adress_32 = (uint32_t *) (g_touch_uart_rx_buf[5] | + (g_touch_uart_rx_buf[6] << 8) | + (g_touch_uart_rx_buf[7] << 16) | + (g_touch_uart_rx_buf[8] << 24)); + + touch_tuning_send32((*port_adress_32), 6); + } + } + else if (g_touch_uart_rx_buf[1] == TOUCH_TUNING_COMMAND_PHASE_RUN) + { + g_touch_tuning_phase_run = 1; + } + else if (g_touch_uart_rx_buf[1] == TOUCH_TUNING_COMMAND_VERSION) + { + g_touch_tuning_tx_buf[index++] = 1; + g_touch_tuning_tx_buf[index++] = 1; + } + else + { + } + + /* Set fixed footer */ + g_touch_tuning_tx_buf[index++] = TOUCH_TUNING_FOOTER; + + /* Set data size */ + g_touch_tuning_tx_buf[2] = (uint8_t) index; + g_touch_tuning_tx_buf[3] = (uint8_t) (index >> 8); + + /* Start transmission */ + g_touch_uart_transmit_flag = 1; + gp_touch_uart_instance->p_api->write(gp_touch_uart_instance->p_ctrl, &g_touch_tuning_tx_buf[0], index); + + return; + } + #endif + #endif + + /* End user code. Do not edit comment generated here */ +} + +#endif + +#if (TOUCH_CFG_UART_TUNING_SUPPORT == 1) + #if (BSP_FEATURE_CTSU_VERSION == 2) +void touch_serial_tuning (touch_instance_ctrl_t * const p_instance_ctrl) +{ + /* init tuning state */ + g_touch_tuning_state = TOUCH_TUNING_STATE_RESET; + + /* connect QE with UART */ + touch_tuning_uart_connect(); + + touch_tuning_open(p_instance_ctrl); + + while (1U) + { + switch (g_touch_tuning_mode) + { + case TOUCH_TUNING_MODE_CORRECTION_1ST_VALUE: + { + switch (g_touch_tuning_state) + { + case TOUCH_TUNING_STATE_RESET: + { + break; + } + + case TOUCH_TUNING_STATE_INITIALIZE: + { + if (1 == g_touch_tuning_phase_run) + { + g_touch_tuning_mode_save = g_touch_tuning_mode; + g_touch_tuning_phase_run = 0; + g_touch_tuning_state = TOUCH_TUNING_STATE_COMPLETE; + } + + break; + } + + case TOUCH_TUNING_STATE_SCAN: + { + break; + } + + case TOUCH_TUNING_STATE_COMPLETE: + { + g_touch_tuning_mode = TOUCH_TUNING_MODE_QE_WATTING; + g_touch_tuning_state = TOUCH_TUNING_STATE_STOP; + break; + } + + case TOUCH_TUNING_STATE_STOP: + { + break; + } + } + + break; + } + + case TOUCH_TUNING_MODE_CORRECTION_2ND_VALUE: + { + /* TOUCH_TUNING_MODE_CORRECTION_2ND_VALUE does not have this part of processing */ + break; + } + + case TOUCH_TUNING_MODE_MEASURE_PHASE1: + { + switch (g_touch_tuning_state) + { + case TOUCH_TUNING_STATE_RESET: + { + break; + } + + case TOUCH_TUNING_STATE_INITIALIZE: + { + if (1 == g_touch_tuning_phase_run) + { + g_touch_tuning_mode_save = g_touch_tuning_mode; + touch_tuning_initialize(p_instance_ctrl); + g_touch_tuning_phase_run = 0; + g_touch_tuning_state = TOUCH_TUNING_STATE_SCAN; + } + + break; + } + + case TOUCH_TUNING_STATE_SCAN: + { + touch_tuning_dataget(p_instance_ctrl); + touch_tuning_scanstart(p_instance_ctrl); + break; + } + + case TOUCH_TUNING_STATE_COMPLETE: + { + touch_tuning_qe_get_value(p_instance_ctrl); + g_touch_tuning_mode = TOUCH_TUNING_MODE_QE_WATTING; + g_touch_tuning_state = TOUCH_TUNING_STATE_STOP; + break; + } + + case TOUCH_TUNING_STATE_STOP: + { + break; + } + } + + break; + } + + case TOUCH_TUNING_MODE_MEASURE_PHASE2: + { + switch (g_touch_tuning_state) + { + case TOUCH_TUNING_STATE_RESET: + { + break; + } + + case TOUCH_TUNING_STATE_INITIALIZE: + { + if (1 == g_touch_tuning_phase_run) + { + g_touch_tuning_mode_save = g_touch_tuning_mode; + touch_tuning_initialize(p_instance_ctrl); + g_touch_tuning_phase_run = 0; + g_touch_tuning_state = TOUCH_TUNING_STATE_SCAN; + } + + break; + } + + case TOUCH_TUNING_STATE_SCAN: + { + touch_tuning_dataget(p_instance_ctrl); + touch_tuning_scanstart(p_instance_ctrl); + break; + } + + case TOUCH_TUNING_STATE_COMPLETE: + { + touch_tuning_qe_get_value(p_instance_ctrl); + g_touch_tuning_mode = TOUCH_TUNING_MODE_QE_WATTING; + g_touch_tuning_state = TOUCH_TUNING_STATE_STOP; + break; + } + + case TOUCH_TUNING_STATE_STOP: + { + break; + } + } + + break; + } + + case TOUCH_TUNING_MODE_MEASURE_PHASE3: + { + switch (g_touch_tuning_state) + { + case TOUCH_TUNING_STATE_RESET: + { + break; + } + + case TOUCH_TUNING_STATE_INITIALIZE: + { + if (1 == g_touch_tuning_phase_run) + { + g_touch_tuning_mode_save = g_touch_tuning_mode; + touch_tuning_initialize(p_instance_ctrl); + g_touch_tuning_phase_run = 0; + g_touch_tuning_state = TOUCH_TUNING_STATE_SCAN; + } + + break; + } + + case TOUCH_TUNING_STATE_SCAN: + { + touch_tuning_dataget(p_instance_ctrl); + touch_tuning_scanstart(p_instance_ctrl); + break; + } + + case TOUCH_TUNING_STATE_COMPLETE: + { + break; + } + + case TOUCH_TUNING_STATE_STOP: + { + break; + } + } + + break; + } + + case TOUCH_TUNING_MODE_QE_WATTING: + { + break; + } + + case TOUCH_TUNING_MODE_START: + { + p_instance_ctrl->p_ctsu_instance->p_api->scanStop(p_instance_ctrl->p_ctsu_instance->p_ctrl); + + g_touch_tuning_phase_run = 0; + g_touch_tuning_mode = TOUCH_TUNING_MODE_QE_WATTING; + break; + } + + case TOUCH_TUNING_MODE_FINISH: + { + g_touch_tuning_phase_run = 0; + g_touch_tuning_mode = TOUCH_TUNING_MODE_QE_WATTING; + break; + } + } + } +} /* End of function main() */ + +/*********************************************************************************************************************** + * touch_tuning_qe_get_value + ***********************************************************************************************************************/ +void touch_tuning_qe_get_value (touch_instance_ctrl_t * const p_instance_ctrl) +{ + uint16_t i; + ctsu_instance_ctrl_t * p_ctsu_instance_ctrl = (ctsu_instance_ctrl_t *) p_instance_ctrl->p_ctsu_instance->p_ctrl; + + for (i = 0; i < p_ctsu_instance_ctrl->num_elements; i++) + { + /* CTSU measurement condition data setting */ + g_touch_tuning_element_cfgs[i].so = + p_ctsu_instance_ctrl->p_ctsuwr[i * CTSU_CFG_NUM_SUMULTI].ctsuso & TOUCH_UART_CTSUSO_MASK; + g_touch_tuning_element_cfgs[i].snum = + (p_ctsu_instance_ctrl->p_ctsuwr[i * CTSU_CFG_NUM_SUMULTI].ctsuso >> 10) & TOUCH_UART_CTSUSNUM_MASK; + g_touch_tuning_element_cfgs[i].sdpa = + (uint8_t) ((p_ctsu_instance_ctrl->p_ctsuwr[i * CTSU_CFG_NUM_SUMULTI].ctsuso >> 24) & + TOUCH_UART_CTSUSDPA_MASK); + } +} + +/*********************************************************************************************************************** + * touch_tuning_initialize + ***********************************************************************************************************************/ +void touch_tuning_initialize (touch_instance_ctrl_t * const p_instance_ctrl) +{ + uint16_t i; + ctsu_instance_ctrl_t * p_ctsu_instance_ctrl = (ctsu_instance_ctrl_t *) p_instance_ctrl->p_ctsu_instance->p_ctrl; + + /* Variable initialization processing */ + p_ctsu_instance_ctrl->wr_index = 0; + p_ctsu_instance_ctrl->rd_index = 0; + for (i = 0; i < TOUCH_TUNING_KEY_MAX_NUM; i++) + { + g_touch_tuning_ico_data[i] = 0; + } + + p_ctsu_instance_ctrl->state = CTSU_STATE_IDLE; + + touch_tuning_scan_mode_select(p_instance_ctrl); + touch_tuning_ts_setup(p_instance_ctrl); + touch_tuning_qe_get_cfg(p_instance_ctrl); + touch_tuning_scan_register_setting(p_instance_ctrl); +} + +/*********************************************************************************************************************** + * touch_tuning_qe_get_cfg + ***********************************************************************************************************************/ +void touch_tuning_qe_get_cfg (touch_instance_ctrl_t * const p_instance_ctrl) +{ + uint16_t i; + uint8_t loop; + ctsu_instance_ctrl_t * p_ctsu_instance_ctrl = (ctsu_instance_ctrl_t *) p_instance_ctrl->p_ctsu_instance->p_ctrl; + + p_ctsu_instance_ctrl->txvsel = (ctsu_txvsel_t) (g_touch_tuning_qe_txvsel & 0x01); + p_ctsu_instance_ctrl->txvsel2 = (ctsu_txvsel2_t) ((g_touch_tuning_qe_txvsel >> 1) & 0x01); + + for (i = 0; i < p_ctsu_instance_ctrl->num_elements; i++) + { + if (TOUCH_TUNING_MODE_MEASURE_PHASE1 == g_touch_tuning_mode) + { + g_touch_tuning_element_cfgs[i].snum = 0x07; + g_touch_tuning_element_cfgs[i].sdpa = 0x1F; + g_touch_tuning_element_cfgs[i].so = 0x00; + } + else if (TOUCH_TUNING_MODE_MEASURE_PHASE2 == g_touch_tuning_mode) + { + *(p_ctsu_instance_ctrl->p_tuning_count + i) = 0; + } + else if (TOUCH_TUNING_MODE_MEASURE_PHASE3 == g_touch_tuning_mode) + { + } + else + { + } + + for (loop = 0; loop < CTSU_CFG_NUM_SUMULTI; loop++) + { + p_ctsu_instance_ctrl->p_ctsuwr[i * CTSU_CFG_NUM_SUMULTI + loop].ctsuso = + ((uint32_t) g_touch_tuning_element_cfgs[i].sdpa << 24) | + ((uint32_t) g_touch_tuning_element_cfgs[i].snum << 10) | + ((uint32_t) g_touch_tuning_element_cfgs[i].so); + } + } + + /* Moving average reset */ + p_ctsu_instance_ctrl->average = 0; + + if (TOUCH_TUNING_MODE_MEASURE_PHASE1 == g_touch_tuning_mode) + { + p_ctsu_instance_ctrl->tuning = CTSU_TUNING_COMPLETE; + } + + if (TOUCH_TUNING_MODE_MEASURE_PHASE2 == g_touch_tuning_mode) + { + p_ctsu_instance_ctrl->tuning = CTSU_TUNING_INCOMPLETE; + } +} + +/*********************************************************************************************************************** + * touch_tuning_scan_mode_select + ***********************************************************************************************************************/ +void touch_tuning_scan_mode_select (touch_instance_ctrl_t * const p_instance_ctrl) +{ + ctsu_instance_ctrl_t * p_ctsu_instance_ctrl = (ctsu_instance_ctrl_t *) p_instance_ctrl->p_ctsu_instance->p_ctrl; + + /* MD register */ + if (TOUCH_TUNING_SCAN_SELF == g_touch_tuning_scan_mode) + { + g_touch_tuning_md = CTSU_MODE_SELF_MULTI_SCAN; + p_ctsu_instance_ctrl->md = CTSU_MODE_SELF_MULTI_SCAN; + } + else if (TOUCH_TUNING_SCAN_MUTUAL == g_touch_tuning_scan_mode) + { + if (TOUCH_TUNING_MODE_MEASURE_PHASE1 == g_touch_tuning_mode) + { + g_touch_tuning_md = CTSU_MODE_SELF_MULTI_SCAN; + p_ctsu_instance_ctrl->md = CTSU_MODE_MUTUAL_FULL_SCAN; + R_CTSU->CTSUCRA_b.CSW = 1; + R_CTSU->CTSUCRA_b.PON = 1; + R_BSP_SoftwareDelay(30, BSP_DELAY_UNITS_MICROSECONDS); + } + else + { + g_touch_tuning_md = CTSU_MODE_MUTUAL_FULL_SCAN; + p_ctsu_instance_ctrl->md = CTSU_MODE_MUTUAL_FULL_SCAN; + } + } + else /*CFC */ + { + if (TOUCH_TUNING_MODE_MEASURE_PHASE1 == g_touch_tuning_mode) + { + g_touch_tuning_md = CTSU_MODE_SELF_MULTI_SCAN; + p_ctsu_instance_ctrl->md = CTSU_MODE_MUTUAL_FULL_SCAN; + } + else + { + g_touch_tuning_md = CTSU_MODE_MUTUAL_CFC_SCAN; + p_ctsu_instance_ctrl->md = CTSU_MODE_MUTUAL_CFC_SCAN; + } + } + + /* atune register */ + if (TOUCH_TUNING_MODE_MEASURE_PHASE1 == g_touch_tuning_mode) + { + g_touch_tuning_qe_atune = CTSU_ATUNE12_80UA; + } + + /* CFCON register */ + if ((TOUCH_TUNING_SCAN_MUTUAL_CFC == g_touch_tuning_scan_mode) && + (TOUCH_TUNING_MODE_MEASURE_PHASE1 != g_touch_tuning_mode)) + { + R_CTSU->CTSUCALIB_b.CFCRDMD = 1; + R_CTSU->CTSUCRA_b.CFCON = 1; + } + else if ((TOUCH_TUNING_SCAN_MUTUAL_CFC == g_touch_tuning_scan_mode) && + (TOUCH_TUNING_MODE_MEASURE_PHASE1 == g_touch_tuning_mode)) + { + R_CTSU->CTSUCALIB_b.CFCRDMD = 0; + R_CTSU->CTSUCRA_b.CFCON = 0; + R_CTSU->CTSUCRA_b.CSW = 1; + R_CTSU->CTSUCRA_b.PON = 1; + R_BSP_SoftwareDelay(30, BSP_DELAY_UNITS_MICROSECONDS); + } + else + { + R_CTSU->CTSUCALIB_b.CFCRDMD = 0; + R_CTSU->CTSUCRA_b.CFCON = 0; + } +} + +void touch_tuning_scan_register_setting (touch_instance_ctrl_t * const p_instance_ctrl) +{ + ctsu_instance_ctrl_t * p_ctsu_instance_ctrl = (ctsu_instance_ctrl_t *) p_instance_ctrl->p_ctsu_instance->p_ctrl; + + p_ctsu_instance_ctrl->ctsucr1 = (uint8_t) ((g_touch_tuning_qe_atune & 0x01) << 3); + p_ctsu_instance_ctrl->ctsucr1 |= (uint8_t) (g_touch_tuning_md << 6); + + p_ctsu_instance_ctrl->ctsucr2 = (uint8_t) (g_touch_tuning_qe_atune & 0x02); + p_ctsu_instance_ctrl->ctsucr2 |= (uint8_t) ((g_touch_tuning_md & 0x04) >> 2); + p_ctsu_instance_ctrl->ctsucr2 |= (uint8_t) (g_touch_tuning_qe_posel << 4); + + if (CTSU_ATUNE12_80UA == g_touch_tuning_qe_atune) + { + p_ctsu_instance_ctrl->range = CTSU_RANGE_80UA; + } + else if (CTSU_ATUNE12_40UA == g_touch_tuning_qe_atune) + { + p_ctsu_instance_ctrl->range = CTSU_RANGE_40UA; + } + else if (CTSU_ATUNE12_20UA == g_touch_tuning_qe_atune) + { + p_ctsu_instance_ctrl->range = CTSU_RANGE_20UA; + } + else if (CTSU_ATUNE12_160UA == g_touch_tuning_qe_atune) + { + p_ctsu_instance_ctrl->range = CTSU_RANGE_160UA; + } + else + { + } +} + +/*********************************************************************************************************************** + * touch_tuning_ts_setup + ***********************************************************************************************************************/ +void touch_tuning_ts_setup (touch_instance_ctrl_t * const p_instance_ctrl) +{ + ctsu_instance_ctrl_t * p_ctsu_instance_ctrl = (ctsu_instance_ctrl_t *) p_instance_ctrl->p_ctsu_instance->p_ctrl; + uint32_t element_maska; + uint32_t element_maskb; + uint16_t rx_element; + uint16_t tx_element; + + /* initialize variable*/ + p_ctsu_instance_ctrl->num_elements = 0; + rx_element = 0; + tx_element = 0; + + /* Count number of element */ + if (TOUCH_TUNING_SCAN_SELF == g_touch_tuning_scan_mode) + { + if (TOUCH_TUNING_MODE_MEASURE_PHASE1 == g_touch_tuning_mode) + { + g_touch_tuning_ts_chtrc_mask.mska = 0; + g_touch_tuning_ts_chtrc_mask.mskb = 0; + } + + /* Excludes active shield from CHAC & CHACB */ + element_maska = g_touch_tuning_ts_chac_mask.mska - g_touch_tuning_ts_chtrc_mask.mska; + element_maskb = g_touch_tuning_ts_chac_mask.mskb - g_touch_tuning_ts_chtrc_mask.mskb; + + /* Get the number of measurable elements */ + touch_tuning_count_element(element_maska, &p_ctsu_instance_ctrl->num_elements); + touch_tuning_count_element(element_maskb, &p_ctsu_instance_ctrl->num_elements); + } + else if (TOUCH_TUNING_SCAN_MUTUAL == g_touch_tuning_scan_mode) + { + if (TOUCH_TUNING_MODE_MEASURE_PHASE1 == g_touch_tuning_mode) + { + /* Get the number of measurable elements */ + touch_tuning_count_element(g_touch_tuning_ts_chac_mask.mska, &p_ctsu_instance_ctrl->num_elements); + touch_tuning_count_element(g_touch_tuning_ts_chac_mask.mskb, &p_ctsu_instance_ctrl->num_elements); + + g_touch_tuning_ts_chtrc_mask.mska = 0; + g_touch_tuning_ts_chtrc_mask.mskb = 0; + } + else + { + /* Store rx element mask */ + element_maska = g_touch_tuning_ts_chac_mask.mska - g_touch_tuning_ts_chtrc_mask.mska; + element_maskb = g_touch_tuning_ts_chac_mask.mskb - g_touch_tuning_ts_chtrc_mask.mskb; + + /* Get the number of measurable elements from enabled TS RX */ + touch_tuning_count_element(element_maska, &rx_element); + touch_tuning_count_element(element_maskb, &rx_element); + + /* Get the number of measurable elements from enabled TS TX */ + touch_tuning_count_element(g_touch_tuning_ts_chtrc_mask.mska, &tx_element); + touch_tuning_count_element(g_touch_tuning_ts_chtrc_mask.mskb, &tx_element); + + /* Get the number of measurable element (RX * TX) */ + p_ctsu_instance_ctrl->num_elements = (uint16_t) (rx_element * tx_element); + } + } + else if (TOUCH_TUNING_SCAN_MUTUAL_CFC == g_touch_tuning_scan_mode) + { + if (TOUCH_TUNING_MODE_MEASURE_PHASE1 == g_touch_tuning_mode) + { + /* Get the number of measurable elements */ + touch_tuning_count_element(g_touch_tuning_ts_chtrc_mask.mska, &p_ctsu_instance_ctrl->num_elements); + touch_tuning_count_element(g_touch_tuning_ts_chtrc_mask.mskb, &p_ctsu_instance_ctrl->num_elements); + + g_touch_tuning_ts_chac_mask.mska = g_touch_tuning_ts_chtrc_mask.mska; + g_touch_tuning_ts_chac_mask.mskb = g_touch_tuning_ts_chtrc_mask.mskb; + + g_touch_tuning_ts_chtrc_mask.mska = 0; + g_touch_tuning_ts_chtrc_mask.mskb = 0; + } + else + { + /* Store rx element mask */ + element_maska = g_touch_tuning_ts_chac_mask.mska - g_touch_tuning_ts_chtrc_mask.mska; + element_maskb = g_touch_tuning_ts_chac_mask.mskb - g_touch_tuning_ts_chtrc_mask.mskb; + + /* Get the number of measurable elements from enabled TS RX */ + touch_tuning_count_element(element_maska, &rx_element); + touch_tuning_count_element(element_maskb, &rx_element); + + /* Get the number of measurable elements from enabled TS TX */ + touch_tuning_count_element(g_touch_tuning_ts_chtrc_mask.mska, &tx_element); + touch_tuning_count_element(g_touch_tuning_ts_chtrc_mask.mskb, &tx_element); + + /* Get the number of measurable element (RX * TX) */ + p_ctsu_instance_ctrl->num_elements = (uint16_t) (rx_element * tx_element); + } + } + else + { + } + + /* get chac */ + p_ctsu_instance_ctrl->ctsuchac0 = (uint8_t) (g_touch_tuning_ts_chac_mask.mska & TOUCH_UART_TSCHAC_MASK); + p_ctsu_instance_ctrl->ctsuchac1 = (uint8_t) ((g_touch_tuning_ts_chac_mask.mska >> 8) & TOUCH_UART_TSCHAC_MASK); + p_ctsu_instance_ctrl->ctsuchac2 = (uint8_t) ((g_touch_tuning_ts_chac_mask.mska >> 16) & TOUCH_UART_TSCHAC_MASK); + p_ctsu_instance_ctrl->ctsuchac3 = (uint8_t) ((g_touch_tuning_ts_chac_mask.mska >> 24) & TOUCH_UART_TSCHAC_MASK); + p_ctsu_instance_ctrl->ctsuchac4 = (uint8_t) (g_touch_tuning_ts_chac_mask.mskb & TOUCH_UART_TSCHAC_MASK); + + /* get chtrc */ + p_ctsu_instance_ctrl->ctsuchtrc0 = (uint8_t) (g_touch_tuning_ts_chtrc_mask.mska & TOUCH_UART_TSCHTRC_MASK); + p_ctsu_instance_ctrl->ctsuchtrc1 = (uint8_t) ((g_touch_tuning_ts_chtrc_mask.mska >> 8) & TOUCH_UART_TSCHTRC_MASK); + p_ctsu_instance_ctrl->ctsuchtrc2 = (uint8_t) ((g_touch_tuning_ts_chtrc_mask.mska >> 16) & TOUCH_UART_TSCHTRC_MASK); + p_ctsu_instance_ctrl->ctsuchtrc3 = (uint8_t) ((g_touch_tuning_ts_chtrc_mask.mska >> 24) & TOUCH_UART_TSCHTRC_MASK); + p_ctsu_instance_ctrl->ctsuchtrc4 = (uint8_t) (g_touch_tuning_ts_chtrc_mask.mskb & TOUCH_UART_TSCHTRC_MASK); +} + +void touch_tuning_count_element (uint32_t element_mask, uint16_t * num_element) +{ + uint8_t n; + + /* Get the number of measurable elements from enabled CHAC or CHTRC */ + for (n = 0; n < TOUCH_TUNING_CH_REG_MAX_NUM; n++) + { + if (0x00000001 == ((element_mask >> n) & 0x00000001)) + { + (*num_element)++; + } + } +} + +void touch_tuning_uart_connect (void) +{ + if ((0 == g_touch_uart_rx_num) && (NULL != gp_touch_uart_instance)) + { + gp_touch_uart_instance->p_api->open(gp_touch_uart_instance->p_ctrl, + gp_touch_uart_instance->p_cfg); + + g_touch_uart_rx_num = TOUCH_TUNING_COMMAND_BUF_NUM; + gp_touch_uart_instance->p_api->read(gp_touch_uart_instance->p_ctrl, + &g_touch_uart_rx_buf[0], + g_touch_uart_rx_num); + } +} + +void touch_tuning_open (touch_instance_ctrl_t * const p_instance_ctrl) +{ + ctsu_instance_ctrl_t * p_ctsu_instance_ctrl = (ctsu_instance_ctrl_t *) p_instance_ctrl->p_ctsu_instance->p_ctrl; + #if (CTSU_CFG_NUM_SELF_ELEMENTS != 0) + if (p_ctsu_instance_ctrl->md == CTSU_MODE_SELF_MULTI_SCAN) + { + p_ctsu_instance_ctrl->p_self_raw = + (p_ctsu_instance_ctrl->p_self_raw - + ((p_ctsu_instance_ctrl->self_elem_index - p_ctsu_instance_ctrl->num_elements) * CTSU_CFG_NUM_SUMULTI)); + p_ctsu_instance_ctrl->p_self_data = + (p_ctsu_instance_ctrl->p_self_data - + ((p_ctsu_instance_ctrl->self_elem_index - p_ctsu_instance_ctrl->num_elements) * CTSU_CFG_NUM_SUMULTI)); + p_ctsu_instance_ctrl->p_self_corr = + (p_ctsu_instance_ctrl->p_self_corr - + ((p_ctsu_instance_ctrl->self_elem_index - p_ctsu_instance_ctrl->num_elements) * CTSU_CFG_NUM_SUMULTI)); + } + #endif + + #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) + if (p_ctsu_instance_ctrl->md == CTSU_MODE_MUTUAL_FULL_SCAN) + { + p_ctsu_instance_ctrl->p_mutual_raw = + (p_ctsu_instance_ctrl->p_mutual_raw - + ((p_ctsu_instance_ctrl->mutual_elem_index - p_ctsu_instance_ctrl->num_elements) * CTSU_CFG_NUM_SUMULTI * + 2)); + p_ctsu_instance_ctrl->p_mutual_pri_corr = + (p_ctsu_instance_ctrl->p_mutual_pri_corr - + ((p_ctsu_instance_ctrl->mutual_elem_index - p_ctsu_instance_ctrl->num_elements) * CTSU_CFG_NUM_SUMULTI)); + p_ctsu_instance_ctrl->p_mutual_snd_corr = + (p_ctsu_instance_ctrl->p_mutual_snd_corr - + ((p_ctsu_instance_ctrl->mutual_elem_index - p_ctsu_instance_ctrl->num_elements) * CTSU_CFG_NUM_SUMULTI)); + p_ctsu_instance_ctrl->p_mutual_pri_data = + (p_ctsu_instance_ctrl->p_mutual_pri_data - + ((p_ctsu_instance_ctrl->mutual_elem_index - p_ctsu_instance_ctrl->num_elements) * CTSU_CFG_NUM_SUMULTI)); + p_ctsu_instance_ctrl->p_mutual_snd_data = + (p_ctsu_instance_ctrl->p_mutual_snd_data - + ((p_ctsu_instance_ctrl->mutual_elem_index - p_ctsu_instance_ctrl->num_elements) * CTSU_CFG_NUM_SUMULTI)); + } + #endif + p_ctsu_instance_ctrl->p_tuning_count = + (p_ctsu_instance_ctrl->p_tuning_count - + (p_ctsu_instance_ctrl->ctsu_elem_index - p_ctsu_instance_ctrl->num_elements)); + p_ctsu_instance_ctrl->p_tuning_diff = + (p_ctsu_instance_ctrl->p_tuning_diff - + (p_ctsu_instance_ctrl->ctsu_elem_index - p_ctsu_instance_ctrl->num_elements)); + p_ctsu_instance_ctrl->p_ctsuwr = + (p_ctsu_instance_ctrl->p_ctsuwr - + ((p_ctsu_instance_ctrl->ctsu_elem_index - p_ctsu_instance_ctrl->num_elements) * CTSU_CFG_NUM_SUMULTI)); +} + +void touch_tuning_dataget (touch_instance_ctrl_t * const p_instance_ctrl) +{ + uint16_t i; + ctsu_instance_ctrl_t * p_ctsu_instance_ctrl = (ctsu_instance_ctrl_t *) p_instance_ctrl->p_ctsu_instance->p_ctrl; + + if (CTSU_STATE_SCANNED == p_ctsu_instance_ctrl->state) + { + p_instance_ctrl->p_ctsu_instance->p_api->dataGet(p_instance_ctrl->p_ctsu_instance->p_ctrl, + &g_touch_tuning_ico_data[0]); + + g_touch_tuning_err_event = p_ctsu_instance_ctrl->error_status; + if (TOUCH_TUNING_MODE_MEASURE_PHASE3 != g_touch_tuning_mode) + { + g_touch_tuning_state = TOUCH_TUNING_STATE_COMPLETE; + } + + if (TOUCH_TUNING_MODE_MEASURE_PHASE1 == g_touch_tuning_mode) + { + for (i = 0; i < p_ctsu_instance_ctrl->num_elements; i++) + { + if (TOUCH_TUNING_SCAN_SELF == g_touch_tuning_scan_mode) + { + g_touch_tuning_ico_data[i] = p_ctsu_instance_ctrl->p_self_corr[i * CTSU_CFG_NUM_SUMULTI]; + } + else if (TOUCH_TUNING_SCAN_MUTUAL == g_touch_tuning_scan_mode) + { + g_touch_tuning_ico_data[i * 2] = p_ctsu_instance_ctrl->p_mutual_pri_corr[i]; + g_touch_tuning_ico_data[i * 2 + 1] = p_ctsu_instance_ctrl->p_mutual_snd_corr[i]; + } + else if (TOUCH_TUNING_SCAN_MUTUAL_CFC == g_touch_tuning_scan_mode) + { + g_touch_tuning_ico_data[i] = p_ctsu_instance_ctrl->p_mutual_raw[i]; + } + else + { + } + } + } + else if (TOUCH_TUNING_MODE_MEASURE_PHASE2 == g_touch_tuning_mode) + { + if (p_ctsu_instance_ctrl->tuning == CTSU_TUNING_INCOMPLETE) + { + for (i = 0; i < p_ctsu_instance_ctrl->num_elements; i++) + { + *(p_ctsu_instance_ctrl->p_tuning_count + i) = 0; + } + + g_touch_tuning_state = TOUCH_TUNING_STATE_SCAN; + } + } + else if (TOUCH_TUNING_MODE_MEASURE_PHASE3 == g_touch_tuning_mode) + { + #if (CTSU_CFG_NUM_MUTUAL_ELEMENTS != 0) + if (TOUCH_TUNING_SCAN_MUTUAL == g_touch_tuning_scan_mode) + { + for (i = 0; i < CTSU_CFG_NUM_MUTUAL_ELEMENTS; i++) + { + g_touch_tuning_mutual_data[i] = + (uint16_t) (g_touch_tuning_ico_data[i * 2 + 1] - g_touch_tuning_ico_data[i * 2]); + } + } + else if (TOUCH_TUNING_SCAN_MUTUAL_CFC == g_touch_tuning_scan_mode) + { + for (i = 0; i < CTSU_CFG_NUM_MUTUAL_ELEMENTS; i++) + { + g_touch_tuning_mutual_data[i] = + (uint16_t) (g_touch_tuning_ico_data[i * 2 + 1] - g_touch_tuning_ico_data[i * 2]); + } + } + else + { + } + #endif + } + else + { + } + } +} + +void touch_tuning_scanstart (touch_instance_ctrl_t * const p_instance_ctrl) +{ + ctsu_instance_ctrl_t * p_ctsu_instance_ctrl = (ctsu_instance_ctrl_t *) p_instance_ctrl->p_ctsu_instance->p_ctrl; + + if ((CTSU_STATE_IDLE == p_ctsu_instance_ctrl->state) && (TOUCH_TUNING_STATE_COMPLETE != g_touch_tuning_state)) + { + /* CTSU measurement start processing */ + p_instance_ctrl->p_ctsu_instance->p_api->scanStart(p_instance_ctrl->p_ctsu_instance->p_ctrl); + } +} + +void touch_tuning_get32 (uint32_t * p_val, uint16_t index) +{ + *p_val = ((uint32_t) g_touch_uart_rx_buf[index + 3] << 24) | + ((uint32_t) g_touch_uart_rx_buf[index + 2] << 16) | + ((uint32_t) g_touch_uart_rx_buf[index + 1] << 8) | + ((uint32_t) g_touch_uart_rx_buf[index]); +} + +void touch_tuning_get16 (uint16_t * p_val, uint16_t index) +{ + *p_val = (uint16_t) ((g_touch_uart_rx_buf[index + 1] << 8) | + g_touch_uart_rx_buf[index]); +} + +void touch_tuning_get8 (uint8_t * p_val, uint16_t index) +{ + *p_val = (g_touch_uart_rx_buf[index]); +} + +void touch_tuning_send32 (uint32_t value, uint16_t index) +{ + g_touch_tuning_tx_buf[index] = (uint8_t) (value); + g_touch_tuning_tx_buf[index + 1] = (uint8_t) (value >> 8); + g_touch_tuning_tx_buf[index + 2] = (uint8_t) (value >> 16); + g_touch_tuning_tx_buf[index + 3] = (uint8_t) (value >> 24); +} + +void touch_tuning_send16 (uint16_t value, uint16_t index) +{ + g_touch_tuning_tx_buf[index] = (uint8_t) (value); + g_touch_tuning_tx_buf[index + 1] = (uint8_t) (value >> 8); + g_touch_tuning_tx_buf[index + 2] = 0; + g_touch_tuning_tx_buf[index + 3] = 0; +} + +void touch_tuning_send8 (uint8_t value, uint16_t index) +{ + g_touch_tuning_tx_buf[index] = (value); + g_touch_tuning_tx_buf[index + 1] = 0; + g_touch_tuning_tx_buf[index + 2] = 0; + g_touch_tuning_tx_buf[index + 3] = 0; } #endif