X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmain%2Fscala%2Fdevices%2Fspi%2FSPIPeriphery.scala;h=4361b1a1561dd922fa6cff8dc364dafb507d5dbe;hb=b06b80dccdf4e71b37866cc0e32a800a2b1a62d1;hp=40bcec692f9265f5b9fa590a09a060194244ff23;hpb=7916ef5249c72a3a84c599d123760f4d716de58a;p=sifive-blocks.git diff --git a/src/main/scala/devices/spi/SPIPeriphery.scala b/src/main/scala/devices/spi/SPIPeriphery.scala index 40bcec6..4361b1a 100644 --- a/src/main/scala/devices/spi/SPIPeriphery.scala +++ b/src/main/scala/devices/spi/SPIPeriphery.scala @@ -2,56 +2,66 @@ package sifive.blocks.devices.spi import Chisel._ -import diplomacy.LazyModule -import uncore.tilelink2._ -import rocketchip.{TopNetwork,TopNetworkModule} - -trait PeripherySPI { - this: TopNetwork { val spiConfigs: Seq[SPIConfig] } => - val spiDevices = (spiConfigs.zipWithIndex) map {case (c, i) => - val spi = LazyModule(new TLSPI(c) { override lazy val valName = Some(s"spi$i") } ) - spi.rnode := TLFragmenter(peripheryBusConfig.beatBytes, cacheBlockBytes)(peripheryBus.node) +import config.Field +import diplomacy.{LazyModule,LazyMultiIOModuleImp} +import rocketchip.HasSystemNetworks +import uncore.tilelink2.{TLFragmenter,TLWidthWidget} +import util.HeterogeneousBag + +case object PeripherySPIKey extends Field[Seq[SPIParams]] + +trait HasPeripherySPI extends HasSystemNetworks { + val spiParams = p(PeripherySPIKey) + val spis = spiParams map { params => + val spi = LazyModule(new TLSPI(peripheryBusBytes, params)) + spi.rnode := TLFragmenter(peripheryBusBytes, cacheBlockBytes)(peripheryBus.node) intBus.intnode := spi.intnode spi } } -trait PeripherySPIBundle { - this: { val spiConfigs: Seq[SPIConfig] } => - val spi_bc = spiConfigs.map(_.bc).reduce(_.union(_)) - val spis = Vec(spiConfigs.size, new SPIPortIO(spi_bc.toSPIConfig)) +trait HasPeripherySPIBundle { + val spis: HeterogeneousBag[SPIPortIO] + + def SPItoGPIOPins(syncStages: Int = 0): Seq[SPIGPIOPort] = spis.map { s => + val pin = Module(new SPIGPIOPort(s.c, syncStages)) + pin.io.spi <> s + pin + } } -trait PeripherySPIModule { - this: TopNetworkModule { - val spiConfigs: Seq[SPIConfig] - val outer: PeripherySPI - val io: PeripherySPIBundle - } => - (io.spis zip outer.spiDevices).foreach { case (io, device) => +trait HasPeripherySPIModuleImp extends LazyMultiIOModuleImp with HasPeripherySPIBundle { + val outer: HasPeripherySPI + val spis = IO(HeterogeneousBag(outer.spiParams.map(new SPIPortIO(_)))) + + (spis zip outer.spis).foreach { case (io, device) => io <> device.module.io.port } } +case object PeripherySPIFlashKey extends Field[Seq[SPIFlashParams]] -trait PeripherySPIFlash { - this: TopNetwork { val spiFlashConfig: SPIFlashConfig } => - val qspi = LazyModule(new TLSPIFlash(spiFlashConfig)) - qspi.rnode := TLFragmenter(peripheryBusConfig.beatBytes, cacheBlockBytes)(peripheryBus.node) - qspi.fnode := TLFragmenter(1, cacheBlockBytes)(TLWidthWidget(peripheryBusConfig.beatBytes)(peripheryBus.node)) - intBus.intnode := qspi.intnode +trait HasPeripherySPIFlash extends HasSystemNetworks { + val spiFlashParams = p(PeripherySPIFlashKey) + val qspi = spiFlashParams map { params => + val qspi = LazyModule(new TLSPIFlash(peripheryBusBytes, params)) + qspi.rnode := TLFragmenter(peripheryBusBytes, cacheBlockBytes)(peripheryBus.node) + qspi.fnode := TLFragmenter(1, cacheBlockBytes)(TLWidthWidget(peripheryBusBytes)(peripheryBus.node)) + intBus.intnode := qspi.intnode + qspi + } } -trait PeripherySPIFlashBundle { - this: { val spiFlashConfig: SPIFlashConfig } => - val qspi = new SPIPortIO(spiFlashConfig) +trait HasPeripherySPIFlashBundle { + val qspi: HeterogeneousBag[SPIPortIO] } -trait PeripherySPIFlashModule { - this: TopNetworkModule { - val spiConfigs: Seq[SPIConfig] - val outer: PeripherySPIFlash - val io: PeripherySPIFlashBundle - } => - io.qspi <> outer.qspi.module.io.port +trait HasPeripherySPIFlashModuleImp extends LazyMultiIOModuleImp with HasPeripherySPIFlashBundle { + val outer: HasPeripherySPIFlash + val qspi = IO(HeterogeneousBag(outer.spiFlashParams.map(new SPIPortIO(_)))) + + (qspi zip outer.qspi) foreach { case (io, device) => + io <> device.module.io.port + } } +