0% found this document useful (0 votes)
147 views63 pages

Jagan Teki U Boot From Scratch v2019 01 Edition v2

The document provides an overview of U-Boot, an open source bootloader for embedded systems. It discusses U-Boot's history and community, hardware support, source code structure, build process, and features. The presentation agenda is also outlined, covering image boot, porting to new hardware, and future plans.

Uploaded by

TKNgu
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
147 views63 pages

Jagan Teki U Boot From Scratch v2019 01 Edition v2

The document provides an overview of U-Boot, an open source bootloader for embedded systems. It discusses U-Boot's history and community, hardware support, source code structure, build process, and features. The presentation agenda is also outlined, covering image boot, porting to new hardware, and future plans.

Uploaded by

TKNgu
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 63

U-Boot from Scratch

Jagan Teki

FOSDEM - 2019
Jagan Teki

➔ JagannadhaSutradharudu Teki
➔ Enthusiastic Linux kernel hacker
➔ U-Boot Maintainer for SPI, SPI-FLASH, Allwinner sunXi SoC
➔ Buildroot, Yocto contributor
➔ Heading to Amarula Solutions India

2
Agenda

➔ U-Boot, In a NutShell

➔ Image boot

➔ Features

➔ Port new hardware

➔ Future plans

3
U-Boot, In a NutShell

➔ History
➔ Community
➔ Hardware support
➔ U-Boot
➔ Source
➔ Source tree
➔ Build process
➔ Boot Sequence
➔ Loading sources
➔ Debug
➔ Tools
➔ Testing

4
History

➔ 8xxROM written by Magnus Damm


➔ October 1999 Wolfgang Denk moved to sourceForge.net and as PPCBoot
➔ PPCBoot-0.4.1 released in July 19, 2000
➔ PPCBoot-2.0.0 became U-Boot-0.1.0 with x86
➔ Since then added many architectures, boards, features etc.
➔ Current name is termed as Das U-Boot
➔ Flexible and opensource bootloader
➔ Wolfgang Denk as head custodian for over 10 years
➔ Tom Rini as head custodian since September 2012
➔ Recent release v2019.01

5
Community

➔ On average over 25+ employers and 120+ developers contributing every release
➔ Number of talks on various conferences

ged to 3
Development process:
w c h a n
no
35+ Custodian/Maintainer for various subsystems Note: RC h 3 weeks MW
➔ wit
➔ Release cycle months,

Merge Window Stabilization Period


(2 weeks, features) (2 months - 2 weeks, fixes)

Release cycle
(2 months)
➔ Workflow

ML
Developer Reviews Maintainer PR Master
send patch (maintainer, any) repo repo

6
Hardware support

Architecture/SoC:

➔ ARM
◆ 32-bit: Aspeed, Altera, Allwinner, Atmel, Broadcom, Qemu, Qualcomm, Marvell, NXP,
Rockchip, STM32, Tegra, TI, UniPhier, Xilinx
◆ 64-bit: Allwinner, Marvell, NXP, Rockchip, Tegra, UniPhier, Xilinx

➔ X86 (Baytrail, Broadwell, Quark, etc)


➔ ARC, M68K, MicroBlaze, MIPS, NDS32, NIOS2, PowerPC, RISCV, Sandbox, SuperH, Xtensa

Boards:

➔ 186+ different board vendors


➔ 1083+ different boards

7
U-Boot

Kernel/DTB Kernel/DTB Kernel/DTB Kernel/DTB Kernel/DTB

U-Boot proper
U-Boot U-Boot proper
Bootloader U-Boot SPL
SoC Loader SPL
TPL

BROM BROM BROM BROM BROM

POR POR POR POR POR

8
U-Boot build

➔ Git master or dev tree at


http://git.denx.de/?p=u-boot.git;a=summary

➔ Custodian’s or Maintainers tree at


http://git.denx.de/?p=u-boot.git;a=forks

Example of building vyasa RK3288 board, which is ARM platform with arm-linux-gnueabi

