LINUX.ORG.RU

Сборка Embedded Linux для конкретной платы

 ,


0

3

Добрый день!

Есть у меня такая плата: CPU686E

И есть задача запустить на ней Embedded Linux. Я до этого ни разу такое не делал, поэтому прошу совета профессионалов в сборке образов Embedded Linux.

Использую я Buildroot. Я почитал кое-какие мануалы по нему (в частности сайта http://free-electrons.com) и понял общий принцип сборки, но возникли некоторые вопросы. Я собрал ядро, rootfs, загрузчик (пробовал grub, grub2). Сделал образ и залил его на CompactFlash. Но при загрузке на плате, после того как загрузчик начал загружать ядро, было выдано сообщение «out of memory». Плата имеет памяти 32М (это старая плата 2001 года). Очевидно, нужно как-то кастомизировать ядро. Этого я не понимаю как делать: в ядре куча настроек и не знаешь что можно выключить. Вообще, реально запустить linux на устройстве с таким объемом памяти? Тренировался на QEmu, там вроде загружается, но как-то через раз, главное что ядро выдает свои логи. Но если там поставить 16М памяти, то тоже будет сообщение о нехватке памяти.

Вопросы:

  • Нужно ли использовать initramfs для Embedded Linux? Там есть возможность даже встроить ее в образ ядра. Объясните, можно ли без него обойтись? Просто у меня добавляются некоторые файлы в rootfs (filesystem overlay), и когда я включаю initramfs, эти файлы добавляются и в него. А по идее, он должен быть минимальным.
  • Как можно включить поддержку виртуальной памяти? Можно ли это сделать средствами buildroot? На флэшке можно создать swap раздел. Поможет ли это в данном случае с ограниченным количеством RAM?
  • Где можно почитать про кастомизацию ядра? Именно про то, что необходимо оставить для минимальной системы.

Товарищи с опытом сборки Embedded Linux, пожалуйста подскажите что изучать еще.


Нужно ли использовать initramfs для Embedded Linux? Там есть возможность даже встроить ее в образ ядра. Объясните, можно ли без него обойтись? Просто у меня добавляются некоторые файлы в rootfs (filesystem overlay), и когда я включаю initramfs, эти файлы добавляются и в него. А по идее, он должен быть минимальным.

Можно, но не нужно. Конечно, лучше обойтись.

Как можно включить поддержку виртуальной памяти? Можно ли это сделать средствами buildroot? На флэшке можно создать swap раздел. Поможет ли это в данном случае с ограниченным количеством RAM?

У тебя уже и так должна быть поддержка виртуальной памяти. Отключить её нельзя (тем более, что если нет поддержки MMU, то линукс ты вообще не запустишь, тут тебе на помощь придёт uClinux, где поддержки виртуальной памяти нет). Можно создать swap-раздел, но это не рекомендуется, лучше просто допаять лишнюю микросхему памяти на плату.

Где можно почитать про кастомизацию ядра? Именно про то, что необходимо оставить для минимальной системы.

Для совсем минимальной системы — make tinyconfig, а потом выбрать из menuconfig только то, что нужно тебе. Почитать там же, нажимая на «h».

CYB3R ★★★★★
()
Ответ на: комментарий от CYB3R

У него Geode 300MHz - MMU у него есть.

Ему сейчас надо урезать все ненужное, и поправить его скрипы сборки - походу он тащит в память гучу говн в initramfs

timdorohin ★★★★
()
Ответ на: комментарий от CYB3R

Не так много он с собой тащит, только обвес для запуска системы.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от CYB3R

Ну зато (слава Богу) не на yocto собирал. Вот кто тащит дохера чего ненужного. А Билдрут ещё ничё так

velikS
()
Ответ на: комментарий от CYB3R

Для совсем минимальной системы — make tinyconfig, а потом выбрать из menuconfig только то, что нужно тебе.

Файл bzImage получился размером всего 462К. С i386_defconfig получался 6.7М. Проблем с памятью не стало, но только не загружается даже в QEmu :-). Просто висит и все. Я зашел в xconfig и увидел что там почти все отключено. Там конечно есть подсказки почти для каждой опции, но если в этом не понимаешь, они мало чем полезны.

