Search in sources :

Example 6 with ChoiceVariable

use of net.sourceforge.usbdm.deviceEditor.information.ChoiceVariable in project usbdm-eclipse-plugins by podonoghue.

the class RtcValidate method validate.

/**
 * Class to determine RTC oscillator settings
 *
 * Outputs rtcclk_clock, rtcclk_gated_clock,
 * @throws Exception
 */
@Override
public void validate(Variable variable) throws Exception {
    // Indicates RTC uses main oscillator XTAL/EXTAL pins
    Variable rtcSharesPinsVar = safeGetVariable("/SIM/rtcSharesPins");
    boolean rtcSharesPins = (safeGetVariable("/SIM/rtcSharesPins") != null) && rtcSharesPinsVar.getValueAsBoolean();
    super.validate(variable);
    // RTC
    // =================================
    BooleanVariable rtc_cr_osceVar = getBooleanVariable("rtc_cr_osce");
    ChoiceVariable rtc_cr_scpVar = getChoiceVariable("rtc_cr_scp");
    Variable rtc_cr_umVar = getVariable("rtc_cr_um");
    Variable rtc_cr_supVar = getVariable("rtc_cr_sup");
    Variable rtc_cr_wpeVar = getVariable("rtc_cr_wpe");
    LongVariable rtc_1hz_clockVar = getLongVariable("rtc_1hz_clock");
    long osc_input_freq = 0;
    LongVariable osc_input_freqVar = null;
    LongVariable osc_clockVar = null;
    Status status = null;
    String origin = "RTCCLK";
    if (rtcSharesPins) {
        // RTC uses main oscillator XTAL/EXTAL pins
        // ===================================================
        String osc0_peripheral = getStringVariable("/SIM/osc0_peripheral").getValueAsString();
        osc_input_freqVar = getLongVariable(osc0_peripheral + "/osc_input_freq");
        osc_clockVar = getLongVariable(osc0_peripheral + "/osc_clock");
        origin = "RTCCLK";
        rtc_cr_osceVar.setToolTip("Enable main oscillator as 32kHz RTC oscillator\n" + "Note: this disables OSC control by MCG");
    } else {
        // RTC uses separate XTAL32/EXTAL32 pins
        // ===================================================
        osc_input_freqVar = getLongVariable("osc_input_freq");
        osc_clockVar = getLongVariable("osc_clock");
        origin = "RTCCLK";
        rtc_cr_osceVar.setToolTip("Enable 32kHz RTC oscillator");
        // Warn if SCL and SDA signals not mapped
        validateMappedPins(new int[] { 0, 1 }, getPeripheral().getSignalTables().get(0).table);
    }
    osc_input_freq = osc_input_freqVar.getValueAsLong();
    // =========================================
    // Check input clock/oscillator ranges
    // 
    long rtcClockFrequency = osc_input_freq;
    if ((osc_input_freq < RtcValidate.EXTERNAL_EXTAL_RANGE_MIN) || (osc_input_freq > RtcValidate.EXTERNAL_EXTAL_RANGE_MAX)) {
        status = OSCCLK32K_CLOCK_WARNING_MSG;
        origin = origin + " (invalid range)";
        rtcClockFrequency = 0L;
        rtc_cr_osceVar.setValue(false);
        rtc_cr_osceVar.setStatus(status);
        if (!rtcSharesPins) {
            osc_input_freqVar.setStatus(status);
        }
    } else {
        rtc_cr_osceVar.setStatus((Status) null);
        if (!rtcSharesPins) {
            osc_input_freqVar.setStatus((Status) null);
        }
        if (!rtc_cr_osceVar.getValueAsBoolean()) {
            status = new Status("Disabled by rtc_cr_osce", Severity.WARNING);
            origin = origin + " (disabled)";
            rtcClockFrequency = 0L;
        }
    }
    // =========================================
    // Check and propagate enabled
    // 
    boolean rtc_cr_osce = rtc_cr_osceVar.isEnabled() && rtc_cr_osceVar.getValueAsBoolean();
    rtc_cr_scpVar.enable(rtc_cr_osce);
    rtc_cr_umVar.enable(rtc_cr_osce);
    rtc_cr_supVar.enable(rtc_cr_osce);
    rtc_cr_wpeVar.enable(rtc_cr_osce);
    osc_clockVar.enable(rtc_cr_osce);
    rtc_1hz_clockVar.enable(rtc_cr_osce);
    if (!rtcSharesPins || rtc_cr_osce) {
        // Only update if owned by RTC
        osc_clockVar.setValue(rtcClockFrequency);
        osc_clockVar.setStatus(status);
        osc_clockVar.setOrigin(origin);
    }
    rtc_1hz_clockVar.setValue((rtcClockFrequency > 0) ? 1 : 0);
    rtc_1hz_clockVar.setStatus(status);
    rtc_1hz_clockVar.setOrigin(origin);
    // RTC Clocks
    // ==============================
    // Check if gating option
    BooleanVariable rtc_cr_clkoVar = getBooleanVariable("rtc_cr_clko");
    LongVariable rtcclk_gated_clockVar = getLongVariable("rtcclk_gated_clock");
    rtc_cr_clkoVar.enable(rtc_cr_osce);
    if (rtc_cr_clkoVar.isEnabled() && rtc_cr_clkoVar.getValueAsBoolean()) {
        rtcclk_gated_clockVar.setValue(rtcClockFrequency);
        rtcclk_gated_clockVar.setStatus(status);
        rtcclk_gated_clockVar.setOrigin(origin);
        rtcclk_gated_clockVar.enable(rtc_cr_osce);
    } else {
        rtcclk_gated_clockVar.setValue(0L);
        rtcclk_gated_clockVar.setStatus(new Status("Disabled by rtc_cr_clko", Severity.WARNING));
        rtcclk_gated_clockVar.setOrigin("RTCCLK (disabled)");
        rtcclk_gated_clockVar.enable(false);
    }
}
Also used : Status(net.sourceforge.usbdm.deviceEditor.model.Status) BooleanVariable(net.sourceforge.usbdm.deviceEditor.information.BooleanVariable) ChoiceVariable(net.sourceforge.usbdm.deviceEditor.information.ChoiceVariable) Variable(net.sourceforge.usbdm.deviceEditor.information.Variable) LongVariable(net.sourceforge.usbdm.deviceEditor.information.LongVariable) LongVariable(net.sourceforge.usbdm.deviceEditor.information.LongVariable) BooleanVariable(net.sourceforge.usbdm.deviceEditor.information.BooleanVariable) ChoiceVariable(net.sourceforge.usbdm.deviceEditor.information.ChoiceVariable)

Example 7 with ChoiceVariable

use of net.sourceforge.usbdm.deviceEditor.information.ChoiceVariable in project usbdm-eclipse-plugins by podonoghue.

the class SimValidate method validateNonindexedVariables.

/**
 * Updates
 *  - srcVar
 *  - clockVar
 *  - system_erclk32k_clockVar
 *  - sim_sopt1_osc32kselVar
 *  - sim_sopt2_rtcclkoutselVar
 *  - rtc_clkoutVar
 *  - system_usbfs_clockVar
 *
 * @param variable
 * @throws Exception
 */
