1、前言

这篇文章介绍了MDM平台的Little Kernel(LK)的启动流程。Little Kernel的作用是在启动的时候初始化硬件,从存储器中载入Linux内核和ramdisk到RAM中,配置初始化寄存器和命令行参数,最后跳转到内核中运行

2、LK

2.1代码路径

LK的代码在apps_proc\bootable\bootloader\lk目录

2.2代码概述

从C程序入口开始讲起kmain

target_init:初始化flash参数,以及分区表

qpic_nand_init(&config);//初始化flash 参数,如page size等ptable_init(&flash_ptable);smem_ptable_init();//读取分区表smem_add_modem_partitions(&flash_ptable);update_ptable_names();flash_set_ptable(&flash_ptable);

支持的flash型号在supported_flash 定义,通过flash id索引,配置了pagesize 等参数

apps_init:加载kernel到ram,并配置命令行,跳转到kernel

调用 aboot_init,boot_into_fastboot  boot_into_recovery flag确认进入fastboot 模式还是recovery 模式还是正常启动

check_reboot_mode 检查重启原因,查看是否是升级或者其他需要进入recovery模式的操作

unsigned check_reboot_mode(void)
{uint32_t restart_reason = 0;/* Read reboot reason and scrub it */restart_reason = readl(RESTART_REASON_ADDR);//读取寄存器值writel(0x00, RESTART_REASON_ADDR);return restart_reason;
}

该寄存器值在重启时调用sys_reboot ( apps_proc\system\core\powerapp/powerapp.c) 中写该寄存器,标明是否需要进入recovery 模式

fastboot 模式

static void create_fastboot_mode()
{fastboot_register("oem xxx", cmd_oem_xxx);//定义OEM命令/* register aboot specific fastboot commands */aboot_fastboot_register_commands();初始化默认支持命令/* dump partition table for debug info */partition_dump();/* initialize and start fastboot */fastboot_init(target_get_scratch_address(), target_get_max_flash_size());打开usb通信,建立新的线程处理fastboot 命令
}

 recovery模式 正常启动

调用boot_system_normal(),  通过flag  boot_into_recovery会决定传递给kernel的cmdline挂载哪个fs recoveryfs or system

boot_linux_from_flash()
{if(!boot_into_recovery) 通过flag确认 使用哪个kernel{ptn = ptable_find(ptable, "boot");if (ptn == NULL) {dprintf(CRITICAL, "ERROR: No boot partition found\n");return -1;}}else{ptn = ptable_find(ptable, "recovery");if (ptn == NULL) {dprintf(CRITICAL, "ERROR: No recovery partition found\n");return -1;}}flash_read(ptn, offset, buf, page_size) //读取 boot.img 的第一个page,也就是headerhdr->kernel_addr = VA((addr_t)(hdr->kernel_addr));hdr->ramdisk_addr = VA((addr_t)(hdr->ramdisk_addr));hdr->tags_addr = VA((addr_t)(hdr->tags_addr));flash_read(ptn, offset, (void *)hdr->kernel_addr, kernel_actual)//加载kernel到ram中,地址为kernel_addrflash_read(ptn, offset + dt_entry.offset, (void *)hdr->tags_addr, dt_entry.size)//加载dts到ram中,地址为tags_addrboot_linux((void *)hdr->kernel_addr, (void *)hdr->tags_addr,(const char *)hdr->cmdline, board_machtype(),(void *)hdr->ramdisk_addr, hdr->ramdisk_size);//启动kernel
}

上面提到读取boot.img的header, 在bootable/bootloader/lk/app/aboot/bootimg.h 定义,也包括了boot.img的构成

 struct boot_img_hdr
{unsigned char magic[BOOT_MAGIC_SIZE];unsigned kernel_size;  /* size in bytes */unsigned kernel_addr;  /* physical load addr */unsigned ramdisk_size; /* size in bytes */unsigned ramdisk_addr; /* physical load addr */unsigned second_size;  /* size in bytes */unsigned second_addr;  /* physical load addr */unsigned tags_addr;    /* physical addr for kernel tags */unsigned page_size;    /* flash page size we assume */unsigned dt_size;      /* device_tree in bytes */unsigned unused;    /* future expansion: should be 0 */unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */unsigned char cmdline[BOOT_ARGS_SIZE];unsigned id[8]; /* timestamp / checksum / sha1 / etc */
};
boot.img 构成
** +-----------------+
** | boot header     | 1 page
** +-----------------+
** | kernel          | n pages
** +-----------------+
** | ramdisk         | m pages
** +-----------------+
** | second stage    | o pages
** +-----------------+
** | device tree     | p pages
** +-----------------+

结合实际的image,可以分析出header的各个参数

magic:41 4E 44 52 4F 49 44 21

kernel size 00 3D 8F 30 kernel addr 08 00 80 00

ram size 0 ram addr 08 00 80 00

second size 0 second addr 08 f0 00 00

tag addr 81 E0 00 00 page size 08 00

dt size 07 68 00