Вообще, если учитывать что данная плата совместима с IBM-PC, реально ли найти такой конфиг, чтобы все что нужно было включено? Мне там даже графика пока не нужна, хочу чтоб можно было общаться с платой через COM порт.

Реально ли запустить линукс на ней без знаний тонкостей ядра? (Я пока новичок в этом)

Вчера заказал Raspberry Pi. Для нее есть готовые конфиги.

silart
() автор топика
Ответ на: комментарий от CYB3R

Можно создать swap-раздел, но это не рекомендуется, лучше просто допаять лишнюю микросхему памяти на плату.

Напаять не получится. Плата такая уже есть. Я конечно понимаю, что если создать swap-раздел, флэшка быстро умрет, но если нужно на этой плате запустить приложения, потребляемая память которых будет превышать доступный объем RAM, то это может быть правильным решением. Флэшку можно заменить на новую.

Я читал, что в некоторых встраиваемых системах используется initramfs в качестве основной rootfs. При этом если еще встроить его в файл ядра, мы получаем что на флэш будет только храниться загрузчик и ядро, а rootfs будет создаваться в памяти каждый раз при загрузке. Правильно ли я понимаю этот момент?

Если нужен swap-раздел, то создавать и монтировать его придется вручную и buildroot здесь не поможет?

silart
() автор топика
Ответ на: комментарий от CYB3R

а что бы вы посоветовали использовать из таких систем?

silart
() автор топика
Ответ на: комментарий от silart

Проблем с памятью не стало, но только не загружается даже в QEmu :-). Просто висит и все.
После вызова make tinyconfig ядро получилось размером 462К, и сообщения о нехватке памяти не стало. Но система не загрузилась - просто повисла. Логов нет.

На самом деле всё прекрасно загружается, только ты этого не видишь, так как поддержка консоли отключена. В полученном tinyconfig тебе нужно включить поддержку текстовой консоли и printk. После этого получишь лог загрузки ядра, который очевидно будет заканчиваться паникой «no working init found».

Я конечно понимаю, что если создать swap-раздел, флэшка быстро умрет, но если нужно на этой плате запустить приложения, потребляемая память которых будет превышать доступный объем RAM, то это может быть правильным решением. Флэшку можно заменить на новую.

Значит, оперативка у тебя напаяна и ты не хочешь её перепаивать, а флешка заменяется легко? В таком случае, конечно, можно использовать swap, но лучше просто взять плату, которая больше подходит под запросы твоих приложений, а на этой плате запустить что-то менее требовательное.

Я читал, что в некоторых встраиваемых системах используется initramfs в качестве основной rootfs. При этом если еще встроить его в файл ядра, мы получаем что на флэш будет только храниться загрузчик и ядро, а rootfs будет создаваться в памяти каждый раз при загрузке. Правильно ли я понимаю этот момент?

Правильно. Мне самому нравится такой подход, это удобно — всего один файл. Но в данном случае это вряд ли целесообразно, так как оперативной памяти и так не хватает.

CYB3R ★★★★★
()
Ответ на: комментарий от CYB3R

Если сделать только make tinyconfig и собрать ядро, то консоль работать не будет даже в QEmu. Я включил консоль. Сделал это так:

  • General setup/Configure standard kernel features/Enable support for printk
  • Device drivers/Charater devices:
    • Enable TTY
    • Virtual terminal
    • Support for binding and unbinding console drivers
  • Serial drivers
    • 8250/16550

После этого тест стало видно в QEmu. Но на устройстве я так и не смог добиться вывода текста через ttyS0. От чего это зависит: от ядра или от загрузчика? Я использую GRUB2 и его сообщения видны в терминале. Но после того как загрузка доходит до ядра, вывод текста пропадает. При этом видно, что загрузка идет (моргает светодиод на плате). Я отредактировал grub.cfg так:

set default="0"
set timeout="2"

serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1
terminal_input serial
terminal_output serial

menuentry "Buildroot" {
	linux /boot/bzImage root=/dev/sda1 rootwait console=tty0 console=ttyS0,115200n8
}
Но это не помогло. Вообще пока не понятно как заставить buildroot генерировать этот конфиг автоматически. В настройках есть такое поле: «builtin config», в котором я указал следующий файл:
GRUB_TIMEOUT="2"
GRUB_CMDLINE_LINUX_DEFAULT="console=tty0 console=ttyS0,115200n8"

