ЛР11 > Програма початкового завантаження (Bootloader) ЦСП TMS320VC5510
Статьи по теме
Тема: Розробка бутлоадера процесора TMS320VC5510, створення таблиці завантаження та загрузка проекту у флеш пам’ять процесору
1. Особливості роботи програми початкового завантаження (bootloader) процесора TMS320VC5510
Програма bootloader процесора TMS320VC5510 використовується для передачі коду програми (спеціальної завантажувальної таблиці) із зовнішнього повільного енергонезалежного джерела (наприклад, flash-пам’яті) до високошвидкісної внутрішньої пам’яті (RAM) після подачі живлення.
Для використання різних способів завантаження, процесор TMS320VC5510 пропонує декілька режимів роботи bootloader, які наведені у таблиці 1.
Таблиця 1
Режими роботи bootloader процесора TMS320VC5510
Оскільки в якості відлагоджувального засобу використовується стенд TMS320VC5510 DSK, структурна схема якого зображена на рис. 1, то необхідний режим завантаження обирається конфігурацією джамперів JP4, які відповідають за стан зовнішніх сигналів BOOTM[3:0]. Стан джамперу ON відповідає логічному 0, а стан джамперу OFF – логічній 1.
Рис. 1. Структурна схема стенду TMS320VC5510 DSK
В даній роботі в якості зовнішнього енергонезалежного джерела, в якому буде зберігатись програма для bootloader, використовується flash-пам’ять, що розташована на стенді і з’єднана з процесором по 16-розрядній шині через порт EMIF.
Отже, звернувшись до таблиці 1, визначаємо, що даній конфігурації відповідає режим Parallel EMIF boot from 16-bit asychronous memory, якому відповідає стан сигналів BOOTM[3:0] = 1011. Тому джампери JP4 повинні бути сконфігуровані так, як це відображено на рис. 2.
Перед початком роботи обов’язково переконайтесь в цьому. Варто відзначити, що даний режим роботи bootloader для стенду TMS320VC5510 DSK є режимом за замовченням.
Рис. 2. Вибір режиму роботи bootloader “Parallel EMIF boot from 16-bit asychronous memory” для стенду TMS320VC5510 DSK
2. Етапи створення завантажувальної таблиці (boot table)
Для того, щоб створити завантажувальну таблицю, а простіше кажучи, прошивку для 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 0x0800
#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 = 0x1038;
pEmif -> ce1_2 = 0x0038;
pEmif -> ce1_3 = 0x0038;
USER_REG = (unsigned short *)0x300000;
// Clear all LEDs
*USER_REG = 0;
// Blink all 4 DSK leds forever
while (1)
{
// Toggle LED #0
*USER_REG ^= 0x1;
// Delay
for (i = 0; i < BLINK_DELAY_2; i++);
// Toggle LED #2
*USER_REG ^= 0x4;
// Delay
for (i = 0; i < BLINK_DELAY_2; i++);
// Toggle LED #1
*USER_REG ^= 0x2;
// Delay
for (i = 0; i < BLINK_DELAY_2; i++);
//Toggle LED #3
*USER_REG ^= 0x8;
// 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.3.1 і розміщувались у директорії С:\ti\bin\utilities\flashburn\c5500\dsk5510\FBTC5510. Він складається з наступних основних файлів:
-
flash.c – файл, в якому описуються типові функції стирання, запису, очікування завершення поточних операцій, що відбуваються з прив’язкою до flash-пам’яті стенду.
-
FBurnCmd.c – файл проекту, за допомогою функцій якого відбувається встановлення базової адреси та розміру flash-пам’яті, описуються обробники, що виконують наступні операції: очищення, перевірки завершення процесу очищення, вирівнювання даних у пам’яті по довжині слова, запис даних, перевірку контрольної суми прийнятого блоку даних.
-
FBCmd.c – файл, за допомогою якого у прийнятому повідомленні виділяється код команди взаємодії з flash-пам’ятю, а саме: зчитування-записування одиниць та блоків даних, стирання, встановлення початкової адреси та розміру flash-пам’яті.
-
FBTC55.c – основний файл проекту, в якому відбуваються наступні дії:
-
очищення flash-пам’яті;
-
ініціалізація flash-пам’яті (встановлення початкової адреси та розміру у байтах);
-
в постійному циклі виконується обробка та дешифрування кодів команд, які несуть у собі повідомлення.
Завантаживши цей проект до CCS та скомпілювавши його, отримуємо вихідний файл FBTC55.out, який потім і використовуємо для встановлення зв’язку між утилітою FlashBurn та flash-пам’тю стенда.
Подробиці щодо налаштування компілятора та лінкера проекту FBTC55.prj, а також самої утиліти FlashBurn детально будуть розглянуті в наступному розділі.
Більш детальну інформацію по всім вищевказаним пунктам можна отримати з наступних джерел:
1) Code Composer Studio Help – детальний опис основних моментів, які стосуються налаштування та роботи bootloader, утиліт hex55.exe та FlashBurn.
2) FBTC Manual, що розміщується у папці Docum, яка додається до лабораторних робіт.
3) FlashBurn: A DSK Flash Memory Programmer (у папці Docum).
4) TMS320C55x Assembly Language Tools User’s Guide (у папці Docum).
5) TMS320VC5510 DSK Technical Reference (у папці Docum).
6) Using the TMS320VC5510 Bootloader. Application Report (у папці Docum).
3. Для виконання завдання зробіть наступні дії:
І. Створення
програми, яку буде завантажувати bootloader.
1. Виберіть команду Project → New для створення нового файлу проекту та збережіть його з іменем Bootloader у відповідній директорії.
2. Додайте файли Bootloader.c та Bootloader.cmd до проекту, вибравши команду Project → Add Files to Project та вкажіть ці файли з відповідної директорії.
3. Виконайте налаштування компілятора та лінкера мови С. Базові налаштування компілятора дещо відрізняються від тих, що використовувались при виконанні наступних лабораторних робіт. Для цього потрібно, після виконання команди Project → Build Options, вибрати сторінку Compiler в діалоговому вікні та відредагувати опції компілятору наступним чином:
-g -as -fr”.” -ml -v5510:2
-g – опція, що створює символічні директиви налагодження, які використовуються дебагером. Відключає повну оптимізацію для генератора коду, бо вона руйнує процес правильної роботи дебагера.
-fr – опція, що
визначає директорію для зберігання об’єктного файлу. Символи “.” говорять про те, що об’єктний файл буде збережений в папці нашого проекту.
-ml – опція, яка
визначає модель пам’яті large.
-v5510:2 – опція, яка
визначає –v[тип DSP-процесору : модифікація]. Це дозволяє генерувати більш оптимальний код.
-as – опція, що викликає assembler з опцією –s, щоб поставити мітки в таблиці символів COFF для використання дебагера в режимі налаштування по секціям у відповідності до назначених міток (символів). Під символами розуміються директиви .text, .bss, .text, .const і т.д. А розбиття по секціям відображено на рис. 3.
Рис. 3. Розподіл пам’яті відповідно до секцій
Рис. 4. Приклад базових налаштувань компілятора
Більш детальну інформацію щодо налаштування компілятора можна отримати, використавши команду Code Composer Studio Help → Code Generation Tools → Using the C/C++ Compiler → Compiler Description → Compiler Options.
Більш детальну інформацію щодо налаштування лінкера, розподілу пам’яті на секції та призначення директив можна отримати, використавши команду – Code Composer Studio Help → Code Generation Tools → Using the
Linker → MEMORY directive (SECTIONS
Directive та Examples).
Більш детальну інформацію щодо COFF таблиці можна отримати, використавши команду – Code Composer Studio Help → Code Generation Tools → Overview of the Code Generation Tools → Introduction to COFF.
Також можна звернутися до TMS320C55x Assembly Language Tools User’s Guide.
Даний проект вимагає використання бібліотеки rts55x.lib. Для цього потрібно після виконання команди Project → Build Options вибрати сторінку Linker в діалоговому вікні та ввести шлях до бібліотеки засобів динамічної підтримки C:\ti\c5500\cgtools\lib в категорії Library Search Path (-i) і назву файлу
rts55x.lib в категорії Include Libraries, як показано на рис. 5.
Рис. 5. Запис шляху пошуку бібліотеки динамічної підтримки для лінкера
4. Коли всі налаштування зроблені, скомпілюйте програму за допомогою команди Project → Rebuild All. Якщо в програмі немає помилок, то компілятор середовища CCS створить вихідний виконуваний файл Bootloader.out. Перед запуском програми потрібно завантажити виконуваний вихідний файл у процесор. Для цього виконайте команду File → Load Program. Виберіть файл Bootloader.out з папки Debug робочої директорії проекту та відкрийте його.
5. Запустіть програму на виконання вибравши команду Debug → Run (або натиснувши функціональну клавішу F5), щоб переконатись у правильності роботи її алгоритму.
На цьому перший етап завершено. В подальшому для роботи будемо використовувати створений вихідний файл Bootloader.out.
ІІ. Створення завантажувальної таблиці (Boot Table).
1. Закрийте проект за допомогою команди Project →Close та вийдіть із середовища CCS.
2. Скопіюйте у папку з проектом (папка Debug в робочій директорії проекту) утиліту hex55.exe (COFF/Hex Converter V.3.2.2), яка розміщуються в папці C:\CCStudio_v3.1\C5500\cgtools\bin, і допомагає створити завантажувальну таблицю. (Примітка. Версія повинна бути не нижче 2.10, оскільки старі версії можуть підтримувати не всі параметри таблиці. В нашому випадку версія 3.2.2).
3. У текстовому редакторі (Блокнот, 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) –map file_name – генерує map-файл (карту пам’яті).
Примітка.
Для зручності пошуку даного файлу вказуйте повний шлях до папки, в якій він буде зберігатись. Якщо ви вказуєте лише file_name, то map-файл буде збережений у кореневій директорії, в нашому випадку за адресою С:\ file_name.
5) –parallel16 – визначає інтерфейс з flash-пам’ятю (режим завантаження з flash-пам’яті, а також формат завантажувальної таблиці), а саме паралельний 16-розрядний, оскільки flash-пам’ять підключена до процесора через EMIF порт по 16-розрядній шині.
6) –v5510:2 – визначає –v[тип DSP-процесору : модифікація].
7) –о file_name – дозволяє створити вихідний файл з ім’ям file_name (в нашому випадку Boot.hex), який буде безпосередньо завантажуватись у flash-пам’ять (прошивка flash-пам’яті).
Примітка.
Для зручності пошуку даного файлу вказуйте повний шлях до папки, в якій він буде зберігатись. Якщо ви вказуєте лише file_name, то вихідний hex-файл буде збережений у кореневій директорії, в нашому випадку за адресою С:\ file_name.
4. Зберігаємо створений файл з ім’ям Bootloader_hex.cmd у директорії нашого проекту поруч з файлами Bootloader.out та hex55.exe.
5. Переходимо до генерації прошивки для flash-пам’яті. Для цього переходимо до командного рядку Пуск → Выполнить → cmd → OK і вказуємо повний шлях до утиліти 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. У папці C:\CCStudio_v3.1\bin\utilities\flashburn\c5500\dsk5510 розміщується папка FBCT5510. Копіюємо її у директорію з нашим проектом. У ній розміщується проект FBTC55.prj, який необхідно відкрити у середовищі CCS. Потім необхідно виконати команду Project → Build Options, вибрати сторінку Compiler в діалоговому вікні та перевірити опції компілятору, які повинні виглядати наступним чином:
-as -o3 -ml -v5510:2
Даний проект теж вимагає використання бібліотеки rts55x.lib, тому на сторінці Linker в діалоговому вікні необхідно ввести шлях до бібліотеки засобів динамічної підтримки C:\ti\c5500\cgtools\lib в категорії Library Search Path (-i) і назву файлу
rts55x.lib в категорії Include Libraries.
Скомпілюйте проект. При цьому, у папці Debug, отримуємо вихідний файл FBTC55.out.
2. Відкриваємо утиліту для прошивки flash-пам’яті FlashBurn. Вона знаходиться у папці C:\CCStudio_v3.1\bin\utilities\flashburn. У вікні утиліти, що з’явилось, обираємо File → New.
Рис. 9. Вікно налаштування утиліти FlashBurn
У полі File To Burn вказуємо шлях до нашого файлу прошивки Boot.hex.
У полі FBTC Program File вказуємо шлях до файлу FBTC55.out, який ми отримали при компіляції проекту FBTC55.prj.
У полі Flash Physical Addr вказуємо 0х400000.
У полі #Bytes вказуэмо 0х80000.
Інші поля залишаємо без змін. Вигляд вікна налаштувань після усіх внесених змін зображено на рис. 10.
Рис. 10. Вікно налаштувань утиліти FlashBurn після внесених змін
Як видно на рис. 10 підключення до flash-пам’яті не відбулось. Щоб виконати цю процедуру необхідно після заповнення усіх вищевказаних полів зберегти конфігураційний файл у директорії нашого проекту з ім’ям Config.cdd, виконавши команду File → Save As…→ Config.cdd.
Після чого необхідно натиснути Close і повторно відкрити конфігураційний файл Config.cdd, виконавши команду File → Open → Config.cdd. Після цього вікна налаштувань утиліти FlashBurn прийме вигляд, відображений на рис. 11.
Рис. 11. Вікно налаштувань утиліти FlashBurn з повним доступом до flash-пам’яті
Тепер стираємо стару прошивку flash-пам’яті виконавши команду Program → Erase Flash або натиснувши на панелі інструментів кнопку
(Erase Entire Flash).
Після процедури очистки на панелі інструментів натискаємо кнопку
(Start Programming) і завантажуємо у flash-пам’ять власну прошивку (Boot.hex).
Для перевірки правильності роботи завантаженої програми ( у відповідності з розробленим алгоритмом) вимкніть живлення стенду і знову ввімкніть. Bootloader повинен завантажити з flash-пам’яті нову програму.
4. Відновлення старої програми у flash-пам’яті
Ця процедура є практично ідентичною тій, яку ми виконували при створенні власної прошивки, за виключенням того, що в якості hex-файлу будемо використовувати файл FlashBlank55.hex, що знаходиться у папці RECOVERY в директорії нашого проекту.
Відкриваємо утиліту для прошивки flash-пам’яті FlashBurn. У вікні утиліти, що з’явилось, обираємо File → New.
У полі File To Burn вказуємо шлях до нашого файлу прошивки FlashBlank55.hex.
У полі FBTC Program File вказуємо шлях до файлу FBTC55.out, який ми отримали про компіляції проекту FBTC55.prj (Примітка. Використовуємо той самий вихідний файл, що і при створенні власної прошивки).
У полі Flash Physical Addr вказуємо 0х400000.
У полі #Bytes вказуэмо 0х80000.
Інші поля залишаємо без змін.
Для того, щоб відбулось підключення до flash-пам’яті необхідно після заповнення усіх вищевказаних полів зберегти конфігураційний файл у зручній для нас директорії з ім’ям Recovery.cdd, виконавши команду File → Save As…→ Recovery.cdd.
Після чого необхідно натиснути Close. Відкрийте середовище CCS та завантажте проект FBTC55.prj.
Повторно відкрийте конфігураційний файл Recovery.cdd, виконавши команду File → Open → Recovery.cdd.
Тепер стираємо створену нами прошивку flash-пам’яті виконавши команду Program → Erase Flash або натиснувши на панелі інструментів кнопку
(Erase Entire Flash).
Після процедури очистки на панелі інструментів натискаємо кнопку
(Start Programming) і відновлюємо у flash-пам’яті стандартну прошивку (FlashBlank55.hex).
Для перевірки правильності роботи завантаженої програми вимкніть живлення стенду і знову ввімкніть. Bootloader повинен завантажити з flash-пам’яті іншу програму.