基于UEFI的BIOS怎么识别不同设备(SataHdd、SataCdrom、USB、BMC)

参考:UEFI_SPEC

   第一种方法:

  SATA设备根据EFI_ATA_DEVICE_TYPE类型来细分
  ATAPI接口是SCSI和IDE总线的结合产物。该接口使用IDE接口和协议机型ATA和SCSI总线命令传输,允许使用ATAPI控制所连接的SCSI设备。

1、EFI_ATA_PASS_THRU_PROTOCOL

  提供允许将ATA命令发送到附加到ATA控制器上的ATA设备的服务。基于包的命令只能通过扩展SCSI协议发送到ATAPI设备。当ATA_PASS_THRU向ATA公开一个接口,EXT_SCSI_PASS_THRU负责为同一ATA控制器上的ATAPI设备公开基于数据包的命令接口。

 Status =gBS->LocateHandleBuffer (ByProtocol,&gEfiAtaPassThruProtocolGuid,NULL,&NumberHandles,&AtaPassHandles);

  用LocateHandleBuffer 定位支持gEfiAtaPassThruProtocolGuid的句柄。

2、循环遍历获得的句柄,获得支持gEfiAtaPassThruProtocolGuid的接口AtaPassProtocol

for (Index = 0; Index < NumberHandles; Index++) {Status = gBS->HandleProtocol (AtaPassHandles[Index],&gEfiAtaPassThruProtocolGuid,(VOID **) &AtaPassProtocol);if (Status == EFI_SUCCESS) {Instance = ATA_PASS_THRU_PRIVATE_DATA_FROM_THIS (AtaPassProtocol);Node = GetFirstNode (&Instance->DeviceList);while (!IsNull (&Instance->DeviceList, Node)) {ATADeviceInfo = ATA_ATAPI_DEVICE_INFO_FROM_THIS (Node);Node = GetNextNode (&Instance->DeviceList, Node);}
}

3、判断条件:区分SataHdd和SataCdrom:

SataHdd:ATADeviceInfo->Type == EfiIdeHarddisk
SataCdrom:ATADeviceInfo->Type == EfiIdeCdrom;

typedef enum {
EfiIdeCdrom, /* ATAPI CDROM /
EfiIdeHarddisk, /
Hard Disk /
EfiPortMultiplier, /
Port Multiplier */
EfiIdeUnknown
} EFI_ATA_DEVICE_TYPE;
EFI_ATA_DEVICE_TYPE对SATA的设备类型进行细分,Cdrom,和Harddisk都接的SATA口,使用ATA类型可以进一步划分。

  第二种方法:分析设备路径类型

  设备路径的区分通过EFI_DEVICE_PATH_PROTOCOL的Type和SubType的值进行区分

1、EFI_DEVICE_PATH_PROTOCOL.

  设备路径用于定义指向设备的编程路径。设备路径的主要目的是允许一个应用程序,例如操作系统加载程序,来确定接口正在抽象的物理设备。
  可用于任何设备句柄,以获取有关物理设备或逻辑设备的通用路径/位置信息。如果句柄在逻辑上没有映射到物理设备,则该句柄可能不一定支持设备路径协议。设备路径描述了该手柄所对应的设备的位置。设备路径的大小可以由组成设备路径的结构来确定。

typedef struct {UINT8 Type;       ///< 0x01 Hardware Device Path.///< 0x02 ACPI Device Path.///< 0x03 Messaging Device Path.///< 0x04 Media Device Path.///< 0x05 BIOS Boot Specification Device Path.///< 0x7F End of Hardware Device Path.UINT8 SubType;    ///< Varies by Type///< 0xFF End Entire Device Path, or///< 0x01 End This Instance of a Device Path and start a new///< Device Path.UINT8 Length[2];  ///< Specific Device Path data. Type and Sub-Type define///< type of data. Size of data is included in Length.} EFI_DEVICE_PATH_PROTOCOL;

0x01 Hardware Device Path:硬盘设备路径。
0x02 ACPI Device Path. ACPI设备路径,
0x03 Messaging Device Path. SCSI设备路径:
0x04 Media Device Path. 硬盘上的分区路径
0x05 BIOS Boot Specification Device Path. 指向引导旧的操作系统的设备路径
0x7F End of Hardware Device Path. 硬件设备路径的结束。

2、主要几种设备的类型举例

需要更多类型,应查看UEFI SPEC
2.1、PCI Device Path

Mnemonic ByteOffset Byte Length Description
type 0 1 Type 1 – Hardware Device Path
Sub-Type 1 1 Sub-Type 1 – PCI
Length 2 2 Length of this structure is 6 bytes
2.2、BMC Device Path
Mnemonic ByteOffset Byte Length Description
-------- ----- ----- -----
type 0 1 Type 1 – Hardware Device Path
Sub-Type 1 1 Sub-Type 6 – BMC
Length 2 2 Length of this structure in bytes. Length is 13 bytes
2.3、ATAPI Device Path
Mnemonic ByteOffset Byte Length Description
-------- ----- ----- -----
type 0 1 Type 3 – Messaging Device Path
Sub-Type 1 1 Sub-Type 6 – Sub-Type 1 – ATAPI
Length 2 2 Length of this structure in bytes. Length is 13 bytes
2.4、SCSI Device Path
Mnemonic ByteOffset Byte Length Description
-------- ----- ----- -----
type 0 1 Type 3 – Messaging Device Path
Sub-Type 1 1 Sub-Type 6 – Sub-Type 2– SCSI
Length 2 2 Length of this structure in bytes. Length is 8 bytes
2.5、USB Device Paths
Mnemonic ByteOffset Byte Length Description
-------- ----- ----- -----
type 0 1 Type 3 – Messaging Device Path
Sub-Type 1 1 Sub-Type 6 – Sub-Type 5– USB
Length 2 2 Length of this structure in bytes. Length is 6 bytes
2.6、 MAC Address Device Path
Mnemonic ByteOffset Byte Length Description
-------- ----- ----- -----
type 0 1 Type 3 – Messaging Device Path
Sub-Type 1 1 Sub-Type 11 – MAC Address for a network interface
Length 2 2 Length of this structure in bytes. Length is 37 bytes

3、判断ClassCode的值

Status = gBS->LocateHandleBuffer(ByProtocol,&gEfiPciIoProtocolGuid,NULL,&HandleArrayCount,&HandleArray);if (EFI_ERROR(Status)) {return OCPPortNum;}for (Index2=0; Index2<HandleArrayCount; Index2++){Status = gBS->HandleProtocol(HandleArray[Index2],&gEfiPciIoProtocolGuid,(VOID **)&PciIo);Status = PciIo->Pci.Read(PciIo,EfiPciIoWidthUint8,0x0B, //PCI_CLASSCODE_OFFSET1,&BaseClass);Status = PciIo->Pci.Read(PciIo,EfiPciIoWidthUint8,0x0A, //PCI_CLASSCODE_OFFSET1,&SubClass);}if(BaseClass == 0x02){// 网卡}if((BaseClass == 0x01)&&((SubClass == 0x07)||(SubClass == 0x04)){// raid卡}

基于UEFI的BIOS怎么识别不同设备(SataHdd、SataCdrom、USB、BMC)相关推荐

  1. easyuefi只能在基于uefi启动的_电脑知识:5分钟教你深入了解BIOS+MBR和UEFI+GPT

    现如今很多的朋友都会自己装电脑系统,隔三差五就重装系统,俗话说:没有重装系统解决不了的问题,如果有,就装两遍!!!问题是解决了,但是对其中的操作有没有更深刻的了解呢?比如装系统中涉及到的 Legacy ...

  2. easyuefi只能在基于uefi启动的_云计算学习体系-1.1-计算机硬件基础扩展知识BIOS/UEFI/MBR/GPT...

    我们每天都在用电脑,很多人可能每天都要面对多次Windows的启动过程,可是您知道在Windows的启动过程背后,你真真了解过吗?上文中我们认识了计算机的基本硬件,其中讲到BIOS和UEFI,下次内容 ...

  3. 惠普服务器装系统无法识别u盘,惠普uefi bios无法识别u盘的解决方法

    3.如何解决惠普电脑uefi识别不了u盘 2.进入bios后,切换到system configuration选项卡,在按"↓"键移动到boot options并按回车键,如图所示: ...

  4. 基于DSP/BIoS设备驱动模型的视频驱动程序开发

    作者:天津科技大学 电子信息与自动化学院 严新忠,刘 喆 通过给外部设备编写驱动程序是一种有效的控制外设的方法.随着DSP的应用越来越广泛,DSP实时系统的日趋复杂及新技术的出现,DSP处理器所连接的 ...

  5. easyuefi只能在基于uefi启动的_如何以简单正确的姿势理解“UEFI”和“BIOS”?

    在进行电脑重装的时候,我们常会听到UEFI和BIOS这两个词,例如怎么进入BIOS启动设置页面,电脑不支持UEFI启动等等,但是我们对其背后的含义却没有什么了解,实际上这些都是比较基础的知识,理解这些 ...

  6. easyuefi只能在基于uefi启动的_systemd时代的开机启动流程(UEFI+systemd)

    本文内容预告: 开机启动流程图预览 按下电源和固件阶段 内核启动阶段 内核启动后,用户登录前 计算机启动流程可以分为几个大阶段: 内核加载前 本阶段和操作系统无关,Linux或Windows或其它系统 ...

  7. UEFI、BIOS、Secure Boot的关系和知识介绍

    从Windows 8操作系统时代开始,安装操作系统的方法也有了很大的改变,Windows 8采用了Secure Boot引导启动的方式,而不是过去Win XP和Win 7的Legacy启动方式,从而导 ...

  8. 华硕主板固态硬盘不识别_华硕b360主板bios不识别m.2固态怎么办?

    [文章导读]nvme m.2硬盘由于有更好的传输速度和性能越来越受到用户的欢迎,但是在安装中也会遇到一些问题,如有用户反馈华硕B360主板在安装了NVMe m.2固态硬盘之后BIOS中无法识别的问题, ...

  9. easyuefi只能在基于uefi启动的_UEFI模式有什么优点?安装系统首选UEFI启动,电脑系统速度更流畅...

    legacy启动是什么?UEFI启动是什么?可能大部分朋友对这个概念都比较模糊,UEFI可以做什么呢?有什么具体的作用?似乎经常可以在BIOS设置里会见到它,毕竟从几年前开始越来越多的电脑都使用上了带 ...

最新文章

  1. 蓝桥杯第九届决赛-交换次数-java
  2. R语言ggplot2可视化绘制多条基本线图(Basic line plot)、使用gghighlight包突出高亮其中的某一条线图(highlight line plot)
  3. 使用Poco实现插件方式加载动态库
  4. java常用类解析十:Date类和Calendar类示例
  5. poj 1384 完全背包
  6. VTK:PolyData之AttachAttributes
  7. 按钮是什么意思_汽车里的Rear按键是什么意思?
  8. ACRush 楼天城回忆录
  9. ubuntu12.04samba服务器配置
  10. 在Visual Studio中利用NTVS创建Pomelo项目
  11. JAVA进阶教学之(foreach)
  12. android media apex_APEX英雄主播即将登陆时代广场?人气十强介绍!
  13. 【转】NB的specify
  14. nginx学习笔记 nginx 配置文件位置 常用命令
  15. 使用JSONP实现跨域通信
  16. python自动化办公手册之python操作PPT
  17. Gym 10102B 贪心
  18. [noip模拟赛]算算数
  19. MSP430F149;一、TIMEA
  20. 解决IE系列浏览器上传页面接收问题

热门文章

  1. labview插件下载
  2. python实现lagrange函数
  3. servlet3.1规范翻译:前言
  4. 基于金融业顾客生命周期的商业分析
  5. YOLOv5报错:OSError: cannot open resource
  6. 优达(Udacity)smartcab
  7. 关于错误:ERROR 2013 (HY000):
  8. FastConverter .FP3转换为几乎任何流行的格式
  9. JavaScript画漂亮的心形图案
  10. 电子工程师标配十款经典RF射频器件