Три простых шага
для запуска Lmux на отладочной плате с процессором Blackfm
Алексей КомАров, к. т. н.
Можно ли сделать серьезный коммерческий проект на платформе В1аскЛп, не приобретая никаких средств разработки? Чтобы дать ответ на этот достаточно актуальный сейчас вопрос, давайте попробуем сравнить те возможности, которые предоставляют бесплатные и коммерческие инструменты разработчика.
Коммерческие программные средства включают бесплатную 90-дневную версию VisualDSP+ + , содержащую исходные коды драйверов всей периферии Blackfin, различные демонстрационные примеры, ядро реального времени VDK и стек TCP/IP. Кроме этого, в разделе www.analog. com/software можно скачать SDK, включающий различные бесплатные и коммерческие кодеки, функции обработки и анализа изображений, видео и многое другое.
С другой стороны, существует бесплатная и открытая среда Linux, портированная на Blackfin. Речь идет о uClinux — операционной системе для встраиваемых приложений без аппаратных средств управления виртуальной памятью. Проект uClinux содержит всю необходимую цепочку средств разработки для Blackfin: от GNU C-компилятора и boot-rom загрузчика до готовых инструментов работы в среде uClinux.
Если коммерческие средства разработки освещены в документации достаточно подробно (в том числе на русском языке), то бесплатные приводят неподготовленного человека в состояние замешательства. Обилие различной информации о средствах компиляции ядра, о драйверах и приложениях для хост-машины и целевой платформы не дает быстро определить те базовые шаги, которые дадут возможность начать работу uClinux. Мы постарались создать простую инструкцию установки uClinux на отладочную плату Blackfin вообще без использования коммерческих средств разработки и аппаратных отладочных средств.
Итак, рассмотрим ситуацию, когда у нас нет ничего кроме отладочной платы Blackfin: нет ни JTAG-эмулятора, ни VDSP + + . В нашем случае это будет одна из самых дешевых плат BF537-STAMP, на которой нет On-Board-Debug-Agent, поэтому подключить ее к VDSP++ нам все равно не удастся.
Шаг 1.
Загрузка платы по последовательному порту
Для того чтобы заставить эту плату работать, нам необходимо каким-то образом загрузить в память код и выполнить его. Тут нам на помощь придет способность процессоров Blackfin загружаться по последовательному порту UART. Итак, для запуска uClinux нам достаточно иметь трехжильный COM-портовый кабель. Для этих целей подойдет практически любой RS-232 кабель с разъемами DB-9, в конце концов, можно спаять или каким-то образом соединить 2-й и 3-й контакты UART с соответствующими пинами разъема COM-порта вашего персонального компьютера (рис. 1).
Кроме того, нам понадобится программное обеспечение, поддерживающее необходимый для загрузки Blackfin протокол передачи. На главной странице проекта blackfin. uclinux.org в разделе GNU Toolchain можно найти полную инструментальную цепочку разработки, в том числе работающую под Windows — blackfin-toolchain-win32-2008R1.5 .exe. Из этого пакета нам пока потребуется только инструмент для загрузки процессора по UART, после установки пакета он будет находиться здесь: Путь установки\GNU Toolchain\2008R1.5\elf\bin\bfin-elf-ldr.exe.
Наконец, тот код, который нам необходимо выполнить на Blackfin, также можно скачать с главной страницы blackfm.udinux.org из раздела Das U-Boot. U-Boot — это загрузчик, стартующий перед запуском uClinux. Он необходим для инициализации памяти и загрузки образа ядра uClinux из внешних источников. В соответствии с нашей платформой и методом загрузки выбираем файл u-boot-bf537-stamp-uart-2008R1.5.ldr.
Для того чтобы выбрать нужный режим загрузки платы BF537-STAMP, как правило, достаточно бывает повернуть переключатель SW16 на плате в режим 7 (BOOT FROM UART HOST), перезагрузить плату и запустить про-
^W)_uarTo^_Tx] _PGl_UARTO RTSi
D-і v-О
о
0
С112 0,1 мкФ 0402
С113 0,1 мкФ 0402
С1+
С1-
V+
С2+ V-
T1IN T10UT
T2IN T20UT
R10UT R1IN
ADM3202ARNZ
SOIC16
R99 10 кОм 0603
SW4: UART Enable Switch
SERIAL PORT (UART 0)
C114 ==0,1 мкФ ^0402
cm
==0,1 мкФ ^0402
JP9
+
±_
IDC2X
UART 0 Loop Jumper
O.
'■o.
'-o.
о
Ю
о
о
SHORTING
JUMPER
DEFAULT=INSTALLED
Рис. 1. Схема подключения порта UART на плате BF537-STAMP
цесс передачи файла bfin-elf-ldr.exe-l u-boot-bf537-stamp-uart-2008R1.5.ldr через COM-порт персонального компьютера:
Перед запуском рекомендуем все-таки проверить положение всех джамперов и переключателей на плате, ведь по умолчанию UART замкнут сам на себя (рис. 1), и для его нормальной работы нужно снять джампер JP9. Иногда выводы UART просто отключены от процессора переключателем SW4 (рис. 1).
Более подробную информацию о переключателях платы BF537-STAMP можно найти в [1].
Шаг 2. Настройка платы для загрузки из встроенной флэш-памяти
После того как нами сделан первый шаг и загрузчик успешно стартовал, с ним можно работать с помощью любой удобной терминальной программы. Проще всего воспользоваться стандартной программой HyperTerminal — C:\Program Files\Windows NT\hypertrm.exe. Настройки параметров порта указаны на рис. 2.
Установив сессию терминального соединения, вы увидите приглашение загрузчика U-Boot, предназначенного для старта ядра uClinux или других приложений. Загрузчик инициализирует SDRAM, умеет обращаться к флэш-памяти, поддерживает передачу файлов по TCP/IP и последовательном порту. Подробное описание команд можно найти в [2].
Для того чтобы заставить нашу плату загружаться непосредственно с флэш-памяти, нужно скопировать туда загрузчик и вернуть переключатель SW16 в положение 1 (BOOT FROM
l'>" ■ 1 fs?EtO
fcuwa**** Js ~EJ
Нот» |n<t zf
Сили** йти |l
llhxTUI ОЫТ1 (ка d
OK I ҐЬкДьД I
Рис. 2. Параметры последовательного соединения
16-BIT FLASH MEMORY). Предварительно очищаем флэш-память командами:
bfin> protect off all bfin> erase all
Версию загрузчика, запускающегося с флэш-памяти, можно скачать с blackfin.uclinux.org, опять же из раздела Das U-Boot. Полученный файл u-boot-bf537-stamp-para-2008R1.5.ldr
загрузим на плату командой loadb. А в Hyper Terminal в меню «Передача» выбираем «Отправить файл» в режиме Kermit (рис. 3).
Если загрузка файла прошла успешно, последует сообщение:
## Total Size = 0x00021362 = 136034 Bytes ## Start Addr = 0x01000000
Затем просто копируем эти 136 034 байта из ОЗУ во флэш-память:
bfin> cp. b 1000000 20000000 21362 Copy to Flash... done
Обратите внимание на суффикс команды копирования «. b», он означает работу с байтовыми данными.
Мы сделали второй шаг, в результате которого наша плата стала уже полноценным устройством, способным загружаться без хост-компьютера. Не будем, однако, забывать, что наша конечная цель — Linux, поэтому, опуская несущественные детали, сразу загрузим ядро uClinux по уже установленному соединению.
Шаг 3. Загрузка ядра uClinux
Подходящий образ ядра можно взять из раздела Linux Kernel сайта blackfin.uclinux.org.
В командной строке загрузчика вводим команду loadb, а в HyperTerminal в меню «Передача» выбираем: отправить файл uImage-bf537-stamp в режиме Kermit.
Рис. 3. Передача файла по последовательному соединению
Процесс передачи файла по последовательному соединению может продлиться довольно долго, поэтому нетерпеливым читателям мы предлагаем попробовать самим настроить TCP/IP-соединение и загрузить образ командой tftpboot. Большинство отладочных устройств Blackfin имеют сетевой интерфейс, и все, что вам понадобится, это сетевой кабель с перекрестным обжатием, правильное положение переключателей на плате, разрешающее работу сетевого интерфейса, а также любой TFTP-сервер для вашего персонального компьютера.
После того как файл образа ядра uClinux так или иначе загружен в ОЗУ отладочного устройства, появится сообщение:
## Total Size = 0x00379f65 = 3645285 Bytes ## Start Addr = 0x01000000
Скопируем 3 645 285 байт, начиная с адреса 0x01000000, в свободную область флэш-памяти. Часть флэш-памяти с адреса 0x20000000 у нас уже занята загрузчиком U-Boot, поэтому в качестве адреса назначения указываем 0x20040000:
bfin> cp. b 1000000 20040000 379f65 Copy to Flash. done
Проверить содержимое флэш-памяти по адресу 0x20040000 можно командой:
bfin> md.b 20040000
20040000: 27 05 19 56 ed ‘..V...EU&o.7.%
20040010: 00 00 10 00 00. /../....
20040020: 75 43 6c 69 6e. uClinux Kernel a
Теперь, убедившись, что там находится содержимое файла образа ядра, настроим автозагрузку ядра иСІіпих, добавим в переменные окружения загрузчика U-Boot команды для автостарта:
Ь£іп> setenv bootcmd ЬооШ 20040000 Ьіїп> saveenv Ьіїп> ргіП:єпу bootcmd bootcmd=bootm 20040000
bfin-elf-ldr.exe -l u-boot-bf537-stamp-uart-2008R1.5.ldr /COM1 Loading LDR D:\u-boot-bf537-stamp-uart-2008R1.5.ldr... OK! Opening /COM1... OK!
Configuring terminal I/O. OK!
Trying to send autobaud... OK!
Trying to read autobaud... OK!
Checking autobaud... OK!
Autobaud result: 115200bps 49.766mhz (header:0xBF DLL:0x1B DLH:0x00 fin:0x00)
Sending blocks of DXE 1. [5/8] (62%).
Теперь каждый раз после перезагрузки U-Boot будет автоматически стартовать и uClinux — посредством команды bootm 2004000 (рис. 4).
Итак, мы успешно завершили все три шага установки uClinux. Обращаем ваше внимание на то, что мы не использовали ни коммерческие средства отладки с JTAG, ни VisualDSP++, а процесс установки на другие отладочные комплекты Blackfin ничем не отличается от данной инструкции. Такой упрощенный вариант может быть использован с целью ознакомления с операционной системой и ее базовыми возможностями. При этом время установки uClinux сопоставимо со временем развертывания VisualDSP++.
В следующих статьях мы постараемся более детально осветить вопросы конфигурирования ядра под ту или иную задачу, а также коснемся вопросов разработки собственных приложений под uClinux. Ш
Литература
1. BF537 STAMP Board Manual — docs.blackfin.uclinux.org/doku.php?id=hw: boards:bf537-stamp
2. U-Boot Documentation — www.denxde/wiki/U-Boot/Documentation
r \П - Hi [tn rrnvwiJ
TCP* cub і г i-Gui^lirrtd
HFT' Rejistered protocol І їчі.v 1
НЕТ- Rcyistertd protocol fiinily 17
rtt If in rte bfin: stltirtfl Ibe syste* clotk to 1370 01 Й1 &£ Л 3:0-5 (ЗТ96Ї
Ггееіпя unused kernel иеийгу: 653Bk Freed
dia.eJlot irti I; dio..paqe Й - 256 &sf*es fit 0x03 FQWe
#8S88b.
srvrvsw S|o| loiSB за
vs.
M 0b
dP . VC
<10;* " : :ft
dC" ’V
:8P 1
ftn : _.i
._/"Yaa_- К
\ VP ' E
/ V_.d
■lave a |o| o-i fun
/ wnlront? 1c Inn ijMimiK di к 1 г i hi 11 ion
W7
,| rp'l LI I > <
V 1 M i\„l /J\\
For eubedd^d processors inclttdiris Ній F'ihpIuli Devices 6!ack.fin
for hirthnr information, check oul; hltp:M>lacl<Fin utJinny оґц/ h[1p://docs.Ь1л rkf і n.uc1i пи к.Orfl/
- h I tn://«и*, неї і rum °г*ї/ hI tp:f/wm.orkilog. con/blackf in
■WW vl 4 1 l?008:fl3-1: IB £6:3? ESI) Built-in shell t«$h) |f nter 'held' tor n list of hin 11-in гонилиск
t-С^нд p«r гр&чта; L ОЯІгУ
Рис. 4. Окно терминала и командная строка uClinux