]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/BaseSerialPortLib16550/BaseSerialPortLib16550.c
1) Add PcdSerialDetectCable to MdeModulePkg to enable/disable cable detection if...
[mirror_edk2.git] / MdeModulePkg / Library / BaseSerialPortLib16550 / BaseSerialPortLib16550.c
index 04d8ca194934ead73b66e684dd539f97237ab0c9..a6c990dee6019b410095d2fc071f8db3ec57ae8b 100644 (file)
@@ -38,6 +38,7 @@
 #define   B_UART_LSR_TEMT     BIT6\r
 #define R_UART_MSR            6\r
 #define   B_UART_MSR_CTS      BIT4\r
+#define   B_UART_MSR_DSR      BIT5\r
 \r
 /**\r
   Read an 8-bit 16550 register.  If PcdSerialUseMmio is TRUE, then the value is read from \r
@@ -226,10 +227,35 @@ SerialPortWrite (
     //\r
     for (Index = 0; Index < FifoSize && NumberOfBytes != 0; Index++, NumberOfBytes--, Buffer++) {\r
       if (PcdGetBool (PcdSerialUseHardwareFlowControl)) {\r
-        //\r
-        // Wait for notification from peer to send data\r
-        //\r
-        while ((SerialPortReadRegister (R_UART_MSR) & (B_UART_MSR_CTS)) == 0);\r
+        if (PcdGetBool (PcdSerialDetectCable)) {\r
+          //\r
+          // Wait for both DSR and CTS to be set\r
+          //   DSR is set if a cable is connected.\r
+          //   CTS is set if it is ok to transmit data\r
+          //\r
+          //   DSR  CTS  Description                               Action\r
+          //   ===  ===  ========================================  ========\r
+          //    0    0   No cable connected.                       Wait\r
+          //    0    1   No cable connected.                       Wait\r
+          //    1    0   Cable connected, but not clear to send.   Wait\r
+          //    1    1   Cable connected, and clear to send.       Transmit\r
+          //\r
+          while ((SerialPortReadRegister (R_UART_MSR) & (B_UART_MSR_DSR | B_UART_MSR_CTS)) != (B_UART_MSR_DSR | B_UART_MSR_CTS));\r
+        } else {\r
+          //\r
+          // Wait for both DSR and CTS to be set OR for DSR to be clear.  \r
+          //   DSR is set if a cable is connected.\r
+          //   CTS is set if it is ok to transmit data\r
+          //\r
+          //   DSR  CTS  Description                               Action\r
+          //   ===  ===  ========================================  ========\r
+          //    0    0   No cable connected.                       Transmit\r
+          //    0    1   No cable connected.                       Transmit\r
+          //    1    0   Cable connected, but not clear to send.   Wait\r
+          //    1    1   Cable connected, and clar to send.        Transmit\r
+          //\r
+          while ((SerialPortReadRegister (R_UART_MSR) & (B_UART_MSR_DSR | B_UART_MSR_CTS)) == (B_UART_MSR_DSR));\r
+        }\r
       }\r
       \r
       //\r