public void validateNonindexedVariables(Variable variable) throws Exception {
    super.validate(variable);
    // Clock Mapping
    // =================
    final String osc0_peripheral = getStringVariable("osc0_peripheral").getValueAsString();
    final LongVariable osc0_oscer_clockVar = getLongVariable(osc0_peripheral + "/oscer_clock");
    final LongVariable osc0_osc32k_clockVar = getLongVariable(osc0_peripheral + "/osc32k_clock");
    final String osc32k_peripheral = getStringVariable("/SIM/osc32k_peripheral").getValueAsString();
    final LongVariable rtcclk_gated_clockVar = safeGetLongVariable(osc32k_peripheral + "/rtcclk_gated_clock");
    final LongVariable rtc_1hz_clockVar = safeGetLongVariable(osc32k_peripheral + "/rtc_1hz_clock");
    final LongVariable rtc_clkoutVar = safeGetLongVariable("rtc_clkout");
    // MCG
    // =================
    final LongVariable system_low_power_clockVar = getLongVariable("/MCG/system_low_power_clock");
    final LongVariable system_mcgirclk_clockVar = getLongVariable("/MCG/system_mcgirclk_clock");
    final LongVariable system_usb_clkin_clockVar = safeGetLongVariable("/MCG/system_usb_clkin_clock");
    final LongVariable peripheralClockVar = getLongVariable("system_peripheral_clock");
    // Check if CLKDIV3 Present
    // =====================================
    final Long pllPostDiv3Value;
    final String pllPostDiv3Origin;
    final Variable system_peripheral_postdivider_clockVar = safeGetVariable("system_peripheral_postdivider_clock");
    if (system_peripheral_postdivider_clockVar != null) {
        // After divider
        pllPostDiv3Value = system_peripheral_postdivider_clockVar.getValueAsLong();
        pllPostDiv3Origin = system_peripheral_postdivider_clockVar.getOrigin();
    } else {
        // Direct (no divider)
        pllPostDiv3Value = peripheralClockVar.getValueAsLong();
        pllPostDiv3Origin = peripheralClockVar.getOrigin();
    }
    /**
     * Clock selector used for LPUARTs, TPMs and FlexIO
     */
    LpClockSelector clockSelector = new LpClockSelector() {

        @Override
        public void lpClockSelect(String sourceVar, String clockVarId) throws Exception {
            // Clock source select (if present)
            // ===================================
            Variable srcVar = safeGetVariable(sourceVar);
            if (srcVar != null) {
                Variable clockVar = getVariable(clockVarId);
                switch((int) srcVar.getValueAsLong()) {
                    default:
                        srcVar.setValue(0);
                    case // Disabled
                    0:
                        clockVar.setValue(0);
                        clockVar.setStatus((Status) null);
                        clockVar.setOrigin("Disabled");
                        break;
                    case // Peripheral Clock / CLKDIV3
                    1:
                        clockVar.setValue(pllPostDiv3Value);
                        clockVar.setStatus(peripheralClockVar.getStatus());
                        clockVar.setOrigin(pllPostDiv3Origin);
                        break;
                    case // OSCERCLK
                    2:
                        clockVar.setValue(osc0_oscer_clockVar.getValueAsLong());
                        clockVar.setStatus(osc0_oscer_clockVar.getStatus());
                        clockVar.setOrigin(osc0_oscer_clockVar.getOrigin());
                        break;
                    case // MCGIRCLK
                    3:
                        clockVar.setValue(system_mcgirclk_clockVar.getValueAsLong());
                        clockVar.setStatus(system_mcgirclk_clockVar.getStatus());
                        clockVar.setOrigin(system_mcgirclk_clockVar.getOrigin());
                        break;
                }
            }
        }
    };
    // Determine ERCLK32K
    // ==================================
    LongVariable system_erclk32k_clockVar = getLongVariable("system_erclk32k_clock");
    ChoiceVariable sim_sopt1_osc32kselVar = getChoiceVariable("sim_sopt1_osc32ksel");
    switch((int) sim_sopt1_osc32kselVar.getValueAsLong()) {
        case // System oscillator (OSC32KCLK)
        0:
            system_erclk32k_clockVar.setValue(osc0_osc32k_clockVar.getValueAsLong());
            system_erclk32k_clockVar.setOrigin(osc0_osc32k_clockVar.getOrigin());
            system_erclk32k_clockVar.setStatus(osc0_osc32k_clockVar.getStatus());
            break;
        case // RTC 32.768kHz oscillator
        2:
            system_erclk32k_clockVar.setValue(rtcclk_gated_clockVar.getValueAsLong());
            system_erclk32k_clockVar.setOrigin(rtcclk_gated_clockVar.getOrigin());
            system_erclk32k_clockVar.setStatus(rtcclk_gated_clockVar.getStatus());
            break;
        default:
            sim_sopt1_osc32kselVar.setValue(3);
        case // LPO 1 kHz
        3:
            system_erclk32k_clockVar.setValue(system_low_power_clockVar.getValueAsLong());
            system_erclk32k_clockVar.setOrigin(system_low_power_clockVar.getOrigin());
            system_erclk32k_clockVar.setStatus(system_low_power_clockVar.getStatus());
            break;
    }
    // RTC Clock out pin select
    // ============================
    BooleanVariable sim_sopt2_rtcclkoutselVar = safeGetBooleanVariable("sim_sopt2_rtcclkoutsel");
    if (sim_sopt2_rtcclkoutselVar != null) {
        switch((int) sim_sopt2_rtcclkoutselVar.getValueAsLong()) {
            default:
                sim_sopt2_rtcclkoutselVar.setValue(0);
            case // RTC seconds clock = 1Hz
            0:
                rtc_clkoutVar.setValue(rtc_1hz_clockVar.getValueAsLong());
                rtc_clkoutVar.setStatus(rtc_1hz_clockVar.getStatus());
                rtc_clkoutVar.setOrigin(rtc_1hz_clockVar.getOrigin());
                break;
            case // RTC 32.768kHz oscillator
            1:
                rtc_clkoutVar.setValue(rtcclk_gated_clockVar.getValueAsLong());
                rtc_clkoutVar.setStatus(rtcclk_gated_clockVar.getStatus());
                rtc_clkoutVar.setOrigin(rtcclk_gated_clockVar.getOrigin());
                break;
        }
    }
    // UART0 Clock source select (if present)
    // ==========================================
    clockSelector.lpClockSelect("sim_sopt2_uart0src", "system_uart0_clock");
    // LPUARTx Clock source select (if present)
    // ==========================================
    final String[] lpUartInstances = { "", "0", "1", "2" };
    for (String lpUartInstance : lpUartInstances) {
        clockSelector.lpClockSelect("sim_sopt2_lpuart" + lpUartInstance + "src", "system_lpuart" + lpUartInstance + "_clock");
    }
    // TPMx Clock source select (if present)
    // ==========================================
    final String[] tpmInstances = { "", "0", "1", "2" };
    for (String tpmInstance : tpmInstances) {
        clockSelector.lpClockSelect("sim_sopt2_tpm" + tpmInstance + "src", "system_tpm" + tpmInstance + "_clock");
    }
    // USB FS Clock source select
    // ============================
    ChoiceVariable sim_sopt2_usbsrcVar = safeGetChoiceVariable("sim_sopt2_usbsrc");
    if (sim_sopt2_usbsrcVar != null) {
        ChoiceVariable sim_clkdiv2_usbVar = safeGetChoiceVariable("sim_clkdiv2_usb");
        if (sim_clkdiv2_usbVar != null) {
            // USB divider CLKDIV2 exists
            int usbCalcValue = -1;
            if (sim_sopt2_usbsrcVar.getValueAsLong() == 0) {
                // Using USB CLKIN pin
                sim_clkdiv2_usbVar.enable(false);
                sim_clkdiv2_usbVar.setOrigin("Not used with external clock");
                sim_clkdiv2_usbVar.setLocked(false);
            } else {
                // Using internal clock
                // Try to auto calculate divisor
                long clock = peripheralClockVar.getValueAsLong();
                for (int usbdiv = 0; usbdiv <= 7; usbdiv++) {
                    for (int usbfrac = 0; usbfrac <= 1; usbfrac++) {
                        long testValue = Math.round(clock * (usbfrac + 1.0) / (usbdiv + 1.0));
                        if (testValue == 48000000) {
                            usbCalcValue = (usbdiv << 1) + usbfrac;
                            break;
                        }
                    }
                    if (usbCalcValue >= 0) {
                        break;
                    }
                }
                sim_clkdiv2_usbVar.enable(true);
                if (usbCalcValue >= 0) {
                    long temp = sim_clkdiv2_usbVar.getValueAsLong();
                    sim_clkdiv2_usbVar.setRawValue(usbCalcValue);
                    if (sim_clkdiv2_usbVar.getValueAsLong() != temp) {
                        // Trigger update on change
                        sim_clkdiv2_usbVar.notifyListeners();
                    }
                    sim_clkdiv2_usbVar.setOrigin("Automatically calculated from input clock");
                    sim_clkdiv2_usbVar.setLocked(true);
                } else {
                    sim_clkdiv2_usbVar.setOrigin("Manually selected");
                    sim_clkdiv2_usbVar.setLocked(false);
                }
            }
        }
        LongVariable system_usbfs_clockVar = getLongVariable("system_usbfs_clock");
        if (sim_sopt2_usbsrcVar.getValueAsLong() == 0) {
            // Using USB_CLKIN
            system_usbfs_clockVar.setValue(system_usb_clkin_clockVar.getValueAsLong());
            system_usbfs_clockVar.setStatus(system_usb_clkin_clockVar.getStatus());
            system_usbfs_clockVar.setOrigin(system_usb_clkin_clockVar.getOrigin());
        } else {
            // Using internal clock
            if (sim_clkdiv2_usbVar != null) {
                // Peripheral Clock / CLKDIV2
                int usbValue = Long.decode(sim_clkdiv2_usbVar.getSubstitutionValue()).intValue();
                int usbfrac = usbValue & 0x1;
                int usbdiv = (usbValue >> 1) & 0x7;
                long usbPostDiv2 = peripheralClockVar.getValueAsLong() * (usbfrac + 1) / (usbdiv + 1);
                system_usbfs_clockVar.setValue(usbPostDiv2);
                system_usbfs_clockVar.setStatus(peripheralClockVar.getStatus());
                system_usbfs_clockVar.setOrigin(peripheralClockVar.getOrigin() + " after /CLKDIV2");
            } else {
                // Directly using peripheral clock
                system_usbfs_clockVar.setValue(peripheralClockVar.getValueAsLong());
                system_usbfs_clockVar.setStatus(peripheralClockVar.getStatus());
                system_usbfs_clockVar.setOrigin(peripheralClockVar.getOrigin());
            }
        }
    }
}
Also used : BooleanVariable(net.sourceforge.usbdm.deviceEditor.information.BooleanVariable) ChoiceVariable(net.sourceforge.usbdm.deviceEditor.information.ChoiceVariable) Variable(net.sourceforge.usbdm.deviceEditor.information.Variable) LongVariable(net.sourceforge.usbdm.deviceEditor.information.LongVariable) LongVariable(net.sourceforge.usbdm.deviceEditor.information.LongVariable) BooleanVariable(net.sourceforge.usbdm.deviceEditor.information.BooleanVariable) ChoiceVariable(net.sourceforge.usbdm.deviceEditor.information.ChoiceVariable)

