| // 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" |
| } |
| ] |
| } |
| ] |
| } |
| ] |
| } |