Bootloader - FPGA

Bootloader

         1. Особливості bootloader’а DSP-процесора TMS320VC5510        

 

Bootloader DSP-процесора TMS320VC5510 використовується для передачі коду програми (спеціальної завантажувальної таблиці) із зовнішнього повільного енергонезалежного джерела, наприклад, flash-пам’яті у високошвидкісну пам’ять (RAM) одразу після подачі живлення.

Для задоволення різних вимог системи DSP-процесор TMS320VC5510 пропонує декілька режимів роботи bootloader’а, які приведені у таблиці 1.

 

Таблиця 1

Режими роботи bootloader’а DSP-процесор TMS320VC5510

 bootloader

 

         Оскільки в якості відлагоджувального засобу використовується стенд TMS320VC5510 DSK, структурна схема якого зображена на рис. 1, то необхідний режим обирається конфігурацією джамперів роз’єму JP4, які відповідають за біти BOOTM[3:0]. Джампер ON відповідає логічному 0, а джампер OFF – логічній 1.

 

Рис. 1. Структурна схема стенду TMS320VC5510 DSK

 

         В даній роботі в якості зовнішнього енергонезалежного джерела, в якому буде зберігатись програма для bootloader’а, буде використовуватись             flash-пам’ять, що розташована на борту стенда і з’єднана з DSP-процесором по 16-розрядній шині через порт EMIF.

Отже, звернувшись до таблиці 1, визначаємо, що даній конфігурації відповідає режим ParallelEMIFbootfrom 16-bitasychronousmemory, якому відповідає BOOTM[3:0] = 1011. Тому джампери на роз’ємі JP4 повинні бути сконфігуровані так, як це відображено на рис. 2.

Перед початком роботи обов’язково переконайтесь в цьому. Варто відзначити, що даний режим роботи bootloader’а для стенду TMS320VC5510 DSK є режимом по замовчуванню.

 

 

 

Рис. 2. Вибір режиму роботи bootloader’а “ParallelEMIFbootfrom 16-bitasychronousmemory” для стенду TMS320VC5510 DSK

 

2. Етапи створення завантажувальної таблиці (boottable)

 

Для того, щоб створити завантажувальну таблицю, а простіше кажучи, прошивку для flash-пам’яті, необхідно виконати наступні кроки:

1) Створити програму у середовищі ССS, яку буде завантажувати bootloader при ввімкнені живлення, скомпілювати її та отримати вихідний файл file_name.out.

2) За допомогою спеціальної утиліти hex55.exe перевести даний вихідний файл у hex-формат.

3) Використовуючи спеціальну утиліту FlashBurn завантажити отриманий hex-файл до flash-пам’яті.

Створимо програму на мові С, яка керує світлодіодами DS1 – DS4 (0 – 3), що розміщені на борту стенду TMS320VC5510 DSK. Вона виглядає наступним чином:

/*—- External memory interface ——————————————-*/

typedef struct c55xx_emif

{

unsigned short egcr;          /* 00 */

unsigned short rst;             /* 01 */

unsigned short be;             /* 02 */

unsigned short ce0_1;       /* 03 */

unsigned short ce0_2;       /* 04 */

unsigned short ce0_3;       /* 05 */

unsigned short ce1_1;       /* 06 */

unsigned short ce1_2;       /* 07 */

unsigned short ce1_3;       /* 08 */

unsigned short ce2_1;       /* 09 */

unsigned short ce2_2;       /* 0A */

unsigned short ce2_3;       /* 0B */

unsigned short ce3_1;       /* 0C */

unsigned short ce3_2;       /* 0D */

unsigned short ce3_3;       /* 0E */

unsigned short sdc1;         /* 0F */

unsigned short sdper;        /* 10 */

unsigned short sdcnt;       /* 11 */

unsigned short sdinit;       /* 12 */

unsigned short sdc2;        /* 13 */

 

} C55XX_EMIF;

 

typedef ioport volatile C55XX_EMIF * PC55XX_EMIF;

 

#define C55XX_EMIF_ADDR   0×0800

 

#define BLINK_DELAY       100000

 

#define BLINK_DELAY_2     500000

 

/*************************************************************************/

/* MAIN */

/*************************************************************************/

void main()

