This introduce how to install protocol, protocol event.
Install protocol,
there must be protocol structure and member function prototype defined.
import EfiPy2 as EfiPy
#
# Protocol Structure
#
class TEST_PROTOCOL (EfiPy.Structure):
_fields_ = [("P1Func1", PROTOCOL_FUNC1),
("P1Val", EfiPy.UINT32),
("P1Func2", PROTOCOL_FUNC2)
]
#
# Building protocol object
#
P1 = PROTOCOL_FUNC1 (ProtocolFunc1)
P2 = PROTOCOL_FUNC2 (ProtocolFunc2)
TestProtocol1 = TEST_PROTOCOL (P1, 3, P2)
#
# InstallProtocolInterface
#
Status = EfiPy.gBS.InstallProtocolInterface (
EfiPy.byref (Handle1),
EfiPy.byref (TestGuid1),
EfiPy.EFI_NATIVE_INTERFACE,
EfiPy.byref (TestProtocol1)
)
Protocol event, as same as EDK II, CreateEvent() and RegisterProtocolNotify() are used.
#
# Protocl event variable
#
def ProtocolRegisterFunc (Event, Context):
print " Protocl Register notification call back."
Event = EfiPy.EFI_EVENT ()
tFunc = EfiPy.EFI_EVENT_NOTIFY(ProtocolRegisterFunc)
gContext = EfiPy.UINTN (1024)
Status = EfiPy.gBS.CreateEvent (
EfiPy.EVT_NOTIFY_SIGNAL,
EfiPy.TPL_NOTIFY,
tFunc,
EfiPy.PVOID.from_address (EfiPy.addressof(gContext)),
EfiPy.byref (Event)
)
#
# RegisterProtocolNotify
#
Registration = EfiPy.PVOID()
Status = EfiPy.gBS.RegisterProtocolNotify (
EfiPy.byref (TestGuid1),
Event,
EfiPy.byref(Registration)
)
screenshot
Sample code is EfiPy2ProtocolSample2.py at Github.
# Protocol Structure
#
class TEST_PROTOCOL (EfiPy.Structure):
_fields_ = [("P1Func1", PROTOCOL_FUNC1),
("P1Val", EfiPy.UINT32),
("P1Func2", PROTOCOL_FUNC2)
]
#
# Building protocol object
#
P1 = PROTOCOL_FUNC1 (ProtocolFunc1)
P2 = PROTOCOL_FUNC2 (ProtocolFunc2)
TestProtocol1 = TEST_PROTOCOL (P1, 3, P2)
#
# InstallProtocolInterface
#
Status = EfiPy.gBS.InstallProtocolInterface (
EfiPy.byref (Handle1),
EfiPy.byref (TestGuid1),
EfiPy.EFI_NATIVE_INTERFACE,
EfiPy.byref (TestProtocol1)
)
#
# Protocl event variable
#
def ProtocolRegisterFunc (Event, Context):
print " Protocl Register notification call back."
Event = EfiPy.EFI_EVENT ()
tFunc = EfiPy.EFI_EVENT_NOTIFY(ProtocolRegisterFunc)
gContext = EfiPy.UINTN (1024)
Status = EfiPy.gBS.CreateEvent (
EfiPy.EVT_NOTIFY_SIGNAL,
EfiPy.TPL_NOTIFY,
tFunc,
EfiPy.PVOID.from_address (EfiPy.addressof(gContext)),
EfiPy.byref (Event)
)
#
# RegisterProtocolNotify
#
Registration = EfiPy.PVOID()
Status = EfiPy.gBS.RegisterProtocolNotify (
EfiPy.byref (TestGuid1),
Event,
EfiPy.byref(Registration)
)
screenshot
Sample code is EfiPy2ProtocolSample2.py at Github.
No comments:
Post a Comment