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

Ко всемирному дню #ArduinoD15 42e274cffd1b4fc59dbdc3b54e1d3822.png я подготовил материал по конфигурации и запуску свежайшего ядра Linux на плате Intel Edison (Arduino Edition).Ранее я уже писал про то, как обеспечить загрузку ванильного ядра на плате Intel Galileo, сейчас же настал черёд для Intel Edison.f3b53360f8a84389822c1694ffa2ccfe.pngНа текущий день в ванильных ядрах отсутствует драйвер последовательного порта, что практически делает работу с платой невозможной. Сегодня Greg KH, мейнтенер подсистемы tty, утвердил изменения, которые приносят поддержку Intel Edison High Speed UART в ядро. Реально же в основной ветке изменения появятся только в версии v4.1-rc1.

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

Подготовка ядра и файловой системыПрежде всего нам нужно ядро, которое с лёгкостью достаётся из репозитория подсистемы tty (нам нужна будет ветка tty-testing): mkdir ~/devel cd ~/devel git clone git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty.git cd ~/devel/linux git checkout tty-testing Необходимо внести несколько минимальных правок в конфигурацию по умолчанию, а именно в файл 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 setCONFIG_BACKLIGHT_LCD_SUPPORT=yCONFIG_USB_XHCI_HCD=yCONFIG_USB_DWC3=yCONFIG_USB_DWC3_GADGET=yCONFIG_GPIOLIB=yCONFIG_GPIO_INTEL_MID=yCONFIG_INTEL_MID_WATCHDOG=yCONFIG_X86_EXTENDED_PLATFORM=yCONFIG_X86_INTEL_MID=yCONFIG_EFI_STUB=yCONFIG_EARLY_PRINTK_EFI=yCONFIG_HSU_DMA=yCONFIG_HSU_DMA_PCI=yCONFIG_SERIAL_8250_DMA=yCONFIG_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. Вот, что нам необходимо сделать.

Загрузить плату в командную строку U-Boot нажатием любой клавиши. Добавить несколько переменных окружения так, чтобы получилось нижеследующее: boot_edsboot=zboot 0×100000 0 0×800000 0×800000 bootargs_edsboot=console=tty1 console=ttyS2,115200n8 root=/dev/ram0 rw initrd=0×800000,8M bootcmd_edsboot=setenv bootargs ${bootargs_edsboot}; run load_edsboot; run boot_edsboot load_edsboot=load mmc 0:9 0×100000 vmlinuz.efi; load mmc 0:9 0×800000 initrd Делается с помощью команды setenv (подробные примеры можно найти здесь). Сохранить наши изменения не испортив существующие: setenv bootcmd_orig ${bootcmd} setenv bootcmd ${bootcmd_edsboot} saveenv Теперь можно загрузить плату, например, вот такой командой: run bootcmd или нажав кнопку сброса.Соответственно возвратится к изначальной конфигурации всегда можно запустив:

run bootcmd_orig И на этом всё!

Посмотреть, что получилось Welcome to Buildrootbuildroot login: root# uname -aLinux buildroot 4.0.0-rc5+ #1 SMP Fri Mar 27 15:15:28 EET 2015 i686 GNU/Linux# lspci -kn00: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: serial00:04.2 0700: 8086:1191 (rev 01)Kernel driver in use: serial00:04.3 0700: 8086:1191 (rev 01)Kernel driver in use: serial00:05.0 0700: 8086:1192 (rev 01)Kernel driver in use: hsu_dma_pci00: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_gpio00: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-pci00:12.0 1180: 8086:119f (rev 01)00:13.0 0b40: 8086:11a0 (rev 01)Kernel driver in use: intel_scu_ipc00: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/interruptsCPU0 CPU115: 0 0 IO-APIC 15-fasteoi watchdog31: 3 1 IO-APIC 31-fasteoi hsu_dma_pci34: 50 49 IO-APIC 34-fasteoi xhci-hcd: usb148: 0 0 IO-APIC 48-fasteoi intel_scu_ipc54: 61 65 IO-APIC 54-fasteoi serial…

© Habrahabr.ru