13 Linux File System – Файловая система

advertisement
Инсталляция OS Linux на аппаратную
платформу AT91RM9200_SK
(Используя макетную плату на базе процессора – AT91RM9200)
Инженер-электроник: С. Г. Приходько
Харьков
2007
2007г.
Инженер-электроник: Станислав Г. Приходько
–2–
Содержание
1 СПИСОК ИСПОЛЬЗУЕМЫХ ТЕРМИНОВ, СОКРАЩЕНИЙ.
6
2 ИСПОЛЬЗУЕМЫЙ СТИЛЬ
7
3 СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ.
8
4 ОПИСАНИЕ ПРОЦЕССОРА AT91RM9200
9
4.1 Микроконтроллер на основе процессора ARM920T ™
9
4.2 Структурная схема микроконтроллера AT91RM9200:
12
4.3 Общее описание:
12
5 СТРУКТУРНАЯ СХЕМА РАЗРАБАТЫВАЕМОЙ АППАРАТНОЙ ПЛАТФОРМЫ
5.1 структурная схема.
6 НЕОБХОДИМЫЙ ПЕРЕЧЕНЬ ПО
6.1 Используемое ПО в процессе компиляции
15
15
16
16
6.1.1 Базовое ПО
16
6.1.2 Toolchain-1
16
6.1.3 Toolchain-2
16
6.1.4 Ядро (linux kernel):
16
6.2 Конфигурация ПО для AT91RM9200_SK
17
6.3 Установка и настройка tftpd
18
6.3.1 Сборка TFTP:
7 НАСТРОЙКА ПЕРИФЕРИИ
7.1 Тактовая частота процессора и памяти.
8 ROMBOOT
18
19
19
23
8.1 Назначение
23
8.2 Выполняемые действия программой
23
2007г. Инженер-электроник: Станислав Г. Приходько
–3–
8.3 Возможности
23
8.4 Подготовка к сборке Romboot
23
8.5 main.cpp: правка времени ожидания
24
8.6 Тактовая частота, SDRAM -память
24
8.6.1 main.h: правка тактовой частоты процессора
25
8.6.2 init.cpp: правка типа и тактовой частоты и частоты памяти
25
8.7 SPI DataFlash-память
28
8.7.1 dataflash.cpp: конфигурация количества микросхем Flash-памяти
28
8.7.2 dataflash.h: конфигурация количества микросхем Flash-памяти
28
8.7.3 dataflash.cpp: инициализация
29
8.7.4 at45.cpp - конфигурация количества микросхем Flash-памяти
29
8.8 Компиляция программы Romboot
31
8.9 Программирование SPI Dataflash.
31
9 U-BOOT
35
9.1 Назначение
35
9.2 Возможности
35
9.2.1 u-boot-1.1.1/board/RM9200/RM9200.c – номер архитектуры
35
9.3 u-boot-1.1.1/include/configs/RM9200.h – файл конфигурации платы
36
9.4 Дополнительная SPI DataFlash
48
9.4.1 u-boot-1.1.1/cpu/at91rm9200/at45.c – драйвер DataFlash памяти AT45DBxxx
9.5 Драйвер Ethernet - LXT972
48
49
9.5.1 u-boot-1.1.1/include/lxt971a.h
50
9.5.2 u-boot-1.1.1/include/at91rm9200_net.h – подключение header-драйвера
50
9.5.3 u-boot-1.1.1/board/RM9200/at91rm9200_ether.c (ET_ENABLE)
51
9.5.4 u-boot-1.1.1/board/RM9200/at91rm9200_ether.c – добавление драйвера LXT972
52
9.5.5 u-boot-1.1.1/include/configs/RM9200.h - набор сетевых команд
58
9.6 Компиляция u-boot-1.1.1
59
9.6.1 Перечень программ и утилит для сборки u -boot-1.1.1
59
9.6.2 Содержимое файла readme.u-boot.patches
60
9.7 Вычисление смещения карты памяти.
62
9.8 Правка Makefile
63
9.9 Сборка u-boot-1.1.1
63
2007г. Инженер-электроник: Станислав Г. Приходько
–4–
9.10 Запись u boot 1.1.1 в DataFlash из Romboot
64
9.11 Работа с u-boot-1.1.1 из DataFlash или RAM
64
10 LINUX KERNEL – ЯДРО OS LINUX
66
10.1 Переменные окружения для сборки ядра
66
10.2 Конфигурации ядра
67
10.3 Подготовка к компиляции
67
10.4 Конфигурация
70
10.5 Редактирование исходного текста
71
10.5.1 Подключение конструктивного исполнения контроллер а
71
10.5.2 Подключение светодиода
72
10.5.3 Подключение Ethernet контроллера
73
10.5.4 Подключение Dataflash
74
10.6 Компиляция ядра
75
10.7 Конечная сборка ядра и инсталляция
76
10.8 Скрипт для сборки сжатых образов
77
10.9 Результат сборки образов из скрипта
78
11 LINUX USB FILE SYSTEM – USB ФАЙЛОВАЯ СИСТЕМА
79
12 LINUX USB FILE SYSTEM – MMC ФАЙЛОВАЯ СИСТЕМА
80
12.1 Создание файла устройства
13 LINUX FILE SYSTEM – ФАЙЛОВАЯ СИСТЕМА
13.1 Использование корректно пре-собранной файловой системы.
80
81
81
14 MTD LINUX FILE SYSTEM - ФАЙЛОВАЯ СИСТЕМА НА DATAFLASH
82
15 LINUX CONFIGURATION – КОНФИГУРАЦИЯ ДИСТРИБУТИВА
83
15.1 Установка и настройка платы AT91RM9200_SK
16 LINUX TUNE – НАСТРОЙКА ПОД КОНЕЧНУЮ ЦЕЛЬ
16.1
83
85
85
2007г. Инженер-электроник: Станислав Г. Приходько
–5–
2007г. Инженер-электроник: Станислав Г. Приходько
–6–
1 Список используемых терминов, сокращений.
Toolchain
Кросс-платформенная система сборки и компиляции,
набор утилит для сборки.
Datasheet
Техническое описание
ПО
Программное обеспечение
Patch
Программа исправлений, файл с исправлениями;
Скрипт
Программа, выполняющая последовательность действий;
Dataflash
Последовательная (SPI) энергонезависимая память
GCC
GNU project C and C++ compiler
tar
The GNU version of the tar archiving utility
UNIX, Linux
Операционная система
Дистрибутив ядра с файловой системой
2007г. Инженер-электроник: Станислав Г. Приходько
–7–
2 Используемый стиль
Вид в документе Пояснение, назначение
RTFM
– Сокращения, выделение, специфика названия;
http://www.ru/
– ссылка;
пример
– Приводимый пример, заметки, пояснения;
сноска
– сноска, заметка
программ/пакетов – или ( программ или пакетов )
Описываются в документе UNIX-shell команды. При написании
использоваться могут разные стили.
Например: команда bash# ps равносильно # ps или ps
Если команда имеет схожее с пакетом имя, то пакет выделяется
жирным шрифтом.
Например: top(команда) и top(пакет).
2007г. Инженер-электроник: Станислав Г. Приходько
–8–
3 Список используемой литературы.
Техническое описание контроллера AT91RM9200 (Datasheet):
http://www.atmel.com/dyn/resources/prod_documents/doc1768.pdf
Описание:
http://heavy-online.ru/arm-linux/
http://www.kikynote.com/Work/armlinux/Boot%20ARM%20Linux%20On%2
0KTARM9200.htm
http://frank.harvard.edu/~coldwell/
http://frank.harvard.edu/~coldwell/toolchain/
ftp://81.80.104.162/AT91_Third_Party_Design_Flow/Linux_Host/Buildroot/
2007г. Инженер-электроник: Станислав Г. Приходько
–9–
4 Описание процессора AT91RM9200
4.1 Микроконтроллер на основе процессора ARM920T ™
Отличительные особенности:
o Включает в себя процессор ARM920T ™ ARM ® Thumb ®
o Производительность 200 млн. опер. в сек. при 180 MГц
o 16-кбайт кэш-памяти данных, 16 кбайт кэш-памяти инструкций,
буфер записи
o Блок управления памятью
o Среднеуровневая реализация встроенной макроячейки трассировки
(только в 256-выводном BGA корпусе)
o Дополнительная встроенная память
o 16 кбайт статического ОЗУ и 128 кбайт ПЗУ
o Интерфейс внешней шины (EBI)
o Поддержка синхронных динамических ОЗУ (SDRAM), статической
памяти, флэш-памяти с пакетным режимом передачи, соединение с
устройствами памяти CompactFlash ® , SmartMedia ™ и NAND
Flash
o Периферийные устройства :
o Расширенный генератор импульсов и контроллер управления
энергопотреблением
o Два встроенных генератора с фазовой автоподстройкой частоты
o Режим
пониженной
частоты
синхронизации
и
возможность
программной оптимизации энергопотребления
o Четыре программируемых сигналов внешних синхроимпульсов
o Системный таймер, обеспечивающий генерацию периодических
прерываний, функцию охранного таймера и вторичного счетчика
o Часы реального времени с функцией будильника и генерацией
запроса на прерывание при его срабатывании
o Блок
отладки,
2-проводное
устройство
асинхронной
приемопередачи (УАПП) и поддержка канала связи для отладки
2007г. Инженер-электроник: Станислав Г. Приходько
– 10 –
o Развитый контроллер прерываний с 8-уровневыми приоритетами,
индивидуально
маскируемые
источники
прерываний,
дополнительная защита прерываний внешних источников запросов
на прерывание и один скоростной источник запроса прерывания
o Четыре
32-разрядных
программируемых
порта
линий
ввода-вывода
ввода-вывода
с
до
общим
122,
числом
генерация
прерывания при изменении входных сигналов и возможность
настройки на открытый сток для каждой линии
o 20- канальный контроллер периферийных данных (прямой доступ к
памяти ПДП = DMA)
o Локальная сеть MAC 10/100 Base-T
o Интерфейс
независимых
информационных
средств
(MII)
и
сокращенный интерфейс независимых информационных средств
(RMII)
o Интегрированные 28-байтный буфер FIFO и каналы ПДП для
приема и передачи
o Полноскоростной главный сдвоенный порт USB 2.0 (12 Мбит/с)
o Два встроенных приемопередатчика (для 208-выв. корпуса PQFP
только один)
o Встроенный буфер FIFO и каналы ПДП
o Полноскоростной USB 2.0 порт устройства (12 Мбит/с)
o Встроенный приемопередатчик, интегрированный буфер FIFO
объемом 2 кБ и возможностью конфигурации
o Интерфейс плат информационных средств(MCI)
o Автоматическое
управление
протоколом
связи
и
быстродействующая автоматическая передача данных
o Совместимость с картами памяти MMC и SD, поддержка до двух
карт памяти SD
o Три синхронных последовательных контроллера(SSC)
o Независимые
сигналы
тактовых
импульсов
(Clock)
и
синхронизации посылки (Frame Sync) для каждого приемника и
передатчика
2007г. Инженер-электроник: Станислав Г. Приходько
– 11 –
o Поддержка аналогового интерфейса I2S, поддержка временного
уплотнения
o Возможность высокоскоростной непрерывной передачи данных
потоком с 32-разрядным представлением данных
o Четыре
универсальных
синхронно-асинхронных
приемопередатчиков (УАПП = USART)
o Поддержка электронных карт стандарта ISO7816 T0/T1
o Аппаратное и программное подтверждение связи
o Поддержка RS485, инфракрасного порта связи со скоростью до 115
кбит/с –Все управляющие линии модема для УАПП №1
o Главный/подчиненный периферийный интерфейс(SPI)
o –Программируемая длина данных ( 8 - 16 бит), 4 внешних выбора
периферийных микросхем
o Два 3-канальных, 16-разрядных таймера-счетчика (TC)
o Три внешних входа тактирования, два вывода ввода-вывода на
канал для различного назначения
o Двойной генератор с широтно-импульсной модуляцией (ШИМ),
Режимы захвата фронтов и генератора, возможность прямого и
обратного счета
o Двухпроводной интерфейс (TWI)
o Поддержка
режима
«главный»
(Master),
поддержка
всех
двухпроводных ЭППЗУ (EEPROM) фирмы Atmel
o Поиск IEEE 1149.1 JTAG на всех цифровых выводах
o Напряжение питания
o 1.65В - 1.95В для VDDCORE, VDDOSC и VDDPLL
o 1.65В - 3.6В для VDDIOP (периферийный ввод-вывод) и для
VDDIOM (ввод-вывод памяти)
o Доступность в 208-выводном PQFP или 256-выводном BGA
корпусах
2007г. Инженер-электроник: Станислав Г. Приходько
– 12 –
4.2 Структурная схема микроконтроллера AT91RM9200:
Рисунок 1 – структурная схема процессора AT91RM9200
4.3 Общее описание:
AT91RM9200 – завершенная однокристальная система, построенная на
основе процессора ARM920T ARM Thumb. Включает в себя богатый набор
системных и прикладных внешних устройств и стандартных интерфейсов, тем
2007г. Инженер-электроник: Станислав Г. Приходько
– 13 –
самым предлагая решить широкий диапазон компьютерно-ориентированных
задач на основе одной микросхемы, где требуется добиться большого числа
функций при малом энергопотреблении и при самой низкой стоимости.
AT91RM9200
включает
в
себя
быстродействующее
рабочее
пространство статической памяти и внешний шинный интерфейс (EBI) с
низким
временем
ожидания
для
связи
с
внешней
памятью
любой
конфигурации и внешними устройствами. EBI включает в себя контроллеры
синхронного
динамического
ОЗУ
(СДОЗУ),
флэш-памяти
с
пакетным
режимом и статических ОЗУ, а также схему, облегчающую подключение к
модулям памяти SmartMedia, CompactFlash и NAND Flash.
Усовершенствованный контроллер прерываний (AIC) увеличивает
возможности процессора ARM920T по обработке прерываний за счет
много-векторности, приоритетности источников прерываний и сокращения
времени перехода к программе обслуживания прерывания.
Периферийный контроллер данных (PDC) обеспечивает каналы ПДП
(прямой доступ к памяти) для всех внешних устройств с последовательных
интерфейсом, позволяя им передавать данные во встроенную или внешнюю
память без вмешательства процессора. Это уменьшает нагрузку на процес сор,
при передаче непрерывных потоков данных. Преимуществом AT91RM9200
является
наличие
двух
указателей,
которые
позволяют
организовать
безразрывную передачу данных.
Набор контроллеров параллельного ввода-вывода позволяют настроить
линии ввода-вывода на использование в качестве порта ввода-вывода общего
назначения или на альтернативную функцию (входы-выходы встроенных
периферийных устройств). Кроме того, имеется возможность настройки для
каждой линии на генерацию запроса на прерывание при изменениях сигнала,
организацию выхода с открытым стоком и подключение привязочного
резистора к плюсу питания.
Контроллер
управления
энергопотреблением
(PMC)
позволяет
поддерживать на минимуме потребление энергии за счет выборочного
включения/выключения процессора и различных периферийных устройств
под
управлением
программного
обеспечения.
2007г. Инженер-электроник: Станислав Г. Приходько
Используется
также
– 14 –
регулируемый тактовый генератор, который позволяет выбрать частоту
синхронизации,
в
т.ч.
режим
пониженной
частоты
(32
кГц),
чтобы
оптимизировать потребление энергии..
AT91RM9200
имеет
большой
выбор
встроенных
стандартных
интерфейсов, в т.ч. полноскоростной порт USB 2.0 (ведущий и ведомый) и
контроллер доступа к информационным средствам по локальной сети
Ethernet Base- T 10/100, который позволяет организовать связь с широким
диапазоном внешних периферийных устройств и широко используется на
практике для построения сетей. Кроме того, имеется обширный набор
внешних устройств, которые работают в соответствии с несколькими
промышленными
стандартами,
телекоммуникационных
которые
приложениях,
используются
устройствах
с
в
аудио
и
флэш-картами,
инфракрасным каналом и электронными картами (Smart Card).
Наконец, AT91RM9200 предлагает широкий выбор отладочных средств,
таких
как
встроенный
внутрисхемный
эмулятор
с
JTAG-портом,
предопределяемый УАПП для организации канала отладки и встроенный
реально временной трассировщик. Это позволяет выполнить разработку и
отладку любых приложений, особенно там где необходимо работать в
реальном масштабе времени.
Документация:
836 Kb Engl AT91RM9200 Предварительная информация от Апреля
2004 года
17675 Kb Engl AT91RM9200 Полное описание
122 Kb Engl AT91RM9200 Errata от июня 2004 года
RUS AT91RM9200-DK - Набор для проектирования
2171 Kb Engl ARM9T Tehnical Reference Manual
920 Kb Engl ARM9TDMI Tehnical Reference Manual
2007г. Инженер-электроник: Станислав Г. Приходько
– 15 –
5 Структурная
схема
разрабатываемой
аппаратной
платформы
Структурная схема описывает по блокам – устройства на плате,
периферию, зарезервированные возможности.
5.1 структурная схема.
USB-Slave
Ethernet (LXT972)
USB-Master
RS-232 / DBGU
USB com
Блок питания
3.3В
1.85В
Eth
Процессор AT91RM9200
SPI
Data / Addr
PIO
1wire
I2C
PB27
Reset
DataFlash
(8MB+8MB)
AT45DB642
Memory 64MB
LED
MMC
PA, PB, PC
DS1307
SPI(PIO)
Reset
DS18S20
Рисунок 2 – Структурная схема платы AT91RM9200_SK
2007г. Инженер-электроник: Станислав Г. Приходько
– 16 –
6 Необходимый перечень ПО
6.1 Используемое ПО в процессе компиляции
6.1.1 Базовое ПО
linux (Linux – как консоль для сборки и программирования)
minicom (UNIX-terminal) или hyperterminal (WINDOWSterminal)
TFTPD (tftpd - tftp daemon)
6.1.2 Toolchain-1
GCC-3.4.6 (уже пересобранный)
Перечень программ/пакетов, которые собираются этой программой.
Romboot
kernel
Ссылка:
http://heavy-online.ru/arm-linux/files/ready/arm-toolchain.tar.bz2
Путь, по которому необходимо устанавливать toolchain-1:
/usr/local/arm9
6.1.3 Toolchain-2
GCC-2.95.3 (уже пересобранный)
Перечень программ/пакетов, которые собираются этой программой.
u-boot
Ссылка:
http://heavy-online.ru/arm-linux/files/packages/u-boot/arm-gcc-2.95.3.tgz
Путь, по которому необходимо устанавливать toolchain-2:
/opt/uClinux
6.1.4 Ядро (linux kernel):
linux-2.6.19 (исходный текст ядра)
Перечень программ/пакетов, которые нужны дополнительно.
2.6.19-at91.patch (исходный текст с исправлениями для ядра)
2007г. Инженер-электроник: Станислав Г. Приходько
– 17 –
Ссылка:
http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.19.tar.bz2
http://maxim.org.za/AT91RM9200/2.6/2.6.19-at91.patch.gz
Путь, по которому необходимо устанавливать kernel (ядро):
/usr/local/arm9/src
6.2 Конфигурация ПО для AT91RM9200_SK
Конфигурирование ПО заключается в том, что необходимо:
1
Инсталлировать ПО в определенные директории на компьютере с
уже предустановленным OS Linux.
2
Конфигурировать minicom в OS Linux, как - 115200 8N1.
3
Конфигурировать HyperTerminal в OS Windows, как - 115200 8N1.
4
Следовать по тексту документа, в отдельных разделах расписаны
особенности, которые необходимо учитывать и исполнять.
Заметка:
При сборке дистрибутивов, можно использовать автоматизированные
утилиты для сборки компиляторов, toolchains –называемые кросскомпиляторы. В Интернете общественность иногда прибегает к их
использованию.
Пример:
http://buildroot.uclibc.org/
http://kegel.com/crosstool/
2007г. Инженер-электроник: Станислав Г. Приходько
– 18 –
6.3 Установка и настройка tftpd
tftpd – tftp сервер, используется для передачи файлов от компьютера в
u-boot.
Нижеследующее, необходимо делать в случае, если в системе еще не
стоит сервис tftpd.
Для проверки стоит или нет, нужно искать в файле /etc/inetd.conf на
предмет присутствия в нем строки tftp.
6.3.1 Сборка TFTP:
Если OS Linux, имеет установленный дистрибутив, базированный на
Slackware:
Выполнить следующие действия с tftpd.tar.gz:
bash# tar xvzf tftpd.tar.gz
bash# cd ftpd
bash# make
bash# cp ./tftpd /usr/sbin
bash# cp ./tftpd.8 /usr/man/man8
Прописать в /etc/inetd.conf строчку для tftpd:
tftp dgram udp
wait nobody /usr/sbin/tcpd tftpd /tftproot
Создаем каталог для tftp:
bash# mkdir /tftproot
Если inetd уже запущен, то перезапустить его:
bash# killall -1 inetd
Если tftp не запущен – запускаем так, как требует этого система.
Если OS Linux, имеет установленный дистрибутив Debian, RedHat, то
TFTP устанавливается и конфигурируется, как требует этого система.
2007г. Инженер-электроник: Станислав Г. Приходько
– 19 –
7 Настройка периферии
7.1 Тактовая частота процессора и памяти.
Тактовая частота, должна быть корректно задана и используется в
дальнейшем в программе u-boot и при загрузке ядра Linux.
В файле main.cpp программы u-boot, должна быть строка в место той,
что по умолчанию:
#define AT91C_PLLA_VALUE
0x2024be04 // -> 170,496MHz
Значение 0x2024be04 задает частоту.
Тактовая частота процессора получается методом программирования
нескольких регистров блока PMC.
Рисунок - Power Management Controller Block Diagram
2007г. Инженер-электроник: Станислав Г. Приходько
– 20 –
Детальное описание этого регистра описано в Datasheet, раздел: PMC
Clock Generator PLL A Register, страница 285.
23.6.9 PMC Clock Generator PLL A Register
Register Name: CKGR_PLLAR
Access Type: Read/Write
Possible limitations on PLL A input frequencies and multiplier factors sh ould be checked before
using the Clock Generator.
Value to be written in CKGR_PLLAR must not be the same as current value in CKGR_PLLAR.
• DIVA: Divider A
DIVA Divider Selected
0 Divider output is 0
1 Divider is bypassed
2 - 255 Divider output is the Main Clock divided by DIVA.
• PLLACOUNT: PLL A Counter
Specifies the number of Slow Clock cycles before the LOCKA bit is set in PMC_SR after
CKGR_PLLAR is written.
• OUTA: PLL A Clock Frequency Range
OUTA PLL A Frequency Output Range
0 0 80 MHz to 160 MHz
0 1 Reserved
1 0 150 MHz to 240 MHz
1 1 Reserved
• MULA: PLL A Multiplier
0 = The PLL A is deactivated.
1 up to 2047 = The PLL A Clock frequency is the PLL A input frequency multiplied by MULA +
1.
Таблица 1 - Вставка описания регистра из Datasheet.
Пояснение:
Значение (0x2024be04), присвоенное макросу AT91C_PLLA_VALUE, в
дальнейшем загружается в регистр управления тактовой частотой в программе
u-boot:
2007г. Инженер-электроник: Станислав Г. Приходько
– 21 –
…
//* -Setup the PLL A
pCkgr->CKGR_PLLAR = AT91C_PLLA_VALUE;
…
Формула при расчете тактовой частоты:
F=Fosc*(MULA+1)/DIV;
Из значения 0x2024be04 получается:
MULA
= 0х24 (36)
DIV
= 0х04 (4)
Fosc
= 18,432МГц
После подстановки значений в формулу расчета, находим
F=170,496МГц. Частота работы памяти = F/DIV=42.624 МГц.
Для вычисления значения частоты F, можно использовать программу
расчета фильтра - ATMEL_PLL_LFT_Filter_CALCULATOR_AT91_2v5.xls,
при использовании этой «программы», должны быть включены макросы.
Ссылка для скачивания http://www.atmel.com/dyn/resources/prod_documents/ATMEL_PLL_LFT_Filter_
CALCULATOR_AT91.zip .
Также ATMEL_PLL_LFT_Filter_CALCULATOR_AT91_2v5 позволяет
производить вычисления значений номиналов элементов R1, C1 и C2.
2007г. Инженер-электроник: Станислав Г. Приходько
– 22 –
Рисунок – Программа-калькулятор расчета значений номиналов элементов R1,
C1 и C2 процессора AT91RM9200.
Рисунок – Программа-калькулятор расчета тактовой частоты процессора и
значений номиналов элементов R1, C1 и C2.
2007г. Инженер-электроник: Станислав Г. Приходько
– 23 –
8 Romboot
8.1 Назначение
Программа начальной инициализации, загрузчик программы U-boot.
8.2 Выполняемые действия программой
Выполняет начальную инициализацию всей периферии, позволяет
программировать данные в SPI DataFlash.
8.3 Возможности
1: Download Dataflash [addr]
Копирование программы по адресу [addr] используя протокол X-modem
2: Read Dataflash [addr]
Чтение содержимого по адресу [addr]
3: Start U-BOOT
Запуск программы загрузчика с ее настройками
4: Clear bootloader section in Dataflash
Очистка секции загрузки Romboot в Dataflash
8.4 Подготовка к сборке Romboot
Для загрузки системы из Dataflash, нужно взять программу от
производителя Atmel - Romboot.
Правленая версия под плату EVM9200 доступна по адресу:
http://heavy-online.ru/arm-linux/files/packages/romboot/romboot-evm9200.tgz .
( схема EVM9200 похожа на используемую схему нами )
Теперь необходимо вносить нужные изменения и компилировать
программу Romboot.
2007г. Инженер-электроник: Станислав Г. Приходько
– 24 –

