| // Copyright lowRISC contributors. | 
 | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
 | // SPDX-License-Identifier: Apache-2.0 | 
 | { name: "usbuart", | 
 |   clock_primary: "clk_fixed", | 
 |   other_clock_list: [ "clk_48mhz" ] | 
 |   bus_device: "tlul", | 
 |   bus_host: "none", | 
 |   available_inout_list: [ | 
 |     { name: "usb_dp", desc: "USB data D+" } | 
 |     { name: "usb_dm", desc: "USB data D-" } | 
 |   ], | 
 |   available_input_list: [ | 
 |     {  name: "usb_sense", desc: "USB host VBUS sense" } | 
 |   ], | 
 |   available_output_list: [ | 
 |     { name: "usb_pullup", desc: "USB FS pullup control" } | 
 |   ], | 
 |   interrupt_list: [ | 
 |     { name: "tx_watermark" | 
 |       desc: "raised if the transmit FIFO is past the highwater mark."} | 
 |     { name: "rx_watermark" | 
 |       desc: "raised if the receive FIFO is past the highwater mark."} | 
 |     { name: "tx_overflow" | 
 |       desc: "raised if the transmit FIFO has overflowed."} | 
 |     { name: "rx_overflow" | 
 |       desc: "raised if the receive FIFO has overflowed."} | 
 |     { name: "rx_frame_err" | 
 |       desc: ''' | 
 |             raised if a framing error has been detected on receive, | 
 |             which will never happen on the USB interface. | 
 |             '''} | 
 |     { name: "rx_break_err" | 
 |       desc: ''' | 
 |             raised if break condition has been detected on receive. | 
 |             This is done if either the host is not providing VBUS or has not | 
 |             provided a Start of Frame indication in 2.048ms. | 
 |             '''} | 
 |     { name: "rx_timeout" | 
 |       desc: ''' | 
 |             raised if RX FIFO has characters remaining in the FIFO without being | 
 |             retrieved for the programmed time period. | 
 |             ''' | 
 |     } | 
 |     { name: "rx_parity_err" | 
 |       desc: ''' | 
 |             raised if the receiver has detected a parity error, | 
 |             which will never happen on the USB interface. | 
 |             '''} | 
 |   ] | 
 |   regwidth: "32", | 
 |   registers: [ | 
 |     { name: "CTRL", | 
 |       desc: "UART control register", | 
 |       swaccess: "rw", | 
 |       hwaccess: "hro", | 
 |       fields: [ | 
 |         { bits: "0", | 
 |           name: "TX", | 
 |           desc: ''' | 
 |                 TX enable, if this bit is set (or the RX) the USB | 
 |                 interface is enabled by asserting the usb_pullup. | 
 |                 ''' | 
 |         } | 
 |         { bits: "1", | 
 |           name: "RX", | 
 |           desc: ''' | 
 |                 RX enable, if this bit is set (or the TX) the USB | 
 |                 interface is enabled by asserting the usb_pullup. | 
 |                 ''' | 
 |         } | 
 |         { bits: "2", | 
 |           name: "NF", | 
 |           desc: "Ignored (RX noise filter enable)" | 
 |         } | 
 |         { bits: "4", | 
 |           name: "SLPBK", | 
 |           desc: '''System loopback enable | 
 |  | 
 |                 If this bit is turned on, bytes written to the tx fifo | 
 |                 will loop back to the rx fifo. They will be syncronized | 
 |                 through the USB 48MHz clock domain. When in loopback the | 
 |                 USB interface will always see an empty TX fifo so will | 
 |                 never send any data, and all data received on the USB | 
 |                 interface is discarded. | 
 |                 ''' | 
 |         } | 
 |         { bits: "5", | 
 |           name: "LLPBK", | 
 |           desc: "Ignored (Line loopback enable)" | 
 |         } | 
 |         { bits: "6", | 
 |           name: "PARITY_EN", | 
 |           desc: "Ignored (Parity enable)" | 
 |         } | 
 |         { bits: "7", | 
 |           name: "PARITY_ODD", | 
 |           desc: "Ignored (1 for odd parity, 0 for even.)" | 
 |         } | 
 |         { bits: "9:8", | 
 |           name: "RXBLVL", | 
 |           desc: ''' | 
 |                 Trigger level for rx break detection. | 
 |                 A break is detected whenever the USB Host VBUS is dropped | 
 |                 or if the host stops sending Start of Frame packets (which | 
 |                 should arrive every 1ms). If this field is 0 then the | 
 |                 break is detected if no SOF is received for 2.048ms, | 
 |                 if non-zero then when no SOF is received for 1s. | 
 |                 ''' | 
 |         } | 
 |         { bits: "31:16", | 
 |           name: "NCO", | 
 |           desc: ''' | 
 |                 BAUD clock rate control. This is only used to determine the | 
 |                 bit time used as the basis for the RX timeout, so the | 
 |                 software will see the same timeout time as if configuring | 
 |                 the standard uart (see !!TIMEOUT_CTRL register). | 
 |                 ''' | 
 |         } | 
 |       ] | 
 |     }, | 
 |     { name:     "STATUS" | 
 |       desc:     "UART live status register" | 
 |       swaccess: "ro" | 
 |       hwaccess: "hwo" | 
 |       hwext:    "true" | 
 |       fields: [ | 
 |         { bits: "0" | 
 |           name: "TXFULL" | 
 |           desc: "TX buffer is full" | 
 |         } | 
 |         { bits: "1" | 
 |           name: "RXFULL" | 
 |           desc: "RX buffer is full" | 
 |         } | 
 |         { bits: "2" | 
 |           name: "TXEMPTY" | 
 |           desc: "TX FIFO is empty" | 
 |         } | 
 |         { bits: "3" | 
 |           name: "TXIDLE" | 
 |           desc: "TX is idle. At the moment this matches the TXEMPTY bit." | 
 |         } | 
 |         { bits: "4" | 
 |           name: "RXIDLE" | 
 |           desc: "RX is idle. At the moment this matches the RXEMPTY bit." | 
 |         } | 
 |         { bits: "5" | 
 |           name: "RXEMPTY" | 
 |           desc: "RX FIFO is empty" | 
 |         } | 
 |       ] | 
 |     } | 
 |     { name: "RDATA", | 
 |       desc: "UART read data", | 
 |       swaccess: "ro", | 
 |       hwaccess: "hrw", | 
 |       hwext: "true", | 
 |       hwre: "true", | 
 |       fields: [ | 
 |         { bits: "7:0" } | 
 |       ] | 
 |     } | 
 |     { name: "WDATA", | 
 |       desc: "UART write data", | 
 |       swaccess: "wo", | 
 |       hwaccess: "hro", | 
 |       hwqe: "true", | 
 |       fields: [ | 
 |         { bits: "7:0" } | 
 |       ] | 
 |     } | 
 |     { name: "FIFO_CTRL", | 
 |       desc: "UART FIFO control register", | 
 |       swaccess: "rw", | 
 |       hwaccess: "hrw", | 
 |       hwqe:     "true", | 
 |       fields: [ | 
 |         { bits: "0", | 
 |           name: "RXRST", | 
 |           desc: "RX fifo reset" | 
 |         } | 
 |         { bits: "1", | 
 |           name: "TXRST", | 
 |           desc: "TX fifo reset" | 
 |         } | 
 |         { bits: "4:2", | 
 |           name: "RXILVL", | 
 |           desc: "Trigger level for RX interrupts", | 
 |           enum: [ | 
 |             { value: "0", | 
 |               name: "rxlvl1", | 
 |               desc: "1 character" | 
 |             }, | 
 |             { value: "1", | 
 |               name: "rxlvl4", | 
 |               desc: "4 characters" | 
 |             }, | 
 |             { value: "2", | 
 |               name: "rxlvl8", | 
 |               desc: "8 characters" | 
 |             }, | 
 |             { value: "3", | 
 |               name: "rxlvl16", | 
 |               desc: "16 characters" | 
 |             }, | 
 |             { value: "4", | 
 |               name: "rxlvl30", | 
 |               desc: "30 characters" | 
 |             }, | 
 |             // TODO expect generator to make others reserved | 
 |           ] | 
 |         } | 
 |         { bits: "6:5", | 
 |           name: "TXILVL", | 
 |           desc: "Trigger level for TX interrupts", | 
 |           enum: [ | 
 |             { value: "0", | 
 |               name: "txlvl1", | 
 |               desc: "1 character" | 
 |             }, | 
 |             { value: "1", | 
 |               name: "txlvl4", | 
 |               desc: "4 characters" | 
 |             }, | 
 |             { value: "2", | 
 |               name: "txlvl8", | 
 |               desc: "8 characters" | 
 |             }, | 
 |             { value: "3", | 
 |               name: "txlvl16", | 
 |               desc: "16 characters" | 
 |             } | 
 |           ] | 
 |         } | 
 |       ] | 
 |     } | 
 |     { name: "FIFO_STATUS", | 
 |       desc: "UART FIFO status register", | 
 |       swaccess: "ro", | 
 |       hwaccess: "hwo", | 
 |       hwext: "true", | 
 |       fields: [ | 
 |         { bits: "5:0", | 
 |           name: "TXLVL", | 
 |           desc: "Current fill level of TX fifo" | 
 |         } | 
 |         { bits: "21:16", | 
 |           name: "RXLVL", | 
 |           desc: "Current fill level of RX fifo" | 
 |         } | 
 |       ] | 
 |     } | 
 |     { name: "OVRD", | 
 |       desc: "UART override control register", | 
 |       swaccess: "rw", | 
 |       hwaccess: "hro", | 
 |       fields: [ | 
 |         { bits: "0", | 
 |           name: "TXEN", | 
 |           desc: "Ignored (Override the TX signal)" | 
 |         } | 
 |         { bits: "1", | 
 |           name: "TXVAL", | 
 |           desc: "Ignored (Value for TX Override)" | 
 |         } | 
 |       ] | 
 |     } | 
 |     { name: "VAL", | 
 |       desc: "UART oversampled values", | 
 |       swaccess: "ro", | 
 |       hwaccess: "hwo", | 
 |       hwext:    "true", | 
 |       fields: [ | 
 |         { bits: "15:0", | 
 |           name: "RX", | 
 |           desc: ''' | 
 |                 Always zero (Last 16 oversampled values of RX.) | 
 |                 ''' | 
 |         } | 
 |       ] | 
 |     } | 
 |     { name: "TIMEOUT_CTRL", | 
 |       desc: "UART RX timeout control", | 
 |       swaccess: "rw", | 
 |       hwaccess: "hro", | 
 |       fields: [ | 
 |         { bits: "23:0", | 
 |           name: "VAL", | 
 |           desc: "RX timeout value in UART bit times" | 
 |         } | 
 |         { bits: "31", | 
 |           name: "EN", | 
 |           desc: "Enable RX timeout feature" | 
 |         } | 
 |       ] | 
 |     } | 
 |     { name: "USBSTAT", | 
 |       desc: "USB Status", | 
 |       swaccess: "ro", | 
 |       hwaccess: "hwo", | 
 |       hwext: "true", | 
 |       fields: [ | 
 |         { | 
 |           bits: "10:0", | 
 |           name: "frame", | 
 |           desc: ''' | 
 |                 Frame index received from host. On an active link this | 
 |                 will increment every milisecond. | 
 |                 ''' | 
 |         } | 
 |         { | 
 |           bits: "14", | 
 |           name: "host_timeout", | 
 |           desc: ''' | 
 |                 Start of frame not received from host for 1s. | 
 |                 ''' | 
 |         } | 
 |         { | 
 |           bits: "15", | 
 |           name: "host_lost", | 
 |           desc: ''' | 
 |                 Start of frame not received from host for 2.048ms. | 
 |                 ''' | 
 |         } | 
 |         { | 
 |           bits: "22:16", | 
 |           name: "device_address", | 
 |           desc: ''' | 
 |                 Device address set by host. | 
 |                 ''' | 
 |         } | 
 |       ] | 
 |     } | 
 |     { name: "USBPARAM", | 
 |       desc: "USB Parmeters", | 
 |       swaccess: "ro", | 
 |       hwaccess: "hwo", | 
 |       hwext: "true", | 
 |       fields: [ | 
 |         { | 
 |           bits: "15:0", | 
 |           name: "baud_req", | 
 |           desc: ''' | 
 |                 Baud rate requested if the interface is bridged to a real uart. | 
 |                 ''' | 
 |         } | 
 |         { | 
 |           bits: "17:16", | 
 |           name: "parity_req", | 
 |           desc: ''' | 
 |                 Parity requested if the interface is bridged to a real uart. | 
 |                 ''' | 
 |           enum: [ | 
 |             { value: "0", | 
 |               name: "none", | 
 |               desc: "No parity" | 
 |             }, | 
 |             { value: "1", | 
 |               name: "odd", | 
 |               desc: "Odd parity" | 
 |             }, | 
 |             { value: "2", | 
 |               name: "even", | 
 |               desc: "Even parity" | 
 |             } | 
 |           ] | 
 |         } | 
 |       ] | 
 |     } | 
 |   ] | 
 | } |