Запускаем ванильное ядро на Intel Galileo

Не сомневаюсь, что большинство пользователей Intel Galileo задаётся вопросом, когда же наконец можно будет обновить ядро?




Недавно Linus Torvalds поставил метку на репозиторий ядра с текущей версией 4.0-rc3. Как он сам написал, версия ничего не значит, хотя именно для нашего сегодняшнего случая она значит очень многое, а именно то, что с этого момента счастливые обладатели плат на базе Intel Quark SoC могут попробовать запустить новое ядро безо всяких дополнительных патчей.

Давайте разберёмся как этого достичь. В качестве начальных условий предполагается наличие платы Intel Galileo с прошитой на ней по умолчанию системой на базе Yocto и загрузчиком grub.

Все описанные ниже действия предполагается выполнять на рабочем ноутбуке или десктопе.

Подготовка ядра


Прежде всего нам нужно ядро, которое с лёгкостью достаётся из репозитория (нам нужна конкретная версия 4.0-rc3):

mkdir ~/devel
cd ~/devel
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd ~/devel/linux
git checkout v4.0-rc3


Необходимо внести несколько минимальных правок в конфигурацию по умолчанию, а именно в файл arch/x86/configs/i386_defconfig. Ведь мы же помним, что процессор 32-разрядный, да ещё с особенностями!

Итак, было (удаляем строки из файла):
CONFIG_SMP=y
CONFIG_DRM_I915=y


Стало (добавляем строки в файл):
# CONFIG_DRM_I915 is not set
CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_M586TSC=y
CONFIG_X86_INTEL_QUARK=y
CONFIG_X86_UP_IOAPIC=y
CONFIG_X86_EXTENDED_PLATFORM=y
CONFIG_EFI_STUB=y
CONFIG_EARLY_PRINTK_EFI=y
CONFIG_PM_RUNTIME=y
CONFIG_SERIAL_8250_PCI=y

Остальные параметры остались в неизменном виде.

Собираем полученное:
make i386_defconfig
make -j4

Результатом будет файл arch/x86/boot/bzImage.


Подготовка образа корневой системы


Чтобы сильно не заморачиваться, воспользуемся дистрибутивом Buildroot.

Скачиваем его из репозитория, выбираем последний релиз (2015.02):

cd ~/devel
git clone git://git.buildroot.net/buildroot
cd ~/devel/buildroot
git checkout 2015.02

Создаём минимальную конфигурацию для сборки, например, в файле configs/galileo_defconfig:
# Architecture
BR2_i386=y
BR2_x86_i586=y

# Misc
BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_MDEV=y
BR2_TARGET_GENERIC_GETTY_PORT=«ttyS1»

# Root FS
# BR2_TARGET_ROOTFS_TAR is not set
BR2_TARGET_ROOTFS_CPIO=y
BR2_TARGET_ROOTFS_CPIO_BZIP2=y

# Packages
BR2_PACKAGE_KEXEC=y
BR2_PACKAGE_KEXEC_ZLIB=y
BR2_PACKAGE_LRZSZ=y
BR2_PACKAGE_SCREEN=y
BR2_PACKAGE_PCIUTILS=y
BR2_PACKAGE_DMIDECODE=y
BR2_PACKAGE_BUSYBOX_WATCHDOG=y

Собираем initrd парой команд:

make galileo_defconfig
make

В итоге мы получим файл output/images/rootfs.cpio.bz2.

Упаковываем результаты на micro SD


Итак, после предыдущих шагов мы получили следующие файлы:
~/devel/linux/arch/x86/boot/bzImage
~/devel/buildroot/output/images/rootfs.cpio.bz2

Подготовим micro SD карту 64Мб или больше (предположим, что на ней уже создана таблица разделов):

mkfs.vfat /dev/sdc1
udisks --mount /dev/sdc1
Mounted /org/freedesktop/UDisks/devices/sdc1 at /media/FB87-F683

И скопируем полученные ранее файлы:

cp ~/devel/linux/arch/x86/boot/bzImage /media/FB87-F683/vmlinuz.efi
cp ~/devel/buildroot/output/images/rootfs.cpio.bz2 /media/FB87-F683/initrd
mkdir -p /media/FB87-F683/boot/grub

Добавим конфигурацию для grub (/media/FB87-F683/boot/grub/grub.conf):
default 0
timeout 3

title Linux on Intel Galileo
 root (hd0,0)
 kernel /vmlinuz.efi console=ttyS1,115200n8
 initrd /initrd

Отмонтируем карту и вставляем её в плату. Пробуем загрузку.
Несколько последних сообщений на консоли