boot_linux最后更新了cmdline,并刷新到dts中,跳转到kernel

final_cmdline = update_cmdline((const char*)cmdline);
update_device_tree((void *)tags,(const char *)final_cmdline, ramdisk, ramdisk_size);
entry(0, machtype, (unsigned*)tags_phys);

高通MDM平台-LK相关推荐

  1. 高通MDM平台开发入门

    源码下载 高通MDM平台代码分为两个部分:高通私有代码 以及 开源公有代码 针对某一个平台,高通会提供一条基线,包括了私有代码的版本以及公有代码每个库的revision 私有代码下载:请访问https ...

  2. TM034XVZP01 mipi屏 高通8909平台lk和kernel驱动 基于ili9881驱动

    效果图如上. 所需的时序文件链接 https://download.csdn.net/download/jxhln/11120468 大家可以下载参考 上述是最终的成果,该文章只着重讲述lk阶段的调试 ...

  3. 高通MDM平台-ChargeIC

    Charge IC 是负责管理外部供电以及电池充放电,在MDM平台上采用的是比较便宜的ChargeIC,MP2617, 其作用也仅限于控制对电池充放电.下面就简单的介绍下内核中关于chargeIC的驱 ...

  4. 高通MDM平台-分区表

    最近想要回顾下之前的一些东西,记录下一些简单但细碎的东西,本章简单从分区表入手随便写写 分区表文件在common\config\partition_nand.xml <partition> ...

  5. 高通MDM平台-搜网流程

    引言 样机上电之后如何自动选择合适的网络进行附着,如何对选择的小区确实是否可以驻守,本文将以高通平台为例,讲述从识别SIM开始,到注册到合适的小区这整个流程. 架构 LTE协议栈基本分为NAS(Non ...

  6. 高通MDM平台通过USB共享文件

    在没有SD卡的情况下,需要共享文件夹,通过udisk方式用usb共享,例如将/cache/tmp文件夹共享 首先清理 echo "" > /sys/devices/virtu ...

  7. 高通SDX12平台:启动流程梳理

    高通SDX12平台 启动流程梳理 1. 高通平台CPU类型介绍 通常我们所说的CPU如高通平台MSM8998.苹果A12, 华为海思平台(麒麟980.990)等,这些我们虽然叫CPU,但并不是只有一个 ...

  8. 高通7x27a平台UART配置

    高通7x27a平台使用uart1作为debug的配置 高通7x27a平台一共有5个UART PORT: Port 对应的GPIO 描述 UART1 122+123 Can used for debug ...

  9. 高通android平台修改开机小企鹅logo

    高通平台修改开机画面 小企鹅LOGO 高通android平台修改开机小企鹅logo 方法一 方法二 高通android平台修改开机小企鹅logo 高通android平台开机lk阶段默认使用小企鹅log ...

最新文章

  1. PgSQL · 实战经验 · 如何预测Freeze IO风暴
  2. 从源码分析DEARGUI之让怪物随机动起来
  3. 剑指offer八:跳台阶
  4. 加载 Firefox 配置
  5. ASP.NET MVC:@helper 不能调试
  6. 微信分享JS-SDK示例页面
  7. 前端页面加水印插件_没用过这7款浏览器插件,你一定是假的程序员
  8. oracle还原数据库及遇到的问题
  9. eja智能压力变送器工作原理_电量变送器是什么?电量变送器工作原理解析
  10. 如何在 Mac 上管理用于锁定备忘录的密码?
  11. for in和for of的区别(转)
  12. 含泪整理最优质草坪灯光域网素材,你想要的这里都有
  13. 微阵列芯片服务器,微阵列(生物芯片)类型详解
  14. php又拍云,申请又拍云云存储教程(PHP V3.80+)
  15. 【Pygame小游戏】10年前风靡全球的手游《愤怒的小鸟》,是如何霸榜的?经典回归......
  16. 快速集成微信支付和支付宝支付
  17. Vue - 实现信纸输入写作,类似写明信片时的一张背景图片 + 横格纸效果(信纸格子与文字自动对齐、支持自定义背景图、文字或横线大小与颜色,一切由您 DIY 自定义样式)纯CSS完成支持任何vue项目
  18. 老鼠流和大象流:如何检测和监控周期性流量
  19. 巨型计算机语言主要应用于,计算机应用基础知识复习题
  20. CC2530入网流程

热门文章

  1. Python_pymysql
  2. Cf#741-C. Rings(构造)
  3. 暴力破解及验证码安全
  4. Debian下载内核源码的方法
  5. MTK 方案电池保护机制设计
  6. 企信下载的文件在哪里_第28期分享:PR如何剪辑MKV视频格式文件?
  7. 卡罗林斯卡医学院计算机方向,卡罗林斯卡医学院:全球卫生专业受学生欢迎
  8. 斐波纳契数列(Fibonacci Sequence)
  9. TA-Lib介绍安装及使用教程
  10. 乐教乐学显示服务器故障怎么了,乐教乐学常见问题有哪些,如何解决闪退问题...