小華的部落格: EFI Protocol 觀念小筆記

搜尋此網誌

網頁

星期二, 5月 29, 2007

EFI Protocol 觀念小筆記

C語言的宣告與定義:
1.C語言中只允許變數或函數的定義出現一次。
由於變數只有定義規則,沒有宣告規則,所以當你鍵入int a;時,代表此變數已經被定義了。我們如何宣告一個變數呢? 加上extern 變成exern int a;,告訴comipler,此變數a只是一個宣告,它的定義在別處。

2. C語言函數規則分成宣告與定義二種。當一個函數只有傳回值、名稱、傳入值, 沒有大括號{},compiler會把此種形式當成是函數宣告;如果加上了{}, 形成函數定義。所以你要宣告一個函數,只須鍵入int f(); compiler會自動把它示為函數宣告。

// EFI Protocol
------------------
EFI Protocol 可以看作是一個介面(Interface),透過這個Interface 去存取Data 或是函數,簡單說就是一個指標,指標指向的記憶體可能是Data,也可能是函數。

安裝一個 EFI Protocol 後會以 (GUID | Pointer) 的欄位格式存放在Handle DataBase中,然後就可以在其他地方利用LocateProtcol()方式去得到指標,然後使用他。

1.Data 型式的EFI Protocol
(a)宣告你的Sturcture與GUID在你的Protocol.h 與Protocol.c中
EFI_GUID gGuid=MY_GUID;
Extern gGuid;
typedef struct {
...
UINT8 Array[10];
...
} MY_PROTOCOL;

(b)在DXE Driver中使用使用MY_PROTOCOL "定義"一個變數Test
UINT16 i;
MY_PROTOCOL Test={......};

然後在呼叫InstallProtocol(&gGuid,&Test)去安裝一個Protocol到Handle Database,所以Handle Database中的Guid=gGuid,而指標Pointer=&Test。

2.Function 型式的EFI Protocol也是跟Data型式一樣作法,不同的地方在於宣告的是函數原型。

所以觀念在於如何去宣告Protocol與如何透過GUID+Pointer去做你要做的事情。

5 則留言:

aaa 提到...

Harrison 你好
我看到你的文章中有提到一篇
關於linux進入保護模式的文章

未post的A20與隱含暫存器的很多東西
請問你是否可以寄給我
我現在急著要看
非常緊急
my email:tatungtatung.tw@yahoo.com.tw

匿名 提到...

請問大大知道 在Driver Binding OpenProtocol 時所用ㄉ EFI_OPEN_PROTOCOL_BY_DRIVER ㄇ?
還有Binding ㄉ 順序是按照??來決定

Status = gBS->OpenProtocol (
Controller,
&gEfiUsbKbProtocolGuid,
NULL,
This->DriverBindingHandle,
Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER
);

匿名 提到...

EFI_OPEN_PROTOCOL_BY_DRIVER
是在OpenProtocol裡面當作參數使用.
EFI_OPEN_PROTOCOL_BY_DRIVER 是當屬性使用,定義為
#define EFI_OPEN_PROTOCOL_BY_DRIVER 0x00000010
尋找Driver用
也就是
在已經Binding的gEfiUsbKbProtocolGuid的protocol type define支援的範圍內尋找合適的USB KB Driver
至於Binding的順序就要看你怎麼寫了?
小小意見希望有幫助!如有謬誤請指正!Thx!
參考資料EFI SPEC
by廢人

Amin 提到...

有辦法知道哪些要用 EFI_OPEN_PROTOCOL_BY_DRIVER
哪些用
EFI_OPEN_PROTOCOL_GET_PROTOCOL

Amin 提到...

有辦法知道哪些要用 EFI_OPEN_PROTOCOL_BY_DRIVER
哪些用
EFI_OPEN_PROTOCOL_GET_PROTOCOL