Example 8 with ChoiceVariable

use of net.sourceforge.usbdm.deviceEditor.information.ChoiceVariable in project usbdm-eclipse-plugins by podonoghue.

the class SimValidateMKL method validateIndexVariables.

/**
 * Updates
 * - sim_sopt2_pllfllsel[x]
 * - system_peripheral_clock[x]
 * - system_core_clock[x]
 * - system_bus_clock[x]
 * - system_flexbus_clock[x]
 * - system_flash_clock[x]
 * - sim_clkdiv1_outdiv1[x]
 * - sim_clkdiv1_outdiv2[x]
 * - sim_clkdiv1_outdiv3[x]
 * - sim_clkdiv1_outdiv4[x]
 *
 * @param variable
 * @throws Exception
 */
void validateIndexVariables(Variable variable) throws Exception {
    final ChoiceVariable sim_sopt2_pllfllselVar = safeGetChoiceVariable("sim_sopt2_pllfllsel");
    if (sim_sopt2_pllfllselVar != null) {
        final LongVariable system_mcgfllclk_clockVar = safeGetLongVariable("/MCG/system_mcgfllclk_clock");
        final LongVariable system_mcgpllclk_clockVar = safeGetLongVariable("/MCG/system_mcgpllclk_clock");
        final LongVariable usb1pfdclk_ClockVar = safeGetLongVariable("/MCG/usb1pfdclk_Clock");
        final LongVariable system_irc48m_clockVar = safeGetLongVariable("/MCG/system_irc48m_clock");
        // Determine PLLFLLCLOCK
        // =====================================
        final LongVariable peripheralClockVar = getLongVariable("system_peripheral_clock");
        switch((int) sim_sopt2_pllfllselVar.getValueAsLong()) {
            default:
                sim_sopt2_pllfllselVar.setValue(0);
            case 0:
                if (system_mcgfllclk_clockVar != null) {
                    peripheralClockVar.setValue(system_mcgfllclk_clockVar.getValueAsLong());
                    peripheralClockVar.setStatus(system_mcgfllclk_clockVar.getFilteredStatus());
                    peripheralClockVar.setOrigin(system_mcgfllclk_clockVar.getOrigin());
                } else {
                    peripheralClockVar.setValue(0);
                    peripheralClockVar.setStatus(new Status("FLL not present", Severity.ERROR));
                    peripheralClockVar.setOrigin(null);
                }
                break;
            case 1:
                if (system_mcgpllclk_clockVar != null) {
                    peripheralClockVar.setValue(system_mcgpllclk_clockVar.getValueAsLong() / 2);
                    peripheralClockVar.setStatus(system_mcgpllclk_clockVar.getFilteredStatus());
                    peripheralClockVar.setOrigin(system_mcgpllclk_clockVar.getOrigin() + "/2");
                } else {
                    sim_sopt2_pllfllselVar.setValue(0);
                }
                break;
            case 2:
                if (usb1pfdclk_ClockVar != null) {
                    peripheralClockVar.setValue(usb1pfdclk_ClockVar.getValueAsLong());
                    peripheralClockVar.setStatus(usb1pfdclk_ClockVar.getStatus());
                    peripheralClockVar.setOrigin(usb1pfdclk_ClockVar.getOrigin());
                } else {
                    sim_sopt2_pllfllselVar.setValue(0);
                }
                break;
            case 3:
                if (system_irc48m_clockVar != null) {
                    peripheralClockVar.setValue(system_irc48m_clockVar.getValueAsLong());
                    peripheralClockVar.setStatus(system_irc48m_clockVar.getStatus());
                    peripheralClockVar.setOrigin(system_irc48m_clockVar.getOrigin());
                } else {
                    sim_sopt2_pllfllselVar.setValue(0);
                }
                break;
        }
    }
    // ======================================
    final LongVariable system_core_clockVar = getLongVariable("system_core_clock");
    final LongVariable system_bus_clockVar = getLongVariable("system_bus_clock");
    final LongVariable sim_clkdiv1_outdiv1Var = getLongVariable("sim_clkdiv1_outdiv1");
    final LongVariable sim_clkdiv1_outdiv4Var = getLongVariable("sim_clkdiv1_outdiv4");
    // Core & System Clock
    // ===========================================
    // Attempt to find acceptable divisor
    final LongVariable system_mcgoutclk_clockVar = getLongVariable("/MCG/system_mcgoutclk_clock");
    long inputFrequency = system_mcgoutclk_clockVar.getValueAsLong();
    final FindDivisor coreDivisor = new FindDivisor(inputFrequency, system_core_clockVar.getValueAsLong()) {

        @Override
        boolean okValue(int divisor, double frequency) {
            return frequency <= MAX_CORE_CLOCK_FREQ;
        }
    };
    Severity severity = Severity.OK;
    StringBuilder sb = new StringBuilder();
    if (variable == system_core_clockVar) {
        // Clock variable changed - replace with nearest value if found
        if (coreDivisor.divisor == 0) {
            severity = Severity.ERROR;
            sb.append("Illegal Frequency\n");
        }
        sb.append(coreDivisor.divisors);
        system_core_clockVar.setValue(coreDivisor.nearestTargetFrequency);
        system_core_clockVar.setStatus(new Status(sb.toString(), severity));
        sim_clkdiv1_outdiv1Var.setValue(coreDivisor.divisor);
    } else {
        // Clock variable not changed - just validate
        if ((coreDivisor.divisor == 0) || (system_core_clockVar.getValueAsLong() != (coreDivisor.nearestTargetFrequency))) {
            severity = Severity.ERROR;
            sb.append("Illegal Frequency\n");
        }
        sb.append(coreDivisor.divisors);
        system_core_clockVar.setStatus(new Status(sb.toString(), severity));
        sim_clkdiv1_outdiv1Var.setValue(coreDivisor.divisor);
    }
    // Bus & Flash Clock
    // ===========================================
    // Attempt to find acceptable divisor
    final long coreFrequency = system_core_clockVar.getValueAsLong();
    inputFrequency = coreFrequency;
    final FindDivisor flashDivisor = new FindDivisor(inputFrequency, system_bus_clockVar.getValueAsLong()) {

        @Override
        boolean okValue(int divisor, double frequency) {
            return (frequency <= MAX_BUS_CLOCK_FREQ) && (frequency <= coreFrequency);
        }
    };
    severity = Severity.OK;
    sb = new StringBuilder();
    if (variable == system_bus_clockVar) {
        // Clock variable changed - replace with nearest value if found
        if (flashDivisor.divisor == 0) {
            severity = Severity.ERROR;
            sb.append("Illegal Frequency\n");
        }
        sb.append(flashDivisor.divisors);
        system_bus_clockVar.setValue(flashDivisor.nearestTargetFrequency);
        system_bus_clockVar.setStatus(new Status(sb.toString(), severity));
        sim_clkdiv1_outdiv4Var.setValue(flashDivisor.divisor);
    } else {
        // Clock variable not changed - just validate
        if ((flashDivisor.divisor == 0) || (system_bus_clockVar.getValueAsLong() != (flashDivisor.nearestTargetFrequency))) {
            severity = Severity.ERROR;
            sb.append("Illegal Frequency\n");
        }
        sb.append(flashDivisor.divisors);
        system_bus_clockVar.setStatus(new Status(sb.toString(), severity));
        sim_clkdiv1_outdiv4Var.setValue(flashDivisor.divisor);
    }
}
Also used : Status(net.sourceforge.usbdm.deviceEditor.model.Status) LongVariable(net.sourceforge.usbdm.deviceEditor.information.LongVariable) Severity(net.sourceforge.usbdm.deviceEditor.model.Status.Severity) ChoiceVariable(net.sourceforge.usbdm.deviceEditor.information.ChoiceVariable)

