diff options
Diffstat (limited to '_includes')
-rw-r--r-- | _includes/ymodem_lantiq.html | 205 |
1 files changed, 205 insertions, 0 deletions
diff --git a/_includes/ymodem_lantiq.html b/_includes/ymodem_lantiq.html new file mode 100644 index 0000000..2dc5c84 --- /dev/null +++ b/_includes/ymodem_lantiq.html @@ -0,0 +1,205 @@ +<div class="modal" data-jtd-modal="flash-modal" data-jtd-modal-backdrop="static" id="flash-modal"> + <div class="modal-content"> + <div class="modal-header"> + <span class="close">×</span> + <h2>Flash firmware</h2> + </div> + <form id="flash-form" class="p-4" novalidate> + <div class="form-floating mb-3"> + <input type="file" class="form-control" placeholder="Flash MTD" name="flash-mtd" id="flash-mtd" required> + <label for="flash-mtd">Flash MTD</label> + </div> + <div class="mb-3 form-check"> + <input type="checkbox" class="form-check-input" id="baud-rate-oc" name="baud-rate-oc"> + <label class="form-check-label" for="baud-rate-oc">230400 baud rate, do not enable unless told to do so</label> + </div> + <div class="form-check"> + <input class="form-check-input" type="radio" name="image" id="image0" value="image0"> + <label class="form-check-label" for="image0"> + Image 0 + </label> + </div> + <div class="form-check"> + <input class="form-check-input" type="radio" name="image" id="image1" value="image1"> + <label class="form-check-label" for="image1"> + Image 1 + </label> + </div> + <div class="mb-3"> + <input type="submit" class="btn btn-primary" value="Flash!"> + </div> + <progress id="flash-progress" value="0" max="100"></progress> + <p id="flash-text-step"></p> + </form> + </div> +</div> + +<script type="text/javascript" src="/assets/js/xymini.js"></script> +{% if include.dontLoadRootScript != true %} +<script type="text/javascript" src="/assets/js/rootLantiq.js"></script> +<script type="text/javascript" src="/assets/js/serialUtil.js"></script> +{% endif %} +<script> + if ('serial' in navigator) { + document.getElementById('flash-start-button').disabled = false; + } else { + document.getElementById('flash-browser-error').style.display = 'block'; + } + const acontroller = new AbortController(); + const cs = acontroller.signal; + let flashModal = document.getElementById("flash-modal"); + let flashForm = document.getElementById("flash-form"); + let flashProgress = document.getElementById("flash-progress"); + let flashTextStep = document.getElementById("flash-text-step"); + flashModal.addEventListener('modal-jtd-close', async function(event) { + acontroller.abort(); + }); + flashModal.addEventListener('modal-jtd-open', async function(event) { + flash({signal: cs}); + }); + function initTextStep() { + flashTextStep.textContent = ""; + flashTextStep.classList.remove('text-success-400'); + flashTextStep.classList.remove('text-error-400'); + } + function pause(message) { + flashTextStep.textContent = message; + } + function loading(message) { + flashTextStep.textContent = message; + } + function showError(message) { + flashTextStep.textContent = message; + flashTextStep.classList.add('text-error-400'); + flashTextStep.classList.remove('text-success-400'); + } + function showSuccess(message) { + flashTextStep.textContent = message; + flashTextStep.classList.add('text-success-400'); + flashTextStep.classList.remove('text-error-400'); + } + async function flash({ signal } = {}) { + initTextStep(); + let port; + try { + port = await navigator.serial.requestPort(); + } catch (err) { + showError(`Error: ${err.message}`); + console.log(`Error: ${err.message}\n`); + return; + } + if (!port) { + showError('Error: port not open'); + console.log('Error: port not open\n'); + return; + } + flashForm.addEventListener('submit', async function(event) { + if (!flashForm.checkValidity()) { + event.preventDefault(); + [...flashForm.elements].map(function(e){return e.parentNode}).forEach(function(e){e.classList.toogle('was-validated', true)}); + } else { + event.preventDefault(); + [...flashForm.elements].map(function(e){return e.parentNode}).forEach(function(e){e.classList.toogle('was-validated', false)}); + var fomrdata = new FormData(flashForm); + var file = fomrdata.get('flash-mtd'); + var image = fomrdata.get('image'); + var data = new Uint8Array(await file.arrayBuffer()); + console.log(data); + + /* Unlock U-Boot if needed and stop booting */ + let result = await lantiqRootUboot(port, "{{include.modelName}}", + (msg) => { + loading(msg); + console.log(msg); + }, + (err) => { + showError(err); + console.log(err); + } + ); + + if (!result) { + return; + } + + let baudrate = 115200; + if(fomrdata.has('baud-rate-oc')) { + let newBaudrate = 230400; + loading(`Changing baudrate to: ${newBaudrate}`); + + result = await changeBaudrate(port, newBaudrate, baudrate, + (err) => { + showError(err); + console.log(err); + } + ); + + if (result) { + baudrate = newBaudrate; + } else { + return; + } + } + + loading("Start sending image to the SFP..."); + result = await sendImageMtd(port, data, baudrate, + (err) => { + showError(err); + console.log(err); + }, + (byteTransfered) => { + const perc = (byteTransfered/data.length) * 100; + const percTrunc = Math.trunc(perc*100)/100; /* Two decimal trunc */ + flashProgress.value = perc; + loading(`Image transfer: ${percTrunc}% complete`) + } + ); + + if (!result) { + return; + } + + result = await waitEndImageLoad(port, baudrate, + (err) => { + showError(err); + console.log(err); + } + ); + + if (!result) { + return; + } + + if(fomrdata.has('baud-rate-oc')) { + let newBaudrate = 115200; + loading(`Restore baudrate to: ${newBaudrate}`); + + result = await changeBaudrate(port, newBaudrate, baudrate, + (err) => { + showError(err); + console.log(err); + } + ); + + if (result) { + baudrate = newBaudrate; + } else { + return; + } + } + + loading("Transfer complete, image flash in progress. DO NOT REMOVE the SFP!"); + result = await flashImageMtd(port, image, baudrate, + (err) => { + showError(err); + console.log(err); + } + ); + + if (result) { + showSuccess("Flash completed, now you can remove the SFP"); + } + } + }); + }; +</script>
\ No newline at end of file |