1. $ git clone git://git.denx.de/u-boot.git


2. $ u-boot
3. $ export ARCH=arm
4. $ export CROSS_COMPILE=arm-linux-gnueabi-
5. $ make vyasa-rk3288_defconfig
6. $ make

9
U-Boot tree

➔ Arch - Architecture specific code


◆ arch/foo - foo CPU specific code
◆ arch/foo/mach-joo - joo MACHINE specific code
◆ arch/foo/dts - foo devicetree code
➔ board - board specific code
➔ cmd - commands
➔ common - common code
◆ common/spl - SPL code
➔ configs - per board configuration
➔ disk - disk or partition
➔ doc - documentation
➔ drivers - drivers code
➔ env - environment
➔ fs - filesystems
➔ net - Networking
➔ Kbuild - Kbuild scripts
➔ Kconfig - Global kconfig file
➔ Makefile - Global makefile
➔ scripts, tools - build script, etc

10
Build process

1. CC spl/arch/arm/mach-rockchip/sdram_common.o
1. scripts/kconfig/conf --syncconfig Kconfig
2. CC spl/arch/arm/mach-rockchip/rk_timer.o
2. CHK include/config.h
3. CC spl/arch/arm/mach-rockchip/rk3288/clk_rk3288.o
3. UPD include/config.h
4. CC spl/arch/arm/mach-rockchip/rk3288/rk3288.o
4. CFG u-boot.cfg
5. CC spl/arch/arm/mach-rockchip/rk3288/syscon_rk3288.o
5. GEN include/autoconf.mk
6. CC spl/arch/arm/mach-rockchip/bootrom.o
6. GEN include/autoconf.mk.dep
7. CC spl/arch/arm/mach-rockchip/rk3288-board-spl.o
7. CFG spl/u-boot.cfg
8. CC spl/arch/arm/cpu/armv7/cache_v7.o
8. GEN spl/include/autoconf.mk
9. CC spl/arch/arm/cpu/armv7/cpu.o
9. CFG tpl/u-boot.cfg
10. AS spl/arch/arm/cpu/armv7/lowlevel_init.o
10. GEN tpl/include/autoconf.mk
11. AS spl/arch/arm/cpu/armv7/start.o
11. CHK include/config/uboot.release
12. LD spl/u-boot-spl
12. UPD include/config/uboot.release
13. OBJCOPY spl/u-boot-spl-nodtb.bin
13. CHK include/generated/version_autogenerated.h
14. COPY spl/u-boot-spl.dtb
14. UPD include/generated/version_autogenerated.h
15. CAT spl/u-boot-spl-dtb.bin
15. CHK include/generated/timestamp_autogenerated.h
16. COPY spl/u-boot-spl.bin
16.
17.
17. LD arch/arm/cpu/built-in.o
18. CC tpl/arch/arm/mach-rockchip/sdram_common.o
18. CC arch/arm/cpu/armv7/cache_v7.o
19. CC tpl/arch/arm/mach-rockchip/rk_timer.o
19. AS arch/arm/cpu/armv7/cache_v7_asm.o
20. CC tpl/arch/arm/mach-rockchip/rk3288/clk_rk3288.o
20. CC arch/arm/cpu/armv7/cpu.o
21. CC tpl/arch/arm/mach-rockchip/rk3288/rk3288.o
21. CC arch/arm/cpu/armv7/cp15.o
22. CC tpl/arch/arm/mach-rockchip/rk3288/syscon_rk3288.o
22. CC arch/arm/cpu/armv7/syslib.o
23. CC tpl/arch/arm/mach-rockchip/bootrom.o
23. AS arch/arm/cpu/armv7/sctlr.o
24. CC tpl/arch/arm/mach-rockchip/rk3288-board-tpl.o
24. AS arch/arm/cpu/armv7/lowlevel_init.o
25. CC tpl/arch/arm/cpu/armv7/cache_v7.o
25. LD arch/arm/cpu/armv7/built-in.o
26. AS tpl/arch/arm/cpu/armv7/cache_v7_asm.o
26. AS arch/arm/cpu/armv7/start.o
27. CC tpl/arch/arm/cpu/armv7/cpu.o
27. CC arch/arm/lib/eabi_compat.o
28. CC tpl/arch/arm/cpu/armv7/cp15.o
28. AS arch/arm/lib/crt0_arm_efi.o
29. CC tpl/arch/arm/cpu/armv7/syslib.o
29. CC arch/arm/lib/reloc_arm_efi.o
30. AS tpl/arch/arm/cpu/armv7/lowlevel_init.o
30. CC arch/arm/mach-rockchip/boot_mode.o
31. AS tpl/arch/arm/cpu/armv7/start.o
31. CC arch/arm/mach-rockchip/rk3288-board.o
32. LDS tpl/u-boot-spl.lds
32. CC arch/arm/mach-rockchip/sdram_common.o
33. LD tpl/u-boot-tpl
33. CC arch/arm/mach-rockchip/rk_timer.o
34. OBJCOPY tpl/u-boot-tpl-nodtb.bin
34. CC arch/arm/mach-rockchip/rk3288/clk_rk3288.o
35. COPY tpl/u-boot-tpl.bin
35. CC arch/arm/mach-rockchip/rk3288/rk3288.o
36. COPY u-boot.dtb
36. CC arch/arm/mach-rockchip/rk3288/syscon_rk3288.o
37. MKIMAGE u-boot-dtb.img
37. CC board/amarula/vyasa-rk3288/vyasa-rk3288.o

