X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmain%2Fscala%2Fdevices%2Fpwm%2FPWMPeriphery.scala;h=31ad5f6f3a999dc32de46efc8b6149ce4beb7429;hb=ef4f2ed888cd614858c6b2647c1eb6f988ff3973;hp=7e616da39ffc0fff226923f1b72d04eb22bde383;hpb=64bff444622bf7a61a84ed6cdda8aa6ddd5119cf;p=sifive-blocks.git diff --git a/src/main/scala/devices/pwm/PWMPeriphery.scala b/src/main/scala/devices/pwm/PWMPeriphery.scala index 7e616da..31ad5f6 100644 --- a/src/main/scala/devices/pwm/PWMPeriphery.scala +++ b/src/main/scala/devices/pwm/PWMPeriphery.scala @@ -2,39 +2,32 @@ package sifive.blocks.devices.pwm import Chisel._ -import config.Field -import diplomacy.LazyModule -import rocketchip.{ - HasTopLevelNetworks, - HasTopLevelNetworksBundle, - HasTopLevelNetworksModule -} -import uncore.tilelink2.TLFragmenter -import util.HeterogeneousBag - -import sifive.blocks.devices.gpio._ - -class PWMPortIO(c: PWMParams) 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: PWMParams) extends Bundle { - val pwm = Vec(c.ncmp, new GPIOPin) -} +class PWMPins[T <: Pin] (pingen: ()=> T, val c: PWMParams) extends Bundle { -class PWMGPIOPort(c: PWMParams) 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) + } + } } case object PeripheryPWMKey extends Field[Seq[PWMParams]] -trait HasPeripheryPWM extends HasTopLevelNetworks { +trait HasPeripheryPWM extends HasSystemNetworks { val pwmParams = p(PeripheryPWMKey) val pwms = pwmParams map { params => val pwm = LazyModule(new TLPWM(peripheryBusBytes, params)) @@ -44,16 +37,16 @@ trait HasPeripheryPWM extends HasTopLevelNetworks { } } -trait HasPeripheryPWMBundle extends HasTopLevelNetworksBundle { - val outer: HasPeripheryPWM - val pwms = HeterogeneousBag(outer.pwmParams.map(new PWMPortIO(_))) +trait HasPeripheryPWMBundle { + val pwm: HeterogeneousBag[PWMPortIO] + } -trait HasPeripheryPWMModule extends HasTopLevelNetworksModule { +trait HasPeripheryPWMModuleImp extends LazyMultiIOModuleImp with HasPeripheryPWMBundle { val outer: HasPeripheryPWM - val io: HasPeripheryPWMBundle + val pwm = IO(HeterogeneousBag(outer.pwmParams.map(new PWMPortIO(_)))) - (io.pwms zip outer.pwms) foreach { case (io, device) => + (pwm zip outer.pwms) foreach { case (io, device) => io.port := device.module.io.gpio } }