заливка прошивки (hex файл) в ардуино через UART с SD карты другой ардуинки

Тема в разделе "Arduino & Shields", создана пользователем gonzales, 20 дек 2018.

  1. gonzales

    gonzales Гик

    Доброго времени суток!

    Интересует тема, как можно залить прошивку в ардуино не через ISP, а через UART, по типу как это делается с помощью программатора USB-TTL, но используя не Arduino IDE, а другую Ардуино.

    Суть задачки следующая. Есть несколько ПроМини, объединенных модифицированной RS-485 шиной. Модификация заключается в дополнительной линии, обеспечивающей аппаратный ребут ПроМини. Среди объединенных МК есть мастер с SD картой, на которой лежит прошивка (hex файл). Идея в следующем, чтобы мастер послал команду, какую ПроМини он сейчас будет прошивать, на ней выставился флаг прошивки, далее мастер дергает линию аппаратного ребута, все ПроМини перегружаются и та, на которой выставлен флаг прошивки входит в "режим прошивки". Далее мастер считывает прошивку с SD и льет ее по UART, соответственно она занимает свое место в памяти нужной ПроМини. После этого мастер еще раз дергает линию ребута, все ПроМини ребутятся еще раз и начинается выполнение программы.

    Но это я так "красиво" написал, как я себе это представляю в общем, но при реализации возникает гора вопросов, пока основным является алгоритм взаимодействия мастера с ПроМини после ребута - как войти в "режим прошивки", если я правильно понял, чтобы ПроМини стала ожидать заливки прошивки нужно что-то послать заргузчику. По обрывочным сведениям должно быть что-то типа "бутлоадер по идее должен подхватить команду DTR (тройное сочетание не помню каких символов) и перепрошиться. И да, все модули должны быть настроены так: по умолчанию (подтяжкой,безо всяких действий со стороны МК) должны быть в режиме Rx."

    Интернет мне не смог помочь, либо я пока не знаю, как правильно спросить), может уважаемое сообщество располагает какими-либо сведениями в этом вопросе.

    Всем заранее спасибо за ответы!
     
  2. parovoZZ

    parovoZZ Гуру

    Выдумать свой протокол обмена и написать свой загрузчик. Либо изучить существующие. Делов-то.
     
  3. Вам надо написать свой собственный загрузчик. Вся необходимая информация есть в даташите.
     
  4. DetSimen

    DetSimen Guest

    С таким лагаритмом далеко не уедешь.
     
  5. gonzales

    gonzales Гик

    Я использую optiboot загрузчик https://github.com/Optiboot/optiboot
    Вроде как там открытый код, но я не понимаю его структуры, если не затруднит, ткните, где можно почитать об этом, или в двух словах как он устроен
     
  6. b707

    b707 Гуру

    в двух словах - основной код находится в файле
    optiboot/optiboot/bootloaders/optiboot/optiboot.c
    сначала настраивается периферия, порт UART. скорости. устанавливается связь с программатором. Примерно с 700-750 строки собственно начинается код записи прошивки, потом идет верификация.
    Код очень большой, потому что написан разом под сотню разных контроллеров и конфигурируется в момент компиляции.
    Если вы не знаете, как работать с регистрами МК напрямую, без ардуино. не очень в курсе внутреннего устройства флеш и УАРТ - имхо, в этом коде "ловить" вам нечего, сначала надо подучится годика так два.
     
    parovoZZ нравится это.
  7. gonzales

    gonzales Гик

    Это понятно. Имхо не так там все сложно, как Вы расписали.
    Вот строчки кода
    Код (C++):
     /* Forever loop: exits by causing WDT reset */
      for (;;) {
        /* get character from UART */
        ch = getch();
    то есть программа ожидает по UART прихода символа. Если я правильно понимаю список вот такой
    Код (C++):
    /* STK500 constants list, from AVRDUDE */
    #define STK_OK              0x10
    #define STK_FAILED          0x11  // Not used
    #define STK_UNKNOWN         0x12  // Not used
    #define STK_NODEVICE        0x13  // Not used
    #define STK_INSYNC          0x14  // ' '
    #define STK_NOSYNC          0x15  // Not used
    #define ADC_CHANNEL_ERROR   0x16  // Not used
    #define ADC_MEASURE_OK      0x17  // Not used
    #define PWM_CHANNEL_ERROR   0x18  // Not used
    #define PWM_ADJUST_OK       0x19  // Not used
    #define CRC_EOP             0x20  // 'SPACE'
    #define STK_GET_SYNC        0x30  // '0'
    #define STK_GET_SIGN_ON     0x31  // '1'
    #define STK_SET_PARAMETER   0x40  // '@'
    #define STK_GET_PARAMETER   0x41  // 'A'
    #define STK_SET_DEVICE      0x42  // 'B'
    #define STK_SET_DEVICE_EXT  0x45  // 'E'
    #define STK_ENTER_PROGMODE  0x50  // 'P'
    #define STK_LEAVE_PROGMODE  0x51  // 'Q'
    #define STK_CHIP_ERASE      0x52  // 'R'
    #define STK_CHECK_AUTOINC   0x53  // 'S'
    #define STK_LOAD_ADDRESS    0x55  // 'U'
    #define STK_UNIVERSAL       0x56  // 'V'
    #define STK_PROG_FLASH      0x60  // '`'
    #define STK_PROG_DATA       0x61  // 'a'
    #define STK_PROG_FUSE       0x62  // 'b'
    #define STK_PROG_LOCK       0x63  // 'c'
    #define STK_PROG_PAGE       0x64  // 'd'
    #define STK_PROG_FUSE_EXT   0x65  // 'e'
    #define STK_READ_FLASH      0x70  // 'p'
    #define STK_READ_DATA       0x71  // 'q'
    #define STK_READ_FUSE       0x72  // 'r'
    #define STK_READ_LOCK       0x73  // 's'
    #define STK_READ_PAGE       0x74  // 't'
    #define STK_READ_SIGN       0x75  // 'u'
    #define STK_READ_OSCCAL     0x76  // 'v'
    #define STK_READ_FUSE_EXT   0x77  // 'w'
    #define STK_READ_OSCCAL_EXT 0x78  // 'x'
     
    Далее начинается обработка
    Код (C++):
    if(ch == STK_GET_PARAMETER) {
    ......
    }
    else if(ch == STK_SET_DEVICE) {
    ......
    }
     
    Собственно сейчас не понятно, что именно надо посылать и в какой последовательности для прошивки
     
  8. Дорабатывать оптибут вам совершенно бесполезно. Он рассчитан на работу с протоколом STK500, что к вашей задаче не относится.
     
  9. gonzales

    gonzales Гик

  10. gonzales

    gonzales Гик

    Это почему?
     
  11. почему что?
     
  12. b707

    b707 Гуру

    Кстати - почему дорабатывать оптибут бесполезно?
    Пусть на основе протокола для СТК500 напишет свой... надо же с чего-то начинать.
     
  13. b707

    b707 Гуру

    ну рад за вас. Там и правда ничего заумного нет, только куча мелкой возни с взаимной проверкой флагов между программатором и загрузчиком
     
  14. Потому что 90% будет переписано, и разбираться во всем этом займет больше времени, чем написать заново оставшиеся 10%.
     
  15. gonzales

    gonzales Гик

    Почему бесполезно, optiboot разве использует не CTK500?
     
  16. А я что написал?
     
  17. gonzales

    gonzales Гик

    Уважаемые гуру может поправят, но я не могу понять, зачем что-то дописывать или переписывать. Есть программа - загрузчик, не важно какая, она уже содержит все необходимое для загрузки и верификации программного кода. Все общение с ней идет через UART, нужен лишь алгоритм действий. По ссылке, что я давал он как раз и расписан. Остается только его повторить. Или я не правильно говорю?
     
  18. Откуда программатор узнает про ваш сетевой протокол?
     
  19. parovoZZ

    parovoZZ Гуру

    Я бы такой фигней не страдал на AVR. Тут нужен МК с двумя банками памяти и переключатся на второй банк памяти только после проверки CRC. А иначе граблей насобираешь с целый колхоз.
     
  20. parovoZZ

    parovoZZ Гуру

    он детально описан в даташите.