Запускаем свежайшее ядро 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
    • 5
    Share post

    Similar posts

    Comments 5

      –5
      Intel Edison != Arduino
        0
        Поддержка i2c и spi в ядре из коробки есть, или нужно что-то править? И не подскажите самое стабильное и рабочие ядро на данный момент для Edison. Спасибо.
          0
          К сожалению драйвера последовательных шин на сегодня доступны лишь в Yocto kernel. Работа идёт по претворению их в upstream.
          Отвечая на второй вопрос могу лишь порекомендовать пробовать Yocto (сам я его ни разу не пробовал, поэтому за стабильность не ручаюсь).
            0
            ну я установил, iotdk_win_installer он предложил обновить yocto, у меня сейчас 1.6.1. Я боялся не будет реалтайма на i2c, но вроде прошивший с arduino ide всё работает. Но есть проблема в выводе float значений.
            0
            Если вы вдруг выпали из новостей, то в моём бранче на GitHub появилась даже поддержка DMA для SPI.

          Only users with full accounts can post comments. Log in, please.