реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Линукс на ARM, висим при старте
romez777
сообщение Jan 14 2009, 07:31
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Приветствую.

Начал эту тему в http://electronix.ru/forum/index.php?showtopic=57717 решил спросить здесь, думаю больше народу читают данный раздел. Собственно, по-прежнему ядро виснет, никакие кульбиты не помогают. После зависания, подключившись jtag-ом, посмотрел содержимое ядерного log_buffer, который был накоплен разной информацией, но не выведен на консоль: лог завершается строкой "Calibrating delay loop... " (это функция calibrate_delay() из $(linux)/init/calibrate.c), далее тишина.

Судя по исходникам, calibrate_delay() вызывается много позже console_init(), т.е. сообщения должны уже появляться на консоли, но их нет sad.gif (видимо висим в каком-то бесконечном цикле).

Подозреваю, что дело в криво настроенном MMU, и когда дело доходит до инициализации консоли, то используется "левый" base address серийного порта. Есть какие-то идеи/соображения, куда копать/смотреть?

Вопросы остались такие:
1) таки нужно ли делать ремап на АРМ платформе для успешного старта Линукса, или линукс может жить и без него? Сейчас я ремап не делаю.
2) как определяется параметр CONFIG_PAGE_OFFSET? Он используется для конфигуриирования MMU.

Спасибо!
Go to the top of the page
 
+Quote Post
amw
сообщение Jan 14 2009, 12:00
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(romez777 @ Jan 14 2009, 09:31) *
Приветствую.

Начал эту тему в http://electronix.ru/forum/index.php?showtopic=57717 решил спросить здесь, думаю больше народу читают данный раздел. Собственно, по-прежнему ядро виснет, никакие кульбиты не помогают. После зависания, подключившись jtag-ом, посмотрел содержимое ядерного log_buffer, который был накоплен разной информацией, но не выведен на консоль: лог завершается строкой "Calibrating delay loop... " (это функция calibrate_delay() из $(linux)/init/calibrate.c), далее тишина.

Чуть раньше, в том же буффере должна быть строка вида
Код
console [tty0] enabled

Там правильный tty?
Цитата
Судя по исходникам, calibrate_delay() вызывается много позже console_init(), т.е. сообщения должны уже появляться на консоли, но их нет sad.gif (видимо висим в каком-то бесконечном цикле).

Примерно на ядре 2.6.12 была такая проблема.
Вроде ж ее давно пофиксили, но на всякий случай приведу методику поиска причин (к сожалению точный ответ с патчем затерялся за давностью лет, но патч был на arm.linux.org.uk в списках рассылки)
Суть была в том, что в linux/arch/arm/Makefile CPPFLAGS (или KBUILD_CPPFLAGS) для BE устанавливались неправильно (отсутствовал параметр -mbig-endian).
delay_loop расчитывается по jiffies, а это 64 бит значение, объявленное через макрос. Препроцессор (из-за отсутствия флага -mbig-endian неправильно его раскрывал, и в итоге в функции calibrate_delay() анализировался не младшее, а старшее 32бит слово.
Проверте, правильно ли у Вас он устанавливается.
Цитата
Подозреваю, что дело в криво настроенном MMU, и когда дело доходит до инициализации консоли, то используется "левый" base address серийного порта. Есть какие-то идеи/соображения, куда копать/смотреть?

Вопросы остались такие:
1) таки нужно ли делать ремап на АРМ платформе для успешного старта Линукса, или линукс может жить и без него? Сейчас я ремап не делаю.
2) как определяется параметр CONFIG_PAGE_OFFSET? Он используется для конфигуриирования MMU.

linux/Documentation/arm/ в частности linux/Documentation/arm/memory.txt

PS: Зря продублировали тему, ориентироваться сложно.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
romez777
сообщение Jan 15 2009, 01:53
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Цитата
Чуть раньше, в том же буффере должна быть строка вида
Код
console [tty0] enabled

Там правильный tty?

Да. Кроме того, в linux/arch/arm/Makefile все флаги для big endian установлены правильно, косяков не замечено.

Цитата
linux/Documentation/arm/ в частности linux/Documentation/arm/memory.txt

Здесь представлена карта виртуальной памяти. Она одинакова для обоих случаев remapped/unremapped RAM? Т.е. таки для arm платформы ремап _нужен_ ?
Go to the top of the page
 
+Quote Post
romez777
сообщение Jan 19 2009, 00:35
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Приветствую.

Цитата(romez777 @ Jan 14 2009, 11:31) *
После зависания, подключившись jtag-ом, посмотрел содержимое ядерного log_buffer, который был накоплен разной информацией, но не выведен на консоль: лог завершается строкой "Calibrating delay loop... " (это функция calibrate_delay() из $(linux)/init/calibrate.c), далее тишина.


