Porting U-Boot and Linux on new ARM boards: a step-by-step guide

Similar documents
Porting Linux to a new SoC

U-Boot bootloader port done right 2018 edition

Supporting a new ARM platform: the Allwinner example

U-Boot bootloader port done right 2017 edition

Porting Linux to an Embedded Platform without pain (or at least with less pain :-)) Fabio Estevam NXP Semiconductors

SD/eMMC: new speed modes and their support in Linux Embedded Linux Experts

PLATFORM ADAPTATION AND BRING-UP GUIDE

Supporting a new ARM platform: the Allwinner example

Secure Boot from A to Z

Ethernet switch support in the Linux kernel

Power Management Integrated Circuits: Keep the power in your hands

Device Tree Overview

Device Tree as a stable ABI: a fairy tale?

PLATFORM ADAPTATION FOR THE TEGRA LINUX DRIVER PACKAGE

PLATFORM ADAPTATION AND BRING-UP GUIDE

PLATFORM ADAPTATION AND BRING-UP GUIDE

ARM Device Tree status report

Configuring DDR in U-Boot using QCVS

SFO15-100: 96Boards & the course upstream

OP-TEE Using TrustZone to Protect Our Own Secrets

Memory Related Parameters Passing in TI Keystone II Linux Kernel and U-Boot

MV V210 Android 4.0 Compilation

. Micro SD Card Socket. SMARC 2.0 Compliant

PLATFORM ADAPTATION AND BRING-UP GUIDE

Two years of ARM SoC support mainlining: lessons learned

MYD-C437X-PRU Development Board

Embedded Linux Conference Europe Sascha Hauer

M2-SM6-xx - i.mx 6 based SMARC Modules

Power Management Integrated Circuits: Keep the power in your hands

Bringing display and 3D to the C.H.I.P computer

ARM support in the Linux kernel

A tour of the ARM architecture and its Linux support

Lesson 6 Intel Galileo and Edison Prototype Development Platforms. Chapter-8 L06: "Internet of Things ", Raj Kamal, Publs.: McGraw-Hill Education

S2C K7 Prodigy Logic Module Series

Porting U boot. Porting U boot. Michael Opdenacker Free Electrons

Zephyr on Beetle. Vincenzo Frascino Senior Engineer. OpenIoT, Portland, Oregon 22/02/2017 ARM 2017

SD/eMMC: new speed modes and their support in Linux

ARM support in the Linux kernel

HiKey in AOSP - Update. John Stultz

MYD-IMX28X Development Board

MV 4412 Android 4.0 Compilation

Booting Linux Fast & Fancy. Embedded Linux Conference Europe Cambridge, Robert Schwebel

pcduino V3B XC4350 User Manual

Quick Start Guide Multisensory Enablement Kit i.mx 8QuadXPlus MEK CPU Board. Based on i.mx 8QuadXPlus Applications Processor

Yocto Project and OpenEmbedded training 3-day session

MYD-Y6ULX Development Board

Free Electrons Company profile Kernel, drivers, embedded Linux and Android development, consulting, training and support

How I survived to a SoC with a terrible Linux BSP

Developing on DragonBoard

1 FOSDEM like real computers - Making distributions work on single board computers André Przywara 04/02/2018

. SMARC 2.0 Compliant

For the Windows Embedded CE 6.0 R3 and Windows Embedded Compact 7 Image and BSP

This guide is used as an entry point into the Petalinux tool. This demo shows the following:

Quick Start Guide for i.mx28 EVK. i.mx28 EVK Multimedia and connectivity

Devicetree BOF. ELCE 2017 Prague, Czech Republic. Frank Rowand, Sony October 23, _2149

SOM i1 Single Core SOM (System-On-Module) Rev 1.5

ECE 598 Advanced Operating Systems Lecture 4

MYC-C437X CPU Module

MV V310 Android 4.0 Compilation

OK335x Products Guide. Contents

Designing with NXP i.mx8m SoC

Kernel maintainership: an oral tradition

MYC-C7Z010/20 CPU Module

MYD-IMX28X Development Board

Intel Galileo gen 2 Board

ARM+DSP - a winning combination on Qseven

Bringing display and 3D to the C.H.I.P computer

