X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmain%2Fscala%2Fdevices%2Fpwm%2FPWMPeriphery.scala;h=63bbfabccc48a6f7e0a9dd256193a0fe378a93fe;hb=4d74e8f67f871df93f7bb2dfb2fa8bffb641fc4a;hp=992699fa6c907e949a3e168eb7913787ed02b0bd;hpb=7916ef5249c72a3a84c599d123760f4d716de58a;p=sifive-blocks.git diff --git a/src/main/scala/devices/pwm/PWMPeriphery.scala b/src/main/scala/devices/pwm/PWMPeriphery.scala index 992699f..63bbfab 100644 --- a/src/main/scala/devices/pwm/PWMPeriphery.scala +++ b/src/main/scala/devices/pwm/PWMPeriphery.scala @@ -2,57 +2,51 @@ package sifive.blocks.devices.pwm import Chisel._ -import config._ -import diplomacy.LazyModule -import rocketchip.{TopNetwork,TopNetworkModule} -import uncore.tilelink2.TLFragmenter - -import sifive.blocks.devices.gpio._ - -class PWMPortIO(c: PWMBundleConfig)(implicit p: Parameters) extends Bundle { +import freechips.rocketchip.config.Field +import freechips.rocketchip.diplomacy.{LazyModule,LazyMultiIOModuleImp} +import freechips.rocketchip.chip.HasSystemNetworks +import freechips.rocketchip.tilelink.TLFragmenter +import freechips.rocketchip.util.HeterogeneousBag +import sifive.blocks.devices.pinctrl.{PinCtrl, Pin} + +class PWMPortIO(val c: PWMParams) extends Bundle { val port = Vec(c.ncmp, Bool()).asOutput override def cloneType: this.type = new PWMPortIO(c).asInstanceOf[this.type] } -class PWMPinsIO(c: PWMBundleConfig)(implicit p: Parameters) extends Bundle { - val pwm = Vec(c.ncmp, new GPIOPin) -} +class PWMPins[T <: Pin] (pingen: ()=> T, val c: PWMParams) extends Bundle { -class PWMGPIOPort(c: PWMBundleConfig)(implicit p: Parameters) extends Module { - val io = new Bundle { - val pwm = new PWMPortIO(c).flip() - val pins = new PWMPinsIO(c) - } + val pwm: Vec[T] = Vec(c.ncmp, pingen()) - GPIOOutputPinCtrl(io.pins.pwm, io.pwm.port.asUInt) + def fromPWMPort(port: PWMPortIO) { + (pwm zip port.port) foreach {case (pin, port) => + pin.outputPin(port) + } + } } -trait PeripheryPWM { - this: TopNetwork { val pwmConfigs: Seq[PWMConfig] } => +case object PeripheryPWMKey extends Field[Seq[PWMParams]] - val pwmDevices = (pwmConfigs.zipWithIndex) map { case (c, i) => - val pwm = LazyModule(new TLPWM(c) { override lazy val valName = Some(s"pwm$i") }) - pwm.node := TLFragmenter(peripheryBusConfig.beatBytes, cacheBlockBytes)(peripheryBus.node) +trait HasPeripheryPWM extends HasSystemNetworks { + val pwmParams = p(PeripheryPWMKey) + val pwms = pwmParams map { params => + val pwm = LazyModule(new TLPWM(peripheryBusBytes, params)) + pwm.node := TLFragmenter(peripheryBusBytes, cacheBlockBytes)(peripheryBus.node) intBus.intnode := pwm.intnode pwm } } -trait PeripheryPWMBundle { - this: { - val p: Parameters - val pwmConfigs: Seq[PWMConfig] - } => - val pwm_bc = pwmConfigs.map(_.bc).reduce(_.union(_)) - val pwms = Vec(pwmConfigs.size, new PWMPortIO(pwm_bc)(p)) +trait HasPeripheryPWMBundle { + val pwms: HeterogeneousBag[PWMPortIO] + } -trait PeripheryPWMModule { - this: TopNetworkModule { - val outer: PeripheryPWM - val io: PeripheryPWMBundle - } => - (io.pwms.zipWithIndex zip outer.pwmDevices) foreach { case ((io, i), device) => +trait HasPeripheryPWMModuleImp extends LazyMultiIOModuleImp with HasPeripheryPWMBundle { + val outer: HasPeripheryPWM + val pwms = IO(HeterogeneousBag(outer.pwmParams.map(new PWMPortIO(_)))) + + (pwms zip outer.pwms) foreach { case (io, device) => io.port := device.module.io.gpio } }