AM335X UBOOT(以UART为例分析UBOOT主要流程)
UBOOT2016.05
UART初始化及设置
- 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主要流程)的更多相关文章
- 【Bootloader】探究bootloader,分析u-boot源码
Preface 之前也发表过关于<Bootloader启动过程分析>的文章,但是内容表达得比较抽象,大多是文字叙述,所以这里从系统和代码的角度来深入分析bootloader的启动过程. 工 ...
- MPC8313ERDB在Linux从NAND FLASH读取UBoot环境变量的代码分析
MPC8313ERDB在Linux从NAND FLASH读取UBoot环境变量的代码分析 Yao.GUET@2014-05-19 一.故事起因 由于文件系统的增大,已经大大的超出了8MB的NOR FL ...
- 嵌入式linux开发uboot启动过程源码分析(一)
一.uboot启动流程简介 与大多数BootLoader一样,uboot的启动过程分为BL1和BL2两个阶段.BL1阶段通常是开发板的配置等设备初始化代码,需要依赖依赖于SoC体系结构,通常用汇编语言 ...
- UBoot配置编译及Makefile分析
一. UBoot配置编译初步分析 1. UBoot源码结构 (1)UBoot工程项目中的文件可以分为3类 ① 第1类目录:与处理器体系结构或开发板硬件直接相关 ② 第2类目录:一些通用的函数或驱动程序 ...
- [uboot] (第五章)uboot流程——uboot启动流程
http://blog.csdn.net/ooonebook/article/details/53070065 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...
- [uboot] (第三章)uboot流程——uboot-spl代码流程
http://blog.csdn.net/ooonebook/article/details/52957395 以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为 ...
- [uboot] (番外篇)uboot串口&console&stdio设备工作流程 (转)
[uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)[project X] tiny210(s5pv210)从存储设备加载代码到D ...
- [uboot] (番外篇)uboot 驱动模型(转)重要
[uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)[project X] tiny210(s5pv210)从存储设备加载代码到D ...
- [uboot] (第三章)uboot流程——uboot-spl代码流程(转)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/ooonebook/article/det ...
随机推荐
- 【luoguP1382】楼房
题目描述 离散化,线段树维护区间修改,发现询问都是单点的\(max\),不妨把标记留在点上,不用下传,查询时取个\(max\)就可以了 #include<algorithm> #inclu ...
- 解析node-cors模块
(function () { 'use strict'; var assign = require('object-assign'); var vary = require('vary'); var ...
- SpringMVC拦截器与SpringBoot自定义拦截器
首先我们先回顾一下传统拦截器的写法: 第一步创建一个类实现HandlerInterceptor接口,重写接口的方法. 第二步在XML中进行如下配置,就可以实现自定义拦截器了 SpringBoot实现自 ...
- BuaaRedSun团队博客目录——北航社团项目
目录 一.Scrum Meeting 1. Alpha 2. Beta 3. Gamma 二.测试报告 三.发布说明 四.技术博客 后端 前端 五.习得的软工原理/方法/技能? Alpha Beta ...
- 自定义Yaml解析器替换Properties文件
自定义Yaml解析器替换Properties文件 项目结构 案例代码 配置类SpringConfiguration @Configuration @Import(JdbcCofnig.class) @ ...
- JavaScript的这个缺陷,让多少程序员为之抓狂?
相信提到JavaScript语言,每一个程序员的心理状态都是不一样的,有的对此深恶痛绝,有的又觉得其可圈可点,造成这种两级分化态度的原因还是由于其自身类型约束上的缺陷,直到现如今依旧无法解决. 本文由 ...
- 了解编程语言 ----- c# 简介
1.编程语言 编程语言: 为了实现人与机器的交互,计算机主要识别的就是 0 和 1 语言的发展过程主要分为: 1.面向机器的语言:二进制,汇编 2.面向过程的语言:汇编语言,C语言,B语言, 3.基于 ...
- [转帖]Linux chattr 命令详解
Linux chattr 命令详解 https://www.cnblogs.com/ftl1012/p/chattr.html 常见命令参数 1 2 3 4 5 6 7 8 9 10 11 12 A: ...
- 【转载】数字IC设计流程及开发工具
原文链接:https://www.zhihu.com/question/28322269/answer/42048070 Design Flow &lt;img src="h ...
- Docker-Compose搭建单体SkyWalking 6.2
SkyWalking简介 SkyWalking是一款高效的分布式链路追踪框架,对于处理分布式的调用链路的问题定位上有很大帮助 有以下特点: 性能好 针对单实例5000tps的应用,在全量采集的情况下, ...