T3 uboot

T3 uboot

1.    关键字... 1

1.1.     SPL.. 1

1.1.1.     Secondary programloader 1

1.2.     FDT. 1

1.2.1.     扁平设备树... 1

2.    修改1. 1

2.1.     内容... 1

2.1.1.     调整 bootdelay. 1

2.2.     线索... 1

2.2.1.     Hit <SPACE> key to stop autoboot in %2ds\n". 2

2.3.     调试准备... 2

2.3.1.     代码确认... 2

2.3.2.     调试打印... 2

2.4.     函数引用... 2

2.4.1.     宏定义... 2

2.4.2.     __abortboot 2

2.4.3.     abortboot 2

2.4.4.     autoboot_command. 3

2.4.5.     bootdelay_process. 3

3.    修改2. 3

3.1.     内容... 3

3.1.1.     使能gmac. 3

3.2.     线索... 3

3.2.1.     emac 可以使用,参考emac的部分功能实现... 3

3.2.2.     pr_msg("Net:   "); 3

3.3.     调试准备... 3

3.3.1.     代码确认... 4

3.3.2.     调试打印... 4

3.4.     函数引用... 4

3.4.1.     board_r.c. 4

3.4.2.     initr_net 7

3.4.3.     eth_initialize. 7

3.4.4.     board_eth_init 7

3.4.5.     sunxi_gmac_initialize. 7

3.4.6.     sunxi_emac_initialize. 7

3.4.7.     sunxi_gmac_resource_get 7

3.4.8.     sunxi_gmac_hardware_init 7

3.4.9.     CCMU  初始化... 8

3.5.     设备树之谜... 9

3.5.1.     设备树在初始化网络之前被替换了... 9

4.    参考资料... 9

4.1.     链接... 9

4.1.1.     4.3.3 U-Boot-dts 注意事项... 9

4.1.2.     5.6 FDT 命令说明... 10