Example 9 with ChoiceVariable

use of net.sourceforge.usbdm.deviceEditor.information.ChoiceVariable in project usbdm-eclipse-plugins by podonoghue.

the class SimValidateMKL method validateNonindexedVariables.

/**
 * Updates
 *  - srcVar
 *  - clockVar
 *  - system_erclk32k_clockVar
 *  - sim_sopt1_osc32kselVar
 *  - sim_sopt2_rtcclkoutselVar
 *  - rtc_clkoutVar
 *  - system_usbfs_clockVar
 *
 * @param variable
 * @throws Exception
 */
public void validateNonindexedVariables(Variable variable) throws Exception {
    super.validate(variable);
    // Clock Mapping
    // =================
    final String osc0_peripheral = getStringVariable("osc0_peripheral").getValueAsString();
    final LongVariable osc0_oscer_clockVar = getLongVariable(osc0_peripheral + "/oscer_clock");
    final LongVariable osc0_osc32k_clockVar = getLongVariable(osc0_peripheral + "/osc32k_clock");
    final String rtc_clkin = getStringVariable("rtc_clkin").getValueAsString();
    final LongVariable rtcclkin_clockVar = safeGetLongVariable(rtc_clkin);
    final LongVariable rtc_1hz_clockVar = safeGetLongVariable("/RTC/rtc_1hz_clock");
    final LongVariable rtc_clkoutVar = safeGetLongVariable("rtc_clkout");
    // MCG
    // =================
    final LongVariable system_low_power_clockVar = getLongVariable("/MCG/system_low_power_clock");
    final LongVariable system_mcgirclk_clockVar = getLongVariable("/MCG/system_mcgirclk_clock");
    final LongVariable system_usb_clkin_clockVar = safeGetLongVariable("/MCG/system_usb_clkin_clock");
    LongVariable clockVar = safeGetLongVariable("system_peripheral_clock");
    if (clockVar == null) {
        // Assume no PLL. Peripheral clock is FLL
        clockVar = getLongVariable("/MCG/system_mcgfllclk_clock");
    }
    final LongVariable peripheralClockVar = clockVar;
    // Check if CLKDIV3 Present
    // =====================================
    final Long pllPostDiv3Value;
    final String pllPostDiv3Origin;
    final Variable system_peripheral_postdivider_clockVar = safeGetVariable("system_peripheral_postdivider_clock");
    if (system_peripheral_postdivider_clockVar != null) {
        // After divider
        pllPostDiv3Value = system_peripheral_postdivider_clockVar.getValueAsLong();
        pllPostDiv3Origin = system_peripheral_postdivider_clockVar.getOrigin();
    } else {
        // Direct (no divider)
        pllPostDiv3Value = peripheralClockVar.getValueAsLong();
        pllPostDiv3Origin = peripheralClockVar.getOrigin();
    }
    /**
     * Clock selector used for LPUARTs, TPMs and FlexIO
     */
    LpClockSelector clockSelector = new LpClockSelector() {

        @Override
        public void lpClockSelect(String sourceVar, String clockVarId) throws Exception {
            // Clock source select (if present)
            // ===================================
            Variable srcVar = safeGetVariable(sourceVar);
            if (srcVar != null) {
                Variable clockVar = getVariable(clockVarId);
                switch((int) srcVar.getValueAsLong()) {
                    default:
                        srcVar.setValue(0);
                    case // Disabled
                    0:
                        clockVar.setValue(0);
                        clockVar.setStatus((Status) null);
                        clockVar.setOrigin("Disabled");
                        break;
                    case // Peripheral Clock / CLKDIV3
                    1:
                        clockVar.setValue(pllPostDiv3Value);
                        clockVar.setStatus(peripheralClockVar.getStatus());
                        clockVar.setOrigin(pllPostDiv3Origin);
                        break;
                    case // OSCERCLK
                    2:
                        clockVar.setValue(osc0_oscer_clockVar.getValueAsLong());
                        clockVar.setStatus(osc0_oscer_clockVar.getStatus());
                        clockVar.setOrigin(osc0_oscer_clockVar.getOrigin());
                        break;
                    case // MCGIRCLK
                    3:
                        clockVar.setValue(system_mcgirclk_clockVar.getValueAsLong());
                        clockVar.setStatus(system_mcgirclk_clockVar.getStatus());
                        clockVar.setOrigin(system_mcgirclk_clockVar.getOrigin());
                        break;
                }
            }
        }
    };
    // Determine ERCLK32K
    // ==================================
    LongVariable system_erclk32k_clockVar = getLongVariable("system_erclk32k_clock");
    ChoiceVariable sim_sopt1_osc32kselVar = safeGetChoiceVariable("sim_sopt1_osc32ksel");
    if (sim_sopt1_osc32kselVar == null) {
        // No RTC etc
        system_erclk32k_clockVar.setValue(osc0_osc32k_clockVar.getValueAsLong());
        system_erclk32k_clockVar.setOrigin(osc0_osc32k_clockVar.getOrigin());
        system_erclk32k_clockVar.setStatus(osc0_osc32k_clockVar.getStatus());
    } else {
        switch((int) sim_sopt1_osc32kselVar.getValueAsLong()) {
            case // System oscillator (OSC32KCLK)
            0:
                system_erclk32k_clockVar.setValue(osc0_osc32k_clockVar.getValueAsLong());
                system_erclk32k_clockVar.setOrigin(osc0_osc32k_clockVar.getOrigin());
                system_erclk32k_clockVar.setStatus(osc0_osc32k_clockVar.getStatus());
                break;
            case // RTC CLK_IN
            2:
                system_erclk32k_clockVar.setValue(rtcclkin_clockVar.getValueAsLong());
                system_erclk32k_clockVar.setOrigin(rtcclkin_clockVar.getOrigin());
                system_erclk32k_clockVar.setStatus(rtcclkin_clockVar.getStatus());
                break;
            default:
                sim_sopt1_osc32kselVar.setValue(3);
            case // LPO 1 kHz
            3:
                system_erclk32k_clockVar.setValue(system_low_power_clockVar.getValueAsLong());
                system_erclk32k_clockVar.setOrigin(system_low_power_clockVar.getOrigin());
                system_erclk32k_clockVar.setStatus(system_low_power_clockVar.getStatus());
                break;
        }
    }
    // RTC Clock out pin select
    // ============================
    BooleanVariable sim_sopt2_rtcclkoutselVar = safeGetBooleanVariable("sim_sopt2_rtcclkoutsel");
    if (sim_sopt2_rtcclkoutselVar != null) {
        switch((int) sim_sopt2_rtcclkoutselVar.getValueAsLong()) {
            default:
                sim_sopt2_rtcclkoutselVar.setValue(0);
            case // RTC seconds clock = 1Hz
            0:
                rtc_clkoutVar.setValue(rtc_1hz_clockVar.getValueAsLong());
                rtc_clkoutVar.setStatus(rtc_1hz_clockVar.getStatus());
                rtc_clkoutVar.setOrigin(rtc_1hz_clockVar.getOrigin());
                break;
            case // OSCERCLK
            1:
                rtc_clkoutVar.setValue(osc0_oscer_clockVar.getValueAsLong());
                rtc_clkoutVar.setStatus(osc0_oscer_clockVar.getStatus());
                rtc_clkoutVar.setOrigin(osc0_oscer_clockVar.getOrigin());
                break;
        }
    }
    // UART0 Clock source select (if present)
    // ==========================================
    clockSelector.lpClockSelect("sim_sopt2_uart0src", "system_uart0_clock");
    // LPUARTx Clock source select (if present)
    // ==========================================
    final String[] lpUartInstances = { "", "0", "1", "2" };
    for (String lpUartInstance : lpUartInstances) {
        clockSelector.lpClockSelect("sim_sopt2_lpuart" + lpUartInstance + "src", "system_lpuart" + lpUartInstance + "_clock");
    }
    // TPMx Clock source select (if present)
    // ==========================================
    final String[] tpmInstances = { "", "0", "1", "2" };
    for (String tpmInstance : tpmInstances) {
        clockSelector.lpClockSelect("sim_sopt2_tpm" + tpmInstance + "src", "system_tpm" + tpmInstance + "_clock");
    }
    // FLEXIO Clock source select (if present)
    // ==========================================
    clockSelector.lpClockSelect("sim_sopt2_flexiosrc", "system_flexio_clock");
    // USB FS Clock source select
    // ============================
    ChoiceVariable sim_sopt2_usbsrcVar = safeGetChoiceVariable("sim_sopt2_usbsrc");
    if (sim_sopt2_usbsrcVar != null) {
        ChoiceVariable sim_clkdiv2_usbVar = safeGetChoiceVariable("sim_clkdiv2_usb");
        if (sim_clkdiv2_usbVar != null) {
            // USB divider CLKDIV2 exists
            int usbCalcValue = -1;
            if (sim_sopt2_usbsrcVar.getValueAsLong() == 0) {
                // Using USB CLKIN pin
                sim_clkdiv2_usbVar.enable(false);
                sim_clkdiv2_usbVar.setOrigin("Not used with external clock");
                sim_clkdiv2_usbVar.setLocked(false);
            } else {
                // Using internal clock
                // Try to auto calculate divisor
                long clock = peripheralClockVar.getValueAsLong();
                for (int usbdiv = 0; usbdiv <= 7; usbdiv++) {
                    for (int usbfrac = 0; usbfrac <= 1; usbfrac++) {
                        long testValue = Math.round(clock * (usbfrac + 1.0) / (usbdiv + 1.0));
                        if (testValue == 48000000) {
                            usbCalcValue = (usbdiv << 1) + usbfrac;
                            break;
                        }
                    }
                    if (usbCalcValue >= 0) {
                        break;
                    }
                }
                sim_clkdiv2_usbVar.enable(true);
                if (usbCalcValue >= 0) {
                    long temp = sim_clkdiv2_usbVar.getValueAsLong();
                    sim_clkdiv2_usbVar.setRawValue(usbCalcValue);
                    if (sim_clkdiv2_usbVar.getValueAsLong() != temp) {
                        // Trigger update on change
                        sim_clkdiv2_usbVar.notifyListeners();
                    }
                    sim_clkdiv2_usbVar.setOrigin("Automatically calculated from input clock");
                    sim_clkdiv2_usbVar.setLocked(true);
                } else {
                    sim_clkdiv2_usbVar.setOrigin("Manually selected");
                    sim_clkdiv2_usbVar.setLocked(false);
                }
            }
        }
        LongVariable system_usbfs_clockVar = getLongVariable("system_usbfs_clock");
        if (sim_sopt2_usbsrcVar.getValueAsLong() == 0) {
            // Using USB_CLKIN
            system_usbfs_clockVar.setValue(system_usb_clkin_clockVar.getValueAsLong());
            system_usbfs_clockVar.setStatus(system_usb_clkin_clockVar.getStatus());
            system_usbfs_clockVar.setOrigin(system_usb_clkin_clockVar.getOrigin());
        } else {
            // Using internal clock
            if (sim_clkdiv2_usbVar != null) {
                // Peripheral Clock / CLKDIV2
                int usbValue = Long.decode(sim_clkdiv2_usbVar.getSubstitutionValue()).intValue();
                int usbfrac = usbValue & 0x1;
                int usbdiv = (usbValue >> 1) & 0x7;
                long usbPostDiv2 = peripheralClockVar.getValueAsLong() * (usbfrac + 1) / (usbdiv + 1);
                system_usbfs_clockVar.setValue(usbPostDiv2);
                system_usbfs_clockVar.setStatus(peripheralClockVar.getStatus());
                system_usbfs_clockVar.setOrigin(peripheralClockVar.getOrigin() + " after /CLKDIV2");
            } else {
                // Directly using peripheral clock
                system_usbfs_clockVar.setValue(peripheralClockVar.getValueAsLong());
                system_usbfs_clockVar.setStatus(peripheralClockVar.getStatus());
                system_usbfs_clockVar.setOrigin(peripheralClockVar.getOrigin());
            }
        }
    }
}
Also used : BooleanVariable(net.sourceforge.usbdm.deviceEditor.information.BooleanVariable) ChoiceVariable(net.sourceforge.usbdm.deviceEditor.information.ChoiceVariable) Variable(net.sourceforge.usbdm.deviceEditor.information.Variable) LongVariable(net.sourceforge.usbdm.deviceEditor.information.LongVariable) LongVariable(net.sourceforge.usbdm.deviceEditor.information.LongVariable) BooleanVariable(net.sourceforge.usbdm.deviceEditor.information.BooleanVariable) ChoiceVariable(net.sourceforge.usbdm.deviceEditor.information.ChoiceVariable)

