реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как добавить DFU загрузчик в существующий проект?
DeadCodder
сообщение May 17 2012, 06:44
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 4-10-10
Пользователь №: 59 904



Есть существующий рабочий проект (at32uc3a3256) загрузчик в котором изначально не планировался, а теперь вот возникла такая необходимость.
Подскажите, как прикрутить DFU загрузчик. Проблема, насколько я понимаю, избитая, но тем не менее не нашел решения.
Прошиваю руками загрузчик - он работает, шьет (из AVR32 Studio) и благополучно затирается.

Про trampoline знаю, но как его правильно добавить?

Для полноты - asf v2.8.1, AVR32 Studio Core Version: 2.6.0.201009140840.
Заранее благодарен.
Go to the top of the page
 
+Quote Post
S17
сообщение Feb 13 2013, 14:28
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 105
Регистрация: 22-06-05
Пользователь №: 6 228



Не видел, что тема "AVR32" существует...

Наверное, заданный вопрос уже не актуален, но пока он в "подвал" не ушёл, напишу, что знаю...

DFU_BootLoader можно добавить к своей прошивке утилитой "srec_cat.exe" или за-инклудить бинарный образ в своём поекте в "трамплине".

Утилита "srec_cat.exe": из своей прошивки беру адреса "-crop 0x80002000 0x80080000", добавляю DFU_BootLoader " dfu-bl/at32uc3a-isp-1.0.2.hex -intel" в адреса "-crop 0x80000000 0x80002000", к имени выходного файла добавляю "Дату".
Код
: If the input file is in Intel HEX format,

if "%1" == "" (
    echo Usage: gen_program_files+dfu+ms.cmd {hexfile}
    echo Make program files for:
    echo  *_dfu.hex  - for DFU programming ^(through DFU_BootLoader^)
    echo  *_jtag.hex - for JTAG programming with "DFU_BootLoader"
    pause
    exit
)

if "%~x1" neq ".hex" (
    echo === Error: Input file "%1" must be ".hex"!!!
    pause
    exit
)

if NOT EXIST %1 (  
    echo === Error: Input file "%1" is absent!!!
    pause
    exit
)

    SET FDATE=%~t1
    SET FDATE=%FDATE:~8,2%%FDATE:~3,2%%FDATE:~0,2%_%FDATE:~11,2%%FDATE:~14,2%

    echo Convert the input Intel HEX file "%~nx1" to:

    srec_cat.exe ^
      %1 -intel ^
      -crop 0x80002000 0x80080000 ^
      -o %~n1_dfu_%FDATE%.hex -intel
    echo ... "%~n1_dfu_%FDATE%.hex" for DFU_BootLoader

    srec_cat.exe ^
      dfu-bl/at32uc3a-isp-1.0.2.hex -intel ^
      -crop 0x80000000 0x80002000 ^
      %1 -intel ^
      -crop 0x80002000 0x80080000 ^
      -o %~n1_jtag_%FDATE%.hex -intel
    echo ... "%~n1_jtag_%FDATE%.hex" for JTAG-Programming ^(with 'DFU_BootLoader'^)
@echo on
    rename "%~nx1" "%~nx1.%FDATE%"

@pause


Мой "trampoline_uc3.S":
Код
#define PROGRAM_START_ADDRESS         (AVR32_FLASH_ADDRESS + PROGRAM_START_OFFSET)
#define PROGRAM_START_OFFSET          0x00008000


//! @{
//! \verbatim


  // This must be linked @ 0x80000000 if it is to be run upon reset.
  .section  .reset, "ax", @progbits

  .global _isp
  .type _isp, @function
_isp:
   // Include the ISP raw binary image. Точка отсчёта - из каталога "Debug" или "Release".
  .incbin "../src/asf/avr32/utils/startup/at32uc3a-isp-1.0.2.bin"
  .org    0x00002000

  .global _trampoline
  .type _trampoline, @function
_trampoline:
  // Jump to program start.
  rjmp    program_start

  .org  PROGRAM_START_OFFSET
program_start:
  // Jump to the C runtime startup routine.
  lda.w   pc, _stext


// http://sourceware.org/binutils/docs/as/Section.html#Section
  .section  .prog_version, "axS", @note

//! \endverbatim
//! @}


В файл "трамплина" добавил загрузку битового образа DFU_BootLoader: at32uc3a-isp-1.0.2.bin.
Его получил из "at32uc3a-isp-1.0.2.hex" утилитой "srec_cat.exe":

