2010年8月31日 星期二

於EDK中加入DXE Driver

建立好EDK環境後,先找到自己要放置Driver的資料夾,這個例子是放在Sample\Platform\Generic\底下,建立一個TestDriver的資料夾。

依序建立以下檔案:
TestDriver.h
========================================
#ifndef _TEST_DRIVER_H_
#define _TEST_DRIVER_H_

#include "Tiano.h"
#include "EfiDriverLib.h"

//
// Function Prototypes
//
EFI_STATUS
EFIAPI
TestDriverEntry (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
);

#endif
========================================

TestDriver.c
========================================
#include "TestDriver.h"

EFI_DRIVER_ENTRY_POINT (TestDriverEntry)

EFI_STATUS
EFIAPI
TestDriverEntry (
IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable
)
{
EFI_STATUS Status;

Status = EfiInitializeDriverLib(ImageHandle, SystemTable);

DEBUG_CODE (
DEBUG ((EFI_D_INFO | EFI_D_LOAD, "Test = %s\n", L"TestDriverEntry"));
)

return Status;
}
========================================

TestDriver.inf
========================================
[defines]
BASE_NAME = TestDriver
FILE_GUID = 7B257F2E-7177-408a-BA46-567C07301F69
COMPONENT_TYPE = BS_DRIVER

[sources.common]
TestDriver.c

[libraries.common]
EdkGuidLib
EfiGuidLib
EfiProtocolLib
EfiDriverLib

[includes.common]
$(EDK_SOURCE)\Foundation
$(EDK_SOURCE)\Foundation\Efi
$(EDK_SOURCE)\Foundation\Framework
.
$(EDK_SOURCE)\Foundation\Include
$(EDK_SOURCE)\Foundation\Efi\Include
$(EDK_SOURCE)\Foundation\Framework\Include
$(EDK_SOURCE)\Foundation\Include\IndustryStandard
$(EDK_SOURCE)\Foundation\Core\Dxe
$(EDK_SOURCE)\Foundation\Library\Dxe\Include
$(EDK_SOURCE)\Sample\Include

[nmake.common]
IMAGE_ENTRY_POINT=TestDriverEntry
========================================

其中.inf的FILE_GUID可由Visual Studio中的Tools->建立GUID這個工具建立。
加入以上檔案後開啟Sample\Platform\Nt32\Build\Nt32.dsc
找一個地方加入這一行:
Sample\Platform\Generic\Test\TestDriver\TestDriver.inf

範例:
#
# Fat File System driver. Default is binary only
#
Other\Maintained\Universal\Disk\FileSystem\EnhancedFat\Dxe\Fat.inf

# By Yourself
Sample\Platform\Generic\Test\TestDriver\TestDriver.inf

存檔後即可build,此時在Console即可印出剛剛程式中的debug訊息:
EventTest = EventTestDriverEntry

Finish!

2010年8月12日 星期四

建立EDK模擬環境與範例HelloWorld編譯

首先先下載EDK,其次下載EFI Shell,最後再到EDK Apps下載HelloWorld範例檔。

一、解壓縮EDK至C:\根目錄底下。

二、開啟剛下載的EFI Shell,將Shell目錄底下的檔案全部解壓縮至C:\EDK\Other\Maintained\Application\UefiShell\中。


三、再來一樣把HelloWorld解壓縮至此。

四、開啟Sample\Platform\Nt32\Build\Nt32.dsc,找到[Libraries.Platform]這個區塊,
在下面加入Other\Maintained\Application\UefiShell\Library\EfiShellLib.inf;再來找到[Components]區塊,在DEFINE FV=FvRecovery後面添加Other\Maintained\Application\UefiShell\HelloWorld\HelloWorld.inf FV=NULL,之後存檔即可。


編譯前依照您的Visual Studio版本修改Sample\Platform\Nt32\Build\Config.env,找到USE_VC8,只要您是2005(含以上版本)就改為YES。

打開【Visual Studio 命令提示字元】,進入到Sample\Platform\Nt32目錄底下,鍵入SET EDK_SOURCE=C:\EDK,完成後再輸入build編譯即可。

編譯完成後,先執行uefi底下的System.cmd設定好環境變數,最後可到IA32底下執行secmain.exe,這個就是Shell的模擬環境,相同的地方底下也有個剛剛一同建置好的HelloWorld.efi,可在Shell中執行他,預設是放在fsnt0(f9)裝置。

======================================================================

而起始Loading部分的Logo圖檔更換方式有兩種:
一、直接到Sample\Platform\Generic\Logo底下將logo.bmp換掉,再重新編譯一次。

二、開啟Sample\Platform\Nt32\Build\Nt32.dsc到Sample\Platform\Generic\Logo\Logo.inf這一行,修改為Sample\Platform\Generic\Logo\Logo.inf SOURCE_OVERRIDE_PATH=您自己的logo.bmp目錄(不含檔名)。

2010年8月3日 星期二

建立EDK II模擬環境

EDK II可於此https://github.com/tianocore/edk2下載。

我的系統為Win7 X64,Visual Studio版本為2010,欲編譯的架構為IA32

假設EDK II的存放地點在C:\EDK2\,執行Visual Studio 命令提示字元 (2010)(依您所安裝的VS版本開啟)
目錄切換到C:\EDK2\,執行edksetup.bat佈署環境。
接下來開啟Conf\target.txt,進行編譯前的設置,有以下參數:
ACTIVE_PLATFORM = Nt32Pkg/Nt32Pkg.dsc
TARGET = DEBUG
TARGET_ARCH = IA32
TOOL_CHAIN_CONF = Conf/tools_def.txt
TOOL_CHAIN_TAG = MYTOOLS
MAX_CONCURRENT_THREAD_NUMBER = 1
MULTIPLE_THREAD = Disable
BUILD_RULE_CONF = Conf/build_rule.txt

我只修改MAX_CONCURRENT_THREAD_NUMBER與MULTIPLE_THREAD,若您的CPU為多核心,則可做多執行續的程式編譯,其餘參數可依照自己所需的平台與架構做修改。

另外由於我的系統為X64,VS 2010安裝的路徑為C:\Program Files (x86)\Microsoft Visual Studio 10.0,而Conf/tools_def.txt中並沒有定義VS 2010的變數,此時如要編譯程式將會有錯誤!
接下來開啟tools_def.txt這個文字檔,內有各項工具的定義,唯獨少了VS 2010,此時仿照VS 2008的方式為VS 2010定義一組新變數(或者直接修改VS 2008的變數),接下來搜尋到第二個MYTOOLS(約3083行),底下有各架構的定義,找到IA32 definitions,將他底下括號中的變數修改成剛為VS 2010所定義的變數即可。
其餘方法,自己的編譯器已有定義在內的話:
1. build -t VS2005 (直接指定)
2. 修改tools_def.txt中的MYTOOLS對應的變數。
3. 修改target.txt中的TOOL_CHAIN_TAG對應的變數。如:TOOL_CHAIN_TAG = VS2005

修改完成後,繼續回到Visual Studio 命令提示字元 (2010),在C:\EDK2\底下鍵入build執行,接下來就等待建置完成。

完成後,輸入cd Build\NT32\DEBUG_MYTOOLS\IA32後,資料夾底下有secmain.exe,這個就是Shell的模擬環境,長得滿像DOS的,基本操作方式也很相似,fsnt0:底下有一些簡單的Apps可執行,如HelloWorld、Timer...等。