{

PC55XX_EMIF pEmif = (PC55XX_EMIF)C55XX_EMIF_ADDR;

unsigned short *USER_REG;

volatile unsigned long i, j;

pEmif -> ce1_1 = 0×1038;

pEmif -> ce1_2 = 0×0038;

pEmif -> ce1_3 = 0×0038;

USER_REG = (unsigned short *)0×300000;

 

// Clear all LEDs

*USER_REG = 0;

// Blink all 4 DSK leds forever

while (1)

{

// Toggle LED #0

*USER_REG ^= 0×1;

// Delay

for (i = 0; i < BLINK_DELAY_2; i++);

// Toggle LED #2

*USER_REG ^= 0×4;

// Delay

for (i = 0; i < BLINK_DELAY_2; i++);

// Toggle LED #1

*USER_REG ^= 0×2;

// Delay

for (i = 0; i < BLINK_DELAY_2; i++);

//Toggle LED #3

*USER_REG ^= 0×8;

// Delay

for (i = 0; i < BLINK_DELAY_2; i++);

}

}

 

За алгоритмом вищевказаної програми, світлодіоди у безперервному циклі загоряються і згасають у наступному порядку: 0 → 2 → 1→ 3.

Звернення до світлодіодів відбувається через регістр USER_REG, а саме до його чотирьох молодших бітів USER_REG[3:0] (0 = OFF, 1 = ON).

Усі необхідні налаштування для створення даного проекту, а також кроки по перетворенню вихідного файлу проекту у hex-формат за допомогою утиліти hex55.exeє досить простими і будуть детально описані у наступному розділі, який безпосередньо стосується практичної реалізації.

Варто звернути увагу на третю – завершальну частину завдання, а саме завантаження прошивки до flash-пам’яті за допомогою утиліти FlashBurn.

Справа в тому, що окрім самого файлу прошивки необхідно ще створити FBTC-програму, яка може налаштовуватись користувачем і необхідна для встановлення зв’язку між утилітою FlashBurnта самим стендом (flash-пам’ятю).

У якості FBTC-програми виступає вихідний файл file_name.out, який також отримується при створенні спеціального проекту у середовищі CCS.

Даний проект (FBTC55.prj) був взятий з файлів, що були встановлені разом з середовищем Code Composer Studio v.2.0 і розміщувались у директорії С:\ti\bin\utilities\flashburn\c5500\dsk5510\FBTC55. Він складається з наступних основних файлів:

1)     flash.c – файл, в якому описуються типові функції стирання, запису, очікування завершення поточних операцій, що відбуваються з прив’язкою до flash-пам’яті стенду.

2)     FBurnCmd.c – файл проекту, за допомогою функцій якого відбувається встановлення базової адреси та розміру flash-пам’яті, описуються обробники, що виконують наступні операції: очищення, перевірки завершення процесу очищення, вирівнювання даних у пам’яті по довжині слова, запис даних, перевірку контрольної суми прийнятого блоку даних.

3)     FBCmd.c – файл, за допомогою якого у прийнятому повідомленні виділяється код команди взаємодії з flash-пам’ятю, а саме: зчитування-записування одиниць та блоків даних, стирання, встановлення початкової адреси та розміру flash-пам’яті.

4)     FBTC55.c – основний файл проекту, в якому відбуваються наступні дії:

–       очищення flash-пам’яті;

–       ініціалізація flash-пам’яті (встановлення початкової адреси та розміру у байтах);

–       в постійному циклі виконується обробка й дешифрування кодів команд, які несуть у собі повідомлення.

Завантаживши цей проект до CCS та скомпілювавши його, отримуємо вихідний файл FBTC55.out, який потім і використовуємо для встановлення зв’язку між утилітою FlashBurnта flash-пам’тю стенда.

Подробиці щодо налаштування компілятора та лінкувальника проекту FBTC55.prj, а також самої утиліти FlashBurnдетально будуть розглянуті в наступному розділі.

Більш детальну інформацію по всім вищевказаним пунктам можна отримати:

1)  CodeComposerStudioHelpдетально описані основні моменти, що стосуються налаштування та роботи bootloader’а, утиліт hex55.exe та FlashBurn.

2) FBTCManual, що розміщується у папці BOOT_LOADER, що додається з документацією до проекту.

3) FlashBurn: A DSK Flash Memory Programmer.

4) TMS320C55x Assembly Language Tools User’s Guide.

5) TMS320VC5510 DSKTechnical Reference.

6) Using the TMS320VC5510 Bootloader. Application Report.

 

 

 

3. Практична реалізація проекту

 

         І. Створення програми, яку буде виконувати bootloader.

1. Виберіть команду ProjectNew для створення нового файлу проекту та збережіть його з іменем Bootloaderу відповідній директорії. Оскільки у нас проекти розміщуються у директорії C:\ti, то в подальшому саме цей шлях і буде використовуватись.