Early Software Development Through Emulation for a Complex SoC

esi-risc Development Suite Getting Started Guide

SABRE for Automotive Infotainment Quick Start Guide. Smart Application Blueprint for Rapid Engineering Based on the i.mx 6 Series

Introduction to SoC+FPGA

Yocto Project & Embedded Linux

Your Strategic Partner for Renesas RZ/G1x Products & Solutions

NS115 System Emulation Based on Cadence Palladium XP

Getting Started using Linux on a New Embedded System

Embedded Linux kernel and driver development training 5-day session

MYD-C7Z010/20 Development Board

Device Trees A Database Approach to Describing Hardware. Doug Abbott. Produced by EE Times

How I survived to a SoC with a terrible Linux BSP

U-Boot & Linux Kernel Board Port

K9 SmorgasBoard Overview Rev 1

FriendlyARM. Mini2440.

Intelop. *As new IP blocks become available, please contact the factory for the latest updated info.

U-Boot Bootloader for IoT Platform?

MC34708TRN Rev /1/2011

Android System Development Training 4-day session

ARM: Allwinner sunxi SoC's and the community behind it

RunBMC - A Modular BMC Mezzanine Card BUV - Bring Up Vehicle For BMC Mezzanine. Eric Shobe & Jared Mednick Hardware Engineer - Salesforce

Adding hardware support to Buildroot

What tools exist to support device tree development and debugging? What new tools have been proposed or requested?

SOM IB8000 Quad Core SOM (System-On-Module) Rev 1.3

OP-TEE Using TrustZone to Protect Our Own Secrets

64 bit Bare Metal Programming on RPI-3. Tristan Gingold

NXP-Freescale i.mx6 MicroSoM i2. Dual Core SoM (System-On-Module) Rev 1.3

The Information contained herein is subject to change without notice. Revisions may be issued regarding changes and/or additions.

10/02/2015 PetaLinux Image with Custom Application

SBC8140 Single Board Computer

Patrick Doyle Principal Software Engineer, irobot 2017 Embedded Linux Conference, Portland OR

Running a Linux-Capable Open Source Soft SoC on the Avalanche Board with MicroSemi PolarFire FPGA

RK3036 Kylin Board Hardware Manual V0.1

Transcription:

Embedded Linux Conference Europe 2017 Porting U-Boot and Linux on new ARM boards: a step-by-step guide Embedded Linux Experts Quentin Schulz Free Electrons quentin.schulz@free-electrons.com FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 1/1

Quentin Schulz Embedded Linux and kernel engineer at Free Electrons Embedded Linux expertise Development, consulting and training Strong open-source focus Linux kernel contributors, ARM SoC support, kernel maintainers Added support in U-Boot and Linux kernel for an i.mx6 custom board, Embedded Linux Experts FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 2/1

Preamble Feedback from my journey to support a custom board in U-Boot and Linux, Examples for a board with a well-known SoC (i.mx6) and already supported IPs, almost no coding skill involved in this talk, More focused on the U-Boot part, FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 3/1

Golden rules If you have the sources of your BSP, compile and run the BSP to: 1. Validate the IP you re working on works with some code, 2. Have a reference code, 3. Have a code that you can use to debug, Focus on correctly configuring RAM and UART only, Commit, One IP at a time, Commit, FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 4/1

Custom board presentation i.mx6-based module with an extension board, Ethernet, I2C, SPI, NAND, emmc, SD Card reader, USB device, EEPROM, GPIO, UART, audio (I2S), HDMI, LVDS, PCIe, USB host, RTC, PMIC, FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 5/1

Embedded Linux Conference Europe 2017 U-Boot porting Quentin Schulz Free Electrons quentin.schulz@free-electrons.com Embedded Linux Experts Copyright 2004-2017, Free Electrons. Creative Commons BY-SA 3.0 license. Corrections, suggestions, contributions and translations are welcome! FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 6/1

U-Boot status On-going migration from board header file defines to Kconfig options, On-going migration from manual drivers probing to Driver Model, FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 7/1

U-Boot directories arch/ anything arch or platform related: DTS, CPU init, pinmux controller, DRAM, clocks,... board/ code board specific (init, pinmuxing configuration, etc), Kconfig file specifying board header file, board file, paths, Makefile for board file, configs/ all boards defconfigs drivers/ include/ all headers include/configs/ all boards header files... FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 8/1