Продолжаю разбираться с проблемами. Понял, что calibrate_delay() зависает, т.к. не инкрементируется значение jiffies, т.е. нужно настроить системный таймер. Как я понимаю, за это отвечает макрос CLOCK_TICK_RATE в arch/arm/mach-<board>/include/mach/timex.h, а вот как он рассчитывается? Во многих портах там целая формула выводится. Более того, ведь просто выставить CLOCK_TICK_RATE недостаточно, где происходит инициализация/настройка платформенных таймеров?

Спасибо!
Go to the top of the page
 
+Quote Post
romez777
сообщение Jan 23 2009, 00:38
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Всем привет,

постепенно разгребаю проблемы - head.S отрабатывает корректно, буквы больше не "откусывает"; MMU вроде бы тоже победил, теперь иницилизация проходит нормально и не виснет, но по-прежнему отсутствует вывод информации на серийный порт. В моем чипе присутствует PL011 блок от АРМ (реализующий последовательный порт), его драйвер давно в дереве ядра. Свое ядро я компилирую с такими опциями:

CONFIG_CMDLINE="root=/dev/ram mem=16M console=/dev/ttyS0,115200n8"
CONFIG_SERIAL_AMBA_PL011=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y

Этого достаточно, чтобы завести порт? Как я понимаю, свой драйвер не нужно писАть. И еще - в какой момент (после вызова какой функции) начинают выводиться накомленные сообщения из log_buffer на консоль? Я полагал, что сразу после console_init() из $(linux)/init/main.c:start_kernel(), но похоже что это не так.

Спасибо!
Go to the top of the page
 
+Quote Post
amw
сообщение Jan 23 2009, 12:03
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(romez777 @ Jan 23 2009, 02:38) *
CONFIG_CMDLINE="root=/dev/ram mem=16M console=/dev/ttyS0,115200n8"
CONFIG_SERIAL_AMBA_PL011=y
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y

А в самом драйвере имя устройства "ttyS*"? Например в AT91/SAM/RM/9ххх имя может быть "ttyAT*".
Код
CONFIG_UNIX98_PTYS=y

Цитата(romez777 @ Jan 23 2009, 02:38) *
И еще - в какой момент (после вызова какой функции) начинают выводиться накомленные сообщения из log_buffer на консоль? Я полагал, что сразу после console_init() из $(linux)/init/main.c:start_kernel(), но похоже что это не так.

Та вроде так должно быть, если мне склероз не изменяет.


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
romez777
сообщение Jan 24 2009, 02:50
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Приветствую,

Цитата(amw @ Jan 23 2009, 15:03) *
А в самом драйвере имя устройства "ttyS*"? Например в AT91/SAM/RM/9ххх имя может быть "ttyAT*".
Код
CONFIG_UNIX98_PTYS=y


Та вроде так должно быть, если мне склероз не изменяет.


В самом драйвере имя устройства ttyAMA, заменил строку в ядре и бутлоадере на console=/dev/ttyAMA0,.... все равно не помогло. Вот полное содержимое log_buffer:
Код
Linux version 2.6.28-rc8 (mrv@dev) (gcc version 4.0.0 (DENX ELDK 4.1 4.0.0)) #17 Fri Jan 23 15:51:39 KST 2009
CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=000531f7
CPU: VIVT data cache, VIVT instruction cache
Machine: LGMM3001
Memory policy: ECC disabled, Data cache writeback
On node 0 totalpages: 4096
free_area_init_node: node 0, pgdat c01781c0, node_mem_map c0189000
  Normal zone: 32 pages used for memmap
  Normal zone: 0 pages reserved
  Normal zone: 4064 pages, LIFO batch:0
  Movable zone: 0 pages used for memmap
Built 1 zonelists in Zone order, mobility grouping off.  Total pages: 4064
Kernel command line: root=/dev/ram mem=16M console=ttyAMA0,115200n8
PID hash table entries: 64 (order: 6, 256 bytes)
Console: colour dummy device 80x30
Dentry cache hash table entries: 2048 (order: 1, 8192 bytes)
Inode-cache hash table entries: 1024 (order: 0, 4096 bytes)
Memory: 16MB = 16MB total
Memory: 14668KB available (1324K code, 125K data, 80K init)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
NetWinder Floating Point Emulator V0.97 (double precision)
msgmni has been set to 28
io scheduler noop registered (default)
Serial: AMBA PL011 UART driver
brd: module loaded
VFP support v0.3: not present
List of all partitions:
No filesystem could mount root, tried:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)
Go to the top of the page
 
