UBOOT2016.05

UART初始化及设置

  1. SPL阶段

第一部分C函数

|- s_init //(arch/arm/cpu/armv7/am33xx/board.c)

|- set_uart_mux_conf(\board\ti\am335x\board.c会用到Kconfig文件中的CONFIG_CONS_INDEX来初始化对应的UART)

|-enable_uart0_pin_mux(\board\ti\am335x\Mux.c)

|-configure_module_pin_mux    (src\arch\arm\cpu\armv7\am33xx\Mux.c进行PINMUX设置)

|-setup_clocks_for_console(\arch\arm\cpu\armv7\am33xx\Clock_am33xx.c初始化各个UART控制器时钟)

|-uart_soft_reset(\arch\arm\cpu\armv7\am33xx\board.c   会用到\arch\arm\include\asm\arch-am33xx\Hardware.h的#define DEFAULT_UART_BASE  UART0_BASE

进一步的定义在arch\arm\include\asm\arch-am33xx\Hardware_am33xx.h    #define UART0_BASE          0x44E09000 )

第二部分C函数

|- board_init_f //(arch/arm/cpu/armv7/am33xx/board.c)
       |- board_early_init_f
//(arch/arm/cpu/armv7/am33xx/board.c)
           |- prcm_init(\arch\arm\cpu\armv7\am33xx\Clock.c)

|-enable_basic_clocks(\arch\arm\cpu\armv7\am33xx\Clock_am33xx.c
外设单元时钟域初始化)

|-scale_vcores(\arch\arm\cpu\armv7\am33xx\Clock.c  暂无作用?);

|-setup_dplls(\arch\arm\cpu\armv7\am33xx\Clock.c  暂时理解为各单元PLL初始化)

|-timer_init(src\arch\arm\cpu\armv7\omap-common\Timer.c
不确定???)

|-set_mux_conf_regs(\board\ti\am335x\ Board.c);

|-enable_board_pin_mux(\board\ti\am335x\ Mux.c 根据板子类型进行PINUMUX配置,注意,这里根据板子类型,第二次设置了串口的PINMUX)

|-configure_module_pin_mux(src\arch\arm\cpu\armv7\am33xx\Mux.c   进行PINMUX设置 这里设置了mmc0_pin_mux、nand_pin_mux、mmc1_pin_mux、gpio0_18_pin_mux、uart3_icev2_pin_mux、rmii1_pin_mux、rgmii1_pin_mux、spi0_pin_mux、som_led_pin_mux)

|- update_rtc_magic(\arch\arm\cpu\armv7\am33xx\ Board.c 
RTC相关)

|-
gpio_direction_output(GPIO_LED_SOM_D1,
SOM_LED_ON)(用户自定义的LED显示,这里可以加一些状态)

|- sdram_init (\board\\ti\am335x\
Board.c 根据板子类型进行DDR初始化)

第三部分C函数

board_init_r(\common\spl\spl.c)

|- spl_init(\common\spl\spl.c  是FDT和DM初始化有关,在SPL阶段不进行,跳过此过程)

|-timer_init(初始化时钟
arch/arm/cpu/armv7/omap_common/Timer.c
待确定);

|- spl_board_init(\arch\arm\cpu\armv7\omap-common\ Boot-common.c)

|-save_omap_boot_params(\arch\arm\cpu\armv7\omap-common\ Boot-common.c)

这里讲boot_device的参数传递给spl_boot_list(自己理解),确定以什么方式加载u-boot.img(uart or spi or mmc or nand....)

|-preloader_console_init(\common\spl\Spl.c)  (是否可以把这个函数位置提前,便可提早打印更多LOG)

|-
serial_init(/drivers/serial/serial.c)

串口通信建立,该函数会利用gdata结构体中的baudrate对实际硬件进行操作

|-gpmc_init

|-i2c_init

|-arch_misc_init

|-hw_watchdog_init

|-am33xx_spl_board_init(根据具体评估板进行一些初始化,与MPU clock frequency和电源管理芯片有关的操作)

|-board_boot_order(spl_boot_list)(\common\spl\ Spl.c)

|-spl_boot_list[0] = spl_boot_device();

|-gd->arch.omap_boot_device; //this
parament saved early: save_omap_boot_params

|-spl_load_image

spl_mmc_load_image(); // we will boot from
MMC, whether MMC  or SD

也就是说所我们选择从MMC中加载uboot,要做的工作就是:

1. spl_mmc_find_device

2. err =
mmc_init(mmc);//if mmc initial is complete, it will return 0

3.
 boot_mode = spl_boot_mode();//recognize boot mode from global_data

// gd->arch.omap_boot_mode

|-spl_mmc_do_fs_boot

|- spl_load_image_fat

//根据选择文件类型,或raw或者是fat类型,将mmc设备中的uboot镜像加载到SDRAM中,至此完成了uboot镜像从mmc中加载到SDRAM中。但是目前程序任然还是SPL阶段,所以CPU的指针还是指向SRAM

|-jump_to_image_no_args //跳转到Uboot阶段

2、Uboot阶段

|-board_init_f  (\common\ Board_f.c)

|- setup_mon_len  //获取dtb的地址,并且验证dtb的合法性

|- fdtdec_setup   //获取dtb的地址,并且验证dtb的合法性

|- initf_malloc   //  early malloc的内存池的设定

|- initf_console_record   // console的log的缓存

|- arch_cpu_init (\arch\arc\lib\ Cpu.c)

|- initf_dm

|- arch_cpu_init_dm(\arch\arm\cpu\armv7\omap-common\ Hwinit-common.c)

|- early_system_init

|- init_omap_revision

|- hw_data_init

|- watchdog_init

|- set_mux_conf_regs

|- setup_early_clocks

|- do_board_detect

|- vcores_update

|- prcm_init

|- mark_bootstage,     /* need timer, go after init dm */

|- board_early_init_f

|- prcm_init

|- set_mux_conf_regs   //与SPL阶段一样,进行PINMUX设置

|- env_init     * initialize environment */

// 环境变量的初始化,后续会专门研究一下关于环境变量的内容

|-init_baud_rate// getenv_ulong("baudrate",
10, CONFIG_BAUDRATE);

