U-Boot及Linux使用手册(上)
- 格式:pdf
- 大小:1.86 MB
- 文档页数:17
概述:=====本目录包含U-Boot的源代码。
U-Boot是一个用于嵌入式单板的bootloader,支持PowerPC, ARM, MIPS及其它几种处理器。
它可以安装在boot ROM中,用来对硬件进行初始化和测试,或者下载及运行应用代码。
U-Boot的开发与Linux联系紧密:有一部分代码来源于Linux内核代码树,两者有一些相同的头文件,并且U-Boot为支持Linux映像的启动也提供了特别的支持。
为了使该软件能易于配置及扩展,我们已经做了一些工作。
比如所有操作命令都以相同的调用接口实现,这样便于添加新的命令。
此外,你还可以在monitor上动态地加载及运行代码,而不是向monitor添加不太常用的代码(比如硬件测试程序)。
状态:=====对于在Makefile中存在配置的单板,一般是经过一定的测试,并可以为是"可工作的"。
实际上,很多单板也正式地在生产中使用。
遇到问题时,请在CHANGELOG和CREDITS两个文件中查找一个具体的移植是由谁贡献的。
MAINTAINERS文件列出了单板维护者。
获取帮助:=========如果你对U-Boot有疑问,或者想为U-Boot贡献,你应该向U-Boot邮件列表<u-boot-users@>发送消息。
在提问前,请搜索邮件列表的历史记录:/lists/listinfo/u-boot-users/获取源代码:===========U-Boot源代码使用git仓库维护,地址为:git://www.denx.de/git/u-boot.git;你也可以在线浏览:http://www.denx.de/cgi-bin/gitweb.cgi?p=u-boot.git;a=summary该页面的"snapshots"链接允许你下载任一版本的源码树。
官方发布可以通过FTP下载:ftp://ftp.denx.de/pub/u-boot/预编译(并经过测试)的映像可以从这里下载:ftp://ftp.denx.de/pub/u-boot/images/我们来自哪里:=============- 从8xxrom源代码开始- 建立了PPCBoot 项目(/projects/ppcboot)- 清理代码- 让代码更易于添加自定义单板- 可以添加其它类型的[PowerPC] CPU- 扩展了函数,特别是:* 为Linux 引导程序提供了扩展的接口* 下载S-Record* 从网络引导* 从PCMCIA / CompactFlash / ATA disk / SCSI ... 等设备引导- 建立了ARMBoot项目(/projects/armboot)- 添加了其它CPU家族(从ARM开始)- 建立了U-Boot 项目(/projects/u-boot)- 当前项目的主页: http://www.denx.de/wiki/U-Boot命名与拼写:===========本项目的官方名称为"Das U-Boot"。
CAS training Rev.4, 9/2021 S32G RDB2 Linux板级开发包Uboot 定制by John Li (nxa08200)本文说明S32G RDB2板Linux板级开发包BSP30 的Uboot细节,以帮助客户了解S32G 的Uboot是如何运行的,以及如何修改到客户的新板上。
阅读本文之前请先阅读文档Automotive SW – S32G2 reference Software\Linux\《S32G_LinuxBSP30.0.0_User_Manual.pdf》,预先熟悉一下S32G的编译环境,本文部分内容与之重复。
《S32G_LinuxBSP30.0.0_Release_Notes.pdf》,为release notes。
本文推荐必读有第1,2章,第三章的第3.6节,为平台相关必须了解的信息。
第三章其余部分为Linux背景知识介绍,可以选择阅读。
注意本文是使用默认的no-security uboot 直接启动的方式为说明的,security ATF boot 的方式另文说明,注意使用ATF后部分需要定制的部分在ATF中,uboot会简单很多。
请注意本文为培训和辅助文档,本文不是目录1S32G Linux文档说明 (2)2创建S32G RDB2 Linux板级开发包编译环境 (2)2.1创建yocto编译环境: (2)2.2独立编译 (8)3FSL Uboot 定制 (11)3.1FDT支持 (12)3.2DM(driver model)支持 (17)3.3Uboot目录结构 (29)3.4Uboot编译 (31)3.5Uboot初始化流程 (32)3.6Uboot 定制 (38)3.7Uboot debug信息 (84)S32G Uboot21S32G Linux 文档说明根据文档搭建Yocto 编译环境和standalone 编译环境。
参考Release Noes 的What’s New 一章了解最新的BSP 相对于前一版本的更新。
U-Boot启动过程U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下:(1)第一阶段的功能Ø硬件设备初始化Ø加载U-Boot第二阶段代码到RAM空间Ø设臵好栈Ø跳转到第二阶段代码入口(2)第二阶段的功能Ø初始化本阶段使用的硬件设备Ø检测系统内存映射Ø将内核从Flash读取到RAM中Ø为内核设臵启动参数Ø调用内核1.1.1U-Boot启动第一阶段代码分析第一阶段对应的文件是cpu/arm920t/start.S和board/samsung/mini2440/lowlevel_init.S。
U-Boot启动第一阶段流程如下:图 2.1 U-Boot启动第一阶段流程根据cpu/arm920t/u-boot.lds中指定的连接方式:ENTRY(_start)SECTIONS{. = 0x00000000;. = ALIGN(4);.text :{cpu/arm920t/start.o (.text)board/samsung/mini2440/lowlevel_init.o (.text)board/samsung/mini2440/nand_read.o (.text)*(.text)}……}第一个链接的是cpu/arm920t/start.o,因此u-boot.bin的入口代码在cpu/arm920t/start.o中,其源代码在cpu/arm920t/start.S中。
下面我们来分析cpu/arm920t/start.S的执行。
1.硬件设备初始化(1)设臵异常向量cpu/arm920t/start.S开头有如下的代码:.globl _start_start: b start_code /* 复位*/ldr pc, _undefined_instruction /* 未定义指令向量 */ldr pc, _software_interrupt /* 软件中断向量*/ldr pc, _prefetch_abort /* 预取指令异常向量 */ldr pc, _data_abort /* 数据操作异常向量 */ldr pc, _not_used /* 未使用 */ldr pc, _irq /* irq中断向量 */ldr pc, _fiq /* fiq中断向量 *//* 中断向量表入口地址 */_undefined_instruction: .word undefined_instruction_software_interrupt: .word software_interrupt_prefetch_abort: .word prefetch_abort_data_abort: .word data_abort_not_used: .word not_used_irq: .word irq_fiq: .word fiq.balignl 16,0xdeadbeef以上代码设臵了ARM异常向量表,各个异常向量介绍如下:表 2.1 ARM异常向量表在cpu/arm920t/start.S中还有这些异常对应的异常处理程序。
U-BOOT介绍以及常用U-bot命令介绍一. BootLoader简介在专用的嵌入式板子运行GNU/Linux系统已经变得越来越流行。
一个嵌入式Linux系统从软件的角度看通常可以分为四个层次:1、引导加载程序。
包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分。
2、 Linux内核。
特定于嵌入式板子的定制内核以及内核的启动参数。
3、文件系统。
包括根文件系统和建立于Flash内存设备之上文件系统。
通常用ramdisk来作为rootfs。
4、用户应用程序。
特定于用户的应用程序。
有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。
常用的嵌入式GUI有:MicroWindows和MiniGUI懂。
引导加载程序是系统加电后运行的第一段软件代码。
PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的OS BootLoader(比如,LILO和GRUB等)一起组成。
BIOS在完成硬件检测和资源分配后,将硬盘MBR中的BootLoader读到系统的RAM中,然后将控制权交给OS BootLoader。
BootLoader的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。
而在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。
比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。
简单地说,BootLoader就是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
u-boot向linux内核传递启动参数(详细)U-BOOT 在启动内核时,会向内核传递一些参数.BootLoader 可以通过两种方法传递参数给内核,一种是旧的参数结构方式(parameter_struct),主要是2.6 之前的内核使用的方式。
另外一种就是现在的2.6内核在用的参数链表(tagged list) 方式。
这些参数主要包括,系统的根设备标志,页面大小,内存的起始地址和大小,RAMDISK的起始地址和大小,压缩的RAMDISK根文件系统的起始地址和大小,当前内核命令参数等而这些参数是通过struct tag来传递的。
U-boot 把要传递给kernel 的东西保存在struct tag 数据结构中,启动kernel 时,把这个结构体的物理地址传给kernel;Linux kernel 通过这个地址分析出u-boot传递的参数。
大家都知道U-Boot启动的时候会将启动参数的地址放入R2中,然后再启动内核。
首先看两个重要的数据结构:第一个是global_data,定义在include/asm-arm/global_data.h文件中:typedef struct global_data {bd_t *bd;unsigned long flags;unsigned long baudrate;unsigned long have_console; /* serial_init() was called */unsigned long reloc_off; /* Relocation Offset */unsigned long env_addr; /* Address of Environment struct */unsigned long env_valid; /* Checksum of Environment valid? */unsigned long fb_base; /* base address of frame buffer */#ifdef CONFIG_VFDunsigned char vfd_type; /* display type */#endif#if 0unsigned long cpu_clk; /* CPU clock in Hz! */unsigned long bus_clk;unsigned long ram_size; /* RAM size */unsigned long reset_status; /* reset status register at boot */#endifvoid **jt; /* jump table */} gd_t;在同一个文件中有如下定义:#define DECLARE_GLOBAL_DATA_PTR register volatile gd_t *gd asm ("r8")在需要使用gd指针的时候,只需要加入DECLARE_GLOBAL_DATA_PTR这句话就可以了。
1.1 概述TI针对DM6467提供的UBOOT和内核默认都是串口0作为调试串口输出的,但现在我需要使用DM6467的UART0的modem功能,所以修改代码,改变调试串口为串口2。
需要修改的主要有几部分内容:1. UBL 代码(这部分代码在刚上电的时候,初始化CPU和拷贝UBOOT到DDR,打印信息只有很少,所以不做修改)。
2. UBOOT代码。
3. linux内核驱动。
2.1 修改UBOOT代码因为DM6467的串口是符合TL16C550标准的,所以驱动也是使用16550的驱动,默认情况下,我们只需要提供需要配置的串口的基地址和中断号等资源给16550的驱动就可以了,寄存器的配置不需要我们去关心。
要用起DM6467的串口有几个地方的配置一定要注意:1. 引脚复用寄存器(PINMUX0/1);2. VDD3P3V_PWDN寄存器,需要使能UART的相关引脚(bit4~bit9置零)3.CLKCTL,bit24/25置零。
在UBOOT里涉及到上面几个寄存器的配置的是在dm6467_evm.c的初始化部分我的修改如下:1static void davinci_hd_psc_enable ( void )2 {3 unsigned int alwaysonpdnum = 0;45/* Note this function assumes that the Power Domains are alread on */6 REG(PSC_ADDR+0xA00+4*14) |= 0x03; /* EMAC */7 REG(PSC_ADDR+0xA00+4*15) |= 0x03; /* VDCE */8 REG(PSC_ADDR+0xA00+4*16) |= 0x03; /* Video Port */9 REG(PSC_ADDR+0xA00+4*17) |= 0x03; /* Video Port */10 REG(PSC_ADDR+0xA00+4*20) |= 0x03; /* DDR2 */11 REG(PSC_ADDR+0xA00+4*21) |= 0x03; /* EMIFA */12 REG(PSC_ADDR+0xA00+4*26) |= 0x03; /* UART0 */13 REG(PSC_ADDR+0xA00+4*27) |= 0x03; /* UART1 */14 REG(PSC_ADDR+0xA00+4*28) |= 0x03; /* UART2 */15 REG(PSC_ADDR+0xA00+4*31) |= 0x03; /* I2C */16 REG(PSC_ADDR+0xA00+4*33) |= 0x03; /* GPIO */17 REG(PSC_ADDR+0xA00+4*34) |= 0x03; /* TIMER0 */18 REG(PSC_ADDR+0xA00+4*35) |= 0x03; /* TIMER1 */1920/* Set PTCMD.GO to 0x1 to initiate the state transtion for Modules i n21 * the ALWAYSON Power Domain22*/23 REG(PSC_PTCMD) = (1<<alwaysonpdnum);2425/* Wait for PTSTAT.GOSTAT0 to clear to 0x0 */26while(! (((REG(PSC_PTSTAT) >> alwaysonpdnum) & 0x00000001) == 0));2728/* Enable GIO3.3V cells used for EMAC (???) */29 REG(VDD3P3V_PWDN) = (1<<27); //disable clkout03031/* Select UART function on UART0 */32 REG(PINMUX0) &= ~(0x0000003f << 18);34 REG(PINMUX1) = ((1<<4)|(1<<2)|(1<<0));3536/* Enable USB */37 REG(PINMUX0) &= ~(0x80000000);3839/* Set the Bus Priority Register to appropriate value */40 REG(VBPR) = 0x20;41 }接下来还有一个比较重要的地方需要修改,因为DM6467的串口是支持多种模式的,但16550的驱动是默认设备是工作在UART模式的,它没有去配置设备串口的工作模式,所以我们需要去配置一下串口的工作模式。
uboot 代码运行流程U-Boot代码运行流程U-Boot(Universal Bootloader)是一个开源的引导加载程序,广泛应用于嵌入式系统中。
它负责在系统上电后初始化硬件并加载操作系统内核,是系统启动的重要一环。
下面将从U-Boot代码的运行流程方面进行介绍。
1. 启动阶段当系统上电后,处理器会从预定义的存储器地址开始运行代码。
U-Boot的启动代码通常存放在ROM中,处理器会从ROM的起始地址开始执行。
启动代码负责初始化处理器和一些外设,然后跳转到U-Boot的入口点。
2. 入口点U-Boot的入口点是指U-Boot的main()函数。
在启动代码的最后,会调用main()函数,从而进入U-Boot的主循环。
U-Boot的主循环负责处理用户输入的命令,并根据命令执行相应的操作。
3. 硬件初始化在main()函数中,首先会进行硬件的初始化工作。
这包括初始化串口、初始化存储器控制器、初始化网络接口等。
硬件初始化的目的是为了确保系统能够正常运行,并为后续的操作做好准备。
4. 系统启动硬件初始化完成后,U-Boot会尝试从存储设备(如闪存、SD卡)中加载操作系统内核镜像。
U-Boot会根据预定义的启动命令(例如bootcmd)来确定从哪个设备加载内核镜像,并执行相应的加载操作。
加载完成后,U-Boot会将控制权交给操作系统内核,进入操作系统的启动阶段。
5. 用户交互一般情况下,U-Boot会在系统启动后进入命令行界面,等待用户输入命令。
用户可以通过串口、网络等方式与U-Boot进行交互,执行各种操作,例如烧写固件、修改配置等。
U-Boot提供了丰富的命令集,可以满足不同的需求。
6. 系统重启当用户输入重启命令或系统发生异常时,U-Boot会执行系统重启操作。
重启操作包括重新初始化硬件、重新加载内核镜像等步骤,以重新启动系统。
U-Boot会将控制权交给重新加载的内核,然后进入内核的启动流程。
总结:U-Boot代码的运行流程包括启动阶段、入口点、硬件初始化、系统启动、用户交互和系统重启等几个关键步骤。
(一)U-Boot启动过程--详细版的完全分析我们知道,bootloader是系统上电后最初加载运行的代码。
它提供了处理器上电复位后最开始需要执行的初始化代码。
在PC机上引导程序一般由BIOS开始执行,然后读取硬盘中位于MBR(Main Boot Record,主引导记录)中的Bootloader(例如LILO或GRUB),并进一步引导操作系统的启动。
然而在嵌入式系统中通常没有像BIOS那样的固件程序,因此整个系统的加载启动就完全由bootloader来完成。
它主要的功能是加载与引导内核映像一个嵌入式的存储设备通过通常包括四个分区:第一分区:存放的当然是u-boot第二个分区:存放着u-boot要传给系统内核的参数第三个分区:是系统内核(kernel)第四个分区:则是根文件系统如下图所示:u-boot是一种普遍用于嵌入式系统中的Bootloader。
Bootloader介绍Bootloader是进行嵌入式开发必然会接触的一个概念,它是嵌入式学院<嵌入式工程师职业培训班>二期课程中嵌入式linux系统开发方面的重要内容。
本篇文章主要讲解Bootloader 的基本概念以及内部原理,这部分内容的掌握将对嵌入式linux系统开发的学习非常有帮助!Bootloader的定义:Bootloader是在操作系统运行之前执行的一小段程序,通过这一小段程序,我们可以初始化硬件设备、建立内存空间的映射表,从而建立适当的系统软硬件环境,为最终调用操作系统内核做好准备。
意思就是说如果我们要想让一个操作系统在我们的板子上运转起来,我们就必须首先对我们的板子进行一些基本配置和初始化,然后才可以将操作系统引导进来运行。
具体在Bootloader中完成了哪些操作我们会在后面分析到,这里我们先来回忆一下PC的体系结构:PC机中的引导加载程序是由BIOS和位于硬盘MBR中的OS Boot Loader(比如LILO和GRUB等)一起组成的,BIOS在完成硬件检测和资源分配后,将硬盘MBR中的Boot Loader读到系统的RAM中,然后将控制权交给OS Boot Loader。