Jonathan Westhues написал USB-загрузчик кода (USB bootloader) [1] для ARM-микроконтроллеров Atmel моделей AT91SAM7S64, AT91SAM7S128, AT91SAM7S256, AT91SAM7X128 и AT91SAM7X256. Благодаря наличию исходного кода его можно портировать на AT91SAM7X512 и на другие микроконтроллеры.
Бутлоадер позволяет загружать новый код в память FLASH микроконтроллера через подключение по USB. Код бутлоадера размещается с адреса 0x00000000 микроконтроллера ARM, что обеспечивает его запуск сразу после сброса. В этот момент программа загрузчика ждет несколько секунд попытки подключения от утилиты загрузки (она работает на компьютере). Если коннекта не произошло, то загрузчик отпускает управление и делает безусловный переход на код основной программы (та, которая загружается/переписывается через USB). Если загрузчик получил коннект от утилиты загрузки, то новая программа будет загружена через USB и записана в память FLASH микроконтроллера.
Весь код на стороне ARM написан с использованием инструментария GNU toolchain (arm-elf-gcc). Утилита загрузки, которая работает под управлением Windows, написана для компилятора Microsoft Visual C++ ver. 6.
Для того, чтобы первый раз записать загрузчик в ARM, нужно использовать какой-то другой метод записи. Это можно сделать через JTAG. Прошивка загрузчика (bootrom) создается после компиляции в файле forjtag.s19. Автор загружал его с память RAM микроконтроллера AT91SAM через дешевый Wiggler-совместимый JTAG, работающий через утилиту Macraigor OCD Commander. То же самое можно сделать и через любой JTAG. После этого код запускается в RAM (код стартует через JTAG), и загружает bootrom в память FLASH через USB, используя копию кода загрузчика, которую автор загрузил в RAM.
Atmel предоставляет также свой bootloader, который называется SAM-BA, но возможно это не тот инструмент, который подойдет для записи прошивки загрузчика. SAM-BA захватывает полный контроль над процессором: нет никакого условия в нем, чтобы перейти к отдельному приложению через несколько секунд. Можно было бы использовать загрузчик SAM-BA, чтобы загрузить любую программу в микроконтроллер, но при этом программа должна вытереть SAM-BA (иначе SAM-BA не позволит загрузчику выполнится). Поэтому использовать SAM-BA для загрузки будет довольно неудобно для разработки: для активации SAM-BA необходимо специальным образом управлять выводами микроконтроллера (см. даташит на микроконтроллер касательно загрузчика SAM-BA) всякий раз, когда нужно загрузить новый код. Кроме того драйвер SAM-BA от Atmel иногда приводит к синему экрану смерти на компьютере.
Прим. переводчика: возможно тут автор неправ. Загрузчик SAM-BA мог бы загрузить код другого загрузчика через USB и запустить его специальной командой от хоста, необязательно использовать для этого JTAG.
Описываемый загрузчик был протестирован автором на микроконтроллерах AT91SAM7S64, AT91SAM7S128 и AT91SAM7S256. Прошивку нужно модифицировать и перекомпилировать для xx64, xx128 или xx256, потому что у не у всех этих микроконтроллеров тот же самый размер страницы FLASH. Имейте в виду, что микроконтроллеры серий AT91SAM7X загружаются из ROM (где расположен SAM-BA), не из FLASH. Прошивка bootrom должна быть модифицирована, чтобы изменить это (нужно переключить настроечный бит 2, general-purpose non-volatile memory bit 2).
Прим. переводчика: если доработать загрузчик, чтобы он читал ID микроконтроллера и соответствующим образом корректировал размер используемой страницы FLASH, то можно сделать загрузчик универсальным.
Для сборки прошивки автор рекомендует использовать WinterMute arm-gcc (arm-elf-gcc version 3.4.1, arm-elf-ld version 2.15). Исходный код загрузчика доступен для загрузки [2].
[Ссылки]
1. Atmel AT91SAM ARM USB bootloader site:cq.cx. 2. http://cq.cx/dl/at91sam7sXXX.zip. |