Comparing version 0.1.0 to 0.2.0
{ | ||
"name": "rap-esp32", | ||
"version": "0.1.0", | ||
"version": "0.2.0", | ||
"description": "Rap extension for esp32", | ||
@@ -5,0 +5,0 @@ "main": "src/index.js", |
@@ -11,3 +11,2 @@ 'use strict'; | ||
const deployment = require('./deployment'); | ||
const { flash } = require('./flash'); | ||
@@ -55,2 +54,6 @@ | ||
if (origin < 0) { | ||
origin = 4*1024*1024 - appBuffer.length; | ||
} | ||
let cp = flash({ | ||
@@ -65,2 +68,4 @@ binary: appPath, | ||
function generateApp(pathInfos, toCompile, origin) { | ||
const deployment = (origin < 0) ? require('./deployment') : require('./deploymentAbsolute'); | ||
let compilerCmd = findCommand(ruffCompiler); | ||
@@ -67,0 +72,0 @@ if (!compilerCmd) { |
@@ -9,9 +9,5 @@ /* eslint-disable camelcase */ | ||
//const LD_FMT = 'arm-none-eabi-ld -Ttext=0x%s --entry=0x%s --just-symbols=Symbol.map %s -o %s'; | ||
//const NM_FMT = 'arm-none-eabi-nm %s | grep \' T \' | awk \'{ print $1" "$3}\''; | ||
//const CP_FMT = 'arm-none-eabi-objcopy -j .text -j .rodata -O binary %s %s'; | ||
exports.mkapp = mkapp; | ||
function mkapp(origin, modsManifest, rofsManifest) { | ||
function mkapp(origin/*unused*/, modsManifest, rofsManifest) { | ||
// fix name for windows platform | ||
@@ -22,10 +18,7 @@ rofsManifest.forEach(item => { | ||
if (origin !== align4(origin)) { | ||
throw new Error('app origin must be 4k aligned!'); | ||
} | ||
let buffer = makeHeader(); | ||
// buffer = appendMods(origin, buffer, null); | ||
origin = 0; | ||
buffer = appendRofs(origin, buffer, rofsManifest); | ||
buffer = appendIndex(origin, buffer); | ||
@@ -59,175 +52,2 @@ return buffer; | ||
/* | ||
function linkObjects(textAddr, modsManifest) { | ||
let modBins = []; | ||
for (let i = 0; i < modsManifest.length; ++i) { | ||
const modItem = modsManifest[i]; | ||
// console.log('module:', modItem); | ||
const modName = modItem.name; | ||
const libName = getLibFileName(modName); | ||
const binName = getBinFileName(modName); | ||
// link objects | ||
{ | ||
const addr = textAddr.toString(16); | ||
const objs = modItem.objects.join(' '); | ||
const cmd = util.format(LD_FMT, addr, addr, objs, libName); | ||
// console.log(cmd); | ||
execSync(cmd); | ||
} | ||
// objcopy | ||
{ | ||
const cmd = util.format(CP_FMT, libName, binName); | ||
// console.log(cmd); | ||
execSync(cmd); | ||
} | ||
// record lib/bin info | ||
{ | ||
const cmd = util.format(NM_FMT, libName); | ||
const cmdOutput = execSync(cmd); | ||
const cmdOutputLines = cmdOutput.toString().split(/\r?\n/); | ||
const symbols = cmdOutputLines.map(line => { | ||
let [address, name] = line.split(' '); | ||
if (!address || !name) { | ||
return undefined; | ||
} | ||
address = parseInt(address, 16); | ||
return { | ||
name, | ||
address | ||
}; | ||
}) | ||
.filter(symbol => !!symbol) | ||
.sort((a, b) => a.name < b.name ? -1 : a.name > b.name ? 1 : 0); | ||
modBins.push({ | ||
name: modName, | ||
file: binName, | ||
symbols | ||
}); | ||
} | ||
// update text address | ||
{ | ||
const stat = fs.statSync(binName); | ||
textAddr += align4(stat.size); | ||
} | ||
printLine(); | ||
} | ||
return modBins; | ||
} | ||
*/ | ||
/* | ||
function appendMods(origin, buffer, modsManifest) { | ||
if (!(modsManifest instanceof Array) || modsManifest.length === 0) { | ||
updateUserAppIndex(buffer, { mods: 0 }); | ||
return buffer; | ||
} | ||
const relOrigin = buffer.length; | ||
// compiled object files => linked binary files | ||
const mods = linkObjects(origin + relOrigin, modsManifest); | ||
// console.log(util.inspect(mods, false)); | ||
printLine(); | ||
// calcuate offset and total size | ||
const sizeof = { | ||
// basic | ||
char: 1, | ||
// mods | ||
mods_t: 4, | ||
mods_module_t: 4 + 4 + 4, | ||
mods_symbol_t: 4 + 4 | ||
}; | ||
const relOffsets = {}; | ||
let relOffset = relOrigin; | ||
mods.forEach(mod => { | ||
relOffsets[mod.name] = relOffset; | ||
relOffset += align4(getFileSize(mod.file)); | ||
}); | ||
// mods_t | ||
relOffsets.mods_t = relOffset; | ||
relOffset += sizeof.mods_t; | ||
// mods_module_t | ||
relOffsets.mods_module_t = relOffset; | ||
relOffset += sizeof.mods_module_t * mods.length; | ||
// mods_symbol_t | ||
relOffsets.mods_symbol_t = relOffset; | ||
relOffset += sizeof.mods_symbol_t * mods.reduce((acc, elem) => { | ||
return acc + elem.symbols.length; | ||
}, 0); | ||
// chars | ||
relOffsets.char = relOffset; | ||
relOffset += sizeof.char * mods.reduce((size, mod) => { | ||
return size + (mod.name.length + 1) + mod.symbols.reduce((size, symbol) => { | ||
return size + (symbol.name.length + 1); | ||
}, 0); | ||
}, 0); | ||
// eof | ||
relOffsets.__eof__ = relOffset; | ||
// console.log(relOffsets); | ||
printLine(); | ||
// write to buffer | ||
buffer = Buffer.concat([buffer, Buffer.alloc(relOffsets.__eof__ - relOrigin, 0)]); | ||
// mod_t, mods_t.count | ||
buffer.writeUInt32LE(mods.length, relOffsets.mods_t); | ||
for (let mod of mods) { | ||
// binary | ||
const data = getFileData(mod.file); | ||
const begin = relOffsets[mod.name]; | ||
const end = begin + data.length; | ||
buffer.fill(data, begin, end); | ||
// mods_module_t | ||
// mods_module_t.name | ||
buffer.write(mod.name, relOffsets.char, mod.name.length); | ||
buffer.writeUInt32LE(origin + relOffsets.char, relOffsets.mods_module_t); | ||
relOffsets.char += mod.name.length + 1; | ||
relOffsets.mods_module_t += 4; | ||
// mods_module_t.symbols | ||
buffer.writeUInt32LE(origin + relOffsets.mods_symbol_t, relOffsets.mods_module_t); | ||
relOffsets.mods_module_t += 4; | ||
// mods_module_t.symbol_count | ||
buffer.writeUInt32LE(mod.symbols.length, relOffsets.mods_module_t); | ||
relOffsets.mods_module_t += 4; | ||
// mods_symbol_t | ||
for (let symbol of mod.symbols) { | ||
// mods_symbol_t.name | ||
buffer.write(symbol.name, relOffsets.char, symbol.name.length); | ||
buffer.writeUInt32LE(origin + relOffsets.char, relOffsets.mods_symbol_t); | ||
relOffsets.char += symbol.name.length + 1; | ||
relOffsets.mods_symbol_t += 4; | ||
// mods_symbol_t.address | ||
buffer.writeUInt32LE(symbol.address | 1, relOffsets.mods_symbol_t); | ||
relOffsets.mods_symbol_t += 4; | ||
} | ||
} | ||
// console.log(relOffsets); | ||
printLine(); | ||
// update userapp_t | ||
updateUserAppIndex(buffer, { mods: origin + relOffsets.mods_t }); | ||
return buffer; | ||
} | ||
*/ | ||
function appendRofs(origin, buffer, rofsManifest) { | ||
@@ -304,3 +124,3 @@ if (!(rofsManifest instanceof Array) || rofsManifest.length === 0) { | ||
// rofs_bucket_t.entries | ||
buffer.writeUInt32LE(origin + relOffsetMap.rofs_entry_t, bucketAddr); | ||
buffer.writeUInt32LE(relOffsetMap.rofs_entry_t, bucketAddr); | ||
bucketAddr += 4; | ||
@@ -311,3 +131,3 @@ // rofs_entry_t | ||
buffer.write(item.name, relOffsetMap.char, item.name.length); | ||
buffer.writeUInt32LE(origin + relOffsetMap.char, relOffsetMap.rofs_entry_t); | ||
buffer.writeUInt32LE(relOffsetMap.char, relOffsetMap.rofs_entry_t); | ||
relOffsetMap.char += item.name.length + 1; | ||
@@ -320,3 +140,3 @@ relOffsetMap.rofs_entry_t += 4; | ||
buffer.fill(dat, beginDat, endDat); | ||
buffer.writeUInt32LE(origin + beginDat, relOffsetMap.rofs_entry_t); | ||
buffer.writeUInt32LE(beginDat, relOffsetMap.rofs_entry_t); | ||
relOffsetMap.char = endDat + 1; | ||
@@ -331,3 +151,3 @@ relOffsetMap.rofs_entry_t += 4; | ||
// update userapp_t | ||
updateUserAppIndex(buffer, { rofs: origin + relOffsetMap.rofs_t }); | ||
updateUserAppIndex(buffer, { rofs: relOffsetMap.rofs_t }); | ||
@@ -337,2 +157,23 @@ return buffer; | ||
function appendIndex(origin, buffer) { | ||
const pageSize = 4 * 1024; | ||
// add padding to app | ||
let paddingSize = Math.floor((buffer.length + pageSize - 1) / pageSize) * pageSize - buffer.length; | ||
let paddingBuf = Buffer.alloc(paddingSize); | ||
buffer = Buffer.concat([buffer, paddingBuf]); | ||
// create index | ||
let indexBuf = Buffer.alloc(pageSize); | ||
let offset = 0; | ||
// write magic | ||
offset += indexBuf.write('INDX', offset); | ||
// write app size | ||
offset += indexBuf.writeUInt32LE(buffer.length, offset); | ||
buffer = Buffer.concat([buffer, indexBuf]); | ||
return buffer; | ||
} | ||
/////////////// | ||
@@ -339,0 +180,0 @@ // UTILITIES // |
@@ -40,16 +40,16 @@ 'use strict'; | ||
case 'win32': { | ||
// let arglst = []; | ||
// if (options.erase) { | ||
// arglst.push('-e', 'all'); | ||
// } | ||
// arglst = arglst.concat([ | ||
// '-r', | ||
// '-i', 'ICDI', | ||
// '-o', `0x${options.address.toString(16)}`, | ||
// options.binary | ||
// ]); | ||
// return buildCommand({ | ||
// cmd: 'LMFlash.exe', | ||
// args: arglst | ||
// }); | ||
let arglst = []; | ||
if (options.erase) { | ||
arglst.push('-e', 'all'); | ||
} | ||
arglst = arglst.concat([ | ||
'-r', | ||
'-i', 'ICDI', | ||
'-o', `0x${options.address.toString(16)}`, | ||
options.binary | ||
]); | ||
return buildCommand({ | ||
cmd: 'LMFlash.exe', | ||
args: arglst | ||
}); | ||
} | ||
@@ -56,0 +56,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
22786
9
707
5
5