Программирование DSP SAFP: Stand-Alone Flash Programmer Wed, October 18 2017  

Поделиться

нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


SAFP: Stand-Alone Flash Programmer Печать
Добавил(а) microsin   

SAFP (Stand-Alone Flash Programmer) - специальная технология VisualDSP++, которая позволяет применять загружаемую в RAM программу (файл *.dxe) в качестве программатора энергонезависимой памяти программ (обычно это FLASH).

SAFP подключается к программируемой системе через JTAG, и управляет целевым процессором таким образом, что он становится программатором, выполняя простые команды хоста PC. Набор команд включает в себя действия стереть сектор или всю память, прочитать сектор, записать сектор, проверить содержимое сектора и т. п. Также существует соответствующее API, которое позволяет на различных языках программирования (в том числе и на VBasic script) писать скрипты, упрощающие программирование чипов в процессе производства (не требуется запускать среду VisualDSP++). В этой статье приведен перевод документации по SAFP (она доступна в справочной системе VisualDSP++, см. Help -> Contents -> Emulation Tools -> Stand-Alone Flash Programmer), а также приведен пример скрипта для программирования процессора Blackfin ADSP-BF538F.

SAFP основан на утилите программирования FLASH (Flash Programmer), встроенной в среду программирования VisualDSP++, поэтому для начала следуют рассмотреть функции и возможности этой утилиты

[Flash Programmer]

Утилита Flash Programmer открывается в среде VisualDSP через меню Tools -> Flash Programmer (если запущена сессия отладчика JTAG), предоставляя удобный графический интерфейс программирования для находящихся в системе устройств памяти flash. Используйте окно диалога Flash Programmer, чтобы посмотреть различную информацию о памяти flash, заполнить всю память (или её часть) повторяющимся значением, стереть память или загрузить в неё данные файла.

Компания Analog Devices поставляет драйверы FLASH (алгоритмы программирования) для множества оценочных плат разработчика (EZ-KIT Lite evaluation systems). Дополнительно Flash Programmer позволит Вам создать свои собственные драйверы flash, или модифицировать существующие драйверы для того, чтобы они подошли к Вашим конкретным программируемым системам (различным комбинациям процессоров и устройств памяти flash).

Микросхемы памяти FLASH (это может быть как отдельная микросхема, так и память, находящаяся в корпусе процессора DSP) это устройства энергонезависимой памяти (non-volatile memory), которые можно читать, программировать (записывать) или стирать. Для большинства применений устройства flash хранят внутри себя:

• Данные загрузки (Boot code), которые процессор загружает в память и затем запускает при включении питания (boot/startup), подробнее см. [1, 2].
• Данные приложения, которые должны сохраняться между отключениями питания системы (настройки).

Обычно программирование устройства flash выполняется на заводе или разработчиком приложения. Когда устройство flash корректно подключено к процессору (DSP), то его можно использовать для программирования устройства flash.

Хотя Flash Programmer используется главным образом для программирования устройств FLASH с параллельной шиной подключения (как например встроенная в кристалл ADSP-BF538F память S29AL008D [3]), его функционал может быть расширен для работы с любыми устройствами памяти, в том числе и микросхемами FLASH с последовательным интерфейсом (serial flash devices), OTP (однократно программируемая память), устройствами FPGA/CPLD и сопроцессорами. Если Вы можете писать код приложения, чтобы оно работало на процессоре Analog Devices и могло записывать, читать и стирать нужное устройство, то сможете использовать технологию Flash Programmer для программирования своих систем.

[Распределение секторов памяти (Sector Map)]

Как известно, память FLASH работает на запись и стирание исключительно блоками памяти, этот блок называется сектор. Отображение адресного пространства процессора на номера секторов памяти FLASH называется картой памяти секторов (sector map).

Sector Map состоит из информации о начальном и конечном адресе для каждого сектора устройства памяти FLASH. Начало одного сектора не то же самое, что конец предыдущего сектора. Например, если один сектор заканчивается на адресе 0x1FFF, то следующий сектор начнется с адреса 0x2000 (не 0x1FFF). Секторы памяти нумеруются начиная с 0, их размер кратен целому числу байт, и размер разных секторов может отличаться. К примеру, вот карта памяти секторов устройства S29AL008D (стоит в корпусе процессора ADSP-BF538F):

№ сектора Начало Конец Размер
0 0x00000000 0x00003FFF 16 кбайт
1 0x00004000 0x00005FFF 8 кбайт
2 0x00006000 0x00007FFF 8 кбайт
3 0x00008000 0x0000FFFF 32 кбайт
4 0x00010000 0x0001FFFF Каждый сектор по 64 кбайт
5 0x00020000 0x0002FFFF
6 0x00030000 0x0003FFFF
7 0x00040000 0x0004FFFF
8 0x00050000 0x0005FFFF
9 0x00060000 0x0006FFFF
10 0x00070000 0x0007FFFF
11 0x00080000 0x0008FFFF
12 0x00090000 0x0009FFFF
13 0x000A0000 0x000AFFFF
14 0x000B0000 0x000BFFFF
15 0x000C0000 0x000CFFFF
16 0x000D0000 0x000DFFFF
17 0x000E0000 0x000EFFFF
18 0x000F0000 0x000FFFFF

Примечание: очень важно, чтобы карта памяти секторов была правильной, потому что она используется для того, чтобы определить, на какие секторы будет влиять запись, и на основе карты секторов определяется размер всей памяти flash (размер flash определяется по конечному адресу последнего сектора). Имейте в виду, что начало памяти FLASH (адрес начала 0 сектора) размещается в памяти программ процессора ADSP-BF538F по абсолютному адресу адресу 0x20000000, и соответственно конец всей памяти FLASH (конечный адрес сектора 18) находится по адресу 0x200FFFFF.

[Как работает Flash Programmer]

Хорошее понимание внутренней работы Flash Programmer поможет Вам отладить свой собственный драйвер flash. Здесь будут рассмотрены следующие темы, касающиеся работы Flash Programmer:

• Загрузка драйвера.
• Выполнение команд хоста PC.
• Программирование flash.
• Сообщения об ошибках Flash Programmer.

Загрузка драйвера. Чтобы использовать Flash Programmer, сначала нужно загрузить его в процессор. Драйвер FLASH (flash driver) это приложение, которое служит интерфейсом с диалогом Flash Programmer и одновременно взаимодействует с программируемым устройством flash. Компания Analog Devices поставляет готовые драйверы flash для определенных оценочных плат разработчика (EZ-KIT Lite evaluation systems) вместе с их исходным кодом (в виде проекта VisualDSP++).

Здесь приведено пошаговое описание, что происходит при загрузке flash programmer driver.

1. Пользователь выбирает и запускает сессию отладчика JTAG, если она не запущена. Процессор останавливается и сбрасывается.
2. Через JTAG загружается и затем запускается приложение flash programmer driver (файл *.dxe).
3. Код окна диалога Flash Programmer проверяет драйвер на наличие в нем требуемых символов (AFP_BreakReady, AFP_Command, AFP_Offset, AFP_Buffer, AFP_Error, AFP_Size, AFP_Count, AFP_Stride и AFP_NumSectors).
4. Удаляются все публичные точки останова (public breakpoints) кроме тех, что используются для printf.
5. Ставится breakpoint на AFP_BreakReady, и процессор останавливается на этой точке программы.
6. Окно Flash Programmer проверяет дополнительные символы драйвера (AFP_Sector, AFP_Verify, AFP_Title, AFP_Description, AFP_DeviceCompany, AFP_BuildDate, AFP_DrvVersion, AFP_ManCode, and AFP_DevCode). Для правильной работы драйвера не требуется ни один из этих дополнительных символов.
7. В памяти должен быть как минимум 1 сектор. Это означает, что AFP_NumSectors должно быть больше или равно 1.
8. Посылается команда для получения кода производителя и кода устройства (или эта информация будет прочитана автоматически, если она уже существует). Она уже существует, если Ваш код вызовет GetCodes() перед входом в главный цикл main.
9. Отправляется команда, чтобы получить начало и смещение сектора или эта информация читается автоматически, если он уже существует. Она уже существует, если Ваш код вызвал GetSectorStartEnd() перед входом главный цикл main.
10. Обновляется карта секторов информацией о смещении начала и конца каждого сектора. Размер микросхемы определяется по смещению конца последнего сектора.

Выполнение команд хоста PC. Когда выполняются команды, flash programmer driver всегда стартует с AFP_BreakReady, и заканчивает обработку команды на той же самой метке. Перед выполнением команды все нужные значения из окна записываются в соответствующие символы драйвера, из затем процессор запускается на выполнение команды.

Например, чтобы выполнить заполнение памяти (fill), происходит следующее:

1. Записываются соответствующие значения из окна диалога в переменные AFP_Offset, AFP_Count, AFP_Stride и AFP_Buffer.
2. Значение переменной AFP_Command устанавливается в "4". Эта команда выполняет заполнение памяти.
3. Запускается программа драйвера, пока она снова не попадет в breakpoint на метке AFP_BreakReady.

Каждая команда выполняется тем же самым способом, но для неё могут быть другие связанные символы. В примерах драйверов, поставляемых вместе с VisualDSP++ (например, для процессора Blackfin ADSP-BF538 это папка VisualDSP 5.0\Blackfin\Examples\ADSP-BF538F EZ-KIT Lite\Flash Programmer\), символы, которые используются с каждой командой это те символы, которые переданы как параметры в функцию main. Если не было передано параметров, то программа установит AFP_Command и запустится.

Программирование flash. Если установлена опция очистки памяти перед программированием (pre-program erase option), то перед программированием flash происходит её очистка. Когда в flash программируется файл, программа записывает только количество байт, которое меньше или равно BUFFER_SIZE.

Если, например, BUFFER_SIZE равно 0x600, и размер файла 0x700, то команда WRITE выдается дважды для записи flash содержимым буфера. На первом проходе программа запишет 0x600 байт. На втором проходе будут записаны 0x100 байт. Отправка команды WRITE (запись) увеличивает время, требуемое для программирования файла в память flash.

