佐须之男的博客

技术需要沉淀,成长需要痛苦,成功需要坚持,敬仰需要奉献

高通IPQ6000、IPQ6010、IPQ6018、IPQ6028 QSDK系统启动过程分析

高通IPQ6000、IPQ6010、IPQ6018、IPQ8071A、IPQ8072A、 IPQ8074A系统启动过程流程分析   

作者:佐须之男,精通嵌入式Linux开发,专注于OpenWrt等开源路由器系统的开发、培训、技术咨询,拥有15年的Linux使用经验。

    前言:佐大在IPQ6010、IPQ807x  这些平台上做开发也快有1年了,但网上相关的资料实在是少的可怜。此文或许不够翔实但廖胜于无,文章可能有表述错误的地方,希望大家指正。

高通IPQ6000、IPQ6010、IPQ6018、IPQ6028 QSDK系统启动过程分析 技术研究

    简单来说,IPQ6000、IPQ6010、IPQ6018、IPQ8071A、IPQ8072A、 IPQ8074A等芯片启动的时候启动的并不是Uboot先启动,首先启动的是PBL(Primary Boot Loader),PBL在芯片中的bootrom中,用户不可修改也看不到。然后再运行SBL1。所以在启动日志里能看到如下信息:

Format: Log Type - Time(microsec) - Message - Optional Info
Log Type: B - Since Boot(Power On Reset),  D - Delta,  S - Statistic
S - QC_IMAGE_VERSION_STRING=BOOT.XF.0.3-00086-IPQ60xxLZB-1
S - IMAGE_VARIANT_STRING=IPQ6018LA
S - OEM_IMAGE_VERSION_STRING=crm-ubuntu200
S - Boot Interface: eMMC
S - Secure Boot: Off
...
B -    352305 - sbl1_ddr_set_default_params, Start
D -       274 - sbl1_ddr_set_default_params, Delta

    上面是SBL(Secondary Boot Loader Stage 1)的启动信息,SBL会进行检测Boot configuration,对内存等外设进行初始化,判断是否开启了安全启动。需要注意的是,内存初始化的参数是在CDT里的,而非DTS。当SBL执行完成后才会跳转到Uboot。有一个细节就是Uboot是32位的,这就是编译64位QSDK固件时需要先编译32位QSDK的原因。

U-Boot 2016.01 (Nov 14 2020 - 18:22:38 +0800)
DRAM:  smem ram ptable found: ver: 2 len: 4
512 MiB
got gpio config
NAND:  Nand Flash error. Status = 80
Reset cmd status failed
SF: Unsupported flash IDs: manuf 00, jedec 0000, ext_jedec 0000
ipq_spi: SPI Flash not found (bus/cs/speed/mode) = (0/0/48000000/0)0 MiB
MMC:   <NULL>: 0 (eMMC)

    此时Uboot会根据不同的machid加载不同的dtb文件(dtb就是编译后的dts文件),拿IPQ6010、IPQ6018平台为例:machid 8030201 加载qcom-ip6018-cp01-c1.dtb、machid 8030001 加载qcom-ip6018-cp01-c2.dtb,依次类推。

## Loading fdt from FIT Image at 44000000 ...
   Using 'config@cp03-c2' configuration
   Trying 'fdt@cp03-c2' fdt subimage
     Description:  ARM OpenWrt qcom-ipq60xx-cpxx device tree blob
     Type:         Flat Device Tree
     Compression:  uncompressed
     Data Start:   0x443f3fc4
     Data Size:    68119 Bytes = 66.5 KiB
     Architecture: ARM
     Hash algo:    crc32
     Hash value:   84d1d4a4
     Hash algo:    sha1
     Hash value:   772693e802807c4f398053725eb5ba85d6b496b5
   Verifying Hash Integrity ... crc32+ sha1+ OK
   Booting using the fdt blob at 0x443f3fc4
   Uncompressing Kernel Image ... OK
   Loading Device Tree to 484ec000, end 484ffa16 ... OK
Could not find PCI in device tree
Using machid 0x8030201 from environment

    加载DTB和内核后,Uboot就跳转到内核了。

Starting kernel ...
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Initializing cgroup subsys cpuset
[    0.000000] Initializing cgroup subsys cpu
[    0.000000] Initializing cgroup subsys cpuacct
[    0.000000] Linux version 4.4.60 (alvin@jdc) (gcc version 5.2.0 (OpenWrt GCC 5.2.0 b0d095643+r49254) ) #251 SMP PREEMPT Tue Nov 17 16:34:42 CST 2020
[    0.000000] CPU: ARMv7 Processor [51af8014] revision 4 (ARMv7), cr=10c0383d
[    0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[    0.000000] Machine model: JDCloud Technologies, Inc. IPQ6018/AP-CP03-C2

    此时就进入我们熟悉的OpenWrt啦,假如大家想更深入理解OpenWrt可以参加佐大的OpenWrt培训班。

作者: 佐须之男 原文链接: https://forgotfun.org/2021/09/HOW-IPQ60XX-IPQ807X-BOOT.html

« 上一篇 下一篇 »

© 2016 佐须之男版权所有 | 联系方式 forgotfun@qq.com | 业务合作 181-1435-4589 (陆工)