Esempio n. 1
0
NTSTATUS
NTAPI
CpInitialize(IN PCPPORT Port,
             IN PUCHAR  Address,
             IN ULONG   BaudRate)
{
    /* Validity checks */
    if (Port == NULL || Address == NULL || BaudRate == 0)
        return STATUS_INVALID_PARAMETER;

    if (!CpDoesPortExist(Address))
        return STATUS_NOT_FOUND;

    /* Initialize port data */
    Port->Address  = Address;
    Port->BaudRate = 0;
    Port->Flags    = 0;

    /* Disable the interrupts */
    WRITE_PORT_UCHAR(Address + LINE_CONTROL_REGISTER, 0);
    WRITE_PORT_UCHAR(Address + INTERRUPT_ENABLE_REGISTER, 0);

    /* Turn on DTR, RTS and OUT2 */
    WRITE_PORT_UCHAR(Address + MODEM_CONTROL_REGISTER,
                     SERIAL_MCR_DTR | SERIAL_MCR_RTS | SERIAL_MCR_OUT2);

    /* Set the baud rate */
    CpSetBaud(Port, BaudRate);

    /* Set 8 data bits, 1 stop bit, no parity, no break */
    WRITE_PORT_UCHAR(Port->Address + LINE_CONTROL_REGISTER,
                     SERIAL_8_DATA | SERIAL_1_STOP | SERIAL_NONE_PARITY);

    /* Turn on FIFO */
    // TODO: Check whether FIFO exists and turn it on in that case.
    CpEnableFifo(Address, TRUE); // for 16550

    /* Read junk out of the RBR */
    (VOID)READ_PORT_UCHAR(Address + RECEIVE_BUFFER_REGISTER);

    return STATUS_SUCCESS;
}
Esempio n. 2
0
BOOLEAN
WinLdrPortInitialize(IN ULONG BaudRate,
    				 IN ULONG PortNumber,
    				 IN PUCHAR PortAddress,
					 IN BOOLEAN TerminalConnected,
    				 OUT PULONG PortId)
{
	/* Set default baud rate */
    if (BaudRate == 0) BaudRate = 19200;

	/* Check if port or address given */
	if (PortNumber)
	{
		/* Pick correct address for port */
	   if (!PortAddress)
		{
            switch (PortNumber)
			{
          	  	case 1:
	                PortAddress = (PUCHAR)0x3F8;
	                break;

	            case 2:
	                PortAddress = (PUCHAR)0x2F8;
	                break;

	            case 3:
	                PortAddress = (PUCHAR)0x3E8;
	                break;

	            default:
	                PortNumber = 4;
	                PortAddress = (PUCHAR)0x2E8;
            }
        }
    }
	else
	{   
		/* Pick correct port for address */
		PortAddress = (PUCHAR)0x2F8;
		if (CpDoesPortExist(PortAddress))
		{
            PortNumber = 2;
        }
		else
		{
			PortAddress = (PUCHAR)0x3F8;
			if (!CpDoesPortExist(PortAddress)) return FALSE;
            PortNumber = 1;
 		}
	}
	
	/* Not yet supported */
	ASSERT(LoaderRedirectionInformation.IsMMIODevice == FALSE);

	/* Check if port exists */
    if ((CpDoesPortExist(PortAddress)) || (CpDoesPortExist(PortAddress)))
	{
		/* Initialize port for first time, or re-initialize if specified */
		if (((TerminalConnected) && (Port[PortNumber - 1].Address)) ||
			!(Port[PortNumber - 1].Address))
		{
			/* Initialize the port, return it */
    		CpInitialize(&Port[PortNumber - 1], PortAddress, BaudRate);
    		*PortId = PortNumber - 1;
    		return TRUE;
		}
	}
	
	return FALSE;
}
Esempio n. 3
0
//
// initialize port
//
BOOLEAN BlPortInitialize(__in ULONG Baudrate,__in ULONG PortNum,__in ULONG PortAddr,__in BOOLEAN ReInitialize,__out PULONG DeviceId)
{
	//
	// set default baudrate if caller did not give us
	//
	if(!Baudrate)
		Baudrate										= 19200;

	//
	// setup function pointers
	//
	if(LoaderRedirectionInfo.MemorySpace)
	{
		READ_UCHAR										= &READ_REGISTER_UCHAR;
		WRITE_UCHAR										= &WRITE_REGISTER_UCHAR;
	}
	else
	{

		READ_UCHAR										= &READ_PORT_UCHAR;
		WRITE_UCHAR										= &WRITE_PORT_UCHAR;
	}

	if(!PortNum)
	{
		//
		// try COM1,COM2 with default value
		//
		PortAddr										= 0x3f8;
		PortNum											= 2;
		if(CpDoesPortExist(reinterpret_cast<PUCHAR>(0x2f8)))
			PortAddr									= 0x2f8;
		else if(CpDoesPortExist(reinterpret_cast<PUCHAR>(0x3f8)))
			PortNum										= 3;
		else
			return FALSE;
	}
	else if(!PortAddr)
	{
		switch(PortNum)
		{
		case 1:
			PortAddr									= 0x3f8;
			break;

		case 2:
			PortAddr									= 0x2f8;
			break;

		case 3:
			PortAddr									= 0x3e8;
			break;

		default:
			PortAddr									= 0x2e8;
			PortNum										= 4;
			break;
		}
	}

	PUCHAR BaseAddress									= 0;
	if(LoaderRedirectionInfo.MemorySpace)
	{
		//
		// map registers
		//
		PHYSICAL_ADDRESS Address;
		Address.QuadPart								= PortAddr;
		BaseAddress										= static_cast<PUCHAR>(MmMapIoSpace(Address,7,MmNonCached));
	}
	else
	{
		BaseAddress										= reinterpret_cast<PUCHAR>(PortAddr);
	}


	//
	// if base address is a memory mapped register,WHY?
	//
	if(!CpDoesPortExist(BaseAddress) && !LoaderRedirectionInfo.MemorySpace)
		return FALSE;

	//
	// for reinitialize request,port object's base address must not be zero
	// otherwise port object's base address must be zero
	//
	if(ReInitialize == !Port[PortNum - 1].Address)
		return FALSE;

	CpInitialize(Port + PortNum - 1,BaseAddress,Baudrate);

	//
	// device id is port number - 1
	//
	*DeviceId											= PortNum - 1;

	return TRUE;
}
Esempio n. 4
0
BOOLEAN
NTAPI
KdPortInitializeEx(
    IN PCPPORT PortInformation,
    IN ULONG ComPortNumber)
{
    NTSTATUS Status;
    CHAR buffer[80];

#if 0 // Deactivated because never used in fact (was in KdPortInitialize but we use KdPortInitializeEx)
    /*
     * Find the port if needed
     */
    SIZE_T i;

    if (!PortInitialized)
    {
        DefaultPort.BaudRate = PortInformation->BaudRate;

        if (ComPortNumber == 0)
        {
            /*
             * Start enumerating COM ports from the last one to the first one,
             * and break when we find a valid port.
             * If we reach the first element of the list, the invalid COM port,
             * then it means that no valid port was found.
             */
            for (i = sizeof(BaseArray) / sizeof(BaseArray[0]) - 1; i > 0; i--)
            {
                if (CpDoesPortExist(UlongToPtr(BaseArray[i])))
                {
                    PortInformation->Address = DefaultPort.Address = BaseArray[i];
                    ComPortNumber = (ULONG)i;
                    break;
                }
            }
            if (ComPortNumber == 0)
            {
                sprintf(buffer,
                        "\nKernel Debugger: No COM port found!\n\n");
                HalDisplayString(buffer);
                return FALSE;
            }
        }

        PortInitialized = TRUE;
    }
#endif

    /*
     * Initialize the port
     */
    Status = CpInitialize(PortInformation,
                          (ComPortNumber == 0 ? PortInformation->Address
                                              : UlongToPtr(BaseArray[ComPortNumber])),
                          (PortInformation->BaudRate == 0 ? DEFAULT_BAUD_RATE
                                                          : PortInformation->BaudRate));
    if (!NT_SUCCESS(Status))
    {
        sprintf(buffer,
                "\nKernel Debugger: Serial port not found!\n\n");
        HalDisplayString(buffer);
        return FALSE;
    }
    else
    {
#ifndef NDEBUG
        /* Print message to blue screen */
        sprintf(buffer,
                "\nKernel Debugger: Serial port found: COM%ld (Port 0x%lx) BaudRate %ld\n\n",
                ComPortNumber,
                PortInformation->Address,
                PortInformation->BaudRate);
        HalDisplayString(buffer);
#endif /* NDEBUG */

#if 0
        /* Set global info */
        KdComPortInUse = DefaultPort.Address;
#endif
        return TRUE;
    }
}
Esempio n. 5
0
BOOLEAN
NTAPI
InbvPortInitialize(IN  ULONG   BaudRate,
                   IN  ULONG   PortNumber,
                   IN  PUCHAR  PortAddress,
                   OUT PULONG  PortId,
                   IN  BOOLEAN IsMMIODevice)
{
    /* Not yet supported */
    ASSERT(IsMMIODevice == FALSE);

    /* Set default baud rate */
    if (BaudRate == 0) BaudRate = 19200;

    /* Check if port or address given */
    if (PortNumber)
    {
        /* Pick correct address for port */
        if (!PortAddress)
        {
            switch (PortNumber)
            {
                case 1:
                    PortAddress = (PUCHAR)0x3F8;
                    break;

                case 2:
                    PortAddress = (PUCHAR)0x2F8;
                    break;

                case 3:
                    PortAddress = (PUCHAR)0x3E8;
                    break;

                default:
                    PortNumber = 4;
                    PortAddress = (PUCHAR)0x2E8;
            }
        }
    }
    else
    {
        /* Pick correct port for address */
        PortAddress = (PUCHAR)0x2F8;
        if (CpDoesPortExist(PortAddress))
        {
            PortNumber = 2;
        }
        else
        {
            PortAddress = (PUCHAR)0x3F8;
            if (!CpDoesPortExist(PortAddress)) return FALSE;
            PortNumber = 1;
        }
    }

    /* Initialize the port unless it's already up, and then return it */
    if (Port[PortNumber - 1].Address) return FALSE;

    CpInitialize(&Port[PortNumber - 1], PortAddress, BaudRate);
    *PortId = PortNumber - 1;

    return TRUE;
}