11
U-Boot Sequence
(a) / ATF / OP-TEE

board_init_r
SPL/TPL boot_from_devices() falcon?
malloc()
debug_uart SPL/TPL
clk, pinctrl
gd pmic
alloc/ dram ?? Boot Linux
reserve
(a) board_init_f
U-Boot Proper
U-Boot proper
init_sequence_f
POR reocate init_sequence_r() autoboot?

board_init_r

U-Boot Shell

12
Loading sources

➔ U-Boot can support variety of loading sources


➔ RAM
➔ Network: tftp, DHCP
➔ Serial: Kermit
➔ SPI Flash
➔ MMC
➔ Parallel NOR
➔ NAND, UBI
➔ USB
➔ SATA
➔ AHCI
➔ NVME

13
Debug

➔ printf
➔ CONFIG_DEBUG
➔ GDB
➔ Early UART (CONFIG_DEBUG_UART)

14
#include <debug_uart.h>

static inline void _debug_uart_init(void)


{
_mxc_serial_init(base);
}

static inline void _debug_uart_putc(int ch)


{
while (!(readl(&base->ts) & UTS_TXEMPTY))
WATCHDOG_RESET();

writel(ch, &base->txd);
}
DEBUG_UART_FUNCS

debug_uart_init();
printch('T');
printch('P');
printch('L');

15
Tools

➔ Patman
◆ Manual patch creation, cover-letter, adding maintainers etc can be error-prone.
◆ Patman make above automated
◆ Create patch, insert cover-letter, add maintainer (via ~/.git-mailrc), run checkpatch.pl etc
◆ How to use? tools/patman/README
➔ Buildman
◆ U-Boot builder for multiple commits, branches etc
◆ Replaced by legacy MAKEALL
◆ Understandable output summary / {
◆ Checking image sizes binman {
◆ tools/buildman/README filename = "u-boot-sunxi-with-spl.bin";
➔ Binman pad-byte = <0xff>;
◆ Packaging multiple image components blob {
filename = "spl/sunxi-spl.bin";
};
u-boot-img {
offset = <CONFIG_SPL_PAD_TO>;
};
};
};
16
Testing
➔ travis-ci.org
◆ Automated build environment, with limited run-time, free to use
◆ May take longer duration, if more jobs are initiated
◆ .travis.yml, u-boot travis build plugin
➔ test.py
◆ Pytest framework
◆ Works for sandbox, qemu, some real hardware
◆ Sanity tests for dm code
◆ doc/README.trace
➔ trace
◆ Kind of Linux ftrace
◆ Collect execution and sent to host for analysis
➔ tbot
◆ Execute test cases on boards
◆ Heiko Schocher demo, https://www.youtube.com/watch?v=zfjpj3DLsx4

