ReactOS  0.4.14-dev-49-gfb4591c
legacy.c
Go to the documentation of this file.
1 /*
2  * COPYRIGHT: See COPYING in the top level directory
3  * PROJECT: Serial port driver
4  * FILE: drivers/bus/serial/legacy.c
5  * PURPOSE: Legacy serial port enumeration
6  *
7  * PROGRAMMERS: Hervé Poussineau (hpoussin@reactos.org)
8  * Mark Junker (mjscod@gmx.de)
9  */
10 
11 #include "serial.h"
12 
13 #include <debug.h>
14 
18 {
19  UCHAR Lcr, TestLcr;
20  UCHAR OldScr, Scr5A, ScrA5;
21  BOOLEAN FifoEnabled;
22  UCHAR NewFifoStatus;
23 
25  WRITE_PORT_UCHAR(SER_LCR(BaseAddress), Lcr ^ 0xFF);
26  TestLcr = READ_PORT_UCHAR(SER_LCR(BaseAddress)) ^ 0xFF;
28 
29  /* Accessing the LCR must work for a usable serial port */
30  if (TestLcr != Lcr)
31  return UartUnknown;
32 
33  /* Ensure that all following accesses are done as required */
42 
43  /* Test scratch pad */
50 
51  /* When non-functional, we have a 8250 */
52  if (Scr5A != 0x5A || ScrA5 != 0xA5)
53  return Uart8250;
54 
55  /* Test FIFO type */
56  FifoEnabled = (READ_PORT_UCHAR(SER_IIR(BaseAddress)) & 0x80) != 0;
58  NewFifoStatus = READ_PORT_UCHAR(SER_IIR(BaseAddress)) & 0xC0;
59  if (!FifoEnabled)
61  switch (NewFifoStatus)
62  {
63  case 0x00:
64  return Uart16450;
65  case 0x40:
66  case 0x80:
67  /* Not sure about this but the documentation says that 0x40
68  * indicates an unusable FIFO but my tests only worked
69  * with 0x80 */
70  return Uart16550;
71  }
72 
73  /* FIFO is only functional for 16550A+ */
74  return Uart16550A;
75 }
#define IN
Definition: typedefs.h:38
#define SER_FCR(x)
Definition: serial.h:127
#define SER_RBR(x)
Definition: serial.h:109
unsigned char * PUCHAR
Definition: retypes.h:3
UCHAR NTAPI READ_PORT_UCHAR(PUCHAR Address)
Definition: mach.c:528
#define SER_LCR(x)
Definition: serial.h:135
#define SER_MSR(x)
Definition: serial.h:161
unsigned char BOOLEAN
_In_ HANDLE _Outptr_result_bytebuffer_ ViewSize PVOID * BaseAddress
Definition: mmfuncs.h:404
#define SER_IIR(x)
Definition: serial.h:120
#define SR_FCR_ENABLE_FIFO
Definition: serial.h:128
unsigned char UCHAR
Definition: xmlstorage.h:181
#define SER_SCR(x)
Definition: serial.h:170
UART_TYPE
Definition: serial.h:29
#define SER_LSR(x)
Definition: serial.h:152
#define SER_MCR(x)
Definition: serial.h:149
UART_TYPE SerialDetectUartType(IN PUCHAR BaseAddress)
Definition: legacy.c:16
#define SER_IER(x)
Definition: serial.h:112
void WRITE_PORT_UCHAR(PUCHAR Address, UCHAR Value)
Definition: mach.c:532