2. Скопіюйте у папку з проектом файл Bootloader.c, командний файл лінкера Bootloader.cmd, які розміщуються в папці BOOT_LOADER, що додається з документацією до проекту.

3. Додайте файли Bootloader.cта Bootloader.cmdдо проекту, вибравши команду ProjectAddFilestoProject та вкажіть ці файли у відповідній директорії.

4. Проведіть налаштування компілятора та лінкеру мови С. Базові налаштування компілятора дещо відрізняються від тих, що використовувались при виконанні лабораторних робіт. Для цього потрібно, після виконання команди ProjectBuildOptions, вибрати сторінку Compiler в діалоговому вікні та відредагувати опції компілятору наступним чином:

-g -as -fr”.” -ml -v5510:2

 -gопція, що створює символічні директиви налагодження, які використовуються дебагером. Відключає повну оптимізацію для генератора коду, бо вона руйнує процес правильної роботи дебагера.

-frопція, щовизначає директорію для зберігання об’єктного файлу. Символи “.” говорять про те, що об’єктний файл буде збережений в папці нашого проекту.

-ml – опція, якавизначає модель пам’яті large.

-v5510:2 – опція, якавизначає v[тип DSP-процесору : модифікація]. Це дозволяє генерувати більш оптимальний код.

-as – опція, що викликає збирач (the assembler) з опцією –s, щоб поставити мітки в таблиці символів COFF для використання дебагера в режимі налаштування по секціям у відповідності до назначених міток (символів). Під символами розуміються директиви .text, .bss, .text, .const і т.д. А розбиття по секціям відображено на рис. 3.

 

Рис.3. Розподіл памяті відповідно до секцій

 

 

Рис. 4. Приклад базових налаштувань компілятора

 

         Усю детальною інформацією щодо опцій компілятора можна отримати використавши CodeComposerStudioHelpCodeGenerationToolsOptimizingC/C++ CompilerCompilerDescriptionCompilerOptions.

Усю детальною інформацією щодо лінкера, розподілу пам’яті на секції, призначення директив – CodeComposerStudioHelpCodeGenerationToolsLinkerMEMORY directive (SECTION directive, Example).

Усю детальною інформацією щодо COFF таблиці – CodeComposerStudioHelpCodeGenerationToolsIntroduction to COFF.

Також можна використати TMS320C55x Assembly Language Tools User’s Guide.

Даний проект вимагає використання бібліотеки rts55x.lib. Для цього потрібно після виконання команди ProjectBuildOptionsвибрати сторінку Linker в діалоговому вікні та ввести шлях до бібліотеки засобів динамічної підтримки C:\ti\c5500\cgtools\lib в категорії LibrarySearchPath (-i) і назву файлу rts55x.lib в категорії IncludeLibraries, як показано на рис. 5.

Рис. 5. Запис шляху пошуку бібліотеки динамічної підтримки для лінкера

5. Коли всі налаштування зроблені, скомпілюйте програму за допомогою команди ProjectRebuildAll. Якщо в програмі немає помилок, то компілятор середовища CCS створить вихідний виконуваний файл Bootloader.out. Перед запуском програми потрібно завантажити виконуваний вихідний файл у процесор. Для цього виконайте  команду FileLoadProgram. Виберіть файл Bootloader.out з папки Debugробочої директорії проекту та відкрийте його.

6. Запустіть програму на виконання вибравши команду Debug → Run(або натиснувши функціональну клавішу F5), щоб переконатись у правильності роботи її алгоритму.

На цьому перший етап завершено. В подальшому для роботи будемо використовувати створений вихідний файл Bootloader.out.

ІІ. Створення завантажувальної таблиці (BootTable).

1. Скопіюйте у папку з проектом утиліту hex55.exe (C55x Code Generation Tools V.2.53), яка розміщуються в папці BOOT_LOADER, що додається з документацією до проекту і допомагає створити завантажувальну таблицю. (Примітка. Версія повинна бути не нижче 2.10, оскільки старі версії можуть підтримувати не всі параметри таблиці. В нашому випадку версія 2.53).

2. У текстовому редакторі (Блокнот, Notepad++) створюємо командний файл (з розширенням .cmd), всередині якого вводимо дані (опції), що зображені на рис. 6.

 

 

 

Рис. 6. Вміст командного файлу Bootloader_hex.cmd

 

Призначення вищевказаних опцій наступне:

1) Bootloader.out– вхідний файл (об’єктний СOFF файл), який потрібно перетворити в hex-формат для завантаження у flash-пам’ять (програма, яку буде завантажувати bootloader при ввімкненні стенду).

