|
|
  |
Линукс на ARM, висим при старте |
|
|
|
Jan 14 2009, 07:31
|
Местный
  
Группа: Свой
Сообщений: 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(), т.е. сообщения должны уже появляться на консоли, но их нет  (видимо висим в каком-то бесконечном цикле). Подозреваю, что дело в криво настроенном MMU, и когда дело доходит до инициализации консоли, то используется "левый" base address серийного порта. Есть какие-то идеи/соображения, куда копать/смотреть? Вопросы остались такие: 1) таки нужно ли делать ремап на АРМ платформе для успешного старта Линукса, или линукс может жить и без него? Сейчас я ремап не делаю. 2) как определяется параметр CONFIG_PAGE_OFFSET? Он используется для конфигуриирования MMU. Спасибо!
|
|
|
|
|
Jan 14 2009, 12:00
|
Знающий
   
Группа: Свой
Сообщений: 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(), т.е. сообщения должны уже появляться на консоли, но их нет  (видимо висим в каком-то бесконечном цикле). Примерно на ядре 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.
|
|
|
|
|
Jan 15 2009, 01:53
|
Местный
  
Группа: Свой
Сообщений: 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 платформы ремап _нужен_ ?
|
|
|
|
|
Jan 19 2009, 00:35
|
Местный
  
Группа: Свой
Сообщений: 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 недостаточно, где происходит инициализация/настройка платформенных таймеров? Спасибо!
|
|
|
|
|
Jan 23 2009, 00:38
|
Местный
  
Группа: Свой
Сообщений: 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(), но похоже что это не так.
Спасибо!
|
|
|
|
|
Jan 23 2009, 12:03
|
Знающий
   
Группа: Свой
Сообщений: 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.
|
|
|
|
|
Jan 24 2009, 02:50
|
Местный
  
Группа: Свой
Сообщений: 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)
|
|
|
|
|
Jan 24 2009, 19:33
|
Знающий
   
Группа: Свой
Сообщений: 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 как раз позволяет их создавать.
|
|
|
|
|
Jan 25 2009, 12:19
|
Местный
  
Группа: Свой
Сообщений: 292
Регистрация: 9-11-04
Пользователь №: 1 077

|
Здравствуйте Цитата(SFx @ Jan 24 2009, 22:33)  Я пердпологаю у вас есть уже образ файловой системы для подгрузки его после иницилизации ядра. если вы его прошили на флешку он должен быть на одном из /dev/mtdblock# , где #-номер участка NOR Flash. А как наличие/отсутствие файловой системы может влиять на факт выдачи информации на последовательную консоль устройства (ведь именно в этом моя основная проблема, описанная в начале и далее)? Я безусловно займусь созданием файловой системы чуть позже, но на первичном этапе IMHO это не критично.
|
|
|
|
|
Jan 25 2009, 13:24
|
Знающий
   
Группа: Свой
Сообщений: 758
Регистрация: 11-07-05
Из: Понаехал (Мск)
Пользователь №: 6 688

|
Цитата(romez777 @ Jan 25 2009, 15:19)  А как наличие/отсутствие файловой системы может влиять на факт выдачи информации на последовательную консоль устройства (ведь именно в этом моя основная проблема, описанная в начале и далее)? Я почему то решил что проблему с консолью решилась, просто подпарил что вы консоль могли через Jtag увидить. возможно есть смысл отключить модули поддрежки JTAG консоли. у меня просто на Mx27 Нет jtag, для всего сразу консольный порт используется, я чето не подумал.  извиняйте. что касется последовательного порта, возможно вам стоит уточнить в иходном коде модуля поддержки консоли и последовательного порта ее возможное название. еще у вас зачемто стоит /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
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|