Updates to Freedom SoCs
[freedom-sifive.git] / src / main / scala / everywhere / e300artydevkit / Platform.scala
diff --git a/src/main/scala/everywhere/e300artydevkit/Platform.scala b/src/main/scala/everywhere/e300artydevkit/Platform.scala
new file mode 100644 (file)
index 0000000..a325333
--- /dev/null
@@ -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
+}