Примітка.Обов’язково вказуйте повний шлях до вхідного файлу, інакше утиліта hex55.exe не зможе його відшукати.

2) –а – визначає формат у який буде перетворений об’єктний СOFF файл, а саме ASCII-hex.

3) boot – перетворює усі секції пам’яті у завантажувальну форму (у відповідності з директивами SECTION, що зображені на рис. 3).

4) mapfile_name – генерує map-файл (карту пам’яті).

Примітка.Для зручності пошуку даного файлу вказуйте повний шлях до папки, в якій він буде зберігатись. Якщо ви вказуєте лише file_name, то         map-файл буде збережений у кореневій директорії, в нашому випадку за адресою С:\ file_name.

5) parallel16 – визначає інтерфейс з flash-пам’ятю (режим завантаження з flash-пам’яті, а також формат завантажувальної таблиці), а саме паралельний 16-розрядний, оскільки flash-пам’ять підключена до DSP-процесора через один з EMIF портів по 16-розрядній шині.

6) v5510:2 –  визначає v[тип DSP-процесору : модифікація].

7) –о file_name – дозволє створити вихідний файл з ім’ям file_name(в нашому випадку Boot.hex), який буде безпосередньо завантажуватись у flash-пам’ять (прошивка flash-пам’яті).

Примітка.Для зручності пошуку даного файлу вказуйте повний шлях до папки, в якій він буде зберігатись. Якщо ви вказуєте лише file_name, то         вихідний hex-файл буде збережений у кореневій директорії, в нашому випадку за адресою С:\ file_name.

3. Зберігаємо створений файл з ім’ям Bootloader_hex.cmd у директорії нашого проекту поруч з файлами Bootloader.outтаhex55.exe.

4. Переходимо до генерації прошивки для flash-пам’яті. Для цього переходимо до командного рядку Пуск → ВыполнитьcmdOK і вказуємо повний шлях до утиліти hex55.exe, а через пробіл повний шлях до створеного командного файлу. Натискаємо Enter і у директорії проекту отримуємо файл прошивки Boot.hex та карту пам’яті Bootloader.map.

 

 

 

Рис. 7. Генерації прошивки для flash-пам’яті з використанням командного файлу Bootloader_hex.cmd

 

Також перетворити вихідний файл Bootloader.outу hex-формат можливо і без створення командного файлу Bootloader_hex.cmd.

Для цього необхідно в командному рядку вказати повний шлях до утиліти hex55.exe, через пробіл повний шлях до вихідного файлу Bootloader.out (який є вхідним для утиліти hex55.exe), далі через пробіл вказуємо з опцією –о назву вихідного hex-файлу разом з повним шляхом до директорії в якій він буде зберігатись, і далі через пробіл усі необхідні опції, що вводились всередині командного файлу Bootloader_hex.cmd. Натискаємо Enter і отримуємо файл прошивки Boot.hex та карту пам’яті Bootloader.map.

 

Рис. 8. Генерації прошивки для flash-пам’яті без використання командного файлу

 

ІІІ. Завантаження прошивки до flash-пам’яті.

1. У папці BOOT_LOADER, що додається з документацією до проекту, розміщується папка FBCT. Копіюємо її у директорію з нашим проектом. У ній розміщується проект FBTC55.prj, який необхідно відкрити у середовищі CCS та скомпілювати, попередньо виконати команду ProjectBuildOptions, вибрати сторінку Compiler в діалоговому вікні та перевірити опції компілятору, які повинні виглядати наступним чином:

-as -o3 -ml -v5510:2

Даний проект теж вимагає використання бібліотеки rts55x.lib, тому на сторінці Linker в діалоговому вікні необхідно ввести шлях до бібліотеки засобів динамічної підтримки C:\ti\c5500\cgtools\lib в категорії LibrarySearchPath (-i) і назву файлу rts55x.lib в категорії IncludeLibraries.

При цьому у папці  отримуємо вихідний файл FBTC55.out.

2. Відкриваємо утиліту для прошивки flash-пам’яті FlashBurn. У середовищі CCS обираємо ToolsFlashBurn. У вікні утиліти, що з’явилось, обираємо FileNew.

 

Рис. 9. Вікно для налаштування утиліти FlashBurn

 

У полі FileToBurn вказуємо шлях до нашого файлу прошивки Boot.hex.

У полі FBTCProgramFile вказуємо шлях до файлу FBTC55.out, який ми отримали про компіляції проекту FBTC55.prj.

У полі Flash Physical Addr вказуємо 0х400000.

У полі #Bytesвказуэмо 0х80000.

