Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Запуск linux at91sam9x25
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Vull
Добры день!

Пытаюсь запустить ядро 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
Все компиляторы выдают один и тот же результат


Прошу помочь, может кто сталкивался с подобным поведением? Или знает где я ошибся?
Заранее спасибо!
sasamy
,
Цитата(Vull @ Jul 16 2012, 14:08) *
at91Bootstrap_5seriez_1.2 - взято с at91com/linux4sam - добавлены небольшие изменения для копирования файла образа с sd-карты в оперативную память


он разве не поддерживает прямую загрузку с SD ? вижу там такое - at91sam9x5sd_defconfig
вообще атмеловский бутсрам - та еще штучка, например эта ошибка у них с незапамятных времен и они ее копипастят от версии к версии
Цитата
/*
* Enable External Reset
*/
writel(AT91C_RSTC_KEY_UNLOCK
|| AT91C_RSTC_URSTEN, AT91C_BASE_RSTC + RSTC_RMR);

или еще - отключаешь в конфиге вывод отладочной информации и после этого вообще ничего не загружается.
если у вас и ddr и mci подключены как на их ките - не пробовали их готовые бинарные сборки ? хотя больше похоже на ошибки с DDR, простейшие тесты памяти типа однократная запись-чтение-сверка тут не ничего не скажет.
Vull
Спасибо за ответ!

Цитата
он разве не поддерживает прямую загрузку с SD ? вижу там такое - at91sam9x5sd_defconfig
вообще атмеловский бутсрам - та еще штучка, например эта ошибка у них с незапамятных времен и они ее копипастят от версии к версии


Я ее и использую, но там все равно первым грузится бутстрап для настройки процессора, а дальше можно все что угодно загрузить от одиночной программы до ядра

Цитата
не пробовали их готовые бинарные сборки ?


Пробовал, вылетает с тем же -- System halted

Если это проблемы с памятью, то чем можно диагноз поставить? Моделированием?

И если это проблемы с памятью, то ни одна программа не должна работать в ОЗУ, я пробовал загрузить одиночное приложение из примеров Atmel
светодиод мигает исправно с заданным периодом.
sasamy
Цитата(Vull @ Jul 17 2012, 06:19) *
Пробовал, вылетает с тем же -- System halted


а u-boot работает нормально ? там есть тестер памяти mtest - так что он в первую очередь интересен к тому же бинарники они в любом случае тестировали и ерунду с несовпадением скорости уарта точно заметили бы.

Цитата
Я ее и использую, но там все равно первым грузится бутстрап для настройки процессора, а дальше можно все что угодно загрузить от одиночной программы до ядра


я к тому что там ничего менять не нужно - все через конфиг задается, кстати его через menuconfig можно смотреть/изменять
make at91sam9x5sd_defconfig
make CROSS_COMPILE=arm-none-linux-gnueabi- menuconfig

префикс кросскомпилятора свой укажите
kurtis
1.
Цитата
Uncompressing Linux... done, booting the kernel.

У вас UART правильно настроен?
Ядро запускается в 2 этапа, сначала запускается распаковщик, он выводит такую надпись, затем передается управление самому ядру, которое уже (в вашем случае) ничего не выводит.

2. Когда ядро делает printk, то сообщение попадает в буфер, к этому буферу можно получить доступ из загрузчика. Я это делаю из uboot, но у вас он вроде не очень работает, но вроде как есть возможность получить доступ к более раннему загрузчику. Буфер называется __log_buf, узнать его адрес можно так
Код
$ grep __log_buf System.map
805d2140 b __log_buf

У вас соответственно будет другое значение, но учтите что адрес 0x805d2140 это логический адрес, для моей платформы физический будет 0x705d2140.
Зная адрес, в убуте можно сделать
Код
md.l 0x705d2140 1000

и посмотреть что ядро пыталось выводить, может там будет какой-то kernel panic и проблему удастся легко локализировать.

3. По поводу убута, может у вас настройки терминала "специфические"? На других, заведомо рабочих платах, консоль себя так не ведет?
Vull
Всем БОЛЬШОЕ спасибо за советы и помощь!

Проблему удалось локализовать и исправить, дело было в железе оказались попутаны между собой сигналы DQM1 и DQM0.

После небольшого пропатчивания плат, все завелось с пол оборота!

Прошу модераторов пометить тему как РЕШЕНО
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.