u-boot的移植与分析(第一阶段硬件初始化)(代码片段)

imunrobot imunrobot     2022-12-04     775

关键词:

1.UBOOT 运行的第一个文件是:cpu/arm920t/start.S(从程序的链接脚本中知道)

 1 .globl _start                         // .globl定义一个全局符号"_start"
 2 _start:    b       reset                    // 系统复位设置
 3     ldr    pc, _undefined_instruction          //未定义异常
 4     ldr    pc, _software_interrupt            //软件中断异常
 5     ldr    pc, _prefetch_abort           //内存操作异常
 6     ldr    pc, _data_abort                     //数据异常
 7     ldr    pc, _not_used              //未使用
 8     ldr    pc, _irq                 //中断异常(中断属于异常的一种)
 9     ldr    pc, _fiq                //快速中断异常
10 
11 _undefined_instruction:    .word undefined_instruction   //异常处理函数
12 _software_interrupt:    .word software_interrupt
13 _prefetch_abort:    .word prefetch_abort
14 _data_abort:        .word data_abort
15 _not_used:        .word not_used
16 _irq:            .word irq
17 _fiq:            .word fiq
1 reset:
2     /*
3      * set the cpu to SVC32 mode 将 CPU 设置为 SVC32 管理模式
1 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
2     adr    r0, _start        /* r0 <- current position of code   */
3     ldr    r1, _TEXT_BASE        /* test if we run from flash or RAM */
4     cmp     r0, r1                  /* dont reloc during debug         */
5     blne    cpu_init_crit
6 #endif
 1 /* turn off the watchdog 关闭 看门狗*/
 2 #if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)   
 3     ldr     r0, =pWTCON
 4     mov     r1, #0x0
 5     str     r1, [r0]
 1     /*
 2      * mask all IRQs by setting all bits in the INTMR - default  屏蔽所有中断
 3      */
 4     mov    r1, #0xffffffff
 5     ldr    r0, =INTMSK
 6     str    r1, [r0]
 7 # if defined(CONFIG_S3C2410)
 8     ldr    r1, =0x3ff
 9     ldr    r0, =INTSUBMSK
10     str    r1, [r0]
11 # endif
/*
判断系统是从nand启动的还是直接将程序下载到SDRAM中运行,
若系统从nand启动,这里得到r0和r1值是不一样的,r1=0x33f80000,
而r0=0x00000000。说明没初始化SDRAM,ne(no equal)标识符为真,所以bl cpu_init_crit执行跳转.
*/
1
#ifndef CONFIG_SKIP_LOWLEVEL_INIT 2 adr r0, _start /* r0 <- current position of code adr 是读地址指令,当前 _start 这段代码位于哪里 */ 3 ldr r1, _TEXT_BASE /* test if we run from flash or RAM */ 4 cmp r0, r1 /* dont reloc during debug */ 5 blne cpu_init_crit 6 #endif
 1 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
 2 cpu_init_crit:
 3     /*
 4      * flush v4 I/D caches 先关 flush 清 caches
 5      */
 6     mov    r0, #0
 7     mcr    p15, 0, r0, c7, c7, 0    /* flush v3/v4 cache */
 8     mcr    p15, 0, r0, c8, c7, 0    /* flush v4 TLB */
 9 
10     /*
11      * disable MMU stuff and caches  关闭MMU
12      */
13     mrc    p15, 0, r0, c1, c0, 0
14     bic    r0, r0, #0x00002300    @ clear bits 13, 9:8 (--V- --RS)
15     bic    r0, r0, #0x00000087    @ clear bits 7, 2:0 (B--- -CAM)
16     orr    r0, r0, #0x00000002    @ set bit 2 (A) Align
17     orr    r0, r0, #0x00001000    @ set bit 12 (I) I-Cache
18     mcr    p15, 0, r0, c1, c0, 0
19 
20     /*
21      * before relocating, we have to setup RAM timing
22      * because memory timing is board-dependend, you will
23      * find a lowlevel_init.S in your board directory.
24      */
25     mov    ip, lr
26     bl    lowlevel_init     //进入lowlevel_init初始化13个BANK寄存器来初始化SDRAM
27     mov    lr, ip
28     mov    pc, lr
29 #endif /* CONFIG_SKIP_LOWLEVEL_INIT */
 1     /* Set up the stack          栈的设置                  */
 2 stack_setup:
 3     ldr    r0, _TEXT_BASE        /* upper 128 KiB: relocated uboot   */
 4     sub    r0, r0, #CFG_MALLOC_LEN    /* malloc area                      */
 5     sub    r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo                        */
 6 
 7 #ifdef CONFIG_USE_IRQ
 8     sub    r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
 9 #endif