17
Image Boot

➔ Legacy image
➔ FIT
➔ Verified image
➔ ARM64 ATF
➔ OP-TEE
➔ Secure boot
➔ Falcon mode
➔ EFI boot
➔ Distro boot

18
Legacy Image

➔ Fixed offset images - standalone,


zImage binaries
➔ go addr [arg ...]
➔ u-boot Image format
➔ Single component uImage
➔ Monolithic, combination of images
➔ bootm [addr [arg ...]]

xing
x ib l e, inde
fle
? Not
in te grity
hash dition
? No i ty a d
e o f secur
scop
? No

19
FIT (Flattened uImage Tree)

images configurations

OS FIT header DTS FIT header Ramdisk FIT header


sub node unit name sub node unit name sub node unit name Config node unit name
sub node unit offset sub node unit offset sub node unit offset

header header header config@1


header CRC header CRC header CRC config@2
data Size data Size data Size config@3

data load addr data load addr data load addr config@n
entry point addr entry point addr entry point addr
OS OS OS

image type image type image type


compression type compression type compression type
description description description

data data data

20
FIT, contd

21
FIT Complexity ?

ra mdisk
iple k e r nel, dtb,
Mult

ga
bit file, fp

ATF

OPTEE

ge type?
new ima

22
Verified boot

23
Secure boot, Signed

24
Secure boot, Encrypted

25
ATF

Kernel/DTB Kernel/DTB

U-Boot proper
U-Boot proper

ATF
SPL
SPL

BROM BROM

POR POR

26
OP-TEE, ARMv7

Kernel/DTB Kernel/DTB Kernel/DTB

U-Boot proper OP-TEE


U-Boot proper

OP-TEE U-Boot proper


SPL
SPL SPL

BROM BROM BROM

POR POR POR

27
OP-TEE, ARMv8

Kernel/DTB Kernel/DTB Kernel/DTB

U-Boot proper OP-TEE


U-Boot proper

ATF OP-TEE U-Boot proper


ATF
SPL
SPL SPL

BROM BROM BROM

POR POR POR

28
Falcon mode

Kernel/DTB Kernel/DTB
Kernel/DTB

dry run U-Boot proper


U-Boot proper

SPL SPL

from SPL
Boot Linux
oot
BROM BROM
Speed up b
f a lc o n , d uring dryrun
Configur e

POR POR

29
Falcon, is useful?

30
EFI boot

➔ Most of AArch64 and x86 UEFI is default booting system.


➔ U-Boot support via EFI_LOADER, CMD_BOOTEFI configs.

=> load mmc 0:2 ${fdt_addr_r} boot/dtb


29830 bytes read in 14 ms (2 MiB/s)
=> load mmc 0:1 ${kernel_addr_r} efi/debian/grubaa64.efi
reading efi/debian/grubaa64.efi
120832 bytes read in 7 ms (16.5 MiB/s)
=> bootefi ${kernel_addr_r} ${fdt_addr_r}

doc/README.uefi

ELCE 2017: Marrying U-Boot, UEFI and grub, Alexander Graf

31
Distro boot

➔ bootargs - system boot environment commands


➔ board-specific logic with respect to storage mechanism
➔ DISTRO_DEFAULTS, generic distribution configuration

# u-boot, extlinux.conf
label linux-5.0.0-rc3
kernel /Image
devicetree /sun50i-a64-amarula-relic.dtb
append console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootwait rw

32
U-Boot Features

➔ Kconfig
➔ FDT
➔ OF livetree
➔ FDT Overlay
➔ Driver model
➔ OF platdata
➔ DFU

33
Kconfig

$ make <board>_config $ make <board>_config or $ make <board>_defconfig


(include/configs/<board>.h) (configs/<board>_defconfig)

mkconfig boards.cfg scripts/kconfig/conf

