385 lines
14 KiB
JavaScript
385 lines
14 KiB
JavaScript
|
|
let Common = system.getScript("/driverlib/Common.js");
|
||
|
|
let Pinmux = system.getScript("/driverlib/pinmux.js");
|
||
|
|
|
||
|
|
let device_driverlib_peripheral =
|
||
|
|
system.getScript("/driverlib/device_driverlib_peripherals/" +
|
||
|
|
Common.getDeviceName().toLowerCase() + "_dac.js");
|
||
|
|
|
||
|
|
/* Intro splash on GUI */
|
||
|
|
let longDescription = "DAC";
|
||
|
|
|
||
|
|
var DAC_INSTANCE = [
|
||
|
|
{ name: "DACA_BASE", displayName: "DACA"},
|
||
|
|
{ name: "DACB_BASE", displayName: "DACB"},
|
||
|
|
{ name: "DACC_BASE", displayName: "DACC"},
|
||
|
|
]
|
||
|
|
|
||
|
|
function onChangeDACVref(inst, ui)
|
||
|
|
{
|
||
|
|
if (["F28004x", "F28003x", "F28P65x"].includes(Common.getDeviceName())){
|
||
|
|
if (inst.referenceVoltage == device_driverlib_peripheral.DAC_ReferenceVoltage[0].name){
|
||
|
|
ui.gainMode.hidden = true
|
||
|
|
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
ui.gainMode.hidden = false
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
function onChangeLoadMode(inst, ui)
|
||
|
|
{
|
||
|
|
if (inst.loadMode == device_driverlib_peripheral.DAC_LoadMode[0].name){
|
||
|
|
ui.ePWMSyncSignal.hidden = true
|
||
|
|
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
ui.ePWMSyncSignal.hidden = false
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
var dacStatic = undefined;
|
||
|
|
|
||
|
|
/* determine ASYSCTL static module dependency */
|
||
|
|
if (["F28004x","F28003x", "F28P65x"].includes(Common.getDeviceName()))
|
||
|
|
{
|
||
|
|
dacStatic = {
|
||
|
|
name: "dacGlobal",
|
||
|
|
displayName: "DAC Global",
|
||
|
|
modules: Common.autoForce("asysctl", "/driverlib/asysctl.js")
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
var numberOfDACs = 3;
|
||
|
|
|
||
|
|
if (["F28004x", "F28003x", "F28P65x"].includes(Common.getDeviceName()))
|
||
|
|
{
|
||
|
|
DAC_INSTANCE = [
|
||
|
|
{ name: "DACA_BASE", displayName: "DACA"},
|
||
|
|
{ name: "DACB_BASE", displayName: "DACB"},
|
||
|
|
];
|
||
|
|
numberOfDACs = 2;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Array of possible ePWM sync signals */
|
||
|
|
var ePWMInstances = Common.peripheralCount("EPWM")
|
||
|
|
var ePWMArray = [];
|
||
|
|
for(var i = 0; i < ePWMInstances; i++) {
|
||
|
|
ePWMArray.push()
|
||
|
|
ePWMArray.push({ name: ""+(i+1), displayName: "EPWM"+(i+1)+"SYNCPER"})
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Array of DAC configurables that are common across device families */
|
||
|
|
let config = [
|
||
|
|
{
|
||
|
|
name : "dacBase",
|
||
|
|
displayName : "DAC Instance",
|
||
|
|
description : 'Instance of the DAC used.',
|
||
|
|
hidden : false,
|
||
|
|
default : DAC_INSTANCE[0].name,
|
||
|
|
options : DAC_INSTANCE
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name : "referenceVoltage",
|
||
|
|
displayName : "Reference Voltage",
|
||
|
|
description : 'Sets the DAC Reference Voltage',
|
||
|
|
hidden : false,
|
||
|
|
onChange : onChangeDACVref,
|
||
|
|
default : device_driverlib_peripheral.DAC_ReferenceVoltage[0].name,
|
||
|
|
options : device_driverlib_peripheral.DAC_ReferenceVoltage
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name : "loadMode",
|
||
|
|
displayName : "Load Mode",
|
||
|
|
description : 'Sets the DAC Load Mode',
|
||
|
|
hidden : false,
|
||
|
|
onChange : onChangeLoadMode,
|
||
|
|
default : device_driverlib_peripheral.DAC_LoadMode[0].name,
|
||
|
|
options : device_driverlib_peripheral.DAC_LoadMode
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name : "ePWMSyncSignal",
|
||
|
|
displayName : "EPWMSYNCPER Signal",
|
||
|
|
description : 'Sets the DAC ePWMSYNC Signal',
|
||
|
|
hidden : true,
|
||
|
|
default : ePWMArray[0].name,
|
||
|
|
options : ePWMArray
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name : "shadowValue",
|
||
|
|
displayName : "Shadow Value",
|
||
|
|
description : 'Set the DAC Shadow Output Value.',
|
||
|
|
hidden : false,
|
||
|
|
default : 0
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name : "enableOutput",
|
||
|
|
displayName : "Enable Output",
|
||
|
|
description : 'Whether or not to enable the DAC output.',
|
||
|
|
hidden : false,
|
||
|
|
default : false,
|
||
|
|
},
|
||
|
|
{
|
||
|
|
name : "lockedRegisters",
|
||
|
|
displayName : "Lock DAC Registers",
|
||
|
|
description : 'Which DAC Registers to enable.',
|
||
|
|
hidden : false,
|
||
|
|
default : [],
|
||
|
|
minSelections: 0,
|
||
|
|
options : [
|
||
|
|
{name: "DAC_LOCK_CONTROL", displayName: "Control Register"},
|
||
|
|
{name: "DAC_LOCK_SHADOW", displayName: "Shadow Register"},
|
||
|
|
{name: "DAC_LOCK_OUTPUT", displayName: "Output Register"},
|
||
|
|
],
|
||
|
|
|
||
|
|
},
|
||
|
|
];
|
||
|
|
|
||
|
|
if (!["F2837xD", "F2807x", "F2837xS"].includes(Common.getDeviceName()))
|
||
|
|
{
|
||
|
|
var defaultDacName = "DACA";
|
||
|
|
defaultDacName = Pinmux.getDeviceDACName(defaultDacName)
|
||
|
|
config.push(
|
||
|
|
{
|
||
|
|
name : "dacDevicePinName",
|
||
|
|
displayName : "DAC Device Pin Name",
|
||
|
|
description : 'The device pin name and the signal name for that pin',
|
||
|
|
hidden : false,
|
||
|
|
getValue : (inst) => {
|
||
|
|
var dacOutName = Pinmux.getDeviceDACName(inst.dacBase.replace("_BASE", ""))
|
||
|
|
var dacAnalogPins = Pinmux.findAllAnalogPin(dacOutName);
|
||
|
|
return Pinmux.getDevicePinInfoDescription(dacAnalogPins);
|
||
|
|
},
|
||
|
|
default : Pinmux.getDevicePinInfoDescription(defaultDacName)
|
||
|
|
}
|
||
|
|
)
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Only show Gain options depending on device */
|
||
|
|
if (["F28004x", "F28003x", "F28P65x"].includes(Common.getDeviceName()))
|
||
|
|
{
|
||
|
|
config.splice(2, 0,
|
||
|
|
{
|
||
|
|
name : "gainMode",
|
||
|
|
displayName : "Gain Mode",
|
||
|
|
description : 'Sets the DAC Gain Mode',
|
||
|
|
hidden : true,
|
||
|
|
default : device_driverlib_peripheral.DAC_GainMode[0].name,
|
||
|
|
options : device_driverlib_peripheral.DAC_GainMode
|
||
|
|
}
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
function onValidate(inst, validation) {
|
||
|
|
|
||
|
|
var usedDACInsts = [];
|
||
|
|
for (var instance_index in inst.$module.$instances)
|
||
|
|
{
|
||
|
|
var instance_obj = inst.$module.$instances[instance_index];
|
||
|
|
usedDACInsts.push(instance_obj.dacBase);
|
||
|
|
}
|
||
|
|
|
||
|
|
var otherContexts = Common.getOtherContextNames()
|
||
|
|
for (var cntx of otherContexts)
|
||
|
|
{
|
||
|
|
var onOtherCntx = Common.getModuleForCore(inst.$module.$name, cntx);
|
||
|
|
if (onOtherCntx)
|
||
|
|
{
|
||
|
|
for (var instance_index in onOtherCntx.$instances)
|
||
|
|
{
|
||
|
|
var instance_obj = onOtherCntx.$instances[instance_index];
|
||
|
|
usedDACInsts.push(instance_obj.dacBase);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
var duplicatesResult = Common.findDuplicates(usedDACInsts)
|
||
|
|
|
||
|
|
if (duplicatesResult.duplicates.length != 0)
|
||
|
|
{
|
||
|
|
var allDuplicates = "";
|
||
|
|
for (var duplicateNamesIndex in duplicatesResult.duplicates)
|
||
|
|
{
|
||
|
|
allDuplicates = allDuplicates + Common.stringOrEmpty(allDuplicates, ", ")
|
||
|
|
+ duplicatesResult.duplicates[duplicateNamesIndex];
|
||
|
|
}
|
||
|
|
validation.logError(
|
||
|
|
"The DAC Instance used. Duplicates: " + allDuplicates,
|
||
|
|
inst, "dacBase");
|
||
|
|
}
|
||
|
|
|
||
|
|
if (inst.shadowValue < 0 || inst.shadowValue > 4095)
|
||
|
|
{
|
||
|
|
validation.logError(
|
||
|
|
"Enter an integer for Shadow Value between 0 and 4095!",
|
||
|
|
inst, "shadowValue");
|
||
|
|
}
|
||
|
|
if (!Number.isInteger(inst.shadowValue))
|
||
|
|
{
|
||
|
|
validation.logError(
|
||
|
|
"Shadow Value must be an integer",
|
||
|
|
inst, "shadowValue");
|
||
|
|
}
|
||
|
|
var asysctlMod = system.modules['/driverlib/asysctl.js'];
|
||
|
|
if (asysctlMod){
|
||
|
|
var stat = asysctlMod.$static
|
||
|
|
//validation.logError("An example error in gainMode", inst, "gainMode");
|
||
|
|
if(inst.referenceVoltage == "DAC_REF_VDAC" && inst.gainMode == "DAC_GAIN_TWO"){
|
||
|
|
validation.logError(
|
||
|
|
"Selected gain mode not supported for configured reference voltage.",
|
||
|
|
inst, "gainMode");
|
||
|
|
validation.logError(
|
||
|
|
"Selected reference voltage not supported for configured gain mode.",
|
||
|
|
inst, "referenceVoltage");
|
||
|
|
} // the case of VDAC, no gain mode select! the case of [vdac, x, x, gain 2x]
|
||
|
|
if(inst.referenceVoltage == "DAC_REF_ADC_VREFHI" && stat.analogReference == "INTERNAL"
|
||
|
|
&& stat.analogReferenceVoltage == "1P65" && inst.gainMode == "DAC_GAIN_ONE"){
|
||
|
|
validation.logError(
|
||
|
|
"Selected gain mode not supported for configured analog reference voltage.",
|
||
|
|
inst, "gainMode");
|
||
|
|
validation.logError(
|
||
|
|
"Selected analog reference voltage not supported for configured gain mode.",
|
||
|
|
stat, "analogReferenceVoltage");
|
||
|
|
} // the case of [vrefhi, internal, 1.65, gain 1x]
|
||
|
|
if(inst.referenceVoltage == "DAC_REF_ADC_VREFHI" && stat.analogReference == "INTERNAL"
|
||
|
|
&& stat.analogReferenceVoltage == "2P5" && inst.gainMode == "DAC_GAIN_TWO"){
|
||
|
|
validation.logError(
|
||
|
|
"Selected gain mode not supported for configured analog reference voltage.",
|
||
|
|
inst, "gainMode");
|
||
|
|
validation.logError(
|
||
|
|
"Selected analog reference voltage not supported for configured gain mode.",
|
||
|
|
stat, "analogReferenceVoltage");
|
||
|
|
} // the case of [vrefhi, internal, 2.5, gain 2x]
|
||
|
|
if(inst.referenceVoltage == "DAC_REF_ADC_VREFHI" && stat.analogReference == "EXTERNAL" && inst.gainMode == "DAC_GAIN_TWO"){
|
||
|
|
validation.logError(
|
||
|
|
"Selected gain mode not supported for configured analog reference.",
|
||
|
|
inst, "gainMode");
|
||
|
|
validation.logError(
|
||
|
|
"Selected analog reference not supported for configured gain mode.",
|
||
|
|
stat, "analogReference");
|
||
|
|
} // the case of [vrefhi, external, x, gain 2x]
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
//
|
||
|
|
// Check for Pin Usage in analog
|
||
|
|
//
|
||
|
|
if (Common.peripheralCount("ANALOG") > 0)
|
||
|
|
{
|
||
|
|
if(inst.enableOutput){
|
||
|
|
var devicePinNameInfo = inst["dacDevicePinName"]
|
||
|
|
if (devicePinNameInfo == Pinmux.NO_DEVICE_PIN_FOUND)
|
||
|
|
{
|
||
|
|
validation.logWarning(
|
||
|
|
"DAC output selected has no device pin found.",
|
||
|
|
inst, "dacDevicePinName");
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
var dacOutName = Pinmux.getDeviceDACName(inst.dacBase.replace("_BASE", ""))
|
||
|
|
var dacAnalogPins = Pinmux.findAllAnalogPin(dacOutName);
|
||
|
|
var selectedInterfaces = Pinmux.getPeripheralUseCaseInterfaces(inst.analog, "ANALOG", inst.analog.useCase);
|
||
|
|
var allInterfaces = Pinmux.getPeripheralUseCaseInterfaces(inst.analog, "ANALOG", "ALL");
|
||
|
|
|
||
|
|
|
||
|
|
for (var dacPin of dacAnalogPins)
|
||
|
|
{
|
||
|
|
var pinSelected = dacPin.PinDesignSignalName;
|
||
|
|
if (!selectedInterfaces.includes(pinSelected) && allInterfaces.includes(pinSelected))
|
||
|
|
{
|
||
|
|
validation.logError(
|
||
|
|
"The pin " + pinSelected + " is not selected in the ANALOG PinMux module." +
|
||
|
|
" Add this pin to the 'Pins Used' or change the 'Use Case'",
|
||
|
|
inst,"dacDevicePinName");
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
//
|
||
|
|
// Check against ADC and CMPSS
|
||
|
|
// Not available on F28X7x
|
||
|
|
//
|
||
|
|
if (inst["dacDevicePinName"])
|
||
|
|
{
|
||
|
|
if(inst.enableOutput){
|
||
|
|
var devicePinNameInfo = inst["dacDevicePinName"]
|
||
|
|
if (devicePinNameInfo != Pinmux.NO_DEVICE_PIN_FOUND)
|
||
|
|
{
|
||
|
|
var dacOutName = Pinmux.getDeviceDACName(inst.dacBase.replace("_BASE", ""))
|
||
|
|
var dacAnalogPins = Pinmux.findAllAnalogPin(dacOutName);
|
||
|
|
var adcPinsUsed = Pinmux.getADCPinsUsed();
|
||
|
|
var cmpssPinsUsed = Pinmux.getCMPSSPinsUsed();
|
||
|
|
var cmpssLitePinsUsed = Pinmux.getCMPSSLitePinsUsed();
|
||
|
|
|
||
|
|
for (var dacPin of dacAnalogPins)
|
||
|
|
{
|
||
|
|
var pinSelected = dacPin.PinDesignSignalName;
|
||
|
|
if (adcPinsUsed.includes(pinSelected))
|
||
|
|
{
|
||
|
|
validation.logWarning(
|
||
|
|
"The pin " + pinSelected + " is also selected by the ADC module." +
|
||
|
|
" The DAC output will be driving the ADC pin input. This is an acceptable " +
|
||
|
|
"use-case.",
|
||
|
|
inst, "dacDevicePinName");
|
||
|
|
}
|
||
|
|
|
||
|
|
if (cmpssPinsUsed.includes(pinSelected))
|
||
|
|
{
|
||
|
|
validation.logWarning(
|
||
|
|
"The pin " + pinSelected + " is also selected by the CMPSS module." +
|
||
|
|
" The DAC output will be driving the CMPSS pin input. This is an acceptable " +
|
||
|
|
"use-case.",
|
||
|
|
inst, "dacDevicePinName");
|
||
|
|
}
|
||
|
|
if (cmpssLitePinsUsed.includes(pinSelected))
|
||
|
|
{
|
||
|
|
validation.logWarning(
|
||
|
|
"The pin " + pinSelected + " is also selected by the CMPSSLite module." +
|
||
|
|
" The DAC output will be driving the CMPSSLite pin input. This is an acceptable " +
|
||
|
|
"use-case.",
|
||
|
|
inst, "dacDevicePinName");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
var sharedModuleInstances = undefined;
|
||
|
|
if (Common.peripheralCount("ANALOG") > 0) {
|
||
|
|
sharedModuleInstances = function () {
|
||
|
|
return (
|
||
|
|
[
|
||
|
|
{
|
||
|
|
name: "analog",
|
||
|
|
displayName: "Analog PinMux",
|
||
|
|
moduleName: "/driverlib/analog.js"
|
||
|
|
},
|
||
|
|
]
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
var dacModule = {
|
||
|
|
peripheralName: "DAC",
|
||
|
|
displayName: "DAC",
|
||
|
|
maxInstances: numberOfDACs,
|
||
|
|
defaultInstanceName: "myDAC",
|
||
|
|
description: "Digital Analog Converter",
|
||
|
|
longDescription: (Common.getCollateralFindabilityList("DAC")),
|
||
|
|
config: config,
|
||
|
|
moduleStatic: dacStatic,
|
||
|
|
sharedModuleInstances: sharedModuleInstances,
|
||
|
|
templates: {
|
||
|
|
boardc : "/driverlib/dac/dac.board.c.xdt",
|
||
|
|
boardh : "/driverlib/dac/dac.board.h.xdt"
|
||
|
|
},
|
||
|
|
validate : onValidate,
|
||
|
|
};
|
||
|
|
|
||
|
|
exports = dacModule;
|