EDK2找不到I2C巴士
我是UEFI的新手,我正在尝试在极端板上与I2C公共汽车交谈。我尝试关注在线尝试类似的人,但gbs-> locateHandleBuffer
似乎找不到I2C总线。我被认为是因为I2C的行为与USB不同,所以我可能无法采取相同的方法,但是我无法确认我的怀疑。
在这一点上,任何提示/指示都将不胜感激。
EFI_STATUS
EFIAPI
UefiMain(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE* SystemTable
)
{
EFI_STATUS Status;
EFI_HANDLE* HandleBuffer = NULL;
UINTN HandleCount = 17;
Print(L"HandleCount: %x\n", HandleCount);
Print(L"HandleBuffer: %x\n", HandleBuffer);
UINTN* freq = (UINTN*)23;
EFI_I2C_DEVICE* i2cDescriptor;
EFI_I2C_ENUMERATE_PROTOCOL* enumerateI2c;
Status = gBS->LocateHandleBuffer(ByProtocol,
&gEfiI2cEnumerateProtocolGuid,
NULL,
&HandleCount,
&HandleBuffer);
if (EFI_ERROR(Status)) {
Print(L"ERROR: LocateHandleBuffer.\n");
Print(L"Status: %x\n", (int)Status);
Print(L"HandleCount: %x\n", HandleCount);
Print(L"HandleBuffer: %x\n", HandleBuffer);
return Status;
}
for (UINT8 Index = 0; Index < HandleCount; Index++) {
Status = gBS->HandleProtocol(HandleBuffer[Index],
&gEfiI2cEnumerateProtocolGuid,
(VOID**)&enumerateI2c);
if (EFI_ERROR(Status)) {
Print(L"ERROR: HandleProtocol.\n");
Print(L"Status: %x\n", (int)Status);
Print(L"HandleCount: %x\n", HandleCount);
Print(L"HandleBuffer: %x\n", HandleBuffer);
FreePool(HandleBuffer);
return Status;
}
Status = enumerateI2c->Enumerate(enumerateI2c, &i2cDescriptor);
Print(L"Starting to enumerate\n");
if (EFI_ERROR(Status)) {
Print(L"ERROR: Enumerate.\n");
Print(L"Status: %x\n", (int)Status);
Print(L"HandleCount: %x\n", HandleCount);
Print(L"HandleBuffer: %x\n", HandleBuffer);
FreePool(HandleBuffer);
return Status;
}
Print(L"Enumeration complete\nGetting Bus frequency\n");
Status = enumerateI2c->GetBusFrequency(enumerateI2c, i2cDescriptor->I2cBusConfiguration, freq);
if (EFI_ERROR(Status)) {
Print(L"ERROR: GetBusFrequency.\n");
Print(L"Status: %x\n", (int)Status);
FreePool(HandleBuffer);
return Status;
}
Print(L"Found Frequency:\n");
Print(L"%d\n", (CHAR16*)freq);
}
FreePool(HandleBuffer);
return EFI_SUCCESS;
}
I am new to UEFI and I am attempting to talk to an i2c bus on an Up eXtreme board. I have tried following people trying similar things with USB online but gBS->LocateHandleBuffer
does not seem to find the i2c bus. I am led to assume that since i2c behaves differently to USB I may not be able to take the same approach with it, but I have no way of confirming my suspicions.
At this point any tips/pointers would be appreciated.
EFI_STATUS
EFIAPI
UefiMain(
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE* SystemTable
)
{
EFI_STATUS Status;
EFI_HANDLE* HandleBuffer = NULL;
UINTN HandleCount = 17;
Print(L"HandleCount: %x\n", HandleCount);
Print(L"HandleBuffer: %x\n", HandleBuffer);
UINTN* freq = (UINTN*)23;
EFI_I2C_DEVICE* i2cDescriptor;
EFI_I2C_ENUMERATE_PROTOCOL* enumerateI2c;
Status = gBS->LocateHandleBuffer(ByProtocol,
&gEfiI2cEnumerateProtocolGuid,
NULL,
&HandleCount,
&HandleBuffer);
if (EFI_ERROR(Status)) {
Print(L"ERROR: LocateHandleBuffer.\n");
Print(L"Status: %x\n", (int)Status);
Print(L"HandleCount: %x\n", HandleCount);
Print(L"HandleBuffer: %x\n", HandleBuffer);
return Status;
}
for (UINT8 Index = 0; Index < HandleCount; Index++) {
Status = gBS->HandleProtocol(HandleBuffer[Index],
&gEfiI2cEnumerateProtocolGuid,
(VOID**)&enumerateI2c);
if (EFI_ERROR(Status)) {
Print(L"ERROR: HandleProtocol.\n");
Print(L"Status: %x\n", (int)Status);
Print(L"HandleCount: %x\n", HandleCount);
Print(L"HandleBuffer: %x\n", HandleBuffer);
FreePool(HandleBuffer);
return Status;
}
Status = enumerateI2c->Enumerate(enumerateI2c, &i2cDescriptor);
Print(L"Starting to enumerate\n");
if (EFI_ERROR(Status)) {
Print(L"ERROR: Enumerate.\n");
Print(L"Status: %x\n", (int)Status);
Print(L"HandleCount: %x\n", HandleCount);
Print(L"HandleBuffer: %x\n", HandleBuffer);
FreePool(HandleBuffer);
return Status;
}
Print(L"Enumeration complete\nGetting Bus frequency\n");
Status = enumerateI2c->GetBusFrequency(enumerateI2c, i2cDescriptor->I2cBusConfiguration, freq);
if (EFI_ERROR(Status)) {
Print(L"ERROR: GetBusFrequency.\n");
Print(L"Status: %x\n", (int)Status);
FreePool(HandleBuffer);
return Status;
}
Print(L"Found Frequency:\n");
Print(L"%d\n", (CHAR16*)freq);
}
FreePool(HandleBuffer);
return EFI_SUCCESS;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
并非每个UEFI固件都支持所有UEFI功能和驱动程序。
尝试在不同的硬件上运行该应用程序,看看它们是否支持协议。
可悲的是,如果协议不存在,则有两个选择:
not all UEFI features and drivers are supported on each UEFI firmware.
try to run the app on different hardwares, and see if they support the protocol.
sadly if the protocol does not exists, you have two options: