+\r
+\r
+/**\r
+ Return the count of scancode in the queue.\r
+ \r
+ @param Queue Pointer to instance of SCAN_CODE_QUEUE.\r
+\r
+ @return Count of the scancode.\r
+**/\r
+UINTN\r
+GetScancodeBufCount (\r
+ IN SCAN_CODE_QUEUE *Queue\r
+ )\r
+{\r
+ if (Queue->Head <= Queue->Tail) {\r
+ return Queue->Tail - Queue->Head;\r
+ } else {\r
+ return Queue->Tail + KEYBOARD_SCAN_CODE_MAX_COUNT - Queue->Head;\r
+ }\r
+}\r
+\r
+/**\r
+ Read several bytes from the scancode buffer without removing them.\r
+ This function is called to see if there are enough bytes of scancode\r
+ representing a single key.\r
+ \r
+ @param Queue Pointer to instance of SCAN_CODE_QUEUE.\r
+ @param Count Number of bytes to be read\r
+ @param Buf Store the results\r
+\r
+ @retval EFI_SUCCESS success to scan the keyboard code\r
+ @retval EFI_NOT_READY invalid parameter\r
+**/\r
+EFI_STATUS\r
+GetScancodeBufHead (\r
+ IN SCAN_CODE_QUEUE *Queue,\r
+ IN UINTN Count,\r
+ OUT UINT8 *Buf\r
+ )\r
+{\r
+ UINTN Index;\r
+ UINTN Pos;\r
+\r
+ //\r
+ // check the valid range of parameter 'Count'\r
+ //\r
+ if (GetScancodeBufCount (Queue) < Count) {\r
+ return EFI_NOT_READY;\r
+ }\r
+ //\r
+ // retrieve the values\r
+ //\r
+ for (Index = 0, Pos = Queue->Head; Index < Count; Index++, Pos = (Pos + 1) % KEYBOARD_SCAN_CODE_MAX_COUNT) {\r
+ Buf[Index] = Queue->Buffer[Pos];\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Push one byte to the scancode buffer.\r
+\r
+ @param Queue Pointer to instance of SCAN_CODE_QUEUE.\r
+ @param Scancode The byte to push.\r
+**/\r
+VOID\r
+PushScancodeBufTail (\r
+ IN SCAN_CODE_QUEUE *Queue,\r
+ IN UINT8 Scancode\r
+ )\r
+{\r
+ if (GetScancodeBufCount (Queue) == KEYBOARD_SCAN_CODE_MAX_COUNT - 1) {\r
+ return;\r
+ }\r
+\r
+ Queue->Buffer[Queue->Tail] = Scancode;\r
+ Queue->Tail = (Queue->Tail + 1) % KEYBOARD_SCAN_CODE_MAX_COUNT;\r
+}\r
+\r
+/**\r
+\r
+ Read & remove several bytes from the scancode buffer.\r
+ This function is usually called after GetScancodeBufHead()\r
+ \r
+ @param Queue Pointer to instance of SCAN_CODE_QUEUE.\r
+ @param Count Number of bytes to be read\r
+ @param Buf Store the results\r
+\r
+ @retval EFI_SUCCESS success to scan the keyboard code\r
+ @retval EFI_NOT_READY invalid parameter\r
+**/\r
+EFI_STATUS\r
+PopScancodeBufHead (\r
+ IN SCAN_CODE_QUEUE *Queue,\r
+ IN UINTN Count,\r
+ OUT UINT8 *Buf\r
+ )\r
+{\r
+ UINTN Index;\r
+\r
+ //\r
+ // Check the valid range of parameter 'Count'\r
+ //\r
+ if (GetScancodeBufCount (Queue) < Count) {\r
+ return EFI_NOT_READY;\r
+ }\r
+ //\r
+ // Retrieve and remove the values\r
+ //\r
+ for (Index = 0; Index < Count; Index++, Queue->Head = (Queue->Head + 1) % KEYBOARD_SCAN_CODE_MAX_COUNT) {\r
+ Buf[Index] = Queue->Buffer[Queue->Head];\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r