c2000ware-core-sdk/driverlib/.meta/i2c.js

406 lines
13 KiB
JavaScript
Raw Permalink Normal View History

2023-06-24 09:05:38 +03:00
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() + "_i2c.js");
/* Intro splash on GUI */
let longDescription = "The I2C driver provides a simplified application"
+ " interface to access peripherals on an I2C bus.";
function onChangeMode(inst, ui)
{
if (inst.mode == "CONTROLLER") {
ui.loopback.hidden = false;
ui.bitRate.hidden = false;
ui.duty.hidden = false;
ui.targetAddress.hidden = false;
ui.ownTargetAddress.hidden = true;
}
else {
ui.loopback.hidden = true;
ui.bitRate.hidden = true;
ui.duty.hidden = true;
ui.targetAddress.hidden = true;
ui.ownTargetAddress.hidden = false;
}
}
function onChangeLoopback(inst, ui)
{
if (inst.loopback) {
ui.ownTargetAddress.hidden = false;
}
else {
ui.ownTargetAddress.hidden = true;
}
onChangeMode(inst, ui);
}
function onChangeUseInterrupts(inst, ui)
{
if (inst.useInterrupts)
{
ui.enabledInterrupts.hidden = false;
ui.enabledFIFOInterrupts.hidden = false;
ui.registerInterrupts.hidden = false;
ui.txFifo.hidden = false;
ui.rxFifo.hidden = false;
if (!inst.useFifo) {
ui.enabledFIFOInterrupts.hidden = true;
ui.txFifo.hidden = true;
ui.rxFifo.hidden = true;
}
}
else
{
ui.enabledInterrupts.hidden = true;
ui.enabledFIFOInterrupts.hidden = true;
ui.registerInterrupts.hidden = true;
ui.txFifo.hidden = true;
ui.rxFifo.hidden = true;
}
}
function onValidate(inst, validation)
{
var bitRateError = false;
var targetAddrError = false;
var ownAddrError = false;
var maxAddress = (inst.addressMode.includes(10)? 0x3FF: 0x7F);
var bitRateInt = parseInt(inst.bitRate);
if (bitRateInt < 1 || bitRateInt > 200000000)
{
bitRateError = true;
}
var targetAddressInt = parseInt(inst.targetAddress);
var ownAddressInt = parseInt(inst.ownTargetAddress);
if (targetAddressInt < 0 || targetAddressInt > maxAddress)
{
targetAddrError = true;
}
if (ownAddressInt < 0 || ownAddressInt > maxAddress)
{
ownAddrError = true;
}
if(inst.dataCount > 0xFFFF | inst.dataCount < 0)
{
validation.logError(
"Enter an integer for data count between 0 and 65535!",
inst, "dataCount");
}
if(bitRateError)
{
validation.logError(
"Enter an integer for bit rates between 1 and SYSCLK!",
inst, "bitRate");
}
if(targetAddrError && inst.mode == "CONTROLLER")
{
validation.logError(
"Target address must be between 0 and " + maxAddress + "!",
inst, "targetAddress");
}
if(ownAddrError && inst.mode != "CONTROLLER")
{
validation.logError(
"Own Target address must be between 0 and " + maxAddress + "!",
inst, "ownTargetAddress");
}
var pinmuxQualMods = Pinmux.getGpioQualificationModInstDefinitions("I2C", inst)
for (var pinmuxQualMod of pinmuxQualMods)
{
2023-12-13 14:16:16 +03:00
if (((inst[pinmuxQualMod.name].padConfig.includes("PULLUP")) && !(inst[pinmuxQualMod.name].padConfig.includes("OD"))) || (inst[pinmuxQualMod.name].padConfig.includes("INVERT")))
2023-06-24 09:05:38 +03:00
{
2023-12-13 14:16:16 +03:00
validation.logError("The push-pull and inverted pad configurations should not be used for the I2C module.", inst);
2023-06-24 09:05:38 +03:00
}
}
}
/* Array of I2C configurables that are common across device families */
let config = [
{
name : "mode",
displayName : "I2C Device Mode",
description : 'I2C device mode: controller/target',
hidden : false,
onChange : onChangeMode,
default : 'CONTROLLER',
options : [
{ name: "CONTROLLER", legacyNames : ["MASTER"], displayName : "Controller Mode"},
{ name: "TARGET", legacyNames : ["SLAVE"], displayName : "Target Mode" },
]
},
{
name : "duty",
displayName : "Clock Duty Cycle",
description : 'Clock duty cycle mode',
hidden : false,
default : device_driverlib_peripheral.I2C_DutyCycle[0].name,
options : device_driverlib_peripheral.I2C_DutyCycle
},
{
name : "bitRate",
displayName : "Bit Rate",
description : 'Controller transmitter bitrate',
hidden : false,
default : 400000,
},
{
name : "initialMode",
displayName : "Initial Mode",
description : 'Initial mode, transmitter/receiver',
hidden : false,
default : 'SEND_MODE',
options : [
{ name: "SEND_MODE", displayName : "Transmitter Mode" },
{ name: "RECEIVE_MODE", displayName : "Receiver Mode" },
]
},
{
name : "bitCount",
displayName : "Bit Count",
description : 'Bit count, number of bits per transfer',
hidden : false,
default : device_driverlib_peripheral.I2C_BitCount[0].name,
options : device_driverlib_peripheral.I2C_BitCount
},
{
name : "dataCount",
displayName : "Data Count",
description : 'Set number of bytes to be to transfer or receive when repeat mode is off',
hidden : false,
default : 1
},
{
name : "addressMode",
displayName : "Address Mode",
description : 'Address mode, 7-bit/8-bit',
hidden : false,
default : device_driverlib_peripheral.I2C_AddressMode[0].name,
options : device_driverlib_peripheral.I2C_AddressMode
},
{
name : "targetAddress",
legacyNames : ["slaveAddress"],
displayName : "Target Address",
description : 'The target address, 7bit/10bit: 0x00 to 0x7F or 0x3FF',
hidden : false,
displayFormat: "hex",
default : 0x00
},
{
name : "ownTargetAddress",
legacyNames : ["ownSlaveAddress"],
displayName : "Own Target Address",
description : 'The device\'s own target address, 7bit/10bit: 0x00 to 0x7F or 0x3FF',
hidden : true,
displayFormat: "hex",
default : 0x00
},
{
name : "loopback",
displayName : "loopback Mode",
description : 'loopback mode',
hidden : false,
onChange : onChangeLoopback,
default : false,
},
{
name : "useInterrupts",
displayName : "Use Interrupt",
description : 'Whether or not to use Interrupt mode.',
hidden : false,
onChange : onChangeUseInterrupts,
default : true
},
{
name : "registerInterrupts",
displayName : "Register Interrupt Handler",
description : 'Whether or not to register interrupt handlers in the interrupt module.',
hidden : false,
default : false
},
{
name : "enabledInterrupts",
displayName : "Enabled Interrupts",
description : 'Which interrupts to enabled.',
hidden : false,
default : [],
minSelections: 0,
options : [
{name: "I2C_INT_ARB_LOST", displayName : "Arbitration-lost interrupt"},
{name: "I2C_INT_NO_ACK", displayName : "NACK interrupt"},
{name: "I2C_INT_REG_ACCESS_RDY", displayName : "Register-access-ready interrupt"},
{name: "I2C_INT_RX_DATA_RDY", displayName : "Receive-data-ready interrupt"},
{name: "I2C_INT_TX_DATA_RDY", displayName : "Transmit-data-ready interrupt"},
{name: "I2C_INT_STOP_CONDITION", displayName : "Stop condition detected"},
{name: "I2C_INT_ADDR_TARGET", legacyNames: ["I2C_INT_ADDR_SLAVE"], displayName : "Addressed as target interrupt"},
],
},
{
name : "enabledFIFOInterrupts",
displayName : "Enabled FIFO Interrupts",
description : 'Which FIFO interrupts to enabled.',
hidden : false,
default : [],
minSelections: 0,
options : [
{name: "I2C_INT_RXFF", displayName: "Receive Interrupt"},
{name: "I2C_INT_TXFF", displayName: "Transmit Interrupt"},
],
},
{
name : "useFifo",
displayName : "FIFO Mode",
description : 'FIFO mode',
hidden : false,
onChange : onChangeUseInterrupts,
default : true,
},
{
name : "txFifo",
displayName : "Transmit FIFO Interrupt Level",
description : 'Transmit FIFO interrupt level used.',
hidden : false,
default : device_driverlib_peripheral.I2C_TxFIFOLevel[0].name,
options : device_driverlib_peripheral.I2C_TxFIFOLevel
},
{
name : "rxFifo",
displayName : "Receive FIFO Interrupt Level",
description : 'Receive FIFO interrupt level used.',
hidden : false,
default : device_driverlib_peripheral.I2C_RxFIFOLevel[0].name,
options : device_driverlib_peripheral.I2C_RxFIFOLevel
},
{
name : "emulationMode",
displayName : "Emulation Mode",
description : 'Emulation Mode',
hidden : false,
default : device_driverlib_peripheral.I2C_EmulationMode[0].name,
options : device_driverlib_peripheral.I2C_EmulationMode
},
{
name: "useCase",
displayName : "Use Case",
description : 'Peripheral use case',
hidden : false,
default : 'ALL',
options : Pinmux.getPeripheralUseCaseNames("I2C"),
onChange : Pinmux.useCaseChanged,
},
];
/*
* ======== filterHardware ========
* Control RX, TX Pin usage by the user specified dataDirection.
*
* param component - hardware object describing signals and
* resources they're attached to
*
* returns Boolean indicating whether or not to allow the component to
* be assigned to an instance's $hardware config
*/
function filterHardware(component)
{
return (Common.typeMatches(component.type, ["I2C"]));
}
if (Common.onlyPinmux())
{
config = [config[config.length - 1]];
}
var i2cModule = {
peripheralName: "I2C",
displayName: "I2C",
maxInstances: Common.peripheralCount("I2C"),
defaultInstanceName: "myI2C",
description: "Inter-Integrated Circuit Peripheral",
longDescription: (Common.getCollateralFindabilityList("I2C")),
filterHardware : filterHardware,
config: config,
moduleInstances: (inst) => {
var ownedInstances = []
var pinmuxQualMods = Pinmux.getGpioQualificationModInstDefinitions("I2C", inst)
for (var pinmuxQualMod of pinmuxQualMods)
{
2023-12-13 14:16:16 +03:00
pinmuxQualMod.args.padConfig = "OD_PULLUP";
2023-06-24 09:05:38 +03:00
pinmuxQualMod.args.qualMode = "GPIO_QUAL_ASYNC";
}
ownedInstances = ownedInstances.concat(pinmuxQualMods)
if (inst.useInterrupts && inst.registerInterrupts)
{
ownedInstances = ownedInstances.concat([{
name: "i2cInt",
displayName: "I2C Interrupt",
moduleName: "/driverlib/interrupt.js",
collapsed: true,
args: {
$name : inst.$name + "_INT",
int : "INT_" + inst.$name,
pinmuxPeripheralModule : "i2c",
driverlibInt: "INT_#"
}
},
{
name: "i2cFIFOInt",
displayName: "FIFO Interrupt",
moduleName: "/driverlib/interrupt.js",
collapsed: true,
args: {
$name : inst.$name + "_FIFO_INT",
int : "INT_" + inst.$name + "_FIFO",
pinmuxPeripheralModule : "i2c",
driverlibInt: "INT_#_FIFO"
}
}])
}
return ownedInstances;
},
templates: {
boardc : "/driverlib/i2c/i2c.board.c.xdt",
boardh : "/driverlib/i2c/i2c.board.h.xdt"
},
pinmuxRequirements : Pinmux.i2cPinmuxRequirements,
validate : onValidate
};
if (i2cModule.maxInstances <= 0)
{
delete i2cModule.pinmuxRequirements;
}
else
{
Pinmux.addCustomPinmuxEnumToConfig(i2cModule)
Pinmux.addPinMuxQualGroupToConfig(i2cModule)
}
exports = i2cModule;