----------原创不易,欢迎关注+点赞收藏。广交嵌入式开发的朋友,讨论技术和产品-------------

硬件平台 :飞腾D2000 + SSD硬盘
软件平台 :UFEI + 麒麟linux V10

为了测试该平台的重启功能是否正常,在麒麟linux启动完成后,用鼠标点击重启或者在命令行输入reboot命令。结果单板大概率停在了UFEI的shell命令行。麒麟系统重启失败。然而单板直接上电启动,是可以正常的进入麒麟系统的。

定位过程比较麻烦,对UFEI启动菜单和加载内核镜像的流程加了很多打印。其中加载镜像并跳转的函数如下

在这里插入图片描述

VOID
EFIAPI
EfiBootManagerBoot (
  IN  EFI_BOOT_MANAGER_LOAD_OPTION             *BootOption
  )
{
  EFI_STATUS                Status;
  EFI_HANDLE                ImageHandle;
  EFI_LOADED_IMAGE_PROTOCOL *ImageInfo;
  UINT16                    Uint16;
  UINTN                     OptionNumber;
  UINTN                     OriginalOptionNumber;
  EFI_DEVICE_PATH_PROTOCOL  *FilePath;
  EFI_DEVICE_PATH_PROTOCOL  *RamDiskDevicePath;
  VOID                      *FileBuffer;
  UINTN                     FileSize;
  EFI_BOOT_LOGO_PROTOCOL    *BootLogo;
  EFI_EVENT                 LegacyBootEvent;


  if (BootOption == NULL) {
    return;
  }
  .......
  ImageHandle       = NULL;
  RamDiskDevicePath = NULL;
  if (DevicePathType (BootOption->FilePath) != BBS_DEVICE_PATH) 
  {
    Status   = EFI_NOT_FOUND;
    FilePath = NULL;
    EfiBootManagerConnectDevicePath (BootOption->FilePath, NULL);
    FileBuffer = BmGetNextLoadOptionBuffer (LoadOptionTypeBoot, BootOption->FilePath, &FilePath, &FileSize);
    if (FileBuffer != NULL) 
    {
      RamDiskDevicePath = BmGetRamDiskDevicePath (FilePath);

      REPORT_STATUS_CODE (EFI_PROGRESS_CODE, PcdGet32 (PcdProgressCodeOsLoaderLoad));
      Status = gBS->LoadImage (
                      TRUE,
                      gImageHandle,
                      FilePath,
                      FileBuffer,
                      FileSize,
                      &ImageHandle
                      );
    }
    if (FileBuffer != NULL) {
      FreePool (FileBuffer);
    }
    if (FilePath != NULL) {
      FreePool (FilePath);
    }

结果发现reboot后,UFEI执行到KYLIN系统所在路径传入函数DevicePathType 后,得到空路径。而上电启动流程该函数返回的是合法路径。
在这里插入图片描述

难不成是硬盘没有找到?在REBOOT后,UFEI SHELL下执行map命令查看可以引导启动的设备,竟然没有发现M.2硬盘。
在这里插入图片描述
执行pci命令,没有扫描到M.2的PCI设备和厂商ID信息。原因找到了,就是D2000没有发现硬盘,UFEI无法从硬盘加载麒麟系统,从而进入SHELL。
在这里插入图片描述
为什么扫描不到硬盘?以前在FT2000平台上也遇到过类似问题,原因是硬件问题:硬盘插到我们板上后,信号和地短路了,硬盘和我们板上连接器的结构控制的不行,解决办法是更换连接器,同时弃用该品牌的硬盘。

本文所描述的问题,硬件工程师还没有定位,我估计可能也是类似问题。软件流程是正常的。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