10     sub    sp, r0, #12        /* leave 3 words for abort-stack    */
11 
12 #ifndef CONFIG_SKIP_LOWLEVEL_INIT
13     bl clock_init                               //进入 clock_init 函数
14 #endif    
1 relocate:                /* relocate U-Boot to RAM  重定位代码 拷贝u-boot到SDRAM      */
2     adr    r0, _start        /* r0 <- current position of code   */
3     ldr    r1, _TEXT_BASE        /* test if we run from flash or RAM */
4     cmp     r0, r1                  /* dont reloc during debug         */
5     beq     clear_bss
6     
7     ldr    r2, _armboot_start
8     ldr    r3, _bss_start
9     sub    r2, r3, r2        /* r2 <- size of armboot            */
1 clear_bss:     /*清除BSS段*/
2     ldr    r0, _bss_start        /* find start of bss segment        */
3     ldr    r1, _bss_end        /* stop here                        */
4     mov     r2, #0x00000000        /* clear                            */
clbss_l:str    r2, [r0]        /* clear loop...                    */
    add    r0, r0, #4
    cmp    r0, r1
    ble    clbss_l
1     ldr    pc, _start_armboot
2 
3 _start_armboot:    .word start_armboot   /*最后调用 C 函数 start_armboo 用来实现第2阶段硬件相关的初始化*/

 

u-boot.2012.10——mini2440(启动流程分析)

...an19840208/article/details/72399491、第一阶段功能  *硬件设备初始化  *加载u-boot第二段代码到RAM空间  *设置好栈  *跳转到第二段代码入口2、第二段代码的功能  *初始化本阶段使用的硬件设备  *检测系统的内存映射  ... 查看详情

uboot移植之start_armboot()函数分析