[ 14.632322] mount (853) used greatest stack depth: 6968 bytes left
[ 14.668185] mkdir (856) used greatest stack depth: 6940 bytes left
[ 14.694005] mount (858) used greatest stack depth: 6908 bytes left
Starting logging: OK
Starting mdev…
[ 15.739672] mdev (869) used greatest stack depth: 6904 bytes left
Starting watchdog…
Initializing random number generator… [ 15.806320] random: dd urandom read with 4 bits of entropy available
done.
Starting network…
[ 15.862745] ip (887) used greatest stack depth: 6304 bytes left
[ 15.886757] ip (889) used greatest stack depth: 5824 bytes left
Starting udhcpc…

Welcome to Buildroot
buildroot login: root
# uname -a
Linux buildroot 4.0.0-rc3+ #35 Mon Mar 9 19:26:19 EET 2015 i586 GNU/Linux


Вуаля!


В качестве бонуса список следующих действий и опций конфигурации ядра для поддержки различного оборудования.

Включаем SDHCI, USB gadget, ethernet, GPIO SCH, watchdog:
CONFIG_MMC=y
CONFIG_MMC_SDHCI=y
CONFIG_MMC_SDHCI_PCI=y
CONFIG_USB_GADGET=y
CONFIG_USB_EG20T=y
CONFIG_STMMAC_ETH=y
CONFIG_STMMAC_PCI=y
CONFIG_GPIOLIB=y
CONFIG_GPIO_SCH=y
CONFIG_IE6XX_WDT=y

Влючение SPI в ядрах 4.0-rc1, 4.0-rc2
Для включения SPI понадобится патч:

--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -499,6 +499,7 @@ config X86_INTEL_QUARK
        depends on X86_IO_APIC
        select IOSF_MBI
        select INTEL_IMR
+       select COMMON_CLK
        ---help---
          Select to include support for Quark X1000 SoC.
          Say Y here if you have a Quark based system such as the Arduino


SPI включается очень просто.
CONFIG_SPI=y
CONFIG_SPI_PXA2XX_PCI=y
CONFIG_SPI_PXA2XX=y

Для I2C и GPIO необходимо приложить патч с драйвером и корректирующее исправление, что представлено ниже:

--- a/drivers/gpio/Kconfig
+++ b/drivers/gpio/Kconfig
@@ -148,8 +148,7 @@ config GPIO_GENERIC_PLATFORM
 
 config GPIO_DWAPB
        tristate "Synopsys DesignWare APB GPIO driver"
-       depends on ARM
-       depends on OF_GPIO
+       depends on (ARM && OF_GPIO) || X86_INTEL_QUARK
        select GPIO_GENERIC
        select GENERIC_IRQ_CHIP
        help

Включается всего несколькими опциями.
CONFIG_GPIO_DWAPB=y
CONFIG_I2C_DESIGNWARE_PLATFORM=y
CONFIG_MFD_INTEL_QUARK_I2C_GPIO=y
CONFIG_DMI=y

Загружаем обновлённое ядро и наслаждаемся результатом:
Вывод lspci
# lspci -nk
00:00.0 0600: 8086:0958
Subsystem: 8086:095e
Kernel driver in use: iosf_mbi_pci
00:14.0 0805: 8086:08a7 (rev 10)
Subsystem: 8086:08a7
Kernel driver in use: sdhci-pci
00:14.1 0700: 8086:0936 (rev 10)
Subsystem: 8086:0936
Kernel driver in use: serial
00:14.2 0c03: 8086:0939 (rev 10)
Subsystem: 8086:0939
Kernel driver in use: pch_udc
00:14.3 0c03: 8086:0939 (rev 10)
Subsystem: 8086:0939
Kernel driver in use: ehci-pci
00:14.4 0c03: 8086:093a (rev 10)
Subsystem: 8086:093a
Kernel driver in use: ohci-pci
00:14.5 0700: 8086:0936 (rev 10)
Subsystem: 8086:0936
Kernel driver in use: serial
00:14.6 0200: 8086:0937 (rev 10)
Subsystem: 8086:0937
Kernel driver in use: stmmaceth
00:14.7 0200: 8086:0937 (rev 10)
Subsystem: 8086:0937
Kernel driver in use: stmmaceth
00:15.0 0c80: 8086:0935 (rev 10)
Subsystem: 8086:0935
Kernel driver in use: pxa2xx_spi_pci
00:15.1 0c80: 8086:0935 (rev 10)
Subsystem: 8086:0935
Kernel driver in use: pxa2xx_spi_pci
00:15.2 0c80: 8086:0934 (rev 10)
Subsystem: 8086:0934
Kernel driver in use: intel_quark_mfd_i2c_gpio
00:17.0 0604: 8086:11c3
Kernel driver in use: pcieport
00:17.1 0604: 8086:11c4
Kernel driver in use: pcieport
00:1f.0 0601: 8086:095e
Subsystem: 8086:095e
Kernel driver in use: lpc_sch