## Serial console
GRUB_TERMINAL=serial
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"

ожидая, что при сборке будет сгенерирован файл grub.cfg на его основе. Но это не сработало и пришлось писать его руками.

Про конфиг груба написано здесь.

Смотрел еще файл /etc/inittab. Там есть такая строка:

...
# Put a getty on the serial port
ttyS0::respawn:/sbin/getty -L  ttyS0 115200 vt100 # GENERIC_SERIAL
...
Но ведь этот файл ядро запускает почти что в последнюю очередь.

Как думаете, за вывод в консоль отвечает ядро или загрузчик, который передает параметры ядру?

silart
() автор топика
Ответ на: комментарий от CYB3R

Значит, оперативка у тебя напаяна и ты не хочешь её перепаивать, а флешка заменяется легко? В таком случае, конечно, можно использовать swap, но лучше просто взять плату, которая больше подходит под запросы твоих приложений, а на этой плате запустить что-то менее требовательное.

На этой плате есть разъем под CF-карту, на которую я записываю образ системы. Эта плата даже имеет BIOS, в котором я выставил загрузку с карты.

Я хочу научиться делать образы GNU Linux. А эта плата у меня уже была и я решил начать с нее. Я уже заказал Raspberry Pi на алиэкспресс.

silart
() автор топика
Ответ на: комментарий от silart

За вывод в консоль отвечает ядро, но загрузчик должен передать правильную строку kernel command line (альтернативно можно вшить её в ядро, тогда загрузчик никаких параметров не передаёт). Естественно, в ядре должен быть нужный модуль. Inittab запускает не ядро, а init, который у тебя пока не запускается. Сначала запусти ядро, а уже потом можешь думать об остальном.

CYB3R ★★★★★
()
Последнее исправление: CYB3R (всего исправлений: 1)
Ответ на: комментарий от CYB3R

С выводом в serial console разобрался. Нужно было включить «Console on 8250/16550 and compatible serial port». Находится в разделе Serial drivers.

silart
() автор топика
Ответ на: комментарий от CYB3R

CYB3R I-Love-Microsoft

Возникла другая проблема: kernel panic. Лог здесь.

Почему-то не может монтировать рутфс:

[    2.538019] VFS: Cannot open root device "sda1" or unknown-block(0,0): error -6
[    2.545907] Please append a correct "root=" boot option; here are the available partitions:
[    2.554865] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
[    2.555681] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.10.4 #24
[    2.555681] Call Trace:
[    2.555681]  dump_stack+0x47/0x61
[    2.555681]  panic+0x8a/0x1b0
[    2.555681]  mount_block_root+0x189/0x211
[    2.555681]  mount_root+0x63/0x68
[    2.555681]  prepare_namespace+0x108/0x139
[    2.555681]  kernel_init_freeable+0x162/0x16f
[    2.555681]  ? rest_init+0x60/0x60
[    2.555681]  kernel_init+0x8/0xf0
[    2.555681]  ret_from_fork+0x21/0x30
[    2.555681] Kernel Offset: disabled
[    2.555681] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

На флэшке единственный раздел ext2 с рутфс. Поддержка ext2 и поддержка ATA,SATA дисков включена. Но все равно не видит. После make tinyconfig я пошел другим путем: путем отключения лишнего. Взял i386_defconfig и поотключал видео, сеть, и другие тяжелые (как мне кажется) вещи, в результате получил ядро весом 2,3М. С tinyconfig, для сравнения, ядро получалось <1M. Как думаете, что еще можно включить, чтобы увиделся диск? Повторюсь, диском является CF-флэшка, которую видно в БИОСе. Как она точно подключена, не знаю. Наверное по интерфейсу ATA, так как плата старая. Пробовал включать PCMCIA, но это не помогло.

linux /boot/bzImage root=/dev/sda1 debug console=tty0 console=ttyS0,115200n8
Эти параметры передает ядру загрузчик.

И еще ворос: на этом этапе загрузки ядро уже читает файл fstab или еще нет?

silart
() автор топика
Ответ на: комментарий от silart

