[Из песочницы] Запускаем стоковое ядро на Intel Galileo
Не сомневаюсь, что большинство пользователей Intel Galileo задаётся вопросом, когда же наконец можно будет обновить ядро?
Недавно 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