Обновление OTA - плата sodaq (совместимая с arduino M0)

ota

Я пытаюсь выполнить обновление прошивки с SD-карты на плате Sodaq Sara AFF. Если я использую библиотеку SDU.h в своем скетче, она не проходит проверку платы. Смотрите эту ссылку.

Я отредактировал SDU.cpp сам принудительно выбираю ARDUINO_SAM_ZERO. Теперь это :

__attribute__ ((section(".sketch_boot")))
unsigned char sduBoot[0x6000] = {
  #include "boot/mzero.h"
};

Я увеличил размер до 6000, иначе он жаловался слишком много инициализаторов.

Я также изменил SD_SS_PIN , чтобы он соответствовал pin на SDUboot.inoв разделе дополнительно. После этого я перекомпилировал его с build.sh в той же папке.

Но я не могу выполнить обновление прошивки. После включения питания платы (исходный код: пример blink, целевое обновление: blink с более высокой скоростью) - оригинальная прошивка остается.

Я экспортировал прошивку с помощью arduino IDE -> export compiled bynary и протестировал обе версии с загрузчиком и без него.

Любая помощь будет оценена по достоинству.

, 👍1

Обсуждение

какой загрузчик имеет плату? разница между MKR/Zero и M0 заключается в том, что для SDU размер загрузчика составляет 2 Кб для MKR и Zero и 4 кБ для M0. ваш скетч больше половины прошивки?, @Juraj

@Juraj на плате установлен ATSAMD21J18, 32-разрядный ARM Cortex M0+. Итак, я предполагаю размер загрузчика 4 кБ. Имеет ли это значение, если скетч больше половины Flash?, @phlegx

Ноль и M0 являются SAMD21, но имеют разные загрузчики. двоичный файл скетча не должен быть меньше половины флэш-памяти, если он загружен с SD-карты, @Juraj

https://github.com/arduino/ArduinoCore-samd/pull/344/commits, @Juraj

И что это значит, наконец? Какова правильная настройка, чтобы заставить его работать?, @phlegx

@phlegx, правильный способ-создать .h для библиотеки SDU, соответствующей выводам платы и этому скетчу, закодированному в.h должен знать правильный размер загрузчика. это пакет плат не Arduino SAMD, а какой-то третьей стороны, он должен быть изменен в качестве PR в моем предыдущем комментарии, @Juraj


1 ответ


1

РЕШЕНО!

Я собрал свой собственный SDUBoot.ino с фиксированным SDU_START 0x2000 и для SODAQ Sara (boot/sodaq_sara.h). Мой скетч с #include "SDU.h" успешно компилируется. Пакет платы также установлен в Arduino (http://downloads.sodaq.net/package_sodaq_samd_index.json). Вот мой код с изменениями (база SodaqCore-samd-1.8.6-sodaq от Github):

Библиотеки файлов/SDU/extras/SDUBoot/SDUBoot.ino:

#include <SD.h>
#include <FlashStorage.h>

#define SDU_START    0x2000
#define SDU_SIZE     0x4000

#define SKETCH_START (uint32_t*)(SDU_START + SDU_SIZE)

#ifndef SDCARD_SS_PIN
#define SDCARD_SS_PIN 10
#endif

#define UPDATE_FILE "UPDATE.BIN"

FlashClass flash;

// Initialize C library
extern "C" void __libc_init_array(void);