Необходимо, распаковать пакет Romboot.
(Или использовать пересобранный AT91RM9200_SK_RomBoot_070302.tar.bz2( или .tar.gz ) )

Скрипт для компиляции находится в корне исходных текстов
программы: compile (UNIX-права 755).
В файле compile, нужно исправить следующую строку:
Листинг программы, отображающий изменения в исходном тексте:
...
CROSS=/usr/local/arm9/bin/arm-linux...
8.5 main.cpp: правка времени ожидания
Листинг программы отображающий изменения в исходном тексте для
указания задержки - 5 sec:
// start tempo to start Uboot in a delay of 1 sec if no k ey pressed
// svcUbootTempo.Start(&svcUbootTempo, 1000, 0, AT91F_StartUboot,
(void *)0);
// для указания задержки - 5 sec
svcUbootTempo.Start(&svcUbootTempo, 5000, 0, AT91F_StartUboot,
(void *)0);
printf("press any key to enter bootloader\n\r");
getc();
8.6 Тактовая частота, SDRAM-память
Описание выбора тактовой частоты процессора в разделе – Тактовая
частота процессора и памяти.
2007г. Инженер-электроник: Станислав Г. Приходько
– 25 –
8.6.1 main.h: правка тактовой частоты процессора
Листинг программы, отображающий изменения в исходном тексте для
указания тактовой частоты процессора и памяти:
#ifndef main_h
#define main_h
#include
"embedded_services.h"
…
#define AT91C_MASTER_CLOCK
48000000
//#define AT91C_MASTER_CLOCK
46080000 // veter
//#define AT91C_MASTER_CLOCK
#define AT91C_BAUD_RATE
44928000
115200
#define AT91C_DOWNLOAD_BASE_ADDRESS
0x20000000
#define AT91C_DOWNLOAD_MAX_SIZE
0x00020000
#define AT91C_OFFSET_VECT6
//* Offset for ARM vector 6
0x14
#define AT91C_VERSION "VER 1.0-070219-veter"
8.6.2 init.cpp: правка типа и тактовой частоты и частоты памяти
Изменение тактовой частоты процессора и периферии можно
конфигурировать под данную плату.
Описание установки тактовой частоты процессора в разделе – Тактовая
частота процессора и памяти.
В файле main.cpp, нужно исправить строку с переменной
AT91C_PLLA_VALUE:
Было:
//#define AT91C_PLLA_VALUE
0x2026BE04 // -> 179.712MHz
Должна стать:
#define AT91C_PLLA_VALUE
0x2024be04 // -> 170,496MHz // veter
2007г. Инженер-электроник: Станислав Г. Приходько
– 26 –
Листинг программы, отображающий изменения в исходном тексте для
указания тактовой частоты процессора и памяти:
void AT91F_InitSdram()
{
…
//*Init SDRAM
pRegister = (int *)0xFFFFFF98;
//
*pRegister = 0x2188c155;
*pRegister = 0x2a99C259; // veter
…
}
Значение 0x2a99C259 описывает конфигурацию используемого
типа памяти. Используемая в плате микросхема – K4S561632E-TC75
Описание K4S561632E-TC75, из Datasheet на нее :
16M x 16 166MHz (CL=3)
Organization
Row Address
Column Address
16Mx16
A0~A12
A0-A8
пересчитываем:
256Mbit
рядов 13
колонок 9
Обращяясь к Datasheet, становится известно что регистр с адресом
0xffffff90 – это раздел SDRAMC Configuration Register.
Вот его описание:
2007г. Инженер-электроник: Станислав Г. Приходько
– 27 –
2007г. Инженер-электроник: Станислав Г. Приходько
– 28 –
8.7 SPI DataFlash-память
Используется последовательная память с шиной SPI, называется в
программе Dataflash, просто Flash – это параллельная, она не используется в
этой конструкции, по этому по программе места с Flash обходятся разными
путями.
8.7.1 dataflash.cpp: конфигурация количества микросхем Flashпамяти
Листинг программы, отображающий изменения в исходном тексте:
…
#define CFG_MAX_DATAFLASH_BANKS
2
#define CFG_DATAFLASH_LOGIC_ADDR_CS0
0xC0000000
//#define CFG_DATAFLASH_LOGIC_ADDR_CS3 0xD0000000
#define CFG_DATAFLASH_LOGIC_ADDR_CS1
0xD0000000
…
8.7.2 dataflash.h:
конфигурация
количества
микросхем
Flash-
памяти
Листинг программы, отображающий изменения в исходном тексте:
…
/*int cs[][CFG_MAX_DATAFLASH_BANKS] = {
{CFG_DATAFLASH_LOGIC_ADDR_CS0, 0}, // Logical adress, CS
{CFG_DATAFLASH_LOGIC_ADDR_CS3, 3}
};*/
int cs[][CFG_MAX_DATAFLASH_BANKS] = {
{CFG_DATAFLASH_LOGIC_ADDR_CS0, 0}, // Logical adress, CS
2007г. Инженер-электроник: Станислав Г. Приходько
– 29 –
{CFG_DATAFLASH_LOGIC_ADDR_CS1, 1}
};
…
8.7.3 dataflash.cpp: инициализация
Листинг программы, отображающий изменения в исходном тексте:
void AT91F_SpiInit(void) {
…
/* Configure SPI in Master Mode with No CS selected !!! */
// AT91C_BASE_SPI->SPI_MR = AT91C_SPI_MSTR |
AT91C_SPI_MODFDIS | AT91C_SPI_PCS;
AT91C_BASE_SPI->SPI_MR = AT91C_SPI_MSTR |
AT91C_SPI_MODFDIS | AT91C_SPI_PCS | AT91C_SPI_DIV32 ;
// AT91C_SPI_DIV32 – снижение скорости SPI в 32 раза
/* Configure CS0 and CS3 */
*(AT91C_SPI_CSR + 0) = AT91C_SPI_CPOL|(AT91C_SPI_DLYBS &
0x100000)|((AT91C_MASTER_CLOCK/(2*AT91C_SPI_CLK)) << 8);
// *(AT91C_SPI_CSR + 3) = AT91C_SPI_CPOL|(AT91C_SPI_DLYBS &
0x100000)|((AT91C_MASTER_CLOCK/(2*AT91C_SPI_CLK)) << 8);
*(AT91C_SPI_CSR + 1) = AT91C_SPI_CPOL|(AT91C_SPI_DLYBS &
0x100000)|((AT91C_MASTER_CLOCK/(2*AT91C_SPI_CLK)) << 8);
}
…
8.7.4 at45.cpp - конфигурация количества микросхем Flash-памяти
Листинг программы, отображающий изменения в исходном тексте:
void AT91F_SpiEnable(int cs) {
switch(cs) {
case 0: /* Configure SPI CS0 for Serial DataFlash AT45DBxx */
2007г. Инженер-электроник: Станислав Г. Приходько
– 30 –
AT91C_BASE_SPI->SPI_MR &= 0xFFF0FFFF;
AT91C_BASE_SPI->SPI_MR |=
((AT91C_SPI_PCS0_SERIAL_DATAFLASH<<16) & AT91C_SPI_PCS);
break;
//
case 3: /* Configure SPI CS3 for Serial DataFlash Card */
//
/* Set up PIO SDC_TYPE to switch on DataFlash Card and not
MMC/SDCard */
//
AT91C_BASE_PIOB->PIO_PER = AT91C_PIO_PB7;
/* Set
AT91C_BASE_PIOB->PIO_OER = AT91C_PIO_PB7;
/*
in PIO mode */
//
Configure in output */
//
/* Clear Output */
//
AT91C_BASE_PIOB->PIO_CODR = AT91C_PIO_PB7;
//
/* Configure PCS */
//
AT91C_BASE_SPI->SPI_MR &= 0xFFF0FFFF;
//
AT91C_BASE_SPI->SPI_MR |=
((AT91C_SPI_PCS3_DATAFLASH_CARD<<16) & AT91C_SPI_PCS);
//
break;
case 1: /* Configure SPI CS1 for Serial DataFlash Card */
/* Set up PIO SDC_TYPE to switch on DataFlash Card and not
MMC/SDCard */
// AT91C_PA4_NPCS1
AT91C_BASE_PIOB->PIO_PER = AT91C_PIO_PB7;
/* Set
AT91C_BASE_PIOB->PIO_OER = AT91C_PIO_PB7;
/*
in PIO mode */
Configure in output */
/* Clear Output */
AT91C_BASE_PIOB->PIO_CODR = AT91C_PIO_PB7;
/* Configure PCS */
AT91C_BASE_SPI->SPI_MR &= 0xFFF0FFFF;
AT91C_BASE_SPI->SPI_MR |=
((AT91C_SPI_PCS1_DATAFLASH_CARD<<16) & AT91C_SPI_PCS);
2007г. Инженер-электроник: Станислав Г. Приходько
– 31 –
break;
}
/* SPI_Enable */
AT91C_BASE_SPI->SPI_CR = AT91C_SPI_SPIEN;
}
8.8 Компиляция программы Romboot
Свободно компилируется используя toolchain-1.
 Для компиляции, запустить на исполнение скрипт из консоли:
