//&>>&4 0 4 0 mmm_KeyBoard::mmm_KeyBoard(){ struct termios t2; int r; r=tcgetattr(con_fd,&t1); if(r<0) {printf("E3 %d\n",r);exit(1);} r=tcgetattr(con_fd,&t2); if(r<0) {printf("E4 %d\n",r);exit(1);} t2.c_iflag=0; t2.c_lflag&=~(ECHO|ICANON|ISIG); t2.c_cc[VMIN]=1; t2.c_cc[VTIME]=0x10; r=tcsetattr(con_fd,TCSANOW,&t2); if(r<0) {printf("E5 %d\n",r);exit(1);} r=ioctl(con_fd,KDGKBMODE,&om); if(r<0) {printf("E1 %d\n",r);} r=ioctl(con_fd,KDSKBMODE,K_RAW); if(r<0) {printf("E2 %d\n",r);} /////////// ed_keyget=mykeyget; signal(SIGALRM,falarm); alarm(1); signal(SIGSEGV,SegmentViolationHandler); signal(SIGKILL ,SegmentViolationHandler ); signal(SIGQUIT ,SegmentViolationHandler ); signal(SIGTERM ,SegmentViolationHandler ); InitKeyboardLayout(); AltCase=InitDefaultAltCase(); }
/** Starts the keyboard device with this driver. This function produces Simple Text Input Protocol and Simple Text Input Ex Protocol, initializes the keyboard device, and submit Asynchronous Interrupt Transfer to manage this keyboard device. @param This The USB keyboard driver binding instance. @param Controller Handle of device to bind driver to. @param RemainingDevicePath Optional parameter use to pick a specific child device to start. @retval EFI_SUCCESS The controller is controlled by the usb keyboard driver. @retval EFI_UNSUPPORTED No interrupt endpoint can be found. @retval Other This controller cannot be started. **/ EFI_STATUS EFIAPI USBKeyboardDriverBindingStart ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ) { EFI_STATUS Status; EFI_USB_IO_PROTOCOL *UsbIo; USB_KB_DEV *UsbKeyboardDevice; UINT8 EndpointNumber; EFI_USB_ENDPOINT_DESCRIPTOR EndpointDescriptor; UINT8 Index; UINT8 EndpointAddr; UINT8 PollingInterval; UINT8 PacketSize; BOOLEAN Found; EFI_TPL OldTpl; OldTpl = gBS->RaiseTPL (TPL_CALLBACK); // // Open USB I/O Protocol // Status = gBS->OpenProtocol ( Controller, &gEfiUsbIoProtocolGuid, (VOID **) &UsbIo, This->DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_BY_DRIVER ); if (EFI_ERROR (Status)) { goto ErrorExit1; } UsbKeyboardDevice = AllocateZeroPool (sizeof (USB_KB_DEV)); ASSERT (UsbKeyboardDevice != NULL); // // Get the Device Path Protocol on Controller's handle // Status = gBS->OpenProtocol ( Controller, &gEfiDevicePathProtocolGuid, (VOID **) &UsbKeyboardDevice->DevicePath, This->DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_GET_PROTOCOL ); if (EFI_ERROR (Status)) { goto ErrorExit; } // // Report that the USB keyboard is being enabled // REPORT_STATUS_CODE_WITH_DEVICE_PATH ( EFI_PROGRESS_CODE, (EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_ENABLE), UsbKeyboardDevice->DevicePath ); // // This is pretty close to keyboard detection, so log progress // REPORT_STATUS_CODE_WITH_DEVICE_PATH ( EFI_PROGRESS_CODE, (EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_PRESENCE_DETECT), UsbKeyboardDevice->DevicePath ); UsbKeyboardDevice->UsbIo = UsbIo; // // Get interface & endpoint descriptor // UsbIo->UsbGetInterfaceDescriptor ( UsbIo, &UsbKeyboardDevice->InterfaceDescriptor ); EndpointNumber = UsbKeyboardDevice->InterfaceDescriptor.NumEndpoints; // // Traverse endpoints to find interrupt endpoint // Found = FALSE; for (Index = 0; Index < EndpointNumber; Index++) { UsbIo->UsbGetEndpointDescriptor ( UsbIo, Index, &EndpointDescriptor ); if ((EndpointDescriptor.Attributes & (BIT0 | BIT1)) == USB_ENDPOINT_INTERRUPT) { // // We only care interrupt endpoint here // CopyMem(&UsbKeyboardDevice->IntEndpointDescriptor, &EndpointDescriptor, sizeof(EndpointDescriptor)); Found = TRUE; break; } } if (!Found) { // // No interrupt endpoint found, then return unsupported. // Status = EFI_UNSUPPORTED; goto ErrorExit; } UsbKeyboardDevice->Signature = USB_KB_DEV_SIGNATURE; UsbKeyboardDevice->SimpleInput.Reset = USBKeyboardReset; UsbKeyboardDevice->SimpleInput.ReadKeyStroke = USBKeyboardReadKeyStroke; UsbKeyboardDevice->SimpleInputEx.Reset = USBKeyboardResetEx; UsbKeyboardDevice->SimpleInputEx.ReadKeyStrokeEx = USBKeyboardReadKeyStrokeEx; UsbKeyboardDevice->SimpleInputEx.SetState = USBKeyboardSetState; UsbKeyboardDevice->SimpleInputEx.RegisterKeyNotify = USBKeyboardRegisterKeyNotify; UsbKeyboardDevice->SimpleInputEx.UnregisterKeyNotify = USBKeyboardUnregisterKeyNotify; InitializeListHead (&UsbKeyboardDevice->NotifyList); Status = gBS->CreateEvent ( EVT_TIMER | EVT_NOTIFY_SIGNAL, TPL_NOTIFY, USBKeyboardTimerHandler, UsbKeyboardDevice, &UsbKeyboardDevice->TimerEvent ); if (!EFI_ERROR (Status)) { Status = gBS->SetTimer (UsbKeyboardDevice->TimerEvent, TimerPeriodic, KEYBOARD_TIMER_INTERVAL); } if (EFI_ERROR (Status)) { goto ErrorExit; } Status = gBS->CreateEvent ( EVT_NOTIFY_WAIT, TPL_NOTIFY, USBKeyboardWaitForKey, UsbKeyboardDevice, &(UsbKeyboardDevice->SimpleInputEx.WaitForKeyEx) ); if (EFI_ERROR (Status)) { goto ErrorExit; } Status = gBS->CreateEvent ( EVT_NOTIFY_WAIT, TPL_NOTIFY, USBKeyboardWaitForKey, UsbKeyboardDevice, &(UsbKeyboardDevice->SimpleInput.WaitForKey) ); if (EFI_ERROR (Status)) { goto ErrorExit; } // // Install Simple Text Input Protocol and Simple Text Input Ex Protocol // for the USB keyboard device. // USB keyboard is a hot plug device, and expected to work immediately // when plugging into system, other conventional console devices could // distinguish it by its device path. // Status = gBS->InstallMultipleProtocolInterfaces ( &Controller, &gEfiSimpleTextInProtocolGuid, &UsbKeyboardDevice->SimpleInput, &gEfiSimpleTextInputExProtocolGuid, &UsbKeyboardDevice->SimpleInputEx, NULL ); if (EFI_ERROR (Status)) { goto ErrorExit; } UsbKeyboardDevice->ControllerHandle = Controller; Status = InitKeyboardLayout (UsbKeyboardDevice); if (EFI_ERROR (Status)) { gBS->UninstallMultipleProtocolInterfaces ( Controller, &gEfiSimpleTextInProtocolGuid, &UsbKeyboardDevice->SimpleInput, &gEfiSimpleTextInputExProtocolGuid, &UsbKeyboardDevice->SimpleInputEx, NULL ); goto ErrorExit; } // // Reset USB Keyboard Device exhaustively. // Status = UsbKeyboardDevice->SimpleInputEx.Reset ( &UsbKeyboardDevice->SimpleInputEx, TRUE ); if (EFI_ERROR (Status)) { gBS->UninstallMultipleProtocolInterfaces ( Controller, &gEfiSimpleTextInProtocolGuid, &UsbKeyboardDevice->SimpleInput, &gEfiSimpleTextInputExProtocolGuid, &UsbKeyboardDevice->SimpleInputEx, NULL ); goto ErrorExit; } // // Submit Asynchronous Interrupt Transfer to manage this device. // EndpointAddr = UsbKeyboardDevice->IntEndpointDescriptor.EndpointAddress; PollingInterval = UsbKeyboardDevice->IntEndpointDescriptor.Interval; PacketSize = (UINT8) (UsbKeyboardDevice->IntEndpointDescriptor.MaxPacketSize); Status = UsbIo->UsbAsyncInterruptTransfer ( UsbIo, EndpointAddr, TRUE, PollingInterval, PacketSize, KeyboardHandler, UsbKeyboardDevice ); if (EFI_ERROR (Status)) { gBS->UninstallMultipleProtocolInterfaces ( Controller, &gEfiSimpleTextInProtocolGuid, &UsbKeyboardDevice->SimpleInput, &gEfiSimpleTextInputExProtocolGuid, &UsbKeyboardDevice->SimpleInputEx, NULL ); goto ErrorExit; } UsbKeyboardDevice->ControllerNameTable = NULL; AddUnicodeString2 ( "eng", gUsbKeyboardComponentName.SupportedLanguages, &UsbKeyboardDevice->ControllerNameTable, L"Generic Usb Keyboard", TRUE ); AddUnicodeString2 ( "en", gUsbKeyboardComponentName2.SupportedLanguages, &UsbKeyboardDevice->ControllerNameTable, L"Generic Usb Keyboard", FALSE ); gBS->RestoreTPL (OldTpl); return EFI_SUCCESS; // // Error handler // ErrorExit: if (UsbKeyboardDevice != NULL) { if (UsbKeyboardDevice->TimerEvent != NULL) { gBS->CloseEvent (UsbKeyboardDevice->TimerEvent); } if (UsbKeyboardDevice->SimpleInput.WaitForKey != NULL) { gBS->CloseEvent (UsbKeyboardDevice->SimpleInput.WaitForKey); } if (UsbKeyboardDevice->SimpleInputEx.WaitForKeyEx != NULL) { gBS->CloseEvent (UsbKeyboardDevice->SimpleInputEx.WaitForKeyEx); } if (UsbKeyboardDevice->KeyboardLayoutEvent != NULL) { ReleaseKeyboardLayoutResources (UsbKeyboardDevice); gBS->CloseEvent (UsbKeyboardDevice->KeyboardLayoutEvent); } FreePool (UsbKeyboardDevice); UsbKeyboardDevice = NULL; } gBS->CloseProtocol ( Controller, &gEfiUsbIoProtocolGuid, This->DriverBindingHandle, Controller ); ErrorExit1: gBS->RestoreTPL (OldTpl); return Status; }