int main() {
  init();

  __libc_init_array();

  delay(1);

  if (SD.begin(SDCARD_SS_PIN) && SD.exists(UPDATE_FILE)) {
    File updateFile = SD.open(UPDATE_FILE);
    uint32_t updateSize = updateFile.size();
    bool updateFlashed = false;

    if (updateSize > SDU_SIZE) {
      // пропустить раздел SDU
      updateFile.seek(SDU_SIZE);
      updateSize -= SDU_SIZE;

      uint32_t flashAddress = (uint32_t)SKETCH_START;

      // стереть страницы
      flash.erase((void*)flashAddress, updateSize);

      uint8_t buffer[512];

      // писать страницы
      for (uint32_t i = 0; i < updateSize; i += sizeof(buffer)) {
        updateFile.read(buffer, sizeof(buffer));

        flash.write((void*)flashAddress, buffer, sizeof(buffer));

        flashAddress += sizeof(buffer);
      }

      updateFlashed = true;
    }

    updateFile.close();

    if (updateFlashed) {
      SD.remove(UPDATE_FILE);
    }
  }

  // переход к скетчу
  __set_MSP(*SKETCH_START);

  //Сброс адреса векторной таблицы
  SCB->VTOR = ((uint32_t)(SKETCH_START) & SCB_VTOR_TBLOFF_Msk);

  //  адрес Reset_Handler записывается компоновщиком в начале раздела .text (см. сценарий компоновщика)
  uint32_t resetHandlerAddress = (uint32_t) * (SKETCH_START + 1);
  // перейти к сбросу обработчика
  asm("bx %0"::"r"(resetHandlerAddress));
}

Файл libraries/SDU/extras/SDUBoot/build.sh:

#!/bin/sh -x

ARDUINO=arduino
SKETCH_NAME="SDUBoot.ino"
SKETCH="$PWD/$SKETCH_NAME"
BUILD_PATH="$PWD/build"
OUTPUT_PATH="../../src/boot"

if [[ "$OSTYPE" == "darwin"* ]]; then
    ARDUINO="/Applications/Arduino.app/Contents/MacOS/Arduino"
fi

buildSDUBootSketch() {
    BOARD=$1
    DESTINATION=$2

    $ARDUINO --verify --board $BOARD --preserve-temp-files --pref build.path="$BUILD_PATH" $SKETCH
    cat "$BUILD_PATH/$SKETCH_NAME.bin" | xxd -i > $DESTINATION
    rm -rf "$BUILD_PATH"
}

mkdir -p "$OUTPUT_PATH"

buildSDUBootSketch "SODAQ:samd:sodaq_sara" "$OUTPUT_PATH/sodaq_sara.h"

Файл libraries/SDU/src/SDU.cpp:

#include <Arduino.h>

#include "SDU.h"

__attribute__ ((section(".sketch_boot")))
unsigned char sduBoot[0x4000] = {
  #include "boot/sodaq_sara.h"
};

Файл скетча sdu_test.ino:

#include <Arduino.h>
#include "SDU.h"

#if defined(ARDUINO_SODAQ_SARA)
#define DEBUG_STREAM SerialUSB
#else
#error "Please select the SODAQ SARA as your board"
#endif

#define DEBUG_STREAM_BAUD 115200

String message;

void setup() {
  // Start communication.
  DEBUG_STREAM.begin(DEBUG_STREAM_BAUD);

  while (!DEBUG_STREAM) {
    // Wait for Serial Monitor to be opened.
  }

  message += "Sketch compile date and time: ";
  message += __DATE__;
  message += " ";
  message += __TIME__;

  // print out the sketch compile date and time on the serial port
  DEBUG_STREAM.println(message);
}

void loop() {
  // add you own code here
}

Файл arduino/50/.arduino15/packages/SODAQ/hardware/samd/1.8.6/variants/sodaq_sara/linker_scripts/gcc/flash_with_bootloader.ld добавьте следующие строки:

KEEP(*(.sketch_boot))

. = ALIGN(0x2000);

здесь:

...
SECTIONS
{
    PROVIDE(__sodaq_firmware_state = ORIGIN(FLASH) - 0x100);

    .text :
    {
        __text_start__ = .;

        KEEP(*(.sketch_boot))

        . = ALIGN(0x2000);
        KEEP(*(.isr_vector))
        ...

На SD - карте (отформатированной как FAT32) Я сохранил переименованный файл UPDATE.bin без загрузчика скомпилированного файла скетча. Вывод D10 подключается и используется в качестве чипа select CS.

Сборка загрузочных шестнадцатеричных файлов:

$ cd libraries/SDU/extras/SDUBoot
$ ./build.sh

Версия 1.8.6-sodaq имеет эти недостающие строки в варианте arduino_zero, но не в варианте sodaq_sara.

,

Привет, меня не было в связи с тем, что во времена Корорны все изменилось, но теперь я вернулся. Это не работает. Он компилируется, но я не могу загрузить новую прошивку без загрузчика., @Sean