最近看代码,发现比较有意思的地方,在 Keyboard.c 中有处理 USB键盘 Ctrl+Alt+Del的代码。
// // When encountering Ctrl + Alt + Del, then warm reset. // if (KeyDescriptor->Modifier == EFI_DELETE_MODIFIER) { if ((UsbKeyboardDevice->CtrlOn) && (UsbKeyboardDevice->AltOn)) { gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL); } }
修改一下即可实现在 Shell下按下 Ctrl+Alt+Del输出一段字符,暂停5s然后重启的功能。
// // When encountering Ctrl + Alt + Del, then warm reset. // if (KeyDescriptor->Modifier == EFI_DELETE_MODIFIER) { if ((UsbKeyboardDevice->CtrlOn) && (UsbKeyboardDevice->AltOn)) { //LABZDebug_Start gST->ConOut->OutputString(gST->ConOut,L"www.lab-z.com"); gBS->Stall(5000000UL); // LABZDebug _End gRT->ResetSystem (EfiResetWarm, EFI_SUCCESS, 0, NULL); } }
再阅读代码,上面的代码在USBParseKey 函数中。这个函数实现的是解析 USB键盘的功能。函数调用者是EfiKey.c 中的
/** Timer handler to convert the key from USB. @param Event Indicates the event that invoke this function. @param Context Indicates the calling context. **/ VOID EFIAPI USBKeyboardTimerHandler ( IN EFI_EVENT Event, IN VOID *Context )
从名称上看,这是一个时间中断来调用的函数。具体的安装代码如下:
Status = gBS->CreateEvent ( EVT_TIMER | EVT_NOTIFY_SIGNAL, TPL_NOTIFY, USBKeyboardTimerHandler, UsbKeyboardDevice, &UsbKeyboardDevice->TimerEvent );
就是说USB键盘是通过时间中断来进行检查和处理的.