首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >edk2找不到i2c总线

edk2找不到i2c总线
EN

Stack Overflow用户
提问于 2022-06-28 17:13:03
回答 1查看 213关注 0票数 0

我是UEFI的新手,我正尝试在UEFI板上与i2c总线交谈。我试过跟随人们尝试使用USB类似的东西,但是gBS->LocateHandleBuffer似乎没有找到i2c总线。我被引导认为,由于i2c的行为与USB不同,我可能无法对它采取相同的方法,但我无法证实我的怀疑。

在这一点上,任何提示/指针都将不胜感激。

代码语言:javascript
复制
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;
}
EN

回答 1

Stack Overflow用户

发布于 2022-09-12 06:59:17

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

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

  1. 来实现低级api.
  2. ,查找已经完成了1.

中所写内容的人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72790664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档