U-Boot new board support workflow 1. Create the board file, 2. Create the board Kconfig file, 3. Create the board Makefile, 4. Create the board defconfig, 5. Create the board header file, 6. Source board s Kconfig in the architecture s Kconfig, 7. Define the TARGET Kconfig option in its CPU s Kconfig, some platforms (e.g. sunxi (Allwinner)) share common files so only a defconfig would be required, FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 9/1

1. Create the board file board/my_vendor/my_board/my_board.c #include <...> DECLARE_GLOBAL_DATA_PTR; int dram_init(void) { gd->ram_size = imx_ddr_size(); return 0; } int board_init(void) { return 0; } FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 10/1

Global data DECLARE_GLOBAL_DATA_PTR, usable in code with gd global variable, on ARM, equals to hardware register r9 for ARM32 and x18 for ARM64, used to store info in some memory which is available very early after boot to allow for a minimum set of global variables during system initialization (until we have set up the memory controller so that we can use RAM), include/asm-generic/global_data.h to find what kind of information it can store, FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 11/1

2. Create the board Kconfig file board/my_vendor/my_board/kconfig if TARGET_MY_BOARD config SYS_BOARD default "my_board" config SYS_VENDOR default "my_vendor" config SYS_CONFIG_NAME default "my_board" endif FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 12/1

Kconfig options SYS_VENDOR and SYS_BOARD are used to identify the directory where make find the files it needs to compile, if both are present, board/sys_vendor/sys_board/ if SYS_VENDOR is omitted, board/sys_board/ if SYS_BOARD is omitted, board/sys_vendor/common/ SYS_CONFIG_NAME is used to identify the board header file, include/configs/sys_config_name.h FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 13/1

3. Create the board Makefile board/my_vendor/my_board/makefile obj-y := my_board.o FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 14/1

4. Create the board defconfig configs/my_board_defconfig CONFIG_ARM=y CONFIG_ARCH_MX6=y CONFIG_TARGET_MY_BOARD=y CONFIG_MXC_UART=y FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 15/1

4. Create the board defconfig put here anything that is selectable in Kconfig (menuconfig), drivers, features, U-Boot behaviour, libs, etc. FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 16/1

5. Create the board header file (minimal example for i.mx6 Solo) include/configs/my_board.h #ifndef MY_BOARD_CONFIG_H #define MY_BOARD_CONFIG_H #define CONFIG_MXC_UART_BASE UART5_BASE #include "mx6_common.h" #define CONFIG_NR_DRAM_BANKS 1 #define CONFIG_SYS_MAX_FLASH_BANKS 1 #define CONFIG_SYS_MALLOC_LEN (10 * SZ_1M) #define CONFIG_SYS_FSL_ESDHC_ADDR 0 #define PHYS_SDRAM MMDC0_ARB_BASE_ADDR #define CONFIG_SYS_SDRAM_BASE PHYS_SDRAM #define CONFIG_SYS_INIT_RAM_ADDR IRAM_BASE_ADDR #define CONFIG_SYS_INIT_RAM_SIZE IRAM_SIZE #define CONFIG_SYS_INIT_SP_OFFSET \ (CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE) #define CONFIG_SYS_INIT_SP_ADDR \ (CONFIG_SYS_INIT_RAM_ADDR + CONFIG_SYS_INIT_SP_OFFSET) #endif FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 17/1

6. Source board s Kconfig file arch/arm/kconfig or arch/arm/mach-imx/mx6/kconfig... source "board/imx31_phycore/kconfig" source "board/isee/igep003x/kconfig" source "board/my_vendor/my_board/kconfig" source "board/olimex/mx23_olinuxino/kconfig" source "board/phytec/pcm051/kconfig"... FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 18/1

7. Define board s TARGET Kconfig option arch/arm/mach-imx/mx6/kconfig choice... config TARGET_MY_BOARD bool "My awesome board" select MX6S... endchoice FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 19/1

