[Из песочницы] Запускаем стоковое ядро на Intel Galileo

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

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

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

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

Подготовка ядраПрежде всего нам нужно ядро, которое с лёгкостью достаётся из репозитория (нам нужна конкретная версия 4.0-rc2): mkdir ~/devel cd ~/devel git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git checkout v4.0-rc2 cd ~/devel/linux Необходимо внести несколько минимальных правок в конфигурацию по умолчанию, а именно в файл arch/x86/configs/i386_defconfig. Ведь мы же помним, что процессор 32-разрядный, да ещё с особенностями!

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

CONFIG_SMP=yCONFIG_DRM_I915=y

Стало (добавляем строки в файл):

# CONFIG_DRM_I915 is not setCONFIG_BACKLIGHT_LCD_SUPPORT=yCONFIG_M586TSC=yCONFIG_X86_INTEL_QUARK=yCONFIG_X86_UP_IOAPIC=yCONFIG_X86_EXTENDED_PLATFORM=yCONFIG_EFI_STUB=yCONFIG_EARLY_PRINTK_EFI=yCONFIG_PM_RUNTIME=yCONFIG_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 git checkout 2015.02 cd buildroot Создаём минимальную конфигурацию для сборки, например, в файле configs/galileo_defconfig: # ArchitectureBR2_i386=yBR2_x86_i586=y

# MiscBR2_ROOTFS_DEVICE_CREATION_DYNAMIC_MDEV=yBR2_TARGET_GENERIC_GETTY_PORT=«ttyS1»

# Root FS# BR2_TARGET_ROOTFS_TAR is not setBR2_TARGET_ROOTFS_CPIO=yBR2_TARGET_ROOTFS_CPIO_BZIP2=y

# PackagesBR2_PACKAGE_KEXEC=yBR2_PACKAGE_KEXEC_ZLIB=yBR2_PACKAGE_LRZSZ=yBR2_PACKAGE_SCREEN=yBR2_PACKAGE_PCIUTILS=yBR2_PACKAGE_DMIDECODE=yBR2_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 0timeout 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 leftStarting logging: OKStarting mdev…[ 15.739672] mdev (869) used greatest stack depth: 6904 bytes leftStarting watchdog…Initializing random number generator… [ 15.806320] random: dd urandom read with 4 bits of entropy availabledone.Starting network…[ 15.862745] ip (887) used greatest stack depth: 6304 bytes left[ 15.886757] ip (889) used greatest stack depth: 5824 bytes leftStarting udhcpc…

Welcome to Buildrootbuildroot login: root# uname -aLinux 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=yCONFIG_MMC_SDHCI=yCONFIG_MMC_SDHCI_PCI=yCONFIG_USB_GADGET=yCONFIG_USB_EG20T=yCONFIG_STMMAC_ETH=yCONFIG_STMMAC_PCI=yCONFIG_GPIOLIB=yCONFIG_GPIO_SCH=yCONFIG_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=yCONFIG_SPI_PXA2XX_PCI=yCONFIG_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=yCONFIG_I2C_DESIGNWARE_PLATFORM=yCONFIG_MFD_INTEL_QUARK_I2C_GPIO=yCONFIG_DMI=y

Загружаем обновлённое ядро и наслаждаемся результатом: Вывод lspci # lspci -nk00:00.0 0600: 8086:0958Subsystem: 8086:095eKernel driver in use: iosf_mbi_pci00:14.0 0805: 8086:08a7 (rev 10)Subsystem: 8086:08a7Kernel driver in use: sdhci-pci00:14.1 0700: 8086:0936 (rev 10)Subsystem: 8086:0936Kernel driver in use: serial00:14.2 0c03: 8086:0939 (rev 10)Subsystem: 8086:0939Kernel driver in use: pch_udc00:14.3 0c03: 8086:0939 (rev 10)Subsystem: 8086:0939Kernel driver in use: ehci-pci00:14.4 0c03: 8086:093a (rev 10)Subsystem: 8086:093aKernel driver in use: ohci-pci00:14.5 0700: 8086:0936 (rev 10)Subsystem: 8086:0936Kernel driver in use: serial00:14.6 0200: 8086:0937 (rev 10)Subsystem: 8086:0937Kernel driver in use: stmmaceth00:14.7 0200: 8086:0937 (rev 10)Subsystem: 8086:0937Kernel driver in use: stmmaceth00:15.0 0c80: 8086:0935 (rev 10)Subsystem: 8086:0935Kernel driver in use: pxa2xx_spi_pci00:15.1 0c80: 8086:0935 (rev 10)Subsystem: 8086:0935Kernel driver in use: pxa2xx_spi_pci00:15.2 0c80: 8086:0934 (rev 10)Subsystem: 8086:0934Kernel driver in use: intel_quark_mfd_i2c_gpio00:17.0 0604: 8086:11c3Kernel driver in use: pcieport00:17.1 0604: 8086:11c4Kernel driver in use: pcieport00:1f.0 0601: 8086:095eSubsystem: 8086:095eKernel driver in use: lpc_sch

Содержимое /proc/interrupts # cat /proc/interruptsCPU00: 113 IO-APIC-edge timer8: 1 IO-APIC-edge rtc09: 0 IO-APIC-fasteoi acpi16: 31 IO-APIC 16-fasteoi pxa2xx-spi.168, ohci_hcd: usb2, mmc017: 255 IO-APIC 17-fasteoi pxa2xx-spi.169, serial18: 0 IO-APIC 18-fasteoi i2c_designware, gpio-dwapb-mfd, pch_udc19: 0 IO-APIC 19-fasteoi ehci_hcd: usb1

© Habrahabr.ru