IPC Flash Partitions Calculator
IPC Flash Partitions Calculator
IPC Flash Partitions Calculator
Total flash memory size
8MB
16MB
32MB
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);