edk2找不到i2c总线



我是UEFI的新手,我正在尝试与Up eXtreme板上的i2c总线交谈。我试过跟随人们在网上用USB尝试类似的事情,但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:    %xn", HandleCount);
Print(L"HandleBuffer:   %xn", 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: %xn", (int)Status);
Print(L"HandleCount:    %xn", HandleCount);
Print(L"HandleBuffer:   %xn", 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: %xn", (int)Status);
Print(L"HandleCount:    %xn", HandleCount);
Print(L"HandleBuffer:   %xn", HandleBuffer);
FreePool(HandleBuffer);
return Status;
}
Status = enumerateI2c->Enumerate(enumerateI2c, &i2cDescriptor);
Print(L"Starting to enumeraten");
if (EFI_ERROR(Status)) {
Print(L"ERROR: Enumerate.n");
Print(L"Status: %xn", (int)Status);
Print(L"HandleCount:    %xn", HandleCount);
Print(L"HandleBuffer:   %xn", HandleBuffer);
FreePool(HandleBuffer);
return Status;
}
Print(L"Enumeration completenGetting Bus frequencyn");
Status = enumerateI2c->GetBusFrequency(enumerateI2c, i2cDescriptor->I2cBusConfiguration, freq);
if (EFI_ERROR(Status)) {
Print(L"ERROR: GetBusFrequency.n");
Print(L"Status: %xn", (int)Status);
FreePool(HandleBuffer);
return Status;
}
Print(L"Found Frequency:n");
Print(L"%dn", (CHAR16*)freq);
}
FreePool(HandleBuffer);
return EFI_SUCCESS;
}

并非所有UEFI功能和驱动程序都支持每个UEFI固件。尝试在不同的硬件上运行应用程序,看看它们是否支持该协议。

遗憾的是,如果协议不存在,您有两个选择:

  1. 实现底层api
  2. 找到已经完成1中所写内容的人。

最新更新