daa0a9f9ed5cc3c02e5af41a0dde991d6aa09d58
[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[Seq[SPIFlashParams]]
41
42 trait HasPeripherySPIFlash extends HasTopLevelNetworks {
43 val spiFlashParams = p(PeripherySPIFlashKey)
44 val qspi = spiFlashParams map { params =>
45 val qspi = LazyModule(new TLSPIFlash(peripheryBusBytes, params))
46 qspi.rnode := TLFragmenter(peripheryBusBytes, cacheBlockBytes)(peripheryBus.node)
47 qspi.fnode := TLFragmenter(1, cacheBlockBytes)(TLWidthWidget(peripheryBusBytes)(peripheryBus.node))
48 intBus.intnode := qspi.intnode
49 qspi
50 }
51 }
52
53 trait HasPeripherySPIFlashBundle extends HasTopLevelNetworksBundle {
54 val outer: HasPeripherySPIFlash
55 val qspi = HeterogeneousBag(outer.spiFlashParams.map(new SPIPortIO(_)))
56 }
57
58 trait HasPeripherySPIFlashModule extends HasTopLevelNetworksModule {
59 val outer: HasPeripherySPIFlash
60 val io: HasPeripherySPIFlashBundle
61
62 (io.qspi zip outer.qspi) foreach { case (io, device) =>
63 io <> device.module.io.port
64 }
65 }
66