Инсталляция 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. Для компиляции, запустить на исполнение скрипт из консоли: root@server:AT91RM9200_SK_RomBoot_070302# ./compile text 10795 data 44 bss dec 656 11495 hex filename 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. 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 <roman@imsystems.ru> * 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 пример: 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 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 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 2007г. Инженер-электроник: Станислав Г. Приходько – 77 – 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 #========================= 2007г. Инженер-электроник: Станислав Г. Приходько – 78 – 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 – это файловая система 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 [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-----drwxr-xr-x 2 root 2 root root root 12288 Jan 1 00:18 lost+found/ 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 /]$ 2007г. Инженер-электроник: Станислав Г. Приходько – 83 – 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. 2007г. Инженер-электроник: Станислав Г. Приходько – 84 – [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 – имеет недопустимое значение. 2007г. Инженер-электроник: Станислав Г. Приходько – 85 – 16 Linux Tune – Настройка под конечную цель 16.1 2007г. Инженер-электроник: Станислав Г. Приходько