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, пожалуйста подскажите что изучать еще.


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

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

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

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

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

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

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

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

CYB3R ★★★★★
()
Ответ на: комментарий от 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
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.