Інші поля залишаємо без змін. Вигляд вікна налаштувань після усіх внесених змін зображено на рис. 10.

 

Рис. 10. Вікно налаштувань утиліти FlashBurn після внесених змін

 

Як видно на рис. 8 підключення до flash-пам’яті не відбулось. Щоб виконати цю процедуру необхідно після заповнення усіх вищевказаних полів зберегти конфігураційний файл у директорії нашого проекту з ім’ям Config.cdd, виконавши команду FileSaveAs…→ Config.cdd.

Після чого необхідно натиснути Closeі повторно відкрити конфігураційний файл Config.cdd, виконавши команду FileOpenConfig.cdd. Після цього вікна налаштувань утиліти FlashBurn прийме вигляд, відображений на рис. 11.

 

Рис. 11. Вікно налаштувань утиліти FlashBurnз повним доступом до flash-пам’яті

 

Тепер стираємо стару прошивку flash-пам’яті виконавши команду ProgramEraseFlashабо натиснувши на панелі інструментів кнопку  (EraseEntireFlash).

Після процедури очистки на панелі інструментів натискаємо кнопку   (StartProgramming) і завантажуємо у flash-пам’ять власну прошивку (Boot.hex).

Для перевірки правильності роботи прошивки згідно вашого алгоритму вимкніть живлення стенду і знову ввімкніть. Bootloader миттєво завантажить з flash-пам’яті програму і ви зможете побачити результат її роботи.

4. Відновлення старої прошивки flash-памяті

 

Ця процедура є практично ідентичною тій, яку ми виконували при створенні власної прошивки за виключенням того, що в якості hex-файлу будемо використовувати файл FlashBlank55.hex, що знаходиться у папці RECOVERYв директорії BOOT_LOADER, що додається разом з проектом.

Відкриваємо утиліту для прошивки flash-пам’яті FlashBurn. У середовищі CCS обираємо ToolsFlashBurn. У вікні утиліти, що з’явилось, обираємо FileNew.

У полі FileToBurn вказуємо шлях до нашого файлу прошивки FlashBlank55.hex.

У полі FBTCProgramFile вказуємо шлях до файлу FBTC55.out, який ми отримали про компіляції проекту FBTC55.prj (Примітка. Використовуємо той самий вихідний файл, що і при створенні власної прошивки).

У полі Flash Physical Addr вказуємо 0х400000.

У полі #Bytesвказуэмо 0х80000.

Інші поля залишаємо без змін.

Для того, щоб відбулось підключення до flash-пам’яті необхідно після заповнення усіх вищевказаних полів зберегти конфігураційний файл у зручній для нас директорії з ім’ям Recovery.cdd, виконавши команду FileSaveAs…→ Recovery.cdd.

Після чого необхідно натиснути Closeі повторно відкрити конфігураційний файл Recovery.cdd, виконавши команду FileOpenRecovery.cdd.

Тепер стираємо створену нами прошивку flash-пам’яті виконавши команду ProgramEraseFlashабо натиснувши на панелі інструментів кнопку  (EraseEntireFlash).

Після процедури очистки на панелі інструментів натискаємо кнопку   (StartProgramming) і відновлюємо у flash-пам’ять стандартну прошивку (FlashBlank55.hex).

Для перевірки правильності роботи прошивки вимкніть живлення стенду і знову ввімкніть. Bootloader миттєво завантажить з flash-пам’яті програму і ви зможете побачити результат її роботи.

 

5. Завдання для самостійної роботи

 

1) Змініть порядок та швидкість загоряння та згасання світлодіодів.

2) Доопрацюйте програму таким чином, щоб світлодіоди працювали в декількох режимах з можливістю переключення між режимами за допомогою DIP-перемикача, звернення до якого відбувається також через регістр USER_REG, а саме до його чотирьох старших бітів USER_REG[7:4] (1 = OFF,    0 = ON). Дані біти доступні лише для читання.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

СПИСОК ВИКОРИСТАНИХ ДЖЕРЕЛ

 

1.  Code Composer Studio Help.

2. Texas Instruments Incorporated. TMS320C55x Assembly Language Tools User’s Guide (SPRU280H). July 2004.

3. Texas Instruments Incorporated. Using the TMS320VC5510 Bootloader. Application Report (SPRA763C). September 2005.

4. Spectrum Digital Incorporated. TMS320VC5510 DSK Technical Reference. October 2002.

5. Texas Instruments Incorporated. FlashBurn: A DSK Flash Memory Programmer (SPRA804). October 2001.

6. Russ Heeschen. FBTC Programmer’s Reference Manual.

 

 

 

 

 

 

  翻译: