UART1 on Windows

jordanrh_msft
jordanrh_msft New Member Posts: 2

Hello,

I am trying to enable access to UART1 (Pins 8 and 10 on the header) on Windows IOT Core 64-bit.

First, to enable usermode access to a SerCx2 UART, you must add an rhproxy node to the ACPI tables. See
https://docs.microsoft.com/en-us/windows/uwp/devices-sensors/enable-usermode-access

I have created the following rhproxy node and injected it into the system ACPI tables. This causes a device interface to be created.

    Device(RHPX)
    {
        Name(_HID, "MSFT8000")
        Name(_CID, "MSFT8000")
        Name(_UID, 1)

        Name(_CRS, ResourceTemplate() 
        {  

            // Index 0
            UARTSerialBus(             // UART0
                115200,                // InitialBaudRate: in bits ber second
                ,                      // BitsPerByte: default to 8 bits
                ,                      // StopBits: Defaults to one bit
                0xfc,                  // LinesInUse: 8 1-bit flags to declare line enabled
                ,                      // IsBigEndian: default to LittleEndian
                ,                      // Parity: Defaults to no parity
                ,                      // FlowControl: Defaults to no flow control
                32,                    // ReceiveBufferSize
                32,                    // TransmitBufferSize
                "\\_SB.PCI0.URT1",     // ResourceSource: UART bus controller name
                ,
                ,
                ,
                )                      
        })

        Name(_DSD, Package() 
        {
            ToUUID("daffd814-6eba-4d8c-8a91-bc9bbf4aa301"),
            Package() 
            {
                Package(2) { "bus-UART-UART1", Package() { 0 }},
            }
        })
    }

I use mincomm as usermode test program (https://github.com/ms-iot/samples/tree/develop/MinComm). I can then enumerate the port:

mincomm -list
    0 (UART1): \\?\ACPI#MSFT8000#1#{86e0d1e0-8089-11d0-9ce4-08003e301f73}\UART1

However, when I open the port and write data, I do not see any activity on the pins.

I tried forcing the driver to use the PIO path instead of DMA path by setting following reg keys:

reg add "HKEY_LOCAL_MACHINE\syste    m\controlset001\services\sercx2\Parameters" /v TxPioThreshold /t REG_DWORD /d 0xffff
reg add "HKEY_LOCAL_MACHINE\system\controlset001\services\sercx2\Parameters" /v RxPioThreshold /t REG_DWORD /d 0xffff

And I verified that the PIO path was taken, but I still don't see any activity on the pins.

I think it may be a pin muxing issue. Can you please confirm whether pins are muxed correctly to UART1?

More info:

UART1 driver instance:
ACPI\8086228A\1
    Name: Intel(R) Serial IO UART Controller
    Driver is running.

iauarte.sys
File version: 604.10146.2653.391
Product version: 604.10146.2653.65927

In BIOS, UART1 is set to "ACPI Mode"
BIOS is:
UP-CHT01 R0.S (UPC1BMOS) (6/4/2016)
Version 2.17.1249

Comments

  • jordanrh_msft
    jordanrh_msft New Member Posts: 2

    To replicate my results,

    Install Windows IOT Core 64-bit

    Copy ACPITABL.dat to c:\windows\system32

    Turn on testsigning and reboot:

    bcdedit /set testsigning on
    

    You should then see rhproxy running:

    devcon status msft8000
    

    And should be able to enumerate the port using mincomm.exe.

    mincomm -list
    

    Then type

    mincomm
    

    To open the port. Characters typed into the terminal will be sent over the serial port.