1 /*
2 * Copyright (c) 2020 - 2024 Renesas Electronics Corporation and/or its affiliates
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6 
7 /**********************************************************************************************************************
8  * File Name    : bsp_address_convert.c
9  * Version      : 1.00
10  * Description  : bsp_address_convert source code
11  *********************************************************************************************************************/
12 
13 /***********************************************************************************************************************
14  * Includes   <System Includes> , "Project Includes"
15  **********************************************************************************************************************/
16 #include "bsp_api.h"
17 #include "bsp_address_convert.h"
18 
19 /***********************************************************************************************************************
20  * Macro definitions
21  **********************************************************************************************************************/
22 #define BSP_PRV_ADDRESS_TABLE_END    (0xFFFFFFFF)
23 
24 /***********************************************************************************************************************
25  * Typedef definitions
26  **********************************************************************************************************************/
27 typedef struct bsp_address_convert_table
28 {
29     uint32_t original_address;         ///< Base address of CPU Address space
30     uint32_t converted_address;        ///< Base address of Bus-master's Address space
31     uint32_t size;                     ///< size of region (byte)
32 } r_bsp_address_convert_table_t;
33 
34 /***********************************************************************************************************************
35  * Exported global variables (to be accessed by other files)
36  **********************************************************************************************************************/
37 
38 /***********************************************************************************************************************
39  * Private global variables and functions
40  **********************************************************************************************************************/
41 r_bsp_address_convert_table_t g_address_convert_table_array[] =
42 {
43     BSP_ADDRESS_CONVERT_TABLE_BODY,
44     {BSP_PRV_ADDRESS_TABLE_END,    BSP_PRV_ADDRESS_TABLE_END,BSP_PRV_ADDRESS_TABLE_END}
45 };
46 
47 /*******************************************************************************************************************//**
48  * @addtogroup BSP_MCU
49  *
50  * @{
51  **********************************************************************************************************************/
52 
53 /** @} (end addtogroup BSP_MCU) */
54 
55 /*******************************************************************************************************************//**
56  * Converts the cpu address specified in the argument to the bus address.
57  * If an address that does not exist in the external-bus is specified, it will not be converted.
58  *
59  * @param[in]  original_address    Address that CPU access to slave.
60  *
61  * @retval     converted_address   Address that Bus-master device access to slave.
62  **********************************************************************************************************************/
R_BSP_SlaveAddressConversion(uint32_t original_address)63 uint32_t R_BSP_SlaveAddressConversion (uint32_t original_address)
64 {
65     uint32_t converted_address = original_address; // Set unconverted address as initial value.
66     r_bsp_address_convert_table_t * p_convert_table = &g_address_convert_table_array[0];
67 
68     for ( ; BSP_PRV_ADDRESS_TABLE_END != p_convert_table->original_address; p_convert_table++)
69     {
70         uint32_t region_base = p_convert_table->original_address;
71         if ((region_base <= original_address) && (original_address < (region_base + p_convert_table->size)))
72         {
73             /* find region: convert address */
74             converted_address = (original_address & BSP_ADDRESS_OFFSET_MASK) | p_convert_table->converted_address;
75 
76             /* exit loop */
77             break;
78         }
79     }
80 
81     return converted_address;
82 }
83