на этом этапе загрузки ядро уже читает файл fstab или еще нет?

А подумать?
fstab лежит на корневом разделе, а ядро его смонтировать не смогло.
В любом случае, самому ядру fstab параллелен, оно после монтирования корня запустит процесс init и на том успокоится, дальнейшая инициализация — не его проблема.

bormant ★★★★★
()
Ответ на: комментарий от silart

unknown-block(0,0)

встает резонный вопрос, а ядро карту успело проинициализировать? Они обычно поднимаются не моментально, см. параметры ядра rootdelay=, rootwait. https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt

	rootdelay=	[KNL] Delay (in seconds) to pause before attempting to
			mount the root filesystem

	rootwait	[KNL] Wait (indefinitely) for root device to show up.
			Useful for devices that are detected asynchronously
			(e.g. USB and MMC devices).

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)
Ответ на: комментарий от bormant

а ядро карту успело проинициализировать?

Вставление задержки монтирования не помогло. Ядро не видит карту.

silart
() автор топика
Ответ на: комментарий от silart

Ты забыл включить опцию mbr partition support. И возможно поддержку ata/sata через эмуляцию scsi.

Dark_SavanT ★★★★★
()
Последнее исправление: Dark_SavanT (всего исправлений: 1)
Ответ на: комментарий от silart

на этом этапе загрузки ядро уже читает файл fstab или еще нет?

Ещё раз: ядро этим не занимается. Ни inittab, ни fstab оно не читает.
Смотри с загруженным тяжёлым ядром, какие модули у тебя используются, прочитай, за что отвечает каждый из них, определи, какие нужны для работы твоей CF-карты и включи их в своём tinyconfig.

CYB3R ★★★★★
()
Ответ на: комментарий от CYB3R

I-Love-Microsoft bormant

Удалось загрузить систему! :-) Для этого включил:

  • CS5510/5520 PATA support
  • CS5530 PATA support
  • CS5536 PATA support

которые находятся в ветке ATA BMDMA support. Они, как оказалось, являются частью системы на Geode GX1. Но для того, чтоб они появились в списке нужно было включить PCI.

Также нужно включить поддержку SCSI.

Но что меня смущает, так это подвисание при загрузке. Подвисание это бывает не всегда, встречается время от времени. Иной раз система загрузится почти за 3 секунды, а бывает на загрузку уходит до 20 секунд. Происходит оно всегда на строке лога:

ata2.01: failed to IDENTIFY (I/O error, err_mask=0x1)

Но после этого все равно флэшка определяется:

[    7.933741] ata2.01: failed to IDENTIFY (I/O error, err_mask=0x1)
[   12.977828] random: crng init done
[   13.564122] ata2.01: failed to IDENTIFY (I/O error, err_mask=0x1)
[   19.201371] ata2.00: CFA: TRANSCEND, 20060524, max MWDMA4
[   19.202101] ata2.00: 2030112 sectors, multi 0: LBA 
[   19.207357] ata2.00: configured for MWDMA2
[   19.213212] scsi 1:0:0:0: Direct-Access     ATA      TRANSCEND        0524 PQ: 0 ANSI: 5
[   19.233800] sd 1:0:0:0: [sda] 2030112 512-byte logical blocks: (1.04 GB/991 MiB)

Вот лог полностью: здесь.

silart
() автор топика
Ответ на: комментарий от splinter

Зачем ручками? Скриптом. Я помню, что в своё время отказался от билдрута именно по причине невозможности собрать в нём только абсолютный минимум.

CYB3R ★★★★★
()
Ответ на: комментарий от silart

ядро поддерживает NFS, а GRUB при этом не работает - он просто стартует ядро и всё, поддержки от него не требуется, если не ошибаюсь

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от CYB3R

I-Love-Microsoft splinter

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

Удалось загрузить систему, разбить флэшку на разделы, примонтировать swap, настроить сеть, собрать свой тестовый софт для этой платы. Все хорошо работает.

Но есть один непонятный вопрос.

У этой платы есть флэш-диск объемом 8М. Его в биосе видно и есть возможность включить загрузку с него. Мне нужно его примонтировать к rootfs. Я выяснил, что этот флэш-диск сделан на микросхеме k9f6408u0a.

