Инсталляция Linux на ARM9 микроконтроллер AT91RM9200

В 2007м году мне приходилось разрабатывать одно устройство на базе ARM9 микроконтроллере AT91RM9200, в тот момент была написана инструкция. Правда написана была не полностью. но тем не менее на 95% завершена, а потом мне просто стало лень ее дописывать… В общем, дабы не затерялась полезная наработка я ей решил поделиться, ага, 5 лет спустя…

Также прицеплю *.doc файл оригинал, чуть ниже. Всё дело в том что в оригинальном документе также присутсвуют скриншоты и рисунки…

 Инсталляция OS Linux на аппаратную платформу AT91RM9200_SK с микроконтроллером AT91RM9200

(Используя макетную плату на базе процессора – AT91RM9200)

Инженер-электроник:  Приходько С. Г.

 Харьков 2007

Содержание

 1 Список используемых терминов, сокращений. 6

2 Используемый стиль   7

3 Список используемой литературы. 8

4 Описание процессора AT91RM9200  9

4.1 Микроконтроллер на основе процессора ARM920T ™    9

4.2 Структурная схема микроконтроллера AT91RM9200: 12

4.3 Общее описание: 12

5 Структурная схема разрабатываемой аппаратной платформы   15

5.1 структурная схема. 15

6 Необходимый перечень ПО   16

6.1 Используемое ПО в процессе компиляции  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: 18

7 Настройка периферии   19

7.1 Тактовая частота процессора и памяти. 19

8 Romboot  23

8.1 Назначение  23

8.2 Выполняемые действия программой  23

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  48

9.5 Драйвер Ethernet — LXT972  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

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 Создание файла устройства  80

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

13.1 Использование корректно пре-собранной файловой системы. 81

14 MTD Linux File System ‑ Файловая система на DataFlash   82

15 Linux Configuration – Конфигурация Дистрибутива  83

15.1 Установка и настройка платы AT91RM9200_SK   83

16 Linux Tune – Настройка под конечную цель   85

16.1  85

1 Список используемых терминов, сокращений.

Toolchain               Кросс-платформенная система сборки и компиляции, набор утилит для сборки.

Datasheet               Техническое описание

ПО                         Программное обеспечение

Patch                      Программа исправлений, файл с исправлениями;

Скрипт                  Программа, выполняющая последовательность действий;

Dataflash               Последовательная (SPI) энергонезависимая память

GCC                      GNU project C and C++ compiler

tar                          The GNU version of the tar archiving utility

UNIX, Linux  Операционная система

Дистрибутив ядра с файловой системой

2 Используемый стиль

Вид в документе        Пояснение, назначение

RTFM                         – Сокращения, выделение, специфика названия;

http://www.ru/     – ссылка;

пример                        – Приводимый пример, заметки, пояснения;

сноска                         – сноска, заметка

программ/пакетов       – или ( программ или пакетов )

 Описываются в документе UNIX-shell команды. При написании использоваться могут разные стили.

Например: команда bash# ps  равносильно # ps или ps

Если команда имеет схожее с пакетом имя, то пакет выделяется жирным шрифтом.

Например: top(команда) и top(пакет).

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%20KTARM9200.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/

 

4 Описание процессора AT91RM9200

 

4.1 Микроконтроллер на основе процессора ARM920T ™

 

