我是EDK2 tianocore的初学者。
我有EFI Shell,我想用EFI Shell打开当前的USB作为物理磁盘来读写块。在WinAPI中,我知道CreateFile
函数的参数类似于“\\。\ D:”,ReadFile
和WriteFile
。
EDK2的类似物是什么?你能举例和一些有用的链接吗?
UPD 30.06.2017。
我正在尝试使用EFI_USB_IO_PROTOCOL来通过USB闪存获得比EFI_BLOCK_IO_PROTOCOL更快的IO操作。
我有这样的代码:
EFI_STATUS
USBXYZDriverBindingSupported (
IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH *RemainingDevicePath
)
{
UINT32 *OpenStatus= NULL;
EFI_USB_IO_PROTOCOL *UsbIo;
EFI_STATUS Status;
EFI_USB_INTERFACE_DESCRIPTOR InterfaceDescriptor;
CHAR16 *DevStr = NULL;
DevStr = DevicePathToStr(RemainingDevicePath);
//
// Check if USB_IO protocol is attached on the controller handle.
//
Status = BS->OpenProtocol (
Controller,
&gEfiUsbIoProtocolGuid,
(VOID**)&UsbIo,
gImgHandle,
Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Get the default interface descriptor
//
Status = UsbIo->UsbGetInterfaceDescriptor(
UsbIo,
&InterfaceDescriptor
);
Print(L"%a.%d %r %s\n", __FUNCTION__, __LINE__, Status, DevStr);
UINTN a = 512;
UINTN *byteSize = &a;
char *buf = AllocateZeroPool(512);
Status = UsbIo->UsbBulkTransfer(UsbIo, 0x82, buf, byteSize, 0, OpenStatus);
Print(L"%a.%d %r %d %d\n", __FUNCTION__, __LINE__, Status,OpenStatus, *byteSize);
BS->CloseProtocol (
Controller,
&gEfiUsbIoProtocolGuid,
gImgHandle,
Controller
);
return Status;
}
我只有一台设备才能获得成功的OpenProtocol输出。比我试图从USB读取前512个字节。
但是,函数UsbBulkTransfer
失败。
输出:
USBXYZDriverBindingSupported.196成功 PciRoot(0)/ Pci(0x14,0x0)/ Usb(0x1,0x0)USBXYZDriverBindingSupported.203 无效的Parametr 0 512
我read表示EFI_INVALID_PARAMETER因为:
Data is NULL
- 不是我的选择。我正在尝试读取数据。
DataLength is NULL.
- 不是我的选择。长度是512。
If DeviceEndpoint is not valid.
- 可能的原因。如何知道DeviceEndpoint的含义?如何获取,计算,使用它?
我还尝试使用OpenProtocol
和EFI_OPEN_PROTOCOL_GET_PROTOCOL
EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL
。什么都没有改变。
如何使用UsbBulkTransfer读取数据?我的错是什么?
谢谢。