zoukankan      html  css  js  c++  java
  • AM335X UBOOT(以UART为例分析UBOOT主要流程)

     UBOOT2016.05

                            UART初始化及设置

    1. SPL阶段

    第一部分C函数

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

         |- set_uart_mux_conf(oard iam335xoard.c会用到Kconfig文件中的CONFIG_CONS_INDEX来初始化对应的UART)

             |-enable_uart0_pin_mux(oard iam335xMux.c)

                |-configure_module_pin_mux    (srcarcharmcpuarmv7am33xxMux.c进行PINMUX设置)

         |-setup_clocks_for_console(archarmcpuarmv7am33xxClock_am33xx.c初始化各个UART控制器时钟)

         |-uart_soft_reset(archarmcpuarmv7am33xxoard.c   会用到archarmincludeasmarch-am33xxHardware.h的#define DEFAULT_UART_BASE  UART0_BASE   

    进一步的定义在archarmincludeasmarch-am33xxHardware_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(archarmcpuarmv7am33xxClock.c)

                 |-enable_basic_clocks(archarmcpuarmv7am33xxClock_am33xx.c 外设单元时钟域初始化)

                 |-scale_vcores(archarmcpuarmv7am33xxClock.c  暂无作用?);

                 |-setup_dplls(archarmcpuarmv7am33xxClock.c  暂时理解为各单元PLL初始化)

                 |-timer_init(srcarcharmcpuarmv7omap-commonTimer.c 不确定???)

             |-set_mux_conf_regs(oard iam335x Board.c);

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

                    |-configure_module_pin_mux(srcarcharmcpuarmv7am33xxMux.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(archarmcpuarmv7am33xx Board.c  RTC相关)

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

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

    第三部分C函数

    board_init_r(commonsplspl.c)

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

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

    |- spl_board_init(archarmcpuarmv7omap-common Boot-common.c)

       |-save_omap_boot_params(archarmcpuarmv7omap-common Boot-common.c)

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

        |-preloader_console_init(commonsplSpl.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)(commonspl 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 (archarclib Cpu.c)

      |- initf_dm

      |- arch_cpu_init_dm(archarmcpuarmv7omap-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

  • 相关阅读:
    DP 水题 最长不下降子序列
    数的划分
    水题------纪念品分组
    NY95 众数问题
    NY86 找球号(一)
    C3-Zexal的矩阵链乘
    C3-Zexal的多路流水线调度
    C4-Zexal的食物链
    C4-排列
    C3-炮弹杀伤力
  • 原文地址:https://www.cnblogs.com/lh03061238/p/11264444.html
Copyright © 2011-2022 走看看