+Quote Post
SFx
сообщение Jan 24 2009, 19:33
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 758
Регистрация: 11-07-05
Из: Понаехал (Мск)
Пользователь №: 6 688



Цитата
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)

Проблема в этой строке.
Цитата
CONFIG_CMDLINE="root=/dev/ram mem=16M console=/dev/ttyS0,115200n8"


В предыдущей теме Вы писали, что у вас есть NOR Flash.
Я пердпологаю у вас есть уже образ файловой системы для подгрузки его после иницилизации ядра. если вы его прошили на флешку он должен быть на одном из /dev/mtdblock# , где #-номер участка NOR Flash.

Если вы не залили свой образ rootfs на Flashку до загрузки ядра, то Вам это следует сделать. либо, добавить драйверы сетевых адаптеров (если конечно они имеются на плате) и NFS в ядро, и грузиться из сети. на мой взгляд это намного удобнее при разработке - чтоб не заливать каждый билд по метру и ли десять на медленную NOR-Flash.

Попробуйте с такой CONFIG_CMDLINE:
Код
root=/dev/mtdblock2 mem=16M console=ttyAMA0,115200n8


К сожелению ничего не известно о том какая у Вас плата, конфигурация ядра и как вы что либо делаете. Я, к сожелению, с U-boot не работал, не могу вам помочь с точки зрения конфигурирования партиций.


Цитата
List of all partitions:

в этой строчке должно быть что то типа списка доступных mtdblock'ов и их имен. u-boot как раз позволяет их создавать.
Go to the top of the page
 
+Quote Post
romez777
сообщение Jan 25 2009, 12:19
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077



Здравствуйте

Цитата(SFx @ Jan 24 2009, 22:33) *
Я пердпологаю у вас есть уже образ файловой системы для подгрузки его после иницилизации ядра. если вы его прошили на флешку он должен быть на одном из /dev/mtdblock# , где #-номер участка NOR Flash.


А как наличие/отсутствие файловой системы может влиять на факт выдачи информации на последовательную консоль устройства (ведь именно в этом моя основная проблема, описанная в начале и далее)? Я безусловно займусь созданием файловой системы чуть позже, но на первичном этапе IMHO это не критично.
Go to the top of the page
 
+Quote Post
SFx
сообщение Jan 25 2009, 13:24
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 758
Регистрация: 11-07-05
Из: Понаехал (Мск)
Пользователь №: 6 688



Цитата(romez777 @ Jan 25 2009, 15:19) *
А как наличие/отсутствие файловой системы может влиять на факт выдачи информации на последовательную консоль устройства (ведь именно в этом моя основная проблема, описанная в начале и далее)?


Я почему то решил что проблему с консолью решилась, просто подпарил что вы консоль могли через Jtag увидить. возможно есть смысл отключить модули поддрежки JTAG консоли. у меня просто на Mx27 Нет jtag, для всего сразу консольный порт используется, я чето не подумал. smile.gif извиняйте.

что касется последовательного порта, возможно вам стоит уточнить в иходном коде модуля поддержки консоли и последовательного порта ее возможное название. еще у вас зачемто стоит /dev перед названием ttyAMA0...

я вот к примеру для загрузки i.mx27 использую такую строку.
Код
noinitrd console=ttymxc0,115200 root=/dev/mtdblock2 rootfstype=jffs2 init=/linuxrc"


и примерно такой код содержется @file drivers/serial/mxc_uart.c
Код
/*!
* This structure contains the pointers to the UART console functions. It is
* passed as an argument when registering the console.
*/
static struct console mxc_console = {
    .name = "ttymxc",
    .write = mxcuart_console_write,
    .device = uart_console_device,
    .setup = mxcuart_console_setup,
    .flags = CON_PRINTBUFFER,
    .index = -1,
    .data = &mxc_reg,
};


Код
/*!
* This structure contains the information such as the name of the UART driver
* that appears in the /dev folder, major and minor numbers etc. This structure
* is passed to the serial_core.c file.
*/
static struct uart_driver mxc_reg = {
    .owner = THIS_MODULE,
    .driver_name = "ttymxc",
    .dev_name = "ttymxc",
    .major = SERIAL_MXC_MAJOR,
    .minor = SERIAL_MXC_MINOR,
    .nr = MXC_UART_NR,
    .cons = MXC_CONSOLE,
};


и еще возможно такая иницилизация для такназываемой Early serial console ( @file drivers/serial/mxc_uart.c)

Код
console=mxcuart,0x43f90000,115200n8


посмотрите свои исходники, они как правило все похожи на drivers/char/serial.c и drivers/char/8250_early.c
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 3rd August 2025 - 12:44
Рейтинг@Mail.ru


Страница сгенерированна за 0.01445 секунд с 7
ELECTRONIX ©2004-2016