Добры день!
Пытаюсь запустить ядро linux на своей плате.
Исходные данные
Плата на основе процессора at91sam9x25-cu, память DDR2 1 Gbit шина данных 16 бит (64 МБайта), схема в части подключений памяти взята из кита Atmel.
Подключения NAND, Dataflash, Sdcard аналогично
ПО
at91Bootstrap_5seriez_1.2 - взято с at91com/linux4sam - добавлены небольшие изменения для копирования файла образа с sd-карты в оперативную память
u-boot-2010.06 - взято с at91com/linux4sam - по их инструкции наложены патчи для поддержки процессора и кита
linux-2.6.39 - взято с at91com/linux4sam - по их инструкции наложены патчи для поддержки процессора и кита - внесены изменения в конфиг для отключени
не используемого оборудования (lcd, isi и т.д.).
Для отладки я не стал использовать SAM-BA, а решил использовать sd-карту, благо теперь процессор позволяет
загружать bootstrap и с нее. Порядок такой:
1. Стартует ROM код процессора и начинает обходить устройства с которых может загрузиться
2. Доходит до SD-карты копирует bootstrap в sram и передает управление туда
3. Стартует bootstrap инициализирует процессор и оперативную память, отладочную консоль и mmc, копирует ядро в ОЗУ, настраивает теги для
корректного старта ядра linux и передает управление ядру.
4. Ядро начинает распаковку...
Первоначально планировалась загрузка ядра только с использованием bootstrap, однако ядро останавливается после начала распаковки.
Используется формат сжатия ядра gzip.
Опции early_printk и low_level_debug включены
Uncompressing Linux...
uncompression error
-- System halted
Если изменить формат упаковки ядра на lzo то ядро успешно распаковывается и после этого нет ни одного вывода
Uncompressing Linux... done, booting the kernel.
Все теги для загрузки ядра из bootstrap'a устанавливаются корректно и в памяти сохраняются нормально, образ ядра
копирутеся тоже полностью (проверяю путем подсчета crc32)
Я попробовал скомпилировать u-boot, т.к. в основном все загружают ядро через него.
Вот вывод из отладочного порта
оU
B-oo t02010. 6J(lu1 40221- 1 :0511:)2
пDRAM: ЯоiM
BoNAND: *** Warning - bad CRC, using default environment
In: #reai
lOut: #reai
lErr: Net: ,
)tia ynk yet otspoa tubooo:t н
н
U-Boot> ?
U-Boot> ?
U-Boot> help
U-Boot>
На команды он не реагирует, очень похоже на несовпадение скоростей по отладочному порту,
но непонятно почему символы меняются местами, такое впечетление что они так в памяти лежат,
но при этом часть слов выводится нормально, а часть нет.
И еще один момент, когда bootstrap копирует ядро в ОЗУ, если последний блок образа ядра
меньше сектора sd-карты (512 байт), то все слова в двойном слове развернуты
Пример:
Так байты лежат на sd карте
AA BB CC DD
После копирования в ОЗУ
BB AA DD CC
Самое интересное что такая ситуация наблюдается только с последним блоком,
поэтому его приходится специально разворачивать восстанавливая порядок байт.
После обнаружения вышеописанного, был добавлен тест памяти в bootstrap,
все тесты прошли успешно для всего адрессного пространства.
Используемые компиляторы
ELDK-4.2 он основан на gcc-4.2.2, компилятор старый, но я его использ0овал для сборки системы для процессора at91sam9260 (bootstrap+linux+programms)
и все работает без проблем.
g++ arm-2010q1-202
g++ arm-2011.09-70
Все компиляторы выдают один и тот же результат
Прошу помочь, может кто сталкивался с подобным поведением? Или знает где я ошибся?
Заранее спасибо!