Отличительные особенности:

  • Включает в себя процессор ARM920T ™ ARM ® Thumb ®
  • Производительность 200 млн. опер. в сек. при 180 MГц
  • 16-кбайт кэш-памяти данных, 16 кбайт кэш-памяти инструкций, буфер записи
  • Блок управления памятью
  • Среднеуровневая реализация встроенной макроячейки трассировки (только в 256-выводном BGA корпусе)
  • Дополнительная встроенная память
  • 16 кбайт статического ОЗУ и 128 кбайт ПЗУ
  • Интерфейс внешней шины (EBI)
  • Поддержка синхронных динамических ОЗУ (SDRAM), статической памяти, флэш-памяти с пакетным режимом передачи, соединение с устройствами памяти CompactFlash ® , SmartMedia ™ и NAND Flash
  • Периферийные устройства :
  • Расширенный генератор импульсов и контроллер управления энергопотреблением
  • Два встроенных генератора с фазовой автоподстройкой частоты
  • Режим пониженной частоты синхронизации и возможность программной оптимизации энергопотребления
  • Четыре программируемых сигналов внешних синхроимпульсов
  • Системный таймер, обеспечивающий генерацию периодических прерываний, функцию охранного таймера и вторичного счетчика
  • Часы реального времени с функцией будильника и генерацией запроса на прерывание при его срабатывании
  • Блок отладки, 2-проводное устройство асинхронной приемопередачи (УАПП) и поддержка канала связи для отладки
  • Развитый контроллер прерываний с 8-уровневыми приоритетами, индивидуально маскируемые источники прерываний, дополнительная защита прерываний внешних источников запросов на прерывание и один скоростной источник запроса прерывания
  • Четыре 32-разрядных порта ввода-вывода с общим числом программируемых линий ввода-вывода до 122, генерация прерывания при изменении входных сигналов и возможность настройки на открытый сток для каждой линии
  • 20- канальный контроллер периферийных данных (прямой доступ к памяти ПДП = DMA)
  • Локальная сеть MAC 10/100 Base-T
  • Интерфейс независимых информационных средств (MII) и сокращенный интерфейс независимых информационных средств (RMII)
  • Интегрированные 28-байтный буфер FIFO и каналы ПДП для приема и передачи
  • Полноскоростной главный сдвоенный порт USB 2.0 (12 Мбит/с)
  • Два встроенных приемопередатчика (для 208-выв. корпуса PQFP только один)
  • Встроенный буфер FIFO и каналы ПДП
  • Полноскоростной USB 2.0 порт устройства (12 Мбит/с)
  • Встроенный приемопередатчик, интегрированный буфер FIFO объемом 2 кБ и возможностью конфигурации
  • Интерфейс плат информационных средств(MCI)
  • Автоматическое управление протоколом связи и быстродействующая автоматическая передача данных
  • Совместимость с картами памяти MMC и SD, поддержка до двух карт памяти SD
  • Три синхронных последовательных контроллера(SSC)
  • Независимые сигналы тактовых импульсов (Clock) и синхронизации посылки (Frame Sync) для каждого приемника и передатчика
  • Поддержка аналогового интерфейса I2S, поддержка временного уплотнения
  • Возможность высокоскоростной непрерывной передачи данных потоком с 32-разрядным представлением данных
  • Четыре универсальных синхронно-асинхронных приемопередатчиков (УАПП = USART)
  • Поддержка электронных карт стандарта ISO7816 T0/T1
  • Аппаратное и программное подтверждение связи
  • Поддержка RS485, инфракрасного порта связи со скоростью до 115 кбит/с –Все управляющие линии модема для УАПП №1
  • Главный/подчиненный периферийный интерфейс(SPI)
  • –Программируемая длина данных ( 8 — 16 бит), 4 внешних выбора периферийных микросхем
  • Два 3-канальных, 16-разрядных таймера-счетчика (TC)
  • Три внешних входа тактирования, два вывода ввода-вывода на канал для различного назначения
  • Двойной генератор с широтно-импульсной модуляцией (ШИМ), Режимы захвата фронтов и генератора, возможность прямого и обратного счета
  • Двухпроводной интерфейс (TWI)
  • Поддержка режима «главный» (Master), поддержка всех двухпроводных ЭППЗУ (EEPROM) фирмы Atmel
  • Поиск IEEE 1149.1 JTAG на всех цифровых выводах
  • Напряжение питания
  • 1.65В — 1.95В для VDDCORE, VDDOSC и VDDPLL
  • 1.65В — 3.6В для VDDIOP (периферийный ввод-вывод) и для VDDIOM (ввод-вывод памяти)
  • Доступность в 208-выводном PQFP или 256-выводном BGA корпусах

 

4.2 Структурная схема микроконтроллера AT91RM9200:

Рисунок 1 – структурная схема процессора AT91RM9200

 

4.3 Общее описание:

AT91RM9200 – завершенная однокристальная система, построенная на основе процессора ARM920T ARM Thumb. Включает в себя богатый набор системных и прикладных внешних устройств и стандартных интерфейсов, тем самым предлагая решить широкий диапазон компьютерно-ориентированных задач на основе одной микросхемы, где требуется добиться большого числа функций при малом энергопотреблении и при самой низкой стоимости.