Таким образом, если это возможно, делайте максимально большим значение BUFFER_SIZE - например, чтобы оно было не больше доступного размера памяти кучи (heap). Имейте в виду, что размер кучи (heap size) определяется в файле .LDF, который применялся для сборки кода flash programmer driver.

Могут быть следующие ошибки:

Flash is not large enough to fill < x > bytes.

Эта ошибка говорит от том, что смещение, по которому Вы записываете (плюс количество того, что нужно записать) больше, чем смещение окончания последнего сектора. Иногда это происходит из-за изменения в расширенном линейном адресе формата файла Intel HEX [4]. Если наблюдается такая ошибка, и размер записываемого кода меньше, чем размер flash, обратите внимание на функцию GetSectorStartEnd(), чтобы убедиться, что она работает корректно. Когда Вы загружаете драйвер, посмотрите на карту секторов (sector map) в правой части окна Flash Programmer, чтобы проверить, сколько было определено секторов flash, их адреса и размеры (все это определяется с помощью GetSectorStartEnd). Если эта функция выглядит правильной, то возможно проблема заключена в Вашем файле Intel HEX, где применена расширенная адресация (extended linear address), из-за чего происходит перескок за пределы памяти flash.

Polling toggle bit failed.

Проблема может заключаться в функции PollToggleBit(). Во многих случаях Вы можете записать в область, которая не была предварительно стерта (erased). Остерегайтесь возникновения такой ситуации при заполнении памяти (fill), потому что в этом случае пользователь отвечает за то, чтобы перед записью секций памяти эти секции должны быть очищена.

Примечание: память flash устроена таким образом, что стирается она секторами. Обычно записывается flash память тоже в определенный сектор блоком размером в сектор (если конечно аппаратура не позволяет записывать отдельные участки памяти размером меньше размера сектора). В "чистом" секторе памяти flash значения всех байт памяти равны 0xFF.

The driver was not at AFP_BreakReady.

Когда драйвер Flash Programmer загружен, он должен быть приостановлен (halted) на точке останова AFP_BreakReady. Эта точка останова (breakpoint) является начальной и конечной точкой обработки каждой команды драйвера. Если в какой-то момент времени ожидается, что выполнение программы драйвера должно быть на этой контрольной точке, и это не так, то будет выведено это сообщение об ошибке.

Could not allocate storage for the buffer.

Когда выполняется выделение памяти для AFP_Buffer вызовом malloc, и оказалось, что памяти, выделенной под кучу (это задается в файле .LDF драйвера), недостаточно для использования Flash Programmer, то будет сгенерирована эта ошибка. Для примера, если определена куча размером 0x1000 байт, и мы попытались сделать malloc на 0x2000 байт, то произойдет ошибка, и появится это сообщение.

Примечание: если Вы не используете в драйвере кучу для чего-нибудь еще, то можете ускорить программирование файла во flash, если максимально увеличите размер буфера для AFP_Buffer (независимо от того, как эта память выделена - через malloc или статически).

There was a problem with one or more required expression in the driver.

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

Processing custom command failed. Make sure custom command is valid and try again.

Проверьте, что Ваша пользовательская команда обрабатывается в операторе switch функции main.

[Функционал Flash Programmer]

Графический интерфейс диалога Flash Programmer (вызывается через меню Tools -> Flash Programming, если активна сессия отладчика JTAG) используют для следующих целей.

Load: загрузка в любой момент времени алгоритма прошивки flash (драйвера) в процессор.

View: просмотр кода производителя flash, кода устройства и описания микросхемы.

Reset: сброс flash.

Program: программирование устройства flash данными указанного файла.

Fill: заполнение участков памяти flash заданным значением.

Erase: очистка всей памяти flash.

Erase sector(s): очистка сектора (или нескольких секторов) на основе карты секторов (sector map).

Verify: сверка содержимого flash с данными файла.

Send: отправка команд пользователя драйверу, для пакетной обработки неких действий или для определенного поведения, заданного пользователем (который написал драйвер).

Save: сохранение содержимого flash в файл.

Утилита Flash Programmer сохраняет в реестре Windows самые последние используемые значения исходных параметров (имя файла драйвера, имя файла прошивки, начальный адрес, формат файла и другие опции), чтобы применить их при следующем запуске диалога Flash Programmer, и в окно Message center выводится информация о состоянии, в котором сейчас находится утилита.

По идее кнопки OK и Cancel в основном окне GUI Flash Programmer задуманы не просто так: кнопка OK при закрытии окна должна сохранить текущие настройки в реестре, а кнопка Cancel должна просто закрывать окно Flash Programmer без сохранения настроек. Однако из-за ошибки обе эти кнопки действуют совершено одинаково, настройки сохраняются в любом случае.

Примечание: устройство flash, используемое с утилитой Flash Programmer, должно поддерживать определенную функциональность.

Каждый раз, когда код драйвера Flash Programmer приостанавливается, среда IDDE запрашивает обновление содержимого своих окон.

Окно утилиты Flash Programmer предоставляет разделы на закладках (Driver, Programming, Commands и Save), как показано на скриншотах ниже. Правая сторона окна показывает карту секторов (sector map) и область вывода диагностических сообщений (message center).

VisualDSP Flash Programmer Load Driver

VisualDSP Flash Programmer Programming tab

VisualDSP Flash Programmer Command tab

VisualDSP Flash Programmer Save tab

[VisualDSP++ Flash Programmer API]

VisualDSP++ Flash Programmer API было разработано, чтобы предоставить стандартный интерфейс программирования между окном VisualDSP++ Flash Programmer и драйвером flash.

Для использования этого инструментария в процессор загружается сопутствующий драйвер flash. Драйвер это по сути написанная специальным образом программа (исполняемый код, файл *.DXE), который обрабатывает команды, поступающие от окна диалога Flash Programmer, и во время выполнения этих команд драйвер выполняет действительные манипуляции над содержимым памяти flash.

Компания Analog Devices предоставляет примеры таких драйверов, предназначенных для использования на аппаратуре отладочных плат EZ-KIT Lite evaluation systems (также их можно использовать без изменения и на пользовательской аппаратуре, если в ней используются подобные устройства памяти flash, как на платах EZ-KIT Lite).

Пользователи могут написать свои собственные драйверы flash, если это необходимо, путем выполнения следующих спецификаций по организации API. Это позволит Вам реализовать новые алгоритмы, модифицировать уже существующие, или добавить поддержку новых сочетаний устройства памяти и процессора, чтобы их можно было использовать в окне утилиты Flash Programmer обычным образом. Драйверы могут быть реализованы на языке C или ассемблера.

Следующие секции содержат всю необходимую информацию для того, чтобы разработчики могли создать свои собственные драйверы, совместимые с VisualDSP++ Flash Programmer. Рассматриваются необходимые для обязательной реализации функции в драйвере, описания поддерживаемых команд и другая полезная для программистов информация, а также пример драйвера.

Чтобы предоставить полностью стандартный интерфейс flash loader, VisualDSP++ Flash Programmer API использует набор определенным образом именованных символов, связанных с их адресами, и определенным образом пронумерованный набор команд.

Примечание: для получения подробного примера, как собрать загружаемый файл драйвера (bootable loader file) для памяти flash, см. проекты примеров (они часто называются "Power_On_Self_Test"), которые поставляются вместе с VisualDSP++. Эти примеры находятся в папках < корневой каталог инсталляции VisualDSP > \ < семейство процессоров> \ examples \ < тип_процессора_EZ KIT Lite >. См. содержимое файлов *readme.txt, которые находятся в папках проектов примеров.

[Указания для создания/модификации драйвера Flash]

При создании драйвера имейте в виду следующие моменты.

Драйвер это полностью функционирующая программа, а не просто куски кода с процедурами. Рекомендуемая архитектура для этого приложения обычная - выполнение всей работы по начальной инициализации при старте (startup), и затем вход в бесконечный цикл, где происходит ожидание поступления команды для обработки. Драйвер должен отслеживать поступление команд от окна утилиты Flash Programmer, и затем выполнять их, и возвращается к месту в программе AFP_BreakReady, где выполнение будет останавливаться, потому что туда устанавливается breakpoint утилитой Flash Programmer.

Разработчики драйвера должны учитывать ширину шин разных процессоров и устройств памяти flash. Утилита Flash Programmer читает или заполняет буфер данных только по байтам. Разработчик драйвер отвечает за передачу данных в память flash (и получение данных оттуда) определенным образом, учитывающим особенности технологии этой памяти.

Делайте размер AFP_Buffer максимально возможным (в идеале его размер должен быть равен размеру самого большого сектора flash), тогда утилита Flash Programmer сможет за один раз посылать и принимать больше данных, ускоряя тем самым обмен данными между памятью и хостом PC.

Если для драйверов на языке C память под AFP_Buffer выделяется из кучи, то компилятор не создает инициализированный массив, поэтому образ кода самого драйвера получается меньше, и он загрузится быстрее. Для того, чтобы сделать кучу большего размера, может потребоваться модифицировать файл настройки линкера (Linker Description File, файл .LDF).

Утилита Flash Programmer имеет заранее определенный набор команд для использования; однако пользователи могут также определить и свои собственные команды. Эта возможность может оказаться полезной для пакетной обработки каких-либо действий, или для того, чтобы задать некое особенное поведение для каких-либо особых приложений.

Символы. Эти символы (имена переменных и подпрограмм) являются частью исполняемого кода драйвера, который создается в инструментарием VisualDSP++. Эти символы могут запрашиваться утилитой Flash Programmer во время выполнения задач программирования (доступ осуществляется через JTAG-интерфейс отладчика). Чтобы поддерживать это, драйвер должен быть собран с поддержкой символьной информации, и эти символы должны быть определены глобально. Имейте в виду, что имена символов чувствительны к регистру.

Flash Programmer использует следующие символы.

