mirror of
				https://github.com/alexandrebobkov/ESP-Nodes.git
				synced 2025-10-30 17:51:49 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			122 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* Copyright 2018-2024 Espressif Systems (Shanghai) CO LTD
 | |
|  *
 | |
|  * Licensed under the Apache License, Version 2.0 (the "License");
 | |
|  * you may not use this file except in compliance with the License.
 | |
|  * You may obtain a copy of the License at
 | |
|  *
 | |
|  *     http://www.apache.org/licenses/LICENSE-2.0
 | |
|  *
 | |
|  * Unless required by applicable law or agreed to in writing, software
 | |
|  * distributed under the License is distributed on an "AS IS" BASIS,
 | |
|  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
|  * See the License for the specific language governing permissions and
 | |
|  * limitations under the License.
 | |
|  */
 | |
| 
 | |
| #include "catch.hpp"
 | |
| #include "test_port.h"
 | |
| #include "esp_loader.h"
 | |
| #include "esp_loader_io.h"
 | |
| #include <algorithm>
 | |
| #include <iostream>
 | |
| #include <fstream>
 | |
| 
 | |
| using namespace std;
 | |
| 
 | |
| 
 | |
| #define ESP_ERR_CHECK(exp) REQUIRE( (exp) == ESP_LOADER_SUCCESS )
 | |
| 
 | |
| const uint32_t APP_START_ADDRESS = 0x10000;
 | |
| 
 | |
| 
 | |
| TEST_CASE( "Can connect " )
 | |
| {
 | |
|     esp_loader_connect_args_t connect_config = ESP_LOADER_CONNECT_DEFAULT();
 | |
| 
 | |
|     ESP_ERR_CHECK( esp_loader_connect(&connect_config) );
 | |
|     REQUIRE( esp_loader_get_target() == ESP32_CHIP );
 | |
| }
 | |
| 
 | |
| 
 | |
| inline auto file_size_is(ifstream &file)
 | |
| {
 | |
|     uint32_t file_size;
 | |
| 
 | |
|     file.seekg(0, ios::end);
 | |
|     file_size = file.tellg();
 | |
|     file.seekg(0);
 | |
| 
 | |
|     return file_size;
 | |
| }
 | |
| 
 | |
| void flash_application(ifstream &image)
 | |
| {
 | |
|     uint8_t payload[1024];
 | |
|     int32_t count = 0;
 | |
|     size_t image_size = file_size_is(image);
 | |
| 
 | |
|     ESP_ERR_CHECK( esp_loader_flash_start(APP_START_ADDRESS, image_size, sizeof(payload)) );
 | |
| 
 | |
|     while (image_size > 0) {
 | |
|         size_t to_read = min(image_size, sizeof(payload));
 | |
| 
 | |
|         image.read((char *)payload, to_read);
 | |
| 
 | |
|         ESP_ERR_CHECK( esp_loader_flash_write(payload, to_read) );
 | |
| 
 | |
|         cout << endl << "--- FLASH DATA PACKET: " << count++
 | |
|              <<  " DATA WRITTEN: " << to_read << " ---" << endl;
 | |
| 
 | |
|         image_size -= to_read;
 | |
|     };
 | |
| 
 | |
|     // Omit restart
 | |
|     // loader_flash_finish(false);
 | |
| }
 | |
| 
 | |
| bool file_compare(ifstream &file_1, ifstream &file_2, size_t file_size)
 | |
| {
 | |
|     vector<char> file_data_1(file_size);
 | |
|     vector<char> file_data_2(file_size);
 | |
| 
 | |
|     file_1.read((char *) &file_data_1[0], file_size);
 | |
|     file_2.read((char *) &file_data_2[0], file_size);
 | |
| 
 | |
|     return file_data_1 == file_data_2;
 | |
| }
 | |
| 
 | |
| 
 | |
| TEST_CASE( "Can write application to flash" )
 | |
| {
 | |
|     ifstream new_image;
 | |
|     ifstream qemu_image;
 | |
| 
 | |
|     new_image.open ("../hello-world.bin", ios::binary | ios::in);
 | |
|     qemu_image.open ("empty_file.bin", ios::binary | ios::in);
 | |
| 
 | |
|     REQUIRE ( new_image.is_open() );
 | |
|     REQUIRE ( qemu_image.is_open() );
 | |
| 
 | |
|     flash_application(new_image);
 | |
| 
 | |
|     auto new_image_size = file_size_is(new_image);
 | |
|     qemu_image.seekg(APP_START_ADDRESS);
 | |
|     new_image.seekg(0);
 | |
| 
 | |
|     REQUIRE ( file_compare(new_image, qemu_image, new_image_size) );
 | |
| 
 | |
|     ESP_ERR_CHECK ( esp_loader_flash_verify() );
 | |
| 
 | |
|     // NOTE: loader_flash_finish() is not called to prevent reset of target
 | |
| }
 | |
| 
 | |
| TEST_CASE( "Can write and read register" )
 | |
| {
 | |
|     uint32_t reg_value = 0;
 | |
|     uint32_t SPI_MOSI_DLEN_REG = 0x60002000 + 0x28;
 | |
| 
 | |
|     ESP_ERR_CHECK( esp_loader_write_register(SPI_MOSI_DLEN_REG, 55) );
 | |
|     ESP_ERR_CHECK( esp_loader_read_register(SPI_MOSI_DLEN_REG, ®_value) );
 | |
|     REQUIRE ( reg_value == 55 );
 | |
| }
 |