include/config.mk .config
include/config.h

$ make $ make

tools/scripts/define2mk.sed scripts/kconfig/conf

include/autoconf.mk include/autoconf.mk
include/autoconf.mk.dep include/autoconf.mk.dep
include/spl-autoconf.mk include/spl/autoconf.mk
include/tpl-autoconf.mk include/tpl/autoconf.mk

34
FDT (Flat Device Tree)

➔ Run-time hardware configuration


➔ Single U-Boot binary for multiple boards (with board controlled dts)
➔ Handle via libfdt
➔ Enabled via CONFIG_OF_CONTROL

➔ FDT supported U-Boot can build


◆ with default dts, CONFIG_DEFAULT_DEVICE_TREE=<dts-file-name> in defconfig
● $ make
◆ with user-specified dts
● $ make DEVICE_TREE=<dts-file-name>

➔ Sample, UniPhier Pro4 reference, Pro4 Ace, Pro4 Sanji boards


◆ $ make uniphier_v7_defconfig (single configuration)
◆ $ make DEVICE_TREE=uniphier-pro4-ref
◆ $ make DEVICE_TREE=uniphier-pro4-ace
◆ $ make DEVICE_TREE=uniphier-pro4-sanji

➔ DTB packing during build


◆ CONFIG_OF_EMBED
◆ CONFIG_OF_SEPARATE

35
FDT, u-boot

➔ Maintain U-Boot specific node definitions in separate file


➔ Useful for DT allocation in SPL
➔ u-boot,dm-pre-alloc, u-boot,dm-spl

/* arch/arm/dts/imx6qdl-u-boot.dtsi */
/ {
soc {
u-boot,dm-spl;
aips-bus@02000000 {
u-boot,dm-spl;
};
};
};

&gpio1 {
u-boot,dm-spl;
};

36
FDT, libfdt

e amount
py l a r g
pdat e, co
? add/u
e d t o rebuilt
?t ree ne
i ng is slow
a ve r s
? tree tr

37
Livetree (Live Device Tree)

➔ Pointer-based hierarchical structures


➔ Support after relocation
➔ ofnode , point to either flat tree or livetree
➔ Enabled via CONFIG_OF_LIVE

static int zynq_spi_ofdata_to_platdata(struct udevice *bus)


{
struct zynq_spi_platdata *plat = bus->platdata;

/* old code */
plat->regs = (struct zynq_spi_regs *)devfdt_get_addr(bus);
plat->frequency = fdtdec_get_int(blob, node, "spi-max-frequency",
250000000);

/* new code */
plat->regs = (struct zynq_spi_regs *)dev_read_addr(bus);
plat->frequency = dev_read_u32_default(bus, "spi-max-frequency", 250000000);

return 0;
}
38
FDT Overlay

➔ DTO, enable centralize DTB to be overlaid on the device tree.


➔ Single image of multitude of similar boards and their expansion options
➔ HAT - Rasberry PI, Tinker board
➔ DTO can load U-Boot via
◆ FIT image
◆ Manual load

39
/dts-v1/;
/ {
images {
kernel {
data = /incbin/("./zImage");
type = "kernel";
load = <0x10080000>;
entry = <0x10080000>;
};
fdt-1 {
data = /incbin/("./imx6q-icore.dtb");
type = "flat_dt";
};
fdt-2 {
data = /incbin/("./imx6q-icore-mipi.dtb");
type = "flat_dt";
};
configurations {
default = "imx6q-icore.dtb";
imx6q-icore.dtb {
kernel = "kernel";
fdt = "fdt-1";
};
imx6q-icore-mipi.dtb {
kernel = "kernel";
fdt = "fdt-2";
};
};
};
};

40
FDT Overlay, loading

/* via FIT */
=> bootm $loadaddr#imx6q-icore.dtb#imx6q-icore-mipi

/* Manual load */
=> setenv fdt_addr 0x18000000
=> setenv fdt_ovaddr 0x180c0000

=> load mmc 0:1 ${fdt_addr} ${bootdir}/base.dtb


