Jump to content

    
Sign in to follow this  
deadcodder

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

Recommended Posts

Есть существующий рабочий проект (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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this