Содержимое /proc/interrupts
# cat /proc/interrupts
CPU0
0: 113 IO-APIC-edge timer
8: 1 IO-APIC-edge rtc0
9: 0 IO-APIC-fasteoi acpi
16: 31 IO-APIC 16-fasteoi pxa2xx-spi.168, ohci_hcd:usb2, mmc0
17: 255 IO-APIC 17-fasteoi pxa2xx-spi.169, serial
18: 0 IO-APIC 18-fasteoi i2c_designware, gpio-dwapb-mfd, pch_udc
19: 0 IO-APIC 19-fasteoi ehci_hcd:usb1

Share post

Similar posts

Comments 19

    0
    Что значит «стоковое»? Судя по описанию вы запускаете ванильное ядро, т.е. без сторонних модификаций, а термин «стоковое» я первый раз встречаю. Поиск по этому слову находит только упоминания ядер андроида.
      +1
      стоковое == ванильное == pristine
        +10
        Стоковое == входящее в поставку какого-то дистрибутива. Поэтому стоковое != ванильное в общем случае.
          –1
          Ок, согласен про общий случай. Скорее стоковое ядро — ядро без модификаций, дальше уже зависит от выбранной точки отсчёта — без модификаций вообще, или без модификаций относительно какого-то дистрибутива.
            +2
            Покажите, пожалуйста, хотя бы один пример, где слово «стоковый» используется в значении «ванильный», а не «входящий в комплект поставки». Я что-то совсем ничего такого не могу найти.
          +2
          en.wikipedia.org/wiki/Vanilla_software
          Называть ядро без сторонних патчей «ванильным» — известная и общепринятая конвенция. «Стоковое» — это скорее входящее в поставку с завода/из условной коробки (как принято это называть в случае android-прошивок).
        +1
        Я переозаглавил, чтобы не было споров.
        +7
        Необходимо внести несколько минимальных правок в конфигурацию по умолчанию, а именно в файл arch/x86/configs/i386_defconfig.
        Э? Зачем? Почему не в .config?
          +1
          Хотя вопрос и логичный, на то есть несколько причин.
          • Первая и главная — никто не знает, что у вас там в этом .config изначально
          • Непонятно, откуда вы возьмёте .config в только что скачанном дереве?
          • Также хочется иметь стабильную базу и совершать только нужные и простые изменения
          • Ядро, собранное из конфигурации по умолчанию, довольно маленькое, и, если вы обратили внимание, там нет опций =m, что делает гораздо проще сборку initrd


          Есть ещё и другие причины, но они выходят за рамки статьи и обсуждения. Надеюсь, прояснил этот момент.
            +3
            Не соглашусь с вами.
            Первая и главная — никто не знает, что у вас там в этом .config изначально
            Ну мы же скачиваем свежее ядро с git, разве в статье не это имеется ввиду? Полная сборка же описана.

            Непонятно, откуда вы возьмёте .config в только что скачанном дереве?
            Для этого и делаем make i386_defconfig, и у нас появляется .config.

            Также хочется иметь стабильную базу и совершать только нужные и простые изменения
            Я мало занимался embedded, но занимался, и обычно в таких случаях создают свой defconfig для устройства или SoC, а не модифицируют стандартный.

            Ядро, собранное из конфигурации по умолчанию, довольно маленькое, и, если вы обратили внимание, там нет опций =m, что делает гораздо проще сборку initrd
            См. ответ 2.
              0
              Да, вы скачиваете дерево, в котором нет никакого .config.

              Всё, что вы описали далее, можно проделать, начав словами «скопируем arch/x86/configs/i386_defconfig в arch/x86/configs/qrk_defconfig» и далее по тексту заменяя один файл другим. Так что ваш способ просто другой подход к тому же самому.
                +1
                «скопируем arch/x86/configs/i386_defconfig в arch/x86/configs/qrk_defconfig»
                Да, это лучший выход из ситуации.

                Да, вы скачиваете дерево, в котором нет никакого .config.
                make i386_defconfig вам скопирует i386_defconfig в .config, только и всего. Именно это делает эта команда.
                  0
                  Эта команда делает совсем не копию. Посмотрите как-нибудь на досуге в код.
        +3
        Проблему с зависанием на некоторых инструкциях с префиксом lock решили как-то или при работе ядра она не проявляется?
          0
          Если вы помните, баг впервые сказался на libpthread, собирающуюся в составе glibc. Здесь же ядро и используемая по умолчанию uClibc не подвержены этому. А ошибка как известно в самом процессоре и проверить можно только по errata для новых ревизий (чего я не делал).

      Only users with full accounts can post comments. Log in, please.