4.1.3.     6 基本调试方法介绍... 10

  1. 关键字

    1. SPL

      1. Secondary programloader
        1. SPL(Secondary programloader)是uboot第一阶段执行的代码。主要负责搬移uboot第二阶段的代码到系统内存(System Ram,也叫片外内存)中运行。是uboot第一阶段执行的代码。 主要负责初始化芯片,搬移uboot第二阶段的代码到内存中运行。 SPL是由固化在芯片内部的ROM引导的。 所谓启动, 就是从这些外部介质中搬移一段固定大小(4K/8K/16K等)的代码到内部RAM中运行。 这里搬移的就是SPL. 在最新版本的uboot中, 可以看到SPL也支持nandflash, SDCARD等多种启动方式。 当SPL本身被搬移到内部RAM中运行时, 它会从nandflash, SDCARD等外部介质中搬移uboot第二阶段的代码到外部内存中。 切记SPL不能太大,不然RomBoot 无法读取完整,有些你写在spl功能无法读到内存,CPU执行不了,满足不了你的需求。
    2. FDT

      1. 扁平设备树
        1. 设备树(Device Tree,DT)是一种层次结构的文本数据表示方式,用于描述硬件设备的配置信息。扁平设备树(Flattened Device Tree,FDT),也叫平坦设备树,是设备树的一种二进制表示形式,提高了在嵌入式系统中的传输和解析效率。
  2. 修改1

    1. 内容

      1. 调整 bootdelay
    2. 线索

      1. Hit <SPACE> key to stop autoboot in %2ds\n"
    3. 调试准备

      1. 代码确认
        1. 简单修改打印 确定代码编辑和下载更新有效
          1. 增加 " o0o "
          2. #define CONFIG_AUTOBOOT_PROMPT "o0o Hit <SPACE> key to stop autoboot in %2ds\n"
      2. 调试打印
        1. common.h  定义#define DEBUG
          1. 打开uboot debug 打印
          2. 重写这个函数  打印自旋锁的状态  打印的太多   暂时不需要看
          3. // #define spin_lock_irqsave(lock, flags) do { debug("%lu\n", flags); } while (0) #define spin_lock_irqsave(lock, flags) do { debug_cond(0,"%lu\n", flags); } while (0)
    4. 函数引用

      1. 宏定义
        1.    CONFIG_AUTOBOOT_PROMPT
      2. __abortboot
        1. printf(CONFIG_AUTOBOOT_PROMPT, bootdelay);
      3. abortboot
        1. static int abortboot(int bootdelay)
      4. autoboot_command
        1. if (stored_bootdelay != -1 && s && !abortboot(stored_bootdelay))
      5. bootdelay_process
        1. s = env_get("bootdelay"); bootdelay = s ? (int)simple_strtol(s, NULL, 10) : CONFIG_BOOTDELAY;
          1. CONFIG_BOOTDELAY=3 menuconfig 里面设置的
          2. env_get优先拿的是磁盘环境变量保存的
        2. bootdelay = fdtdec_get_config_int(gd->fdt_blob, "bootdelay",bootdelay);
          1. 如果使用设备树   从设备树config {} 节点找bootdealy,找不到  依然用上面默认的
        3. stored_bootdelay = bootdelay;
  3. 修改2

    1. 内容

      1. 使能gmac
    2. 线索

      1. emac 可以使用,参考emac的部分功能实现
      2. pr_msg("Net:   ");
    3. 调试准备

      1. 代码确认
        1. Topic1
          1. pr_msg("["__FILE__"][Line: %d][%s]: o0o!  %d%d\n", __LINE__, __func__,phy_adr,reg);
      2. 调试打印
        1. 使能打印等级
          1. __printk
          2. uprintf
            1. // printf("gd->debug_mode %ld",gd->debug_mode);
          3. gd->debug_mode
            1. 不能小于 debug_level
          4. "/soc/platform", "debug_mode"
            1. 设备树里设置debug_mode = 8
          5. uboot-board.dts
            1. &platform {      eraseflag   = <1>;     next_work   = <3>;   debug_mode  = <8>; };
    4. 函数引用

      1. board_r.c
        1. init_sequence_r
          1. 1. `initr_trace`:初始化调试信息。

            2. `initr_reloc`:将代码和数据从内存的一个位置移动到另一个位置。

            3. `initr_caches`:初始化缓存。

            4. `initr_reloc_global_data`:将全局数据从内存的一个位置移动到另一个位置。

            5. `initr_unlock_ram_in_cache`:解锁缓存中的内存。

            6. `initr_barrier`:设置内存屏障。

            7. `initr_malloc`:初始化内存分配器。

            8. `log_init`:初始化日志系统。

            9. `initr_bootstage`:初始化启动阶段。

            10. `initr_console_record`:初始化控制台记录。

            11. `initr_noncached`:初始化非缓存内存。

            12. `initr_of_live`:初始化设备树。

            13. `initr_dm`:初始化设备管理器。

            14. `initr_board_init`:初始化板子。

            15. `set_cpu_clk_info`:设置CPU时钟信息。

            16. `efi_memory_init`:初始化EFI内存。

            17. `stdio_init_tables`:初始化标准输入输出表。

            18. `initr_serial`:初始化串行通信。

            19. `initr_announce`:宣布启动信息。

            20. `INIT_FUNC_WATCHDOG_RESET`:重置看门狗定时器。

            21. `initr_secondary_cpu`:初始化secondary CPU。

            22. `mac_read_from_eeprom`:从EEPROM中读取MAC地址。

            23. `stdio_add_devices`:添加标准输入输出设备。

            24. `initr_jumptable`:初始化跳表。

            25. `initr_api`:初始化API。

            26. `console_init_r`:初始化控制台。

            27. `console_announce_r`:宣布控制台信息。

            28. `show_board_info`:显示板子信息。

            29. `arch_misc_init`:初始化架构相关的其他内容。

            30. `misc_init_r`:初始化其他平台相关的其他内容。

            31. `INIT_FUNC_WATCHDOG_RESET`:重置看门狗定时器。

            32. `initr_kgdb`:初始化KGDB。

            33. `interrupt_init`:初始化中断。

            34. `initr_enable_interrupts`:启用中断。

            35. `sunxi_fast_burn_key`:烧录密钥。

            36. `initr_sunxi_plat`:初始化SUNXI平台。

            37. `initr_env`:初始化环境变量。

            38. `board_env_late_init`:初始化板子环境变量。

            39. `initr_status_led`:初始化状态LED。

            40. `timer_init`:初始化定时器。

            41. `initr_ethaddr`:初始化以太网地址。

            42. `sunxi_burn_key`:烧录密钥。

            43. `board_late_init`:板子后期初始化。

            44. `initr_scsi`:初始化SCSI。

            45. `initr_bbmii`:初始化BitBang MII。

            46. `initr_net`:初始化网络。

            47. `initr_post`:初始化POST。

            48. `initr_pcmcia`:初始化PCMCIA。

            49. `initr_ide`:初始化IDE。

            50. `last_stage_init`:最后阶段初始化。

            51. `initr_mem`:初始化内存。

            52. `sunxi_boot_tone_play`:播放启动音。

      2. initr_net
        1. pr_msg("Net:   ");
          1. uboot_board.dts
            1. '/home/o0o/T3/LinuxSDK/device/config/chips/t3/configs/tlt3-evm/uboot-board.dts' -> '/home/o0o/T3/LinuxSDK/brandy/brandy-2.0/u-boot-2018/arch/arm/dts/uboot-board.dts'
              1. 修改 debug_mode =8  使能打印
                1. &platform {        eraseflag   = <1>;       next_work   = <3>;      debug_mode  = <8>; };
      3. eth_initialize
        1. eth_legacy.c
      4. board_eth_init
        1. board_common.c
      5. sunxi_gmac_initialize
      6. sunxi_emac_initialize
      7. sunxi_gmac_resource_get
        1. 获取设备树节点里面的配置信息
      8. sunxi_gmac_hardware_init
        1. 设置phy delay 时间
        2. /*    * Adjust Tx/Rx clock delay    * Tx clock delay: 0~7        * Rx clock delay: 0~31         */        value &= ~(GMAC_TX_DELAY_MASK << GMAC_TX_DELAY_OFFSET);     value |= ((chip->tx_delay & GMAC_TX_DELAY_MASK) << GMAC_TX_DELAY_OFFSET); value &= ~(GMAC_RX_DELAY_MASK << GMAC_RX_DELAY_OFFSET); value |= ((chip->rx_delay & GMAC_RX_DELAY_MASK) << GMAC_RX_DELAY_OFFSET);
        3. sunxi_emac_pinctrl_init
          1. uboot的设备树下 没有相关配置,发现 eth初始化之前  fdt被切换到了内核的设备树
      9. CCMU  初始化
        1. 比较kernel 里面关于CCMU 时钟的配置
        2. /* Set up clock gating */ /* Set MII clock */ #ifdef CONFIG_RGMII     setbits_le32(SUNXI_CCMU_BASE + 0x2c4, 0x1 << 17);     setbits_le32(SUNXI_CCMU_BASE+0x64, 0x1 << 17);      // setbits_le32(SUNXI_CCMU_BASE+0x164, 0x02|(0x03<<5));     setbits_le32(SUNXI_CCMU_BASE+0x164, 0x02|0x04); #endif
    5. 设备树之谜
      1. 设备树在初始化网络之前被替换了
        1. [09.663]change working_fdt 0x7be7ae70 to 0x7be4ae70                             
        2. __sunxi_replace_fdt_v2
        3. sunxi_replace_fdt_v2
        4. board_late_init
          1. board_late_init 在 initr_net  之前
  4. 参考资料

    1. https://tina.100ask.net/SdkModule/Linux_U-boot_DevelopmentGuide-03/
      1. 4.3.3 U-Boot-dts 注意事项
      2. 5.6 FDT 命令说明
        1. fdt list /
        2. list /wlan
      3. 6 基本调试方法介绍
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值