|- serial_init

|-
serial_find_console_or_panic /*
serial communications setup */

|- console_init_f// /*
Called before relocation - use serial functions */ /* stage 1 init of console
*/

|- fdtdec_prepare_fdt

|-display_options,  /* say that we are here */

|-display_text_info,   /* show debugging info if required */

|- print_cpuinfo,    /* display cpu info (and speed) */

|- show_board_info,

|- misc_init_f

|- init_func_i2c

|- init_func_spi

|- dram_init /* configure available RAM banks */

// ddr的初始化,最重要的是ddr ram size的设置!!!!gd->ram_size

// 如果说uboot是在ROM、flash中运行的话,那么这里就必须要对DDR进行初始化

/*

* Now that we have DRAM mapped and working, we
can

* relocate the code and continue running from
DRAM.

*

* Reserve memory at end of RAM for (top down
in that order):

*  -
area that won't get touched by U-Boot and Linux (optional)

*  -
kernel log buffer

*  -
protected RAM

*  - LCD
framebuffer

*  -
monitor code

*  -
board info struct

*//**************************//

|- setup_dest_addr

|-reserve_round_4k,

|-reserve_trace,

|-setup_machine,

|-reserve_global_data,

|- reserve_fdt,

|-reserve_arch,

|-reserve_stacks,

//****************************// ==以上部分是对relocate区域的规划,具体参考《[uboot] (番外篇)uboot relocation介绍》

|-setup_dram_config,

|-show_dram_config,

|-display_new_sp,

|-reloc_fdt,

|-setup_reloc

//****** relocation之后gd一些成员的设置*********//

注意,必须保证上述的函数都正确地返回0值,否则会导致hang。

|-board_init_r// uboot relocate之前的板级初始化的核心就是init_sequence_r中定义的函数了。

|-initr_trace  // trace相关的初始化

|- initr_reloc
//标记已经重定位成功,malloc初始化 *

|- initr_caches// //使能cache

|- initr_reloc_global_data //
relocate之后,gd中一些的成员的重新设置

|- initr_malloc
// malloc内存池的设置

|- initr_console_record//

|- bootstage_relocate
//重定位bootargs的参数,

|- initr_dm//初始化DM和根设备?

|- initr_bootstage// initr_bootstage
把动态内存分配的bootargs处理一下

|- board_init//板级外设初始化

|- stdio_init_tables//

|- initr_serial

serial_find_console_or_panic()///*  再一次初始化串口, */

gd->flags |= GD_FLG_SERIAL_READY;   /* 并标记串口初始化成功 */

|- initr_announce//打印uboot运行位置的log

|- initr_logbuffer// // logbuffer的初始化

|- initr_nand//nand初始化

|- initr_mmc//MMC初始化

|- initr_env//初始化环境变量

|- initr_secondary_cpu//?

|- stdio_add_devices//增加标准输出?

|- initr_jumptable// 初始化跳转表?

|- console_init_r// /*
fully init console as a device */

|- arch_misc_init// /* miscellaneous arch-dependent init */

|- interrupt_init//初始化中断

|- initr_enable_interrupts//使能中断