Я включил в ядре поддержку устройств mtd, после этого в логе появились строчки, что найдены устройства mtd0, mtd0ro, mtdblock0.

[    2.916213] device class 'mtd': registering
[    2.923464] device: 'mtd-1': device_add
[    2.930306] SSFDC read-only Flash Translation layer
[    2.937528] bus: 'pcmcia': add driver pcmciamtd
[    2.943842] bus: 'pci': add driver MTD PCI
[    2.950828] [nandsim] warning: read_byte: unexpected data output cycle, state is STATE_READY return 0x0
[    2.960604] [nandsim] warning: read_byte: unexpected data output cycle, state is STATE_READY return 0x0
[    2.970210] [nandsim] warning: read_byte: unexpected data output cycle, state is STATE_READY return 0x0
[    2.979818] [nandsim] warning: read_byte: unexpected data output cycle, state is STATE_READY return 0x0
[    2.989493] [nandsim] warning: read_byte: unexpected data output cycle, state is STATE_READY return 0x0
[    2.999100] [nandsim] warning: read_byte: unexpected data output cycle, state is STATE_READY return 0x0
[    3.008723] nand: device found, Manufacturer ID: 0x98, Chip ID: 0x39
[    3.015282] nand: Toshiba NAND 128MiB 1,8V 8-bit
[    3.020167] nand: 128 MiB, SLC, erase size: 16 KiB, page size: 512, OOB size: 16
[    3.029417] flash size: 128 MiB
[    3.032758] page size: 512 bytes
[    3.036182] OOB area size: 16 bytes
[    3.039917] sector size: 16 KiB
[    3.043251] pages number: 262144
[    3.046661] pages per sector: 32
[    3.050081] bus width: 8
[    3.052811] bits in sector size: 14
[    3.056572] bits in page size: 9
[    3.060000] bits in OOB size: 4
[    3.063333] flash size with OOB: 135168 KiB
[    3.067708] page address bytes: 4
[    3.071215] sector address bytes: 3
[    3.074941] options: 0x42
[    3.095548] Scanning device for bad blocks
[    3.546745] Creating 1 MTD partitions on "NAND 128MiB 1,8V 8-bit":
[    3.554334] 0x000000000000-0x000008000000 : "NAND simulator partition 0"
[    3.593601] device: 'mtd0': device_add
[    3.600469] device: 'mtd0ro': device_add
[    3.617564] ftl_cs: FTL header not found.
[    3.625145] device: '31:0': device_add
[    3.631032] device: 'mtdblock0': device_add
Однако, как можно видеть, нашелся Toshiba NAND 128MiB 1,8V 8-bit, хотя микросхема на плате производства Samsung, и объем у нее 8М, вместо 128М. Вызвал я mtdinfo /dev/mtd0, и увидел следующее:
mtd0
Name:                           NAND simulator partition 0
Type:                           nand
Eraseblock size:                16384 bytes, 16.0 KiB
Amount of eraseblocks:          8192 (134217728 bytes, 128.0 MiB)
Minimum input/output unit size: 512 bytes
Sub-page size:                  256 bytes
OOB size:                       16 bytes
Character device major/minor:   90:0
Bad blocks are allowed:         true
Device is writable:             true

Потом я вызвал

flash_erase --jffs2 /dev/mtd0 0 8192
Процесс стирания занял какое-то время. Однако если потом вызвать
mount -t jffs2 /dev/mtdblock0 /mnt
будет выдано сообщение об ошибке: mount: mounting /dev/mtdblock0 on /mnt failed: No such device

Подскажите пожалуйста: что я делаю не так и правильным ли я путем пошел?

silart
() автор топика
Ответ на: комментарий от silart

Это не настоящий MTD, а эмулируемый (нужен для дебага) модулем nandsim. Тебе, вероятно, этот модуль не нужен.

CYB3R ★★★★★
()
Ответ на: комментарий от silart

Что если перед тем как делать в этом разделе ФС, попробовать поиграть с разделом при помощи dd? Просто записать паттерн или тупо «сырой файл» с первого блока?

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Должен, но у тебя разве есть 128Мб RAM?

CYB3R ★★★★★
()
Ответ на: комментарий от CYB3R