=> load mmc 0:1 ${fdt_ovaddr} ${bootdir}/overlay.dtb

=> fdt resize 8192

=> fdt apply $fdt_ovaddr

=> bootm ${loadaddr} - ${fdt_addr}

41
U-Boot Driver model

➔ Driver model
➔ DM, CPU
➔ DM, Power
➔ DM, Core
➔ DM, Peripherals
➔ Block layer
➔ USB layer

42
Driver model
consumer
s call
ect fu nction
d e l, dir
oc m o driver
? ad-h n ’t fit sam
e
c a
l e c o n trollers Uclass
p
? multi o m aintain
l t t
a l ab l e , difficu
c
? not s
Driver

Simple, scalable, m
odular, homogeneo
us
Lazy initialization,
but bounded Device

Small overhead, SP
L
Hardware

43
=> dm tree
Class index Probed Driver Name
-----------------------------------------
root 0 [ + ] root_drive root_driver
clk 0 [ ] fixed_rate |-- oscillator
mmc 0 [ + ] rockchip_r |-- dwmmc@ff0c0000
blk 0 [ + ] mmc_blk | `-- dwmmc@ff0c0000.blk
mmc 1 [ + ] rockchip_r |-- dwmmc@ff0f0000
blk 1 [ ] mmc_blk | `-- dwmmc@ff0f0000.blk
serial 0 [ + ] ns16550_se |-- serial@ff690000
eth 0 [ ] gmac_rockc |-- ethernet@ff290000
usb 0 [ ] dwc2_usb |-- usb@ff540000
usb 1 [ ] dwc2_usb |-- usb@ff580000
ram 0 [ ] rockchip_r |-- dmc@ff610000
i2c 0 [ + ] i2c_rockch |-- i2c@ff650000
pmic 0 [ + ] rk8xx pmic | `-- pmic@1b
regulator 0 [ ] rk8xx_buck | |-- DCDC_REG1
regulator 1 [ ] rk8xx_buck | |-- DCDC_REG2
regulator 2 [ ] rk8xx_buck | |-- DCDC_REG3
regulator 3 [ ] rk8xx_buck | |-- DCDC_REG4
regulator 4 [ ] rk8xx_ldo | |-- LDO_REG1
44
Driver model
consumer

Uclass

Driver

Device

Hardware

45
DM, CPU

cpu_get_info ram_get_info smem_alloc mbox_send dm_rtc_get wdt_reset

cpu-uclass.c ram-uclass.c smem-uclass.c mailbox-uclass.c rtc-uclass.c wdt-uclass.c

riscv_cpi.c sdram_rk3399.c msm_smem.c k3-sec-proxy.c mvrtc.c cdns_wdt.c

dt/platdata dt/platdata dt/platdata dt/platdata dt/platdata dt/platdata

Hardware Hardware Hardware Hardware Hardware Hardware

46
DM, Power

power_domain_on pmic_read regulator_set thermal_get_temp timer_get_count

power-domain-uc pmic-uclass.c regulator-uclass.c thermal-uclass.c timer-uclass.c


lass.c

bcm6328-power- pfuze100.c pfuze100.c imx_thermal.c rockchip_timer.c


domain.c

dt/platdata dt/platdata dt/platdata dt/platdata dt/platdata

Hardware Hardware Hardware Hardware Hardware

47
DM, Core

clk_enable reset_deassert generic_phy_init pinctrl_select_state

clk-uclass.c reset-uclass.c phy-uclass.c pinctrl-uclass.c

clk_a64.c reset-sunxi.c phy-sun4i-usb.c pinctrl-imx6.c

dt/platdata dt/platdata dt/platdata dt/platdata

Hardware Hardware Hardware Hardware

48
DM, Peripherals

serial_setbrg dm_i2c_write spi_xfer spi_flash_write_dm dm_gpio_set_value eth_rx

serial-uclass.c i2c-uclass.c spi-uclass.c sf-uclass.c gpio-uclass.c eth-uclass.c

serial_mxc.c mxc_i2c.c zynq_spi.c sf_probe.c mxc_gpio.c sun8i_emac.c

dt/platdata dt/platdata dt/platdata dt/platdata dt/platdata dt/platdata

Hardware Hardware Hardware Hardware Hardware Hardware

49
UCLASS_DRIVER(spi) = {
.id = UCLASS_SPI,
.name = "spi",
.flags = DM_UC_FLAG_SEQ_ALIAS,
.post_bind = dm_scan_fdt_dev,
.post_probe = spi_post_probe,
.child_pre_probe = spi_child_pre_probe,
.per_device_auto_alloc_size = sizeof(struct dm_spi_bus),
.per_child_auto_alloc_size = sizeof(struct spi_slave),
.per_child_platdata_auto_alloc_size = sizeof(struct dm_spi_slave_platdata),
.child_post_bind = spi_child_post_bind,
};
U_BOOT_DRIVER(zynq_qspi) = {
.name = "zynq_qspi",
.id = UCLASS_SPI,
.of_match = zynq_qspi_ids,
.ops = &zynq_qspi_ops,
.ofdata_to_platdata = zynq_qspi_ofdata_to_platdata,
.platdata_auto_alloc_size = sizeof(struct zynq_qspi_platdata),
.priv_auto_alloc_size = sizeof(struct zynq_qspi_priv),
.probe = zynq_qspi_probe,
};
50
static int sun4i_usb_phy_exit(struct phy *phy)
{
clk_disable(&usb_phy->clocks);
reset_assert(&usb_phy->resets);
}
static int sun4i_usb_phy_init(struct phy *phy)
{
clk_enable(&usb_phy->clocks);
reset_deassert(&usb_phy->resets);
}
static struct phy_ops sun4i_usb_phy_ops = {
.init = sun4i_usb_phy_init,
.exit = sun4i_usb_phy_exit,
};
static int sun4i_usb_phy_probe(struct udevice *dev)
{
clk_get_by_name(dev, "usb0_phy", &phy->clocks);
reset_get_by_name(dev, "usb0_reset", &phy->resets);
}
U_BOOT_DRIVER(sun4i_usb_phy) = {
.id = UCLASS_PHY,
.ops = &sun4i_usb_phy_ops,
.probe = sun4i_usb_phy_probe,
}; 51
Generic Block Layer

cmd/mmc.c cmd/ide.c cmd/scsi.c cmd/nvme.c

blk_common_cmd

cmd/blk_common.c

blk_read_devnum blk_write_devnum

BLK Core

UCLASS_MMC UCLASS_AHCI UCLASS_SCSI UCLASS_NVME

52
USB framework

➔ via UCLASS_USB
➔ uclass core: drivers/usb/host/usb-uclass.c
➔ platform specific uboot driver: drivers/usb/host/ehci-generic.c
➔ USB control, bulk, interrupt, create_int_queue etc via dm_usb_ops
➔ include/usb.h
➔ cmd/usb.c
➔ USB Gadgets can probe via Gadget UCLASS
➔ drivers/usb/gadget/ether.c, USB ETH Gadget
➔ MUSB can operate Host and Peripheral
➔ MUSB Host access via UCLASS_USB
➔ MUSB Peripheral access via
◆ UCLASS_USB_DEV_GENERIC - host devices
◆ UCLASS_USB_GADGET_GENERIC - gadget devices
➔ drivers/usb/musb-new/sunxi.c, SunXi MUSB driver

53
OF Platdata

➔ SPL size increases with FDT


➔ Enabled via CONFIG_SPL_OF_PLATDATA
➔ Explicitly define the device details Like legacy platform_device in Linux

#include <dm/platform_data/spi_davinci.h>

static const struct davinci_spi_platdata davinci_spi_data = {


.regs = (struct davinci_spi_regs *)0x01f0e000,
.num_cs = 4,
};

U_BOOT_DEVICE(davinci_spi) = {
.name = "davinci_spi",
.platdata = &davinci_spi_data,
};

54
Firmware Upgrade

➔ Upgrade firmware images on running U-Boot


➔ DFU
➔ DFU via tftp
➔ UMS
➔ Fastboot dfu
ums fastboot

DFU Core USB


Composite

f_fastboot
mmc nand ram sf
f_mass_storage

55
Port new hardware

➔ Prerequisite
➔ Vyasa RK3288 port

56
Prerequisite

➔ SRAM size restrictions


➔ DDR configuration and timings
➔ Start with Serial port, can be debuggable further

57
Vyasa RK3288 port

➔ 3 stage bootloader
➔ TPL
◆ CPU, dram init, clocks, debug uart
◆ SPL BOOTROM
➔ SPL
◆ SPL_OF_CONTROL, UART, falcon
◆ SPL MMC
➔ U-Boot proper
◆ OF_CONTROL, UART, MMC, I2C,
◆ CLK, Reset, commands etc

58
➔ Add SoC support
◆ arch/arm/mach-rockchip
◆ arch/arm/mach-rockchip/rk3288
◆ CPU clock, syscon, linker script etc
◆ Add TARGET_VYASA_RK3288 in arch/arm/mach-rockchip/rk3288/Kconfig
➔ Add DTS support
◆ arch/arm/dts/rk3288-vyasa.dts
◆ arch/arm/dts/rk3288-vyasa-u-boot.dtsi
➔ Add Board support
◆ board/amarula/vyasa-rk3288/
◆ Board specific code
◆ Board specific SPL code, if require
◆ board/amarula/vyasa-rk3288/MAINTAINERS
➔ Add header file
◆ include/configs/vyasa-rk3288.h
◆ Include common useful headers
◆ Distro CONFIG_ definitions
◆ CONFIG_ items which doesn’t support Kconfig yet
➔ Add defconfig file
◆ CONFIG_ items which support Kconfig
➔ Finally run buildman or travis to make sure all build fine
➔ And use patman for sending patches to Mainline

ELCE 2017: Porting U-Boot and Linux on new ARM boards:a step-by-step guide, Quentin Schulz
59
U-Boot TPL 2018.09-00097-gd1e15041abf3 (Sep 13 2018 - 15:37:34 +0530)
Trying to boot from BOOTROM
Returning to boot ROM...

U-Boot SPL 2018.09-00097-gd1e15041abf3 (Sep 13 2018 - 15:37:34 +0530)


Trying to boot from MMC1
Expected Linux image is not found. Trying to start U-boot

U-Boot 2018.09-00097-gd1e15041abf3 (Sep 13 2018 - 15:37:34 +0530)

Model: Amarula Vyasa-RK3288


DRAM: 2 GiB
MMC: dwmmc@ff0c0000: 1, dwmmc@ff0f0000: 0
Loading Environment from MMC... *** Warning - bad CRC, using default environment

In: serial
Out: serial
Err: serial
Model: Amarula Vyasa-RK3288
Net: eth0: ethernet@ff290000
Hit any key to stop autoboot: 0
switch to partitions #0, OK
=>
60
Future plan

➔ Kconfig migration
➔ Driver model migrations
◆ BLK, DM_MMC, DM_SCSI, DM_USB
◆ DM_SPI, DM_SPI_FLASH, DM_VIDEO, DM_PCI
➔ MTD driver model
➔ Architecture CLK, RESET, Pinctrl Subsystems

61
Conclusion

➔ Use DT and DM for new ports


➔ Hands on with DM conversion
➔ ML: u-boot@lists.denx.de
➔ IRC: #u-boot
➔ Lin: https://www.linkedin.com/in/jaganteki/
➔ HABv4: https://openedev.amarulasolutions.com/display/ODWIKI/i.MX6+HABv4
➔ OP-TEE case study: https://www.amarulasolutions.com/news/optee-case-study-on-imx6q/
➔ Amarula Wiki: https://openedev.amarulasolutions.com

62
Questions??

Thank you
Jagan Teki <jagan@amarulasolutions.com>

63

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy