高通UEFI:ABL(二)

文章详细介绍了高通UEFIABL阶段cmdline中的属性设置,特别是如何添加和修改属性如androidboot.slot_suffix。通过分析UpdateCmdLine.c文件和UpdateCmdLineParams函数,揭示了属性值是如何从AndroidSlotSuffix变量获取并追加到cmdline的过程,包括数据获取、变量初始化、参数传递和转码操作。
摘要由CSDN通过智能技术生成

高通UEFI:ABL(一)中简单讲述了abl内的代码组成及大致框架,目的在于明确当我们接到uefi abl阶段的需求时我们应该定位到哪一部分去进行修改,本篇文章着重分析abl内的cmdline内的各个属性是如何组合以及如何在cmdline内新增一个属性

查看cmdline指令

cat proc/cmdline
C:\Users\ASUS>adb shell cat proc/cmdline
rcupdate.rcu_expedited=1 rcu_nocbs=0-7 console=ttyMSM0,115200n8 androidboot.hardware=qcom androidboot.console=ttyMSM0 androidboot.memcg=1 lpm_levels.sleep_disabled=1 video=vfb:640x400,bpp=32,memsize=3072000 msm_rtb.filter=0x237 service_locator.enable=1 swiotlb=1 earlycon=msm_geni_serial,0x4a90000 loop.max_part=7 cgroup.memory=nokmem,nosocket buildvariant=userdebug androidboot.verifiedbootstate=orange androidboot.keymaster=1 androidboot.vbmeta.device=PARTUUID=114b079b-bebb-5bc7-df1d-a601ce62eccc androidboot.vbmeta.device=PARTUUID=114b079b-bebb-5bc7-df1d-a601ce62eccc androidboot.vbmeta.avb_version=1.0 androidboot.vbmeta.device_state=unlocked androidboot.vbmeta.hash_alg=sha256 androidboot.vbmeta.size=5952 androidboot.vbmeta.digest=63f3b52c331995987d9f25fd57551bb8720901266848502d4cadb62ad729a5ef androidboot.veritymode=disabled androidboot.bootdevice=4804000.ufshc androidboot.boot_devices=soc/4804000.ufshc androidboot.serialno=12345678
androidboot.baseband=msm androidboot.slot_suffix=_a rootwait ro init=/init androidboot.dtb_idx=0

以androidboot.slot_suffix=_a这个属性值为例子,看看abl阶段是怎么设置的

执行grep -nrs androidboot.slot_ .
./Library/BootLib/UpdateCmdLine.c:64:STATIC CHAR8 *AndroidSlotSuffix = " androidboot.slot_suffix=";

可以看到,androidboot.slot_suffix=这个属性值是由AndroidSlotSuffix这个变量去完成的。看看这个变量做了什么

EFI_STATUS
UpdateCmdLine (CONST CHAR8 *CmdLine,
               CHAR8 *FfbmStr,
               BOOLEAN Recovery,
               BOOLEAN AlarmBoot,
               CONST CHAR8 *VBCmdLine,
               CHAR8 **FinalCmdLine)
{
  EFI_STATUS Status;
  UINT32 CmdLineLen = 0;
  UINT32 HaveCmdLine = 0;
  UINT32 PauseAtBootUp = 0;
  CHAR8 SlotSuffixAscii[MAX_SLOT_SUFFIX_SZ];
  BOOLEAN MultiSlotBoot;
  CHAR8 ChipBaseBand[CHIP_BASE_BAND_LEN];
  CHAR8 *BootDevBuf = NULL;
  BOOLEAN BatteryStatus;
  CHAR8 StrSerialNum[SERIAL_NUM_SIZE];
  BOOLEAN MdtpActive = FALSE;
  CHAR8 *CvmSystemPtnCmdLine = NULL;
  UpdateCmdLineParamList Param = {0};
  CHAR8 DtboIdxStr[MAX_DTBO_IDX_STR] = "\0";
  CHAR8 DtbIdxStr[MAX_DTBO_IDX_STR] = "\0";
  INT32 DtboIdx = INVALID_PTN;
  INT32 DtbIdx = INVALID_PTN;
  CHAR8 *LEVerityCmdLine = NULL;
  UINT32 LEVerityCmdLineLen = 0;
  CHAR8 UsbCompositionCmdline[COMPOSITION_CMDLINE_LEN]= "\0";
  CHAR8 *EarlyServicesStr = NULL;
  ...
  Param.AndroidSlotSuffix = AndroidSlotSuffix;

  Param.SkipRamFs = SkipRamFs;
  Param.RootCmdLine = RootCmdLine;
  Param.InitCmdline = InitCmdline;
  Param.DtboIdxStr = DtboIdxStr;
  Param.DtbIdxStr = DtbIdxStr;
  Param.LEVerityCmdLine = LEVerityCmdLine;
  Param.CvmSystemPtnCmdLine = CvmSystemPtnCmdLine;
  Param.EarlyServicesCmdLine = EarlyServicesStr;

  if (EarlyUsbInitEnabled ()) {
    Param.UsbCompCmdLine = UsbCompositionCmdline;
  }

  Status = UpdateCmdLineParams (&Param, FinalCmdLine);
  if (Status != EFI_SUCCESS) {
    return Status;
  }

  DEBUG ((EFI_D_INFO, "Cmdline: %a\n", *FinalCmdLine));
  DEBUG ((EFI_D_INFO, "\n"));

  return EFI_SUCCESS;
  
}

UpdadeCmdline.c内需要关注的就2个地方:

1.UpdateCmdLineParamList Param = {0};

2.Param.AndroidSlotSuffix = AndroidSlotSuffix;

3.UpdateCmdLineParams (&Param, FinalCmdLine);

可以看到许多的属性值都是放置在Param这个UpdateCmdLineParamList结构体内的,并且在UpdadeCmdline.c内并没有看到关于AndroidSlotSuffix的赋值处理,那么再看看UpdateCmdLineParams内对AndroidSlotSuffix做了什么

//UpdadeCmdline.h内UpdateCmdLineParamList 结构体成员

typedef struct UpdateCmdLineParamList {
  BOOLEAN Recovery;
  BOOLEAN MultiSlotBoot;
  BOOLEAN AlarmBoot;
  BOOLEAN MdtpActive;
  UINT32 CmdLineLen;
  UINT32 HaveCmdLine;
  UINT32 PauseAtBootUp;
  CHAR8 *StrSerialNum;
  CHAR8 *SlotSuffixAscii;
  CHAR8 *ChipBaseBand;
  CHAR8 *DisplayCmdLine;
  CONST CHAR8 *CmdLine;
  CONST CHAR8 *AlarmBootCmdLine;
  CONST CHAR8 *MdtpActiveFlag;
  CONST CHAR8 *BatteryChgPause;
  CONST CHAR8 *UsbSerialCmdLine;
  CONST CHAR8 *VBCmdLine;
  CONST CHAR8 *LogLevel;
  CONST CHAR8 *BootDeviceCmdLine;
  CONST CHAR8 *AndroidBootMode;
  CHAR8 *BootDevBuf;
  CHAR8 *FfbmStr;
  CHAR8 *AndroidSlotSuffix;
  CHAR8 *SkipRamFs;
  CHAR8 *RootCmdLine;
  CHAR8 *InitCmdline;
  CHAR8 *DtboIdxStr;
  CHAR8 *DtbIdxStr;
  CHAR8 *LEVerityCmdLine;
  CHAR8 *CvmSystemPtnCmdLine;
  CHAR8 *UsbCompCmdLine;
  CHAR8 *EarlyServicesCmdLine;
} UpdateCmdLineParamList;

STATIC
EFI_STATUS
UpdateCmdLineParams (UpdateCmdLineParamList *Param,
                     CHAR8 **FinalCmdLine)
{
  CONST CHAR8 *Src;
  CHAR8 *Dst;
  UINT32 MaxCmdLineLen = Param->CmdLineLen;
  //分配内存
  Dst = AllocateZeroPool (MaxCmdLineLen);
  if (!Dst) {
    DEBUG ((EFI_D_ERROR, "CMDLINE: Failed to allocate destination buffer\n"));
    return EFI_OUT_OF_RESOURCES;
  }

  /* Save start ptr for debug print */
  *FinalCmdLine = Dst;
  ...
  if (Param->MultiSlotBoot &&
     !IsBootDevImage ()) {
     /* Slot suffix */
    Src = Param->AndroidSlotSuffix;
    AsciiStrCatS (Dst, MaxCmdLineLen, Src);
    //获取到的suffix进行转码
    UnicodeStrToAsciiStr (GetCurrentSlotSuffix ().Suffix,
                          Param->SlotSuffixAscii);
    Src = Param->SlotSuffixAscii;
    AsciiStrCatS (Dst, MaxCmdLineLen, Src);
  }
  ...
  return EFI_SUCCESS;
}

在UpdateCmdLineParams内,会对UpdateCmdLine内没有处理的属性值进行一一处理,对于AndroidSlotSuffix,则是通过GetCurrentSlotSuffix获取到的crrentslot属性后进行转码,追加到cmdline内。

到此,我们基本了解了关于AndroidSlotSuffix这个属性值是怎么添加到cmdline内的了。分为以下几步:

1.确定好自己要添加的属性名称以及编写相应的数据获取逻辑

2.在UpdateCmdLine.c内初始化一个STATIC类型的属性变量

3.将2中初始化的变量添加到parms内

4.将1编写好的数据获取函数追加到UpdateCmdLineParams函数内

高通UEFI高通公司为了支持其处理器和芯片组在Android设备上的引导和初始化而开发的软件模块。UEFI(统一扩展固件界面)是一种新型的固件标准,取代了过去的BIOS(基本输入输出系统)。高通UEFI开发Android开发文档主要提供了有关在使用高通处理器和芯片组的Android设备上进行开发的指导和说明。 该文档首先介绍了如何正确设置开发环境,包括安装必要的软件和驱动程序。接着,文档介绍了高通UEFI的架构和工作原理,包括引导流程、启动流程和初始化过程。开发人员可以深入了解UEFIAndroid设备上的作用和功能。 文档还提供了如何进行UEFI开发的具体指导,包括如何编写UEFI应用程序、如何调试和测试UEFI应用程序以及如何进行项目集成等。针对不同的开发需求,文档也提供了各种开发和定制UEFI的选项和工具,使开发人员能够根据实际情况进行灵活的开发和调试。 此外,文档还包含了一些实际案例和示例代码,帮助开发人员更好地理解如何使用高通UEFI开发Android设备,并且提供了一些常见问题和解决方案以供参考。 总而言之,高通UEFI开发Android开发文档为开发人员提供了一个全面的指南,帮助他们理解和应用高通UEFIAndroid设备上的开发和定制。通过这些文档,开发人员可以更加有效地利用高通UEFI提供的功能和特性,为Android设备开发出更加稳定和高性能的引导和初始化软件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值