mirror of
https://github.com/openmv/openmv.git
synced 2025-11-04 14:49:50 +08:00
Merge pull request #2393 from openmv/alif_tools
tools/Alif: Add Alif tools.
This commit is contained in:
commit
4e4f9ba377
8
.gitignore
vendored
8
.gitignore
vendored
@ -47,3 +47,11 @@ openmv.creator
|
|||||||
openmv.creator.user
|
openmv.creator.user
|
||||||
openmv.files
|
openmv.files
|
||||||
openmv.includes
|
openmv.includes
|
||||||
|
|
||||||
|
# Alif tools temp files
|
||||||
|
######################
|
||||||
|
tools/alif/**/*.cfg
|
||||||
|
tools/alif/**/*.crt
|
||||||
|
tools/alif/**/*.ds
|
||||||
|
tools/alif/**/*.bin.sign
|
||||||
|
tools/alif/**/*map.txt
|
||||||
|
|||||||
131
tools/alif/LICENSE
Normal file
131
tools/alif/LICENSE
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
Alif Semiconductor Software License Agreement
|
||||||
|
=============================================
|
||||||
|
|
||||||
|
IMPORTANT: PLEASE READ CAREFULLY THE FOLLOWING ALIF SEMICONDUCTOR SINGAPORE
|
||||||
|
PTE. LTD. ("ALIF") SOFTWARE LICENSE AGREEMENT ("AGREEMENT").
|
||||||
|
BY INSTALLING, COPYING, DOWNLOADING, ACCESSING OR OTHERWISE USING THIS
|
||||||
|
SOFTWARE PACKAGE OR ANY PART THEREOF (AND THE RELATED DOCUMENTATION) FROM
|
||||||
|
Alif SEMICONDUCTOR, YOU AGREE ON BEHALF OF YOURSELF OR ON BEHALF OF ANY
|
||||||
|
ENTITY BY WHICH YOU ARE EMPLOYED TO BE BOUND BY THIS AGREEMENT.
|
||||||
|
|
||||||
|
Under Alif Semiconductors' intellectual property rights and subject to
|
||||||
|
applicable licensing terms for any third-party software incorporated in this
|
||||||
|
software package and applicable Open Source Terms (as defined here below),
|
||||||
|
You may use and redistribute the Software, in source and binary forms, with
|
||||||
|
or without modification, provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions in source form (including any additions or modifications
|
||||||
|
to or derivative works of the Software) must retain Alif's copyright notice
|
||||||
|
and all other copyright notices, this list of conditions and the following
|
||||||
|
disclaimers and terms.
|
||||||
|
|
||||||
|
2. Redistributions in binary form, except as embedded into microcontroller
|
||||||
|
or microprocessor device manufactured by or for Alif Semiconductor, or a
|
||||||
|
software update for such device, must reproduce Alif's copyright notice, this
|
||||||
|
list of conditions and the following disclaimers and terms in the Software
|
||||||
|
and in the documentation and any other materials provided with the
|
||||||
|
distribution.
|
||||||
|
|
||||||
|
3. Neither the name of Alif nor the names of its suppliers may be used to
|
||||||
|
endorse or promote products derived from this Software without specific prior
|
||||||
|
written permission.
|
||||||
|
|
||||||
|
4. The Software (including any additions or modifications to or derivative
|
||||||
|
works of the Software) may only be used with and executed on Alif
|
||||||
|
Semiconductors microcontroller, integrated circuits and SOC products.
|
||||||
|
|
||||||
|
5. Any use, reproduction, or redistribution of the Software (including any
|
||||||
|
derivative works thereof) may not be done in a manner or way that would
|
||||||
|
subject the Software to any "copyleft" license or other similar licensing
|
||||||
|
or distribution model, including any which would require the Software be
|
||||||
|
licensed under any such license. "Copyleft" license includes the GNU
|
||||||
|
General Public License, the GNU Library General Public License, the GNU
|
||||||
|
Lesser General Public License, the Affero General Public License, the
|
||||||
|
Mozilla Public License, the Common Development and Distribution License,
|
||||||
|
the Eclipse Public License, and any Creative Commons "sharealike" license.
|
||||||
|
|
||||||
|
6. You shall comply with all laws and regulations applicable to your use,
|
||||||
|
transfer, import or export of the Software (including any derivative works
|
||||||
|
thereof), including any applicable export control law or regulation.
|
||||||
|
|
||||||
|
Alif and its suppliers own all right, title and interest in and to the
|
||||||
|
Software, including all copies thereof. Except as provided in the preceding
|
||||||
|
section, Alif grants no licenses or other rights by implication, estoppel or
|
||||||
|
otherwise to, any patent, copyright, trademark, trade name, service mark or
|
||||||
|
other intellectual property licenses or rights of Alif. All rights not
|
||||||
|
expressly granted by Alif are hereby reserved. There are no implied rights.
|
||||||
|
|
||||||
|
This Agreement will automatically terminate if you fail to comply with any
|
||||||
|
terms or conditions of this Agreement, including any of the above conditions.
|
||||||
|
Your license to use the Software immediately terminates if you breach this
|
||||||
|
Agreement.
|
||||||
|
|
||||||
|
Alif may make changes to the Software, at any time without notice. Alif has
|
||||||
|
no obligation to update, support, or provide training for the Software.
|
||||||
|
|
||||||
|
The Software may contain open source software, third party software, or other
|
||||||
|
Alif software, including any that may be identified in the Software itself or
|
||||||
|
in the files (if any) accompanying the Software as licensed separately under
|
||||||
|
the terms of another license or agreement (collectively, the "Other
|
||||||
|
Software"). The Other Software is not licensed under this Agreement. Rather,
|
||||||
|
it is licensed to you under the terms of the applicable open source licenses,
|
||||||
|
third party license or other Alif license agreements (the "Other Software
|
||||||
|
Terms"), including any that may accompany the Software. Copyrights to the
|
||||||
|
Other Software are held by copyright holders indicated in the Other Software
|
||||||
|
Terms. To the extent required by the Other Software Terms, Alif will make
|
||||||
|
such open source software available upon written request to Alif.
|
||||||
|
|
||||||
|
ALIF PROVIDES THE SOFTWARE "AS-IS." TO THE MAXIMUM EXTENT PERMITTED BY
|
||||||
|
APPLICABLE LAW, ALIF DISCLAIMS AND EXCLUDES ALL WARRANTIES AND CONDITIONS,
|
||||||
|
WHETHER STATUTORY, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
|
||||||
|
TITLE, QUIET ENJOYMENT, ACCURACY, AND NON-INFRINGEMENT OF THIRD-PARTY RIGHTS.
|
||||||
|
The Software is not intended for use in nuclear power, military, emergency,
|
||||||
|
or medical settings or applications or any life safety, critical purpose, or
|
||||||
|
other systems or applications where the use or failure of the Software may
|
||||||
|
lead to death, bodily injury, damage to person or property or environmental
|
||||||
|
damage. You agree that you are fully responsible for any claims, costs,
|
||||||
|
damages, expenses, and attorneys' fees arising out of any such use, even if
|
||||||
|
any claim alleges that Alif was negligent regarding the design or manufacture
|
||||||
|
of the Software.
|
||||||
|
|
||||||
|
IN NO EVENT SHALL ALIF OR ITS SUPPLIERS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR FOR ANY COST OF
|
||||||
|
COVER, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF USE, DATA, OR
|
||||||
|
PROFITS, BUSINESS INTERRUPTION, OR OTHER LOSS ARISING OUT OF OR IN CONNECTION
|
||||||
|
WITH THE SOFTWARE, HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
|
||||||
|
SOUNDING IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
OTHERWISE), EVEN IF ALIF HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES,
|
||||||
|
NOTWITHSTANDING ANY FAILURE OF THE ESSENTIAL PURPOSE OF THIS AGREEMENT OR ANY
|
||||||
|
LIMITED REMEDY HEREUNDER.
|
||||||
|
|
||||||
|
If you provide Alif with any feedback, suggestions, comments, modifications,
|
||||||
|
corrections, enhancements or other input relating to the Software
|
||||||
|
("Feedback"), Alif will be free to use, disclose, reproduce, license,
|
||||||
|
distribute and otherwise exploit the Feedback in its sole discretion without
|
||||||
|
any obligations or restrictions of any kind, including without limitation,
|
||||||
|
intellectual property rights or licensing obligations. Alif has no obligation
|
||||||
|
to use any Feedback.
|
||||||
|
|
||||||
|
The laws of the State of California and the United States govern all matters
|
||||||
|
arising out of this Agreement, excluding their conflicts of laws principles.
|
||||||
|
All disputes will be brought exclusively in the state or federal courts in
|
||||||
|
the Northern District of California, except Alif may bring an action, suit
|
||||||
|
or proceeding anywhere as needed to protect its technology and intellectual
|
||||||
|
property rights. Each party agrees that it submits to the personal
|
||||||
|
jurisdiction and venue of the state or federal courts in the Northern
|
||||||
|
District of California and waives any objections. The United Nations
|
||||||
|
Convention on Contracts for the International Sale of Goods (1980) is hereby
|
||||||
|
excluded in its entirety from Software to this Agreement.
|
||||||
|
|
||||||
|
If any provision of this Agreement is found to be invalid, illegal or
|
||||||
|
unenforceable, the validity, legality and enforceability of any of the
|
||||||
|
remaining provisions shall not in any way be affected or impaired and a
|
||||||
|
valid, legal and enforceable provision of similar intent and economic impact
|
||||||
|
shall be substituted therefore. This Agreement sets forth the entire
|
||||||
|
understanding and agreement between you and Alif, supersedes all prior
|
||||||
|
agreements, whether written or oral, with respect to the Software, and may
|
||||||
|
be amended only in a writing signed by both parties that identifies itself
|
||||||
|
as an amendment to this Agreement.
|
||||||
|
|
||||||
|
Rev. 10/2022
|
||||||
BIN
tools/alif/alif/SP-AE101F4071542LH-rev-b2-dev.bin
Executable file
BIN
tools/alif/alif/SP-AE101F4071542LH-rev-b2-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE101F4071542LH-rev-b2-dev.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE101F4071542LH-rev-b2-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE101F4071542LH-rev-b2.bin
Executable file
BIN
tools/alif/alif/SP-AE101F4071542LH-rev-b2.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE101F4071542LH-rev-b2.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE101F4071542LH-rev-b2.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE101F4071542LH-rev-b3-dev.bin
Executable file
BIN
tools/alif/alif/SP-AE101F4071542LH-rev-b3-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE101F4071542LH-rev-b3-dev.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE101F4071542LH-rev-b3-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE101F4071542LH-rev-b3.bin
Executable file
BIN
tools/alif/alif/SP-AE101F4071542LH-rev-b3.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE101F4071542LH-rev-b3.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE101F4071542LH-rev-b3.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F40C1537LE-rev-b2-dev.bin
Executable file
BIN
tools/alif/alif/SP-AE302F40C1537LE-rev-b2-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F40C1537LE-rev-b2-dev.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE302F40C1537LE-rev-b2-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F40C1537LE-rev-b2.bin
Executable file
BIN
tools/alif/alif/SP-AE302F40C1537LE-rev-b2.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F40C1537LE-rev-b2.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE302F40C1537LE-rev-b2.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F40C1537LE-rev-b3-dev.bin
Executable file
BIN
tools/alif/alif/SP-AE302F40C1537LE-rev-b3-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F40C1537LE-rev-b3-dev.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE302F40C1537LE-rev-b3-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F40C1537LE-rev-b3.bin
Executable file
BIN
tools/alif/alif/SP-AE302F40C1537LE-rev-b3.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F40C1537LE-rev-b3.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE302F40C1537LE-rev-b3.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80C1557LE-rev-b2-dev.bin
Executable file
BIN
tools/alif/alif/SP-AE302F80C1557LE-rev-b2-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80C1557LE-rev-b2-dev.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE302F80C1557LE-rev-b2-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80C1557LE-rev-b2.bin
Executable file
BIN
tools/alif/alif/SP-AE302F80C1557LE-rev-b2.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80C1557LE-rev-b2.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE302F80C1557LE-rev-b2.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80C1557LE-rev-b3-dev.bin
Executable file
BIN
tools/alif/alif/SP-AE302F80C1557LE-rev-b3-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80C1557LE-rev-b3-dev.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE302F80C1557LE-rev-b3-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80C1557LE-rev-b3.bin
Executable file
BIN
tools/alif/alif/SP-AE302F80C1557LE-rev-b3.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80C1557LE-rev-b3.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE302F80C1557LE-rev-b3.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80F55D5AE-rev-b2-dev.bin
Executable file
BIN
tools/alif/alif/SP-AE302F80F55D5AE-rev-b2-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80F55D5AE-rev-b2-dev.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE302F80F55D5AE-rev-b2-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80F55D5AE-rev-b2.bin
Executable file
BIN
tools/alif/alif/SP-AE302F80F55D5AE-rev-b2.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80F55D5AE-rev-b2.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE302F80F55D5AE-rev-b2.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80F55D5AE-rev-b3-dev.bin
Executable file
BIN
tools/alif/alif/SP-AE302F80F55D5AE-rev-b3-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80F55D5AE-rev-b3-dev.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE302F80F55D5AE-rev-b3-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80F55D5AE-rev-b3.bin
Executable file
BIN
tools/alif/alif/SP-AE302F80F55D5AE-rev-b3.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80F55D5AE-rev-b3.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE302F80F55D5AE-rev-b3.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80F55D5LE-rev-b2-dev.bin
Executable file
BIN
tools/alif/alif/SP-AE302F80F55D5LE-rev-b2-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80F55D5LE-rev-b2-dev.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE302F80F55D5LE-rev-b2-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80F55D5LE-rev-b2.bin
Executable file
BIN
tools/alif/alif/SP-AE302F80F55D5LE-rev-b2.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80F55D5LE-rev-b2.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE302F80F55D5LE-rev-b2.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80F55D5LE-rev-b3-dev.bin
Executable file
BIN
tools/alif/alif/SP-AE302F80F55D5LE-rev-b3-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80F55D5LE-rev-b3-dev.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE302F80F55D5LE-rev-b3-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80F55D5LE-rev-b3.bin
Executable file
BIN
tools/alif/alif/SP-AE302F80F55D5LE-rev-b3.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE302F80F55D5LE-rev-b3.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE302F80F55D5LE-rev-b3.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE512F80F55D5AS-rev-b2-dev.bin
Executable file
BIN
tools/alif/alif/SP-AE512F80F55D5AS-rev-b2-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE512F80F55D5AS-rev-b2-dev.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE512F80F55D5AS-rev-b2-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE512F80F55D5AS-rev-b2.bin
Executable file
BIN
tools/alif/alif/SP-AE512F80F55D5AS-rev-b2.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE512F80F55D5AS-rev-b2.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE512F80F55D5AS-rev-b2.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE512F80F55D5AS-rev-b3-dev.bin
Executable file
BIN
tools/alif/alif/SP-AE512F80F55D5AS-rev-b3-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE512F80F55D5AS-rev-b3-dev.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE512F80F55D5AS-rev-b3-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE512F80F55D5AS-rev-b3.bin
Executable file
BIN
tools/alif/alif/SP-AE512F80F55D5AS-rev-b3.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE512F80F55D5AS-rev-b3.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE512F80F55D5AS-rev-b3.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE512F80F55D5LS-rev-b2-dev.bin
Executable file
BIN
tools/alif/alif/SP-AE512F80F55D5LS-rev-b2-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE512F80F55D5LS-rev-b2-dev.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE512F80F55D5LS-rev-b2-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE512F80F55D5LS-rev-b2.bin
Executable file
BIN
tools/alif/alif/SP-AE512F80F55D5LS-rev-b2.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE512F80F55D5LS-rev-b2.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE512F80F55D5LS-rev-b2.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE512F80F55D5LS-rev-b3-dev.bin
Executable file
BIN
tools/alif/alif/SP-AE512F80F55D5LS-rev-b3-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE512F80F55D5LS-rev-b3-dev.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE512F80F55D5LS-rev-b3-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE512F80F55D5LS-rev-b3.bin
Executable file
BIN
tools/alif/alif/SP-AE512F80F55D5LS-rev-b3.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE512F80F55D5LS-rev-b3.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE512F80F55D5LS-rev-b3.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE722F80F55D5AS-rev-b2-dev.bin
Executable file
BIN
tools/alif/alif/SP-AE722F80F55D5AS-rev-b2-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE722F80F55D5AS-rev-b2-dev.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE722F80F55D5AS-rev-b2-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE722F80F55D5AS-rev-b2.bin
Executable file
BIN
tools/alif/alif/SP-AE722F80F55D5AS-rev-b2.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE722F80F55D5AS-rev-b2.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE722F80F55D5AS-rev-b2.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE722F80F55D5AS-rev-b3-dev.bin
Executable file
BIN
tools/alif/alif/SP-AE722F80F55D5AS-rev-b3-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE722F80F55D5AS-rev-b3-dev.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE722F80F55D5AS-rev-b3-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE722F80F55D5AS-rev-b3.bin
Executable file
BIN
tools/alif/alif/SP-AE722F80F55D5AS-rev-b3.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE722F80F55D5AS-rev-b3.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE722F80F55D5AS-rev-b3.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE722F80F55D5LS-rev-b2-dev.bin
Executable file
BIN
tools/alif/alif/SP-AE722F80F55D5LS-rev-b2-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE722F80F55D5LS-rev-b2-dev.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE722F80F55D5LS-rev-b2-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE722F80F55D5LS-rev-b2.bin
Executable file
BIN
tools/alif/alif/SP-AE722F80F55D5LS-rev-b2.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE722F80F55D5LS-rev-b2.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE722F80F55D5LS-rev-b2.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE722F80F55D5LS-rev-b3-dev.bin
Executable file
BIN
tools/alif/alif/SP-AE722F80F55D5LS-rev-b3-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE722F80F55D5LS-rev-b3-dev.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE722F80F55D5LS-rev-b3-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE722F80F55D5LS-rev-b3.bin
Executable file
BIN
tools/alif/alif/SP-AE722F80F55D5LS-rev-b3.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/SP-AE722F80F55D5LS-rev-b3.bin.sign
Executable file
BIN
tools/alif/alif/SP-AE722F80F55D5LS-rev-b3.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/offset-18-rev-b2-dev.bin
Executable file
BIN
tools/alif/alif/offset-18-rev-b2-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/offset-18-rev-b2-dev.bin.sign
Executable file
BIN
tools/alif/alif/offset-18-rev-b2-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/offset-18-rev-b2.bin
Executable file
BIN
tools/alif/alif/offset-18-rev-b2.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/offset-18-rev-b2.bin.sign
Executable file
BIN
tools/alif/alif/offset-18-rev-b2.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/offset-18-rev-b3-dev.bin
Executable file
BIN
tools/alif/alif/offset-18-rev-b3-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/offset-18-rev-b3-dev.bin.sign
Executable file
BIN
tools/alif/alif/offset-18-rev-b3-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/offset-18-rev-b3.bin
Executable file
BIN
tools/alif/alif/offset-18-rev-b3.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/offset-18-rev-b3.bin.sign
Executable file
BIN
tools/alif/alif/offset-18-rev-b3.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/offset-58-rev-b2-dev.bin
Executable file
BIN
tools/alif/alif/offset-58-rev-b2-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/offset-58-rev-b2-dev.bin.sign
Executable file
BIN
tools/alif/alif/offset-58-rev-b2-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/offset-58-rev-b2.bin
Executable file
BIN
tools/alif/alif/offset-58-rev-b2.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/offset-58-rev-b2.bin.sign
Executable file
BIN
tools/alif/alif/offset-58-rev-b2.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/offset-58-rev-b3-dev.bin
Executable file
BIN
tools/alif/alif/offset-58-rev-b3-dev.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/offset-58-rev-b3-dev.bin.sign
Executable file
BIN
tools/alif/alif/offset-58-rev-b3-dev.bin.sign
Executable file
Binary file not shown.
BIN
tools/alif/alif/offset-58-rev-b3.bin
Executable file
BIN
tools/alif/alif/offset-58-rev-b3.bin
Executable file
Binary file not shown.
BIN
tools/alif/alif/offset-58-rev-b3.bin.sign
Executable file
BIN
tools/alif/alif/offset-58-rev-b3.bin.sign
Executable file
Binary file not shown.
202
tools/alif/app-assets-gen.py
Executable file
202
tools/alif/app-assets-gen.py
Executable file
@ -0,0 +1,202 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import struct
|
||||||
|
import argparse
|
||||||
|
from utils.config import *
|
||||||
|
from utils.toc_common import *
|
||||||
|
import json
|
||||||
|
from json.decoder import JSONDecodeError
|
||||||
|
|
||||||
|
# Define Version constant for each separate tool
|
||||||
|
#0.01.000 Initial version
|
||||||
|
#0.02.000 added checksum for integrity
|
||||||
|
# passed ASSET_TYPE as a flag and used this placeholder for checksum
|
||||||
|
TOOL_VERSION ="0.02.000"
|
||||||
|
|
||||||
|
EXIT_WITH_ERROR = 1
|
||||||
|
|
||||||
|
#OUTPUT_FILE = 'build/assets-rev-b0.bin'
|
||||||
|
ASSET_ID = "APPASSET"
|
||||||
|
ASSET_VER = 1
|
||||||
|
CHECK_SUM = 0x00
|
||||||
|
|
||||||
|
HBK0_KEY = 'utils/key/hbk1.bin'
|
||||||
|
PROV_KEY = 'utils/key/oem_prov_asset.bin'
|
||||||
|
ENC_KEY = 'utils/key/oem_enc_asset.bin'
|
||||||
|
|
||||||
|
# DO NOT Alter the sequence of the following items in the list as it determines
|
||||||
|
# the bit position in the final value
|
||||||
|
OPTIONS = ['ENCRYPTED_ASSETS','TEST_MODE']
|
||||||
|
|
||||||
|
OPTION_FLAGS = 0x00
|
||||||
|
|
||||||
|
def read_asset_config(cfgFile):
|
||||||
|
f = open(cfgFile, 'r')
|
||||||
|
try:
|
||||||
|
cfg = json.load(f)
|
||||||
|
|
||||||
|
except JSONDecodeError as e:
|
||||||
|
print("ERROR in JSON file.")
|
||||||
|
print(str(e))
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
except ValueError as v:
|
||||||
|
print("ERROR in JSON file:")
|
||||||
|
print(str(v))
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
except:
|
||||||
|
print("ERROR: Unknown error loading JSON file")
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
f.close()
|
||||||
|
return cfg
|
||||||
|
|
||||||
|
def create_package(outFile):
|
||||||
|
print('Creating Assets Package...')
|
||||||
|
with open(outFile, 'wb') as f:
|
||||||
|
f.write(ASSET_ID.encode('utf8'))
|
||||||
|
f.write(struct.pack("H", ASSET_VER))
|
||||||
|
f.write(struct.pack("H", CHECK_SUM))
|
||||||
|
f.write(struct.pack("I", OPTION_FLAGS))
|
||||||
|
with open(HBK0_KEY, 'rb') as i:
|
||||||
|
f.write(i.read())
|
||||||
|
with open(PROV_KEY, 'rb') as i:
|
||||||
|
f.write(i.read())
|
||||||
|
f.write(('\0' * 48).encode('utf8'))
|
||||||
|
with open(ENC_KEY, 'rb') as i:
|
||||||
|
f.write(i.read())
|
||||||
|
f.write(('\0' * 48).encode('utf8'))
|
||||||
|
|
||||||
|
def decodeFlags(assetFlags):
|
||||||
|
print('')
|
||||||
|
print('Provisioning Options:')
|
||||||
|
for option in OPTIONS:
|
||||||
|
fill = 20 - len(option)
|
||||||
|
label = option + (fill * ' ')
|
||||||
|
if assetFlags & (1<<OPTIONS.index(option)):
|
||||||
|
print(label + 'ON')
|
||||||
|
else:
|
||||||
|
print(label + '\tOFF')
|
||||||
|
|
||||||
|
def check_package(outFile):
|
||||||
|
print('Checking Assets Package...')
|
||||||
|
# check integrity
|
||||||
|
total = getChecksum(outFile)
|
||||||
|
if total != 0:
|
||||||
|
print('ERROR: Package integrity')
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
else:
|
||||||
|
print('Package integrity Ok!')
|
||||||
|
|
||||||
|
with open(outFile, 'rb') as f:
|
||||||
|
assetID = f.read(8).decode("utf-8").rstrip('\0')
|
||||||
|
assetVer = int.from_bytes(f.read(2),"little", signed=False)
|
||||||
|
assetType = int.from_bytes(f.read(2),"little", signed=False)
|
||||||
|
assetFlags = int.from_bytes(f.read(4),"little", signed=False)
|
||||||
|
print('AssetID: ' + assetID)
|
||||||
|
print('Asset Version: ' + str(assetVer))
|
||||||
|
decodeFlags(assetFlags)
|
||||||
|
print('')
|
||||||
|
|
||||||
|
def sum_list(l):
|
||||||
|
sum = 0
|
||||||
|
for x in l:
|
||||||
|
sum += x
|
||||||
|
return sum
|
||||||
|
|
||||||
|
def getChecksum(outFile):
|
||||||
|
with open(outFile, 'rb') as f:
|
||||||
|
data = f.read()
|
||||||
|
# convert byte array to list of shorts (16-bit)
|
||||||
|
bList = [int.from_bytes(data[i:i+2], "little") for i in range(0, len(data), 2)]
|
||||||
|
# calculate sum
|
||||||
|
total = sum_list(bList)&0xFFFF
|
||||||
|
# calculate complement
|
||||||
|
total = 0x10000 - total
|
||||||
|
return total&0xFFFF
|
||||||
|
|
||||||
|
def addChecksum(outFile):
|
||||||
|
total = getChecksum(outFile)
|
||||||
|
with open(outFile, 'r+b') as f:
|
||||||
|
|
||||||
|
f.seek(10)
|
||||||
|
f.write(struct.pack("H", total))
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
global OPTION_FLAGS
|
||||||
|
|
||||||
|
if sys.version_info.major == 2:
|
||||||
|
print("You need Python 3 for this application!")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description='Generate ICV External Assets',
|
||||||
|
epilog="\N{COPYRIGHT SIGN} ALIF Semiconductor, 2023")
|
||||||
|
parser.add_argument("-v" ,"--version", help="Display Version Number", action="store_true")
|
||||||
|
parser.add_argument("-f", "--filename",
|
||||||
|
type=str,
|
||||||
|
|
||||||
|
help="input file (default: build/config/assets-app-cfg.json")
|
||||||
|
parser.add_argument("-c" ,"--check",
|
||||||
|
help="Check asset package (skip generation)",
|
||||||
|
action="store_true")
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
if args.version:
|
||||||
|
print(TOOL_VERSION)
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
# memory defines for Alif/OEM MRAM Addresses and Sizes
|
||||||
|
load_global_config()
|
||||||
|
DEVICE_PART_NUMBER = utils.config.DEVICE_PART_NUMBER
|
||||||
|
DEVICE_REVISION = utils.config.DEVICE_REVISION
|
||||||
|
|
||||||
|
print('Generating APP assets with:')
|
||||||
|
print('- Device Part# ' + DEVICE_PART_NUMBER + ' - Rev: ' + DEVICE_REVISION)
|
||||||
|
configFile = args.filename
|
||||||
|
if configFile == None:
|
||||||
|
configFile = "build/config/assets-app-cfg.json"
|
||||||
|
|
||||||
|
fileToCheck = configFile
|
||||||
|
outFile = 'build/' + os.path.basename(configFile)[:-4] + 'bin'
|
||||||
|
if args.check:
|
||||||
|
# check binary file (check build options - NO Generation)
|
||||||
|
if args.filename:
|
||||||
|
outFile = args.filename
|
||||||
|
fileToCheck = outFile
|
||||||
|
else:
|
||||||
|
print('- Configuration file: ' + configFile)
|
||||||
|
|
||||||
|
print('- Output file: ' + outFile)
|
||||||
|
print('')
|
||||||
|
|
||||||
|
# verify the input file (config or binary) exists
|
||||||
|
if not os.path.isfile(fileToCheck):
|
||||||
|
print('File ' + fileToCheck + ' does not exist!')
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
if args.check == False:
|
||||||
|
cfg = read_asset_config(configFile)
|
||||||
|
for option in cfg:
|
||||||
|
if option not in OPTIONS:
|
||||||
|
print('ERROR: option ' + option + ' not supported!')
|
||||||
|
sys.exit()
|
||||||
|
else:
|
||||||
|
if cfg[option].upper() == "ON":
|
||||||
|
OPTION_FLAGS |= (1<<OPTIONS.index(option) )
|
||||||
|
if option == 'ENCRYPTED_ASSETS':
|
||||||
|
print('ENCRYPTED ASSETS Option is not supported yet')
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
create_package(outFile)
|
||||||
|
addChecksum(outFile)
|
||||||
|
|
||||||
|
check_package(outFile)
|
||||||
|
print("Done!")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
||||||
164
tools/alif/app-gen-rot.py
Executable file
164
tools/alif/app-gen-rot.py
Executable file
@ -0,0 +1,164 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import glob
|
||||||
|
import argparse
|
||||||
|
import string
|
||||||
|
import random
|
||||||
|
from utils import rsa_keygen
|
||||||
|
from utils import hbk_gen_util
|
||||||
|
from utils import cert_key_util
|
||||||
|
|
||||||
|
# Define Version constant for each separate tool
|
||||||
|
TOOL_VERSION ="0.06.000"
|
||||||
|
PASS_FILENAME = "utils/key/oem_keys_pass.pwd"
|
||||||
|
|
||||||
|
EXIT_WITH_ERROR = 1
|
||||||
|
|
||||||
|
def createTextFormat(fileName, data):
|
||||||
|
f = open(fileName, 'w')
|
||||||
|
str = ''
|
||||||
|
for i in data:
|
||||||
|
if str != '':
|
||||||
|
str += ','
|
||||||
|
str += hex(i)
|
||||||
|
f.write(str)
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
def createBinaryFile(fileName, data):
|
||||||
|
f = open(fileName, 'wb')
|
||||||
|
f.write(data)
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
def convertToBinary(inputFile, outputFile):
|
||||||
|
f = open(inputFile, 'r')
|
||||||
|
array = f.read().split(',')
|
||||||
|
f.close()
|
||||||
|
print(array)
|
||||||
|
out = open(outputFile, 'wb')
|
||||||
|
for s in array:
|
||||||
|
n = int(s, 16)
|
||||||
|
b = n.to_bytes(4, byteorder='little', signed = False)
|
||||||
|
out.write(b)
|
||||||
|
out.close()
|
||||||
|
|
||||||
|
def gen_AES():
|
||||||
|
return os.urandom(16)
|
||||||
|
|
||||||
|
def confirmString_generator(size=6, chars=string.ascii_uppercase + string.digits):
|
||||||
|
return ''.join(random.choice(chars) for _ in range(size))
|
||||||
|
|
||||||
|
def cleanRoT():
|
||||||
|
dirs = ['utils/key/','cert/']
|
||||||
|
for i in range(len(dirs)):
|
||||||
|
for filename in os.listdir(dirs[i]):
|
||||||
|
f = os.path.join(dirs[i], filename)
|
||||||
|
# checking if it is a file
|
||||||
|
if os.path.isfile(f):
|
||||||
|
print(f)
|
||||||
|
try:
|
||||||
|
os.remove(f)
|
||||||
|
except OSError as e:
|
||||||
|
print('Error: ' + str(e))
|
||||||
|
|
||||||
|
def confirm_clean():
|
||||||
|
print("************************************************************************")
|
||||||
|
print(" WARNING!!! This action will permanently delete the APP Root of Trust!!!\n","Please enter the following confirmation string followed by Enter to continue,\n or just press any key to abandon this action ")
|
||||||
|
print("************************************************************************")
|
||||||
|
confirmRequest = confirmString_generator(6)
|
||||||
|
print("Confirmation string: ", confirmRequest)
|
||||||
|
confirmResponse = input("> ")
|
||||||
|
if confirmResponse == confirmRequest:
|
||||||
|
print("The APP RoT WILL BE DELETED!!!. Enter Yes to continue (or any key to abort)")
|
||||||
|
continueConfirmation = input('> ')
|
||||||
|
if continueConfirmation.upper() == 'YES':
|
||||||
|
cleanRoT()
|
||||||
|
print('\nThe RoT was deleted!')
|
||||||
|
return
|
||||||
|
|
||||||
|
print('Operation aborted!')
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if sys.version_info.major == 2:
|
||||||
|
print("You need Python 3 for this application!")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser(description='Generate Application Root of Trust',
|
||||||
|
epilog="\N{COPYRIGHT SIGN} ALIF Semiconductor, 2021")
|
||||||
|
parser.add_argument("-v" ,"--version", help="Display Version Number", action="store_true")
|
||||||
|
parser.add_argument("-c" ,"--clean", help="Clean (delete) the APP RoT", action="store_true")
|
||||||
|
parser.add_argument("-o" ,"--overwrite", help="Overwrite the existing APP RoT", action="store_true")
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
if args.version:
|
||||||
|
print(TOOL_VERSION)
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
if args.clean:
|
||||||
|
confirm_clean()
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
if os.path.isfile('utils/key/OEMRoT.pem') == True and args.overwrite == False:
|
||||||
|
print('APP Root of Trust already exist!')
|
||||||
|
print('If you want to overwrite the existing RoT, please use the --overwrite flag ')
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
# we continue generating a new RoT
|
||||||
|
# (but first, we delete the current one if it exists)
|
||||||
|
if os.path.isfile('utils/key/OEMRoT.pem') == True:
|
||||||
|
confirm_clean()
|
||||||
|
|
||||||
|
if os.path.isfile(PASS_FILENAME) == False:
|
||||||
|
keysPwd = input("Please enter a new password for the keys to generate:")
|
||||||
|
f = open(PASS_FILENAME, 'w')
|
||||||
|
f.write(keysPwd)
|
||||||
|
f.close()
|
||||||
|
else:
|
||||||
|
print("File " + PASS_FILENAME + " with 'keys password' already exist and it will be used. If new password is required, delete this file and run again!")
|
||||||
|
|
||||||
|
print("Generating APP RoT keys (to be used in Key 1 Certificate)")
|
||||||
|
rsa_keygen.main(['utils/key/OEMRoT.pem', "-p", 'utils/key/oem_keys_pass.pwd', "-k", 'utils/key/OEMRoTPublic.pem', "-l", 'build/logs/key_gen_log.log'])
|
||||||
|
|
||||||
|
print("Generating APP SB Key keys (to be used in Key 2 Certificate)")
|
||||||
|
rsa_keygen.main(['utils/key/OEMSBKey.pem', "-p", 'utils/key/oem_keys_pass.pwd', "-k", 'utils/key/OEMSBKeyPublic.pem', "-l", 'build/logs/key_gen_log.log'])
|
||||||
|
|
||||||
|
print("Generating APP SB Content keys (to be used in Content Certificates)")
|
||||||
|
rsa_keygen.main(['utils/key/OEMSBContent.pem', "-p", 'utils/key/oem_keys_pass.pwd', "-k", 'utils/key/OEMSBContentPublic.pem', "-l", 'build/logs/key_gen_log.log'])
|
||||||
|
|
||||||
|
print("Generating APP Hbk1")
|
||||||
|
hbk_gen_util.main(["-f", 'SHA256_TRUNC', "-k", 'utils/key/OEMRoTPublic.pem', "-o", 'utils/key/hbk1_hash.txt', "-l", 'build/logs/gen_hbk_log.log'])
|
||||||
|
|
||||||
|
# create Hbk1 in binary format (required by dmpu_asset_util.py)
|
||||||
|
convertToBinary('utils/key/hbk1_hash.txt', 'utils/key/hbk1.bin')
|
||||||
|
|
||||||
|
# generate Encryption key (Kce)
|
||||||
|
# - text format: required by OEM SB Content Certificate generator to encrypt images
|
||||||
|
# - binary format: required by dmpu_asset_util.py to create Asset Package (for key injection)
|
||||||
|
print("Generating OEM kce")
|
||||||
|
kce = gen_AES()
|
||||||
|
createTextFormat('utils/key/kce.txt', kce)
|
||||||
|
createBinaryFile('utils/key/oem_enc_asset.bin', kce)
|
||||||
|
|
||||||
|
# generate Provision key (Kcp)
|
||||||
|
# - binary format: required by dmpu_asset_util.py to create Asset Package (for key injection)
|
||||||
|
print("Generating OEM kcp")
|
||||||
|
kcp = gen_AES()
|
||||||
|
createBinaryFile('utils/key/oem_prov_asset.bin', kcp)
|
||||||
|
|
||||||
|
print("Generating APP SB Key 1 Certificate")
|
||||||
|
cert_key_util.main(['utils/cfg/OEMSBKey1.cfg', 'build/logs/OEMSBKey1.log'])
|
||||||
|
|
||||||
|
print("Generating APP SB Key 2 Certificate")
|
||||||
|
cert_key_util.main(['utils/cfg/OEMSBKey2.cfg', 'build/logs/OEMSBKey2.log'])
|
||||||
|
|
||||||
|
|
||||||
|
print("\nCheck logs in build/logs/ directory")
|
||||||
|
print("Done!")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
689
tools/alif/app-gen-toc.py
Executable file
689
tools/alif/app-gen-toc.py
Executable file
@ -0,0 +1,689 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
#pylint: disable=invalid-name,superfluous-parens,anomalous-unicode-escape-in-string
|
||||||
|
|
||||||
|
"""
|
||||||
|
__author__ = ""
|
||||||
|
__copyright__ =Copyright 2021, ALIF Semiconductor"
|
||||||
|
__version__ = "0.06.000"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
where:
|
||||||
|
OBJECT_TYPE: FIREWALL or IMAGE
|
||||||
|
CPU_ID: A32_0, A32_1, A32_2, A32_3, M55_HP, M55_HE
|
||||||
|
FLAGS: COMPRESS, ENCRYPT, LOAD and BOOT
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import struct
|
||||||
|
import argparse
|
||||||
|
from pathlib import Path
|
||||||
|
import zlib
|
||||||
|
import json
|
||||||
|
from utils import toc_common
|
||||||
|
from utils.config import *
|
||||||
|
from utils.toc_common import *
|
||||||
|
from json.decoder import JSONDecodeError
|
||||||
|
from utils.device_config import gen_device_config
|
||||||
|
from utils.sign_image_util import sign_image
|
||||||
|
from printInfo import *
|
||||||
|
from utils.gen_fw_cfg import *
|
||||||
|
|
||||||
|
# Define Version constant for each separate tool
|
||||||
|
# 0.30.000 includes image signing
|
||||||
|
# 0.31.000 strip console output to a minimum (includes printInfo)
|
||||||
|
# 0.32.000 split image signature
|
||||||
|
TOOL_VERSION = "0.32.000"
|
||||||
|
|
||||||
|
EXIT_WITH_ERROR = 1
|
||||||
|
|
||||||
|
|
||||||
|
# memory defines for Alif/OEM MRAM Addresses and Sizes
|
||||||
|
#ALIF_BASE_ADDRESS = utils.mem_defs.ALIF_BASE_ADDRESS
|
||||||
|
#OEM_BASE_ADDRESS = utils.mem_defs.OEM_BASE_ADDRESS
|
||||||
|
#MRAM_BASE_ADDRESS = utils.mem_defs.MRAM_BASE_ADDRESS
|
||||||
|
|
||||||
|
# OEM TOC sizes
|
||||||
|
TOC_ENTRY_SIZE = 32
|
||||||
|
TOC_HEADER_SIZE = 32
|
||||||
|
TOC_TAIL_SIZE = 16
|
||||||
|
TOC_HEADER_VERSION = 1
|
||||||
|
|
||||||
|
# Default metadata flags when there is no OEM
|
||||||
|
METADATA_FLAGS_DEFAULT = 0x3
|
||||||
|
|
||||||
|
# Supported CPU_ID for IMAGE object type
|
||||||
|
SUPPORTED_CPU_ID = ['A32_0',
|
||||||
|
'A32_1',
|
||||||
|
'A32_2',
|
||||||
|
'A32_3',
|
||||||
|
'M55_HP',
|
||||||
|
'M55_HE']
|
||||||
|
|
||||||
|
# Supported flags for IMAGE object type
|
||||||
|
SUPPORTED_FLAGS = ['COMPRESS',
|
||||||
|
'LOAD',
|
||||||
|
'BOOT',
|
||||||
|
'ENCRYPT',
|
||||||
|
'DEFERRED']
|
||||||
|
|
||||||
|
|
||||||
|
# Supported Attributes for JSON configuration file
|
||||||
|
SUPPORTED_ATTRIBUTES = [
|
||||||
|
'disabled',
|
||||||
|
'binary',
|
||||||
|
'signed',
|
||||||
|
'loadAddress',
|
||||||
|
'version',
|
||||||
|
'mramAddress',
|
||||||
|
'cpu_id',
|
||||||
|
'flags',
|
||||||
|
'extensions'
|
||||||
|
]
|
||||||
|
|
||||||
|
# Swtchers: there are different options for ICV and OEM...
|
||||||
|
# switcher for getObjectType()
|
||||||
|
image_switcher = {
|
||||||
|
'DEVICE' : 3
|
||||||
|
}
|
||||||
|
|
||||||
|
# switcher for getCPUID()
|
||||||
|
cpuid_switcher = {
|
||||||
|
'A32_0' : 0,
|
||||||
|
'A32_1' : 1,
|
||||||
|
'M55_HP' : 2,
|
||||||
|
'M55_HE' : 3
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
certPath = Path("cert/")
|
||||||
|
imagePath = Path("build/images")
|
||||||
|
|
||||||
|
# sizes of Certificates
|
||||||
|
CERT_CHAIN_SIZE = utils.toc_common.CERT_CHAIN_SIZE
|
||||||
|
CONT_CERT_SIZE = utils.toc_common.CONT_CERT_SIZE
|
||||||
|
CERT_CHAIN_SIZE = utils.toc_common.CERT_CHAIN_SIZE
|
||||||
|
|
||||||
|
# Global Variables
|
||||||
|
numImages = 0
|
||||||
|
oemManagedAreaStartAddress = 0
|
||||||
|
oemManagedAreaSize = 0
|
||||||
|
otocStartAddress = 0
|
||||||
|
unmanaged = []
|
||||||
|
|
||||||
|
|
||||||
|
def createOemTocPackage(fwsections, metadata_flags, outputFile):
|
||||||
|
global oemManagedAreaStartAddress
|
||||||
|
global oemManagedAreaSize
|
||||||
|
global otocStartAddress
|
||||||
|
global unmanaged
|
||||||
|
|
||||||
|
print('Creating APP TOC Package...')
|
||||||
|
# Start by loading the Key1/Key2 Certificates for later on
|
||||||
|
printInfo("Loading Key1 Cert...")
|
||||||
|
key1Cert = getBlob(certPath / 'OEMSBKey1.crt')
|
||||||
|
printInfo("Loading Key2 Cert...")
|
||||||
|
key2Cert = getBlob(certPath / 'OEMSBKey2.crt')
|
||||||
|
|
||||||
|
# create the output file
|
||||||
|
outf = open(outputFile, 'wb')
|
||||||
|
|
||||||
|
# create a memory layout map for debugging
|
||||||
|
mapf = open('build/app-package-map.txt', 'w')
|
||||||
|
mapf.write('* * * User managed MRAM locations* * * \n')
|
||||||
|
|
||||||
|
debugScript = ''
|
||||||
|
for img in unmanaged:
|
||||||
|
printInfo('Unmanaged Images:')
|
||||||
|
imgFile = img[4]
|
||||||
|
if img[5] == 'compressed':
|
||||||
|
imgFile += '.lzf'
|
||||||
|
|
||||||
|
if img[6] == 'encrypted':
|
||||||
|
imgFile = img[4][:-4] + '_enc.bin'
|
||||||
|
|
||||||
|
printInfo(img)
|
||||||
|
mapf.write(f'{img[1]}\t{hex(img[2])}\t{img[2]}\t{img[3]}\t{imgFile}\n')
|
||||||
|
debugScript += '../build/images/' + imgFile + ' ' + img[1] + ' '
|
||||||
|
sign_image('build/images/' + imgFile, int(img[1], 16), 0xFFFFFFFF, "OEM")
|
||||||
|
|
||||||
|
|
||||||
|
# create a pointer to keep track addresses of components (object_address in OTOC)
|
||||||
|
mPointer = oemManagedAreaStartAddress
|
||||||
|
#print(f'mPointer start: {mPointer - oemManagedAreaStartAddress}')
|
||||||
|
mapf.write('\n* * * APP Package Start Address* * * \n')
|
||||||
|
mapf.write('\n - Certificates for User managed images\n')
|
||||||
|
printInfo('Unmanaged images certificates')
|
||||||
|
# start adding all Certificate Chains for Unmanaged images
|
||||||
|
for sec in fwsections:
|
||||||
|
# filter out disabled images
|
||||||
|
if sec['disabled'] == True:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# filter out Managed components (they will be included after)
|
||||||
|
if sec['location'] == 'managed':
|
||||||
|
continue
|
||||||
|
|
||||||
|
# update MRAM position for object_address in OTOC
|
||||||
|
sec['object_address'] = hex(mPointer)
|
||||||
|
|
||||||
|
if sec['signed'] != False:
|
||||||
|
#print('...including Key1/key2 certs')
|
||||||
|
outf.write(key1Cert)
|
||||||
|
outf.write(key2Cert)
|
||||||
|
#mapf.write(f"{hostAddress(mPointer)}\t{hex(CERT_CHAIN_SIZE - CONT_CERT_SIZE)}\t{(CERT_CHAIN_SIZE - CONT_CERT_SIZE)}\tKey1/Key2 Certificates \n")
|
||||||
|
mapf.write(f"{hex(mPointer)}\t{hex(CERT_CHAIN_SIZE - CONT_CERT_SIZE)}\t{(CERT_CHAIN_SIZE - CONT_CERT_SIZE)}\tKey1/Key2 Certificates \n")
|
||||||
|
mPointer += (CERT_CHAIN_SIZE - CONT_CERT_SIZE)
|
||||||
|
#print(f'mPointer KC un: {mPointer - oemManagedAreaStartAddress}')
|
||||||
|
# copy the Content Certificate (for signed or unsigned images)
|
||||||
|
addContentCertificate(outf, sec['binary'])
|
||||||
|
#mapf.write(f"{hostAddress(mPointer)}\t{hex(CONT_CERT_SIZE)}\t{(CONT_CERT_SIZE)}\tSB" + sec['binary'] + ".crt\n")
|
||||||
|
mapf.write(f"{hex(mPointer)}\t{hex(CONT_CERT_SIZE)}\t{(CONT_CERT_SIZE)}\tSB" + sec['binary'] + ".crt\n")
|
||||||
|
mPointer += CONT_CERT_SIZE
|
||||||
|
#print(f'mPointer CC un: {mPointer - oemManagedAreaStartAddress}')
|
||||||
|
|
||||||
|
# add Managed components with their respective Certificates in front of them
|
||||||
|
printInfo('Managed components')
|
||||||
|
mapf.write('\n - Certificates & images for Tool managed images\n')
|
||||||
|
for sec in fwsections:
|
||||||
|
# filter out disabled images
|
||||||
|
if sec['disabled'] == True:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# filter out Unmanaged components (they were already included above)
|
||||||
|
if sec['location'] == 'unmanaged':
|
||||||
|
continue
|
||||||
|
|
||||||
|
# update MRAM position for object_address in OTOC
|
||||||
|
sec['object_address'] = hex(mPointer)
|
||||||
|
|
||||||
|
# for each managed component, copy certificates and image
|
||||||
|
if sec['signed'] != False:
|
||||||
|
#print('...including Key1/key2 certs')
|
||||||
|
outf.write(key1Cert)
|
||||||
|
outf.write(key2Cert)
|
||||||
|
#mapf.write(f"{hostAddress(mPointer)}\t{hex(CERT_CHAIN_SIZE - CONT_CERT_SIZE)}\t{(CERT_CHAIN_SIZE - CONT_CERT_SIZE)}\tKey1/Key2 Certificates \n")
|
||||||
|
mapf.write(f"{hex(mPointer)}\t{hex(CERT_CHAIN_SIZE - CONT_CERT_SIZE)}\t{(CERT_CHAIN_SIZE - CONT_CERT_SIZE)}\tKey1/Key2 Certificates \n")
|
||||||
|
mPointer += (CERT_CHAIN_SIZE - CONT_CERT_SIZE)
|
||||||
|
#print(f'mPointer - KCs: {mPointer - oemManagedAreaStartAddress}')
|
||||||
|
# copy the Content Certificate (for signed or unsigned images)
|
||||||
|
addContentCertificate(outf, sec['binary'])
|
||||||
|
#mapf.write(f"{hostAddress(mPointer)}\t{hex(CONT_CERT_SIZE)}\t{(CONT_CERT_SIZE)}\tSB" + sec['binary'] + ".crt\n")
|
||||||
|
mapf.write(f"{hex(mPointer)}\t{hex(CONT_CERT_SIZE)}\t{(CONT_CERT_SIZE)}\tSB" + sec['binary'] + ".crt\n")
|
||||||
|
mPointer += CONT_CERT_SIZE
|
||||||
|
#print(f'mPointer - CC: {mPointer - oemManagedAreaStartAddress}')
|
||||||
|
# copy image (check for encryption or compression - both are not supported!)
|
||||||
|
binFile = sec['binary']
|
||||||
|
if 'ENCRYPT' in sec['flags']:
|
||||||
|
binFile = binFile[:-4] + "_enc.bin"
|
||||||
|
|
||||||
|
if 'COMPRESS' in sec['flags']:
|
||||||
|
binFile += '.lzf'
|
||||||
|
|
||||||
|
#print("Copying: " + binFile)
|
||||||
|
outf.write(getBlob(imagePath / binFile))
|
||||||
|
#mapf.write(f"{hostAddress(mPointer)}\t{hex(sec['size'])}\t{sec['size']}\t" + binFile + "\n")
|
||||||
|
mapf.write(f"{hex(mPointer)}\t{hex(sec['size'])}\t{sec['size']}\t" + binFile + "\n")
|
||||||
|
mPointer += sec['size']
|
||||||
|
#print(f'mPointer - size: {mPointer - oemManagedAreaStartAddress}')
|
||||||
|
# padding with 0s
|
||||||
|
if sec['padlen'] > 0:
|
||||||
|
outf.write(('\0' * sec['padlen']).encode('utf8'))
|
||||||
|
#mapf.write(f"{hostAddress(mPointer)}\t{hex(sec['padlen'])}\t{sec['padlen']}\tPadding\n")
|
||||||
|
mapf.write(f"{hex(mPointer)}\t{hex(sec['padlen'])}\t{sec['padlen']}\tPadding\n")
|
||||||
|
mPointer += sec['padlen']
|
||||||
|
#print(f'mPointer - pad: {mPointer - oemManagedAreaStartAddress}')
|
||||||
|
|
||||||
|
|
||||||
|
# finally, create the OEM TOC (verify the current pointer matches the OEM TOC Address we previously calculated)
|
||||||
|
if mPointer != otocStartAddress:
|
||||||
|
print("[ERROR] ATOC STARTS IS DIFFERENT THAN THE CALCULATED ONE!!!")
|
||||||
|
#print(f"ATOC Starts at {hostAddress(mPointer)}")
|
||||||
|
print(f"ATOC Starts at {hex(mPointer)}")
|
||||||
|
#print(f"ATOC calculated at {hostAddress(otocStartAddress)}")
|
||||||
|
print(f"ATOC calculated at {hex(otocStartAddress)}")
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
#print(f"Start of ATOC: {hostAddress(otocStartAddress)}")
|
||||||
|
printInfo(f"Start of ATOC: {hex(otocStartAddress)}")
|
||||||
|
mapf.write('\n - APP TOC (Table of Content)\n')
|
||||||
|
# create the OEM TOC Header
|
||||||
|
print("Adding ATOC...")
|
||||||
|
# TOC token (identifier)
|
||||||
|
outf.write("OEMTOC01".encode('utf8'))
|
||||||
|
# TOC Header size (in bytes)
|
||||||
|
outf.write(struct.pack("H", TOC_HEADER_SIZE))
|
||||||
|
# Number of TOC entries and size
|
||||||
|
outf.write(struct.pack("H", numImages))
|
||||||
|
outf.write(struct.pack("H", TOC_ENTRY_SIZE))
|
||||||
|
# TOC version
|
||||||
|
outf.write(struct.pack("H", TOC_HEADER_VERSION))
|
||||||
|
# HFXO/LFXO presence flags
|
||||||
|
outf.write(struct.pack("I", metadata_flags))
|
||||||
|
# pad to 16 bytes with 00s
|
||||||
|
outf.write(('\0' * 12).encode('utf8'))
|
||||||
|
|
||||||
|
#mapf.write(f"{hostAddress(mPointer)}\t{hex(TOC_HEADER_SIZE)}\t{TOC_HEADER_SIZE}\tAPP TOC Header\n")
|
||||||
|
mapf.write(f"{hex(mPointer)}\t{hex(TOC_HEADER_SIZE)}\t{TOC_HEADER_SIZE}\tAPP TOC Header\n")
|
||||||
|
mPointer += TOC_HEADER_SIZE
|
||||||
|
#print(f'mPointer otoc hdr: {mPointer - oemManagedAreaStartAddress}')
|
||||||
|
# create OEM TOC (numImages entries)
|
||||||
|
for sec in fwsections:
|
||||||
|
# filter out disabled images
|
||||||
|
if sec['disabled'] == True:
|
||||||
|
continue
|
||||||
|
|
||||||
|
#print(sec)
|
||||||
|
# Object_address
|
||||||
|
outf.write(struct.pack("I", int(sec['object_address'], 16)))
|
||||||
|
# object_length
|
||||||
|
outf.write(struct.pack("I", sec['size'])) # do not need to declare the pad as seram doesn't need it
|
||||||
|
# object_type
|
||||||
|
outf.write(struct.pack("I", getObjectType(sec['identifier'].rstrip('\0'), image_switcher)))
|
||||||
|
# flags
|
||||||
|
outf.write(struct.pack("I", getObjectFlags(sec['flags']) + getCPUID(sec['cpu_id'], cpuid_switcher) ))
|
||||||
|
|
||||||
|
# version
|
||||||
|
outf.write(struct.pack("I", getObjectVersion(sec['version'])))
|
||||||
|
# image_identifier
|
||||||
|
outf.write(sec['identifier'][:8].encode('utf8'))
|
||||||
|
# extension_header
|
||||||
|
outf.write(struct.pack("I", 0))
|
||||||
|
|
||||||
|
#mapf.write(f"{hostAddress(mPointer)}\t{hex(TOC_ENTRY_SIZE)}\t{TOC_ENTRY_SIZE}\tAPP TOC entry for {sec['identifier']} obj_address {hostAddress(int(sec['object_address'],16))}\n")
|
||||||
|
mapf.write(f"{hex(mPointer)}\t{hex(TOC_ENTRY_SIZE)}\t{TOC_ENTRY_SIZE}\tAPP TOC entry for {sec['identifier']} obj_address {sec['object_address']}\n")
|
||||||
|
mPointer += TOC_ENTRY_SIZE
|
||||||
|
#print(f'mPointer otoc entry: {mPointer - oemManagedAreaStartAddress}')
|
||||||
|
|
||||||
|
# write current data to file, so we can read back and calculate CRC32
|
||||||
|
outf.flush()
|
||||||
|
|
||||||
|
# create Checksum (crc32)
|
||||||
|
f = open(outputFile, "rb")
|
||||||
|
# locate start of OTOC
|
||||||
|
s = otocStartAddress - oemManagedAreaStartAddress
|
||||||
|
f.seek(s)
|
||||||
|
#f.seek((TOC_ENTRY_SIZE * numImages) + TOC_HEADER_SIZE, 2)
|
||||||
|
otoc = f.read()
|
||||||
|
f.close()
|
||||||
|
crc32 = zlib.crc32(otoc)
|
||||||
|
printInfo('Calculated CRC32: ' + hex(crc32))
|
||||||
|
|
||||||
|
# now, in the OEM, we are adding other fields in the TOC Tail
|
||||||
|
# OTOC crc32 + OTOC_startAddress + OEM_packageStart + OEM_packageSize
|
||||||
|
outf.write(struct.pack("I", crc32))
|
||||||
|
outf.write(struct.pack("I", otocStartAddress))
|
||||||
|
outf.write(struct.pack("I", oemManagedAreaStartAddress))
|
||||||
|
outf.write(struct.pack("I", oemManagedAreaSize))
|
||||||
|
|
||||||
|
#mapf.write(f"{hostAddress(mPointer)}\t{hex(TOC_TAIL_SIZE)}\t{TOC_TAIL_SIZE}\tAPP TOC Tail\n")
|
||||||
|
mapf.write(f"{hex(mPointer)}\t{hex(TOC_TAIL_SIZE)}\t{TOC_TAIL_SIZE}\tAPP TOC Tail\n")
|
||||||
|
mPointer += TOC_TAIL_SIZE
|
||||||
|
printInfo(f'mPointer atoc tail - end: {mPointer - oemManagedAreaStartAddress}')
|
||||||
|
|
||||||
|
# check the OEM Package size is the same we calculated before
|
||||||
|
if (mPointer - oemManagedAreaStartAddress) != oemManagedAreaSize:
|
||||||
|
print('[ERROR] Something is wrong! Final APP Package size is different than the calculated one...')
|
||||||
|
print(f'Calculated: {oemManagedAreaSize} bytes')
|
||||||
|
print(f'Real size: {mPointer - oemManagedAreaStartAddress} bytes')
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
mapf.write("\nAPP Package Summary:\n")
|
||||||
|
mapf.write(f" - APP Package total size: {mPointer - oemManagedAreaStartAddress} bytes\n")
|
||||||
|
#mapf.write(f" - APP Package Start Address: {hostAddress(oemManagedAreaStartAddress)}\n")
|
||||||
|
mapf.write(f" - APP Package Start Address: {hex(oemManagedAreaStartAddress)}\n")
|
||||||
|
mapf.write(f" - APP TOC size: {(TOC_ENTRY_SIZE * numImages) + TOC_HEADER_SIZE + TOC_TAIL_SIZE} bytes\n")
|
||||||
|
#mapf.write(f" - APP TOC Start Address: {hostAddress(otocStartAddress)}\n")
|
||||||
|
mapf.write(f" - APP TOC Start Address: {hex(otocStartAddress)}\n")
|
||||||
|
mapf.write(f" - APP CRC32: {hex(crc32)}\n")
|
||||||
|
|
||||||
|
mapf.write('\n* * * END of APP Package * * * \n')
|
||||||
|
|
||||||
|
debugScript += '../' + outputFile + ' ' + hex(oemManagedAreaStartAddress)
|
||||||
|
|
||||||
|
# close the file
|
||||||
|
outf.close()
|
||||||
|
|
||||||
|
mapf.close()
|
||||||
|
|
||||||
|
# generate debug script file
|
||||||
|
dsFile = 'bin/application_package.ds' # Was bin/oempackage.ds
|
||||||
|
try:
|
||||||
|
ds = open(dsFile, 'w')
|
||||||
|
#f.write('reset system\n')
|
||||||
|
ds.write('set semihosting args ' + debugScript + '\n' )
|
||||||
|
ds.write('continue\n')
|
||||||
|
ds.write('wait\n')
|
||||||
|
ds.write('reset reset.hardware\n')
|
||||||
|
ds.close()
|
||||||
|
|
||||||
|
except:
|
||||||
|
print('[ERROR] generating debug script file!')
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
printInfo('Write the APP TOC package to ' + hex(oemManagedAreaStartAddress))
|
||||||
|
|
||||||
|
# take second element for sort
|
||||||
|
def orderByAddress(elem):
|
||||||
|
return elem[1]
|
||||||
|
|
||||||
|
def calcOemManagedArea(fwsections):
|
||||||
|
global numImages
|
||||||
|
global oemManagedAreaStartAddress
|
||||||
|
global oemManagedAreaSize
|
||||||
|
global otocStartAddress
|
||||||
|
global unmanaged
|
||||||
|
|
||||||
|
# verify images exist and calculate size and padding
|
||||||
|
numSignedImages = 0
|
||||||
|
numManagedImages = 0
|
||||||
|
sizeManagedImages = 0
|
||||||
|
|
||||||
|
print('Calculating APP area...')
|
||||||
|
for sec in fwsections:
|
||||||
|
# check if entry is disabled
|
||||||
|
if sec['disabled'] == True:
|
||||||
|
printInfo('Entry disabled:' + sec['identifier'])
|
||||||
|
continue
|
||||||
|
|
||||||
|
numImages += 1
|
||||||
|
|
||||||
|
# determine the size of file and if padding is needed
|
||||||
|
fsize, padlen = getImageSize('build/images/' + sec['binary'])
|
||||||
|
# update the size and padding information
|
||||||
|
sec['size'] = fsize
|
||||||
|
sec['padlen'] = padlen
|
||||||
|
|
||||||
|
# check if image requires compression
|
||||||
|
# if so, create the file using lzf utility
|
||||||
|
compressLabel = 'uncompressed'
|
||||||
|
if 'COMPRESS' in sec['flags']:
|
||||||
|
compressLabel = 'compressed'
|
||||||
|
compressImage('build/images/' + sec['binary'])
|
||||||
|
# we should have the (new) compressed file, so we will check if this is the case...
|
||||||
|
|
||||||
|
# determine the size of (compressed) file and if padding is needed
|
||||||
|
fsize, padlen = getImageSize('build/images/' + sec['binary'] + '.lzf')
|
||||||
|
# add compressed file size and update padding information
|
||||||
|
# (the compressed image will be included in the package so pad should be calculated for
|
||||||
|
# compressed file size)
|
||||||
|
sec['uncompressedSize'] = sec['size'] # uncompressed Size will be used by the certificate creation process
|
||||||
|
sec['size'] = fsize
|
||||||
|
sec['padlen'] = padlen
|
||||||
|
|
||||||
|
# check encryption
|
||||||
|
encryptionLabel = 'unencrypted'
|
||||||
|
if 'ENCRYPT' in sec['flags']:
|
||||||
|
encryptionLabel = 'encrypted'
|
||||||
|
|
||||||
|
|
||||||
|
# if image is signed
|
||||||
|
if sec['signed'] != False:
|
||||||
|
numSignedImages += 1
|
||||||
|
|
||||||
|
# if image is Managed (not Fixed Address => mramAddress different than 0 or none)
|
||||||
|
if sec['mramAddress'] == 'none' or sec['mramAddress'] == 0:
|
||||||
|
numManagedImages += 1
|
||||||
|
sizeManagedImages += ( sec['size'] + sec['padlen'] )
|
||||||
|
sec['location'] = 'managed'
|
||||||
|
else:
|
||||||
|
sec['location'] = 'unmanaged'
|
||||||
|
if sec['signed'] == False:
|
||||||
|
signature = 'unsigned'
|
||||||
|
else:
|
||||||
|
signature = 'signed'
|
||||||
|
|
||||||
|
printInfo(f"Unmanaged: {sec['identifier']}")
|
||||||
|
tmp = (sec['identifier'], sec['mramAddress'], fsize + padlen, signature, sec['binary'], compressLabel, encryptionLabel) # we normally don't pad unmanaged images, but just in case this change in the future...
|
||||||
|
unmanaged.append(tmp)
|
||||||
|
|
||||||
|
printInfo(f"Signed Images: {numSignedImages}")
|
||||||
|
printInfo(f"Managed Images: {numManagedImages}")
|
||||||
|
printInfo(f"Managed Images total size: {sizeManagedImages:,} bytes")
|
||||||
|
|
||||||
|
# First Check: Total Managed Images should not be greater than APP MRAM SIZE
|
||||||
|
if sizeManagedImages > APP_MRAM_SIZE:
|
||||||
|
print('\n[ERROR] Images DO NOT FIT in available space. Please review images sizes \nconsidering this information:')
|
||||||
|
print(f'Total APP MRAM size: {APP_MRAM_SIZE:,} bytes')
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
# calculate size of OEM TOC
|
||||||
|
otocSize = (TOC_ENTRY_SIZE * numImages) + TOC_HEADER_SIZE + TOC_TAIL_SIZE
|
||||||
|
printInfo(f"APP TOC Size: {hex(otocSize)}")
|
||||||
|
# calculate OEM TOC Starting Address in MRAM
|
||||||
|
otocStartAddress = ALIF_BASE_ADDRESS - otocSize
|
||||||
|
printInfo(f"APP TOC Address: {hex(otocStartAddress)}")
|
||||||
|
|
||||||
|
# calculate size of OEM Managed Area (total of OEM Package - don't include images with fixed addresses)
|
||||||
|
# OEM Managed Area size = size(OTOC) + size(Managed Images with Padding) + (numSignedImages * CERT_CHAIN_SIZE) + (numUnsignedImages * CONT_CERT_SIZE)
|
||||||
|
oemManagedAreaSize = otocSize + sizeManagedImages + ( numSignedImages * CERT_CHAIN_SIZE) + ( (numImages - numSignedImages) * CONT_CERT_SIZE)
|
||||||
|
printInfo(f"APP Managed Area size: {oemManagedAreaSize}")
|
||||||
|
|
||||||
|
# calculate OEM Managed Area Starting Addresses
|
||||||
|
oemManagedAreaStartAddress = ALIF_BASE_ADDRESS - oemManagedAreaSize
|
||||||
|
printInfo(f"APP Package Start Address: {hex(oemManagedAreaStartAddress)}")
|
||||||
|
|
||||||
|
# now that we know where OEM Managed Area will start (oemManagedAreaStartAddress),
|
||||||
|
# we should verify that OEM Unmanaged Area is below above address
|
||||||
|
boundary = 0
|
||||||
|
# sort list with key
|
||||||
|
unmanaged.sort(key=orderByAddress)
|
||||||
|
printInfo("Unmanaged Images - Ordered by MRAM Address")
|
||||||
|
for img in unmanaged:
|
||||||
|
printInfo(img)
|
||||||
|
|
||||||
|
startAddress = int(img[1], 16)
|
||||||
|
size = img[2]
|
||||||
|
# check overlap with previous image
|
||||||
|
if startAddress < boundary:
|
||||||
|
print('[ERROR] There is an overlap between image ' + img[0] + ' and previous image!')
|
||||||
|
print('Please correct this to continue.')
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
boundary = startAddress + size
|
||||||
|
#print(hex(boundary))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# check boundary is below OEM Managed Area Starting Address
|
||||||
|
if boundary > oemManagedAreaStartAddress:
|
||||||
|
print('\n[ERROR] Images DO NOT FIT in available space. Please review layout \nconsidering this information:')
|
||||||
|
print(f'Available space is {otocStartAddress - OEM_BASE_ADDRESS} bytes starting at MRAM address {hex(OEM_BASE_ADDRESS)}')
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
else:
|
||||||
|
if boundary == 0:
|
||||||
|
boundary += MRAM_BASE_ADDRESS
|
||||||
|
printInfo(f"Final boundary: {hex(boundary)}")
|
||||||
|
printInfo(f"Available MRAM: {oemManagedAreaStartAddress - boundary} bytes")
|
||||||
|
|
||||||
|
|
||||||
|
# now that we know everything fits well, we can proceed to calculate the
|
||||||
|
# the MRAM addresses for the managed images, to update the 'mramAddress' field
|
||||||
|
# (we need the MRAM address to generate the Content Certificates before start
|
||||||
|
# creating the OEM Package binary)
|
||||||
|
|
||||||
|
# we keep a pointer starting at OEM Managed Area address
|
||||||
|
mPointer = oemManagedAreaStartAddress
|
||||||
|
# we will start the OEM Managed Area layout with all certificates for Unmanaged Images
|
||||||
|
# so we need to know How many Unmanaged images are and from those, how many are Signed
|
||||||
|
# and how many are Unsigned (because we need more space for signed images than for unsigned ones)
|
||||||
|
|
||||||
|
for img in unmanaged:
|
||||||
|
if img[3] == 'signed':
|
||||||
|
mPointer += CERT_CHAIN_SIZE
|
||||||
|
else:
|
||||||
|
mPointer += CONT_CERT_SIZE
|
||||||
|
|
||||||
|
for sec in fwsections:
|
||||||
|
# check if entry is disabled
|
||||||
|
if sec['disabled'] == True:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# we won't create Content Certificate for Device COnfiguration (at the moment...)
|
||||||
|
#if sec['identifier'] == 'FIREWALL':
|
||||||
|
# continue
|
||||||
|
|
||||||
|
# if image is Managed (not Fixed Address => mramAddress different than 0 or none)
|
||||||
|
if sec['mramAddress'] == 'none' or sec['mramAddress'] == 0:
|
||||||
|
# for each managed image, we need to calculate the image storage address in MRAM,
|
||||||
|
# needed to create the Content Certificate for each image
|
||||||
|
if sec['signed'] == False:
|
||||||
|
mPointer += CONT_CERT_SIZE
|
||||||
|
else:
|
||||||
|
mPointer += CERT_CHAIN_SIZE
|
||||||
|
|
||||||
|
# save the MRAM store address for Managed images
|
||||||
|
sec['mramAddress'] = hex(mPointer)
|
||||||
|
#print(sec['identifier'], sec['mramAddress'])
|
||||||
|
|
||||||
|
# move the pointer to the end of the image
|
||||||
|
mPointer += ( sec['size'] + sec['padlen'])
|
||||||
|
|
||||||
|
|
||||||
|
def validateVersAttr(version):
|
||||||
|
items = version.split('.')
|
||||||
|
if len(items)>3:
|
||||||
|
print("[ERROR] Invalid version string. Please use 'xxx.yyy.zzz' format")
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
for item in items:
|
||||||
|
try:
|
||||||
|
i = int(item)
|
||||||
|
if i>=0 and i<=255:
|
||||||
|
continue
|
||||||
|
print("[ERROR] Invalid value '" + item + "' in version string: " + version)
|
||||||
|
except:
|
||||||
|
print("[ERROR] Invalid item '" + item + "' in version string: " + version)
|
||||||
|
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
def updateDeviceConfig(file):
|
||||||
|
#print('*** updateDeviceConfig: ', file)
|
||||||
|
# Update the firewall configuration in the OEM DEVICE config file
|
||||||
|
update_fw_cfg_oem()
|
||||||
|
|
||||||
|
cfg = read_global_config('build/config/' + file)
|
||||||
|
if 'miscellaneous' in cfg:
|
||||||
|
for item in cfg['miscellaneous']:
|
||||||
|
item.pop('sdesc', None)
|
||||||
|
item.pop('ldesc', None)
|
||||||
|
item.pop('options', None)
|
||||||
|
with open('build/config/' + file, "w") as json_file:
|
||||||
|
json.dump(cfg, json_file, indent=2)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
cwd_path = os.getcwd()
|
||||||
|
os.chdir(cwd_path)
|
||||||
|
global MRAM_BASE_ADDRESS
|
||||||
|
global ALIF_BASE_ADDRESS
|
||||||
|
global OEM_BASE_ADDRESS
|
||||||
|
global APP_MRAM_SIZE
|
||||||
|
|
||||||
|
if sys.version_info.major == 2:
|
||||||
|
print("[ERROR] You need Python 3 for this application!")
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
"""
|
||||||
|
Parse user arguments
|
||||||
|
"""
|
||||||
|
parser = argparse.ArgumentParser(description='Generate APP TOC Package',
|
||||||
|
epilog="\N{COPYRIGHT SIGN} ALIF Semiconductor, 2023")
|
||||||
|
parser.add_argument("-f", "--filename", type=str,
|
||||||
|
default="build/config/app-cfg.json",
|
||||||
|
help="input file (check build/config/app-cfg.json as an example")
|
||||||
|
parser.add_argument("-o", "--output", type=str,
|
||||||
|
default="build/AppTocPackage.bin",
|
||||||
|
help="output file (default is build/AppTocPackage.bin")
|
||||||
|
parser.add_argument("-V", "--version", help="Display Version Number", action="store_true")
|
||||||
|
parser.add_argument("-c" ,"--clean", help="Clean build workspace (restore initial state)", action="store_true")
|
||||||
|
parser.add_argument("-v" , "--verbose", help="verbosity mode", action="store_true")
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
if args.version:
|
||||||
|
print(TOOL_VERSION)
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
if args.clean:
|
||||||
|
cleanBuild(['build/AppTocPackage.bin', 'build/App-package-map.txt', 'build/images/*_enc.bin', 'build/images/*.lzf', 'cert/SB*.crt'])
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
# set verbose option
|
||||||
|
verboseModeSet(args.verbose)
|
||||||
|
|
||||||
|
# memory defines for Alif/OEM MRAM Addresses and Sizes
|
||||||
|
load_global_config()
|
||||||
|
DEVICE_PART_NUMBER = utils.config.DEVICE_PART_NUMBER
|
||||||
|
DEVICE_REVISION = utils.config.DEVICE_REVISION
|
||||||
|
ALIF_BASE_ADDRESS = utils.config.ALIF_BASE_ADDRESS
|
||||||
|
MRAM_BASE_ADDRESS = utils.config.MRAM_BASE_ADDRESS
|
||||||
|
OEM_BASE_ADDRESS = utils.config.APP_BASE_ADDRESS
|
||||||
|
APP_MRAM_SIZE = utils.config.APP_MRAM_SIZE
|
||||||
|
|
||||||
|
print('Generating APP Package with:')
|
||||||
|
print('Device Part# ' + DEVICE_PART_NUMBER + ' - Rev: ' + DEVICE_REVISION)
|
||||||
|
|
||||||
|
print('- System MRAM Base Address: ' + hex(ALIF_BASE_ADDRESS))
|
||||||
|
print('- APP MRAM Base Address: ' + hex(OEM_BASE_ADDRESS))
|
||||||
|
print('- APP MRAM Size: ' + str(APP_MRAM_SIZE))
|
||||||
|
print('- Configuration file: ' + args.filename)
|
||||||
|
print('- Output file: ' + args.output)
|
||||||
|
print('')
|
||||||
|
fwsections = read_json_file(args.filename, SUPPORTED_ATTRIBUTES, SUPPORTED_FLAGS, SUPPORTED_CPU_ID)
|
||||||
|
|
||||||
|
validateOptions(fwsections)
|
||||||
|
|
||||||
|
metadata_flags = METADATA_FLAGS_DEFAULT
|
||||||
|
for sec in fwsections:
|
||||||
|
# check if entry is disabled
|
||||||
|
if sec['disabled'] is True:
|
||||||
|
print('Entry disabled:' + sec['identifier'])
|
||||||
|
continue
|
||||||
|
|
||||||
|
# check version string (format 'xx.yy.zz' where each item should be between 0 and 255)
|
||||||
|
validateVersAttr(sec['version'])
|
||||||
|
|
||||||
|
# update the size and padding information
|
||||||
|
if sec['identifier'].strip('\0') != 'DEVICE':
|
||||||
|
continue
|
||||||
|
|
||||||
|
print('Generating Device Configuration for: ' + sec['binary'])
|
||||||
|
updateDeviceConfig(sec['binary'])
|
||||||
|
metadata_flags = gen_device_config(sec['binary'], False)
|
||||||
|
sec['binary'] = sec['binary'][:-5] + '.bin'
|
||||||
|
|
||||||
|
if metadata_flags == None:
|
||||||
|
metadata_flags = METADATA_FLAGS_DEFAULT
|
||||||
|
|
||||||
|
# also check unmanaged images (mramAddress != 0) are between boundaries (OEM_BASE_ADDRESS - only in Rev_A as in Rev_B will be 0)
|
||||||
|
# and images don't overlap... Also, advice is GAPs (big ones) exist - especially if tool can't create the layout...
|
||||||
|
calcOemManagedArea(fwsections)
|
||||||
|
|
||||||
|
printInfo(f"Images: {numImages}")
|
||||||
|
|
||||||
|
#for sec in fwsections:
|
||||||
|
# print(sec)
|
||||||
|
|
||||||
|
createContentCerts(fwsections, 'OEM')
|
||||||
|
|
||||||
|
createOemTocPackage(fwsections, metadata_flags, args.output)
|
||||||
|
|
||||||
|
# checking the OEM TOC Package size
|
||||||
|
try:
|
||||||
|
fsize = os.path.getsize(args.output)
|
||||||
|
print("APP TOC Package size: " + str(fsize) + " bytes")
|
||||||
|
except:
|
||||||
|
print(sys.exc_info()[0])
|
||||||
|
print("ERROR: veryfing APP TOC Package size")
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
sign_image(args.output, oemManagedAreaStartAddress, 0xFFFFFFFF, "OEM")
|
||||||
|
|
||||||
|
print("Done!")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
129
tools/alif/app-provision.py
Executable file
129
tools/alif/app-provision.py
Executable file
@ -0,0 +1,129 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Test file for the DMPU function in SERAM
|
||||||
|
|
||||||
|
__author__ = ""
|
||||||
|
__copyright__ = "ALIF Seminconductor"
|
||||||
|
__version__ = "0.1.0"
|
||||||
|
__status__ = "Dev"
|
||||||
|
"""
|
||||||
|
# pylint: disable=unused-argument, invalid-name, bare-except
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import signal
|
||||||
|
import argparse
|
||||||
|
sys.path.append("./isp")
|
||||||
|
import subprocess
|
||||||
|
from serialport import serialPort
|
||||||
|
import utils.config
|
||||||
|
from utils.config import *
|
||||||
|
from utils.user_validations import validateArgList
|
||||||
|
from isp_core import *
|
||||||
|
from isp_util import *
|
||||||
|
|
||||||
|
TOOL_VERSION ="0.1.000" # Define Version constant for each separate tool
|
||||||
|
|
||||||
|
def run_dmpu(isp, fileName):
|
||||||
|
"""
|
||||||
|
run_dmpu
|
||||||
|
"""
|
||||||
|
if sys.platform == "linux" or sys.platform == "darwin":
|
||||||
|
fileName = fileName.replace('\\','/')
|
||||||
|
else:
|
||||||
|
fileName = fileName.replace('/','\\')
|
||||||
|
fileName = fileName.replace('..\\','')
|
||||||
|
|
||||||
|
try:
|
||||||
|
f = open(fileName, 'rb')
|
||||||
|
except IOError as e:
|
||||||
|
print('[ERROR] {0}'.format(e))
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
print("[INFO] Running APP Provisioning code...")
|
||||||
|
with f:
|
||||||
|
fileSize = file_get_size(f)
|
||||||
|
offset = 0
|
||||||
|
data_size = DATA_CHUNK_SIZE
|
||||||
|
if fileSize < data_size: # Deal with small ones
|
||||||
|
data_size = 16 # CHUNK_SIZE
|
||||||
|
|
||||||
|
isp_build_packet(isp, ISP_COMMAND_DMPU)
|
||||||
|
|
||||||
|
while offset < fileSize:
|
||||||
|
f.seek(offset)
|
||||||
|
data_line = f.read(data_size)
|
||||||
|
if isp_download_data(isp, data_line) == False:
|
||||||
|
break
|
||||||
|
offset = offset + data_size
|
||||||
|
|
||||||
|
isp_download_done(isp)
|
||||||
|
|
||||||
|
print("[INFO] Done")
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""
|
||||||
|
DMPU
|
||||||
|
"""
|
||||||
|
if sys.version_info.major == 2:
|
||||||
|
print("[ERROR] You need Python 3 for this application!")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Deal with Command Line
|
||||||
|
parser = argparse.ArgumentParser(description=
|
||||||
|
'APP Provision tool')
|
||||||
|
parser.add_argument("-d" , "--discover", action='store_true', \
|
||||||
|
default=False, help="(isp) COM port discovery")
|
||||||
|
parser.add_argument("-b", "--baudrate", help="serial port baud rate",
|
||||||
|
type=int)
|
||||||
|
parser.add_argument("-a", "--asset", type=str,
|
||||||
|
help='APP Provision Assets (default assets: build/assets-app-cfg.bin)', default='build/assets-app-cfg.bin')
|
||||||
|
parser.add_argument("-V" , "--version",
|
||||||
|
help="Display Version Number", action="store_true")
|
||||||
|
parser.add_argument("-v" , "--verbose",
|
||||||
|
help="verbosity mode", action="store_true")
|
||||||
|
args = parser.parse_args()
|
||||||
|
if args.version:
|
||||||
|
print(TOOL_VERSION)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
load_global_config()
|
||||||
|
DEVICE_PART_NUMBER = utils.config.DEVICE_PART_NUMBER
|
||||||
|
DEVICE_REVISION = utils.config.DEVICE_REVISION
|
||||||
|
DEVICE_REV_BAUD_RATE = utils.config.DEVICE_REV_BAUD_RATE
|
||||||
|
|
||||||
|
print('APP Provision with parameters:')
|
||||||
|
print('Device Part# ' + DEVICE_PART_NUMBER + ' - Rev: ' + DEVICE_REVISION)
|
||||||
|
print('Assets file: ' + args.asset + '\n')
|
||||||
|
if args.asset == None:
|
||||||
|
print('[ERROR] No asset file specified')
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
baud_rate = DEVICE_REV_BAUD_RATE[DEVICE_REVISION]
|
||||||
|
if args.baudrate is not None:
|
||||||
|
baud_rate = args.baudrate
|
||||||
|
|
||||||
|
isp = serialPort(baud_rate) # Serial dabbling open up port.
|
||||||
|
|
||||||
|
if args.discover: # discover the COM ports if requested
|
||||||
|
isp.discoverSerialPorts()
|
||||||
|
|
||||||
|
errorCode = isp.openSerial()
|
||||||
|
if errorCode is False:
|
||||||
|
print("[ERROR] isp openSerial failed for %s" %isp.getPort())
|
||||||
|
sys.exit(1)
|
||||||
|
print("[INFO] %s open Serial port success" %isp.getPort())
|
||||||
|
|
||||||
|
isp.setBaudRate(baud_rate)
|
||||||
|
isp.setVerbose(args.verbose)
|
||||||
|
|
||||||
|
isp_start(isp) # Begin the ISP sequence
|
||||||
|
|
||||||
|
asset_file = args.asset
|
||||||
|
run_dmpu(isp, asset_file)
|
||||||
|
|
||||||
|
isp_stop(isp)
|
||||||
|
isp.closeSerial()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
122
tools/alif/app-secure-debug.py
Executable file
122
tools/alif/app-secure-debug.py
Executable file
@ -0,0 +1,122 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Perform Secure Debug unlocking
|
||||||
|
|
||||||
|
__author__ = ""
|
||||||
|
__copyright__ = "ALIF Seminconductor"
|
||||||
|
__version__ = "0.1.0"
|
||||||
|
__status__ = "Dev"
|
||||||
|
"""
|
||||||
|
# pylint: disable=unused-argument, invalid-name, bare-except
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import signal
|
||||||
|
import argparse
|
||||||
|
sys.path.append("./isp")
|
||||||
|
import subprocess
|
||||||
|
from serialport import serialPort
|
||||||
|
import utils.config
|
||||||
|
from utils.config import *
|
||||||
|
from utils.user_validations import validateArgList
|
||||||
|
from isp_core import *
|
||||||
|
from isp_util import *
|
||||||
|
from utils.sign_image_util import sign_image
|
||||||
|
|
||||||
|
|
||||||
|
#import gen_debug_certs
|
||||||
|
|
||||||
|
TOOL_VERSION ="0.1.000" # Define Version constant for each separate tool
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def secure_debug_alif(isp, rma):
|
||||||
|
"""
|
||||||
|
secure_debug_alif - Secure Debug unlocking using Alif certificates
|
||||||
|
"""
|
||||||
|
print("[INFO] Alif secure debug")
|
||||||
|
|
||||||
|
message = isp_build_packet(isp, ISP_COMMAND_GET, [ISP_GET_SECURE_DEBUG_TOKENS])
|
||||||
|
|
||||||
|
if rma == False:
|
||||||
|
# DCU values - all 1's
|
||||||
|
secure_debug_content = [0xFF] * 16
|
||||||
|
else:
|
||||||
|
# Magic test pattern for RMA
|
||||||
|
secure_debug_content = [0xAA] * 16
|
||||||
|
|
||||||
|
# append the challenge bytes received by the device
|
||||||
|
secure_debug_content.extend(message[6:22])
|
||||||
|
|
||||||
|
fileName = "build/alif_secure_debug.bin"
|
||||||
|
f = open(fileName, 'wb')
|
||||||
|
f.write(bytes(secure_debug_content))
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
address = int.from_bytes(message[2:6],"little")
|
||||||
|
#print("*** address: ", hex(address))
|
||||||
|
sign_image(fileName, address, 0xFFFFFFFF, 'OEM')
|
||||||
|
token = authenticate_image(isp, fileName)
|
||||||
|
|
||||||
|
isp_secure_debug(isp, token, secure_debug_content)
|
||||||
|
print("\r")
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""
|
||||||
|
secure debug
|
||||||
|
"""
|
||||||
|
if sys.version_info.major == 2:
|
||||||
|
print("[ERROR] You need Python 3 for this application!")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
# Deal with Command Line
|
||||||
|
parser = argparse.ArgumentParser(description=
|
||||||
|
'Secure Debug tool')
|
||||||
|
parser.add_argument("-d" , "--discover", action='store_true', \
|
||||||
|
default=False, help="(isp) COM port discovery")
|
||||||
|
parser.add_argument("-b", "--baudrate", help="serial port baud rate",
|
||||||
|
type=int)
|
||||||
|
parser.add_argument("-r", "--rma", default=False,
|
||||||
|
help="Perform RMA transition (test)", action="store_true")
|
||||||
|
parser.add_argument("-V" , "--version",
|
||||||
|
help="Display Version Number", action="store_true")
|
||||||
|
parser.add_argument("-v" , "--verbose",
|
||||||
|
help="verbosity mode", action="store_true")
|
||||||
|
args = parser.parse_args()
|
||||||
|
if args.version:
|
||||||
|
print(TOOL_VERSION)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
load_global_config()
|
||||||
|
DEVICE_PART_NUMBER = utils.config.DEVICE_PART_NUMBER
|
||||||
|
DEVICE_REVISION = utils.config.DEVICE_REVISION
|
||||||
|
DEVICE_REV_BAUD_RATE = utils.config.DEVICE_REV_BAUD_RATE
|
||||||
|
|
||||||
|
print('Secure Debug with parameters:')
|
||||||
|
print('Device Part# ' + DEVICE_PART_NUMBER + ' - Rev: ' + DEVICE_REVISION)
|
||||||
|
|
||||||
|
baud_rate = DEVICE_REV_BAUD_RATE[DEVICE_REVISION]
|
||||||
|
if args.baudrate is not None:
|
||||||
|
baud_rate = args.baudrate
|
||||||
|
isp = serialPort(baud_rate) # Serial dabbling open up port.
|
||||||
|
|
||||||
|
if args.discover: # discover the COM ports if requested
|
||||||
|
isp.discoverSerialPorts()
|
||||||
|
|
||||||
|
errorCode = isp.openSerial()
|
||||||
|
if errorCode is False:
|
||||||
|
print("[ERROR] isp openSerial failed for %s" %isp.getPort())
|
||||||
|
sys.exit(1)
|
||||||
|
print("[INFO] %s open Serial port success" %isp.getPort())
|
||||||
|
|
||||||
|
isp.setBaudRate(baud_rate)
|
||||||
|
isp.setVerbose(args.verbose)
|
||||||
|
|
||||||
|
isp_start(isp) # Begin the ISP sequence
|
||||||
|
|
||||||
|
secure_debug_alif(isp, args.rma)
|
||||||
|
|
||||||
|
isp_stop(isp)
|
||||||
|
isp.closeSerial()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
76
tools/alif/app-sign-image.py
Executable file
76
tools/alif/app-sign-image.py
Executable file
@ -0,0 +1,76 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Perform Image signing
|
||||||
|
|
||||||
|
__author__ = ""
|
||||||
|
__copyright__ = "ALIF Seminconductor"
|
||||||
|
__version__ = "0.1.0"
|
||||||
|
__status__ = "Dev"
|
||||||
|
"""
|
||||||
|
# pylint: disable=unused-argument, invalid-name, bare-except
|
||||||
|
import sys
|
||||||
|
import argparse
|
||||||
|
import utils.config
|
||||||
|
from utils.config import *
|
||||||
|
from utils.sign_image_util import sign_image
|
||||||
|
|
||||||
|
# 0.3.000 - added support for Azure Storage (Public Keys and Certs)
|
||||||
|
# 0.4.000 - split image signature functionality
|
||||||
|
# 0.5.000 - verbosity removed (it only applies to ISP-related tools)
|
||||||
|
TOOL_VERSION ="0.5.000" # Define Version constant for each separate tool
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""
|
||||||
|
sign an image
|
||||||
|
"""
|
||||||
|
if sys.version_info.major == 2:
|
||||||
|
print("[ERROR] You need Python 3 for this application!")
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
# Deal with Command Line
|
||||||
|
parser = argparse.ArgumentParser(description=
|
||||||
|
'Image Signature tool')
|
||||||
|
parser.add_argument("-i", "--images", type=str,
|
||||||
|
help='Images to sign\
|
||||||
|
("/path/image1.bin 0x30020000")')
|
||||||
|
parser.add_argument("-V" , "--version",
|
||||||
|
help="Display Version Number", action="store_true")
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
if args.version:
|
||||||
|
print(TOOL_VERSION)
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
if args.images == None:
|
||||||
|
print('No image list provided')
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
load_global_config()
|
||||||
|
DEVICE_PART_NUMBER = utils.config.DEVICE_PART_NUMBER
|
||||||
|
DEVICE_REVISION = utils.config.DEVICE_REVISION
|
||||||
|
|
||||||
|
print('Signing images with parameters:')
|
||||||
|
print('Device Part# ' + DEVICE_PART_NUMBER + ' - Rev: ' + DEVICE_REVISION)
|
||||||
|
|
||||||
|
argList = args.images
|
||||||
|
|
||||||
|
if sys.platform == "linux":
|
||||||
|
argList = argList.replace('\\','/')
|
||||||
|
else:
|
||||||
|
argList = argList.replace('/','\\')
|
||||||
|
|
||||||
|
items = argList.split(' ')
|
||||||
|
|
||||||
|
for e in range(1, len(items),2):
|
||||||
|
addr = items[e]
|
||||||
|
address = int(addr,base=16)
|
||||||
|
|
||||||
|
fileName = items[e-1]
|
||||||
|
fileName = fileName.replace('..\\','')
|
||||||
|
|
||||||
|
sign_image(fileName, address, 0xFFFFFFFF, "OEM")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
375
tools/alif/app-write-mram.py
Executable file
375
tools/alif/app-write-mram.py
Executable file
@ -0,0 +1,375 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
MRAM (NVM) burning / writing utility
|
||||||
|
Support
|
||||||
|
- APPLICATION TOC package writing
|
||||||
|
- image write at any address in NVM (MRAM)
|
||||||
|
- image erase of any | range of addresses in NVM (MRAM)
|
||||||
|
|
||||||
|
__author__ = ""
|
||||||
|
__copyright__ = "ALIF Seminconductor"
|
||||||
|
__version__ = "0.16.0"
|
||||||
|
__status__ = "Dev" "
|
||||||
|
"""
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import signal
|
||||||
|
import argparse
|
||||||
|
from utils.discover import getValues, getJlinkSN
|
||||||
|
import utils.config
|
||||||
|
from utils.config import *
|
||||||
|
from utils.user_validations import validateArgList
|
||||||
|
from _ast import Or
|
||||||
|
from _operator import or_
|
||||||
|
from cgitb import handler
|
||||||
|
sys.path.append("./isp")
|
||||||
|
from serialport import serialPort
|
||||||
|
from serialport import COM_BAUD_RATE_MAXIMUM
|
||||||
|
#import ispcommands
|
||||||
|
from isp_core import *
|
||||||
|
from isp_util import *
|
||||||
|
import pylink
|
||||||
|
import datetime
|
||||||
|
#from array import array
|
||||||
|
|
||||||
|
# Version Feature
|
||||||
|
# 0.22.000 Added support for MAC OS (J-Link not included yet)
|
||||||
|
# 0.21.000 get baudrate from DBs
|
||||||
|
# 0.20.007 Added padding option for binaries not multiple of 16
|
||||||
|
# 0.20.006 Added Python error exit code
|
||||||
|
# 0.20.005 Fixed J-Link+Pylink issue writing binaries
|
||||||
|
# 0.20.004 REV_A0 dynamic baud rate support
|
||||||
|
# 0.20.003 remove maintenance mode output unless -v is used)
|
||||||
|
# 0.20.002 Reset option set as default
|
||||||
|
# 0.20.001 Added Erase option
|
||||||
|
# 0.20.000 Added option to skip user managed images
|
||||||
|
# 0.19.000 Removed JTAG access
|
||||||
|
# 0.16.000 Addition of baud rate increase for bulk transfer
|
||||||
|
# 0.15.000 Fixes for Block sizes and left overs
|
||||||
|
TOOL_VERSION ="0.22.000" # Define Version constant for each separate tool
|
||||||
|
|
||||||
|
EXIT_WITH_ERROR = 1
|
||||||
|
|
||||||
|
def readImageList(dsFile):
|
||||||
|
"""
|
||||||
|
readImageList = read images from arm-ds command file
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
f = open(dsFile, 'r')
|
||||||
|
imageList = f.read()
|
||||||
|
f.close()
|
||||||
|
# search for image list
|
||||||
|
start = imageList.find('args')
|
||||||
|
end = imageList.find('continue')
|
||||||
|
if start == -1 or end == -1:
|
||||||
|
print('[ERROR] There is a problem with the Debug Script information')
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
imageList = imageList[start + 5: end]
|
||||||
|
except:
|
||||||
|
print('[ERROR] opening Debug Script file',dsFile)
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
return imageList
|
||||||
|
|
||||||
|
def app_mram_erase(isp,args, ALIF_BASE_ADDRESS, ALIF_MRAM_SIZE):
|
||||||
|
"""
|
||||||
|
app_mram_erase
|
||||||
|
- erase the Application are of MRAM
|
||||||
|
args
|
||||||
|
argv[0] 'erase' Operation, can be ignored
|
||||||
|
argv[1] <address> Starting address
|
||||||
|
argv{2] <size> Length of bytes to erase
|
||||||
|
argv[3] <pattern> Optional pattern to erase with
|
||||||
|
argc Checked before this is called
|
||||||
|
"""
|
||||||
|
argv = args.split()
|
||||||
|
argc = len(argv)
|
||||||
|
|
||||||
|
# nombres magiques, maybe not needed?
|
||||||
|
address = 0x80000000
|
||||||
|
erase_len = 16
|
||||||
|
pattern = 0x00000000
|
||||||
|
|
||||||
|
if argc >= 3:
|
||||||
|
address = int(argv[1],base=16)
|
||||||
|
erase_len = int(argv[2],base=16)
|
||||||
|
erase_len_fmt = "{:,}".format(erase_len)
|
||||||
|
|
||||||
|
if argc == 4:
|
||||||
|
pattern = int(argv[3],base=16)
|
||||||
|
print("[INFO] %s 0x%x %d (%s)" %(argv[0],address,erase_len,
|
||||||
|
erase_len_fmt))
|
||||||
|
|
||||||
|
# Validate user request for erasing is in OEM
|
||||||
|
if (address > ALIF_BASE_ADDRESS or
|
||||||
|
address + erase_len > ALIF_BASE_ADDRESS):
|
||||||
|
|
||||||
|
if address + erase_len > ALIF_BASE_ADDRESS:
|
||||||
|
print("[ERROR] illegal address " + hex(address+erase_len) +
|
||||||
|
" (" + hex(address) + " + " + hex(erase_len) + ")")
|
||||||
|
else:
|
||||||
|
print("[ERROR] illegal address " + hex(address))
|
||||||
|
return
|
||||||
|
|
||||||
|
isp_mram_erase(isp,address,erase_len,pattern)
|
||||||
|
|
||||||
|
def main():
|
||||||
|
if sys.version_info.major == 2:
|
||||||
|
print("[ERROR] You need Python 3 for this application!")
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
# Deal with Command Line
|
||||||
|
parser = argparse.ArgumentParser(description=
|
||||||
|
'NVM Burner for Application TOC Package')
|
||||||
|
parser.add_argument("-d" , "--discover", action='store_true', \
|
||||||
|
default=False, help="COM port discovery")
|
||||||
|
parser.add_argument("-b", "--baudrate", help="serial port baud rate",
|
||||||
|
type=int)
|
||||||
|
parser.add_argument("-e", "--erase", type=str,
|
||||||
|
help='ERASE [APP | <start address> <size> [<pattern>] ]')
|
||||||
|
# creating a mutually exclusive group for -i IMAGES and -S
|
||||||
|
# (skip option doesn't make sense in a user provided list...)
|
||||||
|
group = parser.add_mutually_exclusive_group()
|
||||||
|
group.add_argument("-i", "--images", type=str,
|
||||||
|
default="Application TOC Package",
|
||||||
|
help='images list to burn into NVM \
|
||||||
|
("/path/image1.bin 0x80001000 /path/image2.bin 0x80003000")')
|
||||||
|
parser.add_argument("-a", "--auth_image", action='store_true',
|
||||||
|
help="authenticate the image by sending its signature file",
|
||||||
|
default=False)
|
||||||
|
parser.add_argument("-m", "--method", type=str,
|
||||||
|
help="loading method [JTAG | ISP]")
|
||||||
|
group.add_argument("-S", "--skip",
|
||||||
|
help='write ATOC only - skip user managed images',
|
||||||
|
action="store_true")
|
||||||
|
parser.add_argument("-s", "--switch",
|
||||||
|
help="dynamic baud rate switch toggle, default=on",
|
||||||
|
action="store_false")
|
||||||
|
parser.add_argument("-p", "--pad",
|
||||||
|
help="pad the binary if size is not multiple of 16", action="store_true")
|
||||||
|
parser.add_argument("-nr", "--no_reset", default=False,
|
||||||
|
help="do not reset target before operation", action="store_true")
|
||||||
|
parser.add_argument("-V" , "--version",
|
||||||
|
help="Display Version Number", action="store_true")
|
||||||
|
parser.add_argument("-v" , "--verbose",
|
||||||
|
help="verbosity mode", action="store_true")
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
if args.version:
|
||||||
|
print(TOOL_VERSION)
|
||||||
|
sys.exit()
|
||||||
|
|
||||||
|
# memory defines for Alif/OEM MRAM Addresses and Sizes
|
||||||
|
load_global_config()
|
||||||
|
DEVICE_PART_NUMBER = utils.config.DEVICE_PART_NUMBER
|
||||||
|
DEVICE_REVISION = utils.config.DEVICE_REVISION
|
||||||
|
DEVICE_REV_BAUD_RATE = utils.config.DEVICE_REV_BAUD_RATE
|
||||||
|
MRAM_BASE_ADDRESS = utils.config.MRAM_BASE_ADDRESS
|
||||||
|
ALIF_BASE_ADDRESS = utils.config.ALIF_BASE_ADDRESS
|
||||||
|
OEM_BASE_ADDRESS = utils.config.APP_BASE_ADDRESS
|
||||||
|
MRAM_SIZE = utils.config.MRAM_SIZE
|
||||||
|
ALIF_MRAM_SIZE = utils.config.ALIF_MRAM_SIZE
|
||||||
|
OEM_MRAM_SIZE = utils.config.APP_MRAM_SIZE
|
||||||
|
MRAM_BURN_INTERFACE = utils.config.MRAM_BURN_INTERFACE
|
||||||
|
JTAG_ADAPTER = utils.config.JTAG_ADAPTER
|
||||||
|
|
||||||
|
os.system('') # Help MS-DOS window with ESC sequences
|
||||||
|
|
||||||
|
print('Writing MRAM with parameters:')
|
||||||
|
print('Device Part# ' + DEVICE_PART_NUMBER + ' - Rev: ' + DEVICE_REVISION)
|
||||||
|
print('- Available MRAM: ' + str(OEM_MRAM_SIZE) + ' bytes')
|
||||||
|
|
||||||
|
# baud_rate = args.baudrate
|
||||||
|
# if DEVICE_REVISION == 'A0':
|
||||||
|
# """
|
||||||
|
# For REV_A0 we need to change the default used by ALL other devices
|
||||||
|
# """
|
||||||
|
# default_baud_rate = COM_BAUD_RATE_REV_A0
|
||||||
|
# if baud_rate == COM_BAUD_RATE_DEFAULT:
|
||||||
|
# baud_rate = default_baud_rate
|
||||||
|
# else:
|
||||||
|
# default_baud_rate = COM_BAUD_RATE_DEFAULT
|
||||||
|
# baud_rate = args.baudrate
|
||||||
|
|
||||||
|
# if baud_rate != default_baud_rate:
|
||||||
|
# dynamic_baud_rate_switch = False
|
||||||
|
# else:
|
||||||
|
# dynamic_baud_rate_switch = args.switch
|
||||||
|
|
||||||
|
baud_rate = DEVICE_REV_BAUD_RATE[DEVICE_REVISION]
|
||||||
|
if args.baudrate is not None:
|
||||||
|
baud_rate = args.baudrate
|
||||||
|
|
||||||
|
dynamic_baud_rate_switch = args.switch
|
||||||
|
|
||||||
|
argList = ''
|
||||||
|
action = 'Burning: '
|
||||||
|
method = None
|
||||||
|
|
||||||
|
if args.method == None:
|
||||||
|
method = MRAM_BURN_INTERFACE
|
||||||
|
elif args.method.upper() == 'ISP':
|
||||||
|
method = 'isp'
|
||||||
|
elif args.method.upper() == 'JTAG':
|
||||||
|
method = 'jtag'
|
||||||
|
else:
|
||||||
|
print("[ERROR] Unknown connection method", args.method)
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
if args.erase:
|
||||||
|
action = 'Erasing: '
|
||||||
|
argList = 'erase '
|
||||||
|
if args.erase.upper() == 'APP':
|
||||||
|
argList += hex(OEM_BASE_ADDRESS) + ' ' + hex(OEM_MRAM_SIZE)
|
||||||
|
else:
|
||||||
|
if args.erase.strip() == '':
|
||||||
|
print("[ERROR] erase arguments are empty")
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
argList += args.erase
|
||||||
|
elif args.images != "Application TOC Package":
|
||||||
|
argList = args.images
|
||||||
|
else:
|
||||||
|
dsFile = 'bin/application_package.ds'
|
||||||
|
argList = readImageList(dsFile)
|
||||||
|
|
||||||
|
if args.skip:
|
||||||
|
idx = argList.find('../build/AppTocPackage.bin 0x')
|
||||||
|
argList = argList[idx: idx + 37]
|
||||||
|
|
||||||
|
# validate all parameters
|
||||||
|
argList = validateArgList(action, argList.strip(), args.pad)
|
||||||
|
|
||||||
|
if sys.platform == "linux" or sys.platform == "darwin":
|
||||||
|
argList = argList.replace('../','')
|
||||||
|
|
||||||
|
print("[INFO]", action + argList)
|
||||||
|
|
||||||
|
|
||||||
|
if method == 'jtag' and not args.erase: # erase via jtag not yet supported!
|
||||||
|
jlinkSN = getJlinkSN()
|
||||||
|
if jlinkSN == -1:
|
||||||
|
print('J-Link device not found!')
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
print('J-Link SN: ' + jlinkSN)
|
||||||
|
|
||||||
|
jlink = pylink.JLink()
|
||||||
|
jlink.open(serial_no=int(jlinkSN))
|
||||||
|
print(jlink.product_name)
|
||||||
|
if not jlink.opened():
|
||||||
|
print('Error opening J-Link')
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
if not jlink.connected():
|
||||||
|
print('Error connecting J-Link')
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
print("about to connect to M0+..")
|
||||||
|
jlink.connect("CORTEX-M0+", verbose=True)
|
||||||
|
#jlink.connect('AC302F8A82562_HE', verbose=True)
|
||||||
|
if not jlink.target_connected():
|
||||||
|
print('Error connecting target')
|
||||||
|
print('Please, power-cycle the board')
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
argParams = argList.strip().split(" ")
|
||||||
|
lenParams = len(argParams)
|
||||||
|
i = 0
|
||||||
|
while i < lenParams:
|
||||||
|
f = argParams[i][3:]
|
||||||
|
if sys.platform == "linux":
|
||||||
|
f = argParams[i][:]
|
||||||
|
|
||||||
|
print('File name: ' + f)
|
||||||
|
file_size = os.path.getsize(f)
|
||||||
|
print("File Size is :", file_size, "bytes")
|
||||||
|
print('MRAM starting address: ' + argParams[i+1])
|
||||||
|
addr = globalToLocalAddress(argParams[i+1])
|
||||||
|
print("Writing the file to MRAM...")
|
||||||
|
# read the file
|
||||||
|
f = open(f,"rb")
|
||||||
|
#fileData = array("I")
|
||||||
|
#fileData.fromfile(f, int(file_size/4))
|
||||||
|
fileData = list(f.read(file_size))
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
# write the data to MRAM
|
||||||
|
t1 = datetime.datetime.now()
|
||||||
|
#jlink.memory_write32(int(addr, 16), fileData)
|
||||||
|
jlink.memory_write8(int(addr, 16), fileData)
|
||||||
|
t2 = datetime.datetime.now()
|
||||||
|
print('Done in ' + str(t2-t1))
|
||||||
|
i += 2
|
||||||
|
|
||||||
|
#jlink.reset() # the reset causes an issue and the board will need to power cycle...
|
||||||
|
|
||||||
|
return # end jlink tests
|
||||||
|
|
||||||
|
if method == 'jtag' and args.erase: # erase via jtag not yet supported!
|
||||||
|
print('[INFO] Erase is only supported via ISP')
|
||||||
|
|
||||||
|
dynamic_string = "Enabled" if dynamic_baud_rate_switch else "Disabled"
|
||||||
|
print("[INFO] baud rate ", baud_rate)
|
||||||
|
print("[INFO] dynamic baud rate change ", dynamic_string)
|
||||||
|
|
||||||
|
handler = CtrlCHandler()
|
||||||
|
isp = serialPort(baud_rate) # Serial dabbling open up port.
|
||||||
|
|
||||||
|
if args.discover: # discover the COM ports if requested
|
||||||
|
isp.discoverSerialPorts()
|
||||||
|
|
||||||
|
errorCode = isp.openSerial()
|
||||||
|
if errorCode is False:
|
||||||
|
print("[ERROR] isp openSerial failed for %s" %isp.getPort())
|
||||||
|
sys.exit(EXIT_WITH_ERROR)
|
||||||
|
|
||||||
|
print("[INFO] %s open Serial port success" %isp.getPort())
|
||||||
|
|
||||||
|
isp.setBaudRate(baud_rate)
|
||||||
|
isp.setVerbose(args.verbose)
|
||||||
|
|
||||||
|
if not args.no_reset:
|
||||||
|
put_target_in_maintenance_mode(isp, baud_rate, args.verbose)
|
||||||
|
|
||||||
|
if sys.platform == "linux" or sys.platform == "darwin":
|
||||||
|
argList = argList.replace('\\','/')
|
||||||
|
else:
|
||||||
|
argList = argList.replace('/','\\')
|
||||||
|
|
||||||
|
items = argList.split(' ')
|
||||||
|
|
||||||
|
isp_start(isp) # Start ISP Sequence
|
||||||
|
|
||||||
|
if args.erase:
|
||||||
|
app_mram_erase(isp,argList,ALIF_BASE_ADDRESS, ALIF_MRAM_SIZE)
|
||||||
|
else:
|
||||||
|
if dynamic_baud_rate_switch:
|
||||||
|
isp_set_baud_rate(isp,COM_BAUD_RATE_MAXIMUM) # Jack up Baud rate
|
||||||
|
isp.setBaudRate(COM_BAUD_RATE_MAXIMUM) # Sets the HOST baud rate
|
||||||
|
|
||||||
|
# issue enquiry command to check if SERAM is in Maintenance Mode
|
||||||
|
mode = isp_get_maintenance_status(isp)
|
||||||
|
isp_show_maintenance_mode(isp, mode)
|
||||||
|
|
||||||
|
for e in range(1, len(items),2):
|
||||||
|
addr = items[e]
|
||||||
|
address = int(addr,base=16)
|
||||||
|
fileName = items[e-1]
|
||||||
|
fileName = fileName.replace('..\\','')
|
||||||
|
|
||||||
|
if burn_mram_isp(isp, handler, fileName, address,
|
||||||
|
args.verbose, args.auth_image) == False:
|
||||||
|
break
|
||||||
|
|
||||||
|
# Restore the default Baud rate
|
||||||
|
if dynamic_baud_rate_switch:
|
||||||
|
isp_set_baud_rate(isp,baud_rate)
|
||||||
|
isp.setBaudRate(baud_rate)
|
||||||
|
|
||||||
|
isp_stop(isp) # Stop ISP Sequence
|
||||||
|
isp_reset(isp)
|
||||||
|
|
||||||
|
isp.closeSerial()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
BIN
tools/alif/build/assets-app-cfg.bin
Executable file
BIN
tools/alif/build/assets-app-cfg.bin
Executable file
Binary file not shown.
17
tools/alif/build/config/app-cfg.json
Executable file
17
tools/alif/build/config/app-cfg.json
Executable file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"DEVICE": {
|
||||||
|
"disabled": false,
|
||||||
|
"binary": "app-device-config.json",
|
||||||
|
"version" : "0.5.00",
|
||||||
|
"signed": true
|
||||||
|
},
|
||||||
|
"BLINK-HE": {
|
||||||
|
"disabled": false,
|
||||||
|
"binary": "m55_blink_he.bin",
|
||||||
|
"version" : "1.0.0",
|
||||||
|
"signed": true,
|
||||||
|
"cpu_id": "M55_HE",
|
||||||
|
"loadAddress": "0x58000000",
|
||||||
|
"flags": ["load", "boot"]
|
||||||
|
}
|
||||||
|
}
|
||||||
35
tools/alif/build/config/app-cpu-stubs.json
Executable file
35
tools/alif/build/config/app-cpu-stubs.json
Executable file
@ -0,0 +1,35 @@
|
|||||||
|
{
|
||||||
|
"DEVICE": {
|
||||||
|
"disabled" : false,
|
||||||
|
"binary": "app-device-config.json",
|
||||||
|
"version" : "0.5.00",
|
||||||
|
"signed": true
|
||||||
|
},
|
||||||
|
"A32_APP": {
|
||||||
|
"disabled": false,
|
||||||
|
"binary": "a32_stub_0.bin",
|
||||||
|
"version" : "1.0.0",
|
||||||
|
"signed": true,
|
||||||
|
"loadAddress": "0x02000000",
|
||||||
|
"cpu_id": "A32_0",
|
||||||
|
"flags": ["load","boot"]
|
||||||
|
},
|
||||||
|
"HP_APP": {
|
||||||
|
"disabled": false,
|
||||||
|
"binary": "m55_stub_hp.bin",
|
||||||
|
"version" : "1.0.0",
|
||||||
|
"signed": true,
|
||||||
|
"loadAddress": "0x50000000",
|
||||||
|
"cpu_id": "M55_HP",
|
||||||
|
"flags": ["load","boot"]
|
||||||
|
},
|
||||||
|
"HE_APP": {
|
||||||
|
"disabled": false,
|
||||||
|
"binary": "m55_stub_he.bin",
|
||||||
|
"version" : "1.0.0",
|
||||||
|
"signed": true,
|
||||||
|
"loadAddress": "0x58000000",
|
||||||
|
"cpu_id": "M55_HE",
|
||||||
|
"flags": ["load", "boot"]
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user