Ко всемирному дню #ArduinoD15 я подготовил материал по конфигурации и запуску свежайшего ядра Linux на плате Intel Edison (Arduino Edition).
Ранее я уже писал про то, как обеспечить загрузку ванильного ядра на плате Intel Galileo, сейчас же настал черёд для Intel Edison.
На текущий день в ванильных ядрах отсутствует драйвер последовательного порта, что практически делает работу с платой невозможной. Сегодня 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 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. Вот, что нам необходимо сделать.
- Загрузить плату в командную строку U-Boot нажатием любой клавиши.
- Добавить несколько переменных окружения так, чтобы получилось нижеследующее:
boot_edsboot=zboot 0x100000 0 0x800000 0x800000 bootargs_edsboot=console=tty1 console=ttyS2,115200n8 root=/dev/ram0 rw initrd=0x800000,8M 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 0x800000 initrd
Делается с помощью команды
setenv
(подробные примеры можно найти здесь). - Сохранить наши изменения не испортив существующие:
setenv bootcmd_orig ${bootcmd} setenv bootcmd ${bootcmd_edsboot} saveenv
Теперь можно загрузить плату, например, вот такой командой:
run bootcmd
или нажав кнопку сброса.
Соответственно возвратится к изначальной конфигурации всегда можно запустив:
run bootcmd_orig
И на этом всё!
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
…
Автор: andy_shev