Jump to content

    

Как добавить DFU загрузчик в существующий проект?

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

Подскажите, как прикрутить DFU загрузчик. Проблема, насколько я понимаю, избитая, но тем не менее не нашел решения.

Прошиваю руками загрузчик - он работает, шьет (из AVR32 Studio) и благополучно затирается.

 

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

 

Для полноты - asf v2.8.1, AVR32 Studio Core Version: 2.6.0.201009140840.

Заранее благодарен.

Share this post


Link to post
Share on other sites

Не видел, что тема "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

 

Share this post


Link to post
Share on other sites

Поделюсь своим опытом добавления кода 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

 

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

 

Удачи!

Share this post


Link to post
Share on other sites

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

Пришел к другому варианту инжектирования кода бинарника в код проекта, только пришлось использовать дополнительную утилиту конвертирования 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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this