Там есть опция: Support for NAND Flash Simulator Я ее выключил и устройства mtd пропали. В логе только это:

[    2.854381] device class 'mtd': registering
[    2.861606] device: 'mtd-1': device_add
[    2.868540] bus: 'pcmcia': add driver pcmciamtd
[    2.875603] bus: 'pci': add driver MTD PCI
[    2.881636] bus: 'platform': add driver gen_nand

Видимо не может найти драйвер для моей микросхемы? Ничего похожего на мою микросхему k9f6408u0a в настройках MTD я не нашел. Как поступают в подобных случаях?

silart
() автор топика
Ответ на: комментарий от silart

Тебе необходимо будет описать твой nand в dts, потом собрать его. Какой загрузчик используешь? Вот пример кода для 9g45:

  nand {
                                         pinctrl_nand: nand-0 {
                                                 atmel,pins =
                                                         <AT91_PIOD 0 AT91_PERIPH_A AT91_PINCTRL_NONE    /* PD0 periph A Read Enable */
                                                          AT91_PIOD 1 AT91_PERIPH_A AT91_PINCTRL_NONE    /* PD1 periph A Write Enable */
                                                          AT91_PIOD 2 AT91_PERIPH_A AT91_PINCTRL_NONE    /* PD2 periph A Address Latch Enable */
                                                          AT91_PIOD 3 AT91_PERIPH_A AT91_PINCTRL_NONE    /* PD3 periph A Command Latch Enable */
                                                          AT91_PIOD 4 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP      /* PD4 gpio Chip Enable pin pull_up */
                                                          AT91_PIOD 5 AT91_PERIPH_GPIO AT91_PINCTRL_PULL_UP      /* PD5 gpio RDY/BUSY pin pull_up */
                                                          AT91_PIOD 6 AT91_PERIPH_A AT91_PINCTRL_NONE    /* PD6 periph A Data bit 0 */
                                                          AT91_PIOD 7 AT91_PERIPH_A AT91_PINCTRL_NONE    /* PD7 periph A Data bit 1 */
                                                          AT91_PIOD 8 AT91_PERIPH_A AT91_PINCTRL_NONE    /* PD8 periph A Data bit 2 */
                                                          AT91_PIOD 9 AT91_PERIPH_A AT91_PINCTRL_NONE    /* PD9 periph A Data bit 3 */
                                                          AT91_PIOD 10 AT91_PERIPH_A AT91_PINCTRL_NONE   /* PD10 periph A Data bit 4 */
                                                          AT91_PIOD 11 AT91_PERIPH_A AT91_PINCTRL_NONE   /* PD11 periph A Data bit 5 */
                                                          AT91_PIOD 12 AT91_PERIPH_A AT91_PINCTRL_NONE   /* PD12 periph A Data bit 6 */
                                                          AT91_PIOD 13 AT91_PERIPH_A AT91_PINCTRL_NONE>; /* PD13 periph A Data bit 7 */
                                         };
 
                                         pinctrl_nand_16bits: nand_16bits-0 {
                                                 atmel,pins =
                                                         <AT91_PIOD 14 AT91_PERIPH_A AT91_PINCTRL_NONE   /* PD14 periph A Data bit 8 */
                                                          AT91_PIOD 15 AT91_PERIPH_A AT91_PINCTRL_NONE   /* PD15 periph A Data bit 9 */
                                                          AT91_PIOD 16 AT91_PERIPH_A AT91_PINCTRL_NONE   /* PD16 periph A Data bit 10 */
                                                          AT91_PIOD 17 AT91_PERIPH_A AT91_PINCTRL_NONE   /* PD17 periph A Data bit 11 */
                                                          AT91_PIOD 18 AT91_PERIPH_A AT91_PINCTRL_NONE   /* PD18 periph A Data bit 12 */
                                                          AT91_PIOD 19 AT91_PERIPH_A AT91_PINCTRL_NONE   /* PD19 periph A Data bit 13 */
                                                          AT91_PIOD 20 AT91_PERIPH_A AT91_PINCTRL_NONE   /* PD20 periph A Data bit 14 */
                                                          AT91_PIOD 21 AT91_PERIPH_A AT91_PINCTRL_NONE>; /* PD21 periph A Data bit 15 */
                                         };
                                 };


                 nand0: nand@40000000 {
                         compatible = "atmel,at91rm9200-nand";
                         #address-cells = <1>;
                         #size-cells = <1>;
                         reg = <0x40000000 0x10000000
                                0xffffe000 0x600         /* PMECC Registers */
                                0xffffe600 0x200         /* PMECC Error Location Registers */
                                0x00108000 0x18000       /* PMECC looup table in ROM code  */
                               >;
                         atmel,pmecc-lookup-table-offset = <0x0 0x8000>;
                         atmel,nand-addr-offset = <21>;
                         atmel,nand-cmd-offset = <22>;
                         atmel,nand-has-dma;
                         pinctrl-names = "default";
                         pinctrl-0 = <&pinctrl_nand>;
                         gpios = <&pioD 5 GPIO_ACTIVE_HIGH
                                  &pioD 4 GPIO_ACTIVE_HIGH
                                  0
                                 >;
                         status = "ok";
                 };

