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

news/2024/11/29 0:31:18/

基于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

MnemonicByteOffsetByte LengthDescription
type01Type 1 – Hardware Device Path
Sub-Type11Sub-Type 1 – PCI
Length22Length of this structure is 6 bytes
2.2、BMC Device Path
MnemonicByteOffsetByte LengthDescription
-----------------------
type01Type 1 – Hardware Device Path
Sub-Type11Sub-Type 6 – BMC
Length22Length of this structure in bytes. Length is 13 bytes
2.3、ATAPI Device Path
MnemonicByteOffsetByte LengthDescription
-----------------------
type01Type 3 – Messaging Device Path
Sub-Type11Sub-Type 6 – Sub-Type 1 – ATAPI
Length22Length of this structure in bytes. Length is 13 bytes
2.4、SCSI Device Path
MnemonicByteOffsetByte LengthDescription
-----------------------
type01Type 3 – Messaging Device Path
Sub-Type11Sub-Type 6 – Sub-Type 2– SCSI
Length22Length of this structure in bytes. Length is 8 bytes
2.5、USB Device Paths
MnemonicByteOffsetByte LengthDescription
-----------------------
type01Type 3 – Messaging Device Path
Sub-Type11Sub-Type 6 – Sub-Type 5– USB
Length22Length of this structure in bytes. Length is 6 bytes
2.6、 MAC Address Device Path
MnemonicByteOffsetByte LengthDescription
-----------------------
type01Type 3 – Messaging Device Path
Sub-Type11Sub-Type 11 – MAC Address for a network interface
Length22Length 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卡}

http://www.ppmy.cn/news/545973.html

相关文章

linux ata模式,LIBATA - Linux 内核引导选项简介

[LIBATA] libata.noacpi 在libata驱动休眠/唤醒过程中禁止使用ACPI。主要用于解决某些有缺陷的BIOS导致的硬盘假死问题。 [LIBATA] libata.dma整数 控制DMA特性的使用 libata.dma0 表示完全禁止所有SATA/PATA端口使用DMA libata.dma1 表示仅允许SATA/PATA硬盘使用DMA libata.dm…

服务器换主板后找不到磁盘,服务器硬盘频繁丢失的非常奇怪无解问题

附错误日志(典型的) 事件类型: 错误 事件来源: Disk 事件种类: 无 事件 ID: 11 日期: 2009-9-14 事件: 11:11:14 用户: N/A 计算机: CNQK-JSFOOVENFE 描述: 驱动程序在 \Device\Harddisk1 上检测到控制器错误。 有关更多信息&#xff0c;请参阅在 http://go.microsoft.com/fwli…

ATAPI(磁盘端口驱动)级文件保护简单实现

ATAPI&#xff08;磁盘端口驱动&#xff09;级文件保护简单实现 #define IoGetIrpStackLocation( Irp , Level) (\ (Irp)->Tail.Overlay.CurrentStackLocation Level ) BOOL IfIrpHasFobj(PIRP pIrp , LPCWSTR FileName) { ULONG i , j ; PIO_STACK_LOCATION irpStack…

linux打开cd驱动器命令,在Linux中,如何挂载cdrom

CD和DVD使用ISO9660文件系统。 ISO9660的目的是提供各种操作系统之间的数据交换标准。结果,任何Linux操作系统都能够处理ISO9660文件系统。本指南介绍了如何在Linux中安装/卸载ISO9660 file-system,从而使用户能够从CD或DVD介质读取数据的方法。 如果您在阅读本文后仍有疑问,…

Linux环境下ATAPI MO的使用方法(转)

Linux环境下ATAPI MO的使用方法(转)[more]ATAPI MO在Linux操作系统上使用前一般需要对LINUX系统内核作一点修改&#xff0c;然后重新编译LINUX系统内核。 另外&#xff0c;Linux操作系统内核版本小于2.2.2时可能不支持ATAPI MO&#xff0c;因此要在Linux上使用ATAPI MO时&#…

reactos操作系统实现(110)

AtapiStartIo函数主要处理同步的IO请求包。具代的实现代码如下&#xff1a; #001 BOOLEAN #002 NTAPI #003 AtapiStartIo( #004 IN PVOID HwDeviceExtension, #005 IN PSCSI_REQUEST_BLOCK Srb #006 ) #007 #008 /* #009 #010 Routine Description: #0…

atapi.sys 蓝屏 难度系数☆☆☆ ...

这得记录一下哈&#xff0c;有"损"学知识&#xff0c;哎.....如下。 刚才&#xff0c;在半岛博客上看视频&#xff0c;机子有点卡&#xff0c;我看了看cpu使用率也不高&#xff0c;内存也剩不少&#xff0c;这是怎么回事儿呢&#xff1f; 我就想&#xff0c;想着想着…

SATA-AHCI规范学习

目录 参考文献 基本概念 HBA AHCI HBA OOB(Out of Band)信号解析 PIO FPDMA TAG FIS(Frame Information Structure) PRD PIO Port Multiplier NCQ sht SATA Shadow Register SATA Registers SStatus register (SCR0) SError register (SCR1) SControl register (SCR2) SActi…