[email protected]:AT91RM9200_SK_RomBoot_070302# ./compile
text
10795
data
44
bss
dec
656 11495
hex filename
2ce7 romboot.out
[email protected]:AT91RM9200_SK_RomBoot_070302#
8.9 Программирование SPI Dataflash.
Если в Dataflash уже присутствует загрузчик, который необходимо
стереть, делается следующая последовательность действий:
 установить перемычку/джампер на 9-10 выводах разъема XP1.
 нажать на reset
 снять перемычку/джампер на 9-10 выводах разъема XP1.
 Если процессор включился на свой boot, то в консоли терминала
(параметры терминала - 115200 8N1), на порту DBGU, появятся
символы 'C' (CCCCCCCCCC). Это значит, что активирован
встроенный в ROM процессора протокол X-modem.
2007г. Инженер-электроник: Станислав Г. Приходько
– 32 –
 Теперь, скомпилированный и настроенный romboot.bin нужно
загрузить в процессор.
 Приготовиться по окончании программирования нажать Enter.
 romboot запустится, и появится возможность записать его в
Dataflash.
При нажатии на любую клавишу в терминале, после включения
питания (или reset`а), будет сообщение:
AT91F_LowLevelInit(): Debug channel initialized
press any key to enter bootloader
ATMEL LOADER VER 1.01 Jan 17 2007 09:45:22
*----------------------------------------*
DataFlash:AT45DB642
Nb pages: 008192
Page Size: 001056
Size=08650752 bytes
Logical address: 0xC0000000
DataFlash:AT45DB642
Nb pages: 008192
Page Size: 001056
Size=08650752 bytes
Logical address: 0xD0000000
*----------------------------------------*
1: Download Dataflash [addr]
2: Read Dataflash [addr]
3: Start U-BOOT
4: Clear bootloader section in Dataflash
*----------------------------------------*
Enter:
2007г. Инженер-электроник: Станислав Г. Приходько
– 33 –
На терминале это выглядит так:
Для этого нужно дать команду: "1 C0000000" и нажать Enter.
Побегут буковки 'C' - устройство готово принять записываемый в
Dataflash файл (в данный момент romboot.bin).
По завершению, romboot сообщит, что записал в Dataflash и подправил
6-й вектор, вернет код Dataflash.
На терминале появиться сообщение:
Modification of Arm Vector 6 :841a0bc
Write 95744 bytes in DataFlash [0xc0000000]
Hit a Key!aflash: OK
Теперь можно грузиться с Dataflash-а.
2007г. Инженер-электроник: Станислав Г. Приходько
– 34 –
ВНИМАНИЕ!!!
Если Вам не нужен процесс автоматического запуска u-boot-а, а
требуется выйти в меню romboot-, необходимо в течение секунды после
появления приглашения нажать любую кнопку.
Если секунды мало (или много), можно изменить это время. Для этого
нужно отредактировать исходный текст Romboot, как это сказано в «разделе
main.cpp: правка времени ожидания», затем Romboot необходимо пересобрать
и вновь зашить в Dataflash.
2007г. Инженер-электроник: Станислав Г. Приходько
– 35 –
9
U-boot
9.1 Назначение
u-boot-1.1.1 - Программа основной инициализации и установки
параметров загрузки.
9.2 Возможности
u-boot-1.1.1
позволяет
-
управлять
параметрами
загрузки
ядра,
изменяет и показывает среду окружения, может сохранять переменные
окружения в Dataflash.
Возможности программы u-boot, описаны в оригинальном документе:
«AT91RM9200DK U-Boot Flash Programming Solutions » - doc6041.pdf, страница 2
• Standalone primary bootstrap
• Small footprint
• OS-independent
• Auto-boot and interactive modes
• Command line interface
• Non-volatile environment variables
• Flash programming capability
• DataFlash programming capability (only available in latest Open Source
download)
• Download through serial interface (Kermit protocol)
• Download through Ethernet (tftp)
• Integrated bootp
• Scripting capability
Данный документ доступен на сайте фирмы ATMEL.
9.2.1 u-boot-1.1.1/board/RM9200/RM9200.c – номер архитектуры
Нужен номер архитектуры на этапе загрузки ядра Linux.
2007г. Инженер-электроник: Станислав Г. Приходько
– 36 –
Листинг программы, отображающий изменения в исходном тексте для
изменения номера архитектуры :
int board_init (void)
{
…..
/* arch number of AT91RM9200DK-Board */
//
gd->bd->bi_arch_number = 251; // default as MACH_TYPE_AT91
gd->bd->bi_arch_number = 262; // veter - DK
/* adress of boot parameters */
….
}
9.3 u-boot-1.1.1/include/configs/RM9200.h
–
файл
конфигурации
платы
Изменения, вносимые в исходный текст
u-boot-1.1.1/include/configs/RM9200.h
Результирующий RM9200.h файл, который можно использовать как
базовый конфигурационный файл, с предварительными рабочими
настройками.
Описать кратко содержание данного файла, что и зачем там написано.
Листинг файла вынести в приложение.
Листинг программы, отображающий изменения в исходном тексте –
конфигурационный файл:
/*
* Configuation settings for the RM9200 board.
*
* (c) Copyright 2004 Roman Avramenko <[email protected]>
* Industrial Monitoring Systems, Ltd
2007г. Инженер-электроник: Станислав Г. Приходько
– 37 –
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public Licens e as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
#ifndef __CONFIG_H
#define __CONFIG_H
#define CONFIG_EVM9200
#define MASTER_CLOCK_45
//#define MASTER_CLOCK_60
/* Master clock 60Mhz */
//#define DRAM_SIZE_16MB
#define DRAM_SIZE_32MB
#define MORECORE_FAILURE 0
/* CHECK FIRST: Board and revision specific settings */
2007г. Инженер-электроник: Станислав Г. Приходько
– 38 –
#undef
CFG_ENV_IS_IN_DATAFLASH
#undef
CFG_ENV_IS_IN_NVRAM
#ifdef CONFIG_EVM9200
#define CFG_ENV_IS_IN_FLASH
#undef CONFIG_HARD_I2C
#undef
CFG_ENV_IS_IN_EEPROM
#else
/* CONFIG_EVM9200 */
#undef
CFG_ENV_IS_IN_FLASH
#undef
CFG_ENV_IS_IN_EEPROM
#define CONFIG_HARD_I2C
#define
1
/* Hardware I2C interface */
CFG_ENV_IS_IN_EEPROM 1
#endif
/*
* If we are developing, we might want to start armboot from ram
* so we MUST NOT initialize critical regs like mem-timing ...
*/
#define CONFIG_INIT_CRITICAL
/* undef for developing */
//#define CONFIG_ENV_OVERWRITE
#define CONFIG_MISC_INIT_R
/* Let's change ethaddr */
/* Needed to init MAC address
setting */
/* ARM asynchronous clock */
#define AT91C_MAIN_CLOCK
179712000
/*
from
18.432
MHz
crystal(18432000/4*39) */
#ifdef MASTER_CLOCK_45
#define AT91C_MASTER_CLOCK
/* Master clock 45Mhz */
44928000
/* peripheral clock
(AT91C_MAIN_CLOCK/3)*/
#else
/* MASTER_CLOCK_45 */
#ifdef MASTER_CLOCK_60
2007г. Инженер-электроник: Станислав Г. Приходько
– 39 –
#define AT91C_MASTER_CLOCK
59904000
/* peripheral clock
(AT91C_MAIN_CLOCK/3) */
#else
/* MASTER_CLOCK_60 */
#error Master clock must be defined
#endif
#endif
#define AT91_SLOW_CLOCK
32768
#define CONFIG_RM9200
1
/*
/* slow clock */
on
a
RM9200
Board
*/
#undef CONFIG_USE_IRQ
/* we don't need IRQ/FIQ stuff
*/
#define CONFIG_CMDLINE_TAG
1
/* enable passing of ATAGs
*/
#define CONFIG_SETUP_MEMORY_TAGS 1
#define CONFIG_INITRD_TAG
1
/*
* Size of malloc() pool
*/
#define CFG_MALLOC_LEN
(CFG_ENV_SIZE + 128*1024)
#define CFG_GBL_DATA_SIZE
128 /* size in bytes reserved for initial
data */
#define CONFIG_BAUDRATE 115200
#ifdef MASTER_CLOCK_45
/* Master clock 45Mhz */
#define CFG_AT91C_BRGR_DIVISOR 24
#else
/* MASTER_CLOCK_45 */
#ifdef MASTER_CLOCK_60
2007г. Инженер-электроник: Станислав Г. Приходько
– 40 –
#define CFG_AT91C_BRGR_DIVISOR 33
/* hardcode so no __divsi3 :
AT91C_MASTER_CLOCK / baudrate / 16 */
#endif
/* MASTER_CLOCK_60 */
#endif
/*
* Hardware drivers
*/
#undef
control support
#undef
CONFIG_HWFLOW
/* don't include RTS/CTS flow
*/
CONFIG_MODEM_SUPPORT
/*
disable
modem
initialization stuff */
#define CONFIG_BOOTDELAY
3
//#define CONFIG_BOOTCOMMAND
"bootm 10020000"
//#define CONFIG_BOOTCOMMAND
"bootm 20007fc0"
//#define CONFIG_BOOTCOMMAND
"tftp 20007fc0 uImage; bootm
20007fc0"
//#define CONFIG_BOOTCOMMAND
"tftp
20008000
uImage;
"cp.b
C002A000
20A00000
"cp.b
C002A000
20008000
"cp.b
C002A000
20A00000
bootm 20008000"
//#define CONFIG_BOOTCOMMAND
200000; bootm 20A00000"
//#define CONFIG_BOOTCOMMAND
200000; bootm 20008000"
#define CONFIG_BOOTCOMMAND
200000; cp.b C0160000 20C00000 600000; bootm 20A00000 20C00000"
//#define CONFIG_AUTOBOOT_KEYED
1
#undef CONFIG_AUTOBOOT_KEYED
#define CONFIG_AUTOBOOT_DELAY_STR "uboot"
#define
CONFIG_AUTOBOOT_STOP_STR "uboot"
2007г. Инженер-электроник: Станислав Г. Приходько
– 41 –
#define
CONFIG_AUTOBOOT_STOP_STR2
#define CONFIG_ZERO_BOOTDELAY_CHECK
//#define CONFIG_BOOTARGS
"uboot"
1
"root=/dev/ram
initrd=0x20288000,0x500000
rw
ramdisk_size=8000
mtdparts=AT45DB642.spi0:0x2A000(boot)ro,0x136000(kernel)ro,0x200300(initrd)
ro,-(filesystem) console=ttyS0,115200 mem=32M"
//#define CONFIG_BOOTARGS
"root=/dev/ram0
initrd=0x20288000,0x500000
rw
ramdisk_size=5000
mtdparts=AT45DB642.spi0:0x2A000(boot)ro,0x136000(kernel)ro,0x200300(initrd)
ro,-(filesystem) console=ttyS0,115200 mem=64M"
#define CONFIG_BOOTARGS
"root=/dev/ram
rw
mtdparts=AT45DB642.spi0:0x2A000(boot)ro,0x136000(kernel)ro,0x200300(initrd)
ro,-(filesystem) console=ttyS0,115200 mem=64M"
//#ifdef CONFIG_EVM9200
//#define CONFIG_NETMASK
255.0.0.0
//#define CONFIG_IPADDR
10.0.0.2
//#define CONFIG_ETHADDR
12:34:56:78:9A:BC
//#define CONFIG_SERVERIP
10.0.0.1
//#define CONFIG_BOOTFILE
"u-boot.bin.gz"
#ifdef CONFIG_EVM9200
#define CONFIG_NETMASK
#define CONFIG_IPADDR
255.255.255.0
192.168.1.123
#define CONFIG_ETHADDR
00:12:34:56:78:9A
#define CONFIG_SERVERIP
192.168.1.1
#define CONFIG_BOOTFILE
"uImage"
#endif
/* CONFIG_EVM9200 */
/* #define CONFIG_ENV_OVERWRITE 1 */
#ifdef CONFIG_EVM9200
2007г. Инженер-электроник: Станислав Г. Приходько
– 42 –
#define CONFIG_COMMANDS
\
((CONFIG_CMD_DFL | \
CFG_CMD_NET | \
CFG_CMD_BDI | \
CFG_CMD_PING \
)\
& ~(CFG_CMD_FPGA | \
CFG_CMD_NAND \
)\
)
#define CFG_LONGHELP
/*#else
#define CONFIG_COMMANDS
\
(CONFIG_CMD_DFL | \
CFG_CMD_NET | \
CFG_CMD_PING | \
CFG_CMD_I2C | \
CFG_CMD_EEPROM \
& ~(CFG_CMD_BDI | \
CFG_CMD_FPGA | \
CFG_CMD_NAND \
)\
)
*/
#endif
/* this must be included AFTER the definition of CONFIG_COMMANDS (if
any) */
#include <cmd_confdefs.h>
#define CFG_HUSH_PARSER
2007г. Инженер-электроник: Станислав Г. Приходько
– 43 –
#define CFG_PROMPT_HUSH_PS2 "> "
#define CFG_MAX_NAND_DEVICE
devices
1
/* Max number of NAND
*/
#define SECTORSIZE 512
#define ADDR_COLUMN 1
#define ADDR_PAGE 2
#define ADDR_COLUMN_PAGE 3
#define NAND_ChipID_UNKNOWN
0x00
#define NAND_MAX_FLOORS 1
#define NAND_MAX_CHIPS 1
#define AT91_SMART_MEDIA_ALE (1 << 22) /* our ALE is AD22 */
#define AT91_SMART_MEDIA_CLE (1 << 21) /* our CLE is AD21 */
#define
NAND_DISABLE_CE(nand)
do
{
*AT91C_PIOC_SODR
=
do
{
*AT91C_PIOC_CODR
=
AT91C_PIO_PC0;} while(0)
#define
NAND_ENABLE_CE(nand)
AT91C_PIO_PC0;} while(0)
#define NAND_WAIT_READY(nand) while (!(*AT91C_PIOC_PDSR &
AT91C_PIO_PC2))
#define
WRITE_NAND_COMMAND(d,
adr)
do{
*(volatile
__u8
*)((unsigned long)adr | AT91_SMART_MEDIA_CLE) = (__u8)(d); } while(0)
#define WRITE_NAND_ADDRESS(d, adr) do{ *(volatile __u8 *)((unsigned
long)adr | AT91_SMART_MEDIA_ALE) = (__u8)(d); } while(0)
#define WRITE_NAND(d, adr) do{ *(volatile __u8 *)((unsigned long)adr) =
(__u8)d; } while(0)
2007г. Инженер-электроник: Станислав Г. Приходько
– 44 –
#define
READ_NAND(adr)
((volatile
unsigned
char)(*(volatile
__u8
*)(unsigned long)adr))
/* the following are NOP's in our implementation */
#define NAND_CTL_CLRALE(nandptr)
#define NAND_CTL_SETALE(nandptr)
#define NAND_CTL_CLRCLE(nandptr)
#define NAND_CTL_SETCLE(nandptr)
#define CONFIG_NR_DRAM_BANKS
#define PHYS_SDRAM
1
0x20000000
#ifdef DRAM_SIZE_16MB
#define PHYS_SDRAM_SIZE
0x01000000 /* 16 megs */
#else
//#define PHYS_SDRAM_SIZE
0x02000000 /* 32 megs */
#define PHYS_SDRAM_SIZE
0x04000000 /* 64 megs */
#endif
/* DRAM_SIZE_16MB */
#define CFG_MEMTEST_START PHYS_SDRAM
#define CFG_MEMTEST_END
(PHYS_SDRAM + PHYS_SDRAM_SIZE -
1024*1024 - CFG_MALLOC_LEN)
#define CFG_ALT_MEMTEST
//#define CONFIG_DRIVER_ETHER
//#define CONFIG_PHY_IS_RTL8201
#define CONFIG_DRIVER_ETHER
//#define CONFIG_PHY_IS_RTL8201
#define CONFIG_PHY_IS_LXT972
#ifdef CONFIG_EVM9200
#define CFG_PHY_MDI_ADDRESS
(0x1F ^ 0x02)
#else
2007г. Инженер-электроник: Станислав Г. Приходько
– 45 –
#define CFG_PHY_MDI_ADDRESS
1
#endif
#define CONFIG_NET_RETRY_COUNT
20
#undef CONFIG_AT91C_USE_RMII
/*#define CONFIG_AT91C_USE_RMII */
#undef CONFIG_HAS_DATAFLASH
#define CONFIG_HAS_DATAFLASH
1 /* veter */
#define CFG_SPI_WRITE_TOUT (5*CFG_HZ)
#define CFG_MAX_DATAFLASH_BANKS 2
#define CFG_MAX_DATAFLASH_PAGES 16384
#define CFG_DATAFLASH_LOGIC_ADDR_CS0
0xC0000000
/*
0xD0000000
/*
Logical adress for CS0 */
#define CFG_DATAFLASH_LOGIC_ADDR_CS3
Logical adress for CS3 */
#define PHYS_FLASH
0x10000000
//#define PHYS_FLASH_SIZE 0x00400000 /* 4 Megs main flash */
#define CFG_FLASH_BASE PHYS_FLASH
#define CFG_MAX_FLASH_BANKS 1
#define CFG_MAX_FLASH_SECT 256
#define CFG_FLASH_ERASE_TOUT
(2*CFG_HZ) /* Timeout for Flash
Erase */
#define CFG_FLASH_WRITE_TOUT
(2*CFG_HZ) /* Timeout for Flash
Write */
#undef CFG_FLASH_CFI
#define CFG_I2C_SPEED 100000
#define CFG_I2C_SLAVE
0xFE
#define CFG_I2C_EEPROM_ADDR 0x50
2007г. Инженер-электроник: Станислав Г. Приходько
– 46 –
#define CFG_I2C_EEPROM_ADDR_LEN 1
#define CFG_EEPROM_PAGE_WRITE_BITS 4
/* AT24C08 EEPROM */
#define CFG_ENV_IS_IN_DATAFLASH /* veter */
#if defined(CFG_ENV_IS_IN_DATAFLASH)
//#define CFG_ENV_OFFSET 0x20000
#define CFG_ENV_OFFSET 0x28000
#define
CFG_ENV_ADDR
(CFG_DATAFLASH_LOGIC_ADDR_CS0
CFG_ENV_OFFSET)
#define CFG_ENV_SIZE 0x2000 /* 0x8000 */
#elif defined(CFG_ENV_IS_IN_FLASH)
#ifdef CONFIG_EVM9200
#define CFG_ENV_ADDR (PHYS_FLASH + 0x1F0000)
#define CFG_ENV_SIZE 0x10000
#else
/* CONFIG_EVM9200 */
#define CFG_ENV_ADDR (PHYS_FLASH + 0xE000)
#define CFG_ENV_SIZE 0x2000
#endif
#elif defined(CFG_ENV_IS_IN_EEPROM)
#define CFG_ENV_ADDR 0
#define CFG_ENV_OFFSET
#define CFG_ENV_SIZE
0
1024
#else
#define
CFG_ENV_IS_NOWHERE
#define CFG_ENV_SIZE 0
#endif
#ifdef DRAM_SIZE_16MB
//#define CFG_LOAD_ADDR 0x20800000 /* default load address */
//#define CFG_LOAD_ADDR 0x20007fc0 /* default load address */
#define CFG_LOAD_ADDR 0x20008000 /* default load address */
2007г. Инженер-электроник: Станислав Г. Приходько
+
– 47 –
#else
//#define CFG_LOAD_ADDR 0x21000000 /* default load address */
//#define CFG_LOAD_ADDR 0x20007fc0 /* default load address */
#define CFG_LOAD_ADDR 0x20008000 /* default load address */
#endif
/* DRAM_SIZE_16MB */
#define CFG_BOOT_SIZE
0x6000 /* 24 KBytes */
#define CFG_U_BOOT_BASE
(PHYS_FLASH + 0x10000)
#define CFG_U_BOOT_SIZE
0x10000
/* 64 KBytes */
#define CFG_BAUDRATE_TABLE {115200 , 19200, 38400, 57600, 9600 }
#define CFG_PROMPT "u-boot -> " /* Monitor Command Prompt */
#define
CFG_CBSIZE 256 /* Console I/O Buffer Size */
#define CFG_MAXARGS 16 /* max number of command args * /
#define
CFG_PBSIZE
(CFG_CBSIZE+sizeof(CFG_PROMPT)+16)
Print Buffer Size */
#ifndef __ASSEMBLY__
/*----------------------------------------------------------------------* Board specific extension for bd_info
*
* This structure is embedded in the global bd_info (bd_t) structure
* and can be used by the board specific code (eg board/...)
*/
struct bd_info_ext
{
/* helper variable for board environment handling
*
* env_crc_valid == 0
* env_crc_valid > 0
=> uninitialised
=> environment crc in flash is valid
2007г. Инженер-электроник: Станислав Г. Приходько
/*
– 48 –
* env_crc_valid < 0
=> environment crc in flash is invalid
*/
int env_crc_valid;
};
#endif
#define
CFG_HZ AT91C_MASTER_CLOCK/2
/* AT91C_TC0_CMR is
implicitly set to \
AT91C_TC_TIMER_DIV1_CLOCK */
#define CONFIG_STACKSIZE
(32*1024) /* regular stack */
#ifdef CONFIG_USE_IRQ
#error CONFIG_USE_IRQ not supported
#endif
#endif
Это реально рабочий конфигурационный файл.
Нужно заметить еще один важный момент:
Значение #define CONFIG_ETHADDR
00:12:34:56:78:9A
очень важно установить корректным, иначе Linux не сможет “поднять
интерфейс”
9.4 Дополнительная SPI DataFlash
9.4.1 u-boot-1.1.1/cpu/at91rm9200/at45.c – драйвер DataFlash памяти
AT45DBxxx
Подключение второй DataFlash производится следующим методом:
Нужно произвести изменения в исходном тексте.
2007г. Инженер-электроник: Станислав Г. Приходько
– 49 –
Описание CS1 сигнала:
//#define AT91C_SPI_PCS3_DATAFLASH_CARD
0x7
/* Chip Select 3 :
0xD
/* Chip Select 3 :
NPCS3 %0111 */
#define AT91C_SPI_PCS1_DATAFLASH_CARD
NPCS3 %1101 */ // veter
Инициализация для CS1:
//
*(AT91C_SPI_CSR + 3) = AT91C_SPI_CPOL | (AT91C_SPI_DLYBS & 0x100000)
| ((AT91C_MASTER_CLOCK / (2*SPI_CLK)) << 8);
*(AT91C_SPI_CSR + 1) = AT91C_SPI_CPOL | (AT91C_SPI_DLYBS & 0x100000)
| ((AT91C_MASTER_CLOCK / (2*SPI_CLK)) << 8); // veter
Выбор CS1 сигнала:
//
case 3: /* Configure SPI CS3 for Serial DataFlash Card */
case 1: /* Configure SPI CS3 for Serial DataFlash Card */ // veter
Разрешение аппаратного вывода для CS1:
//
AT91C_BASE_SPI->SPI_MR |=
((AT91C_SPI_PCS3_DATAFLASH_CARD<<16) & AT91C_SPI_PCS);
AT91C_BASE_SPI->SPI_MR |=
((AT91C_SPI_PCS1_DATAFLASH_CARD<<16) & AT91C_SPI_PCS); // veter
9.5 Драйвер Ethernet - LXT972
2007г. Инженер-электроник: Станислав Г. Приходько
– 50 –
Версия U-boot-1.1.1 не имеет встроенного драйвера LXT972,
следовательно его необходимо интегрировать в текущую версию u-boot-1.1.1.
Для включения контроллера, нужно patch-файлами обновить исходные
тексты U-boot под нашу версию реализации схемы (AT91RM9200-SK) и ее
особенности, отличные от традиционного включения процессора
AT91RM9200-DK(EK).
Традиционная версия программы U-boot-1.1.1 не предусматривает
многих моментов, которые реализованы в нашей плате. Поэтому изменения
нужно вносить с учетом специфики включения устройств или отдельных
блоков.
Драйвер lxt972, как идеально подходящий, взят с более старшей версии
u-boot-1.1.6 ( предварительно нужно старшую версию распаковать и
скопировать во временную директорию).
Среди исходных текстов u-boot-1.1.6 нужно найти следующие 2 файла:
lxt971a.h (header) и lxt971a.c (source)
9.5.1 u-boot-1.1.1/include/lxt971a.h
Файл lxt971a.h копируется в директорию u-boot-1.1.1/include/.
9.5.2 u-boot-1.1.1/include/at91rm9200_net.h – подключение headerдрайвера
Обязательно сделать эти изменения, так как наложенный patch-файл,
как описывалось выше, вносит изменения в процедуры, которые нужны для
других драйверов, но не для нашего.
Листинг программы, отображающий изменения в исходном тексте:
…
2007г. Инженер-электроник: Станислав Г. Приходько
– 51 –
#include <common.h>
#include <asm/io.h>
#include <asm/arch/hardware.h>
#ifdef CONFIG_PHY_IS_RTL8201
#include "rtl8201.h"
#elif defined (CONFIG_PHY_IS_LXT972)
#include "lxt971a.h"
#else
#include "dm9161.h"
#endif
….
/* MII functions */
static void at91rm9200_EmacEnableMDIO(AT91PS_EMAC p_mac);
static void at91rm9200_EmacDisableMDIO(AT91PS_EMAC p_mac);
//static UCHAR at91rm9200_EmacReadPhy(AT91PS_EMAC p_mac,
unsigned char PhyAddress, unsigned char RegisterAddress, unsigned sho
rt *pInput);
//static UCHAR at91rm9200_EmacWritePhy(AT91PS_EMAC p_mac,
unsigned char PhyAddres, unsigned char RegisterAddress, unsigned sho
rt *pOutput);
static UCHAR at91rm9200_EmacReadPhy(AT91PS_EMAC p_mac, unsigned
char RegisterAddress, unsigned short *pInput);
static UCHAR at91rm9200_EmacWritePhy(AT91PS_EMAC p_mac,
unsigned char RegisterAddress, unsigned short *pOutput);
void at91rm92000_GetPhyInterface(void );
…
9.5.3 u-boot-1.1.1/board/RM9200/at91rm9200_ether.c (ET_ENABLE)
Если обратить внимание на схему, а именно на PB23, можно заметить,
что это сигнал ET_ENABLE (разрешение работы микросхемы драйвера сети).
2007г. Инженер-электроник: Станислав Г. Приходько
– 52 –
Для полного включения Ethernet контроллера, нужны изменения в
исходных текстах U-boot-1.1.1.
Листинг программы, отображающий изменения в исходном тексте
(конфигурирование вывода PB23 на вывод):
int eth_init (bd_t * bd) {
…
/* Enable PIO to access the ET_ENABLE */
AT91C_BASE_PIOB->PIO_PER |= 1<<23;
AT91C_BASE_PIOB->PIO_OER |= 1<<23;
AT91C_BASE_PIOB->PIO_CODR |= 1<<23;
…
}
9.5.4 u-boot-1.1.1/board/RM9200/at91rm9200_ether.c – добавление
драйвера LXT972
Добавление драйвера LXT972, требует обязательного редактирования
некоторых процедур в исходном тексте программы u-boot, в файле
u-boot-1.1.1/board/RM9200/at91rm9200_ether.c, связанных с работой
Ethernet контроллера.
Эти процедуры берутся из старшей версии u-boot-1.1.6 из файла
lxt971a.c
Также, необходимо сделать следующее:
 Скопировать header «AT91RM9200.h» с текущей версии Romboot.
 Переименовать его в AT91RM9200_all.h.
 Скопировать в u-boot-1.1.1/include/
 Добавить header в at91rm9200_ether.c:
#include <AT91RM9200_all.h>
 Исправить то, что по умолчанию, на следующее:
2007г. Инженер-электроник: Станислав Г. Приходько
– 53 –
Листинг программы, отображающий изменения в исходном тексте:
…
#ifdef CONFIG_PHY_IS_RTL8201
AT91S_PhyOps AT91S_Rtl8201Ops;
#elif defined (CONFIG_PHY_IS_LXT972)
AT91S_PhyOps AT91S_Lxt972Ops;
#else
AT91S_PhyOps AT91S_Dm9161Ops;
#endif
AT91PS_PhyOps pPhyOps;
…
// вставить процедуры из lxt971a.c
// эти процедуры и есть LXT972-драйвер !!!
//
#elif defined (CONFIG_PHY_IS_LXT972)
/*
* Name:
*
lxt972_IsPhyConnected
* Description:
*
Reads the 2 PHY ID registers
* Arguments:
*
p_mac - pointer to AT91S_EMAC struct
* Return value:
*
TRUE - if id read successfully
*
FALSE- if error
*/
unsigned int lxt972_IsPhyConnected (AT91PS_EMAC p_mac)
{
unsigned short Id1, Id2;
unsigned int dly;
2007г. Инженер-электроник: Станислав Г. Приходько
– 54 –
//printf ("lxt972_IsPhyConnected\n\r");
at91rm9200_EmacEnableMDIO (p_mac);
at91rm9200_EmacReadPhy (p_mac, PHY_COMMON_ID1, &Id1 );
at91rm9200_EmacReadPhy (p_mac, PHY_COMMON_ID2, &Id2);
at91rm9200_EmacDisableMDIO (p_mac);
if ((Id1 == (0x0013)) && ((Id2 & 0xFFF0) == 0x78E0))
{
//for (dly=0; dly<0x0000ffff; dly++){}
return TRUE;
}
else
{
//printf ("ID1-%X\n\r",Id1);
//printf ("ID2-%X\n\r",Id2);
}
return FALSE;
}
/*
* Name:
*
lxt972_GetLinkSpeed
* Description:
*
Link parallel detection status of MAC is checked and set in the
*
MAC configuration registers
* Arguments:
*
p_mac - pointer to MAC
* Return value:
*
TRUE - if link status set succesfully
*
FALSE - if link status not set
*/
2007г. Инженер-электроник: Станислав Г. Приходько
– 55 –
UCHAR lxt972_GetLinkSpeed (AT91PS_EMAC p_mac)
{
unsigned short stat1;
//printf ("lxt972_GetLinkSpeed\n\r");
if (!at91rm9200_EmacReadPhy (p_mac, PHY_LXT971_STAT2, &stat1))
return FALSE;
if (!(stat1 & PHY_LXT971_STAT2_LINK))
/* link status up? */
return FALSE;
if (stat1 & PHY_LXT971_STAT2_100BTX) {
if (stat1 & PHY_LXT971_STAT2_DUPLEX_MODE) {
printf ("lxt972_Speed 100M-Full\n\r");
/*set Emac for 100BaseTX and Full Duplex */
p_mac->EMAC_CFG |= AT91C_EMAC_SPD |
AT91C_EMAC_FD;
} else {
printf ("lxt972_Speed 100M-Half\n\r");
/*set Emac for 100BaseTX and Half Duplex */
p_mac->EMAC_CFG = (p_mac->EMAC_CFG &
~(AT91C_EMAC_SPD | AT91C_EMAC_FD))
| AT91C_EMAC_SPD;
}
return TRUE;
} else {
if (stat1 & PHY_LXT971_STAT2_DUPLEX_MODE) {
printf ("lxt972_Speed 10M-Full\n\r");
2007г. Инженер-электроник: Станислав Г. Приходько
– 56 –
/*set MII for 10BaseT and Full Duplex */
p_mac->EMAC_CFG = (p_mac->EMAC_CFG &
~(AT91C_EMAC_SPD | AT91C_EMAC_FD))
| AT91C_EMAC_FD;
} else {
printf ("lxt972_Speed 10M-Half\n\r");
/*set MII for 10BaseT and Half Duplex */
p_mac->EMAC_CFG &= ~(AT91C_EMAC_SPD |
AT91C_EMAC_FD);
}
return TRUE;
}
printf ("lxt972_Speed NO SET\n\r");
return FALSE;
}
/*
* Name:
*
lxt972_InitPhy
* Description:
*
MAC starts checking its link by using parallel detection and
*
Autonegotiation and the same is set in the MAC configuration registers
* Arguments:
*
p_mac - pointer to struct AT91S_EMAC
* Return value:
*
TRUE - if link status set succesfully
*
FALSE - if link status not set
*/
UCHAR lxt972_InitPhy (AT91PS_EMAC p_mac)
2007г. Инженер-электроник: Станислав Г. Приходько
– 57 –
{
UCHAR ret = TRUE;
//printf ("lxt972_InitPhy\n\r");
at91rm9200_EmacEnableMDIO (p_mac);
if (!lxt972_GetLinkSpeed (p_mac)) {
/* Try another time */
ret = lxt972_GetLinkSpeed (p_mac);
//printf ("lxt972_InitPhy - ERROR \n\r");
}
/* Disable PHY Interrupts */
at91rm9200_EmacWritePhy (p_mac, PHY_LXT971_INT_ENABLE, 0);
at91rm9200_EmacDisableMDIO (p_mac);
return (ret);
}
/*
* Name:
*
lxt972_AutoNegotiate
* Description:
*
MAC Autonegotiates with the partner status of same is set in the
*
MAC configuration registers
* Arguments:
*
dev - pointer to struct net_device
* Return value:
*
TRUE - if link status set successfully
*
FALSE - if link status not set
2007г. Инженер-электроник: Станислав Г. Приходько
– 58 –
*/
UCHAR lxt972_AutoNegotiate (AT91PS_EMAC p_mac, int *status)
{
unsigned short value;
//printf ("lxt972_AutoNegotiate\n\r");
/* Set lxt972 control register */
if (!at91rm9200_EmacReadPhy (p_mac, PHY_COMMON_CTRL, &value))
return FALSE;
/* Restart Auto_negotiation */
value |= PHY_COMMON_CTRL_RES_AUTO;
if (!at91rm9200_EmacWritePhy (p_mac, PHY_COMMON_CTRL, &value))
return FALSE;
/*check AutoNegotiate complete */
udelay (10000);
at91rm9200_EmacReadPhy (p_mac, PHY_COMMON_STAT, &value);
if (!(value & PHY_COMMON_STAT_AN_COMP))
return FALSE;
return (lxt972_GetLinkSpeed (p_mac));
}
…
Вставленная часть кода представляет собой нужный для данной платы
драйвер сетевой микросхемы.
9.5.5 u-boot-1.1.1/include/configs/RM9200.h - набор сетевых команд
В файле RM9200.h есть возможность выбирать конфигурацию
отдельных команд для u-boot.
2007г. Инженер-электроник: Станислав Г. Приходько
– 59 –
Листинг программы, отображающий изменения в исходном тексте:
…
(CONFIG_CMD_DFL | \
CFG_CMD_NET | \
CFG_CMD_PING | \
CFG_CMD_I2C | \
CFG_CMD_EEPROM \
& ~(CFG_CMD_BDI | \
CFG_CMD_FPGA | \
CFG_CMD_NAND \
)\
)
…
С полным списком возможных команд можно ознакомиться в файле u-boot-1.1.1/README
9.6 Компиляция u-boot-1.1.1
u-boot-1.1.1 с patch-ем от Дмитрия Черкашина ("Dmitriy I.Cherkashin" )
приходится собирать с GCC 2.95.3 (более новые версии GCC его не
собирают...).
В нашем случае ПО для сборки u-boot-1.1.1, называется – Toolchain-2.
Нужно распаковать u-boot-1.1.1 и использовать patch-файлы от
Черкашина.
9.6.1 Перечень программ и утилит для сборки u-boot-1.1.1
2007г. Инженер-электроник: Станислав Г. Приходько
– 60 –
arm-gcc-2.95.3.tgz
– GCC для сборки (уже пересобранный)
readme.u-boot.patches
– файл описания процесса патча
u-boot-EVM9200.patch
– Патч под кофигурацию сборки
dataflash-u-boot.bin
– Патч для SPI Dataflash
u-boot-1.1.1.tar.bz2
– исходный текст u-boot-1.1.1
u-boot-RM9200.diff
– Патч основной
Процесс установки патча и сборки обновленной конфигурации
u-boot-1.1.1 описан в файле readme.u-boot.patches.
9.6.2 Содержимое файла readme.u-boot.patches
Листинг файла, отображающий последовательность действий:
1. Files.
u-boot-RM9200.diff - RM9200 board support
u-boot-EVM9200.patch - EVM9200 board support
u-boot-1.1.1.tar.bz2 - u-boot version 1.1.1
Original version u-boot-RM9200.diff located at:
http://imsystems.ru/AT91RM9200
2. Install.
Copy files u-boot-1.1.1.tar.bz2, u-boot-RM9200.diff,
u-boot-EVM9200.patch to directory /opt and execute
following commands:
bash# cd /opt
bash# tar -xjvf ./u-boot-1.1.1.tar.bz2
bash# patch -p0 <./u-boot-RM9200.diff
bash# patch -p0 <./u-boot-EVM9200.patch
3. Configure & compile.
bash# cd /opt/u-boot-1.1.1
bash# make RM9200_config
bash# make
Resulting files:
u-boot.bin
- binary image
u-boot.bin.gz
- compressed binary image
/tftpboot/u-boot.bin.gz - compressed binary image in tftp server
files directory
4. Update target u-boot
4.1 Update target u-boot via kermit protocol
From console enter load binary image via Kermit protocol
command:
u->boot>loadb 20800000
2007г. Инженер-электроник: Станислав Г. Приходько
– 61 –
Where:
loadb - load binary image command
20800000 - RAM address
Send from the host file u-boot.bin.gz.
C-Kermit (Linux host) command line example
(serial cable connected to COM1):
bash# kermit -y ./.kermrc -i -b 115200 -l /dev/ttyS0 -s u-boot.bin.gz
Where, file .kermrc contain the following kermit settings:
SET CARRIER OFF
SET FLOW OFF
SET PREFIX ALL
Erase u-boot flash sector and copy u-boot image from RAM to flash
u-boot>protect off 10010000 1001FFFF
u-boot>erase 10010000 1001FFFF
u-boot>cp.b 20800000 10010000 FFFF
Where:
10010000 - u-boot sector start address
1001FFFF - u-boot sector end address
FFFF
- bytes to copy
Reboot target.
4.2 Update target u-boot via tftp (Ethernet)
Examle Linux host tftpd configuration file /etc/xinetd.d/tftp:
service tftp
{
socket_type
protocol
wait
user
server
server_args
disable
}
=
=
=
=
=
=
=
dgram
udp
yes
root
/usr/sbin/in.tftpd
-c -s /tftpboot
no
From console enter load binary image via tftp protocol command:
u-boot>tftpboot 20800000 u-boot.bin.gz
Erase u-boot flash sector and copy u-boot image
from RAM to flash:
u-boot>protect off 10010000 1001FFFF
u-boot>erase 10010000 1001FFFF
u-boot>cp.b 20800000 10010000 FFFF
Reboot target.
Для сохранения переменных окружения в dataflash нужно исправить
конфигурацию в файле include/configs/RM9200.h следующим образом:
 Установить:
2007г. Инженер-электроник: Станислав Г. Приходько
– 62 –
#define CFG_ENV_IS_IN_DATAFLASH
 Убедиться, что больше оно нигде не переопределено.
 Поправить адреса, для Ethernet. Не забыть о MAC-адресе
(u-boot его устанавливает, а ядро потом пользуется уже
установленным).
 Включить поддержку Dataflash:
#define CONFIG_HAS_DATAFLASH 1
 Поправить адрес конфигурации в Dataflash:
Листинг программы, отображающий изменения в исходном тексте:
#if defined(CFG_ENV_IS_IN_DATAFLASH)
#define CFG_ENV_OFFSET 0x28000
<--- вот тут
#define CFG_ENV_ADDR (CFG_DATAFLASH_LOGIC_ADDR_CS0 +
CFG_ENV_OFFSET)
#define CFG_ENV_SIZE 0x2000 /* 0x8000 */
9.7 Вычисление смещения карты памяти.
Карта памяти в EVM9200 ( для нашей конфигурации подходит ):
Листинг: Карта памяти:
Dataflash:
C000 0000 - romboot (32kb - 0x8000)
C000 8000 - u-boot (128kb - 0x20000)
C002 8000 - u-boot config (8kb - 0x2000)
C002 A000 - kernel (1240kb - 0x136000)
C016 0000 - initrd (2Mb - 0x200300)
2007г. Инженер-электроник: Станислав Г. Приходько
– 63 –
C036 0300 - filesystem (4.9Mb - 0x4DFD00) - обязательно должен начинаться с
нового сектора (адрес кратен 1056)
RAM:
2000 8000 - kernel (0x280000)
2028 8000 - initrd (0x500000)
20A0 0000 - compressed kernel (0x200000)
20C0 0000 - compressed initrd (0x200000)
20F0 0000 - u-boot
9.8 Правка Makefile
Нужно поправить Makefile на предмет переменной CROSS_COMPILE:
Для компиляции u-boot-1.1.1 - подправить Makefile
Листинг программы, отображающий изменения в исходном тексте:
…
ifeq ($(ARCH),arm)
#CROSS_COMPILE = arm-linux#CROSS_COMPILE = /usr/local/arm9/bin/arm-linuxCROSS_COMPILE = /opt/uClinux/bin/arm-elfEndif
…
9.9 Сборка u-boot-1.1.1
Сборка осуществляется путем набора нескольких команд.
bash# make distclean
2007г. Инженер-электроник: Станислав Г. Приходько
– 64 –
bash# make RM9200_config
bash# make
или
bash# make distclean && make RM9200_config && make
Если все удачно - получится файл u-boot.bin (gzip-версия не
понадобится, т.к. romboot не держит gzip..
9.10 Запись u boot 1.1.1 в DataFlash из Romboot
*----------------------------------------*
Enter: 1 c0008000
Download Dataflash [0xc0008000]
CCCCCCCCCCCC
Нужно выбрать файл romboot.bin и выбрать протокол передачи файлов
X-modem и отправить файл.
По завершению на экране терминала появится сообщение.
Modification of Arm Vector 6 :841a0bc
Write 95744 bytes in DataFlash [0xc0008000]
Hit a Key!aflash: OK
Теперь можно загрузить u-boot-1.1.1 (в меню Romboot выбрать пункт
"3"), после выбора начнет загружаться U-Boot.
9.11 Работа с u-boot-1.1.1 из DataFlash или RAM
2007г. Инженер-электроник: Станислав Г. Приходько
– 65 –
Теперь когда u-boot-1.1.1 скомпилирован, с ним можно начинать
работать.
Если u-boot-1.1.1 был загружен в DataFlash и Romboot его загрузил, то
загруженный u-boot-1.1.1 имеет следующий вид:
Рисунок 3 - командная строка u-boot-1.1.1
Перечень доступных команд можно узнать если напрать команду:
u-boot -> ?
Также, пользуясь документами: AT91RM9200DK U-Boot User Manual
и AT91RM9200DK U-Boot Developper Manual, можно ознакомиться с
возможностями программы u-boot.
2007г. Инженер-электроник: Станислав Г. Приходько
– 66 –
10 Linux KERNEL – Ядро OS Linux
10.1 Переменные окружения для сборки ядра
Для сборки ядра, нужно обязательно помнить о следующем правиле.
- всегда должны быть особые переменные.
Для начала установим переменные окружения для сборки toolchain-а:
bash# export TARGET=arm-linux
bash# export PREFIX=/usr/local/arm9
bash# export SYSROOT=${PREFIX}/sysroot
bash# export ARCH=arm
bash# export CROSS_COMPILE=${TARGET}bash# export PATH=$PATH:${PREFIX}/bin
или можно в консоли выполнить:
bash$ . ./env.sh
сам скрипт имеет содерживое
#! /bin/bash
export TARGET=arm-linux
export PREFIX=/usr/local/arm9
export SYSROOT=${PREFIX}/sysroot
export ARCH=arm
export CROSS_COMPILE=${TARGET}export PATH=$PATH:${PREFIX}/bin
ВНИМАНИЕ ! Нельзя просто запустить env.sh ! В этом случае создастся
новый шел для запуска и переменные окружения проживут в нем доли секунды,
пока исполняется сам env.sh. Обязательна команда ". " - это запуск шел-скрипта без
запуска дополнительного шела.
2007г. Инженер-электроник: Станислав Г. Приходько
– 67 –
10.2 Конфигурации ядра
Распаковываем ядро и накатываем требуемые патчи:
bash# bunzip2 -c linux-2.6.19.tar.bz2 | tar xv
bash# ln -s linux-2.6.19 linux
Далее необходимо использовать patch-файл для 2.6.19-at91.patch от
maxim (http://maxim.org.za/AT91RM9200/2.6/).
Патчить следующим методом:
bash# patch –p1<./2.6.19-at91.patch
Делаем конфиг для требуемой платформы. У меня это так:
bash# make at91rm9200dk_defconfig
bash# make include/linux/version.h
На ошибки внимания не обращаем. – это так надо :)
Теперь копируем include-файлы:
bash# mkdir -p ${SYSROOT}/usr/include
bash# cp -a ${PREFIX}/src/linux/include/linux ${SYSROOT}/usr/include/linux
bash# cp -a ${PREFIX}/src/linux/include/asm-arm ${SYSROOT}/usr/include/asm
bash# cp -a ${PREFIX}/src/linux/include/asm-generic ${SYSROOT}/usr/include/asm-generic
10.3 Подготовка к компиляции
Не забываем исправить arch/arm/mach-at91rm9200/ на предмет своей
переферии.
2007г. Инженер-электроник: Станислав Г. Приходько
– 68 –
1. Кол-во используемых uart-ов описывается в файле ядра
описывающий особенности аппаратуры - arch/arm/mach-at91rm9200/board-dk.c:
….
/*
* Serial port configuration.
* 0 .. 3 = USART0 .. USART3
* 4
= DBGU
*/
static struct at91_uart_config __initdata dk_uart_config = {
.console_tty = 0,
.nr_tty
/* ttyS0 */
= 2,
.tty_map
= { 4, 1, -1, -1, -1 }
/* ttyS0, ..., ttyS4 */
};
…
Если требуется изменить параметры инициализации портов (например
включить режим RS485) - смотрим в arch/arm/mach-at91rm9200/devices.c. Там
находится код инициализации уартов.
2. В файле arch/arm/mach-at91rm9200/board-dk.c надо поправить
строчку описания машины.
Иначе на EVM9200 не запустится и будет орать о неверном коде
платформы: поменять:
MACHINE_START(AT91RM9200DK, "Atmel AT91RM9200-DK")
на:
MACHINE_START(AT91RM9200, "uCrouter EVM9200")
Это если сборка как EVM9200.
2007г. Инженер-электроник: Станислав Г. Приходько
– 69 –
У нас (в нашей случае) в конечном итоге собрано как
"Atmel AT91RM9200-DK" и поставлено в ядре:
MACHINE_START(AT91RM9200DK, "Atmel AT91RM9200-DK")
Некорректно настроенный это кусок – приводит к ошибке при загрузке ядра:
Starting kernel ...
Error: unrecognized/unsupported machine ID (r1 = 0x000000fb).
Available machine support:
ID (hex) NAME
00000106 uCrouter EVM9200
Please check your kernel config and/or bootloader
В этом случае нужно проверять, все ли в порядке настроено в файлах
исходниках ядра.
Вот здесь сказано, как нужно чинить такую проблему:
http://lists.arm.linux.org.uk/pipermail/linux-arm/2005-August/010446.html
> Error: unrecognized/unsupported machine ID (r1 = 0x000000fb).
>
> Available machine support:
>
> ID (hex) NAME
> 00000106 Atmel AT91RM9200-DK
> 000002c1 Atmel AT91RM9200-EK
2007г. Инженер-электроник: Станислав Г. Приходько
– 70 –
this kind of error message happens if the machine ID which is set
in U-Boot doesn't match the kernel's ID(s). Unfortunately a
standard U-Boot sets the machine ID on AT91RM9200DK boards not to
MACH_TYPE_AT91RM9200DK but to the generic
MACH_TYPE_AT91RM9200.
You can either this in board/at91rm9200dk/at91rm9200dk.c; I would
recommend to obtain a new machine ID and create your own U-Boot
board type, using board/at91rm9200dk as a template. The list of
machine IDs can be found in include/asm-arm/mach-types.h.
The Linux kernel has to be changed accordingly to the above machine
ID. There you can find the information in
arch/arm/tools/mach-types
arch/arm/boot/compressed/head-at91rm9200.S
arch/arm/mach-at91rm9200/board-dk.c
3. Если хочется использовать две Dataflash на плате - то первую вешаем
на CS0 (с нее будет идти загрузка). Вторую вешаем на CS3. Для поддержки
второй флэшки надо включить поддержку "Dataflash Card" в ядре.
10.4 Конфигурация
Делаем команду
bash# make menuconfig
Конфигурируем ядро.
От того как верно ядро будет сконфигурировано, зависит следующее –
загрузится ли вообще ядро и загрузит ли файловую систему (ФС).
2007г. Инженер-электроник: Станислав Г. Приходько
– 71 –
Важно корректно выбрать следующее:
- Тип архитектуры и процессор
- включить RAM disk support
- включить Initial RAM filesystem and RAM disk (initramfs/initrd) support
- указать строку загрузки ядра COMMAND_LINE
root=/dev/ram rw
mtdparts=AT45DB642.spi0:0x2a000(boot)ro,0x136000(kernel)ro,
0x200300(initrd)ro,-(filesystem) console=ttyS0,115200 mem=64M debug
init=/linuxrc
Также нужно отредактировать исходные тексты в самом ядре, почти все
конфигурируется в файлах, внутри директории - linux-2.6.20/arch/arm/machat91rm9200.
10.5 Редактирование исходного текста
Для подключения пользовательского светодиода LD1, тот что на плате,
нужно в файле linux/arch/arm/mach-at91rm9200/board-dk.c ( Здесь
настраиваются основные и начальные возможности платы и работы ядра с
платой )
10.5.1 Подключение конструктивного исполнения контроллера
static void __init dk_map_io(void)
{
/* Initialize processor: 18.432 MHz crystal */
//
at91rm9200_initialize(18432000, AT91RM9200_BGA); // default
at91rm9200_initialize(18432000, AT91RM9200_PQFP); // veter
…
…
}
Эти значения (AT91RM9200_BGA или AT91RM9200_PQFP), берутся из
файла linux-2.6.20/arch/arm/mach-at91rm9200/generic.h
2007г. Инженер-электроник: Станислав Г. Приходько
– 72 –
…
/* GPIO */
#define AT91RM9200_PQFP
3
/*
AT91RM9200
PQFP
package has 3 banks */
#define AT91RM9200_BGA
4
/* AT91RM9200 BGA package has
4 banks */
…
10.5.2 Подключение светодиода
нужно исправить:
static void __init dk_map_io(void)
{
…
…
/* Setup the LEDs */
//
at91_init_leds(AT91_PIN_PB2, AT91_PIN_PB2);
at91_init_leds(AT91_PIN_PB27, AT91_PIN_PB27); // veter
…
…
}
static struct at91_gpio_led dk_leds[] = {
{
.name
//
= "led0",
.gpio
= AT91_PIN_PB2,
.gpio
= AT91_PIN_PB27, // veter
.trigger
= "timer",
}
};
2007г. Инженер-электроник: Станислав Г. Приходько
– 73 –
Для того, что бы это светодиод использовать как индикатор работы
ядра, назначить ему нужно при конфигурировании в разделе Kernel Features
пункты
«Timer and CPU usage LEDs»
«Timer LED»
«CPU usage LED»
Больше нет у нас пользовательских светодиодов, но возможность их
использования есть в системе.
Device Drivers/ LED devices/
[*] LED Suppor
[*] LED Class Support
--- LED drivers
--- LED Triggers
[*] LED Trigger support
[*] LED Timer Trigger
[*] LED Heartbeat Trigger
10.5.3 Подключение Ethernet контроллера
static struct at91_gpio_led dk_leds[] = {
{
.name
//
= "led0",
.gpio
= AT91_PIN_PB2,
.gpio
= AT91_PIN_PB27, // veter
.trigger
= "timer",
}
};
static void __init dk_board_init(void)
{
/* Serial */
2007г. Инженер-электроник: Станислав Г. Приходько
– 74 –
at91_add_device_serial();
/* Ethernet */
at91_set_gpio_output(AT91_PIN_PB23, 0); // veter // ET_ENABLE
at91_add_device_eth(&dk_eth_data);
…
…
}
10.5.4 Подключение Dataflash
static struct spi_board_info dk_spi_devices[] = {
{
/* DataFlash chip */
.modalias = "mtd_dataflash",
.chip_select
= 0,
.max_speed_hz
= 15 * 1000 * 1000,
},
//
{
/* UR6HCPS2-SP40 PS2-to-SPI adapter */
//
.modalias = "ur6hcps2",
//
.chip_select
= 1,
//
.max_speed_hz
= 250 * 1000,
//
},
//
{
/* TLV1504 ADC, 4 channels, 10 bits; one is a temp sensor */
//
.modalias = "tlv1504",
//
.chip_select
= 2,
//
.max_speed_hz
= 20 * 1000 * 1000,
//
},
//#ifdef CONFIG_MTD_AT91_DATAFLASH_CARD
{
/* DataFlash card */
.modalias = "mtd_dataflash",
//
.chip_select
= 3,
.chip_select
= 1, // veter
.max_speed_hz
= 15 * 1000 * 1000,
}
2007г. Инженер-электроник: Станислав Г. Приходько
– 75 –
//#endif
};
10.6 Компиляция ядра
Сборка ядра осуществляется командой: make
bash# make
пример:
[email protected]:linux# make
scripts/kconfig/conf -s arch/arm/Kconfig
CHK
include/linux/version.h
SYMLINK include/asm-arm/arch -> include/asm-arm/arch-at91rm9200
make[1]: `include/asm-arm/mach-types.h' не требует обновления.
CHK
include/linux/utsrelease.h
CHK
include/linux/compile.h
CC
arch/arm/kernel/setup.o
LD
arch/arm/kernel/built-in.o
GZIP
kernel/config_data.gz
IKCFG kernel/config_data.h
CC
kernel/configs.o
LD
kernel/built-in.o
GEN
.version
CHK
include/linux/compile.h
UPD
include/linux/compile.h
CC
init/version.o
LD
init/built-in.o
LD
.tmp_vmlinux1
KSYM
.tmp_kallsyms1.S
AS
.tmp_kallsyms1.o
LD
.tmp_vmlinux2
2007г. Инженер-электроник: Станислав Г. Приходько
– 76 –
KSYM
.tmp_kallsyms2.S
AS
.tmp_kallsyms2.o
LD
vmlinux
SYSMAP System.map
SYSMAP .tmp_System.map
MODPOST vmlinux
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
GZIP
arch/arm/boot/compressed/piggy.gz
AS
arch/arm/boot/compressed/piggy.o
LD
arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
You have new mail in /var/mail/root
[email protected]:build# ./build_Image_FS.sh
После сборки получится готовое ядро. Лежать оно должно по
следующему пути
linux/arch/arm/boot/zImage
В ранее собранном U-boot должен был также собраться файл mkimage,
который нужен теперь для подготовки ядра и Файловой системы к загрузке в
ARM.
10.7 Конечная сборка ядра и инсталляция
Тут все - как при сборке ядра под компьютер:
bash# cd ${PREFIX}/src/linux
bash# make Image
bash# make modules
2007г. Инженер-электроник: Станислав Г. Приходько
– 77 –
bash# make INSTALL_MOD_PATH=${SYSROOT} modules_install
Это нужно делать, когда уже окончательная сборка + инсталляция, пока не
стоит торопиться выполнять эти 3 последние команды.
10.8 Скрипт для сборки сжатых образов
#!/bin/bash
#=========================
#[email protected]:build# ./mkimage --help
#Usage: ./mkimage -l image
#
#
-l ==> list image header information
./mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d
data_file[:data_file...] image
#
-A ==> set architecture to 'arch'
#
-O ==> set operating system to 'os'
#
-T ==> set image type to 'type'
#
-C ==> set compression type 'comp'
#
-a ==> set load address to 'addr' (hex)
#
-e ==> set entry point to 'ep' (hex)
#
-n ==> set image name to 'name'
#
-d ==> use image data from 'datafile'
#
-x ==> set XIP (execute in place)
#=========================
echo " Create KERNEL "
rm -rf Image.gz
cp ./linux/arch/arm/boot/Image ./
gzip ./Image
./mkimage -A arm -O linux -C gzip -a 0x20008000 -e 0x20008000 -d Image.gz kernel
#./mkimage -A arm -O linux -C none -a 0x20007fc0 -e 0x20008000 -d Image.lnk uImage
# lelick 20007fc0
#=========================
2007г. Инженер-электроник: Станислав Г. Приходько
– 78 –
echo " Create FS "
./mkimage -A arm -O linux -C gzip -T ramdisk -a 0x20288000 -d rm9200fs.ext2.gz fs
10.9 Результат сборки образов из скрипта
[email protected]:build# ./build_Image_FS.sh
Create KERNEL
Image Name:
Created:
Wed Mar 7 10:20:30 2007
Image Type: ARM Linux Kernel Image (gzip compressed)
Data Size:
631800 Bytes = 616.99 kB = 0.60 MB
Load Address: 0x20008000
Entry Point: 0x20008000
Create FS
Image Name:
Created:
Wed Mar 7 10:20:30 2007
Image Type: ARM Linux RAMDisk Image (gzip compressed)
Data Size:
1812491 Bytes = 1770.01 kB = 1.73 MB
Load Address: 0x20288000
Entry Point: 0x20288000
Должны получиться 2 файла
kernel
fs
где,
kernel – это ядро
fs – это файловая система
2007г. Инженер-электроник: Станислав Г. Приходько
– 79 –
11 Linux USB File System – USB Файловая система
2007г. Инженер-электроник: Станислав Г. Приходько
– 80 –
12 Linux USB File System – MMC Файловая система
12.1 Создание файла устройства
mknod -m 777 /mnt/fff/dev/mmcblk0 b 254 0
mknod -m 777 /mnt/fff/dev/mmcblk0p1 b 254 1
2007г. Инженер-электроник: Станислав Г. Приходько
– 81 –
13 Linux File System – Файловая система
13.1 Использование корректно пре-собранной файловой системы.
Для старта дистрибутива, можно использовать пре-собранную ФС, с
сайта с статьей от heavy-online
Как собирается и создается файловая сисима будет описано в
разделе - «MTD Linux File System - Файловая система на DataFlash».
2007г. Инженер-электроник: Станислав Г. Приходько
– 82 –
14 MTD Linux File System - Файловая система на DataFlash
[[email protected]_SK /]$dd if=/dev/mtd2 of=/mnt/mtd2 bs=1k count=8000
[[email protected]_SK /]$chmod 777 /dev/mtd2
[[email protected]_SK /]$mkfs.ext2 /mnt/mtd2
[[email protected]_SK /]$dd if=/mnt/mtd2 of=/dev/mtdblock2
[[email protected]_SK /]$mount -o loop /dev/mtdblock2 /fs/
[[email protected]_SK /]$mkdir /fs/test
[[email protected]_SK /]$umount /fs/
[[email protected]_SK /]$mount -o loop /dev/mtdblock2 /fs/
[[email protected]_SK /]$ll /fs/
drwxr-xr-x
4 root
root
1024 Jan 1 01:16 ./
drwxr-xr-x 16 root
root
1024 Jan 1 00:50 ../
drwx-----drwxr-xr-x
2 root
2 root
root
root
12288 Jan 1 00:18 lost+found/
1024 Jan 1 01:16 test/
[[email protected]_SK /]$
[[email protected]_SK /]$mount
/dev/root on / type ext2 (rw)
/proc on /proc type proc (rw)
none on /dev/pts type devpts (rw)
/dev/sda1 on /mnt type msdos (rw,fmask=0022,dmask=0022,codepage=cp866)
/dev/mtdblock2 on /fs type ext2 (rw)
[[email protected]_SK /]$
2007г. Инженер-электроник: Станислав Г. Приходько
– 83 –
15 Linux Configuration – Конфигурация Дистрибутива
15.1 Установка и настройка платы AT91RM9200_SK
Ядро проверят верность указанного ARP, а так как при загрузке
u-boot назаначает ARP, то корректно в нем нужно его указать для
корректного старта системы с сетью, с конкренным ARP адресом.
Например:
[[email protected]_SK /]$ifconfig eth0 192.168.1.123 netmask 255.255.255.0
broadcast 192.168.1.255 hw ether 00:11:22:33:44:55 up
SIOCSIFFLAGSeth0: Setting MAC address to 00:11:22:33:44:55
: Cannot assigeth0: Link now 100-FullDuplex
n requested address
[[email protected]_SK /]$ifconfig
eth0
Link encap:Ethernet HWaddr 00:11:22:33:44:55
inet addr:192.168.1.123 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:346 (346.0 B) TX bytes:0 (0.0 B)
Interrupt:24 Base address:0xc000
lo
Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Устанавливаемый явным образом ARP адрес 00:11:22:33:44:55 – имеет
верное значение. Начинается с 00.
2007г. Инженер-электроник: Станислав Г. Приходько
– 84 –
[[email protected]_SK /]$ping server
PING server (192.168.1.1): 56 data bytes
84 bytes from 192.168.1.1: icmp_seq=0 ttl=64 time=0.9 ms
Если ARP адрес будет указан не верный, будет сообщение об ошибку
инициализации Ethernet интерфейса, например
[[email protected]_SK /]$ifconfig eth0 192.168.1.123 netmask
255.255.255.0 broadcast 192.168.1.255 hw ether 11:22:33:44:55:66 up
eth0: Link now 100-FullDuplex
SIOCSIFHWADDR: Cannot assign requested address
[[email protected]_SK /]$
Устанавливаемый явным образом ARP адрес 11:22:33:44:55:66 – имеет
недопустимое значение.
2007г. Инженер-электроник: Станислав Г. Приходько
– 85 –
16 Linux Tune – Настройка под конечную цель
16.1
2007г. Инженер-электроник: Станислав Г. Приходько
Скачать