commps2.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 1,173 行 · 第 1/2 页
C
1,173 行
KbcEnableKb (MouseDev->IsaIo);
}
return EFI_NOT_READY;
}
State = PS2_PROCESS_PACKET;
break;
case PS2_PROCESS_PACKET:
if (KeyboardEnable) {
KbcEnableKb (MouseDev->IsaIo);
}
//
// Decode the packet
//
RelativeMovementX = Packet[1];
RelativeMovementY = Packet[2];
//
// Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0
// Byte 0 | Y overflow | X overflow | Y sign bit | X sign bit | Always 1 | Middle Btn | Right Btn | Left Btn
// Byte 1 | 8 bit X Movement
// Byte 2 | 8 bit Y Movement
//
// X sign bit + 8 bit X Movement : 9-bit signed twos complement integer that presents the relative displacement of the device in the X direction since the last data transmission.
// Y sign bit + 8 bit Y Movement : Same as X sign bit + 8 bit X Movement.
//
//
// First, Clear X and Y high 8 bits
//
RelativeMovementX = RelativeMovementX & 0xFF;
RelativeMovementY = RelativeMovementY & 0xFF;
//
// Second, if the 9-bit signed twos complement integer is negative, set the high 8 bit 0xff
//
if ((Packet[0] & 0x10) != 0) {
RelativeMovementX = RelativeMovementX | 0xFF00;
}
if ((Packet[0] & 0x20) != 0) {
RelativeMovementY = RelativeMovementY | 0xFF00;
}
RButton = (UINT8) (Packet[0] & 0x2);
LButton = (UINT8) (Packet[0] & 0x1);
//
// Update mouse state
//
MouseDev->State.RelativeMovementX += RelativeMovementX;
MouseDev->State.RelativeMovementY -= RelativeMovementY;
MouseDev->State.RightButton = (UINT8) (RButton ? TRUE : FALSE);
MouseDev->State.LeftButton = (UINT8) (LButton ? TRUE : FALSE);
MouseDev->StateChanged = TRUE;
return EFI_SUCCESS;
}
}
}
EFI_STATUS
PS2MouseRead (
IN EFI_INTERFACE_DEFINITION_FOR_ISA_IO *IsaIo,
OUT VOID *Buffer,
IN OUT UINTN *BufSize,
IN UINTN State
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
IsaIo - GC_TODO: add argument description
Buffer - GC_TODO: add argument description
BufSize - GC_TODO: add argument description
State - GC_TODO: add argument description
Returns:
GC_TODO: add return values
--*/
{
EFI_STATUS Status;
UINTN BytesRead;
UINT8 Data;
Status = EFI_SUCCESS;
BytesRead = 0;
if (State == PS2_READ_BYTE_ONE) {
//
// Check input for mouse
//
Status = CheckForInput (IsaIo);
if (EFI_ERROR (Status)) {
return Status;
}
}
Data = (UINT8) (*BufSize);
while (BytesRead < *BufSize) {
Status = WaitOutputFull (IsaIo, TIMEOUT);
if (EFI_ERROR (Status)) {
break;
}
IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, Buffer);
BytesRead++;
Buffer = (UINT8 *) Buffer + 1;
}
//
// Verify the correct number of bytes read
//
if (BytesRead == 0 || BytesRead != *BufSize) {
Status = EFI_NOT_FOUND;
}
*BufSize = BytesRead;
return Status;
}
//
// 8042 I/O function
//
EFI_STATUS
Out8042Command (
IN EFI_INTERFACE_DEFINITION_FOR_ISA_IO *IsaIo,
IN UINT8 Command
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
IsaIo - GC_TODO: add argument description
Command - GC_TODO: add argument description
Returns:
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
EFI_STATUS Status;
UINT8 Data;
//
// Wait keyboard controller input buffer empty
//
Status = WaitInputEmpty (IsaIo, TIMEOUT);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Send command
//
Data = Command;
IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data);
Status = WaitInputEmpty (IsaIo, TIMEOUT);
if (EFI_ERROR (Status)) {
return Status;
}
return EFI_SUCCESS;
}
EFI_STATUS
Out8042Data (
IN EFI_INTERFACE_DEFINITION_FOR_ISA_IO *IsaIo,
IN UINT8 Data
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
IsaIo - GC_TODO: add argument description
Data - GC_TODO: add argument description
Returns:
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
EFI_STATUS Status;
UINT8 temp;
//
// Wait keyboard controller input buffer empty
//
Status = WaitInputEmpty (IsaIo, TIMEOUT);
if (EFI_ERROR (Status)) {
return Status;
}
temp = Data;
IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, &temp);
Status = WaitInputEmpty (IsaIo, TIMEOUT);
if (EFI_ERROR (Status)) {
return Status;
}
return EFI_SUCCESS;
}
EFI_STATUS
In8042Data (
IN EFI_INTERFACE_DEFINITION_FOR_ISA_IO *IsaIo,
IN OUT UINT8 *Data
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
IsaIo - GC_TODO: add argument description
Data - GC_TODO: add argument description
Returns:
EFI_TIMEOUT - GC_TODO: Add description for return value
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
UINTN Delay;
UINT8 temp;
Delay = TIMEOUT / 50;
do {
IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &temp);
//
// Check keyboard controller status bit 0(output buffer status)
//
if ((temp & KBC_OUTB) == KBC_OUTB) {
break;
}
gBS->Stall (50);
Delay--;
} while (Delay);
if (Delay == 0) {
return EFI_TIMEOUT;
}
IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, Data);
return EFI_SUCCESS;
}
EFI_STATUS
Out8042AuxCommand (
IN EFI_INTERFACE_DEFINITION_FOR_ISA_IO *IsaIo,
IN UINT8 Command,
IN BOOLEAN Resend
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
IsaIo - GC_TODO: add argument description
Command - GC_TODO: add argument description
Resend - GC_TODO: add argument description
Returns:
EFI_SUCCESS - GC_TODO: Add description for return value
EFI_DEVICE_ERROR - GC_TODO: Add description for return value
EFI_DEVICE_ERROR - GC_TODO: Add description for return value
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
EFI_STATUS Status;
UINT8 Data;
//
// Wait keyboard controller input buffer empty
//
Status = WaitInputEmpty (IsaIo, TIMEOUT);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Send write to auxiliary device command
//
Data = WRITE_AUX_DEV;
IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data);
Status = WaitInputEmpty (IsaIo, TIMEOUT);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Send auxiliary device command
//
IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, &Command);
//
// Read return code
//
Status = In8042AuxData (IsaIo, &Data);
if (EFI_ERROR (Status)) {
return Status;
}
if (Data == PS2_ACK) {
//
// Receive mouse acknowledge, command send success
//
return EFI_SUCCESS;
} else if (Resend) {
//
// Resend fail
//
return EFI_DEVICE_ERROR;
} else if (Data == PS2_RESEND) {
//
// Resend command
//
Status = Out8042AuxCommand (IsaIo, Command, TRUE);
if (EFI_ERROR (Status)) {
return Status;
}
} else {
//
// Invalid return code
//
return EFI_DEVICE_ERROR;
}
return EFI_SUCCESS;
}
EFI_STATUS
Out8042AuxData (
IN EFI_INTERFACE_DEFINITION_FOR_ISA_IO *IsaIo,
IN UINT8 Data
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
IsaIo - GC_TODO: add argument description
Data - GC_TODO: add argument description
Returns:
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
EFI_STATUS Status;
UINT8 Temp;
//
// Wait keyboard controller input buffer empty
//
Status = WaitInputEmpty (IsaIo, TIMEOUT);
if (EFI_ERROR (Status)) {
return Status;
}
//
// Send write to auxiliary device command
//
Temp = WRITE_AUX_DEV;
IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Temp);
Status = WaitInputEmpty (IsaIo, TIMEOUT);
if (EFI_ERROR (Status)) {
return Status;
}
Temp = Data;
IsaIo->Io.Write (IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, &Temp);
Status = WaitInputEmpty (IsaIo, TIMEOUT);
if (EFI_ERROR (Status)) {
return Status;
}
return EFI_SUCCESS;
}
EFI_STATUS
In8042AuxData (
IN EFI_INTERFACE_DEFINITION_FOR_ISA_IO *IsaIo,
IN OUT UINT8 *Data
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
IsaIo - GC_TODO: add argument description
Data - GC_TODO: add argument description
Returns:
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
EFI_STATUS Status;
//
// wait for output data
//
Status = WaitOutputFull (IsaIo, BAT_TIMEOUT);
if (EFI_ERROR (Status)) {
return Status;
}
IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_DATA_PORT, 1, Data);
return EFI_SUCCESS;
}
EFI_STATUS
CheckForInput (
IN EFI_INTERFACE_DEFINITION_FOR_ISA_IO *IsaIo
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
IsaIo - GC_TODO: add argument description
Returns:
EFI_NOT_READY - GC_TODO: Add description for return value
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
UINT8 Data;
IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data);
//
// Check keyboard controller status, if it is output buffer full and for auxiliary device
//
if ((Data & (KBC_OUTB | KBC_AUXB)) != (KBC_OUTB | KBC_AUXB)) {
return EFI_NOT_READY;
}
return EFI_SUCCESS;
}
EFI_STATUS
WaitInputEmpty (
IN EFI_INTERFACE_DEFINITION_FOR_ISA_IO *IsaIo,
IN UINTN Timeout
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
IsaIo - GC_TODO: add argument description
Timeout - GC_TODO: add argument description
Returns:
EFI_TIMEOUT - GC_TODO: Add description for return value
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
UINTN Delay;
UINT8 Data;
Delay = Timeout / 50;
do {
IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data);
//
// Check keyboard controller status bit 1(input buffer status)
//
if ((Data & KBC_INPB) == 0) {
break;
}
gBS->Stall (50);
Delay--;
} while (Delay);
if (Delay == 0) {
return EFI_TIMEOUT;
}
return EFI_SUCCESS;
}
EFI_STATUS
WaitOutputFull (
IN EFI_INTERFACE_DEFINITION_FOR_ISA_IO *IsaIo,
IN UINTN Timeout
)
/*++
Routine Description:
GC_TODO: Add function description
Arguments:
IsaIo - GC_TODO: add argument description
Timeout - GC_TODO: add argument description
Returns:
EFI_TIMEOUT - GC_TODO: Add description for return value
EFI_SUCCESS - GC_TODO: Add description for return value
--*/
{
UINTN Delay;
UINT8 Data;
Delay = Timeout / 50;
do {
IsaIo->Io.Read (IsaIo, EfiIsaIoWidthUint8, KBC_CMD_STS_PORT, 1, &Data);
//
// Check keyboard controller status bit 0(output buffer status)
// & bit5(output buffer for auxiliary device)
//
if ((Data & (KBC_OUTB | KBC_AUXB)) == (KBC_OUTB | KBC_AUXB)) {
break;
}
gBS->Stall (50);
Delay--;
} while (Delay);
if (Delay == 0) {
return EFI_TIMEOUT;
}
return EFI_SUCCESS;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?