U-Boot init sequence U-Boot will run two lists of functions whose purpose is to init or configure specific IPs before the user have access to the console, the first list is defined in common/board_f.c in the static init_fnc_t init_sequence_f[] array, first list takes care of initialising DRAM, mapping it and relocating the bootloader code once it s working, the second list is defined in common/board_r.c in the static init_fnc_t init_sequence_r[] array, some functions are run only when a constant is defined (e.g. CONFIG_BOARD_EARLY_INIT_F defined to run board_early_init_f()), any function returning a non-zero value will stop the init sequence and make U-Boot fail to boot, define DEBUG when having trouble with init sequence, not all features are available in all functions (i.e. no udelay in board_early_init_f()) FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 20/1

Driver selection take inspiration from boards with the same IP, inspect drivers in the appropriate subsystem, 1. focus on the driver s behaviour, 2. then check out the registers, bit offsets, masks, etc. 3. check for undefined macros or constants, 4. check for piece of code surrounded by ifdef blocks, look for the object file of this driver in the Makefile of the subsystem, obj-$(config_my_driver) += my_driver.o grep for CONFIG_MY_DRIVER, visible symbol in some Kconfig file => add to board defconfig, non-visible symbol in some Kconfig file or not defined => board header file, make sure your driver is compiled (look for my_driver.o), FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 21/1

Driver selection - NAND example drivers/mtd/nand/nand_mxs.c, CONFIG_NAND_MXS for compiling the driver, CONFIG_SYS_MAX_NAND_DEVICE and CONFIG_SYS_NAND_BASE constants for configuring the device, FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 22/1

Driver selection - NAND example configs/my_board_defconfig CONFIG_ARM=y CONFIG_ARCH_MX6=y CONFIG_TARGET_MY_BOARD=y CONFIG_MXC_UART=y CONFIG_NAND_MXS=y FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 23/1

Driver selection - NAND example include/configs/my_board.h... /* Define NAND settings */ /* Max number of NAND devices supported */ #define CONFIG_SYS_MAX_NAND_DEVICE 1 #define CONFIG_SYS_NAND_BASE 0x00112000... FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 24/1

Driver selection - NAND example board/my_vendor/my_board.c... static iomux_v3_cfg_t const nand_pads[] = {...};... int board_init(void) { imx_iomux_v3_setup_multiple_pads(nand_pads, ARRAY_SIZE(nand_pads)); return 0; } FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 25/1

Note on Device Trees the migration to Device Trees started back in 2012 and the code is slowly migrated, driver by driver, subsystem by subsystem, need for Driver model to use device trees, most drivers have big ifdef blocks for CONFIG_DM, you can t really chose on a per-driver basis to enable DM support, idem for subsystem core code, I didn t go really deep into it as we needed either no or full support for Device Trees and the NAND framework isn t migrated to the DM, FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 26/1

