- PVSM.RU - https://www.pvsm.ru -

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

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

Запускаем стоковое ядро на Intel Galileo - 1


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

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

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

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

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

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-rc2

Необходимо внести несколько минимальных правок в конфигурацию по умолчанию, а именно в файл 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 [2].

Скачиваем его из репозитория, выбираем последний релиз (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-rc2+ #24 Thu Mar 5 12:58:36 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 понадобится патч:

--- 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 необходимо приложить патч [3] с драйвером и корректирующее исправление, что представлено ниже:

--- 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

Автор: andy_shev

Источник [4]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/arduino/84921

Ссылки в тексте:

[1] репозитория: https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/

[2] Buildroot: http://buildroot.org/

[3] патч: http://permalink.gmane.org/gmane.linux.kernel/1879925

[4] Источник: http://habrahabr.ru/post/252301/