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 ( ) + "_flash.js" ) ;
let device _driverlib _memmap =
system . getScript ( "/driverlib/device_driverlib_peripherals/" +
Common . getDeviceName ( ) . toLowerCase ( ) + "_memmap.js" ) ;
/* Intro splash on GUI */
let longDescription = ` Flash is an electrically erasable/programmable
nonvolatile memory that can be programmed and erased many times to
ease code development . Flash memory can be used primarily as a program
memory for the core , and secondarily as static data memory
` ;
longDescription += "* [Device TRM](" + Common . getDeviceTRM ( ) + ")" ;
var FLASH _INSTANCE = [ ] ;
var ECC _INSTANCE = [ ] ;
FLASH _INSTANCE . push ( { name : device _driverlib _memmap . FLASH0MemoryMap [ 0 ] . name , displayName : device _driverlib _memmap . FLASH0MemoryMap [ 0 ] . displayName } ) ;
ECC _INSTANCE . push ( { name : device _driverlib _memmap . FLASH0MemoryMap [ 1 ] . name , displayName : device _driverlib _memmap . FLASH0MemoryMap [ 1 ] . displayName } ) ;
if ( [ "F2837xS" ] . includes ( Common . getDeviceName ( ) ) )
{
FLASH _INSTANCE . push (
{ name : device _driverlib _memmap . FLASH0MemoryMap [ 2 ] . name , displayName : device _driverlib _memmap . FLASH0MemoryMap [ 2 ] . displayName } ,
)
ECC _INSTANCE . push (
{ name : device _driverlib _memmap . FLASH0MemoryMap [ 3 ] . name , displayName : device _driverlib _memmap . FLASH0MemoryMap [ 3 ] . displayName } ,
)
}
var Flash _SysClk _MHz = 200 ;
Flash _SysClk _MHz = Common . SYSCLK _getMaxMHz ( ) ;
var Flash _FClk _MHz = 50 ;
if ( [ "F28004x" ] . includes ( Common . getDeviceName ( ) ) || [ "F28002x" ] . includes ( Common . getDeviceName ( ) ) || [ "F28003x" ] . includes ( Common . getDeviceName ( ) ) ) {
Flash _FClk _MHz = 20 ;
}
2023-07-24 12:14:00 +03:00
if ( [ "F280013x" ] . includes ( Common . getDeviceName ( ) ) || [ "F280015x" ] . includes ( Common . getDeviceName ( ) ) || [ "F28P65x" ] . includes ( Common . getDeviceName ( ) ) ) {
2023-06-24 09:05:38 +03:00
Flash _FClk _MHz = 40 ;
}
var numberOfInstance = {
"F2807x" : 1 ,
"F28004x" : 1 ,
"F28003x" : 1 ,
"F28002x" : 1 ,
"F2838x" : 1 ,
"F2837xS" : 2 ,
"F2837xD" : 1 ,
"F280013x" : 1 ,
"F280015x" : 1 ,
2023-07-24 12:14:00 +03:00
"F28P65x" : 1 ,
2023-12-13 14:16:16 +03:00
"F28P55x" : 1 ,
2023-06-24 09:05:38 +03:00
}
var deviceNumberOfInstances = numberOfInstance [ Common . getDeviceName ( ) ] ;
//Flash_initModule(uint32_t ctrlBase, uint32_t eccBase, uint16_t waitstates)??
function calcWaitState ( inst , ui )
{
2023-12-13 14:16:16 +03:00
if ( [ "F28P55x" ] . includes ( Common . getDeviceName ( ) ) && ( 0 < Flash _SysClk _MHz && Flash _SysClk _MHz <= 80 ) ) {
return ( 1 )
}
else if ( [ "F28P55x" ] . includes ( Common . getDeviceName ( ) ) && ( 80 < Flash _SysClk _MHz && Flash _SysClk _MHz <= 120 ) ) {
return ( 2 )
}
else if ( [ "F28P55x" ] . includes ( Common . getDeviceName ( ) ) && ( 120 < Flash _SysClk _MHz && Flash _SysClk _MHz <= 150 ) ) {
return ( 3 )
}
else {
return Math . ceil ( ( Flash _SysClk _MHz / Flash _FClk _MHz ) - 1 ) ;
}
2023-06-24 09:05:38 +03:00
}
let config = [
{
name : "flashBase" ,
displayName : "FLASH Instance" ,
description : 'Instance of the FLASH used.' ,
hidden : false ,
default : FLASH _INSTANCE [ 0 ] . name ,
options : FLASH _INSTANCE
} ,
{
name : "calcWaitStates" ,
displayName : "Calculate Wait State [RWAIT]" ,
description : '' ,
hidden : false ,
default : true ,
onChange : ( inst , ui ) => {
ui . waitStates . hidden = inst . calcWaitStates ;
ui . calculatedWaitStates . hidden = ! inst . calcWaitStates
}
} ,
{
name : "calculatedWaitStates" ,
displayName : "Wait State [RWAIT]" ,
2023-07-24 12:14:00 +03:00
description : 'Sets the number of wait states for a flash read access. The waitstates parameter is a number between 0x0 and 0xF.' ,
2023-06-24 09:05:38 +03:00
hidden : true ,
default : 0xF ,
displayFormat : {
radix : 'hex' ,
bitSize : 4
} ,
getValue : ( inst , ui ) => {
return calcWaitState ( inst , ui )
}
} ,
//Flash_setWaitstates(uint32_t ctrlBase, uint16_t waitstates), set to max 0xF by default
{
name : "waitStates" ,
displayName : "Wait State [RWAIT]" ,
2023-07-24 12:14:00 +03:00
description : 'Sets the number of wait states for a flash read access. The waitstates parameter is a number between 0x0 and 0xF.' ,
2023-06-24 09:05:38 +03:00
hidden : true ,
default : 0xF ,
displayFormat : {
radix : 'hex' ,
bitSize : 4
}
} ,
//Flash_enablePrefetch(uint32_t ctrlBase), disabled by default
{
name : "enablePrefetch" ,
displayName : "Enable Prefetch" ,
description : '' ,
hidden : false ,
default : true
} ,
//Flash_enableCache(uint32_t ctrlBase), disabled by default
{
name : "enableCache" ,
displayName : "Enable Cache" ,
description : '' ,
hidden : false ,
default : true
} ,
//enable ECC
{
name : "enableECC" ,
displayName : "Enable ECC" ,
description : '' ,
hidden : false ,
default : true
} ,
//ecc base init
{
name : "eccBase" ,
displayName : "ECC Instance" ,
description : '' ,
hidden : false ,
default : ECC _INSTANCE [ 0 ] . name ,
getValue : ( inst ) => {
var ecc = ECC _INSTANCE [ 0 ] . name ;
FLASH _INSTANCE . forEach ( ( element , index ) => {
if ( element . name == inst . flashBase ) {
ecc = ECC _INSTANCE [ index ] . name ;
}
} )
return ecc ;
} ,
} ,
{
name : "registerInterrupts" ,
displayName : "Register Interrupt Handler" ,
description : 'Whether or not to register interrupt handlers in the interrupt module. NMI is used for the uncorrectable errors in this module.' ,
hidden : false ,
default : false
}
] ;
2023-12-13 14:16:16 +03:00
if ( ! [ "F280015x" , "F280013x" , "F28P65x" , "F28P55x" ] . includes ( Common . getDeviceName ( ) ) ) {
2023-06-24 09:05:38 +03:00
config . push (
//ECC Error Threshold
{
name : "errorThreshold" ,
displayName : "Single Bit Error Threshold" ,
description : 'The single bit error threshold, valid ranges are from 0x0 - 0xFFFF. Number of errors at which the correctable error interrupt flag gets set.' ,
hidden : false ,
default : 0x0
} ,
)
}
/ *
if ( [ "F280015x" ] . includes ( Common . getDeviceName ( ) ) ) {
config . push (
{
name : "engrWaitStates" ,
displayName : "Engr Wait States" ,
description : '' ,
hidden : false ,
default : '0xF'
}
)
}
* /
var globalConfig = [
{
name : "flashSYSCLK" ,
displayName : "CPUCLK [MHz] for Flash Wait State Calculation" ,
description : "This is the CPUCLK/SYSCLK value assumed for flash wait state calculation" ,
default : Flash _SysClk _MHz ,
onChange : ( inst , ui ) => {
Flash _SysClk _MHz = inst . flashSYSCLK
}
} ,
]
var sharedModuleInstances = undefined ;
2023-12-13 14:16:16 +03:00
if ( [ "F2838x" , "F280013x" , "F280015x" , "F28P65x" , "F28P55x" ] . includes ( Common . getDeviceName ( ) ) )
2023-06-24 09:05:38 +03:00
{
sharedModuleInstances = function ( inst ) {
if ( inst . registerInterrupts )
{
return (
[
{
name : "sysErrInt" ,
displayName : "Sys Error Interrupt" ,
moduleName : "/driverlib/interrupt/interrupt_sys_err.js" ,
collapsed : true ,
} ,
]
) ;
}
return [ ]
}
}
function filterHardware ( component )
{
return ( Common . typeMatches ( component . type , [ "FLASH" ] ) ) ;
}
function onValidate ( inst , validation ) {
var usedFLASHInsts = [ ] ;
for ( var instance _index in inst . $module . $instances )
{
var instance _obj = inst . $module . $instances [ instance _index ] ;
usedFLASHInsts . push ( instance _obj . flashBase ) ;
}
var duplicatesResult = Common . findDuplicates ( usedFLASHInsts )
if ( duplicatesResult . duplicates . length != 0 )
{
var allDuplicates = "" ;
for ( var duplicateNamesIndex in duplicatesResult . duplicates )
{
allDuplicates = allDuplicates + Common . stringOrEmpty ( allDuplicates , ", " )
+ duplicatesResult . duplicates [ duplicateNamesIndex ] ;
}
validation . logError (
"The FLASH Instance used. Duplicates: " + allDuplicates ,
inst , "flashBase" ) ;
}
var waitstateConfig = inst . waitStates
var waitstateConfigName = "waitStates"
if ( inst . calcWaitStates )
{
waitstateConfig = inst . calculatedWaitStates
waitstateConfigName = "calculatedWaitStates"
}
if ( waitstateConfig < 0x0 || waitstateConfig > 0xF ) {
validation . logError (
"Enter a value from 0x0 to 0xF" ,
inst , waitstateConfigName ) ;
}
if ( waitstateConfig < Math . ceil ( ( inst . $module . $static [ "flashSYSCLK" ] / inst . $module . $static [ "flashFCLK" ] ) ) - 1 ) {
validation . logError (
"Please enter a wait state value greater than or equal to the minimum required for your selected SYSCLK and FCLK" ,
inst , waitstateConfigName ) ;
}
2023-12-13 14:16:16 +03:00
if ( ! [ "F280015x" , "F280013x" , "F28P65x" , "F28P55x" ] . includes ( Common . getDeviceName ( ) ) ) {
2023-06-24 09:05:38 +03:00
if ( inst . errorThreshold < 0x0 || inst . errorThreshold > 0xFFFF ) {
validation . logError (
"Enter a value from 0x0 to 0xFFFF" ,
inst , "errorThreshold" ) ;
}
}
if ( Common . getDeviceName ( ) . toLowerCase ( ) == 'f2838x' )
{
if ( inst . registerInterrupts ) {
validation . logWarning (
"Ensure that Flash Correctable Error Interrupt is enabled" ,
inst , "registerInterrupts" ) ;
}
}
validation . logInfo (
` It is important to look at your device's datasheet for information about what
the required minimum flash wait state is for your selected SYSCLK frequency .
See Flash section of TRM for more info . ` ,
inst , waitstateConfigName ) ;
}
function onValidateStatic ( inst , validation ) {
if ( [ "F28002x" ] . includes ( Common . getDeviceName ( ) ) ) {
if ( inst . flashSYSCLK < 1 || inst . flashSYSCLK > 100 ) {
validation . logError (
"Enter a value from 1 to 100 MHz" ,
inst , "flashSYSCLK" ) ;
}
} else if ( [ "F28003x" ] . includes ( Common . getDeviceName ( ) ) ) {
if ( inst . flashSYSCLK < 1 || inst . flashSYSCLK > 120 ) {
validation . logError (
"Enter a value from 1 to 120 MHz" ,
inst , "flashSYSCLK" ) ;
}
} else if ( [ "F28004x" ] . includes ( Common . getDeviceName ( ) ) ) {
if ( inst . flashSYSCLK < 1 || inst . flashSYSCLK > 100 ) {
validation . logError (
"Enter a value from 1 to 100 MHz" ,
inst , "flashSYSCLK" ) ;
}
2023-12-13 14:16:16 +03:00
}
else if ( [ "F28P55x" ] . includes ( Common . getDeviceName ( ) ) ) {
if ( inst . flashSYSCLK < 1 || inst . flashSYSCLK > 150 ) {
validation . logError (
"Enter a value from 1 to 150 MHz" ,
inst , "flashSYSCLK" ) ;
}
}
else {
2023-06-24 09:05:38 +03:00
if ( inst . flashSYSCLK < 1 || inst . flashSYSCLK > 200 ) {
validation . logError (
"Enter a value from 1 to 200 MHz" ,
inst , "flashSYSCLK" ) ;
}
}
}
var flashModule = {
peripheralName : "FLASH" ,
displayName : "FLASH" ,
maxInstances : deviceNumberOfInstances ,
defaultInstanceName : "myFMC" ,
description : "FLASH" ,
longDescription : longDescription ,
filterHardware : filterHardware ,
config : config ,
moduleInstances : ( inst ) => {
if ( inst . registerInterrupts )
{
var dlibname = "INT_FLASH_CORR_ERR"
if ( [ 'F28004x' , 'F28002x' , 'F28003x' , 'F2837xS' , 'F2837xD' , 'F2807x' ] . includes ( Common . getDeviceName ( ) ) )
{
return [ {
name : "flashInt" ,
displayName : "Flash Correctable Error Interrupt" ,
moduleName : "/driverlib/interrupt.js" ,
collapsed : true ,
args : {
$name : inst . $name + "_INT" ,
int : "INT_" + inst . $name ,
pinmuxPeripheralModule : "" ,
driverlibInt : dlibname
}
} ]
}
}
return [ ] ;
} ,
sharedModuleInstances : sharedModuleInstances ,
templates : {
boardc : "/driverlib/flash/flash.board.c.xdt" ,
boardh : "/driverlib/flash/flash.board.h.xdt"
} ,
moduleStatic : {
name : "flashGlobal" ,
displayName : "Flash Global" ,
config : globalConfig ,
collapsed : false ,
//modules: moduleStaticModules,
validate : onValidateStatic
} ,
validate : onValidate
} ;
if ( flashModule . maxInstances <= 0 ) {
delete flashModule . pinmuxRequirements ;
}
exports = flashModule ;