IPC Flash Partitions Calculator

Image: thingino logo
IPC Flash Partitions Calculator

IPC Flash Partitions Calculator

The sum of all the partitions is greater than the size of the flash chip!

'; ci += 1; }) html += ''; $('#progress').innerHTML += '
'; pi += 1; }) $('#partitions').innerHTML = html; } function alignValue(el) { el.value = Math.ceil(convertSize(el.value) / AlignBlock) * AlignBlock; recalculate(); } function convertSize(partition_size) { if (partition_size === '' || partition_size === '0' || partition_size === '-') { return partition_size; } else if (partition_size.startsWith('0x')) { partition_size = partition_size.replace(/^0x/, ''); partition_size = parseInt(partition_size, 16); } else if (partition_size.endsWith('m')) { partition_size = partition_size.replace(/m$/, ''); partition_size = Math.ceil(parseFloat(partition_size) * 1024 * 1024); } else if (partition_size.endsWith('k')) { partition_size = partition_size.replace(/k$/, ''); partition_size = Math.ceil(parseFloat(partition_size) * 1024); } else { partition_size = Math.ceil(parseFloat(partition_size)); } if (isNaN(partition_size) || partition_size < 0) partition_size = ''; return partition_size; } function recalculate() { $('#oversize').classList.add('d-none'); let mtdparts = 'mtdparts=jz_sfc:'; let flash_size = flash_size_mb * 1024 * 1024; let offset_dec = 0; let firstEmpty = 0; // reset progressbar $$('.progress-bar').forEach(el => el.style.width = '0'); // loop thru partitions $$('div.partition').forEach(el => { const partition_number = parseInt(el.dataset.number); // reset all fields el.querySelectorAll('input.hex, input.dec').forEach(el2 => el2.value = ''); const elPartitionSize = el.querySelector('div.size_user input'); // normalize partition size value let partition_size = elPartitionSize.value.toString().toLowerCase(); partition_size = convertSize(partition_size); let mtdparts_addition = ''; if (partition_size === '') { return } else if (partition_size === '0') { partition_size = 0 } else if (partition_size === '-') { partition_size = flash_size - firstEmpty; mtdparts_addition = '-(' + $('#p' + partition_number + 'name').value + ')'; } if (isAligned(partition_size)) { elPartitionSize.title = ''; elPartitionSize.classList.remove('is-invalid'); //elPartitionSize.removeEventListener('click'); } else { elPartitionSize.title = 'Size is not aligned! Click to align.'; elPartitionSize.classList.add('is-invalid'); elPartitionSize.addEventListener('click', evt => alignValue(evt.target)); } // move needle firstEmpty += partition_size; // start of the partition let partition_start_dec = offset_dec; // end of the partition let partition_end_dec = partition_start_dec + partition_size - 1; if (partition_end_dec > flash_size) $('#oversize').classList.remove('d-none'); // offset offset_dec += partition_size; el.querySelector('div.start input').value = '0x' + partition_start_dec.toString(16).toUpperCase(); el.querySelector('div.end input').value = '0x' + partition_end_dec.toString(16).toUpperCase(); el.querySelector('div.size_hex input').value = '0x' + partition_size.toString(16).toUpperCase(); el.querySelector('div.size_dec input').value = partition_size.toString().split('').reverse().join('').match(/.{1,3}/g).join(',').split('').reverse().join('').replace(/\s\./g, '.'); // update progressbar $('#pbp' + partition_number).style.width = (partition_size / flash_size * pbFullWidth) + 'px'; // update mtdparts if (mtdparts_addition === '') mtdparts_addition = Math.ceil(partition_size / 1024) + 'k(' + $('#p' + partition_number + 'name').value + '),' mtdparts += mtdparts_addition; }); $('#mtdparts').textContent = mtdparts; } function updateFlashSizeMb() { flash_size_mb = $('input[name=flash_size_mb]:checked').dataset['size']; recalculate(); } function initPage() { $$('input[name=flash_size_mb]').forEach(el => el.addEventListener('change', updateFlashSizeMb)); populate(); updateFlashSizeMb(); $$('input.free').forEach(el => { el.addEventListener('focus', evt => { evt.preventDefault(); evt.target.select(); }); el.addEventListener('change', recalculate); }); $$('input[readonly]').forEach(el => el.tabIndex = -1); $$('input[data-color]').forEach(el => el.style.borderColor = Palette[el.dataset['color']]); $$('div[data-color]').forEach(el => el.style.backgroundColor = Palette[el.dataset['color']]); recalculate(); } window.addEventListener('load', initPage);