Introduction

U-Boot, a boot loader for Embedded boards based on PowerPC, ARM, MIPS and several other processors, which can be installed in a boot ROM and used to initialize and test the hardware or to download and run application code.

Directory Hierarchy


/arch							Architecture specific files
  /arc						Files generic to ARC architecture
  /arm						Files generic to ARM architecture
  /m68k						Files generic to m68k architecture
  /microblaze			Files generic to microblaze architecture
  /mips						Files generic to MIPS architecture
  /nds32					Files generic to NDS32 architecture
  /nios2					Files generic to Altera NIOS2 architecture
  /openrisc				Files generic to OpenRISC architecture
  /powerpc				Files generic to PowerPC architecture
  /riscv					Files generic to RISC-V architecture
  /sandbox				Files generic to HW-independent "sandbox"
  /sh							Files generic to SH architecture
  /x86						Files generic to x86 architecture
/api							Machine/arch independent API for external apps
/board						Board dependent files
/cmd							U-Boot commands functions
/common						Misc architecture independent functions
/configs					Board default configuration files
/disk							Code for disk drive partition handling
/doc							Documentation (don't expect too much)
/drivers					Commonly used device drivers
/dts							Contains Makefile for building internal U-Boot fdt.
/examples					Example code for standalone applications, etc.
/fs								Filesystem code (cramfs, ext2, jffs2, etc.)
/include					Header Files
/lib							Library routines generic to all architectures
/Licenses					Various license files
/net							Networking code
/post							Power On Self Test
/scripts					Various build scripts and Makefiles
/test							Various unit test files
/tools						Tools to build S-Record or U-Boot images, etc.

Board Initialisation Flow

start.S

Execution typically starts with an architecture-specific (and possibly CPU-specific) start.S file, such as:

  • arch/arm/cpu/armv7/start.S
  • arch/powerpc/cpu/mpc83xx/start.S
  • arch/mips/cpu/start.S

and so on. From there, three functions are called; the purpose and limitations of each of these functions are described below.

lowlevel_init():

- purpose: essential init to permit execution to reach board_init_f()
- no global_data or BSS
- there is no stack (ARMv7 may have one but it will soon be removed)
- must not set up SDRAM or use console
- must only do the bare minimum to allow execution to continue to
	board_init_f()
- this is almost never needed
- return normally from this function

board_init_f():

  • purpose: set up the machine ready for running board_init_r(): i.e. SDRAM and serial UART
  • global_data is available
  • stack is in SRAM
  • BSS is not available, so you cannot use global/static variables, only stack variables and global_data

Non-SPL-specific notes:

  • dram_init() is called to set up DRAM. If already done in SPL this can do nothing

SPL-specific notes:

  • you can override the entire board_init_f() function with your own version as needed.
  • preloader_console_init() can be called here in extremis
  • should set up SDRAM, and anything needed to make the UART work
  • these is no need to clear BSS, it will be done by crt0.S
  • for specific scenarios on certain architectures an early BSS can be made available (via CONFIG_SPL_EARLY_BSS by moving the clearing of BSS prior to entering board_init_f()) but doing so is discouraged. Instead it is strongly recommended to architect any code changes or additions such to not depend on the availability of BSS during board_init_f() as indicated in other sections of this README to maintain compatibility and consistency across the entire code base.
  • must return normally from this function (don’t call board_init_r() directly)

Here the BSS is cleared. For SPL, if CONFIG_SPL_STACK_R is defined, then at this point the stack and global_data are relocated to below CONFIG_SPL_STACK_R_ADDR. For non-SPL, U-Boot is relocated to run at the top of memory.

board_init_r():

  • purpose: main execution, common code
  • global_data is available
  • SDRAM is available
  • BSS is available, all static/global variables can be used
  • execution eventually continues to main_loop()

Non-SPL-specific notes:

  • U-Boot is relocated to the top of memory and is now running from there.

SPL-specific notes:

  • stack is optionally in SDRAM, if CONFIG_SPL_STACK_R is defined and CONFIG_SPL_STACK_R_ADDR points into SDRAM
  • preloader_console_init() can be called here - typically this is done by selecting CONFIG_SPL_BOARD_INIT and then supplying a spl_board_init() function containing this call
  • loads U-Boot or (in falcon mode) Linux

Linux HOWTO

Porting Linux to U-Boot based systems:

Configuring the Linux kernel:

参考资料