Символ Описание
AFP_BreakReady Эта метка помещается в том месте драйвера, где он находится в готовности к обработке новой команды. В этом месте будет находиться точка останова (breakpoint), которую установит утилита Flash Programmer, чтобы приостановить процессор DSP когда драйвер готов к выполнению новой команды (о событии готовности будет сообщено утилите Flash Programmer).

В драйверах, написанных на языке ассемблер, это должна быть просто метка в коде, которая установлена после инициализации всех элементов данных и перед началом чтения команды. В драйверах на языке C реализация метки более сложная, потому что утилита Flash Programmer может найти только глобально определенные символы. В зависимости от компилятора, метка AFP_BreakReady может не быть доступной глобально, если к ней не было каких-либо реальных ссылок. Поэтому драйверы C должны использовать встраиваемый код ассемблера для гарантии, что метка будет всегда видна на глобальном уровне доступа. Пример соответствующего кода приведен ниже.

while (1)
{
   asm( "AFP_BreakReady: nop;" );
   /* Получение и обработка команды */
   ...
   /* Очистка кода команды */
   AFP_Command = 0;
}
AFP_Buffer Указатель на буфер памяти, используемый для команд чтения/записи. Это означает, что AFP_Buffer будет содержать байтовый адрес первой ячейки памяти в реальном буфере. При получении команды записи (write) или заполнения (fill) памяти, драйвер будет получать данные для записи из этого буфера. Каждая ячейка буфера содержит 1 байт (8 бит). Драйвер отвечает за форматирование данных соответствующим образом для их правильной транспортировки в память flash и из неё. Этот буфер будет заполняться утилитой Flash Programmer перед выдачей драйверу команды записи или заполнения памяти flash.
AFP_BuildDate Указатель на ASCIIZ строку (стандартная C-строка, заканчивающаяся нулем), где содержится последняя дата, когда был собран драйвер.
AFP_Command Код команды для выполнения драйвером. Драйвер должен содержать бесконечный цикл с проверкой переменной AFP_Command на наличие в ней допустимой команды. Если код допустимой команды обнаружен, то должно быть выполнено соответствующее действие. Драйвер также отвечает за очистку переменной AFP_Command после завершения выполнения команды, до того, как управление попадет в точку кода, обозначенную меткой AFP_BreakReady.

Список обязательных для выполнения команд (подробное описание каждой команды см. далее в соответствующей таблице):

0x00 = No action
0x01 = Get manufacturer and device codes
0x02 = Reset flash
0x03 = Write flash
0x04 = Fill flash
0x05 = Erase entire flash
0x06 = Erase sector
0x07 = Read flash
0x08 = Get sector number
0x09 = Get the start and end address of each sector

Компания Analog Devices зарезервировала для себя коды команд от 0x00 до 0x1F. Вы можете задать свои собственные команды, у которых код начинается с 0x20 включительно.
AFP_Count Действительное количество ячеек для использования в командах чтения/записи. При поступлении такой команды драйвер возьмет отсюда значение. Этот счетчик будет установлен утилитой Flash Programmer перед выдачей такой команды драйверу.
AFP_Description Указатель на ASCIIZ строку (стандартная C-строка, заканчивающаяся нулем), где содержится описание устройства памяти flash.
AFP_DevCode Device code. This value will be read by the Flash Programmer only after a "get manufacturer and device codes" command is completed. If "AFP_ManCode" or "AFP_DevCode" are not defined, the Flash Programmer will not issue a "get manufacturer and device codes" command.
AFP_DrvVersion Указатель на ASCIIZ строку (стандартная C-строка, заканчивающаяся нулем), где содержится версия драйвера flash programmer.
AFP_EndOff Здесь содержится смещение конца сектора во flash после выполнения команды GET_SECSTARTEND.
AFP_Error Предоставляет информацию для GUI о любых возможных ошибках, которые могли произойти при выполнении команды.
AFP_FlashCompany Указатель на ASCIIZ строку (стандартная C-строка, заканчивающаяся нулем), где содержится имя компании производителя определенной микросхемы устройства памяти flash.
AFP_FlashWidth Хранит ширину устройства памяти flash, которая используется, когда осуществляется стирание обрабатываемых областей flash. Эти области будут разными, в зависимости от ширины flash.
AFP_ManCode Код производителя (Manufacturer code). Это значение будет прочитано утилитой Flash Programmer только после того, как драйвером будет выполнена команда "get manufacturer and device codes" (получить коды производителя и устройства). ЕслиAFP_ManCode или AFP_DevCode не определены, то утилита Flash Programmer не будет выдавать команду "get manufacturer and device codes".
AFP_NumSectors Количество секторов, которое поддерживает устройство flash. Если flash не разбита на секторы, то опустите этот символ или установите его значение в 0 или 1.
AFP_Offset Смещение от начала памяти flash до места, используемого во время команд чтения/записи. При получении такой команды драйвер возьмет отсюда начальный адрес во flash. Этот адрес будет установлен утилитой Flash Programmer перед тем, как такая команда будет выдана драйверу.
AFP_Sector Информирует драйвер о номере сектора, который будет стерт командой очистки сектора. Это значение будет установлено утилитой Flash Programmer перед тем, как драйверу будет выдана команда "erase sector" (очистить сектор). Для команды получения сектора (get sector) утилита Flash Programmer поместит адрес в переменную AFP_Offset перед выдачей этой команды. Тогда драйвер должен определить, какой сектор (если есть секторы) соответствует этому адресу, и поместить номер этого сектора в переменную AFP_Sector. Этот символ требуется только тогда, если также определен символ AFP_NumSectors.
AFP_SectorInfo Опциональный (не обязательный) параметр, который является простым целочисленным массивом, содержащим начальный и конечный адреса для каждого сектора устройства flash. Если этот массив определен в драйвере, то Flash Programmer GUI может получить указатель на эту структуру, и прочитать информацию о секторах из драйвера flash за один раз. Это увеличит скорость работы драйвера, когда осуществляется работа с устройствами flash, содержащими большое количество секторов. Если этот глобальный массив не определен, то Flash Programmer GUI должна делать вызов GetSectorStartEnd() для каждого сектора устройства flash.
AFP_SectorSize Размер каждого сектора в байтах. Например, если каждый сектор имеет размер 64 килобайт, то установите эту переменную в значение 0x10000. Теперь утилита Flash Programmer будет подразумевать, что у всех секторов одинаковый размер.
AFP_Size Размер AFP_Buffer, размер которого соответствует максимальному количеству ячеек, которое может использовать утилита Flash Programmer для команд чтения/записи. Драйвер должен инициализировать это значение перед тем, как может быть принята любая команда.
AFP_StartOff Содержит начальное смещение сектора во flash после того, как выполнена команда GET_SECSTARTEND.
AFP_Stride Количество ячеек во flash для пропусков между чтениями и записями. При получении команды чтения/записи драйвер возьмет отсюда значение пропуска (stride). Типовое значение для stride "1"; иногда бывает полезно установить другое значение. Этот stride будет установлен утилитой Flash Programmer перед тем, как такая команда будет выдана драйверу.
AFP_Title Указатель на ASCIIZ строку (стандартная C-строка, заканчивающаяся нулем), где содержится имя драйвера или другой имеющий значение заголовок, определенный автором драйвера.
AFP_Verify Информирует драйвер о том, нужно или нет проверять после каждой записи соответствие содержимого записанных данных буферу, откуда взяты данные для этой записи.

Команды. Flash Programmer определяет следующие символы, которые необходимы для реализации безошибочной работы драйвера.

Код Имя команды Описание
0x00 No action Драйверы должны обработку по умолчанию для этой команды для в операторе switch. Т. е. не должно происходить никаких действий.
0x01 Get codes Драйвер должен заполнить AFP_ManCode и AFP_DevCode кодами производителя и устройства соответственно.
0x02 Reset flash Драйвер должен сбросить flash, если она поддерживает такую команду.
0x03 Write flash Драйвер должен записать во flash данные, которые были сохранены в AFP_Buffer. Для выполнения этой команды для драйвера требуются дополнительные параметры: начальный адрес (AFP_Offset), количество (AFP_Count), и шаг пропуска (AFP_Stride).
0x04 Fill flash Драйвер должен заполнить flash данными, которые находятся в начале AFP_Buffer. Дополнительные параметры, требуемые для выполнения драйвером этой команды, включают: начальный адрес (AFP_Offset), количество (AFP_Count) и шаг пропуска (AFP_Stride). Отличие команды Write от команды Fill только в том, что у Write могут быть постоянно изменяющиеся в AFP_Buffer данные, в то время как Fill использует одинаковые данные при выполнении команды.
0x05 Erase all Драйвер должен стереть всю память flash, если она поддерживает эту команду.
0x06 Erase sector Драйвер должен стереть только сектор с указанным номером в AFP_Sector, если память flash поддерживает эту команду.
0x07 Read flash Драйвер должен прочитать содержимое flash и поместить её данные в AFP_Buffer. Для этого драйверу требуются дополнительные параметры: начальный адрес (AFP_Offset), количество (AFP_Count) и шаг пропуска (AFP_Stride).
0x08 Get sector number Если в устройстве flash есть несколько секторов, то драйвер должен поместить в AFP_Sector номер сектора, в котором содержится адрес, указанный в AFP_Offset.
0x09 Get sector start and end Получает адреса начала и конца для каждого сектора устройства памяти flash.
0x0A .. 0x1F Reserved Зарезервировано компанией Analog Devices.
0x20 и выше Custom Опционально утилитой Flash Programmer могут быть посланы другие команды. Если встретилась неизвестная команда, драйвером должна быть предпринята обработка команды по умолчанию (ветка default оператора switch, где не будет никакой обработки, кроме сброса в 0 кода команды). Если драйвером встретилась поддерживаемая команда, то вместо этого должно быть совершено определенное действие, соответствующее коду команды.

Запуск Flash Programmer. В меню Tools выберите Flash Programmer. Этот пункт меню становится доступным только после запуска сессии JTAG-отладки через меню Session -> Select Session.