Example 10 with ChoiceVariable

use of net.sourceforge.usbdm.deviceEditor.information.ChoiceVariable in project usbdm-eclipse-plugins by podonoghue.

the class ClockValidator_MK_ICS48M method validateClocks.

protected void validateClocks(Variable variable) throws Exception {
    // System.err.println(getSimpleClassName()+" Var = "+variable);
    super.validate(variable);
    StringVariable clockConfig = safeGetStringVariable("ClockConfig");
    clockConfig.setStatus(isValidCIdentifier(clockConfig.getValueAsString()) ? (String) null : "Illegal C enum value");
    // OSC0 Clock monitor
    // =================================
    Variable mcg_c6_cme0Var = getVariable("mcg_c6_cme0");
    Variable mcg_c2_locre0Var = getVariable("mcg_c2_locre0");
    mcg_c2_locre0Var.enable(mcg_c6_cme0Var.getValueAsBoolean());
    // OSC1 (RTC) Clock monitor
    // =================================
    Variable mcg_c8_cme1Var = getVariable("mcg_c8_cme1");
    Variable mcg_c8_locre1Var = getVariable("mcg_c8_locre1");
    mcg_c8_locre1Var.enable(mcg_c8_cme1Var.getValueAsBoolean());
    // PLL monitor
    // =================================
    Variable mcg_c9_pll_cmeVar = safeGetVariable("mcg_c9_pll_cme");
    if (mcg_c9_pll_cmeVar != null) {
        getVariable("mcg_c9_pll_locre").enable(mcg_c9_pll_cmeVar.getValueAsBoolean());
    }
    // =================================
    Variable system_irc48m_clockVar = safeGetVariable("system_irc48m_clock");
    Variable system_mcgfllclk_clockVar = getVariable("system_mcgfllclk_clock");
    Variable mcg_c4_dmx32Var = getVariable("mcg_c4_dmx32");
    Variable mcg_c1_frdivVar = getVariable("mcg_c1_frdiv");
    Variable mcg_c4_drst_drsVar = getVariable("mcg_c4_drst_drs");
    Variable pll0EnabledVar = getVariable("pll0Enabled");
    Variable pll0InputFrequencyVar = getVariable("pll0InputFrequency");
    Variable pll0OutputFrequency = getVariable("pll0OutputFrequency");
    Variable mcg_c5_pllclkenVar = getVariable("mcg_c5_pllclken");
    Variable mcg_c5_pllstenVar = getVariable("mcg_c5_pllsten");
    Variable mcg_c5_prdiv0Var = getVariable("mcg_c5_prdiv0");
    Variable mcg_c6_vdiv0Var = getVariable("mcg_c6_vdiv0");
    Variable system_mcgpllclk_clockVar = getVariable("system_mcgpllclk_clock");
    Variable system_mcgoutclk_clock_sourceVar = getVariable("system_mcgoutclk_clock_source");
    Variable system_mcgoutclk_clockVar = getVariable("system_mcgoutclk_clock");
    Variable mcg_c1_irefsVar = getVariable("mcg_c1_irefs");
    Variable mcg_c1_clksVar = getVariable("mcg_c1_clks");
    Variable mcg_c2_lpVar = getVariable("mcg_c2_lp");
    Variable mcg_c6_pllsVar = getVariable("mcg_c6_plls");
    // Determine MCGIRCLK (not gated/undivided and gated)
    // ========================================
    Variable mcg_sc_fcrdivVar = safeGetVariable("mcg_sc_fcrdiv");
    Variable system_fast_irc_clockVar = getVariable("system_fast_irc_clock");
    Variable system_slow_irc_clockVar = getVariable("system_slow_irc_clock");
    Variable mcg_c2_ircsVar = getVariable("mcg_c2_ircs");
    Variable system_mcgir_ungated_clock = new LongVariable("system_mcgir_ungated", null);
    if (mcg_c2_ircsVar.getValueAsBoolean()) {
        // Fast IRC selected
        if (mcg_sc_fcrdivVar != null) {
            // Variable divisor
            long mcg_sc_fcrdiv = mcg_sc_fcrdivVar.getValueAsLong();
            system_mcgir_ungated_clock.setOrigin("(Fast IRC)/FCRDIV");
            system_mcgir_ungated_clock.setValue(system_fast_irc_clockVar.getValueAsLong() / (1 << mcg_sc_fcrdiv));
        } else {
            // Fixed divisor of 2
            system_mcgir_ungated_clock.setOrigin("(Fast IRC)/2");
            system_mcgir_ungated_clock.setValue(system_fast_irc_clockVar.getValueAsLong() / 2);
        }
    } else {
        // Slow IRC selected
        system_mcgir_ungated_clock.setOrigin("Slow IRC");
        system_mcgir_ungated_clock.setValue(system_slow_irc_clockVar.getValueAsLong());
    }
    Variable system_mcgirclk_clockVar = getVariable("system_mcgirclk_clock");
    system_mcgirclk_clockVar.setOrigin(system_mcgir_ungated_clock.getOrigin());
    Variable mcg_c1_irclkenVar = getVariable("mcg_c1_irclken");
    Variable mcg_c1_irefstenVar = getVariable("mcg_c1_irefsten");
    if (mcg_c1_irclkenVar.getValueAsBoolean()) {
        // Enabled
        system_mcgirclk_clockVar.setValue(system_mcgir_ungated_clock.getValueAsLong());
        system_mcgirclk_clockVar.setStatus((Status) null);
        system_mcgirclk_clockVar.enable(true);
        mcg_c1_irefstenVar.enable(true);
    } else {
        // Disabled
        system_mcgirclk_clockVar.setValue(0);
        system_mcgirclk_clockVar.setStatus(new Status("Disabled by mcg_c1_irclken", Severity.OK));
        system_mcgirclk_clockVar.enable(false);
        mcg_c1_irefstenVar.enable(false);
    }
    // Clock Mapping
    // =================
    String osc0_peripheral = getStringVariable("/SIM/osc0_peripheral").getValueAsString();
    LongVariable osc0_osc_clockVar = getLongVariable(osc0_peripheral + "/osc_clock");
    String osc32k_peripheral = getStringVariable("/SIM/osc32k_peripheral").getValueAsString();
    LongVariable osc32k_osc_clockVar = getLongVariable(osc32k_peripheral + "/osc_clock");
    // Determine MCG external reference clock [mcg_erc_clock]
    // ========================================================
    ChoiceVariable mcg_c7_oscselVar = safeGetChoiceVariable("mcg_c7_oscsel");
    Variable mcg_erc_clockVar = getVariable("mcg_erc_clock");
    switch((int) mcg_c7_oscselVar.getValueAsLong()) {
        default:
        case // ERC = OSCCLK (OSC0 main oscillator)
        0:
            mcg_erc_clockVar.setValue(osc0_osc_clockVar.getValueAsLong());
            mcg_erc_clockVar.setStatus(osc0_osc_clockVar.getFilteredStatus());
            mcg_erc_clockVar.setOrigin(osc0_osc_clockVar.getOrigin());
            break;
        case // ERC = RTCCLK (OSC1 oscillator)
        1:
            mcg_erc_clockVar.setValue(osc32k_osc_clockVar.getValueAsLong());
            mcg_erc_clockVar.setStatus(osc32k_osc_clockVar.getFilteredStatus());
            mcg_erc_clockVar.setOrigin(osc32k_osc_clockVar.getOrigin() + "[RTCCLK]");
            break;
        case // ERC = IRC48MCLK (OSC2)
        2:
            mcg_erc_clockVar.setValue(system_irc48m_clockVar.getValueAsLong());
            mcg_erc_clockVar.setStatus((Status) null);
            mcg_erc_clockVar.setOrigin("IRC48MCLK");
            break;
    }
    Variable mcg_c11_pllcsVar = safeGetVariable("mcg_c11_pllcs");
    boolean pllIsInternal = (mcg_c11_pllcsVar == null) || !mcg_c11_pllcsVar.getValueAsBoolean();
    // Main clock mode
    // ===============================
    int mcg_c1_clks;
    int mcg_c6_plls;
    int mcg_c2_lp;
    boolean mcg_c1_irefs;
    // Main clock mode
    // ====================
    ClockMode clock_mode = ClockMode.valueOf(getVariable("clock_mode").getSubstitutionValue());
    Variable fll_enabledVar = getVariable("fll_enabled");
    Variable fllInputFrequencyVar = getVariable("fllInputFrequency");
    switch(clock_mode) {
        default:
        case ClockMode_None:
            mcg_c1_clks = 0;
            mcg_c6_plls = 0;
            mcg_c2_lp = 0;
            mcg_c1_irefs = true;
            system_mcgoutclk_clock_sourceVar.setValue("FLL output");
            pll0EnabledVar.setValue(mcg_c5_pllclkenVar.getValueAsBoolean());
            fll_enabledVar.setValue(true);
            break;
        case ClockMode_FEI:
            mcg_c1_clks = 0;
            mcg_c6_plls = 0;
            mcg_c2_lp = 0;
            mcg_c1_irefs = true;
            system_mcgoutclk_clock_sourceVar.setValue("FLL output");
            pll0EnabledVar.setValue(mcg_c5_pllclkenVar.getValueAsBoolean());
            fll_enabledVar.setValue(true);
            break;
        case ClockMode_FEE:
            mcg_c1_clks = 0;
            mcg_c6_plls = 0;
            mcg_c2_lp = 0;
            mcg_c1_irefs = false;
            system_mcgoutclk_clock_sourceVar.setValue("FLL output");
            pll0EnabledVar.setValue(mcg_c5_pllclkenVar.getValueAsBoolean());
            fll_enabledVar.setValue(true);
            break;
        case ClockMode_FBI:
            mcg_c1_clks = 1;
            mcg_c6_plls = 0;
            mcg_c2_lp = 0;
            mcg_c1_irefs = true;
            system_mcgoutclk_clock_sourceVar.setValue("MCGIRCLK");
            pll0EnabledVar.setValue(mcg_c5_pllclkenVar.getValueAsBoolean());
            fll_enabledVar.setValue(true);
            break;
        case ClockMode_FBE:
            mcg_c1_clks = 2;
            mcg_c6_plls = 0;
            mcg_c2_lp = 0;
            mcg_c1_irefs = false;
            system_mcgoutclk_clock_sourceVar.setValue("MCGERCLK");
            pll0EnabledVar.setValue(mcg_c5_pllclkenVar.getValueAsBoolean());
            fll_enabledVar.setValue(true);
            break;
        case ClockMode_BLPI:
            mcg_c1_clks = 1;
            mcg_c6_plls = 0;
            mcg_c2_lp = 1;
            mcg_c1_irefs = true;
            system_mcgoutclk_clock_sourceVar.setValue("MCGIRCLK");
            pll0EnabledVar.setValue(mcg_c5_pllclkenVar.getValueAsBoolean());
            fll_enabledVar.setValue(false);
            break;
        case ClockMode_BLPE:
            mcg_c1_clks = 2;
            mcg_c6_plls = 0;
            mcg_c2_lp = 1;
            mcg_c1_irefs = false;
            system_mcgoutclk_clock_sourceVar.setValue("MCGERCLK");
            pll0EnabledVar.setValue(mcg_c5_pllclkenVar.getValueAsBoolean());
            fll_enabledVar.setValue(false);
            break;
        case ClockMode_PBE:
            mcg_c1_clks = 2;
            mcg_c6_plls = 1;
            mcg_c2_lp = 0;
            mcg_c1_irefs = false;
            system_mcgoutclk_clock_sourceVar.setValue("MCGERCLK");
            pll0EnabledVar.setValue(pllIsInternal || mcg_c5_pllclkenVar.getValueAsBoolean());
            fll_enabledVar.setValue(false);
            break;
        case ClockMode_PEE:
            mcg_c1_clks = 0;
            mcg_c6_plls = 1;
            mcg_c2_lp = 0;
            mcg_c1_irefs = false;
            system_mcgoutclk_clock_sourceVar.setValue("PLL output");
            pll0EnabledVar.setValue(pllIsInternal || mcg_c5_pllclkenVar.getValueAsBoolean());
            fll_enabledVar.setValue(false);
            break;
    }
    mcg_c1_clksVar.setValue(mcg_c1_clks);
    mcg_c6_pllsVar.setValue(mcg_c6_plls);
    mcg_c2_lpVar.setValue(mcg_c2_lp);
    mcg_c1_irefsVar.setValue(mcg_c1_irefs);
    Variable osc0_osc_cr_erclkenVar = safeGetBooleanVariable(osc0_peripheral + "/osc_cr_erclken");
    // =======================================
    // Find FLL dividers
    FllConfigure fllCheck = new FllConfigure(osc0_osc_cr_erclkenVar, safeGetVariable(osc0_peripheral + "/oscillatorRange"), getVariable("mcg_c2_range"), mcg_c1_irefs, mcg_erc_clockVar, system_slow_irc_clockVar.getValueAsLong(), mcg_c7_oscselVar.getValueAsLong(), mcg_c4_dmx32Var.getValueAsBoolean(), fllInputFrequencyVar, system_mcgfllclk_clockVar, getVariable("system_mcgffclk_clock"), DRST_DRS_MAX);
    mcg_c1_frdivVar.setValue(fllCheck.mcg_c1_frdiv);
    mcg_c4_drst_drsVar.setValue(fllCheck.mcg_c4_drst_drs);
    // External PLLs
    // =================================================
    Variable usb1pfdclk_ClockVar = safeGetVariable("usb1pfdclk_Clock");
    if (usb1pfdclk_ClockVar != null) {
        // Check USB HS PLL
        long irClockFreq = osc0_osc_clockVar.getValueAsLong();
        String failedPreCondition = null;
        if (!osc0_osc_cr_erclkenVar.getValueAsBoolean()) {
            failedPreCondition = "Disabled: to use PFDCLK, OSCCLK clock must be enabled by osc_cr_erclkenVar";
        } else if (!mcg_c1_irclkenVar.getValueAsBoolean()) {
            failedPreCondition = "Disabled: to use PFDCLK, IRC clock must be enabled by mcg_c1_irclken";
        } else if ((irClockFreq != 12000000) && (irClockFreq != 16000000) && (irClockFreq != 24000000)) {
            failedPreCondition = "Disabled: to use PFDCLK, OSCCLK must be in [12Mhz, 16MHz, 24MHz]";
        }
        if (failedPreCondition == null) {
            usb1pfdclk_ClockVar.enable(true);
            usb1pfdclk_ClockVar.setOrigin("Clock from USB HS PLL");
            usb1pfdclk_ClockVar.setStatus((Status) null);
        } else {
            usb1pfdclk_ClockVar.enable(false);
            usb1pfdclk_ClockVar.setOrigin("Clock from USB HS PLL (disabled)");
            usb1pfdclk_ClockVar.setStatus(new Status(failedPreCondition, Severity.WARNING));
        }
    }
    // Internal PLL
    // ========================================
    // Find PLL divider
    PllConfigure pllConfigure = new PllConfigure(PLL_OUT_MIN, PLL_OUT_MAX, PLL_IN_MIN, PLL_IN_MAX, PRDIV_MIN, PRDIV_MAX, VDIV_MIN, VDIV_MAX, PLL_POST_DIV);
    pllConfigure.validate(mcg_erc_clockVar, pll0InputFrequencyVar, pll0OutputFrequency, mcg_c5_prdiv0Var, mcg_c6_vdiv0Var);
    boolean pll0Enabled = pll0EnabledVar.getValueAsBoolean();
    pll0InputFrequencyVar.enable(pll0Enabled);
    mcg_c5_prdiv0Var.enable(pll0Enabled);
    mcg_c6_vdiv0Var.enable(pll0Enabled);
    mcg_c5_pllstenVar.enable(pll0Enabled);
    if (pll0Enabled) {
        pll0OutputFrequency.enable(pll0InputFrequencyVar.getFilteredStatus() == null);
        pll0OutputFrequency.setStatus(pllConfigure.getPllStatus());
    } else {
        pll0OutputFrequency.enable(false);
        pll0OutputFrequency.setStatus(new Status("PLL is disabled", Severity.WARNING));
    }
    if (pllIsInternal) {
        // Internal PLL
        system_mcgpllclk_clockVar.setValue(pll0OutputFrequency.getValueAsLong());
        system_mcgpllclk_clockVar.setOrigin(pll0OutputFrequency.getOrigin());
        system_mcgpllclk_clockVar.setStatus(pll0OutputFrequency.getFilteredStatus());
    } else {
        // External PLL (USB1 (HS) PHY)
        system_mcgpllclk_clockVar.setValue(usb1pfdclk_ClockVar.getValueAsLong());
        system_mcgpllclk_clockVar.setOrigin(usb1pfdclk_ClockVar.getOrigin());
        system_mcgpllclk_clockVar.setStatus(usb1pfdclk_ClockVar.getFilteredStatus());
    }
    // ======================================
    // FLL status
    boolean fllEnabled = fll_enabledVar.getValueAsBoolean();
    fllInputFrequencyVar.enable(fllEnabled);
    if (fllEnabled) {
        boolean fllInputIsOK = (fllInputFrequencyVar.getStatus() == null) || (fllCheck.getFllStatus().getSeverity().lessThan(Severity.WARNING));
        system_mcgfllclk_clockVar.enable(fllInputIsOK);
        system_mcgfllclk_clockVar.setStatus(fllCheck.getFllStatus());
    } else {
        system_mcgfllclk_clockVar.enable(false);
        system_mcgfllclk_clockVar.setStatus(new Status("FLL is disabled", Severity.WARNING));
    }
    mcg_c4_dmx32Var.enable(fllEnabled);
    mcg_c4_drst_drsVar.enable(fllEnabled);
    // Main clock mode
    // ===============================
    Status clock_mode_Status = null;
    switch(clock_mode) {
        default:
        case ClockMode_None:
            system_mcgoutclk_clockVar.setValue(system_mcgfllclk_clockVar.getValueAsLong());
            system_mcgoutclk_clockVar.setOrigin(system_mcgfllclk_clockVar.getOrigin());
            system_mcgoutclk_clockVar.setStatus((Status) null);
            clock_mode_Status = new Status("No clock settings are applied", Severity.WARNING);
            break;
        case ClockMode_FEI:
            system_mcgoutclk_clockVar.setValue(system_mcgfllclk_clockVar.getValueAsLong());
            system_mcgoutclk_clockVar.setOrigin(system_mcgfllclk_clockVar.getOrigin());
            system_mcgoutclk_clockVar.setStatus(system_mcgfllclk_clockVar.getFilteredStatus());
            break;
        case ClockMode_FEE:
            system_mcgoutclk_clockVar.setValue(system_mcgfllclk_clockVar.getValueAsLong());
            system_mcgoutclk_clockVar.setOrigin(system_mcgfllclk_clockVar.getOrigin());
            system_mcgoutclk_clockVar.setStatus(system_mcgfllclk_clockVar.getFilteredStatus());
            break;
        case ClockMode_FBI:
            system_mcgoutclk_clockVar.setValue(system_mcgir_ungated_clock.getValueAsLong());
            system_mcgoutclk_clockVar.setOrigin(system_mcgir_ungated_clock.getOrigin());
            system_mcgoutclk_clockVar.setStatus(system_mcgir_ungated_clock.getFilteredStatus());
            break;
        case ClockMode_FBE:
            system_mcgoutclk_clockVar.setValue(mcg_erc_clockVar.getValueAsLong());
            system_mcgoutclk_clockVar.setOrigin(mcg_erc_clockVar.getOrigin());
            system_mcgoutclk_clockVar.setStatus(mcg_erc_clockVar.getFilteredStatus());
            break;
        case ClockMode_BLPI:
            system_mcgoutclk_clockVar.setValue(system_mcgir_ungated_clock.getValueAsLong());
            system_mcgoutclk_clockVar.setOrigin(system_mcgir_ungated_clock.getOrigin());
            system_mcgoutclk_clockVar.setStatus(system_mcgir_ungated_clock.getFilteredStatus());
            break;
        case ClockMode_BLPE:
            system_mcgoutclk_clockVar.setValue(mcg_erc_clockVar.getValueAsLong());
            system_mcgoutclk_clockVar.setOrigin(mcg_erc_clockVar.getOrigin());
            system_mcgoutclk_clockVar.setStatus(mcg_erc_clockVar.getFilteredStatus());
            break;
        case ClockMode_PBE:
            system_mcgoutclk_clockVar.setValue(mcg_erc_clockVar.getValueAsLong());
            system_mcgoutclk_clockVar.setOrigin(mcg_erc_clockVar.getOrigin());
            system_mcgoutclk_clockVar.setStatus(mcg_erc_clockVar.getFilteredStatus());
            break;
        case ClockMode_PEE:
            system_mcgoutclk_clockVar.setValue(system_mcgpllclk_clockVar.getValueAsLong());
            system_mcgoutclk_clockVar.setOrigin(system_mcgpllclk_clockVar.getOrigin());
            system_mcgoutclk_clockVar.setStatus(system_mcgpllclk_clockVar.getFilteredStatus());
            break;
    }
    system_mcgoutclk_clock_sourceVar.setStatus(clock_mode_Status);
    system_mcgoutclk_clock_sourceVar.setOrigin(system_mcgoutclk_clockVar.getOrigin());
}
Also used : Status(net.sourceforge.usbdm.deviceEditor.model.Status) StringVariable(net.sourceforge.usbdm.deviceEditor.information.StringVariable) ChoiceVariable(net.sourceforge.usbdm.deviceEditor.information.ChoiceVariable) Variable(net.sourceforge.usbdm.deviceEditor.information.Variable) LongVariable(net.sourceforge.usbdm.deviceEditor.information.LongVariable) LongVariable(net.sourceforge.usbdm.deviceEditor.information.LongVariable) StringVariable(net.sourceforge.usbdm.deviceEditor.information.StringVariable) ChoiceVariable(net.sourceforge.usbdm.deviceEditor.information.ChoiceVariable)

Aggregations

ChoiceVariable (net.sourceforge.usbdm.deviceEditor.information.ChoiceVariable)19 LongVariable (net.sourceforge.usbdm.deviceEditor.information.LongVariable)17 BooleanVariable (net.sourceforge.usbdm.deviceEditor.information.BooleanVariable)13 Variable (net.sourceforge.usbdm.deviceEditor.information.Variable)11 Status (net.sourceforge.usbdm.deviceEditor.model.Status)7 DoubleVariable (net.sourceforge.usbdm.deviceEditor.information.DoubleVariable)5 StringVariable (net.sourceforge.usbdm.deviceEditor.information.StringVariable)5 PinListVariable (net.sourceforge.usbdm.deviceEditor.information.PinListVariable)2 Signal (net.sourceforge.usbdm.deviceEditor.information.Signal)2 Severity (net.sourceforge.usbdm.deviceEditor.model.Status.Severity)2 FileNotFoundException (java.io.FileNotFoundException)1 ArrayList (java.util.ArrayList)1 BitmaskVariable (net.sourceforge.usbdm.deviceEditor.information.BitmaskVariable)1 IndexedCategoryVariable (net.sourceforge.usbdm.deviceEditor.information.IndexedCategoryVariable)1 IrqVariable (net.sourceforge.usbdm.deviceEditor.information.IrqVariable)1 MappingInfo (net.sourceforge.usbdm.deviceEditor.information.MappingInfo)1 NumericListVariable (net.sourceforge.usbdm.deviceEditor.information.NumericListVariable)1 InfoTable (net.sourceforge.usbdm.deviceEditor.information.Peripheral.InfoTable)1 Pin (net.sourceforge.usbdm.deviceEditor.information.Pin)1 Pair (net.sourceforge.usbdm.deviceEditor.information.Variable.Pair)1