blob: d470c6e15c2656513d4d505aef24907913a73c80 [file] [log] [blame]
// Copyright lowRISC contributors.
// Licensed under the Apache License, Version 2.0, see LICENSE for details.
// SPDX-License-Identifier: Apache-2.0
module padctl_usb (
// UART device side
input cio_uart_tx_d2p,
input cio_uart_tx_en_d2p,
output cio_uart_rx_p2d,
// USB device side
output cio_usb_dp_p2d[2],
input cio_usb_dp_d2p[2],
input cio_usb_dp_en_d2p[2],
output cio_usb_dn_p2d[2],
input cio_usb_dn_d2p[2],
input cio_usb_dn_en_d2p[2],
output cio_usb_sense_p2d[2],
input cio_usb_pullup_d2p[2],
input cio_usb_pullup_en_d2p[2],
// UART pads
input IO_URX,
output IO_UTX,
// USB pads
inout IO_USB_DP0,
inout IO_USB_DN0,
input IO_USB_SENSE0,
output IO_USB_PULLUP0,
inout IO_USB_DP1,
inout IO_USB_DN1,
input IO_USB_SENSE1,
output IO_USB_PULLUP1,
// GPIO device side
input [31:0] cio_gpio_d2p,
input [31:0] cio_gpio_en_d2p,
output [31:0] cio_gpio_p2d,
// GPIO pads
inout IO_GP0,
inout IO_GP1,
inout IO_GP2,
inout IO_GP3,
inout IO_GP4,
inout IO_GP5,
inout IO_GP6,
inout IO_GP7,
inout IO_GP8,
inout IO_GP9,
inout IO_GP10,
inout IO_GP11,
inout IO_GP12,
inout IO_GP13,
inout IO_GP14,
inout IO_GP15,
// SPI device interface
output cio_spi_device_sck_p2d,
output cio_spi_device_csb_p2d,
output cio_spi_device_mosi_p2d,
input cio_spi_device_miso_d2p,
input cio_spi_device_miso_en_d2p,
// JTAG interface
output cio_jtag_tck_p2d,
output cio_jtag_tms_p2d,
output cio_jtag_trst_n_p2d,
output cio_jtag_srst_n_p2d,
output cio_jtag_tdi_p2d,
input cio_jtag_tdo_d2p,
// FTDI MSEE pins shared between JTAG and SPI
input IO_DPS0,
input IO_DPS1,
output IO_DPS2,
input IO_DPS3,
input IO_DPS4,
input IO_DPS5,
input IO_DPS6
);
// Important that the rx (p2d) line is fixed when transmitting
// Otherwise you are trying to regenerate the bit clock from
// the bit clock you are regenerating, rather than just holding the phase
assign IO_USB_DP0 = cio_usb_dp_en_d2p[0] ? cio_usb_dp_d2p[0] : 1'bz;
assign cio_usb_dp_p2d[0] = cio_usb_dp_en_d2p[0] ? 1'b1 : IO_USB_DP0;
assign IO_USB_DN0 = cio_usb_dn_en_d2p[0] ? cio_usb_dn_d2p[0] : 1'bz;
assign cio_usb_dn_p2d[0] = cio_usb_dn_en_d2p[0] ? 1'b0 : IO_USB_DN0;
assign IO_USB_PULLUP0 = cio_usb_pullup_en_d2p[0] ? cio_usb_pullup_d2p[0] : 1'bz;
assign cio_usb_sense_p2d[0] = IO_USB_SENSE0;
assign IO_USB_DP1 = cio_usb_dp_en_d2p[1] ? cio_usb_dp_d2p[1] : 1'bz;
assign cio_usb_dp_p2d[1] = cio_usb_dp_en_d2p[1] ? 1'b1 : IO_USB_DP1;
assign IO_USB_DN1 = cio_usb_dn_en_d2p[1] ? cio_usb_dn_d2p[1] : 1'bz;
assign cio_usb_dn_p2d[1] = cio_usb_dn_en_d2p[1] ? 1'b0 : IO_USB_DN1;
assign IO_USB_PULLUP1 = cio_usb_pullup_en_d2p[1] ? cio_usb_pullup_d2p[1] : 1'bz;
assign cio_usb_sense_p2d[1] = IO_USB_SENSE1;
// JTAG or SPI mux to the FTDI MSEE pins DPS0-DPS6
logic jtag_spi_n, dps2, dps2_en;
assign cio_gpio_p2d = {
15'h0, // unpopulated
jtag_spi_n, // Use GPIO16 to pass SPI/JTAG control flag
IO_GP15,
IO_GP14,
IO_GP13,
IO_GP12,
IO_GP11,
IO_GP10,
IO_GP9,
IO_GP8,
IO_GP7,
IO_GP6,
IO_GP5,
IO_GP4,
IO_GP3,
IO_GP2,
IO_GP1,
IO_GP0
};
assign IO_GP0 = cio_gpio_en_d2p[0] ? cio_gpio_d2p[0] : 1'bz;
assign IO_GP1 = cio_gpio_en_d2p[1] ? cio_gpio_d2p[1] : 1'bz;
assign IO_GP2 = cio_gpio_en_d2p[2] ? cio_gpio_d2p[2] : 1'bz;
assign IO_GP3 = cio_gpio_en_d2p[3] ? cio_gpio_d2p[3] : 1'bz;
assign IO_GP4 = cio_gpio_en_d2p[4] ? cio_gpio_d2p[4] : 1'bz;
assign IO_GP5 = cio_gpio_en_d2p[5] ? cio_gpio_d2p[5] : 1'bz;
assign IO_GP6 = cio_gpio_en_d2p[6] ? cio_gpio_d2p[6] : 1'bz;
assign IO_GP7 = cio_gpio_en_d2p[7] ? cio_gpio_d2p[7] : 1'bz;
assign IO_GP8 = cio_gpio_en_d2p[8] ? cio_gpio_d2p[8] : 1'bz;
assign IO_GP9 = cio_gpio_en_d2p[9] ? cio_gpio_d2p[9] : 1'bz;
assign IO_GP10 = cio_gpio_en_d2p[10] ? cio_gpio_d2p[10] : 1'bz;
assign IO_GP11 = cio_gpio_en_d2p[11] ? cio_gpio_d2p[11] : 1'bz;
assign IO_GP12 = cio_gpio_en_d2p[12] ? cio_gpio_d2p[12] : 1'bz;
assign IO_GP13 = cio_gpio_en_d2p[13] ? cio_gpio_d2p[13] : 1'bz;
assign IO_GP14 = cio_gpio_en_d2p[14] ? cio_gpio_d2p[14] : 1'bz;
assign IO_GP15 = cio_gpio_en_d2p[15] ? cio_gpio_d2p[15] : 1'bz;
assign jtag_spi_n = IO_DPS6;
assign cio_spi_device_sck_p2d = jtag_spi_n ? 0 : IO_DPS0;
assign cio_jtag_tck_p2d = jtag_spi_n ? IO_DPS0 : 0;
assign cio_spi_device_mosi_p2d = jtag_spi_n ? 0 : IO_DPS1;
assign cio_jtag_tdi_p2d = jtag_spi_n ? IO_DPS1 : 0;
assign dps2 = jtag_spi_n ? cio_jtag_tdi_p2d : cio_spi_device_miso_d2p;
assign dps2_en = jtag_spi_n ? 1 : cio_spi_device_miso_en_d2p;
assign IO_DPS2 = dps2_en ? dps2 : 1'bz;
assign cio_spi_device_csb_p2d = jtag_spi_n ? 1 : IO_DPS3;
assign cio_jtag_tms_p2d = jtag_spi_n ? IO_DPS3 : 0;
assign cio_jtag_trst_n_p2d = jtag_spi_n ? IO_DPS4 : 1;
assign cio_jtag_srst_n_p2d = jtag_spi_n ? IO_DPS5 : 1;
endmodule