Код
echo ... convert the input Intel HEX file to %~n1.bin,
  srec_cat ^
    ^( %1 -intel ^
       -crop 0x80000000 0x80002000 ^
       -fill 0x00 0x80000000 -max %1 -intel -crop 0x80000000 0x80002000 ^) ^
    -offset -0x80000000 ^
    -o %~n1.bin -binary


В опции линкера добавить: "-Wl,-e,_trampoline" и поставить галку "Do not use standart start files".

Про всякие BootLoader писал здесь: http://electronix.ru/forum/index.php?showtopic=101718
Go to the top of the page
 
+Quote Post
Prof2008
сообщение Jan 17 2014, 03:10
Сообщение #3





Группа: Новичок
Сообщений: 6
Регистрация: 29-07-08
Пользователь №: 39 268



Поделюсь своим опытом добавления кода DFU в проект на IAR'е.

В настройках проекта указывается bin-образ загрузчика для линкера:
Project Options\Linker\Config\Raw binary image, где заполняются поля:
File - вводится имя файла;
Symbol - имя объекта в проекте, например __DFU_ISP;
Segment - имя сегмента, где располагается код, должен быть CODE;
Align - выравнивание, равно 4.

На этой же закладке указывается точка входа в код:
Entry symbol имеет значение __trampoline

В проект добавляется стартовый код из ASF с небольшой модификацией, файл trampoline_uc3.s82:

Код
#include "trampoline_uc3.h"

  RSEG  SSTACK:DATA:NOROOT(2)

  // This must be linked @ 0x80000000 if it is to be run upon reset.
  RSEG  RESET:CODE:NOROOT(1)

  PUBLIC  __trampoline
__trampoline:

  // Здесь был переход на собственнй код:
  //rjmp    program_start
  //...теперь вставлен код бутлоадера DFU:
  EXTERN  ?__DFU_ISP

  ORG PROGRAM_START_OFFSET
program_start:
  // Initialize the stack pointer.
  lddpc   sp, ??SPS
  // Jump to the C runtime startup routine.
  lddpc   pc, ??cmain

  // Constant data area.
  ALIGN 2

??SPS:
  DC32  SFE(SSTACK) & ~3

  EXTERN  ?main
??cmain:
  DC32  ?main

  END


После данных операций, загрузчик будет шиться вместе с основной программой в процесс отладки, и также будет имплантирован в прошивку программы.

Удачи!
Go to the top of the page
 
+Quote Post
Prof2008
сообщение Jan 20 2014, 04:51
Сообщение #4





Группа: Новичок
Сообщений: 6
Регистрация: 29-07-08
Пользователь №: 39 268



К сожалению, предыдущий пост оказался ошибочный. В реале, линкер вставлял код бинарника совсем не туда куда хотелось, а работало потому что код загрузчика уже был прописан ранее. После полного стирания чипа, разумеется, все перестало работать.
Пришел к другому варианту инжектирования кода бинарника в код проекта, только пришлось использовать дополнительную утилиту конвертирования bin в массив данных asm.


Сам же код trampoline_uc3.s82 выглядит следующим образом:
Код
#include "trampoline_uc3.h"

  RSEG  SSTACK:DATA:NOROOT(2)

  // This must be linked @ 0x80000000 if it is to be run upon reset.
  RSEG  RESET:CODE:NOROOT(1)

  PUBLIC  __trampoline

__trampoline:
  // Здесь был переход на собственнй код:
  //rjmp    program_start
  //...теперь вставлен код бутлоадера DFU:
#include "at32uc3a3-isp.s82"


  ORG PROGRAM_START_OFFSET
program_start:
  // Initialize the stack pointer.
  lddpc   sp, ??SPS
  // Jump to the C runtime startup routine.
  lddpc   pc, ??cmain


// Constant data area.

  ALIGN 2

??SPS:
  DC32  SFE(SSTACK) & ~3

  EXTERN  ?main
??cmain:
  DC32  ?main

  END


где файл at32uc3a3-isp.s82 получен путем конвертирования:
bin2asm.exe at32uc3a3-isp.bin at32uc3a3-isp.s82


В настройках проекта для линкера также указывается точка входа в код:
Entry symbol имеет значение __trampoline

Желаю всем успехов!
Прикрепленные файлы
Прикрепленный файл  bin2asm.7z ( 64.6 килобайт ) Кол-во скачиваний: 38
 
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th April 2024 - 11:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01398 секунд с 7
ELECTRONIX ©2004-2016