Effort needed to support U-Boot Ethernet, EEPROM, NAND, emmc, SD Card reader, USB device, GPIO, UART, audio (I2S), PMIC, $ wc -l board/my_vendor/my_board/* configs/my_board_defconfig include/configs/my_board.h 15 board/my_vendor/my_board/kconfig 8 board/my_vendor/my_board/makefile 159 board/my_vendor/my_board/my_board.cfg #DCD conf for DDR controller and memory 218 board/my_vendor/my_board/my_board.c 39 configs/my_board_defconfig 110 include/configs/my_board.h 510 total +1 line in arch/arm/kconfig, +4 lines in arch/arm/cpu/armv7/mx6/kconfig, actually ~100 lines of real code (PHY and board init, mmc configuration), no modification of U-Boot source code otherwise, FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 27/1

Effort needed to update U-Boot got some weird bug with the RSA lib when checking fitimage signatures in U-Boot, update from 2017.03 to 2017.07 was very easy: port board header file, board file, board Makefile, board Kconfig and update the Kconfig of the architecture, make sure options defined in board header files are not Kconfig options now, problem solved in ~30min by updating, FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 28/1

Problems encountered board init sequence is toggling a few GPIOs with a given timing, all signals (even UART) go through the FPGA, failing board init sequence, no FPGA, no UART, no hair left on my head, no udelay in board_early_init_f, a workaround was to use a forloop with cpurelax(), FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 29/1

Embedded Linux Conference Europe 2017 Linux kernel porting Quentin Schulz Free Electrons quentin.schulz@free-electrons.com Embedded Linux Experts Copyright 2004-2017, Free Electrons. Creative Commons BY-SA 3.0 license. Corrections, suggestions, contributions and translations are welcome! FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 30/1

Linux kernel new board support workflow 1. Create the board s Device Tree, 2. Add your board s DTB to the architecture DTS Makefile, 3. Create a defconfig for your board, FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 31/1

Device Tree a file in a special DTS (Device Tree Source) format, purely describes the hardware of your board, matches an IP with a driver thanks to compatible strings, documentation can be found in Documentation/devicetree/bindings, for a more in-depth explanation on what a Device Tree is and how to write it: https://www.youtube.com/watch?v=m_nyyebxfn8, FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 32/1

1. Create the board s Device Tree 1. write a map of your IPs relationships, 2. find the SoC DTSI that you ll include, 3. look for IPs drivers in the correct subsystem, greping the (code)name of the IP is usually a good start, 4. once found, look for the compatible string in Documentation/devicetree/bindings, 5. follow the documentation to add the correct binding, 6. some bindings are framework-wide defined so make sure to read the documentation of the framework involved, 7. for SoC IPs, correct binding is usually as simple as enabling them and setting the correct power supply and pinmuxing since most is already described in the SoC Device Tree, FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 33/1

1. Create the board s Device Tree arch/arm/boot/dts/imx6s-my-board.dts #include "imx6dl.dtsi" / { model = "MyVendor myboard"; compatible = "my_vendor,my_board"; };... &pcie { reset-gpio = <&gpio3 18 GPIO_ACTIVE_LOW>; vpcie-supply = <&reg_pcie>; status = "okay"; }; &uart5 { status = "okay"; }; FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 34/1

2. Add the DTB to the arch DTS Makefile arch/arm/boot/dts/makefile dtb-$(config_mach_kirkwood) += \ #... dtb-$(config_soc_imx6q) += \ #... imx6qp-sabresd.dtb \ imx6s-my-board.dtb #... FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 35/1

3. Create a defconfig for your board 1. start from the SoC family defconfig (e.g. imx_v6_v7_defconfig) or if there isn t one, from the architecture (e.g. multi_v7_defconfig), 2. strip the defconfig of useless SoC families, drivers and features, 3. add the CONFIG of the drivers you want to compile, greping for the basename of the driver is the way to go, most drivers depend on subsystems or other options, you have to add them to your defconfig as well if your driver doesn t select them, FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 36/1

Problems encountered PCIe driver was probing but not enumerating devices, driver was working in BSP, found out missing support for regulator was the culprit, quickly wrote a 40 lines patch and sent it upstream, Ethernet driver was missing a post reset delay for the PHY that was set in BSP, quickly wrote a 20 lines patch and sent it upstream, FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 37/1

Effort needed to support Linux Ethernet, I2C, SPI, NAND, emmc, SD Card reader, USB device, EEPROM, GPIO, UART, audio (I2S), HDMI, LVDS, PCIe, USB host, RTC, PMIC, $ wc -l arch/arm/boot/dts/imx6s-my-board.dts arch/arm/configs/my_board_defconfig 606 arch/arm/boot/dts/imx6s-my-board.dts 401 arch/arm/configs/my_board_defconfig 1007 total +1 line in arch/arm/boot/dts/makefile, +20 lines for regulator support in PCIe driver (now upstream), +40 lines for Ethernet PHY post reset delay (now upstream), no modification of Linux source code otherwise, FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 38/1

Effort needed to update Linux got some weird bug with dual display, the display driver would completely crash if both HDMI and LVDS outputs were enabled at the same time, update from 4.9 to 4.13 was very easy: copy DTB from 4.9 to 4.13 and make sure the bindings haven t changed in-between those versions, add the one-liner in arch/arm/boot/dts/makefile, patches were already upstream so nothing else to do, problem solved in ~30min by updating, FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 39/1

Questions? Quentin Schulz quentin.schulz@free-electrons.com Slides under CC-BY-SA 3.0 http://free-electrons.com/pub/conferences/2017/elce/schulz-how-to-support-new-board-u-boot-linux FreeElectrons - Embedded Linux, kernel, drivers - Development, consulting, training and support. http://free-electrons.com 40/1