AT91RM9200 включает в себя быстродействующее рабочее пространство статической памяти и внешний шинный интерфейс (EBI) с низким временем ожидания для связи с внешней памятью любой конфигурации и внешними устройствами. EBI включает в себя контроллеры синхронного динамического ОЗУ (СДОЗУ), флэш-памяти с пакетным режимом и статических ОЗУ, а также схему, облегчающую подключение к модулям памяти SmartMedia, CompactFlash и NAND Flash.

Усовершенствованный контроллер прерываний (AIC) увеличивает возможности процессора ARM920T по обработке прерываний за счет много‑векторности, приоритетности источников прерываний и сокращения времени перехода к программе обслуживания прерывания.

Периферийный контроллер данных (PDC) обеспечивает каналы ПДП (прямой доступ к памяти) для всех внешних устройств с последовательных интерфейсом, позволяя им передавать данные во встроенную или внешнюю память без вмешательства процессора. Это уменьшает нагрузку на процессор, при передаче непрерывных потоков данных. Преимуществом AT91RM9200 является наличие двух указателей, которые позволяют организовать безразрывную передачу данных.

Набор контроллеров параллельного ввода-вывода позволяют настроить линии ввода-вывода на использование в качестве порта ввода-вывода общего назначения или на альтернативную функцию (входы-выходы встроенных периферийных устройств). Кроме того, имеется возможность настройки для каждой линии на генерацию запроса на прерывание при изменениях сигнала, организацию выхода с открытым стоком и подключение привязочного резистора к плюсу питания.