splinter ★★★★★
()
Ответ на: комментарий от splinter

У меня вообще не используется Device Tree. У меня плата x86 совместимая. Я почитал вот этот документ, и после прочтения возникли следующие вопросы:

  • Как получается так, что другие устройства моей платы (UART, RTC, Ethernet) находятся сами без файла *.dts?
  • Может этот файл все же где-то есть в ядре и его можно оттуда извлечь, слегка подправить, вставив описание nand, и указать buildroot при сборке?
  • Как быть, если я не знаю по какому интерфейсу подключена флэшка, не знаю ее адрес, а в статье все устройства описаны с указанием адресов. То есть для того чтобы все заработало нужно точно знать электрическую схему платы, а я ее не знаю.
silart
() автор топика
Ответ на: комментарий от CYB3R

В этой статье есть раздел Linux MTD partitions, где говорится, что таблицу разделов nand можно передать параметрами ядру. Для этого нужно посмотреть лог, чтобы узнать имя флэшки:

omap2-nand driver initializing
ONFI flash detected
NAND device: Manufacturer ID: 0x2c, Chip ID: 0xba (Micron NAND 256MiB 1,8V 16-bit)
Creating 5 MTD partitions on "omap2-nand.0":
0x000000000000-0x000000080000 : "X-Loader"
0x000000080000-0x000000260000 : "U-Boot"
0x000000260000-0x000000280000 : "U-Boot Env"
0x000000280000-0x000000680000 : "Kernel"
0x000000680000-0x000010000000 : "File System"

а потом передать параметры ядру:

mtdparts=omap2-nand.0:128k(X-Loader)ro,256k(U-Boot)ro,128k(Environment),4m(Kernel)ro,32m(RootFS)ro,-(Data)

Но есть проблема: у меня в логе нет записи, что флэшка нашлась (если выключить эмулятор). Значит ли это что флэшку не удалось распознать ядру и драйвер для нее не найден?

silart
() автор топика
Ответ на: комментарий от silart

Модуль cs553x_nand есть? Это единственный, который должен быть, отключи остальные mtd-модули, не зависящие от этого.

CYB3R ★★★★★
()
Последнее исправление: CYB3R (всего исправлений: 1)
Ответ на: комментарий от CYB3R

Модуль cs553x_nand есть?

В том то и дело, что его нет. Хотя он включен (опция NAND support for CS5535/CS5536 (AMD Geode companion chip).

Лог здесь.

Там только есть эти строки:

[    2.649344] bus: 'pci': add driver pata_cs5520
[    2.656586] bus: 'pci': add driver pata_cs5530
[    2.662981] bus: 'pci': driver_probe_device: matched device 0000:00:12.2 with driver pata_cs5530
[    2.672010] bus: 'pci': really_probe: probing driver pata_cs5530 with device 0000:00:12.2

Про cs553x_nand ничего не упоминается. Про mtd сказано только это:

[    2.899807] device class 'mtd': registering
[    2.907055] device: 'mtd-1': device_add

Это же один и тот же контроллер cs553x, который находится в чипе. То есть он виден, но почему-то nand не обнаруживается. Может он как-то по-особенному подключен?

silart
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.