请保留-> 【原文: https://blog.csdn.net/luobing4365 和 http://yiiyee.cn/blog/author/luobing/】
正在编辑新书《UEFI编程实践》(暂定名),现在介绍的内容,都整理到了第8章中了。
写书还是比较费神的,博客中可以随意行文,书稿则完全不能这么做。为了做到准确,有时为了确定一个数据,需要花费整个上午查找资料。期待今年上半年能够出版吧。
关于Option ROM,在第34、35和36篇中,已经描述过其历史和原理了。现在有了开发板,就可以在上面直接进行开发了。
1 开发Option ROM
代码是基于BlankDrv中的架构进行开发的,主要修改Supported()函数和Start()函数。Supported()函数中,判断是否为目标PCIE设备(也即是否为YIE001开发板);Start()函数中,添加界面代码以及访问硬件设备的代码。
示例1中给出了修改后的Supported()代码。
【示例1】Supported()函数
EFI_STATUS EFIAPI BlankDrvDriverBindingSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL)
{
EFI_STATUS Status;
UINT16 MyVendorID, MyDeviceID;
EFI_PCI_IO_PROTOCOL *PciIo;
Status = gBS->OpenProtocol (Controller, &gEfiPciIoProtocolGuid,
(VOID **) &PciIo,This->DriverBindingHandle,
Controller,EFI_OPEN_PROTOCOL_BY_DRIVER);
if (EFI_ERROR (Status)) return Status;
Status = PciIo->Pci.Read(PciIo,EfiPciIoWidthUint16,0,1,&MyVendorID);
if (EFI_ERROR (Status)) goto Done; //获取厂商ID
Status = PciIo->Pci.Read(PciIo,EfiPciIoWidthUint16,2,1,&MyDeviceID);
if (EFI_ERROR (Status)) goto Done; //获取设备ID
Status = EFI_SUCCESS;
//通过厂商ID和设备ID,判断是否为目标设备
if (MyVendorID != CH366_VENDOR_ID || MyDeviceID != CH366_DEVICE_ID)
Status = EFI_UNSUPPORTED;
Done: //关闭所用的Protocol
gBS->CloseProtocol(Controller,&gEfiPciIoProtocolGuid,
This->DriverBindingHandle,Controller);
return Status;
}
在Supported()函数中,首先使用OpenProtocol()打开PCI I/O Protocol,如果打开失败,则返回EFI_UNSUPPORTED。然后使用得到的PCI I/O Protocol实例,从PCI设备的配置空间,获得厂商ID和设备ID。如果所得到的厂商ID及设备ID,与目标设备的一致,则返回EFI_SUCCESS,否则返回EFI_UNSUPPORTED。
继续阅读“UEFI开发探索71- YIE001PCIe开发板(07 OptionROM框架)” 1,944 total views, 1 views today