Контроллер управления энергопотреблением (PMC) позволяет поддерживать на минимуме потребление энергии за счет выборочного включения/выключения процессора и различных периферийных устройств под управлением программного обеспечения. Используется также регулируемый тактовый генератор, который позволяет выбрать частоту синхронизации, в т.ч. режим пониженной частоты (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

 

5 Структурная схема разрабатываемой аппаратной платформы

 

Структурная схема описывает по блокам – устройства на плате, периферию, зарезервированные возможности.

 

5.1 структурная схема.

 

Рисунок 2 – Структурная схема платы AT91RM9200_SK

 

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 (исходный текст с исправлениями для ядра)

Ссылка:

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/

 

6.3 Установка и настройка tftpd

 

tftpdtftp сервер, используется для передачи файлов от компьютера в 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 устанавливается и конфигурируется, как требует этого система.

7 Настройка периферии

 

7.1 Тактовая частота процессора и памяти.

 

Тактовая частота, должна быть корректно задана и используется в дальнейшем в программе u-boot и при загрузке ядра Linux.

В файле main.cpp программы u-boot, должна быть строка в место той, что по умолчанию:

#define AT91C_PLLA_VALUE        0x2024be04 // -> 170,496MHz

Значение 0x2024be04 задает частоту.

Тактовая частота процессора получается методом программирования нескольких регистров блока PMC.

Рисунок — Power Management Controller Block Diagram

Детальное описание этого регистра описано в 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 should 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:

//* -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.

Рисунок – Программа-калькулятор расчета значений номиналов элементов R1, C1 и C2 процессора AT91RM9200.

Рисунок – Программа-калькулятор расчета тактовой частоты процессора и значений номиналов элементов R1, C1 и C2.

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, нужно взять программу от производителя AtmelRomboot.

Правленая версия под плату EVM9200 доступна по адресу: http://heavy‑online.ru/arm‑linux/files/packages/romboot/romboot-evm9200.tgz .

( схема EVM9200 похожа на используемую схему нами )

Теперь необходимо вносить нужные изменения и компилировать программу Romboot.

  • Необходимо, распаковать пакет 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 key 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-память

Описание выбора тактовой частоты процессора в разделе – Тактовая частота процессора и памяти.

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            44928000

#define AT91C_BAUD_RATE                 115200

#define AT91C_DOWNLOAD_BASE_ADDRESS     0x20000000

#define AT91C_DOWNLOAD_MAX_SIZE         0x00020000

#define AT91C_OFFSET_VECT6          0x14     //* Offset for ARM vector 6

#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

Листинг программы, отображающий изменения в исходном тексте для указания тактовой частоты процессора и памяти:

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.

Вот его описание:

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

        {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 */

                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 in PIO mode */

//              AT91C_BASE_PIOB->PIO_OER = AT91C_PIO_PB7;       /* 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 in PIO mode */

                AT91C_BASE_PIOB->PIO_OER = AT91C_PIO_PB7;       /* 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);

                break;

        }

 

        /* SPI_Enable */

        AT91C_BASE_SPI->SPI_CR = AT91C_SPI_SPIEN;

}

 

8.8 Компиляция программы Romboot

 

Свободно компилируется используя toolchain-1.

  • Для компиляции, запустить на исполнение скрипт из консоли:

root@server:AT91RM9200_SK_RomBoot_070302# ./compile

   text    data     bss     dec     hex filename

  10795      44     656   11495    2ce7 romboot.out

root@server: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.
  • Теперь, скомпилированный и  настроенный 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:

На терминале это выглядит так:

Для этого нужно дать команду: «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-а.

 

ВНИМАНИЕ!!!

Если Вам не нужен процесс автоматического запуска u-boot-а, а требуется выйти в меню romboot-, необходимо в течение секунды после появления приглашения нажать любую кнопку.

Если секунды мало (или много), можно изменить это время. Для этого нужно отредактировать исходный текст Romboot, как это сказано в «разделе main.cpp: правка времени ожидания», затем Romboot необходимо пересобрать и вновь зашить в Dataflash.

 

 

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.

Листинг программы, отображающий изменения в исходном тексте для изменения номера архитектуры :

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 <roman@imsystems.ru>

* Industrial Monitoring Systems, Ltd

*

* 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 License 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 */

 

#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  1              /* Hardware I2C interface */

#define    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             /* Let’s change ethaddr */

#define CONFIG_MISC_INIT_R              /* 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                   /* Master clock 45Mhz */

#define AT91C_MASTER_CLOCK    44928000  /* peripheral clock (AT91C_MAIN_CLOCK/3)*/

#else                                                      /* MASTER_CLOCK_45 */

#ifdef  MASTER_CLOCK_60

#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       /* slow clock */

 

#define CONFIG_RM9200               1     /* 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

#define CFG_AT91C_BRGR_DIVISOR    33    /* hardcode so no __divsi3 : AT91C_MASTER_CLOCK / baudrate / 16 */

#endif                                                    /* MASTER_CLOCK_60 */

#endif

 

/*

* Hardware drivers

*/

#undef    CONFIG_HWFLOW                 /* don’t include RTS/CTS flow control support */

 

#undef    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; bootm 20008000»

//#define CONFIG_BOOTCOMMAND              «cp.b C002A000 20A00000 200000; bootm 20A00000»

//#define CONFIG_BOOTCOMMAND              «cp.b C002A000 20008000 200000; bootm 20008000»

#define CONFIG_BOOTCOMMAND                «cp.b C002A000 20A00000 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»

#define    CONFIG_AUTOBOOT_STOP_STR2  «uboot»

#define CONFIG_ZERO_BOOTDELAY_CHECK      1

//#define CONFIG_BOOTARGS       «root=/dev/ram rw initrd=0x20288000,0x500000 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 rw initrd=0x20288000,0x500000 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                   255.255.255.0

#define CONFIG_IPADDR                      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

#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

#define CFG_PROMPT_HUSH_PS2 «> «

 

#define CFG_MAX_NAND_DEVICE        1      /* Max number of NAND devices             */

#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 = AT91C_PIO_PC0;} while(0)

#define NAND_ENABLE_CE(nand) do { *AT91C_PIOC_CODR = 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)

#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      1

#define PHYS_SDRAM            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

#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     /* Logical adress for CS0 */

#define CFG_DATAFLASH_LOGIC_ADDR_CS3      0xD0000000     /* 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

#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    0

#define CFG_ENV_SIZE  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 */

#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    =>   uninitialised

* env_crc_valid  > 0    =>   environment crc in flash is valid

* 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 производится следующим методом:

Нужно произвести изменения в исходном тексте.

Описание CS1 сигнала:

//#define AT91C_SPI_PCS3_DATAFLASH_CARD         0x7     /* Chip Select 3 : NPCS3 %0111 */

#define AT91C_SPI_PCS1_DATAFLASH_CARD           0xD     /* Chip Select 3 : 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

Версия 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-файл, как описывалось выше, вносит изменения в процедуры, которые нужны для других драйверов, но не для нашего.

Листинг программы, отображающий изменения в исходном тексте:

#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 (разрешение работы микросхемы драйвера сети).

Для полного включения 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>

  • Исправить то, что по умолчанию, на следующее:

Листинг программы, отображающий изменения в исходном тексте:

#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;

 

//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

 */

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»);

                        /*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)

{

        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

 */

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.

Листинг программы, отображающий изменения в исходном тексте:

                       (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

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

 

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                 = dgram

         protocol                      = udp

         wait                            = yes

         user                             = root

         server                          = /usr/sbin/in.tftpd

         server_args                 = -c -s /tftpboot

         disable                                   = 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 следующим образом:

 

  • Установить:

#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)

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-linux-

CROSS_COMPILE = /opt/uClinux/bin/arm-elf-

Endif

9.9 Сборка u‑boot‑1.1.1

Сборка осуществляется путем набора нескольких команд.

bash# make distclean

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

Теперь когда 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.

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. Обязательна команда «. » — это запуск шел-скрипта без запуска дополнительного шела.

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/ на предмет своей переферии.

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,                            /* ttyS0 */

        .nr_tty         = 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.

У нас (в нашей случае) в конечном итоге собрано как «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

 

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

Конфигурируем ядро.

От того как верно ядро будет сконфигурировано, зависит следующее – загрузится ли вообще ядро и загрузит ли файловую систему (ФС).

Важно корректно выбрать следующее:

— Тип архитектуры и процессор

— включить 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/mach-at91rm9200.

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

/* 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»,

      }

};

Для того, что бы это светодиод использовать как индикатор работы ядра, назначить ему нужно при конфигурировании в разделе 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 */

      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,

      }

//#endif

};

10.6 Компиляция ядра

Сборка ядра осуществляется командой: make

bash# make 

пример:

 root@server: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

  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

root@server: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

bash# make INSTALL_MOD_PATH=${SYSROOT} modules_install 

Это нужно делать, когда уже окончательная сборка + инсталляция, пока не стоит торопиться выполнять эти 3 последние команды.

10.8 Скрипт для сборки сжатых образов

#!/bin/bash

#=========================

#root@server: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

 

#=========================

echo » Create FS «

./mkimage -A arm -O linux -C gzip -T ramdisk -a 0x20288000 -d rm9200fs.ext2.gz fs

10.9 Результат сборки образов из скрипта

root@server: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 – это файловая система

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

 

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

 

 

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

 

13.1 Использование корректно пре-собранной файловой системы.

 

Для старта дистрибутива, можно использовать пре-собранную ФС,  с сайта с статьей от heavy-online

Как собирается и создается файловая сисима будет описано в разделе ‑  «MTD Linux File System ‑ Файловая система на DataFlash».

 

14 MTD Linux File System ‑ Файловая система на DataFlash

 

[root@AT91RM9200_SK /]$dd if=/dev/mtd2 of=/mnt/mtd2 bs=1k count=8000

[root@AT91RM9200_SK /]$chmod 777 /dev/mtd2

[root@AT91RM9200_SK /]$mkfs.ext2 /mnt/mtd2

[root@AT91RM9200_SK /]$dd if=/mnt/mtd2 of=/dev/mtdblock2

 [root@AT91RM9200_SK /]$mount -o loop /dev/mtdblock2 /fs/

[root@AT91RM9200_SK /]$mkdir /fs/test

[root@AT91RM9200_SK /]$umount /fs/

[root@AT91RM9200_SK /]$mount -o loop /dev/mtdblock2 /fs/

[root@AT91RM9200_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——    2 root     root        12288 Jan  1 00:18 lost+found/

drwxr-xr-x    2 root     root         1024 Jan  1 01:16 test/

[root@AT91RM9200_SK /]$

 [root@AT91RM9200_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)

[root@AT91RM9200_SK /]$

 

 

 

15 Linux Configuration – Конфигурация Дистрибутива

 

15.1 Установка и настройка платы AT91RM9200_SK

 

Ядро проверят верность указанного ARP, а так как при загрузке u-boot назаначает ARP, то корректно в нем нужно его указать для корректного старта системы с сетью, с конкренным ARP адресом.

Например:

[root@AT91RM9200_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
[root@AT91RM9200_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.


[root@AT91RM9200_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 интерфейса, например

[root@AT91RM9200_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
[root@AT91RM9200_SK /]$

Устанавливаемый явным образом ARP адрес 11:22:33:44:55:66 – имеет недопустимое значение.

16 Linux Tune – Настройка под конечную цель

 

16.1

 

Файл оригинал (*.doc) — Описание включения платы AT91RM9200_SK_new

 

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