Updates to Freedom SoCs
This commit is contained in:
committed by
Yunsup Lee
parent
f4375c2266
commit
ec70d85cbc
177
src/main/scala/everywhere/e300artydevkit/Platform.scala
Normal file
177
src/main/scala/everywhere/e300artydevkit/Platform.scala
Normal file
@ -0,0 +1,177 @@
|
||||
// See LICENSE for license details.
|
||||
package sifive.freedom.everywhere.e300artydevkit
|
||||
|
||||
import Chisel._
|
||||
|
||||
import freechips.rocketchip.config._
|
||||
import freechips.rocketchip.coreplex._
|
||||
import freechips.rocketchip.devices.debug._
|
||||
import freechips.rocketchip.devices.tilelink._
|
||||
import freechips.rocketchip.diplomacy._
|
||||
import freechips.rocketchip.system._
|
||||
|
||||
import sifive.blocks.util.{ResetCatchAndSync}
|
||||
import sifive.blocks.devices.mockaon._
|
||||
import sifive.blocks.devices.gpio._
|
||||
import sifive.blocks.devices.jtag._
|
||||
import sifive.blocks.devices.pwm._
|
||||
import sifive.blocks.devices.spi._
|
||||
import sifive.blocks.devices.uart._
|
||||
import sifive.blocks.devices.i2c._
|
||||
import sifive.blocks.devices.pinctrl._
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
// PinGen
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
object PinGen {
|
||||
def apply(): BasePin = {
|
||||
val pin = new BasePin()
|
||||
pin
|
||||
}
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
// E300ArtyDevKitPlatformIO
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
class E300ArtyDevKitPlatformIO(implicit val p: Parameters) extends Bundle {
|
||||
val pins = new Bundle {
|
||||
val jtag = new JTAGPins(() => PinGen(), false)
|
||||
val gpio = new GPIOPins(() => PinGen(), p(PeripheryGPIOKey)(0))
|
||||
val qspi = new SPIPins(() => PinGen(), p(PeripherySPIFlashKey)(0))
|
||||
val aon = new MockAONWrapperPins()
|
||||
}
|
||||
val jtag_reset = Bool(INPUT)
|
||||
val ndreset = Bool(OUTPUT)
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
// E300ArtyDevKitPlatform
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
class E300ArtyDevKitPlatform(implicit val p: Parameters) extends Module {
|
||||
val sys = Module(LazyModule(new E300ArtyDevKitSystem).module)
|
||||
val io = new E300ArtyDevKitPlatformIO
|
||||
|
||||
// This needs to be de-asserted synchronously to the coreClk.
|
||||
val async_corerst = sys.aon.rsts.corerst
|
||||
// Add in debug-controlled reset.
|
||||
sys.reset := ResetCatchAndSync(clock, async_corerst, 20)
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
// Check for unsupported rocket-chip connections
|
||||
//-----------------------------------------------------------------------
|
||||
|
||||
require (p(NExtTopInterrupts) == 0, "No Top-level interrupts supported");
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
// Build GPIO Pin Mux
|
||||
//-----------------------------------------------------------------------
|
||||
// Pin Mux for UART, SPI, PWM
|
||||
// First convert the System outputs into "IOF" using the respective *GPIOPort
|
||||
// converters.
|
||||
|
||||
val sys_uart = sys.uart
|
||||
val sys_pwm = sys.pwm
|
||||
val sys_spi = sys.spi
|
||||
val sys_i2c = sys.i2c
|
||||
|
||||
val uart_pins = sys.outer.uartParams.map { c => Wire(new UARTPins(() => PinGen()))}
|
||||
val pwm_pins = sys.outer.pwmParams.map { c => Wire(new PWMPins(() => PinGen(), c))}
|
||||
val spi_pins = sys.outer.spiParams.map { c => Wire(new SPIPins(() => PinGen(), c))}
|
||||
val i2c_pins = sys.outer.i2cParams.map { c => Wire(new I2CPins(() => PinGen()))}
|
||||
|
||||
(uart_pins zip sys_uart) map {case (p, r) => p.fromPort(r, clock = clock, reset = reset, syncStages = 0)}
|
||||
(pwm_pins zip sys_pwm) map {case (p, r) => p.fromPort(r)}
|
||||
(spi_pins zip sys_spi) map {case (p, r) => p.fromPort(r, clock = clock, reset = reset, syncStages = 0)}
|
||||
(i2c_pins zip sys_i2c) map {case (p, r) => p.fromPort(r, clock = clock, reset = reset, syncStages = 0)}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
// Default Pin connections before attaching pinmux
|
||||
|
||||
for (iof_0 <- sys.gpio(0).iof_0.get) {
|
||||
iof_0.default()
|
||||
}
|
||||
|
||||
for (iof_1 <- sys.gpio(0).iof_1.get) {
|
||||
iof_1.default()
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
|
||||
val iof_0 = sys.gpio(0).iof_0.get
|
||||
val iof_1 = sys.gpio(0).iof_1.get
|
||||
|
||||
// SPI1 (0 is the dedicated)
|
||||
BasePinToIOF(spi_pins(0).cs(0), iof_0(2))
|
||||
BasePinToIOF(spi_pins(0).dq(0), iof_0(3))
|
||||
BasePinToIOF(spi_pins(0).dq(1), iof_0(4))
|
||||
BasePinToIOF(spi_pins(0).sck, iof_0(5))
|
||||
BasePinToIOF(spi_pins(0).dq(2), iof_0(6))
|
||||
BasePinToIOF(spi_pins(0).dq(3), iof_0(7))
|
||||
BasePinToIOF(spi_pins(0).cs(1), iof_0(8))
|
||||
BasePinToIOF(spi_pins(0).cs(2), iof_0(9))
|
||||
BasePinToIOF(spi_pins(0).cs(3), iof_0(10))
|
||||
|
||||
// SPI2
|
||||
BasePinToIOF(spi_pins(1).cs(0), iof_0(26))
|
||||
BasePinToIOF(spi_pins(1).dq(0), iof_0(27))
|
||||
BasePinToIOF(spi_pins(1).dq(1), iof_0(28))
|
||||
BasePinToIOF(spi_pins(1).sck, iof_0(29))
|
||||
BasePinToIOF(spi_pins(1).dq(2), iof_0(30))
|
||||
BasePinToIOF(spi_pins(1).dq(3), iof_0(31))
|
||||
|
||||
// I2C
|
||||
if (sys.outer.i2cParams.length == 1) {
|
||||
BasePinToIOF(i2c_pins(0).sda, iof_0(12))
|
||||
BasePinToIOF(i2c_pins(0).scl, iof_0(13))
|
||||
}
|
||||
|
||||
// UART0
|
||||
BasePinToIOF(uart_pins(0).rxd, iof_0(16))
|
||||
BasePinToIOF(uart_pins(0).txd, iof_0(17))
|
||||
|
||||
// UART1
|
||||
BasePinToIOF(uart_pins(1).rxd, iof_0(24))
|
||||
BasePinToIOF(uart_pins(1).txd, iof_0(25))
|
||||
|
||||
//PWM
|
||||
BasePinToIOF(pwm_pins(0).pwm(0), iof_1(0) )
|
||||
BasePinToIOF(pwm_pins(0).pwm(1), iof_1(1) )
|
||||
BasePinToIOF(pwm_pins(0).pwm(2), iof_1(2) )
|
||||
BasePinToIOF(pwm_pins(0).pwm(3), iof_1(3) )
|
||||
|
||||
BasePinToIOF(pwm_pins(1).pwm(1), iof_1(19))
|
||||
BasePinToIOF(pwm_pins(1).pwm(0), iof_1(20))
|
||||
BasePinToIOF(pwm_pins(1).pwm(2), iof_1(21))
|
||||
BasePinToIOF(pwm_pins(1).pwm(3), iof_1(22))
|
||||
|
||||
BasePinToIOF(pwm_pins(2).pwm(0), iof_1(10))
|
||||
BasePinToIOF(pwm_pins(2).pwm(1), iof_1(11))
|
||||
BasePinToIOF(pwm_pins(2).pwm(2), iof_1(12))
|
||||
BasePinToIOF(pwm_pins(2).pwm(3), iof_1(13))
|
||||
|
||||
//-----------------------------------------------------------------------
|
||||
// Drive actual Pads
|
||||
//-----------------------------------------------------------------------
|
||||
|
||||
// Result of Pin Mux
|
||||
io.pins.gpio.fromPort(sys.gpio(0))
|
||||
|
||||
// Dedicated SPI Pads
|
||||
io.pins.qspi.fromPort(sys.qspi(0), clock = sys.clock, reset = sys.reset, syncStages = 3)
|
||||
|
||||
// JTAG Debug Interface
|
||||
val sjtag = sys.debug.systemjtag.get
|
||||
io.pins.jtag.fromPort(sjtag.jtag)
|
||||
sjtag.reset := io.jtag_reset
|
||||
sjtag.mfr_id := p(JtagDTMKey).idcodeManufId.U(11.W)
|
||||
|
||||
io.ndreset := sys.debug.ndreset
|
||||
|
||||
// AON Pads -- direct connection is OK because
|
||||
// EnhancedPin is hard-coded in MockAONPads
|
||||
// and thus there is no .fromPort method.
|
||||
io.pins.aon <> sys.aon.pins
|
||||
}
|
Reference in New Issue
Block a user