Skip to content

Commit d08c819

Browse files
Merge pull request ARMmbed#6746 from marcuschangarm/fix-vector-relocation
Fix vector table relocation for NRF52
2 parents 4e66f21 + bb14051 commit d08c819

File tree

4 files changed

+641
-5
lines changed

4 files changed

+641
-5
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
/**
2+
* Copyright (c) 2016 - 2017, Nordic Semiconductor ASA
3+
*
4+
* All rights reserved.
5+
*
6+
* Redistribution and use in source and binary forms, with or without modification,
7+
* are permitted provided that the following conditions are met:
8+
*
9+
* 1. Redistributions of source code must retain the above copyright notice, this
10+
* list of conditions and the following disclaimer.
11+
*
12+
* 2. Redistributions in binary form, except as embedded into a Nordic
13+
* Semiconductor ASA integrated circuit in a product or a software update for
14+
* such product, must reproduce the above copyright notice, this list of
15+
* conditions and the following disclaimer in the documentation and/or other
16+
* materials provided with the distribution.
17+
*
18+
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
19+
* contributors may be used to endorse or promote products derived from this
20+
* software without specific prior written permission.
21+
*
22+
* 4. This software, with or without modification, must only be used with a
23+
* Nordic Semiconductor ASA integrated circuit.
24+
*
25+
* 5. Any software provided in binary form under this license must not be reverse
26+
* engineered, decompiled, modified and/or disassembled.
27+
*
28+
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
29+
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
30+
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
31+
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
32+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
34+
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36+
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
37+
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38+
*
39+
*/
40+
#include "nrf_dfu_mbr.h"
41+
#include "nrf_mbr.h"
42+
#include "nrf_dfu_types.h"
43+
#include "nrf_log.h"
44+
45+
uint32_t nrf_dfu_mbr_copy_bl(uint32_t * p_src, uint32_t len)
46+
{
47+
uint32_t ret_val;
48+
uint32_t const len_words = len / sizeof(uint32_t);
49+
50+
sd_mbr_command_t command =
51+
{
52+
.command = SD_MBR_COMMAND_COPY_BL,
53+
.params.copy_bl.bl_src = p_src,
54+
.params.copy_bl.bl_len = len_words
55+
};
56+
57+
ret_val = sd_mbr_command(&command);
58+
59+
return ret_val;
60+
}
61+
62+
63+
uint32_t nrf_dfu_mbr_copy_sd(uint32_t * p_dst, uint32_t * p_src, uint32_t len)
64+
{
65+
uint32_t ret_val;
66+
uint32_t const len_words = len / sizeof(uint32_t);
67+
68+
if ((len_words & (CODE_PAGE_SIZE / sizeof(uint32_t) - 1)) != 0)
69+
return NRF_ERROR_INVALID_LENGTH;
70+
71+
sd_mbr_command_t command =
72+
{
73+
.command = SD_MBR_COMMAND_COPY_SD,
74+
.params.copy_sd.src = p_src,
75+
.params.copy_sd.dst = p_dst,
76+
.params.copy_sd.len = len_words
77+
};
78+
79+
ret_val = sd_mbr_command(&command);
80+
81+
return ret_val;
82+
}
83+
84+
85+
uint32_t nrf_dfu_mbr_init_sd(void)
86+
{
87+
uint32_t ret_val;
88+
89+
sd_mbr_command_t command =
90+
{
91+
.command = SD_MBR_COMMAND_INIT_SD
92+
};
93+
94+
ret_val = sd_mbr_command(&command);
95+
96+
return ret_val;
97+
}
98+
99+
100+
uint32_t nrf_dfu_mbr_compare(uint32_t * p_ptr1, uint32_t * p_ptr2, uint32_t len)
101+
{
102+
uint32_t ret_val;
103+
uint32_t const len_words = len / sizeof(uint32_t);
104+
105+
sd_mbr_command_t command =
106+
{
107+
.command = SD_MBR_COMMAND_COMPARE,
108+
.params.compare.ptr1 = p_ptr1,
109+
.params.compare.ptr2 = p_ptr2,
110+
.params.compare.len = len_words
111+
};
112+
113+
ret_val = sd_mbr_command(&command);
114+
115+
return ret_val;
116+
}
117+
118+
119+
uint32_t nrf_dfu_mbr_vector_table_set(uint32_t address)
120+
{
121+
uint32_t ret_val;
122+
123+
NRF_LOG_DEBUG("running vector table set");
124+
sd_mbr_command_t command =
125+
{
126+
.command = SD_MBR_COMMAND_VECTOR_TABLE_BASE_SET,
127+
.params.base_set.address = address,
128+
};
129+
130+
ret_val = sd_mbr_command(&command);
131+
NRF_LOG_DEBUG("After running vector table set");
132+
133+
return ret_val;
134+
}
135+
136+
137+
#ifndef SOFTDEVICE_PRESENT
138+
uint32_t nrf_dfu_mbr_irq_forward_address_set(uint32_t address)
139+
{
140+
uint32_t ret_val;
141+
142+
NRF_LOG_DEBUG("running irq table set");
143+
sd_mbr_command_t command =
144+
{
145+
.command = SD_MBR_COMMAND_IRQ_FORWARD_ADDRESS_SET,
146+
.params.irq_forward_address_set.address = address,
147+
};
148+
149+
ret_val = sd_mbr_command(&command);
150+
NRF_LOG_DEBUG("After running irq table set");
151+
152+
return ret_val;
153+
}
154+
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
/**
2+
* Copyright (c) 2016 - 2017, Nordic Semiconductor ASA
3+
*
4+
* All rights reserved.
5+
*
6+
* Redistribution and use in source and binary forms, with or without modification,
7+
* are permitted provided that the following conditions are met:
8+
*
9+
* 1. Redistributions of source code must retain the above copyright notice, this
10+
* list of conditions and the following disclaimer.
11+
*
12+
* 2. Redistributions in binary form, except as embedded into a Nordic
13+
* Semiconductor ASA integrated circuit in a product or a software update for
14+
* such product, must reproduce the above copyright notice, this list of
15+
* conditions and the following disclaimer in the documentation and/or other
16+
* materials provided with the distribution.
17+
*
18+
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
19+
* contributors may be used to endorse or promote products derived from this
20+
* software without specific prior written permission.
21+
*
22+
* 4. This software, with or without modification, must only be used with a
23+
* Nordic Semiconductor ASA integrated circuit.
24+
*
25+
* 5. Any software provided in binary form under this license must not be reverse
26+
* engineered, decompiled, modified and/or disassembled.
27+
*
28+
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
29+
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
30+
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
31+
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
32+
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33+
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
34+
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
35+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
36+
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
37+
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38+
*
39+
*/
40+
/**@file
41+
*
42+
* @defgroup sdk_nrf_dfu_mbr MBR functions
43+
* @{
44+
* @ingroup nrf_dfu
45+
*/
46+
47+
#ifndef NRF_DFU_MBR_H__
48+
#define NRF_DFU_MBR_H__
49+
50+
#include <stdint.h>
51+
52+
#ifdef __cplusplus
53+
extern "C" {
54+
#endif
55+
56+
/** @brief Function for copying the bootloader using an MBR command.
57+
*
58+
* @param[in] p_src Source address of the bootloader data to copy.
59+
* @param[in] len Length of the data to copy in bytes.
60+
*
61+
* @return This function will return only if the command request could not be run.
62+
* See @ref sd_mbr_command_copy_bl_t for possible return values.
63+
*/
64+
uint32_t nrf_dfu_mbr_copy_bl(uint32_t * p_src, uint32_t len);
65+
66+
67+
/** @brief Function for copying the SoftDevice using an MBR command.
68+
*
69+
* @param[in] p_dst Target of the SoftDevice copy.
70+
* @param[in] p_src Source address of the SoftDevice image to copy.
71+
* @param[in] len Length of the data to copy in bytes.
72+
*
73+
* @retval NRF_SUCCESS indicates that the contents of the memory blocks where copied correctly.
74+
* @retval NRF_ERROR_INVALID_LENGTH Invalid len
75+
* @retval NRF_ERROR_NO_MEM if UICR.NRFFW[1] is not set (i.e. is 0xFFFFFFFF).
76+
* @retval NRF_ERROR_INVALID_PARAM if an invalid command is given.
77+
* @retval NRF_ERROR_INTERNAL indicates that the contents of the memory blocks where not verified correctly after copying.
78+
*/
79+
uint32_t nrf_dfu_mbr_copy_sd(uint32_t * p_dst, uint32_t * p_src, uint32_t len);
80+
81+
82+
/** @brief Function for initializing the SoftDevice using an MBR command.
83+
*
84+
* @retval NRF_SUCCESS If the SoftDevice was copied successfully.
85+
* Any other return value indicates that the SoftDevice
86+
* could not be copied.
87+
*/
88+
uint32_t nrf_dfu_mbr_init_sd(void);
89+
90+
91+
/** @brief Function for comparing source and target using an MBR command.
92+
*
93+
* @param[in] p_ptr1 First pointer to data to compare.
94+
* @param[in] p_ptr2 Second pointer to data to compare.
95+
* @param[in] len Length of the data to compare in bytes.
96+
*
97+
* @retval NRF_SUCCESS If the content of both memory blocks is equal.
98+
* @retval NRF_ERROR_NULL If the content of the memory blocks differs.
99+
*/
100+
uint32_t nrf_dfu_mbr_compare(uint32_t * p_ptr1, uint32_t * p_ptr2, uint32_t len);
101+
102+
103+
/** @brief Function for setting the address of the vector table using an MBR command.
104+
*
105+
* @param[in] address Address of the new vector table.
106+
*
107+
* @retval NRF_SUCCESS If the address of the new vector table was set. Any other
108+
* return value indicates that the address could not be set.
109+
*/
110+
uint32_t nrf_dfu_mbr_vector_table_set(uint32_t address);
111+
112+
113+
#ifndef SOFTDEVICE_PRESENT
114+
/** @brief Function for setting the address of the irq table using an MBR command.
115+
*
116+
* @param[in] address Address of the new irq table.
117+
*
118+
* @retval NRF_SUCCESS If the address of the new irq table was set. Any other
119+
* return value indicates that the address could not be set.
120+
*/
121+
uint32_t nrf_dfu_mbr_irq_forward_address_set(uint32_t address);
122+
#endif
123+
124+
125+
#ifdef __cplusplus
126+
}
127+
#endif
128+
129+
#endif // NRF_DFU_MBR_H__
130+
131+
/** @} */

0 commit comments

Comments
 (0)