Выбор сессии отладчика для запуска:

VisualDSP select debugger session

Запуск утилиты Flash Programmer после запуска сессии отладки:

VisualDSP run Flash Programmer

Загрузка драйвера FLASH. Вы можете создать свой драйвер flash, чтобы реализовать новые алгоритмы программирования, модификации существующих, или чтобы добавить поддержку новых комбинаций flash device/processor. После того, как новый драйвер создан, нужно загрузить его в процессор.

Замечание: это нужно сделать как минимум 1 раз, чтобы начать работу с утилитой Flash Programmer.

Замечание для двухядерных процессоров: для своей корректной работы драйвер Flash Programmer должен учитывать специфику ядер, и должен быть загружен в core A. Flash Programmer подразумевает, что Вы корректно установили фокус ядра. Для корректной настройки ядра выберите core A в окне Multiprocessor до того, как открыли окно утилиты Flash Programmer.

Описанная ниже процедура подразумевает, что открыто окно утилиты Flash Programmer. Чтобы загрузить драйвер flash:

1. Если файл драйвера еще не выбран, кликните на закладку Driver.

2. На закладке Driver, в поле ввода "Driver file:" введите полный путь до образа исполняемого файла драйвера (файл *.dxe). Кроме прямого ввода можно воспользоваться кнопкой запуска браузера файла "..." и выбрать нужный файл *.dxe.

3. Кликните на кнопку "Load Driver".

После успешной загрузки драйвера область сообщений Message center отобразит текст: "Success: Driver loaded.".

VisualDSP Flash Programmer Load Driver

Программирование файла в устройство Flash. Вы можете запрограммировать соответствующим образом созданный файл в память устройства памяти flash. Например, Вы можете загрузить выходной файл загрузки, который генерирует соответствующая утилита VisualDSP++ [2].

Замечание: стирание памяти ограничивается заданным вариантом опций (радиокнопки "Pre-program erase options").

Описанная ниже процедура подразумевает, что открыто окно утилиты Flash Programmer, и загружен соответствующий файл драйвера.

1. Кликните на закладку "Programming", если она еще не выбрана.

2. Выберите или проверьте правильность выбора опции "Pre-program erase options". Будут использоваться следующие варианты очистки памяти flash перед каждой операцией её программирования:

Опция Описание
Erase affected Erases only the portion of flash affected by the write.
Erase all Erases all of the flash device's memory.
Erase based on map Erases based on the selections entered in the Flash sector map.
No erase Does not erase flash.

3. Если выбран вариант очистки "Erase based on map", то в области карты секторов поставьте галочки на выбранные для очистки сектора.

4. В области выбора "File format" задайте нужный формат используемого для прошивки файла. Возможны форматы:

• Intel hex [4].
• ASCII (поддерживаются текстовые файлы ASCII, созданные в среде VisualDSP++. Другие файлы ASCII могут работать некорректно).
• Binary (сырой файл данных без определенного формата; этот вариант подходит для образов загрузки с расширением *.ldr).

Замечание: для файлов формата ASCII или Binary требуется указать смещение (поле ввода "Offset:") в шестнадцатеричном формате (с префиксом 0x). Смещение указывает, по какому адресу должны быть помещены записываемые из файла данные.

5. Не обязательное действие: можно выбрать опцию "Verify while programming", это укажет проверять записанные данные после каждой осуществленной записи. Проверка дает гарантию, что записанные в память данные будут совпадать с исходным содержимым записываемого файла.

6. Кликните на кнопку Program.

В процессе программирования и после его завершения в области "Message center" будет отображаться информация о текущем состоянии.

Просмотр информации по устройству памяти Flash. Вы можете узнать данные об устройстве flash, включая код производителя (manufacturer code), код устройства, описание микросхемы (part description) и имя компании производителя.

Эта процедура подразумевает, что открыто окно утилиты Flash Programmer, и файл загружен файл драйвера. После успешно загруженного драйвера на закладке Driver, в области "Flash information" и "Driver information" будет соответственно показана информация о памяти Flash и выбранном загруженном драйвере.

Сохранение содержимого Flash в файл. Вы можете сохранить содержимое памяти flash в файл на хосте PC. Этот файл может быть в формате Intel Hex, ASCII, или Binary.

Имейте в виду, что если сохраняете файл в формате ASCII или Binary, то нужно выбирать следующие друг за другом секторы, без пропусков между ними.

Описанная ниже процедура сохранения подразумевает, что уже открыто окно утилиты Flash Programmer, и загружен файл драйвера.

1. Кликните на закладку Save.

2. В настройках "Save File Options" выберите один из вариантов "Save All" (сохранить всю память) или "Save based on map" (сохранить содержимое памяти на основе выбора в карте секторов). Для второго варианта выбора поставьте галочки для сохранения выбранных секторов. Если кликнуть на кнопке "Select All Sectors", то будут выбраны все сектора памяти, и можно снять галочки на тех секторах, которые сохранять не нужно.

3. В настройках "File Format" выберите один из возможных вариантов Intel Hex, Binary или ASCII.

4. В поле ввода "File name:" введите полный путь до файла и его имя, или можете воспользоваться стандартным диалогом выбора файла и папки (кнопка "...").

5. Кликните Save.

[Отладка драйвера flash]

Для отладки драйвера Flash Programmer используйте следующие методы.

Отладка после выполнения. Один из методов отладки Flash Programmer driver - повторная сборка драйвера (rebuild), и использование этого заново собранного драйвера, когда выполняется команда из окна утилиты Flash Programmer. Затем отлаживайте код драйвера Flash Programmer после завершения обработки команды драйвером.

Процесс отладки:

1. Откройте окно Flash Programmer, и загрузите в нем заново собранный драйвер (закладка Flash -> Driver, укажите в поле пути выбора файла драйвера "Driver File:" нужный драйвер, затем кликните на кнопку "Load Driver").

2. Выполните одну из доступных команд (Fill flash, Erase all, Erase sector, Program, и т. п.).

После выполнения команды все параметры будут установлены, как обычно, кроме переменной AFP_Command, в которой будет значение NO_COMMAND.

3. Откройте в VisualDSP++ окно просмотра памяти (memory window), найдите в нем символ AFP_Command, и поменяйте его на значение, соответствующее той же команде, которая была выполнена в через окно утилиты Flash Programmer.

На самом верху драйвера flash programmer перечислены команды и их значения. Выполните в этом месте Erase all или Erase sector, если тестируете команды, которые записывают значение в память flash. Затем поменяйте AFP_Command на значение, соответствующее той же команде, которая была ранее выполнена в окне Flash Programmer.

Теперь будут установлены все параметры.

4. Делайте пошаговое выполнение кода для отладки команды.

Использование временной переменной. Еще один метод отладки драйвера flash programmer - добавление временной переменной в функцию main. Как это делается:

1. Добавьте переменную в функцию main (с именем temp). Определите её как int, и установите в 0.

2. В операторе switch (AFP_Command) перейдите к ветке case для той команды, которую нужно отлаживать, и вставьте туда оператор проверки if(temp). Ниже приведен пример куска кода для команды заполнения памяти.

case FILL:
   if(temp)
   {
      AFP_Error = FillData(AFP_Offset, AFP_Count, AFP_Stride, AFP_Buffer);
   }
   break;

3. Заново соберите (rebuild) драйвер flash, запустите отладку. Откройте окно проверки выражений (Expressions window) и поменяйте temp на 1, чтобы можно было войти отладчиком в эту функцию.

Достоинство этого метода в том, что команда не выполнится пере тем, как Вы запустите отладку.

Установка значения символов вручную. Можно для отладки принудительно задать значения символов. Как это делается:

1. Загрузите драйвер, поставьте точку останова (breakpoint) на AFP_BreakReady, и запустите код до этой точки останова.

2. Выберите команду, которую хотите отладить, и запишите значения каждого их параметров, которые передаются в функцию, через окно просмотра памяти (memory window) VisualDSP++, или через окно просмотра выражений (Expressions window).

3. После того, как все параметры установлены, запишите подходящую команду в AFP_Command и запустите пошаговую отладку функции.

Убедитесь, что выполнили предварительно очистку памяти (Erase Flash), если отлаживаемый код записывает в неё новые значения.

Также имейте в виду, что окно Flash Programmer может записать данные в AFP_Buffer определенным образом, поэтому удостоверьтесь, что пробуете использовать драйвер flash programmer через окно Flash Programmer, для гарантии Ваших предположений о том, что AFP_Buffer корректно записан.

Отладка с помощью printf. Один из методов отладки драйвера flash programmer - поместить операторы printf в код драйвера для вывода нужных значений.

Начиная с версии VisualDSP++ 4.5 можно использовать этот метод для того, чтобы просмотреть значения переменных в Вашем коде драйвера flash programmer во время их использования (без остановки программы драйвера).

Подробнее про консольную отладку с помощью printf см. [5].

[Особенность SAFP]

SAFP (Stand-Alone Flash Programmer) предоставляет программирование flash между стадией разработки/создания прототипа и ранними выпусками готовой продукции. SAFP использует тот же самый драйвер Flash, что и описанная выше утилита программирования Flash Programmer, входящая в состав среды разработки VisualDSP++.

Для чего нужен SAFP. Из-за сокращения времени разработки и времени, выделенного на выполнение заказа, часто требуется собрать и запрограммировать большое количество плат на ранней стадии разработки и оценки качества. Обычно это объемы готовых изделий размером до сотни штук. Программирования каждого такого образца в среде VisualDSP++ обычно выполняется сборщиком/монтажником, а не инженером разработки. Функционал SAFP позволяет разработчику написать скрипт, чтобы автоматизировать этот процесс с помощью свободного от лицензирования инструментария (т. е. для программирования не требуется запуск среды разработки VisualDSP++), что позволит сборщику просто повторно запускать скрипт, чтобы запрограммировать любое нужное количество устройств.

Цикл разработки скрипта для SAFP. Для того, чтобы воспользоваться функционалом SAFP, требуется выполнить следующие типовые шаги.

1. Если нет в наличии готового драйвера Flash Programmer, описанного выше, то сначала необходимо его создать для используемого устройства flash. Этот шаг необходим, чтобы можно было осуществлять не только стандартные действия в окне утилиты Flash Programmer, но и функционирование скрипта SAFP. Систем процессор/память flash, построенных традиционным образом, скорее всего писать драйвер не понадобится, можно взять готовый, предназначенный для одной из плат EZ-KIT Lite. Свой драйвер можно написать на основе примеров, поставляемых вместе со средой VisualDSP++ (см. выше описание процесса разработки такого драйвера).

2. Требуется наличие файла, который будет записываться в программируемую микросхему flash. Чаще всего это загрузочный образ программы (файл *.ldr) [2], или это может быть файл исполняемого кода, работающего из памяти flash (либо часть программы, так называемый файл splitter [2], или вся программа целиком).

3. Требуется создать файл скрипта на одном из языков программирования (C/C++, VBScript, JScript или Python). Чаще всего удобнее использовать скрипт VBasic, запускаемый в среде операционных систем Windows (файл с расширением *.vbs). В результате получится интерфейс автоматизации, упрощающий процедуру программирования. Сборщику остается только подключить к системе интерфейс JTAG (ICE-100B [6] или другой подобный), подать на программируемую систему питание, запустить скрипт двойным щелчком на файле запуска/ярлыке, и потом просто наблюдать за сообщениями программирования в ожидании завершения процесса (запускать среду разработки VisualDSP не требуется). Таким образом, разработчик может создать скрипт, проверить его, подогнав его под максимальное упрощение и удобство использования сборщиком.

Пример такого скрипта автоматизации на VBscript (*.vbs):

' Принудительно будет использоваться Stand-Alone Flash Programmer:
Const SAFP = 1
 
Const CONFIG_FILE = "путь до каталога установки VisualDSP\BF537_SAFP_config.ini"
Const DRIVER_FILE = "путь до каталога установки VisualDSP\Blackfin\Examples\"
                  + "ADSP-BF537 EZ-Kit Lite\Flash Programmer\\BF537EzFlashDriver.dxe"
Const LDR_FILE    = "путь до каталога установки VisualDSP\Blackfin\Examples\"
                  + "ADSP-BF537 EZ-Kit Lite\Power_On_Self_Test\"
                  + "1000320_AA0188-2004_M29W320DB_U24.ldr"
 
Dim FileFormat
Dim VerifyWhileWriting
Dim EraseOption
Dim StartAddress 
 
FileFormat = 0          ' Формат Intel HEX. Для двоичного формата укажите 1
VerifyWhileWriting = 1  ' Проверка после записи.
EraseOption = 0         ' Стирать только записываемые секторы (erase affected)
StartAddress = 0        ' Для формата Intel HEX этот параметр игнорируется.
                        ' Для двоичного формата тут должно быть указано смещение
                        ' до целевого адреса записи относительно начала (адреса 0).
 
if SAFP Then
   ' Программирование на основе Stand-Alone Flash Programmer.
   ' В этом случае лицензия VisualDSP++ не нужна.
   Set pFlash = CreateObject("VisualDSP.ADspSAFP") 
 
   ' Установка файла конфигурации:
   wscript.Echo "Setting config file..."
   pFlash.ConfigFile = CONFIG_FILE
Else 
   ' Примечание: у меня этот вариант не заработал (выводилось сообщение
   ' "ошибка сервера").
    Set app = CreateObject("VisualDSP.ADspApplication")
    Set plugin = app.PluginList.Item("Flash Programmer")
    Set pFlash = plugin.Open()
End If
 
' Загрузка драйвера:
wscript.Echo "Loading driver..."
pFlash.LoadDriver DRIVER_FILE
 
' Стирание блока:
wscript.Echo "Erasing Block 0..."
pFlash.EraseBlock 0
 
' Загрузка ldr-файла:
wscript.Echo "Load the LDR file..."
pFlash.LoadFile LDR_FILE, FileFormat, VerifyWhileWriting, EraseOption, StartAddress
 
if SAFP = 0 Then
    plugin.Close pFlash
End If 
 
wscript.Echo "Done."

Интерфейс автоматизации SAFP на основе скрипта работает по тому же самому принципу, что используется утилитой Flash Programmer в среде VisualDSP++. Однако несмотря на это, есть 3 главных отличия функционала окна утилиты Flash Programmer и скрипта SAFP:

• У SAFP имеется дополнительное свойство, называемое ConfigFile (см. ниже шаг 4), что должно быть установлено для вызова любых методов, показанных в примере VBScript.
• Использование кода SAFP в сравнении с плагином Flash Programmer незначительно отличается (зависит от предварительной установки значения переменной SAFP).
• Плагин Flash Programmer должен быть закрыт по окончании работы скрипта. Ничего не нужно закрывать при написании скрипта SAFP, поскольку он заботится об этом самостоятельно.

4. Последний шаг для SAFP - создание специального конфигурационного файла *.INI (ConfigFile). В нем предоставляется дополнительная информация, необходимая для идентификации устройства flash и интерфейса JTAG. Эта информация используется при работе SAFP.

Разработчик может создать файл конфигурации с помощью утилиты VisualDSP++ Configurator (см. врезку ниже) на своем компьютере разработки или на компьютере, где будет запускаться скрипт SAFP. Как только файл конфигурации был создан, оба файла - и скрипт SAFP, и файл конфигурации должны быть перенесены на компьютер, где будет работать скрипт при запуске его сборщиком (организация рабочего процесса программирования). После этого пользователь/сборщик может просто запускать скрипт SAFP, чтобы программировать устройства flash.

Замечание: хотя не требуется файл лицензии для использования SAFP, на компьютере, где запускается скрипт SAFP, должна быть полностью установлена система VisualDSP++.

Описание процесса создания конфигурационного файла см. во врезке "ConfigFile. Описание создания конфигурационного файла (*.INI)".

Основные функции SAFP. Stand-Alone Flash Programmer может почти все, что Flash Programmer GUI в среде VisualDSP++ (к сожалению, нельзя получать информацию об устройстве памяти, и довольно плохо описаны свойства объектов API). Ниже во врезках описаны методы, поддерживаемые SAFP.

Общие замечания по методам. Описанные во врезках ниже методы относятся к объектам ADspFlashProgrammer и ADspSAFP.

Если object относится к ADspFlashProgrammer, то в прикладной среде разработки должна быть ссылка на DLL-файл WmFlashProgrammer.dll, который находится в директории System каталога инсталляции VisualDSP++. Таким образом, если Вы используете среду разработки, требующую наличия библиотеки типов (например C++ или .NET), то должны указать на файл WmFlashProgrammer.dll вместо файла Idde.exe. Также имейте в виду, что ссылка на объект должна быть получена из свойства PluginList объекта ADspApplication как это показано в примерах врезки "Демонстрация методов LoadDriver, EraseAll, LoadFile, EraseBlock, FillFlash, CompareFlashWithFile и SendCustom".

Если object относится к ADspSAFP, то он реализован во внешнем DLL-файле WmSAFP.dll, который также в директории System каталога инсталляции VisualDSP++, и соответственно в средах разработки наподобие C++ или .NET, нужно давать ссылку на файл WmSAFP.dll вместо ссылки на Idde.exe.

Примеры использования объектов ADspFlashProgrammer и ADspSAFP и их методов см. во врезке "Демонстрация методов LoadDriver, EraseAll, LoadFile, EraseBlock, FillFlash, CompareFlashWithFile и SendCustom".

Метод загружает драйвер Flash Programmer, который позволяет получить доступ к таким важным методам, как EraseAll, EraseBlock, FillFlash и LoadFile.

Синтаксис

object.LoadDriver( DriverPath )

Параметры

object выражение, которое вычисляется как объект типа ADspFlashProgrammer или ADspSAFP.

DriverPath строка, содержащая имя файла драйвера flash programmer (исполняемый файл DXE), предназначенный для определенного устройства памяти flash и определенной целевой системы (процессора DSP).

Путь до файла драйвера flash programmer зависит не только от используемой микросхемы flash, но также и от целевого процессора DSP, так как по сути драйвер это просто специальная программа для процессора DSP. Например, драйвер flash programmer для микросхемы flash M29W320DB компании STMicroelectronics будет отличаться для целевых плат, на одной из которых стоит процессор ADSP-BF537, а на другой ADSP-21160.

Метод LoadFile относится к объектам ADspFlashProgrammer или ADspSAFP. Метод загружает файл данных (в формате Intel HEX, двоичном или ASCII) в память flash.

Синтаксис

object.LoadFile( FilePath, FileFormat, VerifyWhileWriting, EraseOption, Offset )

Параметры

object выражение, которое относиться к объекту ADspFlashProgrammer или ADspSAFP.

FilePath строка, содержащая путь до файла, загружаемого во flash.

FileFormat перечисляемый тип (enum), который задает формат файла, загружаемого во flash (см. перечисление adspFlashFileFormat).

VerifyWhileWriting двоичное значение, которое задает, нужно или нет проверять записанное во flash при каждой операции Write или Fill.

EraseOption перечисляемый тип, который задает варианты очистки flash перед операциями записи во flash (см. перечисление adspFlashEraseOption).

Offset число типа unsigned long, содержащее смещение во flash с которого начнется запись файла.

Замечания

Поскольку стирание (erase) может осуществляться в плагине, операции EraseAll или EraseBlock не начнутся сами по себе перед вызовом LoadFile (они должны быть вызваны специально, при необходимости).

Позволяет сохранить данные flash в файл формата Intel HEX, ASCII или двоичном (Binary).

Синтаксис

object.SaveFile( FilePath, FileFormat, Offset, Count )

Параметры

object выражение, относящееся к объекту ADspFlashProgrammer или ADspSAFP.

FilePath строка, содержащая путь до сохраняемого файла.

