EDK2找不到I2C巴士

发布于 2025-02-11 03:39:57 字数 2554 浏览 1 评论 0原文

我是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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

无语# 2025-02-18 03:39:57

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

可悲的是,如果协议不存在,则有两个选择:

  1. 实现低级API。
  2. 找到一个完成1中写的事情的人。

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:

  1. to implement the low level api.
  2. find someone who has done what is written in 1.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文