mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			Disable the MPU when flashing
When programming flash using the FlashIAP API allow execution from ram. Many devices require flashing to be done from RAM. Also allow execution from ram when running the low level flash tests.pull/8871/head
							parent
							
								
									f44f87a196
								
							
						
					
					
						commit
						c0ff98614a
					
				| 
						 | 
					@ -21,6 +21,7 @@
 | 
				
			||||||
#include "utest/utest.h"
 | 
					#include "utest/utest.h"
 | 
				
			||||||
#include "unity/unity.h"
 | 
					#include "unity/unity.h"
 | 
				
			||||||
#include "greentea-client/test_env.h"
 | 
					#include "greentea-client/test_env.h"
 | 
				
			||||||
 | 
					#include "platform/mbed_mpu_mgmt.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "mbed.h"
 | 
					#include "mbed.h"
 | 
				
			||||||
#include "flash_api.h"
 | 
					#include "flash_api.h"
 | 
				
			||||||
| 
						 | 
					@ -251,11 +252,20 @@ Case cases[] = {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
utest::v1::status_t greentea_test_setup(const size_t number_of_cases)
 | 
					utest::v1::status_t greentea_test_setup(const size_t number_of_cases)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					    mbed_mpu_manager_lock_mem_xn();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GREENTEA_SETUP(20, "default_auto");
 | 
					    GREENTEA_SETUP(20, "default_auto");
 | 
				
			||||||
    return greentea_test_setup_handler(number_of_cases);
 | 
					    return greentea_test_setup_handler(number_of_cases);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Specification specification(greentea_test_setup, cases, greentea_test_teardown_handler);
 | 
					void greentea_test_teardown(const size_t passed, const size_t failed, const failure_t failure)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    mbed_mpu_manager_unlock_mem_xn();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    greentea_test_teardown_handler(passed, failed, failure);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Specification specification(greentea_test_setup, cases, greentea_test_teardown);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main()
 | 
					int main()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -25,6 +25,7 @@
 | 
				
			||||||
#include <algorithm>
 | 
					#include <algorithm>
 | 
				
			||||||
#include "FlashIAP.h"
 | 
					#include "FlashIAP.h"
 | 
				
			||||||
#include "platform/mbed_assert.h"
 | 
					#include "platform/mbed_assert.h"
 | 
				
			||||||
 | 
					#include "platform/MpuXnLock.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef DEVICE_FLASH
 | 
					#ifdef DEVICE_FLASH
 | 
				
			||||||
| 
						 | 
					@ -56,9 +57,12 @@ int FlashIAP::init()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int ret = 0;
 | 
					    int ret = 0;
 | 
				
			||||||
    _mutex->lock();
 | 
					    _mutex->lock();
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        MpuXnLock xn;
 | 
				
			||||||
        if (flash_init(&_flash)) {
 | 
					        if (flash_init(&_flash)) {
 | 
				
			||||||
            ret = -1;
 | 
					            ret = -1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    uint32_t page_size = get_page_size();
 | 
					    uint32_t page_size = get_page_size();
 | 
				
			||||||
    _page_buf = new uint8_t[page_size];
 | 
					    _page_buf = new uint8_t[page_size];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -70,9 +74,12 @@ int FlashIAP::deinit()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int ret = 0;
 | 
					    int ret = 0;
 | 
				
			||||||
    _mutex->lock();
 | 
					    _mutex->lock();
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        MpuXnLock xn;
 | 
				
			||||||
        if (flash_free(&_flash)) {
 | 
					        if (flash_free(&_flash)) {
 | 
				
			||||||
            ret = -1;
 | 
					            ret = -1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    delete[] _page_buf;
 | 
					    delete[] _page_buf;
 | 
				
			||||||
    _mutex->unlock();
 | 
					    _mutex->unlock();
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
| 
						 | 
					@ -83,7 +90,10 @@ int FlashIAP::read(void *buffer, uint32_t addr, uint32_t size)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    int32_t ret = -1;
 | 
					    int32_t ret = -1;
 | 
				
			||||||
    _mutex->lock();
 | 
					    _mutex->lock();
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        MpuXnLock xn;
 | 
				
			||||||
        ret = flash_read(&_flash, addr, (uint8_t *) buffer, size);
 | 
					        ret = flash_read(&_flash, addr, (uint8_t *) buffer, size);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    _mutex->unlock();
 | 
					    _mutex->unlock();
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -126,10 +136,13 @@ int FlashIAP::program(const void *buffer, uint32_t addr, uint32_t size)
 | 
				
			||||||
            prog_buf = buf;
 | 
					            prog_buf = buf;
 | 
				
			||||||
            prog_size = chunk;
 | 
					            prog_size = chunk;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            MpuXnLock xn;
 | 
				
			||||||
            if (flash_program_page(&_flash, addr, prog_buf, prog_size)) {
 | 
					            if (flash_program_page(&_flash, addr, prog_buf, prog_size)) {
 | 
				
			||||||
                ret = -1;
 | 
					                ret = -1;
 | 
				
			||||||
                break;
 | 
					                break;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        size -= chunk;
 | 
					        size -= chunk;
 | 
				
			||||||
        addr += chunk;
 | 
					        addr += chunk;
 | 
				
			||||||
        buf += chunk;
 | 
					        buf += chunk;
 | 
				
			||||||
| 
						 | 
					@ -170,7 +183,10 @@ int FlashIAP::erase(uint32_t addr, uint32_t size)
 | 
				
			||||||
    int32_t ret = 0;
 | 
					    int32_t ret = 0;
 | 
				
			||||||
    _mutex->lock();
 | 
					    _mutex->lock();
 | 
				
			||||||
    while (size) {
 | 
					    while (size) {
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            MpuXnLock xn;
 | 
				
			||||||
            ret = flash_erase_sector(&_flash, addr);
 | 
					            ret = flash_erase_sector(&_flash, addr);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        if (ret != 0) {
 | 
					        if (ret != 0) {
 | 
				
			||||||
            ret = -1;
 | 
					            ret = -1;
 | 
				
			||||||
            break;
 | 
					            break;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue