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

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