2017年9月29日 星期五

UEFI Application - load protocol

今天需要在 app 中讀取 CMOS 資訊
經同事建議後,使用 EFI_CPU_IO_PROTOCOL 來讀取它

由於完全不懂 BIOS 概念
網路上也找不到相關資料
在翻遍了 UDK2014 code base 後
搞了 2 個小時才搞定

希望寫出來的東西不會誤導大眾

xxx.inf

[Protocols]
    gEfiCpuIoProtocolGuid

xxx.c

#include <Protocol/CpuIo.h>
#include <Library/UefiBootServicesTableLib.h>
#include <stdio.h>

EFI_CPU_IO_PROTOCOL *mCpuIo = NULL;

void testReadCMOS()
{
    EFI_STATUS Status;
    UINT8 addr;
    UINT8 data;
    
    Status = gBS->LocateProtocol(&gEfiCpuIoProtocolGuid, NULL, (VOID **)&mCpuIo);  
    if (Status != EFI_SUCCESS) {
        return;
    }
    
    addr = 0x30;
    Status = mCpuIo->Io.Write(
        mCpuIo,
        EfiCpuIoWidthUint8,
        0x70,
        1,
        &addr
    );
    
    if (Status != EFI_SUCCESS) {
        return;
    }
    
    Status = mCpuIo->Io.Read(
        mCpuIo,
        EfiCpuIoWidthUint8,
        0x71,
        1,
        &data
    );
    
    if (Status != EFI_SUCCESS) {
        return;
    }
    
    printf("CMOS 0x30=%X", data); 
}

沒有留言:

張貼留言