FileFormat перечисляемый тип, который задает формат файла (см. перечисление adspFlashFileFormat).

Offset число unsigned long, содержащее смещение адреса во flash откуда будут браться данные, записываемый в файл.

Count число unsigned long, содержащее количество байт, которое нужно прочитать из flash и записать в файл.

Примеры ниже показывают использование методов SaveFile и LoadDriver.

[C++/ATL]

// test.cpp : определяет точку входа в консольное приложение.
//
// USAGE: передается начальный адрес для записываемого дампа и количество байт,
//        указанные в формате HEX без префикса 0x
//
#include "stdafx.h"
 
#define _SAFP_
 
#ifdef _SAFP_
 #import "C:\Program Files\Analog Devices\VisualDSP 5.0\System\WmSAFP.dll" \
              named_guids no_namespace
#else
 #import "C:\Program Files\Analog Devices\VisualDSP 5.0\System\DeviceProgrammer.dll" \
              named_guids no_namespace
#endif
 
#define Driver _T("C:\\Program Files\\Analog Devices\\VisualDSP 5.0\\Blackfin\\Examples \
                  \\ADSP-BF537 EZ-Kit Lite\\Flash Programmer\\BF537EzFlashDriver.dxe")
#define Ldr    _T("C:\\Program Files\\Analog Devices\\VisualDSP 5.0\\Blackfin\\Examples \
                  \\ADSP-BF537 EZ-Kit Lite\\Power_On_Self_Test\\Sector_0.ldr")
#define Config _T("C:\\Program Files\\Analog Devices\\VisualDSP 5.0\\BF537_SAFP_config.ini")
 
int _tmain(int argc, _TCHAR* argv[])
{
   // Инициализация библиотек COM:
   CoInitialize( NULL );
   USES_CONVERSION;
   _bstr_t bstrDriverPath = Driver;
   _bstr_t bstrLdrFile = Ldr;
   _bstr_t bstrConfigFile = Config;
   long lCount = 0x2000;
 
#ifdef _SAFP_
   IADspSAFPPtr pFlashProg("VisualDSP.ADspSAFP");
   // Установка файла конфигурации:
   pFlashProg->put_ConfigFile(bstrConfigFile);
#else
   IADspApplicationPtr pApp("VisualDSP.ADspApplication");
   IADspPluginPtr pFlashPlugin = pApp->PluginList->GetItem("Flash Programmer");
   IADspFlashProgrammerPtr pFlashProg = pFlashPlugin->Open();
#endif
   // Загрузка драйвера:
   printf("Start: Loading the flash programmer driver...\n");
   HRESULT hr = pFlashProg->LoadDriver(bstrDriverPath.GetBSTR());
   if( hr != S_OK )
   {
      printf("Failed Loading Driver");
      return 1;
   }
   printf("Done: Loading the flash programmer driver...\n\n");
   // Сохранение файла в формате Intel Hex:
   printf("Start: Saving ldr file...\n");
   hr = pFlashProg->SaveFile(bstrLdrFile.GetBSTR(), formatIntelHex, 0x0, lCount );
   if( hr != S_OK )
   {
      printf("Failed Saving Ldr file.");
      return 1;
   }
   printf("Done: Saving Sector 0 to ldr file...\n\n");
 
#ifndef _SAFP_
   pFlashPlugin->Close(pFlashProg);
#endif
   printf("Done.\n");
   return 0;
}

[Visual Basic]

'//////////////////////////////////////////////////////////////////////////////
'//   Основное приложение
'//////////////////////////////////////////////////////////////////////////////
Const SAFP = 1
 
Const CONFIG_FILE = "C:\\Program Files\\Analog Devices\\VisualDSP 5.0\\BF537_SAFP_config.ini"
Const DRIVER_FILE = "C:\\Program Files\\Analog Devices\\VisualDSP 5.0\\Blackfin"
                  + "\\Examples\\ADSP-BF537 EZ-Kit Lite\\Flash Programmer\\BF537EzFlashDriver.dxe"
Const LDR_FILE    = "C:\\Program Files\\Analog Devices\\VisualDSP 5.0\\Blackfin\\Examples"
                  + "\\ADSP-BF537 EZ-Kit Lite\\Power_On_Self_Test\\Sector_0.ldr"
 
Dim FileFormat
Dim StartAddress
Dim Count
 
FileFormat = 0    ' Формат Intel HEX
StartAddress = 0  '
Count = 8192      '
 
if SAFP Then
   Set pFlash = CreateObject("VisualDSP.ADspSAFP")
   ' Установка файла конфигурации:
   wscript.Echo "Setting config file..."
   pFlash.ConfigFile = CONFIG_FILE
Else
   Set app = CreateObject("VisualDSP.ADspApplication")
   Set plugin = app.PluginList.Item("Flash Programmer")
   Set pFlash = plugin.Open()
End If
 
' Загрузка драйвера
wscript.Echo "Loading driver..."
pFlash.LoadDriver DRIVER_FILE
' Сохранение ldr-файла
wscript.Echo "Save the LDR file..."
pFlash.SaveFile LDR_FILE, FileFormat, StartAddress, Count
 
if SAFP = 0 Then
   plugin.Close pFlash
End If
 
wscript.Echo "Done."

[JScript]

//////////////////////////////////////////////////////////////////////////////
// Основное приложение
//////////////////////////////////////////////////////////////////////////////
 
// Определение переменных:
var SAFP = 1;
 
// Установка путей до файла конфигурации, файла драйвера и сохраняемого файла
var ConfigFile = "C:\\Program Files\\Analog Devices\\VisualDSP 5.0\\BF537_SAFP_config.ini";
var DriverFile = "C:\\Program Files\\Analog Devices\\VisualDSP 5.0\\Blackfin\\Examples
                 \\ADSP-BF537 EZ-Kit Lite\\Flash Programmer\\BF537EzFlashDriver.dxe";
var LdrFile    = "C:\\Program Files\\Analog Devices\\VisualDSP 5.0\\Blackfin\\Examples
                 \\ADSP-BF537 EZ-Kit Lite\\Power_On_Self_Test\\Sector_0.ldr";
 
var FileFormat = 0;     // Формат Intel HEX
var StartAddress = 0;   //
var Count = 8192;
 
if( SAFP )
{
   // Получение объекта SAFP
   var pFlash = new ActiveXObject( "VisualDSP.ADspSAFP" );
   // Установка файла конфигурации:
   WScript.Echo("Setting config file...");
   pFlash.ConfigFile = ConfigFile;
}
else
{
   // Получение объекта VDSP
   var app = new ActiveXObject( "VisualDSP.ADspApplication" );
   var plugin = app.PluginList.Item("Flash Programmer");
   var pFlash = plugin.Open();
}
 
// Загрузка драйвера:
WScript.Echo("Loading driver...");
pFlash.LoadDriver(DriverFile);
 
// Сохранение файла LDR:
WScript.Echo("Saving sector 0 to LDR file...");
pFlash.SaveFile(LdrFile, FileFormat, StartAddress, Count);
 
if( !SAFP )
{
   plugin.Close(pFlash);
}
 
WScript.Echo("Done.");

[Python]

import   win32com.client
 
#/////////////////////////////////////////////////////////////////////////////
#// def main()
#/////////////////////////////////////////////////////////////////////////////
if __name__ == '__main__':
 
   SAFP = 1
   
   DriverPath = "C:\\Program Files\\Analog Devices\\VisualDSP 5.0\\Blackfin\\Examples"
              + "\\ADSP-BF537 EZ-Kit Lite\\Flash Programmer\\BF537EzFlashDriver.dxe"
   LdrPath = "C:\\Program Files\\Analog Devices\\VisualDSP 5.0\\Blackfin\\Examples"
           + "\\ADSP-BF537 EZ-Kit Lite\\Power_On_Self_Test\\Sector_0.ldr"
   ConfigFile = "C:\\Program Files\\Analog Devices\\VisualDSP 5.0\\BF537_SAFP_config.ini"
   
   # Параметры для файла:
   FileFormat = 0x0
   Count = 8192
   
   if ( SAFP == 1 ):
      pFlash = win32com.client.Dispatch("VisualDSP.ADspSAFP")
      
      ####
      #    Установка файла конфигурации
      ####
      print 'Setting config File.'
      pFlash.ConfigFile = ConfigFile
   else:
      app = win32com.client.Dispatch("VisualDSP.ADspApplication")
      plugin = app.PluginList.Item("Flash Programmer")
      pFlash = plugin.Open()
      
   ####
   #    Загрузка драйвера flash programmer
   ####
   print 'Loading flash driver.'
   pFlash.LoadDriver( DriverPath )
   
   ####
   #    Сохранение flash в файл
   ####
   print 'Saving sector 0 to file'
   pFlash.SaveFile( LdrPath, FileFormat, 0, Count )
   
   if ( SAFP == 0 ):
      plugin.Close( pFlash )
   print 'Done'

Сравнивает определенный файл с текущим содержимым памяти flash.

Синтаксис

object.CompareFlashWithFile( FilePath, FileFormat, Offset )

Параметры

object выражение, относящееся к объекту ADspFlashProgrammer или ADspSAFP.

FilePath строка BSTR, содержащая путь до файла.

FileFormat перечисляемый тип, который задает формат файла (см. перечисление adspFlashFileFormat).

Offset число unsigned long, содержащее смещение адреса во flash откуда будут браться данные, проверяемые с файлом.

Стирает все содержимое памяти flash.

Синтаксис

object.EraseAll()

Параметры

object выражение, относящееся к объекту ADspFlashProgrammer или ADspSAFP.

Если не нужно очищать всю память, то имеет смысл рассмотреть метод EraseBlock, потому что он выполнится быстрее. Когда используется метод LoadFile, параметр EraseOption (если он соответствующим образом установлен, см. перечисление adspFlashEraseOption) позволяет плагину flash programmer самому позаботиться об очистке нужных секторов.

Позволяет стереть один блок (сектор) во flash.

Синтаксис

object.EraseBlock( Block )

Параметры

object выражение, относящееся к объекту ADspFlashProgrammer или ADspSAFP.

Block переменная типа short, которая задает сектор памяти flash, который будет очищен. Номера секторов начинаются от 0 и продолжаются до n – 1, где n это количество секторов в устройстве flash.

Когда используется метод LoadFile, параметр EraseOption (если он соответствующим образом установлен, см. перечисление adspFlashEraseOption) позволяет плагину flash programmer самому позаботиться об очистке нужных секторов.

Записывает в память flash указанное значение.

Синтаксис

object.FillFlash( Offset, Count, Stride, Value )

Параметры

object выражение, относящееся к объекту ADspFlashProgrammer или ADspSAFP.

Offset число unsigned long, содержащее смещение во flash, откуда начнется заполнение.

Count число типа long, содержащее количество ячеек, которое будет заполнено во flash. Если ширина шины данных flash составляет 8 бит, то Count будет соответствовать количеству записываемых 8-битных значений (количеству байт). Если ширина шины flash 16 бит, то Count будет соответствовать количеству записываемых 16-битных значений (двухбайтных слов).

Stride число типа short, содержащее количество ячеек для пропуска при каждом записываемом значении (шаг адреса при записи). Значение 0 недопустимо, и значение 1 это нормальное используемое значение для Stride (данные в этом случае записываются без пропусков). Значение Stride = 2 приведет к записи значения через одно (с пропуском в 1 ячейку).

Value число типа long, которое содержит значение для записи в память flash. Если ширина flash 8 бит, то будет использоваться только младший байт от Value. Если ширина flash 16 бит, то будет использоваться младшие 2 байта от Value.

Пользователь отвечает за очистку секторов ячеек, которые будут заполняться, это должно быть выполнено перед вызовом FillFlash.

Позволяет пользователю отправить произвольную команду, которая должна быть обработана драйвером flash programmer.

Синтаксис

object.SendCustom ( Command )

Параметры

object выражение, относящееся к объекту ADspFlashProgrammer или ADspSAFP.

Command число типа BYTE, содержащее значение пользовательской команды, которая должна быть выполнена драйвером.

Этот метод относится только к объекту ADspSAFP. Позволяет получить или установить путь до файла конфигурации, который используется для StandAlone Flash Programmer (SAFP).

Синтаксис

object.ConfigFile

Параметры

object выражение, относящееся к объекту ADspSAFP.

ConfigFile это строка, содержащая путь до файла конфигурации. Этот файл создается в утилите конфигурации специально для использования вместе с SAFP. Как это делается, процесс по шагам (подразумевается, в среде VisualDSP создана что платформа/сессия для отладки):

 

1. Откройте в среде VisualDSP++ окно конфигуратора. Для этого в меню Session выберите пункт New Session. В появившемся окне диалога нажмите кнопку "Configurator...".

2. В левой части окна Platform Templates выберите шаблон, соответствующей Вашей платформе. Там имеется список готовых шаблонов, соответствующих различным сочетаниям процессора и отладчика. Если нужной платформы в списке нет, то создайте её нажатием кнопки New...

В области выбора Platforms, кликните на платформу, которая используется для программирования целевой микросхемы flash.

3. Кликните на кнопку Save..., откроется диалог сохранения конфигурационного файла. Выберите имя файла (с расширением .INI) и место его расположения. Для использования конфигурационного файла в скриптах удобнее всего его сохранить в том же каталоге, где находится скрипт.

Примечание: у технологии Stand-Alone Flash Programmer (SAFP) нет концепции, касающейся целевых плат с несколькими процессорами. Таким образом, если на Вашей плате стоит несколько процессоров компании Analog Devices (или даже другого производителя), то следуют поместить все остальные процессора в состояние "bypass". Выполните это путем указания типа процессора "unknown" для всех процессоров кроме того, на котором будет запущен алгоритм драйвера программирования flash.

Пример готового INI-файла SAFP для процессора ADSP-BF538F и JTAG-отладчика ICE-100B [6]:

[Platform]
Name = ADSP-BF538F (1 processor) via ICE-100B
Platform Type = ICE-100B
Description = ADSP-BF538F (1 processor) via ICE-100B
Device ID = 0JTAG TCLK Frequency = 0
 
 
;-- Устройства перечислены в порядке, как они соединены сигналами TDO и TDI --
 
[Device 0]
Name = Device 0
Device Type = ADSP-BF538
IR Width = 5

Используется для указания формата файла, который будет программироваться в устройство flash или прочитан из него.

Возможные значения:

Имя Значение Описание
formatIntelHex 0 Файл в формате Intel Hex [4].
formatBinary 1 Двоичный файл.
formatASCII 2 Файл в формате ASCII, созданный в среде разработки VisualDSP. Другие файлы ASCII могут не работать.

Указывает, что нужно делать в плане очистки с памятью flash при операциях записи в неё.

Возможные значения:

Имя Значение Описание
eraseAffected 0 Стереть только те секторы/блоки, на которые будет влиять запись.
eraseAll 1 Стереть всю память flash.
eraseNone 2 Не делать стирание вообще.

[ADspFlashProgrammer и ADspSAFP]

Объекты Windows ADspFlashProgrammer и ADspSAFP устанавливаются вместе с системой программирования VisualDSP++. Объекты реализованы во внешних файлах DLL (ADspFlashProgrammer в WmFlashProgrammer.dll, ADspSAFP в WmSAFP.dll), которые находятся в директории System инсталляции VisualDSP++, и они не относится напрямую к VisualDSP++ (IDDE). Если Вы используете среду разработки, которая требует библиотеку типов (type library, наподобие C++ или .NET), то должны указать на требуемый файл DLL вместо Idde.exe.

ADspFlashProgrammer и ADspSAFP имеют одинаковый набор методов. Основное отличия между этими объектами:

1. ADspSAFP не требует наличие лицензии VisualDSP.
2. ADspSAFP требует создания файла конфигурации для описания свойств системы и отладчика.
3. Ссылка на объект ADspFlashProgrammer должна быть получена из свойства PluginList объекта ADspApplication, как это показано в примерах ниже.

Объект ADspFlashProgrammer дает доступ к некоторым полезным функциям плагина flash programmer, что позволяет пользователю изменять память flash процессора DSP (или системы, где процессор DSP установлен).

Имейте в виду, что этот объект реализован во внешнем файле DLL WmFlashProgrammer.dll, который находится в директории System инсталляции VisualDSP++, и он не относится напрямую к этой среде разработки (IDDE). Если Вы используете среду разработки, которая требует библиотеку типов (type library, наподобие C++ или .NET), то должны указать на эту библиотеку вместо Idde.exe. Обратите внимание, что ссылка на этот объект должна быть получена из свойства PluginList объекта ADspApplication, как это показано в примерах врезки "Демонстрация методов LoadDriver, EraseAll, LoadFile, EraseBlock, FillFlash, CompareFlashWithFile и SendCustom" (также см. эту врезку для примера использования объекта ADspFlashProgrammer).

Объект ADspSAFP дает доступ к некоторым полезным функциям плагина flash programmer, что позволяет пользователю изменять память flash процессора DSP (или системы, где процессор DSP установлен), причем (в отличие от объекта ADspFlashProgrammer) для этого не требуется лицензия VisualDSP++.

Пример использования см. во врезке "Демонстрация методов LoadDriver, EraseAll, LoadFile, EraseBlock, FillFlash, CompareFlashWithFile и SendCustom".

В примерах ниже показано, как можно записать в память flash значение MAC-адреса для сетевой карты. Также демонстрируются функции загрузки драйвера, стирания памяти, заполнения памяти, проверка записанного содержимого и также отправка драйверу пользовательской команды.

[C++/ATL]

// test.cpp : Здесь определена точка входа в консольное приложение.
//
// USAGE: передайте начальный адрес для дампа и количество байт в формате HEX
//        (без префикса  0x)
//
#include "stdafx.h"
 
#define _SAFP_
 
#ifdef _SAFP_
 #import "C:\Program Files\Analog Devices\VisualDSP 4.5\System\
            WmSAFP.dll" named_guids no_namespace#else
#import "C:\Program Files\Analog Devices\Visualdsp 4.5\System\
           WmFlashProgrammer.dll" named_guids no_namespace
#endif
 
#define Driver _T("C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\Blackfin \
                     \\Examples\\ADSP-BF537 EZ-Kit Lite\\Flash Programmer \
                     \\BF537EzFlashDriver.dxe")
#define Ldr    _T("C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\Blackfin \
                     \\Examples\\ADSP-BF537 EZ-Kit Lite\\Power_On_Self_Test \
                     \\1000320_AA0188-2004_M29W320DB_U24.ldr")
#define Config _T("C:\\Program Files\\Analog Devices\\VisualDSP 4.5 \
                     \\BF537_SAFP_config.ini")
 
int _tmain(int argc, _TCHAR* argv[])
{
   // Инициализация библиотек COM:
   CoInitialize( NULL );
   USES_CONVERSION;
 
   _bstr_t bstrDriverPath = Driver;
   _bstr_t bstrLdrFile = Ldr;
   _bstr_t bstrConfigFile = Config;
   int VerifyWhileWriting = 0x1;
   unsigned long ulBlock66Start = 0x3F0000;
   unsigned short sMAC_Address[3];  // Массив для MAC-адреса
   long lCount = 0x1;
   short sStride = 0x1;
 
   // Назначение MAC-адреса
   sMAC_Address[0] = 0xE000;
   sMAC_Address[1] = 0xFE22;
   sMAC_Address[2] = 0x3412;
 
#ifdef _SAFP_
   IADspSAFPPtr pFlashProg("VisualDSP.ADspSAFP");
   // Установка файла конфигурации:
   pFlashProg->put_ConfigFile(bstrConfigFile);
#else
   IADspApplicationPtr pApp("VisualDSP.ADspApplication");
   IADspPluginPtr pFlashPlugin = pApp->PluginList->GetItem("Flash Programmer");
   IADspFlashProgrammerPtr pFlashProg = pFlashPlugin->Open();
#endif
 
   // Загрузка драйвера:
   printf("Start: Loading the flash programmer driver...\n");
   HRESULT hr = pFlashProg->LoadDriver(bstrDriverPath.GetBSTR());
   if( hr != S_OK )
   {
      printf("Failed Loading Driver");
      return 1;
   }
   printf("Done: Loading the flash programmer driver...\n\n");
 
   // Загрузка файла Intel Hex:
   printf("Start: Loading POST ldr file...\n");
   hr = pFlashProg->LoadFile(bstrLdrFile.GetBSTR(), formatIntelHex,
                             VerifyWhileWriting, eraseAffected, 0x0 );
   if( hr != S_OK )
   {
      printf("Failed Loading Ldr file.");
      return 1;
   }
   printf("Done: Loading POST ldr file...\n\n");
 
   printf("Start: Comparing POST ldr file to the flash contents...\n");
   hr = pFlashProg->CompareFlashWithFile(bstrLdrFile.GetBSTR(), formatIntelHex, 0x0);
   if( hr != S_OK )
   {
      printf("Ldr file did not match the contents of flash.");
      return 1;
   }
   printf("Done: Comparing POST ldr file to the flash contents...\n\n");
 
   try
   {
      // Стирание блока с MAC-адресом:
      printf("Start: Erasing block that contains the MAC address...\n");
      hr = pFlashProg->EraseBlock(70);
      if( hr != S_OK )
      {
         printf("Failed erasing sector.");
         return 1;
      }
      printf("End: Erasing block that contains the MAC address...\n\n");
   }
   catch(...)
   {
      printf("Make sure the sector number is correct and not write protected.\n");
      return -1;
   }
 
   // Запись нашего MAC-адреса:
   printf("Start: Writing MAC address...\n");
   pFlashProg->FillFlash( ulBlock66Start, lCount, sStride, sMAC_Address[0] );
   if( hr != S_OK )
   {
      printf("Failed filling flash.");
      return 1;
   }
   pFlashProg->FillFlash( (ulBlock66Start + 2), lCount, sStride, sMAC_Address[1] );
   if( hr != S_OK )
   {
      printf("Failed filling flash.");
      return 1;
   }
   pFlashProg->FillFlash( (ulBlock66Start + 4), lCount, sStride, sMAC_Address[2] );
   if( hr != S_OK )
   {
      printf("Failed filling flash.");
      return 1;
   }
   printf("End: Writing MAC address...\n");
 
#ifndef _SAFP_
   pFlashPlugin->Close(pFlashProg);
#endif
 
   printf("Done.\n");
   return 0;
}

[JScript]

////////////////////////////////////////////////////////////////////////////////
//   Основное приложение
////////////////////////////////////////////////////////////////////////////////
 
//Определение переменных:
var SAFP = 1;
 
// Установка путей до файла конфигурации, файла драйвера и ldr-файла:
var ConfigFile = "C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\BF537_SAFP_config.ini";
var DriverFile = "C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\Blackfin\\Examples
                 \\ADSP-BF537 EZ-Kit Lite\\Flash Programmer\\BF537EzFlashDriver.dxe";
var LdrFile = "C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\Blackfin\\Examples
              \\ADSP-BF537 EZ-Kit Lite\\Power_On_Self_Test\\1000320_AA0188-2004_M29W320DB_U24.ldr";
 
var FileFormat = 0;           // формат Intel HEX
var VerifyWhileWriting = 1;   // делать проверку
var EraseOption = 0;          // erase affected
var StartAddress = 0;         // для формата Intel HEX этот параметр игнорируется
 
if( SAFP )
{
   // Получение объекта SAFP:
   var pFlash = new ActiveXObject( "VisualDSP.ADspSAFP" );
   // Установка файла конфигурации:
   WScript.Echo("Setting config file...");
   pFlash.ConfigFile = ConfigFile;
}
else
{
   // Получение объекта VDSP:
   var app = new ActiveXObject( "VisualDSP.ADspApplication" );
   var plugin = app.PluginList.Item("Flash Programmer");
   var pFlash = plugin.Open();
}
 
// Загрузка драйвера:
WScript.Echo("Loading driver...");
pFlash.LoadDriver(DriverFile);
 
// Стирание первого блока:
WScript.Echo("Erasing sector 0...");
pFlash.EraseBlock(0);
 
// Загрузка ldr-файла:
WScript.Echo("Loading the LDR file...");
pFlash.LoadFile(LdrFile, FileFormat, VerifyWhileWriting, EraseOption, StartAddress);
 
if( !SAFP )
{
   plugin.Close(pFlash);
}
 
WScript.Echo("Done.");

[Python]

import   win32com.client
 
#/////////////////////////////////////////////////////////////////////////////
#// def main()
#/////////////////////////////////////////////////////////////////////////////
if __name__ == '__main__':
   SAFP = 1
   MacAddressBlock = 66                      # 66 для устройства DB и 70 для EB
   bEraseAll = 0                             # 0 - стереть сектор, 1 - стереть все
   MAC_Address = [ 0xE000, 0xFE22, 0x3412 ]  # значение MAC-адреса
   DriverPath = "C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\Blackfin\\Examples
                \\ADSP-BF537 EZ-Kit Lite\\Flash Programmer\\BF537EzFlashDriver.dxe"
   LdrPath = "C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\Blackfin\\Examples
             \\ADSP-BF537 EZ-Kit Lite\\Power_On_Self_Test\\1000320_AA0188-2004_M29W320DB_U24.ldr"
   ConfigFile = "C:\\Program Files\\Analog Devices\\VisualDSP 4.5\\BF537_SAFP_config.ini"
 
   # Параметры для программирования файла:
   EraseOption = 0x0
   FileFormat = 0x0
   VerifyWhileWriting = 0x1
 
   if ( SAFP == 1 ):
      pFlash = win32com.client.Dispatch("VisualDSP.ADspSAFP")
      ####
      #    Первое, что нужно сделать: установить наш файл конфигурации.
      ####
      print 'Setting config File.'
      pFlash.ConfigFile = ConfigFile
   else:
      app = win32com.client.Dispatch("VisualDSP.ADspApplication")
      plugin = app.PluginList.Item("Flash Programmer")
      pFlash = plugin.Open()
 
   ####
   #    Загрузка драйвера flash programmer
   ####
   print 'Loading flash driver.'
   pFlash.LoadDriver( DriverPath )
   
   ####
   #    Стирание
   ####
   if ( bEraseAll == 1 ):
      print 'Erase all of flash.'
      pFlash.EraseAll()
   else:
      print 'Erase block 0'
      pFlash.EraseBlock( 0 )
 
   ####
   #    Загрузка нашего файла в память flash
   ####
   print 'Loading file to flash'
   pFlash.LoadFile( LdrPath, FileFormat, VerifyWhileWriting, EraseOption, 0 )
 
   ####
   #    Сравнение нашего файла со значениями во flash
   ####
   print 'Comparing file with flash'
   pFlash.CompareFlashWithFile( LdrPath, FileFormat, 0 )
 
   ####
   #    Теперь запрограммируем MAC-адрес
   ####
   print 'Erase sector containing the MAC Address'
   pFlash.EraseBlock( 66 )
   print 'Write our MAC address to flash'
   pFlash.FillFlash( 0x3F0000, 1, 1, MAC_Address[0] )
   pFlash.FillFlash( 0x3F0002, 1, 1, MAC_Address[1] )
   pFlash.FillFlash( 0x3F0004, 1, 1, MAC_Address[2] )
 
   ####
   #    В этом месте отправляется команда сброса.
   #    Это делается для демонстрации отправки команд.
   ####
   print 'Send a custom command'
   pFlash.SendCustom( 2 )
 
   if ( SAFP == 0 ):
      plugin.Close( pFlash )
 
   print 'Done'

Устранение проблем при использовании SAFP. Ниже показано решение типичных проблем, возникающих при использовании SAFP.

Проблема: не могу запустить скрипт VBasic. Скрипт *.vbs запускается двойным кликом, если используется интерпретатор wscript. Как альтернатива для запуска скрипта через wscript может использоваться командная строка:

wscript имяскрипта.vbs

Если нужно использовать интерфейс консоли, то тогда в качестве интерпретатора нужно взять cscript, командная строка будет аналогичная:

cscript имяскрипта.vbs

Для запуска можно настроить ярлык на рабочий стол с указанием в его свойствах этой командной строки. Я обычно использую командный файл (*.bat или *.cmd) с таким же содержанием, и этот командный файл (или ярлык для него) размещаю на Рабочем Столе (Desktop) операционной системы Windows.

Проблема: скрипт запускается, но ничего не происходит. Если для скрипта используется интерпретатор cscript или wscript, то может истечь таймаут скрипта. Подобная проблема: сообщение "Script execution time was exceeded on script X"

Чтобы исправить проблему: найдите wscript.exe (находится в каталоге \WINDOWS\system32 системы Windows XP), и выполните на нем двойной клик. Убедитесь что не выбрана опция "Stop script after specified number of seconds". Другой способ исправить эту проблему: в командной строке (CMD.EXE) выполните команду:

cscript.exe //T:nn name.ext

или

wscript.exe //T:nn name.ext

Здесь nn задает количество секунд, отведенное на работу скрипта, name это основное имя скрипта до расширения, и ext это расширение файла скрипта (такое как js или vbs).

[Ссылки]

1Как происходит загрузка ADSP-BF533 Blackfin.
2Blackfin: утилита elfloader.exe.
3. S29AL008D 8 Mbit (1M x 8-Bit/512 K x 16-Bit), 3V Boot Sector Flash site:cypress.com.
4. Intel HEX: описание формата файла.
5. Blackfin: форматированный вывод в окно терминала через UART.
6. Эмулятор Blackfin ICE-100B.

 

Добавить комментарий


Защитный код
Обновить

Top of Page