1509ea73c7a38bfae1cb3e3182a8ee4f2aad9636
[sifive-blocks.git] / src / main / scala / devices / spi / SPIPeriphery.scala
1 // See LICENSE for license details.
2 package sifive.blocks.devices.spi
3
4 import Chisel._
5 import config.Field
6 import diplomacy.LazyModule
7 import rocketchip.{
8 HasTopLevelNetworks,
9 HasTopLevelNetworksBundle,
10 HasTopLevelNetworksModule
11 }
12 import uncore.tilelink2.{TLFragmenter, TLWidthWidget}
13 import util.HeterogeneousBag
14
15 case object PeripherySPIKey extends Field[Seq[SPIParams]]
16
17 trait HasPeripherySPI extends HasTopLevelNetworks {
18 val spiParams = p(PeripherySPIKey)
19 val spis = spiParams map { params =>
20 val spi = LazyModule(new TLSPI(peripheryBusBytes, params))
21 spi.rnode := TLFragmenter(peripheryBusBytes, cacheBlockBytes)(peripheryBus.node)
22 intBus.intnode := spi.intnode
23 spi
24 }
25 }
26
27 trait HasPeripherySPIBundle extends HasTopLevelNetworksBundle {
28 val outer: HasPeripherySPI
29 val spis = HeterogeneousBag(outer.spiParams.map(new SPIPortIO(_)))
30 }
31
32 trait HasPeripherySPIModule extends HasTopLevelNetworksModule {
33 val outer: HasPeripherySPI
34 val io: HasPeripherySPIBundle
35 (io.spis zip outer.spis).foreach { case (io, device) =>
36 io <> device.module.io.port
37 }
38 }
39
40 case object PeripherySPIFlashKey extends Field[SPIFlashParams]
41
42 trait HasPeripherySPIFlash extends HasTopLevelNetworks {
43 val spiFlashParams = p(PeripherySPIFlashKey)
44 val qspi = LazyModule(new TLSPIFlash(peripheryBusBytes, spiFlashParams))
45 qspi.rnode := TLFragmenter(peripheryBusBytes, cacheBlockBytes)(peripheryBus.node)
46 qspi.fnode := TLFragmenter(1, cacheBlockBytes)(TLWidthWidget(peripheryBusBytes)(peripheryBus.node))
47 intBus.intnode := qspi.intnode
48 }
49
50 trait HasPeripherySPIFlashBundle extends HasTopLevelNetworksBundle {
51 val outer: HasPeripherySPIFlash
52 val qspi = new SPIPortIO(outer.spiFlashParams)
53 }
54
55 trait HasPeripherySPIFlashModule extends HasTopLevelNetworksModule {
56 val outer: HasPeripherySPIFlash
57 val io: HasPeripherySPIFlashBundle
58 io.qspi <> outer.qspi.module.io.port
59 }