|- initr_status_led
//状态指示LED的初始化(自定义)

|- initr_ethaddr//网络地址初始化

|- board_late_init//进行了一些网络相关设置???

|- initr_net//
网络初始化,网络配置部分的重点,结合DM使用。

|- run_main_loop

|- main_loop

AM335X UBOOT(以UART为例分析UBOOT主要流程)的更多相关文章

  1. 【Bootloader】探究bootloader,分析u-boot源码

    Preface 之前也发表过关于<Bootloader启动过程分析>的文章,但是内容表达得比较抽象,大多是文字叙述,所以这里从系统和代码的角度来深入分析bootloader的启动过程. 工 ...

  2. MPC8313ERDB在Linux从NAND FLASH读取UBoot环境变量的代码分析

    MPC8313ERDB在Linux从NAND FLASH读取UBoot环境变量的代码分析 Yao.GUET@2014-05-19 一.故事起因 由于文件系统的增大,已经大大的超出了8MB的NOR FL ...

  3. 嵌入式linux开发uboot启动过程源码分析(一)

    一.uboot启动流程简介 与大多数BootLoader一样,uboot的启动过程分为BL1和BL2两个阶段.BL1阶段通常是开发板的配置等设备初始化代码,需要依赖依赖于SoC体系结构,通常用汇编语言 ...

  4. UBoot配置编译及Makefile分析

    一. UBoot配置编译初步分析 1. UBoot源码结构 (1)UBoot工程项目中的文件可以分为3类 ① 第1类目录:与处理器体系结构或开发板硬件直接相关 ② 第2类目录:一些通用的函数或驱动程序 ...

  5. [uboot] (第五章)uboot流程——uboot启动流程

    http://blog.csdn.net/ooonebook/article/details/53070065 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...

  6. [uboot] (第三章)uboot流程——uboot-spl代码流程

    http://blog.csdn.net/ooonebook/article/details/52957395 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...

  7. [uboot] (番外篇)uboot串口&console&stdio设备工作流程 (转)

    [uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)[project X] tiny210(s5pv210)从存储设备加载代码到D ...

  8. [uboot] (番外篇)uboot 驱动模型(转)重要

    [uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)[project X] tiny210(s5pv210)从存储设备加载代码到D ...

  9. [uboot] (第三章)uboot流程——uboot-spl代码流程(转)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/ooonebook/article/det ...

随机推荐

  1. 4.28(TG模拟赛)总结

    1.挖地雷 题目背景 NOIp1996提高组第三题 题目描述 在一个地图上有N个地窖(N≤20),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径.当地窖及其连接的数据给出之后,某人可以从任 ...

  2. 【可持久化线段树】【P5826】【模板】子序列自动机

    [可持久化线段树][P5826][模板]子序列自动机 Description 给定一个序列 \(A\),有 \(q\) 次询问,每次询问一个序列 \(B\) 是不是 \(A\) 的子序列 Limita ...

  3. 根据IP查询所在城市接口(查询用户所在城市)

    转自:https://blog.csdn.net/liona_koukou/article/details/75646313 最近项目有用到定位用户客户端打开页面时所在的城市的需求,找到如下接口,做个 ...

  4. 构建一个给爬虫使用的代理IP池

    做网络爬虫时,一般对代理IP的需求量比较大.因为在爬取网站信息的过程中,很多网站做了反爬虫策略,可能会对每个IP做频次控制.这样我们在爬取网站时就需要很多代理IP. 代理IP的获取,可以从以下几个途径 ...

  5. centos git编译

    1. 下载git源码 https://git-scm.com 2. 根据文档一步步操作 https://git-scm.com/book/en/v2/Getting-Started-Installin ...

  6. .NET技术webconfig加密操作

    webconfig 加密 aspnet_regiis.exe -pef secion physical_directory -prov provider    section表示要加密的配置节 phy ...

  7. Java并发之多线程下竞态条件概念的理解

    一.简述 竞态条件(Race Condition):计算的正确性取决于多个线程的交替执行时序时,就会发生竞态条件. 二.常见竞态条件分析 最常见的竞态条件为 1.先检测后执行 执行依赖于检测的结果,而 ...

  8. SQL中join连接查询时条件放在on后与where后的区别

    数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户. 在使用left jion时,on和where条件的区别如下: 1. on条件是在生成临时表时使用的条 ...

  9. cad.net 块裁剪边界反向修剪

    Querying for XCLIP information inside AutoCAD using .NET  这里下面观众讨论了 How do I determine if an x-clip ...

  10. angular get 数据请求

    数据请求 get 新建一个服务 1. ng g service services /+服务名  eg:ng g service services/player 在此服务中进行设置 引入自带组件以及注册 ...