/********************************uboot的第二阶段就是初始化剩下的还没在第一阶段初始化的硬件。主要是SoC外部硬件(譬如iNand网卡芯片.......)uboot本身的一些东西(uboot的命令环境变量等.....)。然后最终初始化完必要的东西后进入到u... 查看详情

u-boot-2016.07移植(第一篇)初步分析

U-BOOT-2016.07移植 (第一篇) 初步分析目录U-BOOT-201607移植 第一篇 初步分析目录编译和移植环境更新交叉编译工具1下载arm-linux-gcc4432安装arm-linux-gcc443安装环境Ubuntu910下载u-boot-201607并解压分析顶层Makefile1找出目标依赖关系2总结... 查看详情

移植最新u-boot之裁剪和修改默认参数

...过链接命令分析组成文件、阅读代码分析启动过程  a.初始化硬件:关看门狗、设置时钟、设置SDRAM、初始化NANDFLASH  b.如果b 查看详情

tiny4412u-boot分析u-boot启动流程

...u-boot的启动分成两个阶段,第一个阶段主要的职责是准备初始化的环境,主要有以下几点①设置异常向量表②把CPU的工作模式设置为SVC32模式③关闭中断、MMU和cache④关闭看门狗⑤初始化内存、时钟、串口⑥设置堆栈⑦代码搬移... 查看详情

u-boot启动流程分析--start_armboot函数

第二阶段的功能:  初始化本阶段所需的硬件设备(主要设置系统时钟、初始化串口、Flash、网卡、USB)  检测系统内存映射(memorymap)  将内核映像和根文件系统映象从Flash上读到RAM空间中  为内核设置启动参数  ... 查看详情

成为linux程序员需要学习啥

...器11硬件环境的搭建;arm-linux-gcc与gcc安装配置第四部分:U-Boot:了解U-Boot的作用及工作流程;了解Bootloader的代码结构、编译过程;移植U-Boot;掌握常用的U-Boot命令。 Bootloader介绍u-boot工程介绍u-boot的编译使用u-boot源码分析u-boot... 查看详情

u-boot分析与使用(代码片段)

文章目录一、u-boot介绍二、u-boot源码结构三、u-boot打补丁、编译、烧写四、uboot功能、结构,结合Makefile进行分析五、u-boot分析之源码阶段六、u-boot分析之命令实现七、uboot启动内核一、u-boot介绍u-boot即通用的BootLoader,是... 查看详情

第二章tiny4412u-boot移植二启动分析

本文转载自:http://blog.csdn.net/eshing/article/details/37521481版权声明:本文为博主原创文章,未经博主允许不得转载。一、启动过程说明      讲解启动过程,首先的源头就是打开电源,这个相信没人人不知道。CPU... 查看详情

u-boot之启动第一阶段(代码片段)

基于samsung的Exynos4412从链接脚本u-boot.lds中我们知道u-boot是从start.s这个汇编文件开始的,所以u-boot启动的第一阶段肯定也是从这里开始的,这个文件在cpu/arm_cortexa9/文件夹下,下面我们依照这个文件一步一步分析u-boot启动的第一阶... 查看详情

uboot源码分析1-启动第一阶段

...置的,因为当前整个代码还在SRAM中运行,此时DDR还未被初始化还不能用  10.1lowlevel_init详解(1)先将LR入栈(2)检查复位状态,防止DDR再次初始化; 冷上电时DDR是需要初始化才能用的;而热启动或者低功耗状态下的... 查看详情

linux系统移植:正点原子u-boot移植(代码片段)

...上电以后先运行一段bootloader程序。这段bootloader程序会先初始化DDR等外设,然后将Linux内核从flash(NAND,NORFLASH,SD,MMC等)拷贝到DDR中,最后启动Linux内核;这段bootloader程序有很多种,比如U-Boot、vivi、RedBo... 查看详情

linux下怎么检查串口号

...段:第一阶段主要是进行cpu和体系结构的检查、cpu本身的初始化以及页表的建立等;第二阶段主要是对系统中的一些基础设施进行初始化;最后则是更高层次的初始化,如根设备和外部设备的初始化。LINUX内核支持很多的硬件体... 查看详情

u-boot代码分析--第一节(代码片段)

u-boot代码分析--第一节编者:weirdo时间:2020-5-12QQ:2651293248标题:u-boot代码分析第一节1.u-boot.lds文件?? 这里指的是顶层目录下面的u-boot.lds,这里需要注意的是这个文件是根据arch/arm/cpu/armvx/对应的u-boot.lds模板生成的,在不严格的... 查看详情

u-boot移植---修改前工作:代码流程分析3---代码重定位

...链接时候的地址就会生成,然后存储在段里面,如下段(u-boot.lds):     查看详情

s5pv210-uboot源码分析-第一阶段

...1-启动第一阶段1、starts.S是我们uboot源码的第一阶段:从u-boot.lds链接脚本中也可以看出start.S是我们整个程序的入口处,怎么看出的呢,因为在链接脚本中有个ENTRY(_start)声明了_start是程序的入口。所以_start符号所在的文件,就是... 查看详情

10th.u-boot——代码结构分析

简介    U-Boot(UniversalBootLoader),通用BootLoader,一是可以引导多种操作系统,二是支持多种架构CPU。     教程中是在sourcefoge网站上下载的U-boot-1.1.6源码,进行分析与移植。 结构分析    U-boot-1.1.6有26个子目录... 查看详情

u-boot-2014-07代码流程分析

前言以前接触到的u-boot启动方式只有Flash和NandFlash这两种方式,最近接触是SD卡启动方式,SoC是S5P4418,启动方式也第一次接触到,根据S5P4418用户手册可以找到系统使用SD卡启动时,片内iROM内固化的代码会自动映射到0x00地址,也... 查看详情