#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
//\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