Development for IOT
March 2015 27

Запускаем свежайшее ядро Linux на Intel Edison

Ко всемирному дню #ArduinoD15 я подготовил материал по конфигурации и запуску свежайшего ядра Linux на плате Intel Edison (Arduino Edition).

Ранее я уже писал про то, как обеспечить загрузку ванильного ядра на плате Intel Galileo, сейчас же настал черёд для Intel Edison.


На текущий день в ванильных ядрах отсутствует драйвер последовательного порта, что практически делает работу с платой невозможной. Сегодня Greg KH, мейнтенер подсистемы tty, утвердил изменения, которые приносят поддержку Intel Edison High Speed UART в ядро. Реально же в основной ветке изменения появятся только в версии v4.1-rc1.

Итак, приступим. Хочу сразу обратить внимание, что я не буду повторно описывать некоторые действия, приведенные в статье Запускаем ванильное ядро на Intel Galileo. Также предполагаю, что у вас используется стоковая прошивка на базе Yocto.

Подготовка ядра и файловой системы


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

mkdir ~/devel
cd ~/devel
git clone git://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
cd ~/devel/linux-next

Необходимо внести несколько минимальных правок в конфигурацию по умолчанию, а именно в файл arch/x86/configs/i386_defconfig. Если по каким-то причинам не хочется трогать этот файл, мы его легко можем скопировать с помощью команды cp arch/x86/configs/{i386,eds}_defconfig, и в таком случае использовать eds_defconfig там, где в статье упоминается i386_defconfig.

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

Стало (добавляем строки в файл):
# CONFIG_DRM_I915 is not set
CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_USB_XHCI_HCD=y
CONFIG_USB_DWC3=y
CONFIG_USB_DWC3_GADGET=y
CONFIG_GPIOLIB=y
CONFIG_GPIO_INTEL_MID=y
CONFIG_INTEL_MID_WATCHDOG=y
CONFIG_X86_EXTENDED_PLATFORM=y
CONFIG_X86_INTEL_MID=y
CONFIG_EFI_STUB=y
CONFIG_EARLY_PRINTK_EFI=y
CONFIG_HSU_DMA=y
CONFIG_HSU_DMA_PCI=y
CONFIG_SERIAL_8250_DMA=y
CONFIG_SERIAL_8250_PCI=y

Данная конфигурация сразу же включит драйверы USB, watchdog, GPIO, HSU.

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

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

Процесс подготовки образа фаловой системы ничем не отличается от описанного ранее за исключением устройства вывода, которое для Intel Edison будет /dev/ttyS2, и соответственно в параметрах конфигурации Buildroot надо указать именно его:
BR2_TARGET_GENERIC_GETTY_PORT=«ttyS2»

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

Копируем результаты на eMMC



Полученные в процессе сборки файлы ~/devel/linux/arch/x86/boot/bzImage и
~/devel/buildroot/output/images/rootfs.cpio.bz2 необходимо скопировать на нашу плату под именами vmlinuz.efi и initrd соответственно.

Запускаем плату на стоковой прошивке предварительно переключив её в режим устройства по USB и подключившись кабелем к компьютеру, на котором мы производили сборку. После запуска платы компьютер найдёт устройство USB диска. Оно-то нам и нужно. Копируем наши файлы прямо в корень подключенного диска.

Конфигурируем загрузчик U-Boot



Самая интересная часть рассказа заключается в магических строках, которые нам необходимо записать в конфигурацию U-Boot. Вот, что нам необходимо сделать.
  1. Загрузить плату в командную строку U-Boot нажатием любой клавиши.
  2. Добавить несколько переменных окружения так, чтобы получилось нижеследующее:
      boot_edsboot=zboot 0x100000 0 0x3000000 0x800000
      bootargs_edsboot=console=tty1 console=ttyS2,115200n8 rootfstype=ramfs rw
      bootcmd_edsboot=setenv bootargs ${bootargs_edsboot}; run load_edsboot; run boot_edsboot
      load_edsboot=load mmc 0:9 0x100000 vmlinuz.efi; load mmc 0:9 0x3000000 initrd
    

    Делается с помощью команды setenv (подробные примеры можно найти здесь).
  3. Сохранить наши изменения не испортив существующие:
      setenv bootcmd_orig ${bootcmd}
      setenv bootcmd ${bootcmd_edsboot}
      saveenv
    

Теперь можно загрузить плату, например, вот такой командой:
run bootcmd

или нажав кнопку сброса.

Соответственно возвратиться к изначальной конфигурации всегда можно запустив:
run bootcmd_orig


И на этом всё!

Посмотреть, что получилось
Welcome to Buildroot
buildroot login: root
# uname -a
Linux buildroot 4.0.0-rc5+ #1 SMP Fri Mar 27 15:15:28 EET 2015 i686 GNU/Linux

# lspci -kn
00:00.0 0600: 8086:1170 (rev 01)
00:01.0 0805: 8086:1190 (rev 01)
00:01.2 0805: 8086:1190 (rev 01)
00:01.3 0805: 8086:1190 (rev 01)
00:02.0 0380: 8086:1182 (rev 01)
00:04.0 0700: 8086:1191 (rev 01)
00:04.1 0700: 8086:1191 (rev 01)
Kernel driver in use: serial
00:04.2 0700: 8086:1191 (rev 01)
Kernel driver in use: serial
00:04.3 0700: 8086:1191 (rev 01)
Kernel driver in use: serial
00:05.0 0700: 8086:1192 (rev 01)
Kernel driver in use: hsu_dma_pci
00:06.0 0880: 8086:1193 (rev 01)
00:06.1 0880: 8086:1193 (rev 01)
00:07.0 0880: 8086:1194 (rev 01)
00:07.1 0880: 8086:1194 (rev 01)
00:07.2 0880: 8086:1194 (rev 01)
00:08.0 0780: 8086:1195 (rev 01)
00:08.1 0780: 8086:1195 (rev 01)
00:08.2 0780: 8086:1195 (rev 01)
00:08.3 0780: 8086:1195 (rev 01)
00:09.0 0780: 8086:1196 (rev 01)
00:09.1 0780: 8086:1196 (rev 01)
00:09.2 0780: 8086:1196 (rev 01)
00:0a.0 0780: 8086:1197 (rev 01)
00:0b.0 1080: 8086:1198 (rev 01)
00:0c.0 0880: 8086:1199 (rev 01)
Kernel driver in use: intel_mid_gpio
00:0d.0 0401: 8086:119a (rev 01)
00:0e.0 0880: 8086:119b (rev 01)
00:11.0 0c03: 8086:119e (rev 01)
Kernel driver in use: dwc3-pci
00:12.0 1180: 8086:119f (rev 01)
00:13.0 0b40: 8086:11a0 (rev 01)
Kernel driver in use: intel_scu_ipc
00:14.0 0b40: 8086:11a1 (rev 01)
00:15.0 0880: 8086:11a2 (rev 01)
00:16.0 0b40: 8086:11a3 (rev 01)
00:16.1 0b40: 8086:11a4 (rev 01)
00:17.0 0880: 8086:11a5 (rev 01)
00:18.0 0380: 8086:11a6 (rev 01)

# cat /proc/interrupts
CPU0 CPU1
15: 0 0 IO-APIC 15-fasteoi watchdog
31: 3 1 IO-APIC 31-fasteoi hsu_dma_pci
34: 50 49 IO-APIC 34-fasteoi xhci-hcd:usb1
48: 0 0 IO-APIC 48-fasteoi intel_scu_ipc
54: 61 65 IO-APIC 54-fasteoi serial

+22
17.6k 79
Comments 5